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 Discrete.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.4.1
6
- * @date 2022-08-13
5
+ * @version 0.5.1
6
+ * @date 2024-09-08
7
7
  *
8
- * @copyright Copyright (c) 2020-2021
8
+ * @copyright Copyright (c) 2020-2024
9
9
  *
10
10
  */
11
11
 
@@ -476,7 +476,7 @@ namespace Eigen
476
476
  class DiscreteGen<_Scalar, float> : public GenBase<DiscreteGen<_Scalar, float>, _Scalar>
477
477
  {
478
478
  static_assert(std::is_same<_Scalar, int32_t>::value, "discreteDist needs integral types.");
479
- UniformRealGen<float> ur;
479
+ StdUniformRealGen<float> ur;
480
480
  std::vector<float> cdf;
481
481
  AliasMethod<float, _Scalar> alias_table;
482
482
 
@@ -593,7 +593,7 @@ namespace Eigen
593
593
  class DiscreteGen<_Scalar, double> : public GenBase<DiscreteGen<_Scalar, double>, _Scalar>
594
594
  {
595
595
  static_assert(std::is_same<_Scalar, int32_t>::value, "discreteDist needs integral types.");
596
- UniformRealGen<double> ur;
596
+ StdUniformRealGen<double> ur;
597
597
  std::vector<double> cdf;
598
598
  AliasMethod<double, _Scalar> alias_table;
599
599
 
@@ -736,7 +736,7 @@ namespace Eigen
736
736
  friend BinomialGen<_Scalar>;
737
737
  static_assert(std::is_same<_Scalar, int32_t>::value, "poisson needs integral types.");
738
738
  int cache_rest_cnt = 0;
739
- UniformRealGen<float> ur;
739
+ StdUniformRealGen<float> ur;
740
740
 
741
741
  protected:
742
742
  double mean, ne_mean, sqrt_tmean, log_mean, g1;
@@ -997,6 +997,284 @@ namespace Eigen
997
997
  }
998
998
  };
999
999
 
1000
+ template<typename _Scalar>
1001
+ class BinomialVGen
1002
+ {
1003
+ static_assert(std::is_same<_Scalar, int32_t>::value, "binomial needs integral types.");
1004
+ };
1005
+
1006
+ template<>
1007
+ class BinomialVGen<int32_t> : public BinaryGenBase<BinomialVGen<int32_t>, int32_t, int32_t, float>
1008
+ {
1009
+ StdUniformRealGen<float> ur;
1010
+
1011
+ public:
1012
+ using Scalar = int32_t;
1013
+
1014
+ template<typename Rng>
1015
+ EIGEN_STRONG_INLINE const Scalar operator() (Rng&& rng, Scalar trials, float p)
1016
+ {
1017
+ using namespace Eigen::internal;
1018
+
1019
+ float small_p = std::min(p, 1 - p);
1020
+ float mean = trials * small_p;
1021
+ float g1 = std::lgamma(trials + 1);
1022
+ float sqrt_v = std::sqrt(2 * mean * (1 - small_p));
1023
+ float log_small_p = std::log(small_p);
1024
+ float log_small_q = std::log(1 - small_p);
1025
+
1026
+ Scalar res = 0;
1027
+ if (trials < 25)
1028
+ {
1029
+ res = 0;
1030
+ for (int i = 0; i < trials; ++i)
1031
+ {
1032
+ if (ur(rng) < p) ++res;
1033
+ }
1034
+ return res;
1035
+ }
1036
+ else if (mean < 1.)
1037
+ {
1038
+ float ne_mean = std::exp(-mean);
1039
+ float val = 1;
1040
+ for (; ; ++res)
1041
+ {
1042
+ val *= ur(rng);
1043
+ if (val <= ne_mean) break;
1044
+ }
1045
+ }
1046
+ else
1047
+ {
1048
+ for (int _i = 0; ; ++_i)
1049
+ {
1050
+ EIGENRAND_CHECK_INFINITY_LOOP();
1051
+ double ys;
1052
+ ys = std::tan(constant::pi * ur(rng));
1053
+ res = (Scalar)(sqrt_v * ys + mean);
1054
+ if (0 <= res && res <= trials && ur(rng) <= 1.2 * sqrt_v
1055
+ * (1.0 + ys * ys)
1056
+ * std::exp(g1 - std::lgamma(res + 1)
1057
+ - std::lgamma(trials - res + 1.0)
1058
+ + res * log_small_p
1059
+ + (trials - res) * log_small_q)
1060
+ )
1061
+ {
1062
+ break;
1063
+ }
1064
+ }
1065
+ }
1066
+ return p == small_p ? res : trials - res;
1067
+ }
1068
+
1069
+ template<typename Packet, typename FPacket, typename Rng>
1070
+ EIGEN_STRONG_INLINE const Packet packetOp(Rng&& rng, const Packet& trials, const FPacket& p)
1071
+ {
1072
+ using namespace Eigen::internal;
1073
+ Packet valid = pset1<Packet>(0);
1074
+ FPacket valid_res;
1075
+
1076
+ const auto psmall_p = pmin(p, psub(pset1<FPacket>(1), p));
1077
+ const auto ptrials = pcast<Packet, FPacket>(trials);
1078
+ const auto pmean = pmul(ptrials, psmall_p);
1079
+ const auto pg1 = plgamma_approx(padd(ptrials, pset1<FPacket>(1)));
1080
+ const auto psqrt_v = psqrt(pmul(pmul(pset1<FPacket>(2), pmean), psub(pset1<FPacket>(1), psmall_p)));
1081
+ const auto plog_small_p = plog(psmall_p);
1082
+ const auto plog_small_q = plog(psub(pset1<FPacket>(1), psmall_p));
1083
+ const auto ppi = pset1<FPacket>(constant::pi);
1084
+ valid = reinterpret_to_int(pcmplt(pmean, pset1<FPacket>(1)));
1085
+ if (predux_any(valid))
1086
+ {
1087
+ Packet res = pset1<Packet>(0);
1088
+ FPacket val = pset1<FPacket>(1), pne_mean = pexp(pnegate(pmean));
1089
+ for (int _i = 0; ; ++_i)
1090
+ {
1091
+ EIGENRAND_CHECK_INFINITY_LOOP();
1092
+ val = pmul(val, ur.template packetOp<FPacket>(rng));
1093
+ auto c = pand(reinterpret_to_int(pcmplt(pne_mean, val)), valid);
1094
+ if (!predux_any(c)) break;
1095
+ res = padd(res, pnegate(c));
1096
+ }
1097
+ valid_res = pcast<Packet, FPacket>(res);
1098
+ }
1099
+
1100
+ if (!predux_all(valid))
1101
+ {
1102
+ for (int _i = 0; ; ++_i)
1103
+ {
1104
+ EIGENRAND_CHECK_INFINITY_LOOP();
1105
+ FPacket fres, ys, psin, pcos;
1106
+ psincos(pmul(ppi, ur.template packetOp<FPacket>(rng)), psin, pcos);
1107
+ ys = pdiv(psin, pcos);
1108
+ fres = ptruncate(padd(pmul(psqrt_v, ys), pmean));
1109
+
1110
+ auto p1 = pmul(pmul(pset1<FPacket>(1.2), psqrt_v), padd(pset1<FPacket>(1), pmul(ys, ys)));
1111
+ auto p2 = pexp(
1112
+ padd(padd(psub(
1113
+ psub(pg1, plgamma_approx(padd(fres, pset1<FPacket>(1)))),
1114
+ plgamma_approx(psub(padd(ptrials, pset1<FPacket>(1)), fres))
1115
+ ), pmul(fres, plog_small_p)), pmul(psub(ptrials, fres), plog_small_q))
1116
+ );
1117
+
1118
+ auto c1 = pand(pcmple(pset1<FPacket>(0), fres), pcmple(fres, ptrials));
1119
+ auto c2 = pcmple(ur.template packetOp<FPacket>(rng), pmul(p1, p2));
1120
+
1121
+ auto fvalid = pand(c1, c2);
1122
+ valid_res = pblendv(pnew_andnot(fvalid, reinterpret_to_float(valid)), fres, valid_res);
1123
+ valid = por(reinterpret_to_int(fvalid), valid);
1124
+
1125
+ if (predux_all(valid))
1126
+ {
1127
+ break;
1128
+ }
1129
+ }
1130
+ }
1131
+
1132
+ return pblendv(
1133
+ reinterpret_to_int(pcmpeq(p, psmall_p)),
1134
+ pcast<FPacket, Packet>(valid_res),
1135
+ psub(trials, pcast<FPacket, Packet>(valid_res))
1136
+ );
1137
+ }
1138
+ };
1139
+
1140
+ template<>
1141
+ class BinomialVGen<float> : public BinaryGenBase<BinomialVGen<float>, float, float, float>
1142
+ {
1143
+ StdUniformRealGen<float> ur;
1144
+
1145
+ public:
1146
+ using Scalar = float;
1147
+
1148
+ template<typename Rng>
1149
+ EIGEN_STRONG_INLINE const Scalar operator() (Rng&& rng, Scalar _trials, float p)
1150
+ {
1151
+ using namespace Eigen::internal;
1152
+
1153
+ auto trials = reinterpret_cast<int32_t&>(_trials);
1154
+
1155
+ float small_p = std::min(p, 1 - p);
1156
+ float mean = trials * small_p;
1157
+ float g1 = std::lgamma(trials + 1);
1158
+ float sqrt_v = std::sqrt(2 * mean * (1 - small_p));
1159
+ float log_small_p = std::log(small_p);
1160
+ float log_small_q = std::log(1 - small_p);
1161
+
1162
+ int32_t res = 0;
1163
+ if (trials < 25)
1164
+ {
1165
+ res = 0;
1166
+ for (int i = 0; i < trials; ++i)
1167
+ {
1168
+ if (ur(rng) < p) ++res;
1169
+ }
1170
+ return res;
1171
+ }
1172
+ else if (mean < 1.)
1173
+ {
1174
+ float ne_mean = std::exp(-mean);
1175
+ float val = 1;
1176
+ for (; ; ++res)
1177
+ {
1178
+ val *= ur(rng);
1179
+ if (val <= ne_mean) break;
1180
+ }
1181
+ }
1182
+ else
1183
+ {
1184
+ for (int _i = 0; ; ++_i)
1185
+ {
1186
+ EIGENRAND_CHECK_INFINITY_LOOP();
1187
+ double ys;
1188
+ ys = std::tan(constant::pi * ur(rng));
1189
+ res = (int32_t)(sqrt_v * ys + mean);
1190
+ if (0 <= res && res <= trials && ur(rng) <= 1.2 * sqrt_v
1191
+ * (1.0 + ys * ys)
1192
+ * std::exp(g1 - std::lgamma(res + 1)
1193
+ - std::lgamma(trials - res + 1.0)
1194
+ + res * log_small_p
1195
+ + (trials - res) * log_small_q)
1196
+ )
1197
+ {
1198
+ break;
1199
+ }
1200
+ }
1201
+ }
1202
+ res = p == small_p ? res : trials - res;
1203
+ return reinterpret_cast<Scalar&>(res);
1204
+ }
1205
+
1206
+ template<typename Packet, typename Rng>
1207
+ EIGEN_STRONG_INLINE const Packet packetOp(Rng&& rng, const Packet& _trials, const Packet& p)
1208
+ {
1209
+ using namespace Eigen::internal;
1210
+ using IPacket = decltype(reinterpret_to_int(std::declval<Packet>()));
1211
+ IPacket valid = pset1<IPacket>(0);
1212
+ Packet valid_res;
1213
+
1214
+ const auto trials = reinterpret_to_int(_trials);
1215
+ const auto psmall_p = pmin(p, psub(pset1<Packet>(1), p));
1216
+ const auto ptrials = pcast<IPacket, Packet>(trials);
1217
+ const auto pmean = pmul(ptrials, psmall_p);
1218
+ const auto pg1 = plgamma_approx(padd(ptrials, pset1<Packet>(1)));
1219
+ const auto psqrt_v = psqrt(pmul(pmul(pset1<Packet>(2), pmean), psub(pset1<Packet>(1), psmall_p)));
1220
+ const auto plog_small_p = plog(psmall_p);
1221
+ const auto plog_small_q = plog(psub(pset1<Packet>(1), psmall_p));
1222
+ const auto ppi = pset1<Packet>(constant::pi);
1223
+ valid = reinterpret_to_int(pcmplt(pmean, pset1<Packet>(1)));
1224
+ if (predux_any(reinterpret_to_float(valid)))
1225
+ {
1226
+ Packet res = pset1<Packet>(0);
1227
+ Packet val = pset1<Packet>(1), pne_mean = pexp(pnegate(pmean));
1228
+ for (int _i = 0; ; ++_i)
1229
+ {
1230
+ EIGENRAND_CHECK_INFINITY_LOOP();
1231
+ val = pmul(val, ur.template packetOp<Packet>(rng));
1232
+ auto c = pand(reinterpret_to_int(pcmplt(pne_mean, val)), valid);
1233
+ if (!predux_any(reinterpret_to_float(c))) break;
1234
+ res = padd(res, pcast<IPacket, Packet>(pnegate(c)));
1235
+ }
1236
+ valid_res = res;
1237
+ }
1238
+
1239
+ if (!predux_all(reinterpret_to_float(valid)))
1240
+ {
1241
+ for (int _i = 0; ; ++_i)
1242
+ {
1243
+ EIGENRAND_CHECK_INFINITY_LOOP();
1244
+ Packet fres, ys, psin, pcos;
1245
+ psincos(pmul(ppi, ur.template packetOp<Packet>(rng)), psin, pcos);
1246
+ ys = pdiv(psin, pcos);
1247
+ fres = ptruncate(padd(pmul(psqrt_v, ys), pmean));
1248
+
1249
+ auto p1 = pmul(pmul(pset1<Packet>(1.2), psqrt_v), padd(pset1<Packet>(1), pmul(ys, ys)));
1250
+ auto p2 = pexp(
1251
+ padd(padd(psub(
1252
+ psub(pg1, plgamma_approx(padd(fres, pset1<Packet>(1)))),
1253
+ plgamma_approx(psub(padd(ptrials, pset1<Packet>(1)), fres))
1254
+ ), pmul(fres, plog_small_p)), pmul(psub(ptrials, fres), plog_small_q))
1255
+ );
1256
+
1257
+ auto c1 = pand(pcmple(pset1<Packet>(0), fres), pcmple(fres, ptrials));
1258
+ auto c2 = pcmple(ur.template packetOp<Packet>(rng), pmul(p1, p2));
1259
+
1260
+ auto fvalid = pand(c1, c2);
1261
+ valid_res = pblendv(pnew_andnot(fvalid, reinterpret_to_float(valid)), fres, valid_res);
1262
+ valid = por(reinterpret_to_int(fvalid), valid);
1263
+
1264
+ if (predux_all(reinterpret_to_float(valid)))
1265
+ {
1266
+ break;
1267
+ }
1268
+ }
1269
+ }
1270
+ return pblendv(
1271
+ pcmpeq(p, psmall_p),
1272
+ reinterpret_to_float(pcast<Packet, IPacket>(valid_res)),
1273
+ reinterpret_to_float(psub(trials, pcast<Packet, IPacket>(valid_res)))
1274
+ );
1275
+ }
1276
+ };
1277
+
1000
1278
  /**
1001
1279
  * @brief Generator of integers on a geometric distribution
1002
1280
  *
@@ -1006,7 +1284,7 @@ namespace Eigen
1006
1284
  class GeometricGen : public GenBase<GeometricGen<_Scalar>, _Scalar>
1007
1285
  {
1008
1286
  static_assert(std::is_same<_Scalar, int32_t>::value, "geomtric needs integral types.");
1009
- UniformRealGen<float> ur;
1287
+ StdUniformRealGen<float> ur;
1010
1288
  double p, rlog_q;
1011
1289
 
1012
1290
  public:
@@ -1467,6 +1745,102 @@ namespace Eigen
1467
1745
  };
1468
1746
  }
1469
1747
 
1748
+
1749
+ template<typename Lhs, typename Rhs, typename Urng>
1750
+ using BinomialVVType = CwiseHeteroBinaryOp<
1751
+ internal::scalar_binary_rng_adaptor<BinomialVGen<typename Lhs::Scalar>, typename Lhs::Scalar, typename Lhs::Scalar, typename Rhs::Scalar, Urng, true>,
1752
+ const Lhs, const Rhs
1753
+ >;
1754
+
1755
+ /**
1756
+ * @brief generates reals on the binomial distribution.
1757
+ *
1758
+ * @tparam Lhs, Rhs
1759
+ * @tparam Urng
1760
+ * @param urng c++11-style random number generator
1761
+ * @param trials the number of trials
1762
+ * @param p probability of a trial generating true
1763
+ * @return a random matrix expression with the shape as `trials` and `p`
1764
+ * @note `trials` and `p` should have the same shape.
1765
+ *
1766
+ * @see Eigen::Rand::BinomialGen
1767
+ */
1768
+ template<typename Lhs, typename Rhs, typename Urng>
1769
+ inline const BinomialVVType<Lhs, Rhs, Urng>
1770
+ binomial(Urng&& urng, const ArrayBase<Lhs>& trials, const ArrayBase<Rhs>& p)
1771
+ {
1772
+ return {
1773
+ static_cast<const Lhs&>(trials), static_cast<const Rhs&>(p),
1774
+ { std::forward<Urng>(urng), BinomialVGen<typename Lhs::Scalar>{} }
1775
+ };
1776
+ }
1777
+
1778
+ namespace impl{
1779
+ template<class Derived, class NewType> struct CastType
1780
+ {
1781
+ using type = typename internal::eval<
1782
+ typename std::remove_reference<
1783
+ typename internal::cast_return_type<Derived, const CwiseUnaryOp<internal::scalar_cast_op<typename Derived::Scalar, NewType>, const Derived> >::type
1784
+ >::type
1785
+ >::type;
1786
+ };
1787
+ }
1788
+
1789
+ template<typename Lhs, typename Urng>
1790
+ using BinomialVSType = CwiseHeteroBinaryOp<
1791
+ internal::scalar_binary_rng_adaptor<BinomialVGen<typename Lhs::Scalar>, typename Lhs::Scalar, typename Lhs::Scalar, float, Urng, true>,
1792
+ const Lhs, CwiseNullaryOp<internal::scalar_constant_op<float>, const typename impl::CastType<Lhs, float>::type>
1793
+ >;
1794
+
1795
+ template<typename Lhs, typename Urng>
1796
+ inline const BinomialVSType<Lhs, Urng>
1797
+ binomial(Urng&& urng, const ArrayBase<Lhs>& trials, float p)
1798
+ {
1799
+ return {
1800
+ static_cast<const Lhs&>(trials),
1801
+ { trials.rows(), trials.cols(), internal::scalar_constant_op<float>{p} },
1802
+ { std::forward<Urng>(urng), BinomialVGen<typename Lhs::Scalar>{} }
1803
+ };
1804
+ }
1805
+
1806
+ namespace impl
1807
+ {
1808
+ template<typename Lhs, typename Urng>
1809
+ using BinomialVType = CwiseBinaryOp<
1810
+ internal::scalar_binary_rng_adaptor<BinomialVGen<typename Lhs::Scalar>, typename Lhs::Scalar, typename Lhs::Scalar, typename Lhs::Scalar, Urng, true>,
1811
+ const Lhs, CwiseNullaryOp<internal::scalar_constant_op<float>, const Lhs>
1812
+ >;
1813
+
1814
+ template<typename Lhs, typename Urng>
1815
+ inline const BinomialVType<Lhs, Urng>
1816
+ binomial(Urng&& urng, const ArrayBase<Lhs>& trials, float p)
1817
+ {
1818
+ static_assert(std::is_same<typename Lhs::Scalar, float>::value, "Lhs must have float scalar type.");
1819
+ return {
1820
+ static_cast<const Lhs&>(trials),
1821
+ { trials.rows(), trials.cols(), internal::scalar_constant_op<float>{p} },
1822
+ { std::forward<Urng>(urng), BinomialVGen<typename Lhs::Scalar>{} }
1823
+ };
1824
+ }
1825
+ }
1826
+
1827
+ template<typename Rhs, typename Urng>
1828
+ using BinomialSVType = CwiseHeteroBinaryOp<
1829
+ internal::scalar_binary_rng_adaptor<BinomialVGen<int32_t>, int32_t, int32_t, typename Rhs::Scalar, Urng, true>,
1830
+ CwiseNullaryOp<internal::scalar_constant_op<int32_t>, const typename impl::CastType<Rhs, int32_t>::type>, const Rhs
1831
+ >;
1832
+
1833
+ template<typename Rhs, typename Urng>
1834
+ inline const BinomialSVType<Rhs, Urng>
1835
+ binomial(Urng&& urng, int32_t trials, const ArrayBase<Rhs>& p)
1836
+ {
1837
+ return {
1838
+ { p.rows(), p.cols(), internal::scalar_constant_op<int32_t>{trials} },
1839
+ static_cast<const Rhs&>(p),
1840
+ { std::forward<Urng>(urng), BinomialVGen<int32_t>{} }
1841
+ };
1842
+ }
1843
+
1470
1844
  template<typename Derived, typename Urng>
1471
1845
  using GeometricType = CwiseNullaryOp<internal::scalar_rng_adaptor<GeometricGen<typename Derived::Scalar>, typename Derived::Scalar, Urng, true>, const Derived>;
1472
1846
 
@@ -2,10 +2,10 @@
2
2
  * @file GammaPoisson.h
3
3
  * @author bab2min (bab2min@gmail.com)
4
4
  * @brief
5
- * @version 0.4.1
6
- * @date 2022-08-13
5
+ * @version 0.5.1
6
+ * @date 2024-09-08
7
7
  *
8
- * @copyright Copyright (c) 2020-2021
8
+ * @copyright Copyright (c) 2020-2024
9
9
  *
10
10
  */
11
11
 
@@ -29,7 +29,7 @@ namespace Eigen
29
29
  class NegativeBinomialGen : public GenBase<NegativeBinomialGen<_Scalar>, _Scalar>
30
30
  {
31
31
  static_assert(std::is_same<_Scalar, int32_t>::value, "negativeBinomial needs integral types.");
32
- UniformRealGen<float> ur;
32
+ StdUniformRealGen<float> ur;
33
33
  GammaGen<float> gamma;
34
34
  public:
35
35
  using Scalar = _Scalar;