tomoto 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (369) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/README.md +8 -10
  4. data/ext/tomoto/ct.cpp +11 -11
  5. data/ext/tomoto/dmr.cpp +14 -13
  6. data/ext/tomoto/dt.cpp +14 -14
  7. data/ext/tomoto/extconf.rb +7 -5
  8. data/ext/tomoto/gdmr.cpp +7 -7
  9. data/ext/tomoto/hdp.cpp +9 -9
  10. data/ext/tomoto/hlda.cpp +13 -13
  11. data/ext/tomoto/hpa.cpp +5 -5
  12. data/ext/tomoto/lda.cpp +42 -39
  13. data/ext/tomoto/llda.cpp +6 -6
  14. data/ext/tomoto/mglda.cpp +15 -15
  15. data/ext/tomoto/pa.cpp +6 -6
  16. data/ext/tomoto/plda.cpp +6 -6
  17. data/ext/tomoto/slda.cpp +8 -8
  18. data/ext/tomoto/{ext.cpp → tomoto.cpp} +8 -8
  19. data/ext/tomoto/utils.h +16 -70
  20. data/lib/tomoto/version.rb +1 -1
  21. data/lib/tomoto.rb +5 -1
  22. data/vendor/EigenRand/EigenRand/Core.h +10 -10
  23. data/vendor/EigenRand/EigenRand/Dists/Basic.h +208 -9
  24. data/vendor/EigenRand/EigenRand/Dists/Discrete.h +52 -31
  25. data/vendor/EigenRand/EigenRand/Dists/GammaPoisson.h +9 -8
  26. data/vendor/EigenRand/EigenRand/Dists/NormalExp.h +28 -21
  27. data/vendor/EigenRand/EigenRand/EigenRand +11 -6
  28. data/vendor/EigenRand/EigenRand/Macro.h +13 -7
  29. data/vendor/EigenRand/EigenRand/MorePacketMath.h +348 -740
  30. data/vendor/EigenRand/EigenRand/MvDists/Multinomial.h +5 -3
  31. data/vendor/EigenRand/EigenRand/MvDists/MvNormal.h +9 -3
  32. data/vendor/EigenRand/EigenRand/PacketFilter.h +11 -253
  33. data/vendor/EigenRand/EigenRand/PacketRandomEngine.h +21 -47
  34. data/vendor/EigenRand/EigenRand/RandUtils.h +50 -344
  35. data/vendor/EigenRand/EigenRand/arch/AVX/MorePacketMath.h +619 -0
  36. data/vendor/EigenRand/EigenRand/arch/AVX/PacketFilter.h +149 -0
  37. data/vendor/EigenRand/EigenRand/arch/AVX/RandUtils.h +228 -0
  38. data/vendor/EigenRand/EigenRand/arch/NEON/MorePacketMath.h +473 -0
  39. data/vendor/EigenRand/EigenRand/arch/NEON/PacketFilter.h +142 -0
  40. data/vendor/EigenRand/EigenRand/arch/NEON/RandUtils.h +126 -0
  41. data/vendor/EigenRand/EigenRand/arch/SSE/MorePacketMath.h +501 -0
  42. data/vendor/EigenRand/EigenRand/arch/SSE/PacketFilter.h +133 -0
  43. data/vendor/EigenRand/EigenRand/arch/SSE/RandUtils.h +120 -0
  44. data/vendor/EigenRand/EigenRand/doc.h +24 -12
  45. data/vendor/EigenRand/README.md +57 -4
  46. data/vendor/eigen/COPYING.APACHE +203 -0
  47. data/vendor/eigen/COPYING.BSD +1 -1
  48. data/vendor/eigen/COPYING.MINPACK +51 -52
  49. data/vendor/eigen/Eigen/Cholesky +0 -1
  50. data/vendor/eigen/Eigen/Core +112 -265
  51. data/vendor/eigen/Eigen/Eigenvalues +2 -3
  52. data/vendor/eigen/Eigen/Geometry +5 -8
  53. data/vendor/eigen/Eigen/Householder +0 -1
  54. data/vendor/eigen/Eigen/Jacobi +0 -1
  55. data/vendor/eigen/Eigen/KLUSupport +41 -0
  56. data/vendor/eigen/Eigen/LU +2 -5
  57. data/vendor/eigen/Eigen/OrderingMethods +0 -3
  58. data/vendor/eigen/Eigen/PaStiXSupport +1 -0
  59. data/vendor/eigen/Eigen/PardisoSupport +0 -0
  60. data/vendor/eigen/Eigen/QR +2 -3
  61. data/vendor/eigen/Eigen/QtAlignedMalloc +0 -1
  62. data/vendor/eigen/Eigen/SVD +0 -1
  63. data/vendor/eigen/Eigen/Sparse +0 -2
  64. data/vendor/eigen/Eigen/SparseCholesky +0 -8
  65. data/vendor/eigen/Eigen/SparseLU +4 -0
  66. data/vendor/eigen/Eigen/SparseQR +0 -1
  67. data/vendor/eigen/Eigen/src/Cholesky/LDLT.h +42 -27
  68. data/vendor/eigen/Eigen/src/Cholesky/LLT.h +39 -23
  69. data/vendor/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +90 -47
  70. data/vendor/eigen/Eigen/src/Core/ArithmeticSequence.h +413 -0
  71. data/vendor/eigen/Eigen/src/Core/Array.h +99 -11
  72. data/vendor/eigen/Eigen/src/Core/ArrayBase.h +3 -3
  73. data/vendor/eigen/Eigen/src/Core/ArrayWrapper.h +21 -21
  74. data/vendor/eigen/Eigen/src/Core/Assign.h +1 -1
  75. data/vendor/eigen/Eigen/src/Core/AssignEvaluator.h +125 -50
  76. data/vendor/eigen/Eigen/src/Core/Assign_MKL.h +10 -10
  77. data/vendor/eigen/Eigen/src/Core/BandMatrix.h +16 -16
  78. data/vendor/eigen/Eigen/src/Core/Block.h +56 -60
  79. data/vendor/eigen/Eigen/src/Core/BooleanRedux.h +29 -31
  80. data/vendor/eigen/Eigen/src/Core/CommaInitializer.h +7 -3
  81. data/vendor/eigen/Eigen/src/Core/CoreEvaluators.h +325 -272
  82. data/vendor/eigen/Eigen/src/Core/CoreIterators.h +5 -0
  83. data/vendor/eigen/Eigen/src/Core/CwiseBinaryOp.h +21 -22
  84. data/vendor/eigen/Eigen/src/Core/CwiseNullaryOp.h +153 -18
  85. data/vendor/eigen/Eigen/src/Core/CwiseUnaryOp.h +6 -6
  86. data/vendor/eigen/Eigen/src/Core/CwiseUnaryView.h +14 -10
  87. data/vendor/eigen/Eigen/src/Core/DenseBase.h +132 -42
  88. data/vendor/eigen/Eigen/src/Core/DenseCoeffsBase.h +25 -21
  89. data/vendor/eigen/Eigen/src/Core/DenseStorage.h +153 -71
  90. data/vendor/eigen/Eigen/src/Core/Diagonal.h +21 -23
  91. data/vendor/eigen/Eigen/src/Core/DiagonalMatrix.h +50 -2
  92. data/vendor/eigen/Eigen/src/Core/DiagonalProduct.h +1 -1
  93. data/vendor/eigen/Eigen/src/Core/Dot.h +10 -10
  94. data/vendor/eigen/Eigen/src/Core/EigenBase.h +10 -9
  95. data/vendor/eigen/Eigen/src/Core/ForceAlignedAccess.h +8 -4
  96. data/vendor/eigen/Eigen/src/Core/Fuzzy.h +3 -3
  97. data/vendor/eigen/Eigen/src/Core/GeneralProduct.h +20 -10
  98. data/vendor/eigen/Eigen/src/Core/GenericPacketMath.h +599 -152
  99. data/vendor/eigen/Eigen/src/Core/GlobalFunctions.h +40 -33
  100. data/vendor/eigen/Eigen/src/Core/IO.h +40 -7
  101. data/vendor/eigen/Eigen/src/Core/IndexedView.h +237 -0
  102. data/vendor/eigen/Eigen/src/Core/Inverse.h +9 -10
  103. data/vendor/eigen/Eigen/src/Core/Map.h +7 -7
  104. data/vendor/eigen/Eigen/src/Core/MapBase.h +10 -3
  105. data/vendor/eigen/Eigen/src/Core/MathFunctions.h +767 -125
  106. data/vendor/eigen/Eigen/src/Core/MathFunctionsImpl.h +118 -19
  107. data/vendor/eigen/Eigen/src/Core/Matrix.h +131 -25
  108. data/vendor/eigen/Eigen/src/Core/MatrixBase.h +21 -3
  109. data/vendor/eigen/Eigen/src/Core/NestByValue.h +25 -50
  110. data/vendor/eigen/Eigen/src/Core/NoAlias.h +4 -3
  111. data/vendor/eigen/Eigen/src/Core/NumTraits.h +107 -20
  112. data/vendor/eigen/Eigen/src/Core/PartialReduxEvaluator.h +232 -0
  113. data/vendor/eigen/Eigen/src/Core/PermutationMatrix.h +3 -31
  114. data/vendor/eigen/Eigen/src/Core/PlainObjectBase.h +152 -59
  115. data/vendor/eigen/Eigen/src/Core/Product.h +30 -25
  116. data/vendor/eigen/Eigen/src/Core/ProductEvaluators.h +192 -125
  117. data/vendor/eigen/Eigen/src/Core/Random.h +37 -1
  118. data/vendor/eigen/Eigen/src/Core/Redux.h +180 -170
  119. data/vendor/eigen/Eigen/src/Core/Ref.h +121 -23
  120. data/vendor/eigen/Eigen/src/Core/Replicate.h +8 -8
  121. data/vendor/eigen/Eigen/src/Core/Reshaped.h +454 -0
  122. data/vendor/eigen/Eigen/src/Core/ReturnByValue.h +7 -5
  123. data/vendor/eigen/Eigen/src/Core/Reverse.h +18 -12
  124. data/vendor/eigen/Eigen/src/Core/Select.h +8 -6
  125. data/vendor/eigen/Eigen/src/Core/SelfAdjointView.h +33 -20
  126. data/vendor/eigen/Eigen/src/Core/Solve.h +14 -14
  127. data/vendor/eigen/Eigen/src/Core/SolveTriangular.h +16 -16
  128. data/vendor/eigen/Eigen/src/Core/SolverBase.h +41 -3
  129. data/vendor/eigen/Eigen/src/Core/StableNorm.h +100 -70
  130. data/vendor/eigen/Eigen/src/Core/StlIterators.h +463 -0
  131. data/vendor/eigen/Eigen/src/Core/Stride.h +9 -4
  132. data/vendor/eigen/Eigen/src/Core/Swap.h +5 -4
  133. data/vendor/eigen/Eigen/src/Core/Transpose.h +88 -27
  134. data/vendor/eigen/Eigen/src/Core/Transpositions.h +26 -47
  135. data/vendor/eigen/Eigen/src/Core/TriangularMatrix.h +93 -75
  136. data/vendor/eigen/Eigen/src/Core/VectorBlock.h +5 -5
  137. data/vendor/eigen/Eigen/src/Core/VectorwiseOp.h +159 -70
  138. data/vendor/eigen/Eigen/src/Core/Visitor.h +137 -29
  139. data/vendor/eigen/Eigen/src/Core/arch/AVX/Complex.h +50 -129
  140. data/vendor/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +126 -337
  141. data/vendor/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +1092 -155
  142. data/vendor/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +65 -1
  143. data/vendor/eigen/Eigen/src/Core/arch/AVX512/Complex.h +422 -0
  144. data/vendor/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +207 -236
  145. data/vendor/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1482 -495
  146. data/vendor/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +89 -0
  147. data/vendor/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +152 -165
  148. data/vendor/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +19 -251
  149. data/vendor/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2937 -0
  150. data/vendor/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +221 -0
  151. data/vendor/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +629 -0
  152. data/vendor/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +2042 -392
  153. data/vendor/eigen/Eigen/src/Core/arch/CUDA/Complex.h +235 -80
  154. data/vendor/eigen/Eigen/src/Core/arch/Default/BFloat16.h +700 -0
  155. data/vendor/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +102 -14
  156. data/vendor/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1649 -0
  157. data/vendor/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +110 -0
  158. data/vendor/eigen/Eigen/src/Core/arch/Default/Half.h +942 -0
  159. data/vendor/eigen/Eigen/src/Core/arch/Default/Settings.h +1 -1
  160. data/vendor/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +120 -0
  161. data/vendor/eigen/Eigen/src/Core/arch/{CUDA → GPU}/MathFunctions.h +16 -4
  162. data/vendor/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +1685 -0
  163. data/vendor/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +80 -0
  164. data/vendor/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
  165. data/vendor/eigen/Eigen/src/Core/arch/MSA/Complex.h +648 -0
  166. data/vendor/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +387 -0
  167. data/vendor/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +1233 -0
  168. data/vendor/eigen/Eigen/src/Core/arch/NEON/Complex.h +313 -219
  169. data/vendor/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +183 -0
  170. data/vendor/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +54 -70
  171. data/vendor/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4376 -549
  172. data/vendor/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +1419 -0
  173. data/vendor/eigen/Eigen/src/Core/arch/SSE/Complex.h +59 -179
  174. data/vendor/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +65 -428
  175. data/vendor/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +893 -283
  176. data/vendor/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +65 -0
  177. data/vendor/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +44 -0
  178. data/vendor/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +752 -0
  179. data/vendor/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +49 -0
  180. data/vendor/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +232 -0
  181. data/vendor/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +301 -0
  182. data/vendor/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +670 -0
  183. data/vendor/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +694 -0
  184. data/vendor/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +85 -0
  185. data/vendor/eigen/Eigen/src/Core/arch/ZVector/Complex.h +212 -183
  186. data/vendor/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +101 -5
  187. data/vendor/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +510 -395
  188. data/vendor/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +11 -2
  189. data/vendor/eigen/Eigen/src/Core/functors/BinaryFunctors.h +112 -46
  190. data/vendor/eigen/Eigen/src/Core/functors/NullaryFunctors.h +31 -30
  191. data/vendor/eigen/Eigen/src/Core/functors/StlFunctors.h +32 -2
  192. data/vendor/eigen/Eigen/src/Core/functors/UnaryFunctors.h +355 -16
  193. data/vendor/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1075 -586
  194. data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +49 -24
  195. data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +41 -35
  196. data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +6 -6
  197. data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +4 -2
  198. data/vendor/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +382 -483
  199. data/vendor/eigen/Eigen/src/Core/products/Parallelizer.h +22 -5
  200. data/vendor/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +53 -30
  201. data/vendor/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +16 -8
  202. data/vendor/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +8 -6
  203. data/vendor/eigen/Eigen/src/Core/products/SelfadjointProduct.h +4 -4
  204. data/vendor/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +5 -4
  205. data/vendor/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +33 -27
  206. data/vendor/eigen/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +14 -12
  207. data/vendor/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +36 -34
  208. data/vendor/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +8 -4
  209. data/vendor/eigen/Eigen/src/Core/products/TriangularSolverVector.h +13 -10
  210. data/vendor/eigen/Eigen/src/Core/util/BlasUtil.h +304 -119
  211. data/vendor/eigen/Eigen/src/Core/util/ConfigureVectorization.h +512 -0
  212. data/vendor/eigen/Eigen/src/Core/util/Constants.h +25 -9
  213. data/vendor/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +26 -3
  214. data/vendor/eigen/Eigen/src/Core/util/ForwardDeclarations.h +29 -9
  215. data/vendor/eigen/Eigen/src/Core/util/IndexedViewHelper.h +186 -0
  216. data/vendor/eigen/Eigen/src/Core/util/IntegralConstant.h +272 -0
  217. data/vendor/eigen/Eigen/src/Core/util/MKL_support.h +8 -1
  218. data/vendor/eigen/Eigen/src/Core/util/Macros.h +709 -246
  219. data/vendor/eigen/Eigen/src/Core/util/Memory.h +222 -52
  220. data/vendor/eigen/Eigen/src/Core/util/Meta.h +355 -77
  221. data/vendor/eigen/Eigen/src/Core/util/ReenableStupidWarnings.h +5 -1
  222. data/vendor/eigen/Eigen/src/Core/util/ReshapedHelper.h +51 -0
  223. data/vendor/eigen/Eigen/src/Core/util/StaticAssert.h +8 -5
  224. data/vendor/eigen/Eigen/src/Core/util/SymbolicIndex.h +293 -0
  225. data/vendor/eigen/Eigen/src/Core/util/XprHelper.h +65 -30
  226. data/vendor/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +1 -1
  227. data/vendor/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +7 -4
  228. data/vendor/eigen/Eigen/src/Eigenvalues/EigenSolver.h +2 -2
  229. data/vendor/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +1 -1
  230. data/vendor/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +2 -2
  231. data/vendor/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +2 -2
  232. data/vendor/eigen/Eigen/src/Eigenvalues/RealQZ.h +9 -6
  233. data/vendor/eigen/Eigen/src/Eigenvalues/RealSchur.h +21 -9
  234. data/vendor/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +77 -43
  235. data/vendor/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +20 -15
  236. data/vendor/eigen/Eigen/src/Geometry/AlignedBox.h +99 -5
  237. data/vendor/eigen/Eigen/src/Geometry/AngleAxis.h +4 -4
  238. data/vendor/eigen/Eigen/src/Geometry/EulerAngles.h +3 -3
  239. data/vendor/eigen/Eigen/src/Geometry/Homogeneous.h +15 -11
  240. data/vendor/eigen/Eigen/src/Geometry/Hyperplane.h +1 -1
  241. data/vendor/eigen/Eigen/src/Geometry/OrthoMethods.h +3 -2
  242. data/vendor/eigen/Eigen/src/Geometry/ParametrizedLine.h +39 -2
  243. data/vendor/eigen/Eigen/src/Geometry/Quaternion.h +70 -14
  244. data/vendor/eigen/Eigen/src/Geometry/Rotation2D.h +3 -3
  245. data/vendor/eigen/Eigen/src/Geometry/Scaling.h +23 -5
  246. data/vendor/eigen/Eigen/src/Geometry/Transform.h +88 -67
  247. data/vendor/eigen/Eigen/src/Geometry/Translation.h +6 -12
  248. data/vendor/eigen/Eigen/src/Geometry/Umeyama.h +1 -1
  249. data/vendor/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +168 -0
  250. data/vendor/eigen/Eigen/src/Householder/BlockHouseholder.h +9 -2
  251. data/vendor/eigen/Eigen/src/Householder/Householder.h +8 -4
  252. data/vendor/eigen/Eigen/src/Householder/HouseholderSequence.h +123 -48
  253. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +15 -15
  254. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +7 -23
  255. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +5 -22
  256. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +41 -47
  257. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +51 -60
  258. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +70 -20
  259. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +2 -20
  260. data/vendor/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +11 -9
  261. data/vendor/eigen/Eigen/src/Jacobi/Jacobi.h +31 -10
  262. data/vendor/eigen/Eigen/src/KLUSupport/KLUSupport.h +358 -0
  263. data/vendor/eigen/Eigen/src/LU/Determinant.h +35 -19
  264. data/vendor/eigen/Eigen/src/LU/FullPivLU.h +29 -43
  265. data/vendor/eigen/Eigen/src/LU/InverseImpl.h +25 -8
  266. data/vendor/eigen/Eigen/src/LU/PartialPivLU.h +71 -58
  267. data/vendor/eigen/Eigen/src/LU/arch/InverseSize4.h +351 -0
  268. data/vendor/eigen/Eigen/src/OrderingMethods/Amd.h +7 -17
  269. data/vendor/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +297 -277
  270. data/vendor/eigen/Eigen/src/OrderingMethods/Ordering.h +6 -10
  271. data/vendor/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +1 -1
  272. data/vendor/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +9 -7
  273. data/vendor/eigen/Eigen/src/QR/ColPivHouseholderQR.h +41 -20
  274. data/vendor/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +100 -27
  275. data/vendor/eigen/Eigen/src/QR/FullPivHouseholderQR.h +59 -22
  276. data/vendor/eigen/Eigen/src/QR/HouseholderQR.h +48 -23
  277. data/vendor/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +25 -3
  278. data/vendor/eigen/Eigen/src/SVD/BDCSVD.h +183 -63
  279. data/vendor/eigen/Eigen/src/SVD/JacobiSVD.h +22 -14
  280. data/vendor/eigen/Eigen/src/SVD/SVDBase.h +83 -22
  281. data/vendor/eigen/Eigen/src/SVD/UpperBidiagonalization.h +3 -3
  282. data/vendor/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +17 -9
  283. data/vendor/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +12 -37
  284. data/vendor/eigen/Eigen/src/SparseCore/AmbiVector.h +3 -2
  285. data/vendor/eigen/Eigen/src/SparseCore/CompressedStorage.h +16 -0
  286. data/vendor/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +6 -6
  287. data/vendor/eigen/Eigen/src/SparseCore/SparseAssign.h +81 -27
  288. data/vendor/eigen/Eigen/src/SparseCore/SparseBlock.h +25 -57
  289. data/vendor/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +40 -11
  290. data/vendor/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +11 -15
  291. data/vendor/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +4 -2
  292. data/vendor/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +30 -8
  293. data/vendor/eigen/Eigen/src/SparseCore/SparseMatrix.h +126 -11
  294. data/vendor/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +5 -12
  295. data/vendor/eigen/Eigen/src/SparseCore/SparseProduct.h +13 -1
  296. data/vendor/eigen/Eigen/src/SparseCore/SparseRef.h +7 -7
  297. data/vendor/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +5 -2
  298. data/vendor/eigen/Eigen/src/SparseCore/SparseUtil.h +8 -0
  299. data/vendor/eigen/Eigen/src/SparseCore/SparseVector.h +1 -1
  300. data/vendor/eigen/Eigen/src/SparseCore/SparseView.h +1 -0
  301. data/vendor/eigen/Eigen/src/SparseLU/SparseLU.h +162 -12
  302. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +1 -1
  303. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +76 -2
  304. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +2 -2
  305. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +1 -1
  306. data/vendor/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +1 -1
  307. data/vendor/eigen/Eigen/src/SparseQR/SparseQR.h +19 -6
  308. data/vendor/eigen/Eigen/src/StlSupport/StdDeque.h +2 -12
  309. data/vendor/eigen/Eigen/src/StlSupport/StdList.h +2 -2
  310. data/vendor/eigen/Eigen/src/StlSupport/StdVector.h +2 -2
  311. data/vendor/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +6 -8
  312. data/vendor/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +175 -39
  313. data/vendor/eigen/Eigen/src/misc/lapacke.h +5 -4
  314. data/vendor/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +28 -2
  315. data/vendor/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +155 -11
  316. data/vendor/eigen/Eigen/src/plugins/BlockMethods.h +626 -242
  317. data/vendor/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +14 -0
  318. data/vendor/eigen/Eigen/src/plugins/IndexedViewMethods.h +262 -0
  319. data/vendor/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +4 -4
  320. data/vendor/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +10 -0
  321. data/vendor/eigen/Eigen/src/plugins/ReshapedMethods.h +149 -0
  322. data/vendor/eigen/README.md +2 -0
  323. data/vendor/eigen/bench/btl/README +1 -1
  324. data/vendor/eigen/bench/tensors/README +6 -7
  325. data/vendor/eigen/ci/README.md +56 -0
  326. data/vendor/eigen/demos/mix_eigen_and_c/README +1 -1
  327. data/vendor/eigen/unsupported/Eigen/CXX11/src/Tensor/README.md +213 -158
  328. data/vendor/eigen/unsupported/README.txt +1 -1
  329. data/vendor/tomotopy/README.kr.rst +78 -0
  330. data/vendor/tomotopy/README.rst +75 -0
  331. data/vendor/tomotopy/src/Labeling/FoRelevance.cpp +2 -2
  332. data/vendor/tomotopy/src/Labeling/Phraser.hpp +4 -4
  333. data/vendor/tomotopy/src/TopicModel/CTModel.hpp +7 -3
  334. data/vendor/tomotopy/src/TopicModel/DMRModel.hpp +7 -3
  335. data/vendor/tomotopy/src/TopicModel/DTModel.hpp +6 -3
  336. data/vendor/tomotopy/src/TopicModel/GDMRModel.hpp +2 -2
  337. data/vendor/tomotopy/src/TopicModel/HDP.h +1 -0
  338. data/vendor/tomotopy/src/TopicModel/HDPModel.hpp +57 -6
  339. data/vendor/tomotopy/src/TopicModel/HLDAModel.hpp +6 -3
  340. data/vendor/tomotopy/src/TopicModel/HPAModel.hpp +3 -2
  341. data/vendor/tomotopy/src/TopicModel/LDA.h +3 -3
  342. data/vendor/tomotopy/src/TopicModel/LDACVB0Model.hpp +5 -5
  343. data/vendor/tomotopy/src/TopicModel/LDAModel.hpp +50 -19
  344. data/vendor/tomotopy/src/TopicModel/LLDAModel.hpp +6 -2
  345. data/vendor/tomotopy/src/TopicModel/MGLDAModel.hpp +3 -2
  346. data/vendor/tomotopy/src/TopicModel/PAModel.hpp +1 -1
  347. data/vendor/tomotopy/src/TopicModel/PLDAModel.hpp +6 -2
  348. data/vendor/tomotopy/src/TopicModel/PT.h +3 -1
  349. data/vendor/tomotopy/src/TopicModel/PTModel.hpp +36 -3
  350. data/vendor/tomotopy/src/TopicModel/SLDAModel.hpp +6 -3
  351. data/vendor/tomotopy/src/TopicModel/TopicModel.hpp +55 -26
  352. data/vendor/tomotopy/src/Utils/AliasMethod.hpp +5 -4
  353. data/vendor/tomotopy/src/Utils/Dictionary.h +2 -2
  354. data/vendor/tomotopy/src/Utils/EigenAddonOps.hpp +36 -1
  355. data/vendor/tomotopy/src/Utils/MultiNormalDistribution.hpp +1 -1
  356. data/vendor/tomotopy/src/Utils/TruncMultiNormal.hpp +1 -1
  357. data/vendor/tomotopy/src/Utils/exception.h +6 -0
  358. data/vendor/tomotopy/src/Utils/math.h +2 -2
  359. data/vendor/tomotopy/src/Utils/sample.hpp +14 -12
  360. data/vendor/tomotopy/src/Utils/serializer.hpp +30 -5
  361. data/vendor/tomotopy/src/Utils/sse_gamma.h +0 -3
  362. metadata +64 -18
  363. data/vendor/eigen/Eigen/CMakeLists.txt +0 -19
  364. data/vendor/eigen/Eigen/src/Core/arch/CUDA/Half.h +0 -674
  365. data/vendor/eigen/Eigen/src/Core/arch/CUDA/PacketMath.h +0 -333
  366. data/vendor/eigen/Eigen/src/Core/arch/CUDA/PacketMathHalf.h +0 -1124
  367. data/vendor/eigen/Eigen/src/Core/arch/CUDA/TypeCasting.h +0 -212
  368. data/vendor/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h +0 -161
  369. data/vendor/eigen/Eigen/src/LU/arch/Inverse_SSE.h +0 -338
@@ -164,7 +164,7 @@ public:
164
164
  }
165
165
  else
166
166
  {
167
- if(m_matrix.isCompressed())
167
+ if(m_matrix.isCompressed() && nnz!=block_size)
168
168
  {
169
169
  // no need to realloc, simply copy the tail at its respective position and insert tmp
170
170
  matrix.data().resize(start + nnz + tail_size);
@@ -326,46 +326,6 @@ private:
326
326
 
327
327
  //----------
328
328
 
329
- /** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
330
- * is col-major (resp. row-major).
331
- */
332
- template<typename Derived>
333
- typename SparseMatrixBase<Derived>::InnerVectorReturnType SparseMatrixBase<Derived>::innerVector(Index outer)
334
- { return InnerVectorReturnType(derived(), outer); }
335
-
336
- /** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
337
- * is col-major (resp. row-major). Read-only.
338
- */
339
- template<typename Derived>
340
- const typename SparseMatrixBase<Derived>::ConstInnerVectorReturnType SparseMatrixBase<Derived>::innerVector(Index outer) const
341
- { return ConstInnerVectorReturnType(derived(), outer); }
342
-
343
- /** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
344
- * is col-major (resp. row-major).
345
- */
346
- template<typename Derived>
347
- typename SparseMatrixBase<Derived>::InnerVectorsReturnType
348
- SparseMatrixBase<Derived>::innerVectors(Index outerStart, Index outerSize)
349
- {
350
- return Block<Derived,Dynamic,Dynamic,true>(derived(),
351
- IsRowMajor ? outerStart : 0, IsRowMajor ? 0 : outerStart,
352
- IsRowMajor ? outerSize : rows(), IsRowMajor ? cols() : outerSize);
353
-
354
- }
355
-
356
- /** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
357
- * is col-major (resp. row-major). Read-only.
358
- */
359
- template<typename Derived>
360
- const typename SparseMatrixBase<Derived>::ConstInnerVectorsReturnType
361
- SparseMatrixBase<Derived>::innerVectors(Index outerStart, Index outerSize) const
362
- {
363
- return Block<const Derived,Dynamic,Dynamic,true>(derived(),
364
- IsRowMajor ? outerStart : 0, IsRowMajor ? 0 : outerStart,
365
- IsRowMajor ? outerSize : rows(), IsRowMajor ? cols() : outerSize);
366
-
367
- }
368
-
369
329
  /** Generic implementation of sparse Block expression.
370
330
  * Real-only.
371
331
  */
@@ -486,9 +446,13 @@ struct unary_evaluator<Block<ArgType,BlockRows,BlockCols,InnerPanel>, IteratorBa
486
446
  {}
487
447
 
488
448
  inline Index nonZerosEstimate() const {
489
- Index nnz = m_block.nonZeros();
490
- if(nnz<0)
491
- return m_argImpl.nonZerosEstimate() * m_block.size() / m_block.nestedExpression().size();
449
+ const Index nnz = m_block.nonZeros();
450
+ if(nnz < 0) {
451
+ // Scale the non-zero estimate for the underlying expression linearly with block size.
452
+ // Return zero if the underlying block is empty.
453
+ const Index nested_sz = m_block.nestedExpression().size();
454
+ return nested_sz == 0 ? 0 : m_argImpl.nonZerosEstimate() * m_block.size() / nested_sz;
455
+ }
492
456
  return nnz;
493
457
  }
494
458
 
@@ -503,22 +467,25 @@ template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
503
467
  class unary_evaluator<Block<ArgType,BlockRows,BlockCols,InnerPanel>, IteratorBased>::InnerVectorInnerIterator
504
468
  : public EvalIterator
505
469
  {
506
- enum { IsRowMajor = unary_evaluator::IsRowMajor };
470
+ // NOTE MSVC fails to compile if we don't explicitely "import" IsRowMajor from unary_evaluator
471
+ // because the base class EvalIterator has a private IsRowMajor enum too. (bug #1786)
472
+ // NOTE We cannot call it IsRowMajor because it would shadow unary_evaluator::IsRowMajor
473
+ enum { XprIsRowMajor = unary_evaluator::IsRowMajor };
507
474
  const XprType& m_block;
508
475
  Index m_end;
509
476
  public:
510
477
 
511
478
  EIGEN_STRONG_INLINE InnerVectorInnerIterator(const unary_evaluator& aEval, Index outer)
512
- : EvalIterator(aEval.m_argImpl, outer + (IsRowMajor ? aEval.m_block.startRow() : aEval.m_block.startCol())),
479
+ : EvalIterator(aEval.m_argImpl, outer + (XprIsRowMajor ? aEval.m_block.startRow() : aEval.m_block.startCol())),
513
480
  m_block(aEval.m_block),
514
- m_end(IsRowMajor ? aEval.m_block.startCol()+aEval.m_block.blockCols() : aEval.m_block.startRow()+aEval.m_block.blockRows())
481
+ m_end(XprIsRowMajor ? aEval.m_block.startCol()+aEval.m_block.blockCols() : aEval.m_block.startRow()+aEval.m_block.blockRows())
515
482
  {
516
- while( (EvalIterator::operator bool()) && (EvalIterator::index() < (IsRowMajor ? m_block.startCol() : m_block.startRow())) )
483
+ while( (EvalIterator::operator bool()) && (EvalIterator::index() < (XprIsRowMajor ? m_block.startCol() : m_block.startRow())) )
517
484
  EvalIterator::operator++();
518
485
  }
519
486
 
520
- inline StorageIndex index() const { return EvalIterator::index() - convert_index<StorageIndex>(IsRowMajor ? m_block.startCol() : m_block.startRow()); }
521
- inline Index outer() const { return EvalIterator::outer() - (IsRowMajor ? m_block.startRow() : m_block.startCol()); }
487
+ inline StorageIndex index() const { return EvalIterator::index() - convert_index<StorageIndex>(XprIsRowMajor ? m_block.startCol() : m_block.startRow()); }
488
+ inline Index outer() const { return EvalIterator::outer() - (XprIsRowMajor ? m_block.startRow() : m_block.startCol()); }
522
489
  inline Index row() const { return EvalIterator::row() - m_block.startRow(); }
523
490
  inline Index col() const { return EvalIterator::col() - m_block.startCol(); }
524
491
 
@@ -528,7 +495,8 @@ public:
528
495
  template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
529
496
  class unary_evaluator<Block<ArgType,BlockRows,BlockCols,InnerPanel>, IteratorBased>::OuterVectorInnerIterator
530
497
  {
531
- enum { IsRowMajor = unary_evaluator::IsRowMajor };
498
+ // NOTE see above
499
+ enum { XprIsRowMajor = unary_evaluator::IsRowMajor };
532
500
  const unary_evaluator& m_eval;
533
501
  Index m_outerPos;
534
502
  const Index m_innerIndex;
@@ -538,9 +506,9 @@ public:
538
506
 
539
507
  EIGEN_STRONG_INLINE OuterVectorInnerIterator(const unary_evaluator& aEval, Index outer)
540
508
  : m_eval(aEval),
541
- m_outerPos( (IsRowMajor ? aEval.m_block.startCol() : aEval.m_block.startRow()) ),
542
- m_innerIndex(IsRowMajor ? aEval.m_block.startRow() : aEval.m_block.startCol()),
543
- m_end(IsRowMajor ? aEval.m_block.startCol()+aEval.m_block.blockCols() : aEval.m_block.startRow()+aEval.m_block.blockRows()),
509
+ m_outerPos( (XprIsRowMajor ? aEval.m_block.startCol() : aEval.m_block.startRow()) ),
510
+ m_innerIndex(XprIsRowMajor ? aEval.m_block.startRow() : aEval.m_block.startCol()),
511
+ m_end(XprIsRowMajor ? aEval.m_block.startCol()+aEval.m_block.blockCols() : aEval.m_block.startRow()+aEval.m_block.blockRows()),
544
512
  m_it(m_eval.m_argImpl, m_outerPos)
545
513
  {
546
514
  EIGEN_UNUSED_VARIABLE(outer);
@@ -551,10 +519,10 @@ public:
551
519
  ++(*this);
552
520
  }
553
521
 
554
- inline StorageIndex index() const { return convert_index<StorageIndex>(m_outerPos - (IsRowMajor ? m_eval.m_block.startCol() : m_eval.m_block.startRow())); }
522
+ inline StorageIndex index() const { return convert_index<StorageIndex>(m_outerPos - (XprIsRowMajor ? m_eval.m_block.startCol() : m_eval.m_block.startRow())); }
555
523
  inline Index outer() const { return 0; }
556
- inline Index row() const { return IsRowMajor ? 0 : index(); }
557
- inline Index col() const { return IsRowMajor ? index() : 0; }
524
+ inline Index row() const { return XprIsRowMajor ? 0 : index(); }
525
+ inline Index col() const { return XprIsRowMajor ? index() : 0; }
558
526
 
559
527
  inline Scalar value() const { return m_it.value(); }
560
528
  inline Scalar& valueRef() { return m_it.valueRef(); }
@@ -128,6 +128,28 @@ class SparseCompressedBase
128
128
  protected:
129
129
  /** Default constructor. Do nothing. */
130
130
  SparseCompressedBase() {}
131
+
132
+ /** \internal return the index of the coeff at (row,col) or just before if it does not exist.
133
+ * This is an analogue of std::lower_bound.
134
+ */
135
+ internal::LowerBoundIndex lower_bound(Index row, Index col) const
136
+ {
137
+ eigen_internal_assert(row>=0 && row<this->rows() && col>=0 && col<this->cols());
138
+
139
+ const Index outer = Derived::IsRowMajor ? row : col;
140
+ const Index inner = Derived::IsRowMajor ? col : row;
141
+
142
+ Index start = this->outerIndexPtr()[outer];
143
+ Index end = this->isCompressed() ? this->outerIndexPtr()[outer+1] : this->outerIndexPtr()[outer] + this->innerNonZeroPtr()[outer];
144
+ eigen_assert(end>=start && "you are using a non finalized sparse matrix or written coefficient does not exist");
145
+ internal::LowerBoundIndex p;
146
+ p.value = std::lower_bound(this->innerIndexPtr()+start, this->innerIndexPtr()+end,inner) - this->innerIndexPtr();
147
+ p.found = (p.value<end) && (this->innerIndexPtr()[p.value]==inner);
148
+ return p;
149
+ }
150
+
151
+ friend struct internal::evaluator<SparseCompressedBase<Derived> >;
152
+
131
153
  private:
132
154
  template<typename OtherDerived> explicit SparseCompressedBase(const SparseCompressedBase<OtherDerived>&);
133
155
  };
@@ -185,6 +207,14 @@ class SparseCompressedBase<Derived>::InnerIterator
185
207
  }
186
208
 
187
209
  inline InnerIterator& operator++() { m_id++; return *this; }
210
+ inline InnerIterator& operator+=(Index i) { m_id += i ; return *this; }
211
+
212
+ inline InnerIterator operator+(Index i)
213
+ {
214
+ InnerIterator result = *this;
215
+ result += i;
216
+ return result;
217
+ }
188
218
 
189
219
  inline const Scalar& value() const { return m_values[m_id]; }
190
220
  inline Scalar& valueRef() { return const_cast<Scalar&>(m_values[m_id]); }
@@ -245,6 +275,14 @@ class SparseCompressedBase<Derived>::ReverseInnerIterator
245
275
  }
246
276
 
247
277
  inline ReverseInnerIterator& operator--() { --m_id; return *this; }
278
+ inline ReverseInnerIterator& operator-=(Index i) { m_id -= i; return *this; }
279
+
280
+ inline ReverseInnerIterator operator-(Index i)
281
+ {
282
+ ReverseInnerIterator result = *this;
283
+ result -= i;
284
+ return result;
285
+ }
248
286
 
249
287
  inline const Scalar& value() const { return m_values[m_id-1]; }
250
288
  inline Scalar& valueRef() { return const_cast<Scalar&>(m_values[m_id-1]); }
@@ -317,17 +355,8 @@ protected:
317
355
 
318
356
  Index find(Index row, Index col) const
319
357
  {
320
- eigen_internal_assert(row>=0 && row<m_matrix->rows() && col>=0 && col<m_matrix->cols());
321
-
322
- const Index outer = Derived::IsRowMajor ? row : col;
323
- const Index inner = Derived::IsRowMajor ? col : row;
324
-
325
- Index start = m_matrix->outerIndexPtr()[outer];
326
- Index end = m_matrix->isCompressed() ? m_matrix->outerIndexPtr()[outer+1] : m_matrix->outerIndexPtr()[outer] + m_matrix->innerNonZeroPtr()[outer];
327
- eigen_assert(end>=start && "you are using a non finalized sparse matrix or written coefficient does not exist");
328
- const Index p = std::lower_bound(m_matrix->innerIndexPtr()+start, m_matrix->innerIndexPtr()+end,inner) - m_matrix->innerIndexPtr();
329
-
330
- return ((p<end) && (m_matrix->innerIndexPtr()[p]==inner)) ? p : Dynamic;
358
+ internal::LowerBoundIndex p = m_matrix->lower_bound(row,col);
359
+ return p.found ? p.value : Dynamic;
331
360
  }
332
361
 
333
362
  const Derived *m_matrix;
@@ -101,7 +101,7 @@ public:
101
101
  }
102
102
  else
103
103
  {
104
- m_value = 0; // this is to avoid a compilation warning
104
+ m_value = Scalar(0); // this is to avoid a compilation warning
105
105
  m_id = -1;
106
106
  }
107
107
  return *this;
@@ -126,7 +126,7 @@ public:
126
126
 
127
127
 
128
128
  enum {
129
- CoeffReadCost = evaluator<Lhs>::CoeffReadCost + evaluator<Rhs>::CoeffReadCost + functor_traits<BinaryOp>::Cost,
129
+ CoeffReadCost = int(evaluator<Lhs>::CoeffReadCost) + int(evaluator<Rhs>::CoeffReadCost) + int(functor_traits<BinaryOp>::Cost),
130
130
  Flags = XprType::Flags
131
131
  };
132
132
 
@@ -211,9 +211,8 @@ public:
211
211
 
212
212
 
213
213
  enum {
214
- CoeffReadCost = evaluator<Lhs>::CoeffReadCost + evaluator<Rhs>::CoeffReadCost + functor_traits<BinaryOp>::Cost,
215
- // Expose storage order of the sparse expression
216
- Flags = (XprType::Flags & ~RowMajorBit) | (int(Rhs::Flags)&RowMajorBit)
214
+ CoeffReadCost = int(evaluator<Lhs>::CoeffReadCost) + int(evaluator<Rhs>::CoeffReadCost) + int(functor_traits<BinaryOp>::Cost),
215
+ Flags = XprType::Flags
217
216
  };
218
217
 
219
218
  explicit binary_evaluator(const XprType& xpr)
@@ -299,9 +298,8 @@ public:
299
298
 
300
299
 
301
300
  enum {
302
- CoeffReadCost = evaluator<Lhs>::CoeffReadCost + evaluator<Rhs>::CoeffReadCost + functor_traits<BinaryOp>::Cost,
303
- // Expose storage order of the sparse expression
304
- Flags = (XprType::Flags & ~RowMajorBit) | (int(Lhs::Flags)&RowMajorBit)
301
+ CoeffReadCost = int(evaluator<Lhs>::CoeffReadCost) + int(evaluator<Rhs>::CoeffReadCost) + int(functor_traits<BinaryOp>::Cost),
302
+ Flags = XprType::Flags
305
303
  };
306
304
 
307
305
  explicit binary_evaluator(const XprType& xpr)
@@ -459,7 +457,7 @@ public:
459
457
 
460
458
 
461
459
  enum {
462
- CoeffReadCost = evaluator<LhsArg>::CoeffReadCost + evaluator<RhsArg>::CoeffReadCost + functor_traits<BinaryOp>::Cost,
460
+ CoeffReadCost = int(evaluator<LhsArg>::CoeffReadCost) + int(evaluator<RhsArg>::CoeffReadCost) + int(functor_traits<BinaryOp>::Cost),
463
461
  Flags = XprType::Flags
464
462
  };
465
463
 
@@ -532,9 +530,8 @@ public:
532
530
 
533
531
 
534
532
  enum {
535
- CoeffReadCost = evaluator<LhsArg>::CoeffReadCost + evaluator<RhsArg>::CoeffReadCost + functor_traits<BinaryOp>::Cost,
536
- // Expose storage order of the sparse expression
537
- Flags = (XprType::Flags & ~RowMajorBit) | (int(RhsArg::Flags)&RowMajorBit)
533
+ CoeffReadCost = int(evaluator<LhsArg>::CoeffReadCost) + int(evaluator<RhsArg>::CoeffReadCost) + int(functor_traits<BinaryOp>::Cost),
534
+ Flags = XprType::Flags
538
535
  };
539
536
 
540
537
  explicit sparse_conjunction_evaluator(const XprType& xpr)
@@ -607,9 +604,8 @@ public:
607
604
 
608
605
 
609
606
  enum {
610
- CoeffReadCost = evaluator<LhsArg>::CoeffReadCost + evaluator<RhsArg>::CoeffReadCost + functor_traits<BinaryOp>::Cost,
611
- // Expose storage order of the sparse expression
612
- Flags = (XprType::Flags & ~RowMajorBit) | (int(LhsArg::Flags)&RowMajorBit)
607
+ CoeffReadCost = int(evaluator<LhsArg>::CoeffReadCost) + int(evaluator<RhsArg>::CoeffReadCost) + int(functor_traits<BinaryOp>::Cost),
608
+ Flags = XprType::Flags
613
609
  };
614
610
 
615
611
  explicit sparse_conjunction_evaluator(const XprType& xpr)
@@ -24,7 +24,7 @@ struct unary_evaluator<CwiseUnaryOp<UnaryOp,ArgType>, IteratorBased>
24
24
  class InnerIterator;
25
25
 
26
26
  enum {
27
- CoeffReadCost = evaluator<ArgType>::CoeffReadCost + functor_traits<UnaryOp>::Cost,
27
+ CoeffReadCost = int(evaluator<ArgType>::CoeffReadCost) + int(functor_traits<UnaryOp>::Cost),
28
28
  Flags = XprType::Flags
29
29
  };
30
30
 
@@ -49,6 +49,7 @@ template<typename UnaryOp, typename ArgType>
49
49
  class unary_evaluator<CwiseUnaryOp<UnaryOp,ArgType>, IteratorBased>::InnerIterator
50
50
  : public unary_evaluator<CwiseUnaryOp<UnaryOp,ArgType>, IteratorBased>::EvalIterator
51
51
  {
52
+ protected:
52
53
  typedef typename XprType::Scalar Scalar;
53
54
  typedef typename unary_evaluator<CwiseUnaryOp<UnaryOp,ArgType>, IteratorBased>::EvalIterator Base;
54
55
  public:
@@ -78,7 +79,7 @@ struct unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>
78
79
  class InnerIterator;
79
80
 
80
81
  enum {
81
- CoeffReadCost = evaluator<ArgType>::CoeffReadCost + functor_traits<ViewOp>::Cost,
82
+ CoeffReadCost = int(evaluator<ArgType>::CoeffReadCost) + int(functor_traits<ViewOp>::Cost),
82
83
  Flags = XprType::Flags
83
84
  };
84
85
 
@@ -99,6 +100,7 @@ template<typename ViewOp, typename ArgType>
99
100
  class unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>::InnerIterator
100
101
  : public unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>::EvalIterator
101
102
  {
103
+ protected:
102
104
  typedef typename XprType::Scalar Scalar;
103
105
  typedef typename unary_evaluator<CwiseUnaryView<ViewOp,ArgType>, IteratorBased>::EvalIterator Base;
104
106
  public:
@@ -88,10 +88,11 @@ struct sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType, A
88
88
  typedef typename internal::remove_all<SparseLhsType>::type Lhs;
89
89
  typedef typename internal::remove_all<DenseRhsType>::type Rhs;
90
90
  typedef typename internal::remove_all<DenseResType>::type Res;
91
- typedef typename evaluator<Lhs>::InnerIterator LhsInnerIterator;
91
+ typedef evaluator<Lhs> LhsEval;
92
+ typedef typename LhsEval::InnerIterator LhsInnerIterator;
92
93
  static void run(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const AlphaType& alpha)
93
94
  {
94
- evaluator<Lhs> lhsEval(lhs);
95
+ LhsEval lhsEval(lhs);
95
96
  for(Index c=0; c<rhs.cols(); ++c)
96
97
  {
97
98
  for(Index j=0; j<lhs.outerSize(); ++j)
@@ -111,17 +112,38 @@ struct sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType, t
111
112
  typedef typename internal::remove_all<SparseLhsType>::type Lhs;
112
113
  typedef typename internal::remove_all<DenseRhsType>::type Rhs;
113
114
  typedef typename internal::remove_all<DenseResType>::type Res;
114
- typedef typename evaluator<Lhs>::InnerIterator LhsInnerIterator;
115
+ typedef evaluator<Lhs> LhsEval;
116
+ typedef typename LhsEval::InnerIterator LhsInnerIterator;
115
117
  static void run(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const typename Res::Scalar& alpha)
116
118
  {
117
- evaluator<Lhs> lhsEval(lhs);
118
- for(Index j=0; j<lhs.outerSize(); ++j)
119
+ Index n = lhs.rows();
120
+ LhsEval lhsEval(lhs);
121
+
122
+ #ifdef EIGEN_HAS_OPENMP
123
+ Eigen::initParallel();
124
+ Index threads = Eigen::nbThreads();
125
+ // This 20000 threshold has been found experimentally on 2D and 3D Poisson problems.
126
+ // It basically represents the minimal amount of work to be done to be worth it.
127
+ if(threads>1 && lhsEval.nonZerosEstimate()*rhs.cols() > 20000)
119
128
  {
120
- typename Res::RowXpr res_j(res.row(j));
121
- for(LhsInnerIterator it(lhsEval,j); it ;++it)
122
- res_j += (alpha*it.value()) * rhs.row(it.index());
129
+ #pragma omp parallel for schedule(dynamic,(n+threads*4-1)/(threads*4)) num_threads(threads)
130
+ for(Index i=0; i<n; ++i)
131
+ processRow(lhsEval,rhs,res,alpha,i);
132
+ }
133
+ else
134
+ #endif
135
+ {
136
+ for(Index i=0; i<n; ++i)
137
+ processRow(lhsEval, rhs, res, alpha, i);
123
138
  }
124
139
  }
140
+
141
+ static void processRow(const LhsEval& lhsEval, const DenseRhsType& rhs, Res& res, const typename Res::Scalar& alpha, Index i)
142
+ {
143
+ typename Res::RowXpr res_i(res.row(i));
144
+ for(LhsInnerIterator it(lhsEval,i); it ;++it)
145
+ res_i += (alpha*it.value()) * rhs.row(it.index());
146
+ }
125
147
  };
126
148
 
127
149
  template<typename SparseLhsType, typename DenseRhsType, typename DenseResType>
@@ -21,7 +21,7 @@ namespace Eigen {
21
21
  * This class implements a more versatile variants of the common \em compressed row/column storage format.
22
22
  * Each colmun's (resp. row) non zeros are stored as a pair of value with associated row (resp. colmiun) index.
23
23
  * All the non zeros are stored in a single large buffer. Unlike the \em compressed format, there might be extra
24
- * space inbetween the nonzeros of two successive colmuns (resp. rows) such that insertion of new non-zero
24
+ * space in between the nonzeros of two successive colmuns (resp. rows) such that insertion of new non-zero
25
25
  * can be done with limited memory reallocation and copies.
26
26
  *
27
27
  * A call to the function makeCompressed() turns the matrix into the standard \em compressed format
@@ -99,6 +99,8 @@ class SparseMatrix
99
99
  typedef SparseCompressedBase<SparseMatrix> Base;
100
100
  using Base::convert_index;
101
101
  friend class SparseVector<_Scalar,0,_StorageIndex>;
102
+ template<typename, typename, typename, typename, typename>
103
+ friend struct internal::Assignment;
102
104
  public:
103
105
  using Base::isCompressed;
104
106
  using Base::nonZeros;
@@ -327,7 +329,8 @@ class SparseMatrix
327
329
  m_outerIndex[j] = newOuterIndex[j];
328
330
  m_innerNonZeros[j] = innerNNZ;
329
331
  }
330
- m_outerIndex[m_outerSize] = m_outerIndex[m_outerSize-1] + m_innerNonZeros[m_outerSize-1] + reserveSizes[m_outerSize-1];
332
+ if(m_outerSize>0)
333
+ m_outerIndex[m_outerSize] = m_outerIndex[m_outerSize-1] + m_innerNonZeros[m_outerSize-1] + reserveSizes[m_outerSize-1];
331
334
 
332
335
  m_data.resize(m_outerIndex[m_outerSize]);
333
336
  }
@@ -502,8 +505,8 @@ class SparseMatrix
502
505
  m_innerNonZeros[i] = m_outerIndex[i+1] - m_outerIndex[i];
503
506
  }
504
507
  }
505
-
506
- /** Suppresses all nonzeros which are \b much \b smaller \b than \a reference under the tolerence \a epsilon */
508
+
509
+ /** Suppresses all nonzeros which are \b much \b smaller \b than \a reference under the tolerance \a epsilon */
507
510
  void prune(const Scalar& reference, const RealScalar& epsilon = NumTraits<RealScalar>::dummy_precision())
508
511
  {
509
512
  prune(default_prunning_func(reference,epsilon));
@@ -576,10 +579,12 @@ class SparseMatrix
576
579
  else if (innerChange < 0)
577
580
  {
578
581
  // Inner size decreased: allocate a new m_innerNonZeros
579
- m_innerNonZeros = static_cast<StorageIndex*>(std::malloc((m_outerSize+outerChange+1) * sizeof(StorageIndex)));
582
+ m_innerNonZeros = static_cast<StorageIndex*>(std::malloc((m_outerSize + outerChange) * sizeof(StorageIndex)));
580
583
  if (!m_innerNonZeros) internal::throw_std_bad_alloc();
581
- for(Index i = 0; i < m_outerSize; i++)
584
+ for(Index i = 0; i < m_outerSize + (std::min)(outerChange, Index(0)); i++)
582
585
  m_innerNonZeros[i] = m_outerIndex[i+1] - m_outerIndex[i];
586
+ for(Index i = m_outerSize; i < m_outerSize + outerChange; i++)
587
+ m_innerNonZeros[i] = 0;
583
588
  }
584
589
 
585
590
  // Change the m_innerNonZeros in case of a decrease of inner size
@@ -604,9 +609,9 @@ class SparseMatrix
604
609
  m_outerIndex = newOuterIndex;
605
610
  if (outerChange > 0)
606
611
  {
607
- StorageIndex last = m_outerSize == 0 ? 0 : m_outerIndex[m_outerSize];
612
+ StorageIndex lastIdx = m_outerSize == 0 ? 0 : m_outerIndex[m_outerSize];
608
613
  for(Index i=m_outerSize; i<m_outerSize+outerChange+1; i++)
609
- m_outerIndex[i] = last;
614
+ m_outerIndex[i] = lastIdx;
610
615
  }
611
616
  m_outerSize += outerChange;
612
617
  }
@@ -780,6 +785,9 @@ class SparseMatrix
780
785
  template<typename OtherDerived>
781
786
  inline SparseMatrix& operator=(const EigenBase<OtherDerived>& other)
782
787
  { return Base::operator=(other.derived()); }
788
+
789
+ template<typename Lhs, typename Rhs>
790
+ inline SparseMatrix& operator=(const Product<Lhs,Rhs,AliasFreeProduct>& other);
783
791
  #endif // EIGEN_PARSED_BY_DOXYGEN
784
792
 
785
793
  template<typename OtherDerived>
@@ -895,6 +903,113 @@ public:
895
903
  m_data.index(p) = convert_index(inner);
896
904
  return (m_data.value(p) = Scalar(0));
897
905
  }
906
+ protected:
907
+ struct IndexPosPair {
908
+ IndexPosPair(Index a_i, Index a_p) : i(a_i), p(a_p) {}
909
+ Index i;
910
+ Index p;
911
+ };
912
+
913
+ /** \internal assign \a diagXpr to the diagonal of \c *this
914
+ * There are different strategies:
915
+ * 1 - if *this is overwritten (Func==assign_op) or *this is empty, then we can work treat *this as a dense vector expression.
916
+ * 2 - otherwise, for each diagonal coeff,
917
+ * 2.a - if it already exists, then we update it,
918
+ * 2.b - otherwise, if *this is uncompressed and that the current inner-vector has empty room for at least 1 element, then we perform an in-place insertion.
919
+ * 2.c - otherwise, we'll have to reallocate and copy everything, so instead of doing so for each new element, it is recorded in a std::vector.
920
+ * 3 - at the end, if some entries failed to be inserted in-place, then we alloc a new buffer, copy each chunk at the right position, and insert the new elements.
921
+ *
922
+ * TODO: some piece of code could be isolated and reused for a general in-place update strategy.
923
+ * TODO: if we start to defer the insertion of some elements (i.e., case 2.c executed once),
924
+ * then it *might* be better to disable case 2.b since they will have to be copied anyway.
925
+ */
926
+ template<typename DiagXpr, typename Func>
927
+ void assignDiagonal(const DiagXpr diagXpr, const Func& assignFunc)
928
+ {
929
+ Index n = diagXpr.size();
930
+
931
+ const bool overwrite = internal::is_same<Func, internal::assign_op<Scalar,Scalar> >::value;
932
+ if(overwrite)
933
+ {
934
+ if((this->rows()!=n) || (this->cols()!=n))
935
+ this->resize(n, n);
936
+ }
937
+
938
+ if(m_data.size()==0 || overwrite)
939
+ {
940
+ typedef Array<StorageIndex,Dynamic,1> ArrayXI;
941
+ this->makeCompressed();
942
+ this->resizeNonZeros(n);
943
+ Eigen::Map<ArrayXI>(this->innerIndexPtr(), n).setLinSpaced(0,StorageIndex(n)-1);
944
+ Eigen::Map<ArrayXI>(this->outerIndexPtr(), n+1).setLinSpaced(0,StorageIndex(n));
945
+ Eigen::Map<Array<Scalar,Dynamic,1> > values = this->coeffs();
946
+ values.setZero();
947
+ internal::call_assignment_no_alias(values, diagXpr, assignFunc);
948
+ }
949
+ else
950
+ {
951
+ bool isComp = isCompressed();
952
+ internal::evaluator<DiagXpr> diaEval(diagXpr);
953
+ std::vector<IndexPosPair> newEntries;
954
+
955
+ // 1 - try in-place update and record insertion failures
956
+ for(Index i = 0; i<n; ++i)
957
+ {
958
+ internal::LowerBoundIndex lb = this->lower_bound(i,i);
959
+ Index p = lb.value;
960
+ if(lb.found)
961
+ {
962
+ // the coeff already exists
963
+ assignFunc.assignCoeff(m_data.value(p), diaEval.coeff(i));
964
+ }
965
+ else if((!isComp) && m_innerNonZeros[i] < (m_outerIndex[i+1]-m_outerIndex[i]))
966
+ {
967
+ // non compressed mode with local room for inserting one element
968
+ m_data.moveChunk(p, p+1, m_outerIndex[i]+m_innerNonZeros[i]-p);
969
+ m_innerNonZeros[i]++;
970
+ m_data.value(p) = Scalar(0);
971
+ m_data.index(p) = StorageIndex(i);
972
+ assignFunc.assignCoeff(m_data.value(p), diaEval.coeff(i));
973
+ }
974
+ else
975
+ {
976
+ // defer insertion
977
+ newEntries.push_back(IndexPosPair(i,p));
978
+ }
979
+ }
980
+ // 2 - insert deferred entries
981
+ Index n_entries = Index(newEntries.size());
982
+ if(n_entries>0)
983
+ {
984
+ Storage newData(m_data.size()+n_entries);
985
+ Index prev_p = 0;
986
+ Index prev_i = 0;
987
+ for(Index k=0; k<n_entries;++k)
988
+ {
989
+ Index i = newEntries[k].i;
990
+ Index p = newEntries[k].p;
991
+ internal::smart_copy(m_data.valuePtr()+prev_p, m_data.valuePtr()+p, newData.valuePtr()+prev_p+k);
992
+ internal::smart_copy(m_data.indexPtr()+prev_p, m_data.indexPtr()+p, newData.indexPtr()+prev_p+k);
993
+ for(Index j=prev_i;j<i;++j)
994
+ m_outerIndex[j+1] += k;
995
+ if(!isComp)
996
+ m_innerNonZeros[i]++;
997
+ prev_p = p;
998
+ prev_i = i;
999
+ newData.value(p+k) = Scalar(0);
1000
+ newData.index(p+k) = StorageIndex(i);
1001
+ assignFunc.assignCoeff(newData.value(p+k), diaEval.coeff(i));
1002
+ }
1003
+ {
1004
+ internal::smart_copy(m_data.valuePtr()+prev_p, m_data.valuePtr()+m_data.size(), newData.valuePtr()+prev_p+n_entries);
1005
+ internal::smart_copy(m_data.indexPtr()+prev_p, m_data.indexPtr()+m_data.size(), newData.indexPtr()+prev_p+n_entries);
1006
+ for(Index j=prev_i+1;j<=m_outerSize;++j)
1007
+ m_outerIndex[j] += n_entries;
1008
+ }
1009
+ m_data.swap(newData);
1010
+ }
1011
+ }
1012
+ }
898
1013
 
899
1014
  private:
900
1015
  static void check_template_parameters()
@@ -973,7 +1088,7 @@ void set_from_triplets(const InputIterator& begin, const InputIterator& end, Spa
973
1088
  * \code
974
1089
  typedef Triplet<double> T;
975
1090
  std::vector<T> tripletList;
976
- triplets.reserve(estimation_of_entries);
1091
+ tripletList.reserve(estimation_of_entries);
977
1092
  for(...)
978
1093
  {
979
1094
  // ...
@@ -986,7 +1101,7 @@ void set_from_triplets(const InputIterator& begin, const InputIterator& end, Spa
986
1101
  *
987
1102
  * \warning The list of triplets is read multiple times (at least twice). Therefore, it is not recommended to define
988
1103
  * an abstract iterator over a complex data-structure that would be expensive to evaluate. The triplets should rather
989
- * be explicitely stored into a std::vector for instance.
1104
+ * be explicitly stored into a std::vector for instance.
990
1105
  */
991
1106
  template<typename Scalar, int _Options, typename _StorageIndex>
992
1107
  template<typename InputIterators>
@@ -1232,7 +1347,7 @@ typename SparseMatrix<_Scalar,_Options,_StorageIndex>::Scalar& SparseMatrix<_Sca
1232
1347
  }
1233
1348
 
1234
1349
  m_data.index(p) = convert_index(inner);
1235
- return (m_data.value(p) = 0);
1350
+ return (m_data.value(p) = Scalar(0));
1236
1351
  }
1237
1352
 
1238
1353
  if(m_data.size() != m_data.allocatedSize())
@@ -87,6 +87,11 @@ template<typename Derived> class SparseMatrixBase
87
87
  * we are dealing with a column-vector (if there is only one column) or with
88
88
  * a row-vector (if there is only one row). */
89
89
 
90
+ NumDimensions = int(MaxSizeAtCompileTime) == 1 ? 0 : bool(IsVectorAtCompileTime) ? 1 : 2,
91
+ /**< This value is equal to Tensor::NumDimensions, i.e. 0 for scalars, 1 for vectors,
92
+ * and 2 for matrices.
93
+ */
94
+
90
95
  Flags = internal::traits<Derived>::Flags,
91
96
  /**< This stores expression \ref flags flags which may or may not be inherited by new expressions
92
97
  * constructed from this one. See the \ref flags "list of flags".
@@ -350,18 +355,6 @@ template<typename Derived> class SparseMatrixBase
350
355
  const ConstTransposeReturnType transpose() const { return ConstTransposeReturnType(derived()); }
351
356
  const AdjointReturnType adjoint() const { return AdjointReturnType(transpose()); }
352
357
 
353
- // inner-vector
354
- typedef Block<Derived,IsRowMajor?1:Dynamic,IsRowMajor?Dynamic:1,true> InnerVectorReturnType;
355
- typedef Block<const Derived,IsRowMajor?1:Dynamic,IsRowMajor?Dynamic:1,true> ConstInnerVectorReturnType;
356
- InnerVectorReturnType innerVector(Index outer);
357
- const ConstInnerVectorReturnType innerVector(Index outer) const;
358
-
359
- // set of inner-vectors
360
- typedef Block<Derived,Dynamic,Dynamic,true> InnerVectorsReturnType;
361
- typedef Block<const Derived,Dynamic,Dynamic,true> ConstInnerVectorsReturnType;
362
- InnerVectorsReturnType innerVectors(Index outerStart, Index outerSize);
363
- const ConstInnerVectorsReturnType innerVectors(Index outerStart, Index outerSize) const;
364
-
365
358
  DenseMatrixType toDense() const
366
359
  {
367
360
  return DenseMatrixType(derived());
@@ -17,7 +17,7 @@ namespace Eigen {
17
17
  * The automatic pruning of the small values can be achieved by calling the pruned() function
18
18
  * in which case a totally different product algorithm is employed:
19
19
  * \code
20
- * C = (A*B).pruned(); // supress numerical zeros (exact)
20
+ * C = (A*B).pruned(); // suppress numerical zeros (exact)
21
21
  * C = (A*B).pruned(ref);
22
22
  * C = (A*B).pruned(ref,epsilon);
23
23
  * \endcode
@@ -164,6 +164,18 @@ protected:
164
164
 
165
165
  } // end namespace internal
166
166
 
167
+ // sparse matrix = sparse-product (can be sparse*sparse, sparse*perm, etc.)
168
+ template<typename Scalar, int _Options, typename _StorageIndex>
169
+ template<typename Lhs, typename Rhs>
170
+ SparseMatrix<Scalar,_Options,_StorageIndex>& SparseMatrix<Scalar,_Options,_StorageIndex>::operator=(const Product<Lhs,Rhs,AliasFreeProduct>& src)
171
+ {
172
+ // std::cout << "in Assignment : " << DstOptions << "\n";
173
+ SparseMatrix dst(src.rows(),src.cols());
174
+ internal::generic_product_impl<Lhs, Rhs>::evalTo(dst,src.lhs(),src.rhs());
175
+ this->swap(dst);
176
+ return *this;
177
+ }
178
+
167
179
  } // end namespace Eigen
168
180
 
169
181
  #endif // EIGEN_SPARSEPRODUCT_H