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 Basic.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
 
@@ -32,6 +32,11 @@ namespace Eigen
32
32
  class GenBase
33
33
  {
34
34
  public:
35
+ /**
36
+ * @brief Return a reference to the derived type.
37
+ */
38
+ DerivedGen &derived() { return static_cast<DerivedGen &>(*this); }
39
+
35
40
  /**
36
41
  * @brief generate random values from its distribution
37
42
  *
@@ -48,7 +53,7 @@ namespace Eigen
48
53
  generate(Index rows, Index cols, Urng&& urng)
49
54
  {
50
55
  return {
51
- rows, cols, { std::forward<Urng>(urng), static_cast<DerivedGen&>(*this) }
56
+ rows, cols, { std::forward<Urng>(urng), derived() }
52
57
  };
53
58
  }
54
59
 
@@ -67,7 +72,93 @@ namespace Eigen
67
72
  generateLike(const Derived& o, Urng&& urng)
68
73
  {
69
74
  return {
70
- o.rows(), o.cols(), { std::forward<Urng>(urng), static_cast<DerivedGen&>(*this) }
75
+ o.rows(), o.cols(), { std::forward<Urng>(urng), derived() }
76
+ };
77
+ }
78
+ };
79
+
80
+ template<typename DerivedGen, typename Scalar, typename ScalarA>
81
+ class UnaryGenBase
82
+ {
83
+ public:
84
+ /**
85
+ * @brief Return a reference to the derived type.
86
+ */
87
+ DerivedGen &derived() { return static_cast<DerivedGen &>(*this); }
88
+
89
+ /**
90
+ * @brief generate random values from its distribution
91
+ *
92
+ * @tparam Lhs, Rhs
93
+ * @tparam Urng
94
+ * @param urng c++11-style random number generator
95
+ * @param a, b operands for the random distribution
96
+ * @return
97
+ * a random matrix expression with a shape `(rows, cols)`
98
+ */
99
+ template<typename Lhs, typename Urng>
100
+ inline CwiseUnaryOp<
101
+ internal::scalar_unary_rng_adaptor<DerivedGen&, Scalar, typename Lhs::Scalar, Urng>,
102
+ const Lhs
103
+ > generate(Urng&& urng, const ArrayBase<Lhs>& a)
104
+ {
105
+ return {
106
+ a, { std::forward<Urng>(urng), derived() }
107
+ };
108
+ }
109
+ };
110
+
111
+ template<typename DerivedGen, typename Scalar, typename ScalarA, typename ScalarB>
112
+ class BinaryGenBase
113
+ {
114
+ public:
115
+ /**
116
+ * @brief Return a reference to the derived type.
117
+ */
118
+ DerivedGen &derived() { return static_cast<DerivedGen &>(*this); }
119
+
120
+ /**
121
+ * @brief generate random values from its distribution
122
+ *
123
+ * @tparam Lhs, Rhs
124
+ * @tparam Urng
125
+ * @param urng c++11-style random number generator
126
+ * @param a, b operands for the random distribution
127
+ * @return
128
+ * a random matrix expression with a shape `(rows, cols)`
129
+ */
130
+ template<typename Lhs, typename Rhs, typename Urng>
131
+ inline CwiseBinaryOp<
132
+ internal::scalar_binary_rng_adaptor<DerivedGen&, Scalar, typename Lhs::Scalar, typename Rhs::Scalar, Urng>,
133
+ const Lhs, const Rhs
134
+ > generate(Urng&& urng, const ArrayBase<Lhs>& a, const ArrayBase<Rhs>& b)
135
+ {
136
+ return {
137
+ a, b, { std::forward<Urng>(urng), derived() }
138
+ };
139
+ }
140
+
141
+ template<typename Lhs, typename Rhs, typename Urng>
142
+ inline CwiseBinaryOp<
143
+ internal::scalar_binary_rng_adaptor<DerivedGen&, Scalar, typename Lhs::Scalar, Rhs, Urng>,
144
+ const Lhs, CwiseNullaryOp<internal::scalar_constant_op<Rhs>, const Lhs>
145
+ > generate(Urng&& urng, const ArrayBase<Lhs>& a, Rhs b)
146
+ {
147
+ return {
148
+ a, { a.rows(), a.cols(), internal::scalar_constant_op<Rhs>{ b } },
149
+ { std::forward<Urng>(urng), derived() }
150
+ };
151
+ }
152
+
153
+ template<typename Lhs, typename Rhs, typename Urng>
154
+ inline CwiseBinaryOp<
155
+ internal::scalar_binary_rng_adaptor<DerivedGen&, Scalar, Lhs, typename Rhs::Scalar, Urng>,
156
+ CwiseNullaryOp<internal::scalar_constant_op<Lhs>, const Rhs>, const Rhs
157
+ > generate(Urng&& urng, Lhs a, const ArrayBase<Rhs>& b)
158
+ {
159
+ return {
160
+ { b.rows(), b.cols(), internal::scalar_constant_op<Lhs>{ a } }, b,
161
+ { std::forward<Urng>(urng), derived() }
71
162
  };
72
163
  }
73
164
  };
@@ -83,10 +174,15 @@ namespace Eigen
83
174
  class MvVecGenBase
84
175
  {
85
176
  public:
177
+ /**
178
+ * @brief Return a reference to the derived type.
179
+ */
180
+ DerivedGen &derived() { return static_cast<DerivedGen &>(*this); }
181
+
86
182
  /**
87
183
  * @brief returns the dimensions of vectors to be generated
88
184
  */
89
- Index dims() const { return static_cast<DerivedGen&>(*this).dims(); }
185
+ Index dims() const { return derived().dims(); }
90
186
 
91
187
  /**
92
188
  * @brief generates multiple samples at once
@@ -100,7 +196,7 @@ namespace Eigen
100
196
  template<typename Urng>
101
197
  inline Matrix<_Scalar, Dim, -1> generate(Urng&& urng, Index samples)
102
198
  {
103
- return static_cast<DerivedGen&>(*this).generatr(std::forward<Urng>(urng), samples);
199
+ return derived().generate(std::forward<Urng>(urng), samples);
104
200
  }
105
201
 
106
202
  /**
@@ -113,7 +209,7 @@ namespace Eigen
113
209
  template<typename Urng>
114
210
  inline Matrix<_Scalar, Dim, 1> generate(Urng&& urng)
115
211
  {
116
- return static_cast<DerivedGen&>(*this).generatr(std::forward<Urng>(urng));
212
+ return derived().generate(std::forward<Urng>(urng));
117
213
  }
118
214
  };
119
215
 
@@ -128,10 +224,15 @@ namespace Eigen
128
224
  class MvMatGenBase
129
225
  {
130
226
  public:
227
+ /**
228
+ * @brief Return a reference to the derived type.
229
+ */
230
+ DerivedGen &derived() { return static_cast<DerivedGen &>(*this); }
231
+
131
232
  /**
132
233
  * @brief returns the dimensions of matrices to be generated
133
234
  */
134
- Index dims() const { return static_cast<DerivedGen&>(*this).dims(); }
235
+ Index dims() const { return derived().dims(); }
135
236
 
136
237
  /**
137
238
  * @brief generates multiple samples at once
@@ -145,7 +246,7 @@ namespace Eigen
145
246
  template<typename Urng>
146
247
  inline Matrix<_Scalar, Dim, -1> generate(Urng&& urng, Index samples)
147
248
  {
148
- return static_cast<DerivedGen&>(*this).generate(std::forward<Urng>(urng), samples);
249
+ return derived().generate(std::forward<Urng>(urng), samples);
149
250
  }
150
251
 
151
252
  /**
@@ -158,7 +259,7 @@ namespace Eigen
158
259
  template<typename Urng>
159
260
  inline Matrix<_Scalar, Dim, Dim> generate(Urng&& urng)
160
261
  {
161
- return static_cast<DerivedGen&>(*this).generate(std::forward<Urng>(urng));
262
+ return derived().generate(std::forward<Urng>(urng));
162
263
  }
163
264
  };
164
265
 
@@ -257,9 +358,13 @@ namespace Eigen
257
358
  template<typename Packet>
258
359
  auto operator()(Packet v) -> uint64_t
259
360
  {
361
+ #ifdef EIGEN_VECTORIZE_AVX512
362
+ return Eigen::internal::pfirst(v);
363
+ #else
260
364
  uint64_t arr[sizeof(Packet) / 8];
261
365
  Eigen::internal::pstoreu((Packet*)arr, v);
262
366
  return arr[0];
367
+ #endif
263
368
  }
264
369
  };
265
370
 
@@ -360,6 +465,30 @@ namespace Eigen
360
465
  }
361
466
  };
362
467
 
468
+ template<typename _Scalar>
469
+ class BalancedVGen : public BinaryGenBase<BalancedVGen<_Scalar>, _Scalar, _Scalar, _Scalar>
470
+ {
471
+ static_assert(std::is_floating_point<_Scalar>::value, "balanced needs floating point types.");
472
+
473
+ public:
474
+ using Scalar = _Scalar;
475
+
476
+ template<typename Rng>
477
+ EIGEN_STRONG_INLINE const _Scalar operator() (Rng&& rng, _Scalar a, _Scalar b)
478
+ {
479
+ using namespace Eigen::internal;
480
+ return ((_Scalar)((int32_t)pfirst(std::forward<Rng>(rng)()) & 0x7FFFFFFF) / 0x7FFFFFFF) * (b - a) + a;
481
+ }
482
+
483
+ template<typename Packet, typename Rng>
484
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(Rng&& rng, const Packet& a, const Packet& b)
485
+ {
486
+ using namespace Eigen::internal;
487
+ using RUtils = RandUtils<Packet, Rng>;
488
+ return padd(pmul(RUtils{}.zero_to_one(std::forward<Rng>(rng)), psub(b, a)), a);
489
+ }
490
+ };
491
+
363
492
  namespace detail
364
493
  {
365
494
  template<size_t v>
@@ -501,6 +630,32 @@ namespace Eigen
501
630
  }
502
631
  };
503
632
 
633
+ template<typename _Scalar>
634
+ class UniformRealVGen : public BinaryGenBase<UniformRealVGen<_Scalar>, _Scalar, _Scalar, _Scalar>
635
+ {
636
+ static_assert(std::is_floating_point<_Scalar>::value, "uniformReal needs floating point types.");
637
+
638
+ public:
639
+ using Scalar = _Scalar;
640
+
641
+ template<typename Rng>
642
+ EIGEN_STRONG_INLINE const _Scalar operator() (Rng&& rng, _Scalar a, _Scalar b)
643
+ {
644
+ using namespace Eigen::internal;
645
+ return a + BitScalar<_Scalar>{}.to_ur(pfirst(std::forward<Rng>(rng)())) * (b - a);
646
+ }
647
+
648
+ template<typename Packet, typename Rng>
649
+ EIGEN_STRONG_INLINE const Packet packetOp(Rng&& rng, const Packet& a, const Packet& b)
650
+ {
651
+ using namespace Eigen::internal;
652
+ using RUtils = RandUtils<Packet, Rng>;
653
+ return padd(pmul(
654
+ RUtils{}.uniform_real(std::forward<Rng>(rng)), psub(b, a)
655
+ ), a);
656
+ }
657
+ };
658
+
504
659
 
505
660
  /**
506
661
  * @brief Generator of Bernoulli distribution
@@ -547,6 +702,35 @@ namespace Eigen
547
702
  }
548
703
  };
549
704
 
705
+ template<typename _Scalar>
706
+ class BernoulliVGen : public UnaryGenBase<BernoulliVGen<_Scalar>, _Scalar, _Scalar>
707
+ {
708
+ static_assert(std::is_floating_point<_Scalar>::value, "vectorized `bernoulli` needs a float type.");
709
+ public:
710
+ using Scalar = _Scalar;
711
+
712
+ template<typename Rng>
713
+ EIGEN_STRONG_INLINE const _Scalar operator() (Rng&& rng, _Scalar a)
714
+ {
715
+ using namespace Eigen::internal;
716
+ uint32_t p = (uint32_t)(a * 0x80000000);
717
+ return (((uint32_t)pfirst(std::forward<Rng>(rng)()) & 0x7FFFFFFF) < p) ? 1 : 0;
718
+ }
719
+
720
+ template<typename Packet, typename Rng>
721
+ EIGEN_STRONG_INLINE const Packet packetOp(Rng&& rng, const Packet& a)
722
+ {
723
+ using namespace Eigen::internal;
724
+ using IPacket = decltype(reinterpret_to_int(std::declval<Packet>()));
725
+ using RUtils = RawbitsMaker<IPacket, Rng>;
726
+ auto one = pset1<Packet>(1);
727
+ auto zero = pset1<Packet>(0);
728
+ auto p = pcast<Packet, IPacket>(pmul(a, pset1<Packet>(0x80000000)));
729
+ auto r = RUtils{}.rawbits(std::forward<Rng>(rng));
730
+ r = pand(r, pset1<IPacket>(0x7FFFFFFF));
731
+ return pblendv(pcmplt(r, p), one, zero);
732
+ }
733
+ };
550
734
 
551
735
  template<typename Derived, typename Urng>
552
736
  using RandBitsType = CwiseNullaryOp<internal::scalar_rng_adaptor<RandbitsGen<typename Derived::Scalar>, typename Derived::Scalar, Urng, true>, const Derived>;
@@ -682,6 +866,68 @@ namespace Eigen
682
866
  };
683
867
  }
684
868
 
869
+ template<typename Derived, typename Urng>
870
+ using BalancedVVType = CwiseBinaryOp<
871
+ internal::scalar_binary_rng_adaptor<BalancedVGen<typename Derived::Scalar>, typename Derived::Scalar, typename Derived::Scalar, typename Derived::Scalar, Urng, true>,
872
+ const Derived, const Derived
873
+ >;
874
+
875
+ /**
876
+ * @brief generates reals in a range `[a, b]`
877
+ *
878
+ * @tparam Lhs, Rhs ArrayBase type of lhs and rhs operands
879
+ * @tparam Urng
880
+ * @param urng c++11-style random number generator
881
+ * @param a,b left and right boundary
882
+ * @return a random matrix expression with the same shape as `a` and `b`
883
+ * @note `a` and `b` should have the same shape and scalar type.
884
+ *
885
+ *
886
+ * @see Eigen::Rand::BalancedGen
887
+ */
888
+ template<typename Lhs, typename Rhs, typename Urng>
889
+ inline const BalancedVVType<Lhs, Urng>
890
+ balanced(Urng&& urng, const ArrayBase<Lhs>& a, const ArrayBase<Rhs>& b)
891
+ {
892
+ static_assert(std::is_same<typename Lhs::Scalar, typename Rhs::Scalar>::value, "`Lhs::Scalar` must be equal to `Rhs::Scalar`");
893
+ return {
894
+ static_cast<const Lhs&>(a), static_cast<const Rhs&>(b),
895
+ { std::forward<Urng>(urng), BalancedVGen<typename Lhs::Scalar>{} }
896
+ };
897
+ }
898
+
899
+ template<typename Derived, typename Urng>
900
+ using BalancedVSType = CwiseBinaryOp<
901
+ internal::scalar_binary_rng_adaptor<BalancedVGen<typename Derived::Scalar>, typename Derived::Scalar, typename Derived::Scalar, typename Derived::Scalar, Urng, true>,
902
+ const Derived, CwiseNullaryOp<internal::scalar_constant_op<typename Derived::Scalar>, const Derived>
903
+ >;
904
+
905
+ template<typename Lhs, typename Urng>
906
+ inline const BalancedVSType<Lhs, Urng>
907
+ balanced(Urng&& urng, const ArrayBase<Lhs>& a, typename Lhs::Scalar b)
908
+ {
909
+ return {
910
+ static_cast<const Lhs&>(a), { a.rows(), a.cols(), internal::scalar_constant_op<typename Lhs::Scalar>{ b } },
911
+ { std::forward<Urng>(urng), BalancedVGen<typename Lhs::Scalar>{} }
912
+ };
913
+ }
914
+
915
+ template<typename Derived, typename Urng>
916
+ using BalancedSVType = CwiseBinaryOp<
917
+ internal::scalar_binary_rng_adaptor<BalancedVGen<typename Derived::Scalar>, typename Derived::Scalar, typename Derived::Scalar, typename Derived::Scalar, Urng, true>,
918
+ CwiseNullaryOp<internal::scalar_constant_op<typename Derived::Scalar>, const Derived>, const Derived
919
+ >;
920
+
921
+ template<typename Rhs, typename Urng>
922
+ inline const BalancedSVType<Rhs, Urng>
923
+ balanced(Urng&& urng, typename Rhs::Scalar a, const ArrayBase<Rhs>& b)
924
+ {
925
+ return {
926
+ { b.rows(), b.cols(), internal::scalar_constant_op<typename Rhs::Scalar>{ a } }, static_cast<const Rhs&>(b),
927
+ { std::forward<Urng>(urng), BalancedVGen<typename Rhs::Scalar>{} }
928
+ };
929
+ }
930
+
685
931
  template<typename Derived, typename Urng>
686
932
  using StdUniformRealType = CwiseNullaryOp<internal::scalar_rng_adaptor<StdUniformRealGen<typename Derived::Scalar>, typename Derived::Scalar, Urng, true>, const Derived>;
687
933
 
@@ -772,6 +1018,69 @@ namespace Eigen
772
1018
  };
773
1019
  }
774
1020
 
1021
+ template<typename Derived, typename Urng>
1022
+ using UniformRealVVType = CwiseBinaryOp<
1023
+ internal::scalar_binary_rng_adaptor<UniformRealVGen<typename Derived::Scalar>, typename Derived::Scalar, typename Derived::Scalar, typename Derived::Scalar, Urng, true>,
1024
+ const Derived, const Derived
1025
+ >;
1026
+
1027
+ /**
1028
+ * @brief generates reals in a range `[a, b)`
1029
+ *
1030
+ * @tparam Lhs, Rhs ArrayBase type of lhs and rhs operands
1031
+ * @tparam Urng
1032
+ * @param urng c++11-style random number generator
1033
+ * @param a,b left and right boundary
1034
+ * @return a random matrix expression with the same shape as `a` and `b`
1035
+ * @note `a` and `b` should have the same shape and scalar type.
1036
+ *
1037
+ *
1038
+ * @see Eigen::Rand::UniformRealGen
1039
+ */
1040
+ template<typename Lhs, typename Rhs, typename Urng>
1041
+ inline const UniformRealVVType<Lhs, Urng>
1042
+ uniformReal(Urng&& urng, const ArrayBase<Lhs>& a, const ArrayBase<Rhs>& b)
1043
+ {
1044
+ static_assert(std::is_same<typename Lhs::Scalar, typename Rhs::Scalar>::value, "`Lhs::Scalar` must be equal to `Rhs::Scalar`");
1045
+ return {
1046
+ static_cast<const Lhs&>(a), static_cast<const Rhs&>(b),
1047
+ { std::forward<Urng>(urng), UniformRealVGen<typename Lhs::Scalar>{} }
1048
+ };
1049
+ }
1050
+
1051
+ template<typename Derived, typename Urng>
1052
+ using UniformRealVSType = CwiseBinaryOp<
1053
+ internal::scalar_binary_rng_adaptor<UniformRealVGen<typename Derived::Scalar>, typename Derived::Scalar, typename Derived::Scalar, typename Derived::Scalar, Urng, true>,
1054
+ const Derived, CwiseNullaryOp<internal::scalar_constant_op<typename Derived::Scalar>, const Derived>
1055
+ >;
1056
+
1057
+ template<typename Lhs, typename Urng>
1058
+ inline const UniformRealVSType<Lhs, Urng>
1059
+ uniformReal(Urng&& urng, const ArrayBase<Lhs>& a, typename Lhs::Scalar b)
1060
+ {
1061
+ return {
1062
+ static_cast<const Lhs&>(a), { a.rows(), a.cols(), internal::scalar_constant_op<typename Lhs::Scalar>{ b } },
1063
+ { std::forward<Urng>(urng), UniformRealVGen<typename Lhs::Scalar>{} }
1064
+ };
1065
+ }
1066
+
1067
+
1068
+ template<typename Derived, typename Urng>
1069
+ using UniformRealSVType = CwiseBinaryOp<
1070
+ internal::scalar_binary_rng_adaptor<UniformRealVGen<typename Derived::Scalar>, typename Derived::Scalar, typename Derived::Scalar, typename Derived::Scalar, Urng, true>,
1071
+ CwiseNullaryOp<internal::scalar_constant_op<typename Derived::Scalar>, const Derived>, const Derived
1072
+ >;
1073
+
1074
+ template<typename Rhs, typename Urng>
1075
+ inline const UniformRealSVType<Rhs, Urng>
1076
+ uniformReal(Urng&& urng, typename Rhs::Scalar a, const ArrayBase<Rhs>& b)
1077
+ {
1078
+ return {
1079
+ { b.rows(), b.cols(), internal::scalar_constant_op<typename Rhs::Scalar>{ a } }, static_cast<const Rhs&>(b),
1080
+ { std::forward<Urng>(urng), UniformRealVGen<typename Rhs::Scalar>{} }
1081
+ };
1082
+ }
1083
+
775
1084
  template<typename Derived, typename Urng>
776
1085
  using BernoulliType = CwiseNullaryOp<internal::scalar_rng_adaptor<BernoulliGen<typename Derived::Scalar>, typename Derived::Scalar, Urng, true>, const Derived>;
777
1086
 
@@ -813,6 +1122,30 @@ namespace Eigen
813
1122
  o.rows(), o.cols(), { std::forward<Urng>(urng), BernoulliGen<typename Derived::Scalar>{ p } }
814
1123
  };
815
1124
  }
1125
+
1126
+ template<typename Derived, typename Urng>
1127
+ using BernoulliVType = CwiseUnaryOp<
1128
+ internal::scalar_unary_rng_adaptor<BernoulliVGen<typename Derived::Scalar>, typename Derived::Scalar, typename Derived::Scalar, Urng, true>,
1129
+ const Derived
1130
+ >;
1131
+
1132
+ /**
1133
+ * @brief generates 1 with probability `p` and 0 with probability `1 - p`
1134
+ *
1135
+ * @tparam Lhs
1136
+ * @tparam Urng
1137
+ * @param urng c++11-style random number generator
1138
+ * @param p a probability of generating 1
1139
+ * @return a random matrix expression with the same shape as `p`
1140
+ */
1141
+ template<typename Lhs, typename Urng>
1142
+ inline const BernoulliVType<Lhs, Urng>
1143
+ bernoulli(Urng&& urng, const ArrayBase<Lhs>& p)
1144
+ {
1145
+ return BernoulliVType<Lhs, Urng>{
1146
+ static_cast<const Lhs&>(p), { std::forward<Urng>(urng), BernoulliVGen<typename Lhs::Scalar>{} }
1147
+ };
1148
+ }
816
1149
  }
817
1150
  }
818
1151