43 inline double rand(
double a = 0,
double b = 1)
45 std::uniform_real_distribution<> ud(a, b);
59 idx b = std::numeric_limits<idx>::max())
61 std::uniform_int_distribution<idx> uid(a, b);
77 template<
typename Derived>
78 Derived
rand(
idx rows,
idx cols,
double a = 0,
double b = 1)
107 if (rows == 0 || cols == 0)
110 return dmat::Zero(rows, cols).unaryExpr(
141 if (rows == 0 || cols == 0)
144 return rand<dmat>(rows, cols, a, b).cast<cplx>() +
145 1_i * rand<dmat>(rows, cols, a, b).cast<cplx>();
159 template<
typename Derived>
189 double mean,
double sigma)
191 if (rows == 0 || cols == 0)
194 std::normal_distribution<> nd(mean, sigma);
196 return dmat::Zero(rows, cols).unaryExpr(
227 double mean,
double sigma)
229 if (rows == 0 || cols == 0)
232 return randn<dmat>(rows, cols, mean, sigma).cast<cplx>() +
233 1_i * randn<dmat>(rows, cols, mean, sigma).cast<cplx>();
244 inline double randn(
double mean = 0,
double sigma = 1)
246 std::normal_distribution<> nd(mean, sigma);
266 X = 1 / std::sqrt(2.) * randn < cmat > (D, D);
267 Eigen::HouseholderQR<cmat> qr(X);
269 cmat Q = qr.householderQ();
273 Eigen::VectorXcd phases = (rand<dmat>(D, 1)).cast<
cplx>();
274 for (
idx i = 0; i < static_cast<idx>(phases.rows()); ++i)
275 phases(i) = std::exp(2 *
pi * 1_i * phases(i));
277 Q = Q * phases.asDiagonal();
291 if (Din == 0 || Dout == 0 || Din > Dout)
294 return randU(Dout).block(0, 0, Dout, Din);
314 std::vector<cmat> result(N);
315 for (
idx i = 0; i < N; ++i)
316 result[i] = cmat::Zero(D, D);
321 #pragma omp parallel for collapse(3)
322 for (
idx k = 0; k < N; ++k)
323 for (
idx a = 0; a < D; ++a)
324 for (
idx b = 0; b < D; ++b)
325 result[k](a, b) = U(a * N + k, b * N);
341 cmat H = 2 * rand<cmat>(D, D) - (1. + 1_i) * cmat::Ones(D, D);
364 ket kt = randn < cmat > (D, 1);
366 return kt /
norm(kt);
381 result = result *
adjoint(result);
383 return result /
trace(result);
400 std::vector<idx> result(n);
403 std::iota(std::begin(result), std::end(result), 0);
405 std::shuffle(std::begin(result), std::end(result),
static thread_local RandomDevices & get_thread_local_instance() noexcept(std::is_nothrow_constructible< RandomDevices >::value)
Definition: singleton.h:100
idx randidx(idx a=std::numeric_limits< idx >::min(), idx b=std::numeric_limits< idx >::max())
Generates a random index (idx) uniformly distributed in the interval [a, b].
Definition: random.h:58
Eigen::MatrixXd dmat
Real (double precision) dynamic Eigen matrix.
Definition: types.h:61
std::vector< cmat > randkraus(idx N, idx D)
Generates a set of random Kraus operators.
Definition: random.h:307
ket randket(idx D)
Generates a random normalized ket (pure state vector)
Definition: random.h:352
Eigen::VectorXcd ket
Complex (double precision) dynamic Eigen column vector.
Definition: types.h:46
Quantum++ main namespace.
Definition: codes.h:30
double norm(const Eigen::MatrixBase< Derived > &A)
Frobenius norm.
Definition: functions.h:231
std::vector< idx > randperm(idx n)
Generates a random uniformly distributed permutation.
Definition: random.h:395
dyn_mat< typename Derived::Scalar > adjoint(const Eigen::MatrixBase< Derived > &A)
Adjoint.
Definition: functions.h:84
std::complex< double > cplx
Complex number in double precision.
Definition: types.h:41
Generates custom exceptions, used when validating function parameters.
Definition: exception.h:39
Derived randn(idx rows, idx cols, double mean=0, double sigma=1)
Generates a random matrix with entries normally distributed in N(mean, sigma)
Definition: random.h:160
cmat randU(idx D)
Generates a random unitary matrix.
Definition: random.h:257
Derived::Scalar trace(const Eigen::MatrixBase< Derived > &A)
Trace.
Definition: functions.h:121
constexpr double pi
Definition: constants.h:87
cmat randH(idx D)
Generates a random Hermitian matrix.
Definition: random.h:336
double rand(double a=0, double b=1)
Generates a random real number uniformly distributed in the interval [a, b)
Definition: random.h:43
Eigen::MatrixXcd cmat
Complex (double precision) dynamic Eigen matrix.
Definition: types.h:56
cmat randrho(idx D)
Generates a random density matrix.
Definition: random.h:375
std::size_t idx
Non-negative integer index.
Definition: types.h:36
cmat randV(idx Din, idx Dout)
Generates a random isometry matrix.
Definition: random.h:289