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,8 +2,8 @@
2
2
  * @file Macro.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
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 4
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.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
 
@@ -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
- #if defined(EIGEN_VECTORIZE_NEON) || defined(EIGENRAND_EIGEN_34_MODE)
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
- #if defined(EIGEN_VECTORIZE_NEON) || defined(EIGENRAND_EIGEN_34_MODE)
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
- #if defined(EIGEN_VECTORIZE_NEON) || defined(EIGENRAND_EIGEN_34_MODE)
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
- #if defined(EIGEN_VECTORIZE_NEON) || defined(EIGENRAND_EIGEN_34_MODE)
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
- #if defined(EIGEN_VECTORIZE_NEON) || defined(EIGENRAND_EIGEN_34_MODE)
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.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
 
@@ -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
- //if (trials < 2500)
65
+ if (trials < std::max(30 * (dim - 1), (Index)100))
66
66
  {
67
- for (Index j = 0; j < samples; ++j)
67
+ for (Index s = 0; s < samples; ++s)
68
68
  {
69
- ret.col(j) = generate(urng);
69
+ ret.col(s) = generate(urng);
70
70
  }
71
71
  }
72
- /*else
72
+ else
73
73
  {
74
- ret.row(0) = binomial<Matrix<_Scalar, -1, 1>>(samples, 1, urng, trials, probs[0]).eval().transpose();
75
- for (Index j = 0; j < samples; ++j)
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
- double rest_p = 1 - probs[0];
78
- _Scalar t = trials - ret(0, j);
79
- for (Index i = 1; i < dim - 1; ++i)
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
- ret.row(dim - 1).setZero();
88
- ret.row(dim - 1).array() = trials - ret.colwise().sum().array();
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 < 2500)
100
+ //if (trials < std::max(30 * (dim - 1), (Index)100))
99
101
  {
100
102
  ret.setZero();
101
- auto d = discrete.template generate<Matrix<_Scalar, -1, 1>>(trials, 1, urng).eval();
102
- for (Index i = 0; i < trials; ++i)
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[d[i]] += 1;
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<Matrix<_Scalar, 1, 1>>(1, 1, urng, t, probs[i] / rest_p)(0);
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] = 0;
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.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
 
@@ -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
- MatrixBase<MeanTy>::RowsAtCompileTime == MatrixBase<CovTy>::RowsAtCompileTime &&
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
- MatrixBase<MeanTy>::RowsAtCompileTime == MatrixBase<LTTy>::RowsAtCompileTime &&
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.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
 
@@ -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.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
 
@@ -2,10 +2,10 @@
2
2
  * @file RandUtils.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
 
@@ -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.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
 
@@ -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
  {
@@ -2,10 +2,10 @@
2
2
  * @file PacketFilter.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
 
@@ -2,10 +2,10 @@
2
2
  * @file RandUtils.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