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