StatMech
Loading...
Searching...
No Matches
RandomMatrix.hpp
Go to the documentation of this file.
1#pragma once
2
4#include <iostream>
5#include <random>
6
7template<class Derived, typename std::enable_if_t<
8 std::is_convertible_v<Derived, OperatorSpaceBase<Derived>> >* = nullptr>
10 private:
11 using Scalar = typename Derived::Scalar;
12 using RealScalar = typename Eigen::NumTraits<typename Derived::Scalar>::Real;
13 Derived m_opSpace;
14 int m_seed;
15 std::mt19937 mt;
16 std::normal_distribution<double> Gaussian;
17 mutable unsigned long long count;
18
19 public:
20 GaussianRandomMatrixGenerator(Derived const& opSpace, int seed = 0, RealScalar stddev = 1.0)
21 : m_opSpace{opSpace}, m_seed(seed), mt(seed), Gaussian{0.0, stddev}, count{0} {}
44
46 /* @{ */
54 = delete;
62 = default;
63 /* @} */
64
69 void reset() { mt = std::mt19937(m_seed); }
70
76 void discard(unsigned long long num) {
77 for(auto j = 0; j < num * m_opSpace.dim(); ++j) Gaussian(mt);
78 count += num * m_opSpace.dim();
79 }
80
85 Eigen::MatrixX<Scalar> operator()() {
86 Eigen::VectorXd coeff;
87 coeff = coeff.NullaryExpr(m_opSpace.dim(), [&]() { return Gaussian(mt); });
88 // std::cout << coeff << std::endl;
89
90 Eigen::MatrixX<Scalar> sample
91 = Eigen::MatrixX<Scalar>::Zero(m_opSpace.baseDim(), m_opSpace.baseDim());
92// #pragma omp declare reduction(+ : Eigen::MatrixX<Scalar> : omp_out=omp_out+omp_in) initializer(omp_priv = omp_orig)
93// #pragma omp parallel for reduction(+ : sample)
94 for(auto j = 0; j < m_opSpace.dim(); ++j) { sample += coeff(j) * m_opSpace.basisOp(j); }
95
96 count += m_opSpace.dim();
97 return sample;
98 }
99};
100
101#ifdef GPU
102 #include "RandomMatrix.cuh"
103#endif
Definition RandomMatrix.hpp:9
std::mt19937 mt
Definition RandomMatrix.hpp:15
typename Derived::Scalar Scalar
Definition RandomMatrix.hpp:11
Derived m_opSpace
Definition RandomMatrix.hpp:13
unsigned long long count
Definition RandomMatrix.hpp:17
Eigen::MatrixX< Scalar > operator()()
Generates an instance of a random matrix.
Definition RandomMatrix.hpp:85
void reset()
Definition RandomMatrix.hpp:69
int m_seed
Definition RandomMatrix.hpp:14
GaussianRandomMatrixGenerator(GaussianRandomMatrixGenerator const &other)=delete
Copy constructor.
~GaussianRandomMatrixGenerator()=default
Destructor.
__host__ __device__ GaussianRandomMatrixGenerator & operator=(GaussianRandomMatrixGenerator &&other)=default
Move assignment operator.
GaussianRandomMatrixGenerator(GaussianRandomMatrixGenerator &&other)=default
Move constructor.
typename Eigen::NumTraits< typename Derived::Scalar >::Real RealScalar
Definition RandomMatrix.hpp:12
__host__ __device__ GaussianRandomMatrixGenerator & operator=(GaussianRandomMatrixGenerator const &other)=delete
Copy assignment operator.
GaussianRandomMatrixGenerator()=default
Default constructor.
void discard(unsigned long long num)
Discards random numbers to advance internal states of the random number generator.
Definition RandomMatrix.hpp:76
std::normal_distribution< double > Gaussian
Definition RandomMatrix.hpp:16
GaussianRandomMatrixGenerator(Derived const &opSpace, int seed=0, RealScalar stddev=1.0)
Definition RandomMatrix.hpp:20