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,8 +2,8 @@
|
|
|
2
2
|
* @file Macro.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
8
|
* @copyright Copyright (c) 2020-2021
|
|
9
9
|
*
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
#define EIGENRAND_MACRO_H
|
|
14
14
|
|
|
15
15
|
#define EIGENRAND_WORLD_VERSION 0
|
|
16
|
-
#define EIGENRAND_MAJOR_VERSION
|
|
16
|
+
#define EIGENRAND_MAJOR_VERSION 5
|
|
17
17
|
#define EIGENRAND_MINOR_VERSION 1
|
|
18
18
|
|
|
19
19
|
#if EIGEN_VERSION_AT_LEAST(3,3,10)
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* @file MorePacketMath.h
|
|
3
3
|
* @author bab2min (bab2min@gmail.com)
|
|
4
4
|
* @brief
|
|
5
|
-
* @version 0.
|
|
6
|
-
* @date
|
|
7
|
-
*
|
|
8
|
-
* @copyright Copyright (c) 2020-
|
|
5
|
+
* @version 0.5.1
|
|
6
|
+
* @date 2024-09-08
|
|
7
|
+
*
|
|
8
|
+
* @copyright Copyright (c) 2020-2024
|
|
9
9
|
*
|
|
10
10
|
*/
|
|
11
11
|
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
#define EIGENRAND_MORE_PACKET_MATH_H
|
|
14
14
|
|
|
15
15
|
#include <Eigen/Dense>
|
|
16
|
+
#include <cstdint>
|
|
16
17
|
|
|
17
18
|
#define EIGENRAND_PRINT_PACKET(p) do { using _MTy = typename std::remove_const<typename std::remove_reference<decltype(p)>::type>::type; typename std::conditional<Eigen::internal::IsFloatPacket<_MTy>::value, float, typename std::conditional<Eigen::internal::IsDoublePacket<_MTy>::value, double, int>::type>::type f[4]; Eigen::internal::pstore(f, p); std::cout << #p " " << f[0] << " " << f[1] << " " << f[2] << " " << f[3] << std::endl; } while(0)
|
|
18
19
|
|
|
@@ -89,6 +90,12 @@ namespace Eigen
|
|
|
89
90
|
template<int b, typename Packet>
|
|
90
91
|
EIGEN_STRONG_INLINE Packet psrl64(const Packet& a);
|
|
91
92
|
|
|
93
|
+
template<typename Packet>
|
|
94
|
+
EIGEN_STRONG_INLINE bool predux_all(const Packet& a);
|
|
95
|
+
|
|
96
|
+
template<typename Packet>
|
|
97
|
+
EIGEN_STRONG_INLINE bool predux_any(const Packet& a);
|
|
98
|
+
|
|
92
99
|
/*template<typename Packet>
|
|
93
100
|
EIGEN_STRONG_INLINE Packet psll(const Packet& a, int b);
|
|
94
101
|
|
|
@@ -209,6 +216,16 @@ namespace Eigen
|
|
|
209
216
|
return psub(reinterpret_to_double(por(pand(x, lower), upper)), one);
|
|
210
217
|
}
|
|
211
218
|
|
|
219
|
+
template<typename Packet>
|
|
220
|
+
EIGEN_STRONG_INLINE Packet pnew_andnot(const Packet& a, const Packet& b)
|
|
221
|
+
{
|
|
222
|
+
#if defined(EIGEN_VECTORIZE_NEON) || defined(EIGENRAND_EIGEN_34_MODE)
|
|
223
|
+
return pandnot(a, b);
|
|
224
|
+
#else
|
|
225
|
+
return pandnot(b, a);
|
|
226
|
+
#endif
|
|
227
|
+
}
|
|
228
|
+
|
|
212
229
|
template<typename _Scalar>
|
|
213
230
|
struct BitScalar;
|
|
214
231
|
|
|
@@ -319,11 +336,7 @@ namespace Eigen
|
|
|
319
336
|
x = padd(x, xmm3);
|
|
320
337
|
|
|
321
338
|
emm4 = psub(emm4, pset1<IntPacket>(2));
|
|
322
|
-
|
|
323
|
-
emm4 = pandnot(pset1<IntPacket>(4), emm4);
|
|
324
|
-
#else
|
|
325
|
-
emm4 = pandnot(emm4, pset1<IntPacket>(4));
|
|
326
|
-
#endif
|
|
339
|
+
emm4 = pnew_andnot(pset1<IntPacket>(4), emm4);
|
|
327
340
|
emm4 = psll<29>(emm4);
|
|
328
341
|
Packet sign_bit_cos = reinterpret_to_float(emm4);
|
|
329
342
|
sign_bit_sin = pxor(sign_bit_sin, swap_sign_bit_sin);
|
|
@@ -357,11 +370,7 @@ namespace Eigen
|
|
|
357
370
|
/* select the correct result from the two polynoms */
|
|
358
371
|
xmm3 = poly_mask;
|
|
359
372
|
Packet ysin2 = pand(xmm3, y2);
|
|
360
|
-
|
|
361
|
-
Packet ysin1 = pandnot(y, xmm3);
|
|
362
|
-
#else
|
|
363
|
-
Packet ysin1 = pandnot(xmm3, y);
|
|
364
|
-
#endif
|
|
373
|
+
Packet ysin1 = pnew_andnot(y, xmm3);
|
|
365
374
|
y2 = psub(y2, ysin2);
|
|
366
375
|
y = psub(y, ysin1);
|
|
367
376
|
|
|
@@ -425,11 +434,7 @@ namespace Eigen
|
|
|
425
434
|
x = padd(x, xmm3);
|
|
426
435
|
|
|
427
436
|
emm4 = psub64(emm4, pseti64<IntPacket>(2));
|
|
428
|
-
|
|
429
|
-
emm4 = pandnot(pseti64<IntPacket>(4), emm4);
|
|
430
|
-
#else
|
|
431
|
-
emm4 = pandnot(emm4, pseti64<IntPacket>(4));
|
|
432
|
-
#endif
|
|
437
|
+
emm4 = pnew_andnot(pseti64<IntPacket>(4), emm4);
|
|
433
438
|
emm4 = psll64<61>(emm4);
|
|
434
439
|
Packet sign_bit_cos = reinterpret_to_double(emm4);
|
|
435
440
|
sign_bit_sin = pxor(sign_bit_sin, swap_sign_bit_sin);
|
|
@@ -463,11 +468,7 @@ namespace Eigen
|
|
|
463
468
|
/* select the correct result from the two polynoms */
|
|
464
469
|
xmm3 = poly_mask;
|
|
465
470
|
Packet ysin2 = pand(xmm3, y2);
|
|
466
|
-
|
|
467
|
-
Packet ysin1 = pandnot(y, xmm3);
|
|
468
|
-
#else
|
|
469
|
-
Packet ysin1 = pandnot(xmm3, y);
|
|
470
|
-
#endif
|
|
471
|
+
Packet ysin1 = pnew_andnot(y, xmm3);
|
|
471
472
|
y2 = psub(y2, ysin2);
|
|
472
473
|
y = psub(y, ysin1);
|
|
473
474
|
|
|
@@ -559,11 +560,7 @@ namespace Eigen
|
|
|
559
560
|
/* select the correct result from the two polynoms */
|
|
560
561
|
xmm3 = poly_mask;
|
|
561
562
|
Packet ysin2 = pand(xmm3, y2);
|
|
562
|
-
|
|
563
|
-
Packet ysin1 = pandnot(y, xmm3);
|
|
564
|
-
#else
|
|
565
|
-
Packet ysin1 = pandnot(xmm3, y);
|
|
566
|
-
#endif
|
|
563
|
+
Packet ysin1 = pnew_andnot(y, xmm3);
|
|
567
564
|
|
|
568
565
|
xmm1 = padd(ysin1, ysin2);
|
|
569
566
|
|
|
@@ -573,6 +570,10 @@ namespace Eigen
|
|
|
573
570
|
}
|
|
574
571
|
}
|
|
575
572
|
|
|
573
|
+
#ifdef EIGEN_VECTORIZE_AVX512
|
|
574
|
+
#include "arch/AVX512/MorePacketMath.h"
|
|
575
|
+
#endif
|
|
576
|
+
|
|
576
577
|
#ifdef EIGEN_VECTORIZE_AVX
|
|
577
578
|
#include "arch/AVX/MorePacketMath.h"
|
|
578
579
|
#endif
|
|
@@ -615,4 +616,4 @@ namespace Eigen
|
|
|
615
616
|
}
|
|
616
617
|
}
|
|
617
618
|
|
|
618
|
-
#endif
|
|
619
|
+
#endif
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* @file Multinomial.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
|
|
|
@@ -28,7 +28,7 @@ namespace Eigen
|
|
|
28
28
|
static_assert(std::is_same<_Scalar, int32_t>::value, "`MultinomialGen` needs integral types.");
|
|
29
29
|
_Scalar trials;
|
|
30
30
|
Matrix<double, Dim, 1> probs;
|
|
31
|
-
DiscreteGen<_Scalar> discrete;
|
|
31
|
+
DiscreteGen<_Scalar, int32_t> discrete;
|
|
32
32
|
public:
|
|
33
33
|
/**
|
|
34
34
|
* @brief Construct a new multinomial generator
|
|
@@ -62,31 +62,33 @@ namespace Eigen
|
|
|
62
62
|
{
|
|
63
63
|
const Index dim = probs.size();
|
|
64
64
|
Matrix<_Scalar, Dim, -1> ret(dim, samples);
|
|
65
|
-
|
|
65
|
+
if (trials < std::max(30 * (dim - 1), (Index)100))
|
|
66
66
|
{
|
|
67
|
-
for (Index
|
|
67
|
+
for (Index s = 0; s < samples; ++s)
|
|
68
68
|
{
|
|
69
|
-
ret.col(
|
|
69
|
+
ret.col(s) = generate(urng);
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
|
-
|
|
72
|
+
else
|
|
73
73
|
{
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
Array<_Scalar, 1, -1> r_trials{ samples }, t{ samples };
|
|
75
|
+
Map<const Array<float, -1, 1>> fr_trials{ reinterpret_cast<float*>(r_trials.data()), samples };
|
|
76
|
+
Map<Array<float, -1, 1>> ft{ reinterpret_cast<float*>(t.data()), samples };
|
|
77
|
+
r_trials.setConstant(trials);
|
|
78
|
+
ft = impl::binomial(urng, fr_trials, probs[0]);
|
|
79
|
+
r_trials -= t;
|
|
80
|
+
ret.row(0) = t.matrix();
|
|
81
|
+
double rest_p = 1 - probs[0];
|
|
82
|
+
for (Index i = 1; i < dim - 1; ++i)
|
|
76
83
|
{
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
ret(i, j) = binomial<Matrix<_Scalar, 1, 1>>(1, 1, urng, t, probs[i] / rest_p)(0);
|
|
82
|
-
t -= ret(i, j);
|
|
83
|
-
rest_p -= probs[i];
|
|
84
|
-
}
|
|
85
|
-
ret(dim - 1, j) = 0;
|
|
84
|
+
ft = impl::binomial(urng, fr_trials, probs[i] / rest_p);
|
|
85
|
+
r_trials -= t;
|
|
86
|
+
ret.row(i) = t.matrix();
|
|
87
|
+
rest_p -= probs[i];
|
|
86
88
|
}
|
|
87
|
-
|
|
88
|
-
ret.row(dim - 1)
|
|
89
|
-
}
|
|
89
|
+
|
|
90
|
+
ret.row(dim - 1) = r_trials;
|
|
91
|
+
}
|
|
90
92
|
return ret;
|
|
91
93
|
}
|
|
92
94
|
|
|
@@ -95,13 +97,24 @@ namespace Eigen
|
|
|
95
97
|
{
|
|
96
98
|
const Index dim = probs.size();
|
|
97
99
|
Matrix<_Scalar, Dim, 1> ret(dim);
|
|
98
|
-
//if (trials <
|
|
100
|
+
//if (trials < std::max(30 * (dim - 1), (Index)100))
|
|
99
101
|
{
|
|
100
102
|
ret.setZero();
|
|
101
|
-
auto d = discrete.template generate<Matrix<_Scalar,
|
|
102
|
-
|
|
103
|
+
auto d = discrete.template generate<Matrix<_Scalar, 16, 1>>(16, 1, urng);
|
|
104
|
+
Matrix<_Scalar, 16, 1> buf;
|
|
105
|
+
Index i;
|
|
106
|
+
for (i = 0; i < (trials & ~15); i += 16)
|
|
107
|
+
{
|
|
108
|
+
buf = d;
|
|
109
|
+
for (Index j = 0; j < 16; ++j)
|
|
110
|
+
{
|
|
111
|
+
ret[buf[j]] += 1;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
buf.middleRows(0, trials - i) = d.middleRows(0, trials - i);
|
|
115
|
+
for (Index j = 0; j < trials - i; ++j)
|
|
103
116
|
{
|
|
104
|
-
ret[
|
|
117
|
+
ret[buf[j]] += 1;
|
|
105
118
|
}
|
|
106
119
|
}
|
|
107
120
|
/*else
|
|
@@ -110,12 +123,11 @@ namespace Eigen
|
|
|
110
123
|
_Scalar t = trials;
|
|
111
124
|
for (Index i = 0; i < dim - 1; ++i)
|
|
112
125
|
{
|
|
113
|
-
ret[i] = binomial<
|
|
126
|
+
ret[i] = binomial<Array<_Scalar, 1, 1>>(1, 1, urng, t, probs[i] / rest_p)(0);
|
|
114
127
|
t -= ret[i];
|
|
115
128
|
rest_p -= probs[i];
|
|
116
129
|
}
|
|
117
|
-
ret[dim - 1] =
|
|
118
|
-
ret[dim - 1] = trials - ret.sum();
|
|
130
|
+
ret[dim - 1] = trials - ret.head(dim - 1).sum();
|
|
119
131
|
}*/
|
|
120
132
|
return ret;
|
|
121
133
|
}
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* @file MvNormal.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
|
|
|
@@ -115,6 +115,20 @@ namespace Eigen
|
|
|
115
115
|
}
|
|
116
116
|
};
|
|
117
117
|
|
|
118
|
+
namespace detail {
|
|
119
|
+
template<typename MeanTy, typename CovTy>
|
|
120
|
+
constexpr bool either_is_dynamic() {
|
|
121
|
+
return (MatrixBase<MeanTy>::RowsAtCompileTime == Eigen::Dynamic) ||
|
|
122
|
+
(MatrixBase<CovTy>::RowsAtCompileTime == Eigen::Dynamic);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
template<typename MeanTy, typename CovTy>
|
|
126
|
+
constexpr bool normal_check_dims() {
|
|
127
|
+
return (either_is_dynamic<MeanTy, CovTy>() || MatrixBase<MeanTy>::RowsAtCompileTime == MatrixBase<CovTy>::RowsAtCompileTime) &&
|
|
128
|
+
MatrixBase<CovTy>::RowsAtCompileTime == MatrixBase<CovTy>::ColsAtCompileTime;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
118
132
|
/**
|
|
119
133
|
* @brief helper function constructing Eigen::Rand::MvNormal
|
|
120
134
|
*
|
|
@@ -132,8 +146,7 @@ namespace Eigen
|
|
|
132
146
|
"Derived::Scalar must be the same with `mean` and `cov`'s Scalar."
|
|
133
147
|
);
|
|
134
148
|
static_assert(
|
|
135
|
-
|
|
136
|
-
MatrixBase<CovTy>::RowsAtCompileTime == MatrixBase<CovTy>::ColsAtCompileTime,
|
|
149
|
+
detail::normal_check_dims<MeanTy, CovTy>(),
|
|
137
150
|
"assert: mean.RowsAtCompileTime == cov.RowsAtCompileTime && cov.RowsAtCompileTime == cov.ColsAtCompileTime"
|
|
138
151
|
);
|
|
139
152
|
return { mean, cov };
|
|
@@ -156,8 +169,7 @@ namespace Eigen
|
|
|
156
169
|
"Derived::Scalar must be the same with `mean` and `lt`'s Scalar."
|
|
157
170
|
);
|
|
158
171
|
static_assert(
|
|
159
|
-
|
|
160
|
-
MatrixBase<LTTy>::RowsAtCompileTime == MatrixBase<LTTy>::ColsAtCompileTime,
|
|
172
|
+
detail::normal_check_dims<MeanTy, LTTy>(),
|
|
161
173
|
"assert: mean.RowsAtCompileTime == lt.RowsAtCompileTime && lt.RowsAtCompileTime == lt.ColsAtCompileTime"
|
|
162
174
|
);
|
|
163
175
|
return { mean, lt, lower_triangular };
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* @file PacketFilter.h
|
|
3
3
|
* @author bab2min (bab2min@gmail.com)
|
|
4
4
|
* @brief
|
|
5
|
-
* @version 0.
|
|
6
|
-
* @date
|
|
7
|
-
*
|
|
8
|
-
* @copyright Copyright (c) 2020-
|
|
5
|
+
* @version 0.5.1
|
|
6
|
+
* @date 2024-09-08
|
|
7
|
+
*
|
|
8
|
+
* @copyright Copyright (c) 2020-2024
|
|
9
9
|
*
|
|
10
10
|
*/
|
|
11
11
|
|
|
@@ -27,6 +27,9 @@ namespace Eigen
|
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
+
#ifdef EIGEN_VECTORIZE_AVX512
|
|
31
|
+
#include "arch/AVX512/PacketFilter.h"
|
|
32
|
+
#endif
|
|
30
33
|
|
|
31
34
|
#ifdef EIGEN_VECTORIZE_AVX
|
|
32
35
|
#include "arch/AVX/PacketFilter.h"
|
|
@@ -41,4 +44,4 @@ namespace Eigen
|
|
|
41
44
|
#endif
|
|
42
45
|
|
|
43
46
|
|
|
44
|
-
#endif
|
|
47
|
+
#endif
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* @file PacketRandomEngine.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
|
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* @file RandUtils.h
|
|
3
3
|
* @author bab2min (bab2min@gmail.com)
|
|
4
4
|
* @brief
|
|
5
|
-
* @version 0.
|
|
6
|
-
* @date
|
|
7
|
-
*
|
|
8
|
-
* @copyright Copyright (c) 2020-
|
|
5
|
+
* @version 0.5.1
|
|
6
|
+
* @date 2024-09-08
|
|
7
|
+
*
|
|
8
|
+
* @copyright Copyright (c) 2020-2024
|
|
9
9
|
*
|
|
10
10
|
*/
|
|
11
11
|
|
|
@@ -134,11 +134,186 @@ namespace Eigen
|
|
|
134
134
|
template<typename Gen, typename _Scalar, typename Urng, bool _mutable>
|
|
135
135
|
struct functor_traits<scalar_rng_adaptor<Gen, _Scalar, Urng, _mutable> >
|
|
136
136
|
{
|
|
137
|
-
enum { Cost = HugeCost, PacketAccess = packet_traits<_Scalar>::Vectorizable, IsRepeatable = false };
|
|
137
|
+
enum { Cost = HugeCost, PacketAccess = std::is_floating_point<_Scalar>::value ? packet_traits<_Scalar>::HasExp : packet_traits<_Scalar>::Vectorizable, IsRepeatable = false };
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
template<typename Gen, typename _Scalar, typename _ScalarA, typename Rng, bool _mutable = false>
|
|
141
|
+
struct scalar_unary_rng_adaptor
|
|
142
|
+
{
|
|
143
|
+
static_assert(
|
|
144
|
+
Rand::IsScalarFullBitRandomEngine<
|
|
145
|
+
typename std::remove_reference<Rng>::type
|
|
146
|
+
>::value ||
|
|
147
|
+
Rand::IsPacketRandomEngine<
|
|
148
|
+
typename std::remove_reference<Rng>::type
|
|
149
|
+
>::value,
|
|
150
|
+
"Rng must satisfy RandomNumberEngine"
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
Gen gen;
|
|
154
|
+
Rng rng;
|
|
155
|
+
|
|
156
|
+
scalar_unary_rng_adaptor(const Rng& _rng) : rng{ _rng }
|
|
157
|
+
{
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
template<typename _Gen>
|
|
161
|
+
scalar_unary_rng_adaptor(const Rng& _rng, _Gen&& _gen) : gen{ _gen }, rng{ _rng }
|
|
162
|
+
{
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
scalar_unary_rng_adaptor(const scalar_unary_rng_adaptor& o) = default;
|
|
166
|
+
scalar_unary_rng_adaptor(scalar_unary_rng_adaptor&& o) = default;
|
|
167
|
+
|
|
168
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const _Scalar operator() (_ScalarA a) const
|
|
169
|
+
{
|
|
170
|
+
return gen(rng, a);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
template<typename Packet>
|
|
174
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
|
|
175
|
+
{
|
|
176
|
+
return gen.template packetOp<Packet>(rng, a);
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
template<typename Gen, typename _Scalar, typename _ScalarA, typename Rng>
|
|
181
|
+
struct scalar_unary_rng_adaptor<Gen, _Scalar, _ScalarA, Rng, true>
|
|
182
|
+
{
|
|
183
|
+
static_assert(
|
|
184
|
+
Rand::IsScalarFullBitRandomEngine<
|
|
185
|
+
typename std::remove_reference<Rng>::type
|
|
186
|
+
>::value ||
|
|
187
|
+
Rand::IsPacketRandomEngine<
|
|
188
|
+
typename std::remove_reference<Rng>::type
|
|
189
|
+
>::value,
|
|
190
|
+
"Rng must satisfy RandomNumberEngine"
|
|
191
|
+
);
|
|
192
|
+
|
|
193
|
+
mutable Gen gen;
|
|
194
|
+
Rng rng;
|
|
195
|
+
|
|
196
|
+
scalar_unary_rng_adaptor(const Rng& _rng) : rng{ _rng }
|
|
197
|
+
{
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
template<typename _Gen>
|
|
201
|
+
scalar_unary_rng_adaptor(const Rng& _rng, _Gen&& _gen) : gen{ _gen }, rng{ _rng }
|
|
202
|
+
{
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
scalar_unary_rng_adaptor(const scalar_unary_rng_adaptor& o) = default;
|
|
206
|
+
scalar_unary_rng_adaptor(scalar_unary_rng_adaptor&& o) = default;
|
|
207
|
+
|
|
208
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const _Scalar operator() (_ScalarA a) const
|
|
209
|
+
{
|
|
210
|
+
return gen(rng, a);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
template<typename Packet>
|
|
214
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
|
|
215
|
+
{
|
|
216
|
+
return gen.template packetOp<Packet>(rng, a);
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
template<typename Gen, typename _Scalar, typename _ScalarA, typename Urng, bool _mutable>
|
|
221
|
+
struct functor_traits<scalar_unary_rng_adaptor<Gen, _Scalar, _ScalarA, Urng, _mutable> >
|
|
222
|
+
{
|
|
223
|
+
enum { Cost = HugeCost, PacketAccess = std::is_floating_point<_Scalar>::value ? packet_traits<_Scalar>::HasExp : packet_traits<_Scalar>::Vectorizable, IsRepeatable = false };
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
template<typename Gen, typename _Scalar, typename _ScalarA, typename _ScalarB, typename Rng, bool _mutable = false>
|
|
227
|
+
struct scalar_binary_rng_adaptor
|
|
228
|
+
{
|
|
229
|
+
static_assert(
|
|
230
|
+
Rand::IsScalarFullBitRandomEngine<
|
|
231
|
+
typename std::remove_reference<Rng>::type
|
|
232
|
+
>::value ||
|
|
233
|
+
Rand::IsPacketRandomEngine<
|
|
234
|
+
typename std::remove_reference<Rng>::type
|
|
235
|
+
>::value,
|
|
236
|
+
"Rng must satisfy RandomNumberEngine"
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
Gen gen;
|
|
240
|
+
Rng rng;
|
|
241
|
+
|
|
242
|
+
scalar_binary_rng_adaptor(const Rng& _rng) : rng{ _rng }
|
|
243
|
+
{
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
template<typename _Gen>
|
|
247
|
+
scalar_binary_rng_adaptor(const Rng& _rng, _Gen&& _gen) : gen{ _gen }, rng{ _rng }
|
|
248
|
+
{
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
scalar_binary_rng_adaptor(const scalar_binary_rng_adaptor& o) = default;
|
|
252
|
+
scalar_binary_rng_adaptor(scalar_binary_rng_adaptor&& o) = default;
|
|
253
|
+
|
|
254
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const _Scalar operator() (_ScalarA a, _ScalarB b) const
|
|
255
|
+
{
|
|
256
|
+
return gen(rng, a, b);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
template<typename Packet>
|
|
260
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
|
|
261
|
+
{
|
|
262
|
+
return gen.template packetOp<Packet>(rng, a, b);
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
template<typename Gen, typename _Scalar, typename _ScalarA, typename _ScalarB, typename Rng>
|
|
267
|
+
struct scalar_binary_rng_adaptor<Gen, _Scalar, _ScalarA, _ScalarB, Rng, true>
|
|
268
|
+
{
|
|
269
|
+
static_assert(
|
|
270
|
+
Rand::IsScalarFullBitRandomEngine<
|
|
271
|
+
typename std::remove_reference<Rng>::type
|
|
272
|
+
>::value ||
|
|
273
|
+
Rand::IsPacketRandomEngine<
|
|
274
|
+
typename std::remove_reference<Rng>::type
|
|
275
|
+
>::value,
|
|
276
|
+
"Rng must satisfy RandomNumberEngine"
|
|
277
|
+
);
|
|
278
|
+
|
|
279
|
+
mutable Gen gen;
|
|
280
|
+
Rng rng;
|
|
281
|
+
|
|
282
|
+
scalar_binary_rng_adaptor(const Rng& _rng) : rng{ _rng }
|
|
283
|
+
{
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
template<typename _Gen>
|
|
287
|
+
scalar_binary_rng_adaptor(const Rng& _rng, _Gen&& _gen) : gen{ _gen }, rng{ _rng }
|
|
288
|
+
{
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
scalar_binary_rng_adaptor(const scalar_binary_rng_adaptor& o) = default;
|
|
292
|
+
scalar_binary_rng_adaptor(scalar_binary_rng_adaptor&& o) = default;
|
|
293
|
+
|
|
294
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const _Scalar operator() (_ScalarA a, _ScalarB b) const
|
|
295
|
+
{
|
|
296
|
+
return gen(rng, a, b);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
template<typename PacketA, typename PacketB>
|
|
300
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const PacketA packetOp(const PacketA& a, const PacketB& b) const
|
|
301
|
+
{
|
|
302
|
+
return gen.packetOp(rng, a, b);
|
|
303
|
+
}
|
|
304
|
+
};
|
|
305
|
+
|
|
306
|
+
template<typename Gen, typename _Scalar, typename _ScalarA, typename _ScalarB, typename Urng, bool _mutable>
|
|
307
|
+
struct functor_traits<scalar_binary_rng_adaptor<Gen, _Scalar, _ScalarA, _ScalarB, Urng, _mutable> >
|
|
308
|
+
{
|
|
309
|
+
enum { Cost = HugeCost, PacketAccess = std::is_floating_point<_Scalar>::value ? packet_traits<_Scalar>::HasExp : packet_traits<_Scalar>::Vectorizable, IsRepeatable = false };
|
|
138
310
|
};
|
|
139
311
|
}
|
|
140
312
|
}
|
|
141
313
|
|
|
314
|
+
#ifdef EIGEN_VECTORIZE_AVX512
|
|
315
|
+
#include "arch/AVX512/RandUtils.h"
|
|
316
|
+
#endif
|
|
142
317
|
|
|
143
318
|
#ifdef EIGEN_VECTORIZE_AVX
|
|
144
319
|
#include "arch/AVX/RandUtils.h"
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* @file MorePacketMath.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
|
|
|
@@ -176,6 +176,24 @@ namespace Eigen
|
|
|
176
176
|
#endif
|
|
177
177
|
}
|
|
178
178
|
|
|
179
|
+
template<>
|
|
180
|
+
EIGEN_STRONG_INLINE Packet8f pcmpeq<Packet8f>(const Packet8f& a, const Packet8f& b)
|
|
181
|
+
{
|
|
182
|
+
return _mm256_cmp_ps(a, b, _CMP_EQ_OQ);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
template<>
|
|
186
|
+
EIGEN_STRONG_INLINE Packet8i pnegate<Packet8i>(const Packet8i& a)
|
|
187
|
+
{
|
|
188
|
+
#ifdef EIGEN_VECTORIZE_AVX2
|
|
189
|
+
return _mm256_sub_epi32(pset1<Packet8i>(0), a);
|
|
190
|
+
#else
|
|
191
|
+
Packet4i a1, a2;
|
|
192
|
+
split_two(a, a1, a2);
|
|
193
|
+
return combine_two(_mm_sub_epi32(pset1<Packet4i>(0), a1), _mm_sub_epi32(pset1<Packet4i>(0), a2));
|
|
194
|
+
#endif
|
|
195
|
+
}
|
|
196
|
+
|
|
179
197
|
template<>
|
|
180
198
|
struct BitShifter<Packet8i>
|
|
181
199
|
{
|
|
@@ -301,7 +319,28 @@ namespace Eigen
|
|
|
301
319
|
return reinterpret_to_int((Packet8f)_mm256_xor_ps(reinterpret_to_float(a), reinterpret_to_float(b)));
|
|
302
320
|
#endif
|
|
303
321
|
}
|
|
322
|
+
|
|
323
|
+
template<> EIGEN_STRONG_INLINE bool predux_any(const Packet8f& x)
|
|
324
|
+
{
|
|
325
|
+
return !!_mm256_movemask_ps(x);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
template<> EIGEN_STRONG_INLINE bool predux_any(const Packet8i& x)
|
|
329
|
+
{
|
|
330
|
+
return predux_any(_mm256_castsi256_ps(x));
|
|
331
|
+
}
|
|
304
332
|
#endif
|
|
333
|
+
|
|
334
|
+
template<> EIGEN_STRONG_INLINE bool predux_all(const Packet8f& x)
|
|
335
|
+
{
|
|
336
|
+
return _mm256_movemask_ps(x) == 0xFF;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
template<> EIGEN_STRONG_INLINE bool predux_all(const Packet8i& x)
|
|
340
|
+
{
|
|
341
|
+
return predux_all(_mm256_castsi256_ps(x));
|
|
342
|
+
}
|
|
343
|
+
|
|
305
344
|
template<>
|
|
306
345
|
EIGEN_STRONG_INLINE Packet8i pcmplt<Packet8i>(const Packet8i& a, const Packet8i& b)
|
|
307
346
|
{
|