tomoto 0.6.0 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/LICENSE.txt +1 -1
  4. data/ext/tomoto/ct.cpp +1 -1
  5. data/ext/tomoto/dmr.cpp +1 -1
  6. data/ext/tomoto/dt.cpp +1 -1
  7. data/ext/tomoto/extconf.rb +4 -8
  8. data/ext/tomoto/gdmr.cpp +1 -1
  9. data/ext/tomoto/hdp.cpp +1 -1
  10. data/ext/tomoto/hlda.cpp +1 -1
  11. data/ext/tomoto/hpa.cpp +1 -1
  12. data/ext/tomoto/lda.cpp +29 -3
  13. data/ext/tomoto/llda.cpp +1 -1
  14. data/ext/tomoto/mglda.cpp +1 -1
  15. data/ext/tomoto/pa.cpp +1 -1
  16. data/ext/tomoto/plda.cpp +1 -1
  17. data/ext/tomoto/slda.cpp +1 -1
  18. data/lib/tomoto/lda.rb +1 -0
  19. data/lib/tomoto/version.rb +1 -1
  20. data/vendor/EigenRand/EigenRand/Core.h +6 -4
  21. data/vendor/EigenRand/EigenRand/CwiseHeteroBinaryOp.h +265 -0
  22. data/vendor/EigenRand/EigenRand/Dists/Basic.h +345 -12
  23. data/vendor/EigenRand/EigenRand/Dists/Discrete.h +381 -7
  24. data/vendor/EigenRand/EigenRand/Dists/GammaPoisson.h +4 -4
  25. data/vendor/EigenRand/EigenRand/Dists/NormalExp.h +576 -4
  26. data/vendor/EigenRand/EigenRand/EigenRand +4 -4
  27. data/vendor/EigenRand/EigenRand/Macro.h +3 -3
  28. data/vendor/EigenRand/EigenRand/MorePacketMath.h +31 -30
  29. data/vendor/EigenRand/EigenRand/MvDists/Multinomial.h +41 -29
  30. data/vendor/EigenRand/EigenRand/MvDists/MvNormal.h +19 -7
  31. data/vendor/EigenRand/EigenRand/PacketFilter.h +8 -5
  32. data/vendor/EigenRand/EigenRand/PacketRandomEngine.h +3 -3
  33. data/vendor/EigenRand/EigenRand/RandUtils.h +180 -5
  34. data/vendor/EigenRand/EigenRand/arch/AVX/MorePacketMath.h +42 -3
  35. data/vendor/EigenRand/EigenRand/arch/AVX/PacketFilter.h +3 -3
  36. data/vendor/EigenRand/EigenRand/arch/AVX/RandUtils.h +3 -3
  37. data/vendor/EigenRand/EigenRand/arch/AVX512/MorePacketMath.h +312 -0
  38. data/vendor/EigenRand/EigenRand/arch/AVX512/PacketFilter.h +79 -0
  39. data/vendor/EigenRand/EigenRand/arch/AVX512/RandUtils.h +147 -0
  40. data/vendor/EigenRand/EigenRand/arch/NEON/MorePacketMath.h +118 -3
  41. data/vendor/EigenRand/EigenRand/arch/NEON/PacketFilter.h +3 -3
  42. data/vendor/EigenRand/EigenRand/arch/NEON/RandUtils.h +21 -3
  43. data/vendor/EigenRand/EigenRand/arch/SSE/MorePacketMath.h +32 -4
  44. data/vendor/EigenRand/EigenRand/arch/SSE/PacketFilter.h +3 -3
  45. data/vendor/EigenRand/EigenRand/arch/SSE/RandUtils.h +3 -3
  46. data/vendor/EigenRand/EigenRand/doc.h +108 -157
  47. data/vendor/EigenRand/README.md +60 -272
  48. data/vendor/tomotopy/README.kr.rst +27 -5
  49. data/vendor/tomotopy/README.rst +27 -5
  50. data/vendor/tomotopy/README_pypi.rst +583 -0
  51. data/vendor/tomotopy/licenses_bundled/EigenRand +21 -0
  52. data/vendor/tomotopy/src/TopicModel/CT.h +1 -1
  53. data/vendor/tomotopy/src/TopicModel/CTModel.cpp +1 -1
  54. data/vendor/tomotopy/src/TopicModel/DMR.h +1 -1
  55. data/vendor/tomotopy/src/TopicModel/DMRModel.cpp +1 -1
  56. data/vendor/tomotopy/src/TopicModel/DT.h +1 -1
  57. data/vendor/tomotopy/src/TopicModel/DTModel.cpp +1 -1
  58. data/vendor/tomotopy/src/TopicModel/GDMR.h +1 -1
  59. data/vendor/tomotopy/src/TopicModel/GDMRModel.cpp +1 -1
  60. data/vendor/tomotopy/src/TopicModel/HDP.h +1 -1
  61. data/vendor/tomotopy/src/TopicModel/HDPModel.cpp +1 -1
  62. data/vendor/tomotopy/src/TopicModel/HLDA.h +1 -1
  63. data/vendor/tomotopy/src/TopicModel/HLDAModel.cpp +1 -1
  64. data/vendor/tomotopy/src/TopicModel/HPA.h +1 -1
  65. data/vendor/tomotopy/src/TopicModel/HPAModel.cpp +1 -1
  66. data/vendor/tomotopy/src/TopicModel/LDA.h +1 -1
  67. data/vendor/tomotopy/src/TopicModel/LDAModel.cpp +1 -1
  68. data/vendor/tomotopy/src/TopicModel/LDAModel.hpp +6 -6
  69. data/vendor/tomotopy/src/TopicModel/LLDA.h +1 -1
  70. data/vendor/tomotopy/src/TopicModel/LLDAModel.cpp +1 -1
  71. data/vendor/tomotopy/src/TopicModel/MGLDA.h +1 -1
  72. data/vendor/tomotopy/src/TopicModel/MGLDAModel.cpp +1 -1
  73. data/vendor/tomotopy/src/TopicModel/PA.h +1 -1
  74. data/vendor/tomotopy/src/TopicModel/PAModel.cpp +1 -1
  75. data/vendor/tomotopy/src/TopicModel/PLDA.h +1 -1
  76. data/vendor/tomotopy/src/TopicModel/PLDAModel.cpp +1 -1
  77. data/vendor/tomotopy/src/TopicModel/PT.h +1 -1
  78. data/vendor/tomotopy/src/TopicModel/PTModel.cpp +1 -1
  79. data/vendor/tomotopy/src/TopicModel/SLDA.h +1 -1
  80. data/vendor/tomotopy/src/TopicModel/SLDAModel.cpp +1 -1
  81. data/vendor/tomotopy/src/TopicModel/TopicModel.hpp +6 -6
  82. data/vendor/tomotopy/src/Utils/EigenAddonOps.hpp +41 -0
  83. data/vendor/tomotopy/src/Utils/ThreadPool.hpp +6 -6
  84. data/vendor/tomotopy/src/Utils/Utils.hpp +3 -3
  85. data/vendor/tomotopy/src/Utils/avx512_gamma.h +46 -0
  86. data/vendor/tomotopy/src/Utils/avx512_mathfun.h +99 -0
  87. metadata +10 -9
  88. data/vendor/variant/LICENSE +0 -25
  89. data/vendor/variant/LICENSE_1_0.txt +0 -23
  90. data/vendor/variant/README.md +0 -102
  91. data/vendor/variant/include/mapbox/optional.hpp +0 -74
  92. data/vendor/variant/include/mapbox/recursive_wrapper.hpp +0 -122
  93. data/vendor/variant/include/mapbox/variant.hpp +0 -974
  94. data/vendor/variant/include/mapbox/variant_io.hpp +0 -45
@@ -2,10 +2,10 @@
2
2
  * @file NormalExp.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.4.1
6
- * @date 2022-08-13
7
- *
8
- * @copyright Copyright (c) 2020-2021
5
+ * @version 0.5.1
6
+ * @date 2024-09-08
7
+ *
8
+ * @copyright Copyright (c) 2020-2024
9
9
  *
10
10
  */
11
11
 
@@ -132,6 +132,33 @@ namespace Eigen
132
132
  }
133
133
  };
134
134
 
135
+ template<typename _Scalar>
136
+ class NormalVGen : public BinaryGenBase<NormalVGen<_Scalar>, _Scalar, _Scalar, _Scalar>
137
+ {
138
+ static_assert(std::is_floating_point<_Scalar>::value, "normalDist needs floating point types.");
139
+ StdNormalGen<_Scalar> stdnorm;
140
+
141
+ public:
142
+ using Scalar = _Scalar;
143
+
144
+ template<typename Rng>
145
+ EIGEN_STRONG_INLINE const _Scalar operator() (Rng&& rng, _Scalar mean, _Scalar stdev)
146
+ {
147
+ using namespace Eigen::internal;
148
+ return stdnorm(std::forward<Rng>(rng)) * stdev + mean;
149
+ }
150
+
151
+ template<typename Packet, typename Rng>
152
+ EIGEN_STRONG_INLINE const Packet packetOp(Rng&& rng, const Packet& mean, const Packet& stdev)
153
+ {
154
+ using namespace Eigen::internal;
155
+ return padd(pmul(
156
+ stdnorm.template packetOp<Packet>(std::forward<Rng>(rng)),
157
+ stdev
158
+ ), mean);
159
+ }
160
+ };
161
+
135
162
  /**
136
163
  * @brief Generator of reals on a lognormal distribution
137
164
  *
@@ -178,6 +205,30 @@ namespace Eigen
178
205
  }
179
206
  };
180
207
 
208
+ template<typename _Scalar>
209
+ class LognormalVGen : public BinaryGenBase<LognormalVGen<_Scalar>, _Scalar, _Scalar, _Scalar>
210
+ {
211
+ static_assert(std::is_floating_point<_Scalar>::value, "lognormalDist needs floating point types.");
212
+ NormalVGen<_Scalar> norm;
213
+
214
+ public:
215
+ using Scalar = _Scalar;
216
+
217
+ template<typename Rng>
218
+ EIGEN_STRONG_INLINE const _Scalar operator() (Rng&& rng, _Scalar mean, _Scalar stdev)
219
+ {
220
+ using namespace Eigen::internal;
221
+ return std::exp(norm(std::forward<Rng>(rng), mean, stdev));
222
+ }
223
+
224
+ template<typename Packet, typename Rng>
225
+ EIGEN_STRONG_INLINE const Packet packetOp(Rng&& rng, const Packet& mean, const Packet& stdev)
226
+ {
227
+ using namespace Eigen::internal;
228
+ return pexp(norm.template packetOp<Packet>(std::forward<Rng>(rng), mean, stdev));
229
+ }
230
+ };
231
+
181
232
  /**
182
233
  * @brief Generator of reals on a Student's t distribution
183
234
  *
@@ -246,6 +297,51 @@ namespace Eigen
246
297
  }
247
298
  };
248
299
 
300
+ template<typename _Scalar>
301
+ class StudentTVGen : public UnaryGenBase<StudentTVGen<_Scalar>, _Scalar, _Scalar>
302
+ {
303
+ static_assert(std::is_floating_point<_Scalar>::value, "studentT needs floating point types.");
304
+ StdUniformRealGen<_Scalar> ur;
305
+
306
+ public:
307
+ using Scalar = _Scalar;
308
+
309
+ template<typename Rng>
310
+ EIGEN_STRONG_INLINE const _Scalar operator() (Rng&& rng, _Scalar n)
311
+ {
312
+ using namespace Eigen::internal;
313
+ _Scalar v1, v2, sx;
314
+ for (int _i = 0; ; ++_i)
315
+ {
316
+ EIGENRAND_CHECK_INFINITY_LOOP();
317
+ v1 = 2 * ur(rng) - 1;
318
+ v2 = 2 * ur(rng) - 1;
319
+ sx = v1 * v1 + v2 * v2;
320
+ if (sx && sx < 1) break;
321
+ }
322
+
323
+ _Scalar fx = std::sqrt(n * (std::pow(sx, -2 / n) - 1) / sx);
324
+ return fx * v1;
325
+ }
326
+
327
+ template<typename Packet, typename Rng>
328
+ EIGEN_STRONG_INLINE const Packet packetOp(Rng&& rng, const Packet& n)
329
+ {
330
+ using namespace Eigen::internal;
331
+ Packet u1 = ur.template packetOp<Packet>(rng),
332
+ u2 = ur.template packetOp<Packet>(rng);
333
+
334
+ u1 = psub(pset1<Packet>(1), u1);
335
+ auto radius = psqrt(pmul(n,
336
+ psub(pexp(pmul(plog(u1), pdiv(pset1<Packet>(-2), n))), pset1<Packet>(1))
337
+ ));
338
+ auto theta = pmul(pset1<Packet>(2 * constant::pi), u2);
339
+ //Packet sintheta, costheta;
340
+ //psincos(theta, sintheta, costheta);
341
+ return pmul(radius, psin(theta));
342
+ }
343
+ };
344
+
249
345
  template<typename> class GammaGen;
250
346
 
251
347
  /**
@@ -297,6 +393,32 @@ namespace Eigen
297
393
  }
298
394
  };
299
395
 
396
+ template<typename _Scalar>
397
+ class ExponentialVGen : public UnaryGenBase<ExponentialVGen<_Scalar>, _Scalar, _Scalar>
398
+ {
399
+ static_assert(std::is_floating_point<_Scalar>::value, "expDist needs floating point types.");
400
+ StdUniformRealGen<_Scalar> ur;
401
+
402
+ public:
403
+ using Scalar = _Scalar;
404
+
405
+ template<typename Rng>
406
+ EIGEN_STRONG_INLINE const _Scalar operator() (Rng&& rng, _Scalar lambda)
407
+ {
408
+ using namespace Eigen::internal;
409
+ return -std::log(1 - ur(std::forward<Rng>(rng))) / lambda;
410
+ }
411
+
412
+ template<typename Packet, typename Rng>
413
+ EIGEN_STRONG_INLINE const Packet packetOp(Rng&& rng, const Packet& lambda)
414
+ {
415
+ using namespace Eigen::internal;
416
+ return pnegate(pdiv(plog(
417
+ psub(pset1<Packet>(1), ur.template packetOp<Packet>(std::forward<Rng>(rng)))
418
+ ), lambda));
419
+ }
420
+ };
421
+
300
422
  template<typename> class NegativeBinomialGen;
301
423
 
302
424
  /**
@@ -527,6 +649,32 @@ namespace Eigen
527
649
  }
528
650
  };
529
651
 
652
+ template<typename _Scalar>
653
+ class WeibullVGen : public BinaryGenBase<WeibullGen<_Scalar>, _Scalar, _Scalar, _Scalar>
654
+ {
655
+ static_assert(std::is_floating_point<_Scalar>::value, "weilbullDist needs floating point types.");
656
+ StdUniformRealGen<_Scalar> ur;
657
+
658
+ public:
659
+ using Scalar = _Scalar;
660
+
661
+ template<typename Rng>
662
+ EIGEN_STRONG_INLINE const _Scalar operator() (Rng&& rng, _Scalar a, _Scalar b)
663
+ {
664
+ using namespace Eigen::internal;
665
+ return std::pow(-std::log(1 - ur(std::forward<Rng>(rng))), 1 / a) * b;
666
+ }
667
+
668
+ template<typename Packet, typename Rng>
669
+ EIGEN_STRONG_INLINE const Packet packetOp(Rng&& rng, const Packet& a, const Packet& b)
670
+ {
671
+ using namespace Eigen::internal;
672
+ return pmul(pexp(pmul(plog(pnegate(plog(
673
+ psub(pset1<Packet>(1), ur.template packetOp<Packet>(std::forward<Rng>(rng)))
674
+ ))), pdiv(pset1<Packet>(1), a))), b);
675
+ }
676
+ };
677
+
530
678
  /**
531
679
  * @brief Generator of reals on an extreme value distribution
532
680
  *
@@ -577,6 +725,33 @@ namespace Eigen
577
725
  }
578
726
  };
579
727
 
728
+ template<typename _Scalar>
729
+ class ExtremeValueVGen : public BinaryGenBase<ExtremeValueVGen<_Scalar>, _Scalar, _Scalar, _Scalar>
730
+ {
731
+ static_assert(std::is_floating_point<_Scalar>::value, "extremeValueDist needs floating point types.");
732
+ StdUniformRealGen<_Scalar> ur;
733
+
734
+ public:
735
+ using Scalar = _Scalar;
736
+
737
+ template<typename Rng>
738
+ EIGEN_STRONG_INLINE const _Scalar operator() (Rng&& rng, _Scalar a, _Scalar b)
739
+ {
740
+ using namespace Eigen::internal;
741
+ return (a - b * std::log(-std::log(ur.nzur_scalar(std::forward<Rng>(rng)))));
742
+ }
743
+
744
+ template<typename Packet, typename Rng>
745
+ EIGEN_STRONG_INLINE const Packet packetOp(Rng&& rng, const Packet& a, const Packet& b)
746
+ {
747
+ using namespace Eigen::internal;
748
+ using RUtils = RandUtils<Packet, Rng>;
749
+ return psub(a,
750
+ pmul(plog(pnegate(plog(RUtils{}.nonzero_uniform_real(std::forward<Rng>(rng))))), b)
751
+ );
752
+ }
753
+ };
754
+
580
755
  /**
581
756
  * @brief Generator of reals on a chi-squared distribution
582
757
  *
@@ -672,6 +847,36 @@ namespace Eigen
672
847
  }
673
848
  };
674
849
 
850
+ template<typename _Scalar>
851
+ class CauchyVGen : public BinaryGenBase<CauchyVGen<_Scalar>, _Scalar, _Scalar, _Scalar>
852
+ {
853
+ static_assert(std::is_floating_point<_Scalar>::value, "cauchyDist needs floating point types.");
854
+ StdUniformRealGen<_Scalar> ur;
855
+
856
+ public:
857
+ using Scalar = _Scalar;
858
+
859
+ template<typename Rng>
860
+ EIGEN_STRONG_INLINE const _Scalar operator() (Rng&& rng, _Scalar a, _Scalar b)
861
+ {
862
+ using namespace Eigen::internal;
863
+ return a + b * std::tan(constant::pi * (ur(std::forward<Rng>(rng)) - 0.5));
864
+ }
865
+
866
+ template<typename Packet, typename Rng>
867
+ EIGEN_STRONG_INLINE const Packet packetOp(Rng&& rng, const Packet& a, const Packet& b)
868
+ {
869
+ using namespace Eigen::internal;
870
+ Packet s, c;
871
+ psincos(pmul(pset1<Packet>(constant::pi),
872
+ psub(ur.template packetOp<Packet>(std::forward<Rng>(rng)), pset1<Packet>(0.5))
873
+ ), s, c);
874
+ return padd(a,
875
+ pmul(b, pdiv(s, c))
876
+ );
877
+ }
878
+ };
879
+
675
880
  template<typename> class FisherFGen;
676
881
 
677
882
  /**
@@ -904,6 +1109,69 @@ namespace Eigen
904
1109
  };
905
1110
  }
906
1111
 
1112
+ template<typename Lhs, typename Rhs, typename Urng>
1113
+ using CauchyVVType = CwiseBinaryOp<
1114
+ internal::scalar_binary_rng_adaptor<CauchyVGen<typename Lhs::Scalar>, typename Lhs::Scalar, typename Lhs::Scalar, typename Rhs::Scalar, Urng, true>,
1115
+ const Lhs, const Rhs
1116
+ >;
1117
+
1118
+ /**
1119
+ * @brief generates reals on the Cauchy distribution.
1120
+ *
1121
+ * @tparam Lhs, Rhs
1122
+ * @tparam Urng
1123
+ * @param urng c++11-style random number generator
1124
+ * @param a a location parameter of the distribution
1125
+ * @param b a scale parameter of the distribution
1126
+ * @return a random matrix expression with the same shape as `a` and `b`
1127
+ * @note `a` and `b` should have the same shape and scalar type.
1128
+ *
1129
+ * @see Eigen::Rand::CauchyGen
1130
+ */
1131
+ template<typename Lhs, typename Rhs, typename Urng>
1132
+ inline const CauchyVVType<Lhs, Rhs, Urng>
1133
+ cauchy(Urng&& urng, const ArrayBase<Lhs>& a, const ArrayBase<Rhs>& b)
1134
+ {
1135
+ return {
1136
+ static_cast<const Lhs&>(a), static_cast<const Rhs&>(b),
1137
+ { std::forward<Urng>(urng), CauchyVGen<typename Lhs::Scalar>{} }
1138
+ };
1139
+ }
1140
+
1141
+ template<typename Derived, typename Urng>
1142
+ using CauchyVSType = CwiseBinaryOp<
1143
+ internal::scalar_binary_rng_adaptor<CauchyVGen<typename Derived::Scalar>, typename Derived::Scalar, typename Derived::Scalar, typename Derived::Scalar, Urng, true>,
1144
+ const Derived, CwiseNullaryOp<internal::scalar_constant_op<typename Derived::Scalar>, const Derived>
1145
+ >;
1146
+
1147
+ template<typename Lhs, typename Urng>
1148
+ inline const CauchyVSType<Lhs, Urng>
1149
+ cauchy(Urng&& urng, const ArrayBase<Lhs>& a, typename Lhs::Scalar b)
1150
+ {
1151
+ return {
1152
+ static_cast<const Lhs&>(a),
1153
+ { a.rows(), a.cols(), internal::scalar_constant_op<typename Lhs::Scalar>{ b } },
1154
+ { std::forward<Urng>(urng), CauchyVGen<typename Lhs::Scalar>{} }
1155
+ };
1156
+ }
1157
+
1158
+ template<typename Derived, typename Urng>
1159
+ using CauchySVType = CwiseBinaryOp<
1160
+ internal::scalar_binary_rng_adaptor<CauchyVGen<typename Derived::Scalar>, typename Derived::Scalar, typename Derived::Scalar, typename Derived::Scalar, Urng, true>,
1161
+ CwiseNullaryOp<internal::scalar_constant_op<typename Derived::Scalar>, const Derived>, const Derived
1162
+ >;
1163
+
1164
+ template<typename Rhs, typename Urng>
1165
+ inline const CauchySVType<Rhs, Urng>
1166
+ cauchy(Urng&& urng, typename Rhs::Scalar a, const ArrayBase<Rhs>& b)
1167
+ {
1168
+ return {
1169
+ { b.rows(), b.cols(), internal::scalar_constant_op<typename Rhs::Scalar>{ a } },
1170
+ static_cast<const Rhs&>(b),
1171
+ { std::forward<Urng>(urng), CauchyVGen<typename Rhs::Scalar>{} }
1172
+ };
1173
+ }
1174
+
907
1175
  template<typename Derived, typename Urng>
908
1176
  using NormalType = CwiseNullaryOp<internal::scalar_rng_adaptor<StdNormalGen<typename Derived::Scalar>, typename Derived::Scalar, Urng, true>, const Derived>;
909
1177
 
@@ -996,6 +1264,69 @@ namespace Eigen
996
1264
  };
997
1265
  }
998
1266
 
1267
+ template<typename Lhs, typename Rhs, typename Urng>
1268
+ using NormalVVType = CwiseBinaryOp<
1269
+ internal::scalar_binary_rng_adaptor<NormalVGen<typename Lhs::Scalar>, typename Lhs::Scalar, typename Lhs::Scalar, typename Rhs::Scalar, Urng, true>,
1270
+ const Lhs, const Rhs
1271
+ >;
1272
+
1273
+ /**
1274
+ * @brief generates reals on a normal distribution with arbitrary `mean` and `stdev`.
1275
+ *
1276
+ * @tparam Lhs, Rhs
1277
+ * @tparam Urng
1278
+ * @param urng c++11-style random number generator
1279
+ * @param mean a mean value of the distribution
1280
+ * @param stdev a standard deviation value of the distribution
1281
+ * @return a random matrix expression with the same shape as `mean` and `stdev`
1282
+ * @note `mean` and `stdev` should have the same shape and scalar type.
1283
+ *
1284
+ * @see Eigen::Rand::NormalGen
1285
+ */
1286
+ template<typename Lhs, typename Rhs, typename Urng>
1287
+ inline const NormalVVType<Lhs, Rhs, Urng>
1288
+ normal(Urng&& urng, const ArrayBase<Lhs>& a, const ArrayBase<Rhs>& b)
1289
+ {
1290
+ return {
1291
+ static_cast<const Lhs&>(a), static_cast<const Rhs&>(b),
1292
+ { std::forward<Urng>(urng), NormalVGen<typename Lhs::Scalar>{} }
1293
+ };
1294
+ }
1295
+
1296
+ template<typename Derived, typename Urng>
1297
+ using NormalVSType = CwiseBinaryOp<
1298
+ internal::scalar_binary_rng_adaptor<NormalVGen<typename Derived::Scalar>, typename Derived::Scalar, typename Derived::Scalar, typename Derived::Scalar, Urng, true>,
1299
+ const Derived, CwiseNullaryOp<internal::scalar_constant_op<typename Derived::Scalar>, const Derived>
1300
+ >;
1301
+
1302
+ template<typename Lhs, typename Urng>
1303
+ inline const NormalVSType<Lhs, Urng>
1304
+ normal(Urng&& urng, const ArrayBase<Lhs>& a, typename Lhs::Scalar b)
1305
+ {
1306
+ return {
1307
+ static_cast<const Lhs&>(a),
1308
+ { a.rows(), a.cols(), internal::scalar_constant_op<typename Lhs::Scalar>{ b } },
1309
+ { std::forward<Urng>(urng), NormalVGen<typename Lhs::Scalar>{} }
1310
+ };
1311
+ }
1312
+
1313
+ template<typename Derived, typename Urng>
1314
+ using NormalSVType = CwiseBinaryOp<
1315
+ internal::scalar_binary_rng_adaptor<NormalVGen<typename Derived::Scalar>, typename Derived::Scalar, typename Derived::Scalar, typename Derived::Scalar, Urng, true>,
1316
+ CwiseNullaryOp<internal::scalar_constant_op<typename Derived::Scalar>, const Derived>, const Derived
1317
+ >;
1318
+
1319
+ template<typename Rhs, typename Urng>
1320
+ inline const NormalSVType<Rhs, Urng>
1321
+ normal(Urng&& urng, typename Rhs::Scalar a, const ArrayBase<Rhs>& b)
1322
+ {
1323
+ return {
1324
+ { b.rows(), b.cols(), internal::scalar_constant_op<typename Rhs::Scalar>{ a } },
1325
+ static_cast<const Rhs&>(b),
1326
+ { std::forward<Urng>(urng), NormalVGen<typename Rhs::Scalar>{} }
1327
+ };
1328
+ }
1329
+
999
1330
  template<typename Derived, typename Urng>
1000
1331
  using LognormalType = CwiseNullaryOp<internal::scalar_rng_adaptor<LognormalGen<typename Derived::Scalar>, typename Derived::Scalar, Urng, true>, const Derived>;
1001
1332
 
@@ -1044,6 +1375,68 @@ namespace Eigen
1044
1375
  };
1045
1376
  }
1046
1377
 
1378
+ template<typename Lhs, typename Rhs, typename Urng>
1379
+ using LognormalVVType = CwiseBinaryOp<
1380
+ internal::scalar_binary_rng_adaptor<LognormalVGen<typename Lhs::Scalar>, typename Lhs::Scalar, typename Lhs::Scalar, typename Rhs::Scalar, Urng, true>,
1381
+ const Lhs, const Rhs
1382
+ >;
1383
+ /**
1384
+ * @brief generates reals on a lognormal distribution with arbitrary `mean` and `stdev`.
1385
+ *
1386
+ * @tparam Lhs, Rhs
1387
+ * @tparam Urng
1388
+ * @param urng c++11-style random number generator
1389
+ * @param mean a mean value of the distribution
1390
+ * @param stdev a standard deviation value of the distribution
1391
+ * @return a random matrix expression with the same shape as `mean` and `stdev`
1392
+ * @note `mean` and `stdev` should have the same shape and scalar type.
1393
+ *
1394
+ * @see Eigen::Rand::LognormalGen
1395
+ */
1396
+ template<typename Lhs, typename Rhs, typename Urng>
1397
+ inline const LognormalVVType<Lhs, Rhs, Urng>
1398
+ lognormal(Urng&& urng, const ArrayBase<Lhs>& a, const ArrayBase<Rhs>& b)
1399
+ {
1400
+ return {
1401
+ static_cast<const Lhs&>(a), static_cast<const Rhs&>(b),
1402
+ { std::forward<Urng>(urng), LognormalVGen<typename Lhs::Scalar>{} }
1403
+ };
1404
+ }
1405
+
1406
+ template<typename Derived, typename Urng>
1407
+ using LognormalVSType = CwiseBinaryOp<
1408
+ internal::scalar_binary_rng_adaptor<LognormalVGen<typename Derived::Scalar>, typename Derived::Scalar, typename Derived::Scalar, typename Derived::Scalar, Urng, true>,
1409
+ const Derived, CwiseNullaryOp<internal::scalar_constant_op<typename Derived::Scalar>, const Derived>
1410
+ >;
1411
+
1412
+ template<typename Lhs, typename Urng>
1413
+ inline const LognormalVSType<Lhs, Urng>
1414
+ lognormal(Urng&& urng, const ArrayBase<Lhs>& a, typename Lhs::Scalar b)
1415
+ {
1416
+ return {
1417
+ static_cast<const Lhs&>(a),
1418
+ { a.rows(), a.cols(), internal::scalar_constant_op<typename Lhs::Scalar>{ b } },
1419
+ { std::forward<Urng>(urng), LognormalVGen<typename Lhs::Scalar>{} }
1420
+ };
1421
+ }
1422
+
1423
+ template<typename Derived, typename Urng>
1424
+ using LognormalSVType = CwiseBinaryOp<
1425
+ internal::scalar_binary_rng_adaptor<LognormalVGen<typename Derived::Scalar>, typename Derived::Scalar, typename Derived::Scalar, typename Derived::Scalar, Urng, true>,
1426
+ CwiseNullaryOp<internal::scalar_constant_op<typename Derived::Scalar>, const Derived>, const Derived
1427
+ >;
1428
+
1429
+ template<typename Rhs, typename Urng>
1430
+ inline const LognormalSVType<Rhs, Urng>
1431
+ lognormal(Urng&& urng, typename Rhs::Scalar a, const ArrayBase<Rhs>& b)
1432
+ {
1433
+ return {
1434
+ { b.rows(), b.cols(), internal::scalar_constant_op<typename Rhs::Scalar>{ a } },
1435
+ static_cast<const Rhs&>(b),
1436
+ { std::forward<Urng>(urng), LognormalVGen<typename Rhs::Scalar>{} }
1437
+ };
1438
+ }
1439
+
1047
1440
  template<typename Derived, typename Urng>
1048
1441
  using StudentTType = CwiseNullaryOp<internal::scalar_rng_adaptor<StudentTGen<typename Derived::Scalar>, typename Derived::Scalar, Urng, true>, const Derived>;
1049
1442
 
@@ -1090,6 +1483,32 @@ namespace Eigen
1090
1483
  };
1091
1484
  }
1092
1485
 
1486
+ template<typename Lhs, typename Urng>
1487
+ using StudentTVType = CwiseUnaryOp<
1488
+ internal::scalar_unary_rng_adaptor<StudentTVGen<typename Lhs::Scalar>, typename Lhs::Scalar, typename Lhs::Scalar, Urng, true>,
1489
+ const Lhs
1490
+ >;
1491
+ /**
1492
+ * @brief generates reals on the Student's t distribution with arbirtrary degress of freedom.
1493
+ *
1494
+ * @tparam Lhs
1495
+ * @tparam Urng
1496
+ * @param urng c++11-style random number generator
1497
+ * @param n degrees of freedom
1498
+ * @return a random matrix expression with the same shape as `n`
1499
+ *
1500
+ * @see Eigen::Rand::StudentTGen
1501
+ */
1502
+ template<typename Lhs, typename Urng>
1503
+ inline const StudentTVType<Lhs, Urng>
1504
+ studentT(Urng&& urng, const ArrayBase<Lhs>& a)
1505
+ {
1506
+ return StudentTVType<Lhs, Urng> {
1507
+ static_cast<const Lhs&>(a),
1508
+ { std::forward<Urng>(urng), StudentTVGen<typename Lhs::Scalar>{} }
1509
+ };
1510
+ }
1511
+
1093
1512
  template<typename Derived, typename Urng>
1094
1513
  using ExponentialType = CwiseNullaryOp<internal::scalar_rng_adaptor<ExponentialGen<typename Derived::Scalar>, typename Derived::Scalar, Urng, true>, const Derived>;
1095
1514
 
@@ -1136,6 +1555,32 @@ namespace Eigen
1136
1555
  };
1137
1556
  }
1138
1557
 
1558
+ template<typename Lhs, typename Urng>
1559
+ using ExponentialVType = CwiseUnaryOp<
1560
+ internal::scalar_unary_rng_adaptor<ExponentialVGen<typename Lhs::Scalar>, typename Lhs::Scalar, typename Lhs::Scalar, Urng, true>,
1561
+ const Lhs
1562
+ >;
1563
+ /**
1564
+ * @brief generates reals on an exponential distribution with arbitrary scale parameter.
1565
+ *
1566
+ * @tparam Lhs, Rhs
1567
+ * @tparam Urng
1568
+ * @param urng c++11-style random number generator
1569
+ * @param lambda a scale parameter of the distribution
1570
+ * @return a random matrix expression with the same shape as `lambda`
1571
+ *
1572
+ * @see Eigen::Rand::ExponentialGen
1573
+ */
1574
+ template<typename Lhs, typename Urng>
1575
+ inline const ExponentialVType<Lhs, Urng>
1576
+ exponential(Urng&& urng, const ArrayBase<Lhs>& a)
1577
+ {
1578
+ return ExponentialVType<Lhs, Urng> {
1579
+ static_cast<const Lhs&>(a),
1580
+ { std::forward<Urng>(urng), ExponentialVGen<typename Lhs::Scalar>{} }
1581
+ };
1582
+ }
1583
+
1139
1584
  template<typename Derived, typename Urng>
1140
1585
  using GammaType = CwiseNullaryOp<internal::scalar_rng_adaptor<GammaGen<typename Derived::Scalar>, typename Derived::Scalar, Urng, true>, const Derived>;
1141
1586
 
@@ -1232,6 +1677,69 @@ namespace Eigen
1232
1677
  };
1233
1678
  }
1234
1679
 
1680
+ template<typename Lhs, typename Rhs, typename Urng>
1681
+ using WeibullVVType = CwiseBinaryOp<
1682
+ internal::scalar_binary_rng_adaptor<WeibullVGen<typename Lhs::Scalar>, typename Lhs::Scalar, typename Lhs::Scalar, typename Rhs::Scalar, Urng, true>,
1683
+ const Lhs, const Rhs
1684
+ >;
1685
+
1686
+ /**
1687
+ * @brief generates reals on a Weibull distribution with arbitrary shape and scale parameter.
1688
+ *
1689
+ * @tparam Lhs, Rhs
1690
+ * @tparam Urng
1691
+ * @param urng c++11-style random number generator
1692
+ * @param a a shape parameter of the distribution
1693
+ * @param b a scale parameter of the distribution
1694
+ * @return a random matrix expression with the same shape as `a` and `b`
1695
+ * @note `a` and `b` should have the same shape and scalar type.
1696
+ *
1697
+ * @see Eigen::Rand::WeibullGen
1698
+ */
1699
+ template<typename Lhs, typename Rhs, typename Urng>
1700
+ inline const WeibullVVType<Lhs, Rhs, Urng>
1701
+ weibull(Urng&& urng, const ArrayBase<Lhs>& a, const ArrayBase<Rhs>& b)
1702
+ {
1703
+ return {
1704
+ static_cast<const Lhs&>(a), static_cast<const Rhs&>(b),
1705
+ { std::forward<Urng>(urng), WeibullVGen<typename Lhs::Scalar>{} }
1706
+ };
1707
+ }
1708
+
1709
+ template<typename Derived, typename Urng>
1710
+ using WeibullVSType = CwiseBinaryOp<
1711
+ internal::scalar_binary_rng_adaptor<WeibullVGen<typename Derived::Scalar>, typename Derived::Scalar, typename Derived::Scalar, typename Derived::Scalar, Urng, true>,
1712
+ const Derived, CwiseNullaryOp<internal::scalar_constant_op<typename Derived::Scalar>, const Derived>
1713
+ >;
1714
+
1715
+ template<typename Lhs, typename Urng>
1716
+ inline const WeibullVSType<Lhs, Urng>
1717
+ weibull(Urng&& urng, const ArrayBase<Lhs>& a, typename Lhs::Scalar b)
1718
+ {
1719
+ return {
1720
+ static_cast<const Lhs&>(a),
1721
+ { a.rows(), a.cols(), internal::scalar_constant_op<typename Lhs::Scalar>{ b } },
1722
+ { std::forward<Urng>(urng), WeibullVGen<typename Lhs::Scalar>{} }
1723
+ };
1724
+ }
1725
+
1726
+ template<typename Derived, typename Urng>
1727
+ using WeibullSVType = CwiseBinaryOp<
1728
+ internal::scalar_binary_rng_adaptor<WeibullVGen<typename Derived::Scalar>, typename Derived::Scalar, typename Derived::Scalar, typename Derived::Scalar, Urng, true>,
1729
+ CwiseNullaryOp<internal::scalar_constant_op<typename Derived::Scalar>, const Derived>, const Derived
1730
+ >;
1731
+
1732
+ template<typename Rhs, typename Urng>
1733
+ inline const WeibullSVType<Rhs, Urng>
1734
+ weibull(Urng&& urng, typename Rhs::Scalar a, const ArrayBase<Rhs>& b)
1735
+ {
1736
+ return {
1737
+ { b.rows(), b.cols(), internal::scalar_constant_op<typename Rhs::Scalar>{ a } },
1738
+ static_cast<const Rhs&>(b),
1739
+ { std::forward<Urng>(urng), WeibullVGen<typename Rhs::Scalar>{} }
1740
+ };
1741
+ }
1742
+
1235
1743
  template<typename Derived, typename Urng>
1236
1744
  using ExtremeValueType = CwiseNullaryOp<internal::scalar_rng_adaptor<ExtremeValueGen<typename Derived::Scalar>, typename Derived::Scalar, Urng, true>, const Derived>;
1237
1745
 
@@ -1282,6 +1790,70 @@ namespace Eigen
1282
1790
  };
1283
1791
  }
1284
1792
 
1793
+ template<typename Lhs, typename Rhs, typename Urng>
1794
+ using ExtremeValueVVType = CwiseBinaryOp<
1795
+ internal::scalar_binary_rng_adaptor<ExtremeValueVGen<typename Lhs::Scalar>, typename Lhs::Scalar, typename Lhs::Scalar, typename Rhs::Scalar, Urng, true>,
1796
+ const Lhs, const Rhs
1797
+ >;
1798
+
1799
+ /**
1800
+ * @brief generates reals on an extreme value distribution
1801
+ * (a.k.a Gumbel Type I, log-Weibull, Fisher-Tippett Type I) with arbitrary shape and scale parameter.
1802
+ *
1803
+ * @tparam Lhs, Rhs
1804
+ * @tparam Urng
1805
+ * @param urng c++11-style random number generator
1806
+ * @param a a location parameter of the distribution
1807
+ * @param b a scale parameter of the distribution
1808
+ * @return a random matrix expression with the same shape as `a` and `b`
1809
+ * @note `a` and `b` should have the same shape and scalar type.
1810
+ *
1811
+ * @see Eigen::Rand::WeibullGen
1812
+ */
1813
+ template<typename Lhs, typename Rhs, typename Urng>
1814
+ inline const ExtremeValueVVType<Lhs, Rhs, Urng>
1815
+ extremeValue(Urng&& urng, const ArrayBase<Lhs>& a, const ArrayBase<Rhs>& b)
1816
+ {
1817
+ return {
1818
+ static_cast<const Lhs&>(a), static_cast<const Rhs&>(b),
1819
+ { std::forward<Urng>(urng), ExtremeValueVGen<typename Lhs::Scalar>{} }
1820
+ };
1821
+ }
1822
+
1823
+ template<typename Derived, typename Urng>
1824
+ using ExtremeValueVSType = CwiseBinaryOp<
1825
+ internal::scalar_binary_rng_adaptor<ExtremeValueVGen<typename Derived::Scalar>, typename Derived::Scalar, typename Derived::Scalar, typename Derived::Scalar, Urng, true>,
1826
+ const Derived, CwiseNullaryOp<internal::scalar_constant_op<typename Derived::Scalar>, const Derived>
1827
+ >;
1828
+
1829
+ template<typename Lhs, typename Urng>
1830
+ inline const ExtremeValueVSType<Lhs, Urng>
1831
+ extremeValue(Urng&& urng, const ArrayBase<Lhs>& a, typename Lhs::Scalar b)
1832
+ {
1833
+ return {
1834
+ static_cast<const Lhs&>(a),
1835
+ { a.rows(), a.cols(), internal::scalar_constant_op<typename Lhs::Scalar>{ b } },
1836
+ { std::forward<Urng>(urng), ExtremeValueVGen<typename Lhs::Scalar>{} }
1837
+ };
1838
+ }
1839
+
1840
+ template<typename Derived, typename Urng>
1841
+ using ExtremeValueSVType = CwiseBinaryOp<
1842
+ internal::scalar_binary_rng_adaptor<ExtremeValueVGen<typename Derived::Scalar>, typename Derived::Scalar, typename Derived::Scalar, typename Derived::Scalar, Urng, true>,
1843
+ CwiseNullaryOp<internal::scalar_constant_op<typename Derived::Scalar>, const Derived>, const Derived
1844
+ >;
1845
+
1846
+ template<typename Rhs, typename Urng>
1847
+ inline const ExtremeValueSVType<Rhs, Urng>
1848
+ extremeValue(Urng&& urng, typename Rhs::Scalar a, const ArrayBase<Rhs>& b)
1849
+ {
1850
+ return {
1851
+ { b.rows(), b.cols(), internal::scalar_constant_op<typename Rhs::Scalar>{ a } },
1852
+ static_cast<const Rhs&>(b),
1853
+ { std::forward<Urng>(urng), ExtremeValueVGen<typename Rhs::Scalar>{} }
1854
+ };
1855
+ }
1856
+
1285
1857
  template<typename Derived, typename Urng>
1286
1858
  using ChiSquaredType = CwiseNullaryOp<internal::scalar_rng_adaptor<ChiSquaredGen<typename Derived::Scalar>, typename Derived::Scalar, Urng, true>, const Derived>;
1287
1859
 
@@ -2,10 +2,10 @@
2
2
  * @file EigenRand
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.4.1
6
- * @date 2022-08-13
7
- *
8
- * @copyright Copyright (c) 2020-2021
5
+ * @version 0.5.1
6
+ * @date 2024-09-08
7
+ *
8
+ * @copyright Copyright (c) 2020-2024
9
9
  *
10
10
  */
11
11