1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_RANDOM_H
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_RANDOM_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_random_op {
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  EIGEN_EMPTY_STRUCT_CTOR(scalar_random_op)
192b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  inline const Scalar operator() () const { return random<Scalar>(); }
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar>
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct functor_traits<scalar_random_op<Scalar> >
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false, IsRepeatable = false }; };
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a random matrix expression
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
302b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * Numbers are uniformly spread through their whole definition range for integer types,
312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * and in the [-1:1] range for floating point scalar types.
322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * The parameters \a rows and \a cols are the number of rows and of columns of
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * the returned matrix. Must be compatible with this MatrixBase type.
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
362b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \not_reentrant
372b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * it is redundant to pass \a rows and \a cols as arguments, so Random() should be used
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * instead.
412b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_random_int_int.cpp
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_random_int_int.out
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This expression has the "evaluate before nesting" flag so that it will be evaluated into
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * a temporary matrix whenever it is nested in a larger expression. This prevents unexpected
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * behavior with expressions involving random matrices.
492b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
502b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * See DenseBase::NullaryExpr(Index, const CustomNullaryOp&) for an example using C++11 random generators.
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
522b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \sa DenseBase::setRandom(), DenseBase::Random(Index), DenseBase::Random()
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
552b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline const typename DenseBase<Derived>::RandomReturnType
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::Random(Index rows, Index cols)
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return NullaryExpr(rows, cols, internal::scalar_random_op<Scalar>());
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a random vector expression
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * Numbers are uniformly spread through their whole definition range for integer types,
642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * and in the [-1:1] range for floating point scalar types.
652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * The parameter \a size is the size of the returned vector.
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Must be compatible with this MatrixBase type.
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \only_for_vectors
702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \not_reentrant
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * it is redundant to pass \a size as argument, so Random() should be used
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * instead.
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_random_int.cpp
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_random_int.out
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This expression has the "evaluate before nesting" flag so that it will be evaluated into
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * a temporary vector whenever it is nested in a larger expression. This prevents unexpected
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * behavior with expressions involving random matrices.
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
832b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \sa DenseBase::setRandom(), DenseBase::Random(Index,Index), DenseBase::Random()
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
862b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline const typename DenseBase<Derived>::RandomReturnType
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::Random(Index size)
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return NullaryExpr(size, internal::scalar_random_op<Scalar>());
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \returns a fixed-size random matrix or vector expression
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
942b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * Numbers are uniformly spread through their whole definition range for integer types,
952b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * and in the [-1:1] range for floating point scalar types.
962b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * need to use the variants taking size arguments.
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_random.cpp
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_random.out
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * This expression has the "evaluate before nesting" flag so that it will be evaluated into
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * a temporary matrix whenever it is nested in a larger expression. This prevents unexpected
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * behavior with expressions involving random matrices.
1062b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
1072b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \not_reentrant
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
1092b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \sa DenseBase::setRandom(), DenseBase::Random(Index,Index), DenseBase::Random(Index)
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
1122b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wanginline const typename DenseBase<Derived>::RandomReturnType
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDenseBase<Derived>::Random()
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_random_op<Scalar>());
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** Sets all coefficients in this expression to random values.
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
1202b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * Numbers are uniformly spread through their whole definition range for integer types,
1212b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * and in the [-1:1] range for floating point scalar types.
1222b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
1232b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \not_reentrant
1242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_setRandom.cpp
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_setRandom.out
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa class CwiseNullaryOp, setRandom(Index), setRandom(Index,Index)
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline Derived& DenseBase<Derived>::setRandom()
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return *this = Random(rows(), cols());
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez/** Resizes to the given \a newSize, and sets all coefficients in this expression to random values.
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
1382b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * Numbers are uniformly spread through their whole definition range for integer types,
1392b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * and in the [-1:1] range for floating point scalar types.
1402b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \only_for_vectors
1422b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \not_reentrant
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include Matrix_setRandom_int.cpp
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude Matrix_setRandom_int.out
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
1472b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \sa DenseBase::setRandom(), setRandom(Index,Index), class CwiseNullaryOp, DenseBase::Random()
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_STRONG_INLINE Derived&
1517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos HernandezPlainObjectBase<Derived>::setRandom(Index newSize)
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  resize(newSize);
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return setRandom();
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** Resizes to the given size, and sets all coefficients in this expression to random values.
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
1592b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * Numbers are uniformly spread through their whole definition range for integer types,
1602b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * and in the [-1:1] range for floating point scalar types.
1612b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
1622b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \not_reentrant
1632b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  *
1642b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \param rows the new number of rows
1652b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \param cols the new number of columns
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include Matrix_setRandom_int_int.cpp
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude Matrix_setRandom_int_int.out
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
1702b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  * \sa DenseBase::setRandom(), setRandom(Index), class CwiseNullaryOp, DenseBase::Random()
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_STRONG_INLINE Derived&
1742b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao WangPlainObjectBase<Derived>::setRandom(Index rows, Index cols)
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
1762b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang  resize(rows, cols);
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return setRandom();
178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_RANDOM_H
183