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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/LICENSE.txt +1 -1
- data/ext/tomoto/ct.cpp +1 -1
- data/ext/tomoto/dmr.cpp +1 -1
- data/ext/tomoto/dt.cpp +1 -1
- data/ext/tomoto/extconf.rb +4 -8
- data/ext/tomoto/gdmr.cpp +1 -1
- data/ext/tomoto/hdp.cpp +1 -1
- data/ext/tomoto/hlda.cpp +1 -1
- data/ext/tomoto/hpa.cpp +1 -1
- data/ext/tomoto/lda.cpp +29 -3
- data/ext/tomoto/llda.cpp +1 -1
- data/ext/tomoto/mglda.cpp +1 -1
- data/ext/tomoto/pa.cpp +1 -1
- data/ext/tomoto/plda.cpp +1 -1
- data/ext/tomoto/slda.cpp +1 -1
- data/lib/tomoto/lda.rb +1 -0
- data/lib/tomoto/version.rb +1 -1
- data/vendor/EigenRand/EigenRand/Core.h +6 -4
- data/vendor/EigenRand/EigenRand/CwiseHeteroBinaryOp.h +265 -0
- data/vendor/EigenRand/EigenRand/Dists/Basic.h +345 -12
- data/vendor/EigenRand/EigenRand/Dists/Discrete.h +381 -7
- data/vendor/EigenRand/EigenRand/Dists/GammaPoisson.h +4 -4
- data/vendor/EigenRand/EigenRand/Dists/NormalExp.h +576 -4
- data/vendor/EigenRand/EigenRand/EigenRand +4 -4
- data/vendor/EigenRand/EigenRand/Macro.h +3 -3
- data/vendor/EigenRand/EigenRand/MorePacketMath.h +31 -30
- data/vendor/EigenRand/EigenRand/MvDists/Multinomial.h +41 -29
- data/vendor/EigenRand/EigenRand/MvDists/MvNormal.h +19 -7
- data/vendor/EigenRand/EigenRand/PacketFilter.h +8 -5
- data/vendor/EigenRand/EigenRand/PacketRandomEngine.h +3 -3
- data/vendor/EigenRand/EigenRand/RandUtils.h +180 -5
- data/vendor/EigenRand/EigenRand/arch/AVX/MorePacketMath.h +42 -3
- data/vendor/EigenRand/EigenRand/arch/AVX/PacketFilter.h +3 -3
- data/vendor/EigenRand/EigenRand/arch/AVX/RandUtils.h +3 -3
- data/vendor/EigenRand/EigenRand/arch/AVX512/MorePacketMath.h +312 -0
- data/vendor/EigenRand/EigenRand/arch/AVX512/PacketFilter.h +79 -0
- data/vendor/EigenRand/EigenRand/arch/AVX512/RandUtils.h +147 -0
- data/vendor/EigenRand/EigenRand/arch/NEON/MorePacketMath.h +118 -3
- data/vendor/EigenRand/EigenRand/arch/NEON/PacketFilter.h +3 -3
- data/vendor/EigenRand/EigenRand/arch/NEON/RandUtils.h +21 -3
- data/vendor/EigenRand/EigenRand/arch/SSE/MorePacketMath.h +32 -4
- data/vendor/EigenRand/EigenRand/arch/SSE/PacketFilter.h +3 -3
- data/vendor/EigenRand/EigenRand/arch/SSE/RandUtils.h +3 -3
- data/vendor/EigenRand/EigenRand/doc.h +108 -157
- data/vendor/EigenRand/README.md +60 -272
- data/vendor/tomotopy/README.kr.rst +27 -5
- data/vendor/tomotopy/README.rst +27 -5
- data/vendor/tomotopy/README_pypi.rst +583 -0
- data/vendor/tomotopy/licenses_bundled/EigenRand +21 -0
- data/vendor/tomotopy/src/TopicModel/CT.h +1 -1
- data/vendor/tomotopy/src/TopicModel/CTModel.cpp +1 -1
- data/vendor/tomotopy/src/TopicModel/DMR.h +1 -1
- data/vendor/tomotopy/src/TopicModel/DMRModel.cpp +1 -1
- data/vendor/tomotopy/src/TopicModel/DT.h +1 -1
- data/vendor/tomotopy/src/TopicModel/DTModel.cpp +1 -1
- data/vendor/tomotopy/src/TopicModel/GDMR.h +1 -1
- data/vendor/tomotopy/src/TopicModel/GDMRModel.cpp +1 -1
- data/vendor/tomotopy/src/TopicModel/HDP.h +1 -1
- data/vendor/tomotopy/src/TopicModel/HDPModel.cpp +1 -1
- data/vendor/tomotopy/src/TopicModel/HLDA.h +1 -1
- data/vendor/tomotopy/src/TopicModel/HLDAModel.cpp +1 -1
- data/vendor/tomotopy/src/TopicModel/HPA.h +1 -1
- data/vendor/tomotopy/src/TopicModel/HPAModel.cpp +1 -1
- data/vendor/tomotopy/src/TopicModel/LDA.h +1 -1
- data/vendor/tomotopy/src/TopicModel/LDAModel.cpp +1 -1
- data/vendor/tomotopy/src/TopicModel/LDAModel.hpp +6 -6
- data/vendor/tomotopy/src/TopicModel/LLDA.h +1 -1
- data/vendor/tomotopy/src/TopicModel/LLDAModel.cpp +1 -1
- data/vendor/tomotopy/src/TopicModel/MGLDA.h +1 -1
- data/vendor/tomotopy/src/TopicModel/MGLDAModel.cpp +1 -1
- data/vendor/tomotopy/src/TopicModel/PA.h +1 -1
- data/vendor/tomotopy/src/TopicModel/PAModel.cpp +1 -1
- data/vendor/tomotopy/src/TopicModel/PLDA.h +1 -1
- data/vendor/tomotopy/src/TopicModel/PLDAModel.cpp +1 -1
- data/vendor/tomotopy/src/TopicModel/PT.h +1 -1
- data/vendor/tomotopy/src/TopicModel/PTModel.cpp +1 -1
- data/vendor/tomotopy/src/TopicModel/SLDA.h +1 -1
- data/vendor/tomotopy/src/TopicModel/SLDAModel.cpp +1 -1
- data/vendor/tomotopy/src/TopicModel/TopicModel.hpp +6 -6
- data/vendor/tomotopy/src/Utils/EigenAddonOps.hpp +41 -0
- data/vendor/tomotopy/src/Utils/ThreadPool.hpp +6 -6
- data/vendor/tomotopy/src/Utils/Utils.hpp +3 -3
- data/vendor/tomotopy/src/Utils/avx512_gamma.h +46 -0
- data/vendor/tomotopy/src/Utils/avx512_mathfun.h +99 -0
- metadata +10 -9
- data/vendor/variant/LICENSE +0 -25
- data/vendor/variant/LICENSE_1_0.txt +0 -23
- data/vendor/variant/README.md +0 -102
- data/vendor/variant/include/mapbox/optional.hpp +0 -74
- data/vendor/variant/include/mapbox/recursive_wrapper.hpp +0 -122
- data/vendor/variant/include/mapbox/variant.hpp +0 -974
- 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.
|
|
6
|
-
* @date
|
|
5
|
+
* @version 0.5.1
|
|
6
|
+
* @date 2024-09-08
|
|
7
7
|
*
|
|
8
|
-
* @copyright Copyright (c) 2020-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
6
|
-
* @date
|
|
5
|
+
* @version 0.5.1
|
|
6
|
+
* @date 2024-09-08
|
|
7
7
|
*
|
|
8
|
-
* @copyright Copyright (c) 2020-
|
|
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
|
-
|
|
32
|
+
StdUniformRealGen<float> ur;
|
|
33
33
|
GammaGen<float> gamma;
|
|
34
34
|
public:
|
|
35
35
|
using Scalar = _Scalar;
|