13 #ifndef EIGENRAND_CORE_H
14 #define EIGENRAND_CORE_H
17 #include <EigenRand/Dists/Basic.h>
18 #include <EigenRand/Dists/Discrete.h>
19 #include <EigenRand/Dists/NormalExp.h>
20 #include <EigenRand/Dists/GammaPoisson.h>
30 template<
typename Derived,
typename Urng>
31 using RandBitsType = CwiseNullaryOp<internal::scalar_randbits_op<typename Derived::Scalar, Urng>,
const Derived>;
43 template<
typename Derived,
typename Urng>
44 inline const RandBitsType<Derived, Urng>
48 rows, cols, internal::scalar_randbits_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng))
61 template<
typename Derived,
typename Urng>
62 inline const RandBitsType<Derived, Urng>
66 o.rows(), o.cols(), internal::scalar_randbits_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng))
70 template<
typename Derived,
typename Urng>
71 using UniformIntType = CwiseNullaryOp<internal::scalar_uniform_int_op<typename Derived::Scalar, Urng>,
const Derived>;
84 template<
typename Derived,
typename Urng>
85 inline const UniformIntType<Derived, Urng>
86 uniformInt(Index rows, Index cols, Urng&& urng,
typename Derived::Scalar min,
typename Derived::Scalar max)
89 rows, cols, internal::scalar_uniform_int_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), min, max)
103 template<
typename Derived,
typename Urng>
104 inline const UniformIntType<Derived, Urng>
105 uniformIntLike(Derived& o, Urng&& urng,
typename Derived::Scalar min,
typename Derived::Scalar max)
108 o.rows(), o.cols(), internal::scalar_uniform_int_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), min, max)
112 template<
typename Derived,
typename Urng>
113 using BalancedType = CwiseNullaryOp<internal::scalar_balanced_op<typename Derived::Scalar, Urng>,
const Derived>;
125 template<
typename Derived,
typename Urng>
126 inline const BalancedType<Derived, Urng>
130 rows, cols, internal::scalar_balanced_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng))
143 template<
typename Derived,
typename Urng>
144 inline const BalancedType<Derived, Urng>
148 o.rows(), o.cols(), internal::scalar_balanced_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng))
152 template<
typename Derived,
typename Urng>
153 using UniformRealType = CwiseNullaryOp<internal::scalar_uniform_real_op<typename Derived::Scalar, Urng>,
const Derived>;
165 template<
typename Derived,
typename Urng>
166 inline const UniformRealType<Derived, Urng>
170 rows, cols, internal::scalar_uniform_real_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng))
183 template<
typename Derived,
typename Urng>
184 inline const UniformRealType<Derived, Urng>
188 o.rows(), o.cols(), internal::scalar_uniform_real_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng))
192 template<
typename Derived,
typename Urng>
193 using NormalType = CwiseNullaryOp<internal::scalar_norm_dist_op<typename Derived::Scalar, Urng>,
const Derived>;
205 template<
typename Derived,
typename Urng>
206 inline const NormalType<Derived, Urng>
207 normal(Index rows, Index cols, Urng&& urng)
210 rows, cols, internal::scalar_norm_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng))
223 template<
typename Derived,
typename Urng>
224 inline const NormalType<Derived, Urng>
228 o.rows(), o.cols(), internal::scalar_norm_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng))
232 template<
typename Derived,
typename Urng>
233 using Normal2Type = CwiseNullaryOp<internal::scalar_norm_dist2_op<typename Derived::Scalar, Urng>,
const Derived>;
247 template<
typename Derived,
typename Urng>
248 inline const Normal2Type<Derived, Urng>
249 normal(Index rows, Index cols, Urng&& urng,
typename Derived::Scalar mean,
typename Derived::Scalar stdev = 1)
252 rows, cols, internal::scalar_norm_dist2_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), mean, stdev)
267 template<
typename Derived,
typename Urng>
268 inline const Normal2Type<Derived, Urng>
269 normalLike(Derived& o, Urng&& urng,
typename Derived::Scalar mean,
typename Derived::Scalar stdev = 1)
272 o.rows(), o.cols(), internal::scalar_norm_dist2_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), mean, stdev)
276 template<
typename Derived,
typename Urng>
277 using LognormalType = CwiseNullaryOp<internal::scalar_lognorm_dist_op<typename Derived::Scalar, Urng>,
const Derived>;
291 template<
typename Derived,
typename Urng>
292 inline const LognormalType<Derived, Urng>
293 lognormal(Index rows, Index cols, Urng&& urng,
typename Derived::Scalar mean = 0,
typename Derived::Scalar stdev = 1)
296 rows, cols, internal::scalar_lognorm_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), mean, stdev)
311 template<
typename Derived,
typename Urng>
312 inline const LognormalType<Derived, Urng>
313 lognormalLike(Derived& o, Urng&& urng,
typename Derived::Scalar mean = 0,
typename Derived::Scalar stdev = 1)
316 o.rows(), o.cols(), internal::scalar_lognorm_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), mean, stdev)
320 template<
typename Derived,
typename Urng>
321 using StudentTType = CwiseNullaryOp<internal::scalar_student_t_dist_op<typename Derived::Scalar, Urng>,
const Derived>;
334 template<
typename Derived,
typename Urng>
335 inline const StudentTType<Derived, Urng>
336 studentT(Index rows, Index cols, Urng&& urng,
typename Derived::Scalar n = 1)
339 rows, cols, internal::scalar_student_t_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), n)
353 template<
typename Derived,
typename Urng>
354 inline const StudentTType<Derived, Urng>
358 o.rows(), o.cols(), internal::scalar_student_t_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), n)
362 template<
typename Derived,
typename Urng>
363 using ExponentialType = CwiseNullaryOp<internal::scalar_exp_dist_op<typename Derived::Scalar, Urng>,
const Derived>;
376 template<
typename Derived,
typename Urng>
377 inline const ExponentialType<Derived, Urng>
378 exponential(Index rows, Index cols, Urng&& urng,
typename Derived::Scalar lambda = 1)
381 rows, cols, internal::scalar_exp_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), lambda)
395 template<
typename Derived,
typename Urng>
396 inline const ExponentialType<Derived, Urng>
400 o.rows(), o.cols(), internal::scalar_exp_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), lambda)
404 template<
typename Derived,
typename Urng>
405 using GammaType = CwiseNullaryOp<internal::scalar_gamma_dist_op<typename Derived::Scalar, Urng>,
const Derived>;
419 template<
typename Derived,
typename Urng>
420 inline const GammaType<Derived, Urng>
421 gamma(Index rows, Index cols, Urng&& urng,
typename Derived::Scalar alpha = 1,
typename Derived::Scalar
beta = 1)
424 rows, cols, internal::scalar_gamma_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), alpha,
beta)
439 template<
typename Derived,
typename Urng>
440 inline const GammaType<Derived, Urng>
441 gammaLike(Derived& o, Urng&& urng,
typename Derived::Scalar alpha = 1,
typename Derived::Scalar
beta = 1)
444 o.rows(), o.cols(), internal::scalar_gamma_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), alpha,
beta)
448 template<
typename Derived,
typename Urng>
449 using WeibullType = CwiseNullaryOp<internal::scalar_weibull_dist_op<typename Derived::Scalar, Urng>,
const Derived>;
463 template<
typename Derived,
typename Urng>
464 inline const WeibullType<Derived, Urng>
465 weibull(Index rows, Index cols, Urng&& urng,
typename Derived::Scalar a = 1,
typename Derived::Scalar b = 1)
468 rows, cols, internal::scalar_weibull_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), a, b)
483 template<
typename Derived,
typename Urng>
484 inline const WeibullType<Derived, Urng>
485 weibullLike(Derived& o, Urng&& urng,
typename Derived::Scalar a = 1,
typename Derived::Scalar b = 1)
488 o.rows(), o.cols(), internal::scalar_weibull_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), a, b)
492 template<
typename Derived,
typename Urng>
493 using ExtremeValueType = CwiseNullaryOp<internal::scalar_extreme_value_dist_op<typename Derived::Scalar, Urng>,
const Derived>;
508 template<
typename Derived,
typename Urng>
509 inline const ExtremeValueType<Derived, Urng>
510 extremeValue(Index rows, Index cols, Urng&& urng,
typename Derived::Scalar a = 0,
typename Derived::Scalar b = 1)
513 rows, cols, internal::scalar_extreme_value_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), a, b)
529 template<
typename Derived,
typename Urng>
530 inline const ExtremeValueType<Derived, Urng>
531 extremeValueLike(Derived& o, Urng&& urng,
typename Derived::Scalar a = 0,
typename Derived::Scalar b = 1)
534 o.rows(), o.cols(), internal::scalar_extreme_value_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), a, b)
538 template<
typename Derived,
typename Urng>
539 using ChiSquaredType = CwiseNullaryOp<internal::scalar_chi_squared_dist_op<typename Derived::Scalar, Urng>,
const Derived>;
552 template<
typename Derived,
typename Urng>
553 inline const ChiSquaredType<Derived, Urng>
554 chiSquared(Index rows, Index cols, Urng&& urng,
typename Derived::Scalar n = 1)
557 rows, cols, internal::scalar_chi_squared_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), n)
571 template<
typename Derived,
typename Urng>
572 inline const ChiSquaredType<Derived, Urng>
576 o.rows(), o.cols(), internal::scalar_chi_squared_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), n)
580 template<
typename Derived,
typename Urng>
581 using CauchyType = CwiseNullaryOp<internal::scalar_cauchy_dist_op<typename Derived::Scalar, Urng>,
const Derived>;
595 template<
typename Derived,
typename Urng>
596 inline const CauchyType<Derived, Urng>
597 cauchy(Index rows, Index cols, Urng&& urng,
typename Derived::Scalar a = 0,
typename Derived::Scalar b = 1)
600 rows, cols, internal::scalar_cauchy_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), a, b)
615 template<
typename Derived,
typename Urng>
616 inline const CauchyType<Derived, Urng>
617 cauchyLike(Derived& o, Urng&& urng,
typename Derived::Scalar a = 0,
typename Derived::Scalar b = 1)
620 o.rows(), o.cols(), internal::scalar_cauchy_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), a, b)
624 template<
typename Derived,
typename Urng>
625 using FisherFType = CwiseNullaryOp<internal::scalar_fisher_f_dist_op<typename Derived::Scalar, Urng>,
const Derived>;
639 template<
typename Derived,
typename Urng>
640 inline const FisherFType<Derived, Urng>
641 fisherF(Index rows, Index cols, Urng&& urng,
typename Derived::Scalar m = 1,
typename Derived::Scalar n = 1)
644 rows, cols, internal::scalar_fisher_f_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), m, n)
659 template<
typename Derived,
typename Urng>
660 inline const FisherFType<Derived, Urng>
661 fisherFLike(Derived& o, Urng&& urng,
typename Derived::Scalar m = 1,
typename Derived::Scalar n = 1)
664 o.rows(), o.cols(), internal::scalar_fisher_f_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), m, n)
668 template<
typename Derived,
typename Urng>
669 using BetaType = CwiseNullaryOp<internal::scalar_beta_dist_op<typename Derived::Scalar, Urng>,
const Derived>;
682 template<
typename Derived,
typename Urng>
683 inline const BetaType<Derived, Urng>
684 beta(Index rows, Index cols, Urng&& urng,
typename Derived::Scalar a = 1,
typename Derived::Scalar b = 1)
687 rows, cols, internal::scalar_beta_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), a, b)
701 template<
typename Derived,
typename Urng>
702 inline const BetaType<Derived, Urng>
703 betaLike(Derived& o, Urng&& urng,
typename Derived::Scalar a = 1,
typename Derived::Scalar b = 1)
706 o.rows(), o.cols(), internal::scalar_beta_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), a, b)
710 template<
typename Derived,
typename Urng>
711 using DiscreteFType = CwiseNullaryOp<internal::scalar_discrete_dist_op<typename Derived::Scalar, Urng, float>,
const Derived>;
725 template<
typename Derived,
typename Urng,
typename RealIter>
726 inline const DiscreteFType<Derived, Urng>
727 discreteF(Index rows, Index cols, Urng&& urng, RealIter first, RealIter last)
730 rows, cols, internal::scalar_discrete_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), first, last)
745 template<
typename Derived,
typename Urng,
typename RealIter>
746 inline const DiscreteFType<Derived, Urng>
750 o.rows(), o.cols(), internal::scalar_discrete_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), first, last)
766 template<
typename Derived,
typename Urng,
typename Real>
767 inline const DiscreteFType<Derived, Urng>
768 discreteF(Index rows, Index cols, Urng&& urng,
const std::initializer_list<Real>& il)
771 rows, cols, internal::scalar_discrete_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), il.begin(), il.end())
786 template<
typename Derived,
typename Urng,
typename Real>
787 inline const DiscreteFType<Derived, Urng>
788 discreteFLike(Derived& o, Urng&& urng,
const std::initializer_list<Real>& il)
791 o.rows(), o.cols(), internal::scalar_discrete_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), il.begin(), il.end())
795 template<
typename Derived,
typename Urng>
796 using DiscreteDType = CwiseNullaryOp<internal::scalar_discrete_dist_op<typename Derived::Scalar, Urng, double>,
const Derived>;
810 template<
typename Derived,
typename Urng,
typename RealIter>
811 inline const DiscreteDType<Derived, Urng>
812 discreteD(Index rows, Index cols, Urng&& urng, RealIter first, RealIter last)
815 rows, cols, internal::scalar_discrete_dist_op<typename Derived::Scalar, Urng, double>(std::forward<Urng>(urng), first, last)
830 template<
typename Derived,
typename Urng,
typename RealIter>
831 inline const DiscreteDType<Derived, Urng>
835 o.rows(), o.cols(), internal::scalar_discrete_dist_op<typename Derived::Scalar, Urng, double>(std::forward<Urng>(urng), first, last)
851 template<
typename Derived,
typename Urng,
typename Real>
852 inline const DiscreteDType<Derived, Urng>
853 discreteD(Index rows, Index cols, Urng&& urng,
const std::initializer_list<Real>& il)
856 rows, cols, internal::scalar_discrete_dist_op<typename Derived::Scalar, Urng, double>(std::forward<Urng>(urng), il.begin(), il.end())
871 template<
typename Derived,
typename Urng,
typename Real>
872 inline const DiscreteDType<Derived, Urng>
873 discreteDLike(Derived& o, Urng&& urng,
const std::initializer_list<Real>& il)
876 o.rows(), o.cols(), internal::scalar_discrete_dist_op<typename Derived::Scalar, Urng, double>(std::forward<Urng>(urng), il.begin(), il.end())
880 template<
typename Derived,
typename Urng>
881 using DiscreteType = CwiseNullaryOp<internal::scalar_discrete_dist_op<typename Derived::Scalar, Urng, int32_t>,
const Derived>;
895 template<
typename Derived,
typename Urng,
typename RealIter>
896 inline const DiscreteType<Derived, Urng>
897 discrete(Index rows, Index cols, Urng&& urng, RealIter first, RealIter last)
900 rows, cols, internal::scalar_discrete_dist_op<typename Derived::Scalar, Urng, int32_t>(std::forward<Urng>(urng), first, last)
915 template<
typename Derived,
typename Urng,
typename RealIter>
916 inline const DiscreteType<Derived, Urng>
920 o.rows(), o.cols(), internal::scalar_discrete_dist_op<typename Derived::Scalar, Urng, int32_t>(std::forward<Urng>(urng), first, last)
936 template<
typename Derived,
typename Urng,
typename Real>
937 inline const DiscreteType<Derived, Urng>
938 discrete(Index rows, Index cols, Urng&& urng,
const std::initializer_list<Real>& il)
941 rows, cols, internal::scalar_discrete_dist_op<typename Derived::Scalar, Urng, int32_t>(std::forward<Urng>(urng), il.begin(), il.end())
956 template<
typename Derived,
typename Urng,
typename Real>
957 inline const DiscreteType<Derived, Urng>
958 discreteLike(Derived& o, Urng&& urng,
const std::initializer_list<Real>& il)
961 o.rows(), o.cols(), internal::scalar_discrete_dist_op<typename Derived::Scalar, Urng, int32_t>(std::forward<Urng>(urng), il.begin(), il.end())
965 template<
typename Derived,
typename Urng>
966 using PoissonType = CwiseNullaryOp<internal::scalar_poisson_dist_op<typename Derived::Scalar, Urng>,
const Derived>;
979 template<
typename Derived,
typename Urng>
980 inline const PoissonType<Derived, Urng>
981 poisson(Index rows, Index cols, Urng&& urng,
double mean = 1)
984 rows, cols, internal::scalar_poisson_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), mean)
998 template<
typename Derived,
typename Urng>
999 inline const PoissonType<Derived, Urng>
1003 o.rows(), o.cols(), internal::scalar_poisson_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), mean)
1007 template<
typename Derived,
typename Urng>
1008 using BinomialType = CwiseNullaryOp<internal::scalar_binomial_dist_op<typename Derived::Scalar, Urng>,
const Derived>;
1022 template<
typename Derived,
typename Urng>
1023 inline const BinomialType<Derived, Urng>
1024 binomial(Index rows, Index cols, Urng&& urng,
typename Derived::Scalar trials = 1,
double p = 0.5)
1027 rows, cols, internal::scalar_binomial_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), trials, p)
1042 template<
typename Derived,
typename Urng>
1043 inline const BinomialType<Derived, Urng>
1044 binomialLike(Derived& o, Urng&& urng,
typename Derived::Scalar trials = 1,
double p = 0.5)
1047 o.rows(), o.cols(), internal::scalar_binomial_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), trials, p)
1051 template<
typename Derived,
typename Urng>
1052 using NegativeBinomialType = CwiseNullaryOp<internal::scalar_negative_binomial_dist_op<typename Derived::Scalar, Urng>,
const Derived>;
1066 template<
typename Derived,
typename Urng>
1067 inline const NegativeBinomialType<Derived, Urng>
1068 negativeBinomial(Index rows, Index cols, Urng&& urng,
typename Derived::Scalar trials = 1,
double p = 0.5)
1071 rows, cols, internal::scalar_negative_binomial_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), trials, p)
1086 template<
typename Derived,
typename Urng>
1087 inline const NegativeBinomialType<Derived, Urng>
1091 o.rows(), o.cols(), internal::scalar_negative_binomial_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), trials, p)
1095 template<
typename Derived,
typename Urng>
1096 using GeometricType = CwiseNullaryOp<internal::scalar_geometric_dist_op<typename Derived::Scalar, Urng>,
const Derived>;
1109 template<
typename Derived,
typename Urng>
1110 inline const GeometricType<Derived, Urng>
1111 geometric(Index rows, Index cols, Urng&& urng,
double p = 0.5)
1114 rows, cols, internal::scalar_geometric_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), p)
1128 template<
typename Derived,
typename Urng>
1129 inline const GeometricType<Derived, Urng>
1133 o.rows(), o.cols(), internal::scalar_geometric_dist_op<typename Derived::Scalar, Urng>(std::forward<Urng>(urng), p)