umappp 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (395) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +25 -0
  3. data/README.md +110 -0
  4. data/ext/umappp/extconf.rb +25 -0
  5. data/ext/umappp/numo.hpp +867 -0
  6. data/ext/umappp/umappp.cpp +225 -0
  7. data/lib/umappp/version.rb +5 -0
  8. data/lib/umappp.rb +41 -0
  9. data/vendor/Eigen/Cholesky +45 -0
  10. data/vendor/Eigen/CholmodSupport +48 -0
  11. data/vendor/Eigen/Core +384 -0
  12. data/vendor/Eigen/Dense +7 -0
  13. data/vendor/Eigen/Eigen +2 -0
  14. data/vendor/Eigen/Eigenvalues +60 -0
  15. data/vendor/Eigen/Geometry +59 -0
  16. data/vendor/Eigen/Householder +29 -0
  17. data/vendor/Eigen/IterativeLinearSolvers +48 -0
  18. data/vendor/Eigen/Jacobi +32 -0
  19. data/vendor/Eigen/KLUSupport +41 -0
  20. data/vendor/Eigen/LU +47 -0
  21. data/vendor/Eigen/MetisSupport +35 -0
  22. data/vendor/Eigen/OrderingMethods +70 -0
  23. data/vendor/Eigen/PaStiXSupport +49 -0
  24. data/vendor/Eigen/PardisoSupport +35 -0
  25. data/vendor/Eigen/QR +50 -0
  26. data/vendor/Eigen/QtAlignedMalloc +39 -0
  27. data/vendor/Eigen/SPQRSupport +34 -0
  28. data/vendor/Eigen/SVD +50 -0
  29. data/vendor/Eigen/Sparse +34 -0
  30. data/vendor/Eigen/SparseCholesky +37 -0
  31. data/vendor/Eigen/SparseCore +69 -0
  32. data/vendor/Eigen/SparseLU +50 -0
  33. data/vendor/Eigen/SparseQR +36 -0
  34. data/vendor/Eigen/StdDeque +27 -0
  35. data/vendor/Eigen/StdList +26 -0
  36. data/vendor/Eigen/StdVector +27 -0
  37. data/vendor/Eigen/SuperLUSupport +64 -0
  38. data/vendor/Eigen/UmfPackSupport +40 -0
  39. data/vendor/Eigen/src/Cholesky/LDLT.h +688 -0
  40. data/vendor/Eigen/src/Cholesky/LLT.h +558 -0
  41. data/vendor/Eigen/src/Cholesky/LLT_LAPACKE.h +99 -0
  42. data/vendor/Eigen/src/CholmodSupport/CholmodSupport.h +682 -0
  43. data/vendor/Eigen/src/Core/ArithmeticSequence.h +413 -0
  44. data/vendor/Eigen/src/Core/Array.h +417 -0
  45. data/vendor/Eigen/src/Core/ArrayBase.h +226 -0
  46. data/vendor/Eigen/src/Core/ArrayWrapper.h +209 -0
  47. data/vendor/Eigen/src/Core/Assign.h +90 -0
  48. data/vendor/Eigen/src/Core/AssignEvaluator.h +1010 -0
  49. data/vendor/Eigen/src/Core/Assign_MKL.h +178 -0
  50. data/vendor/Eigen/src/Core/BandMatrix.h +353 -0
  51. data/vendor/Eigen/src/Core/Block.h +448 -0
  52. data/vendor/Eigen/src/Core/BooleanRedux.h +162 -0
  53. data/vendor/Eigen/src/Core/CommaInitializer.h +164 -0
  54. data/vendor/Eigen/src/Core/ConditionEstimator.h +175 -0
  55. data/vendor/Eigen/src/Core/CoreEvaluators.h +1741 -0
  56. data/vendor/Eigen/src/Core/CoreIterators.h +132 -0
  57. data/vendor/Eigen/src/Core/CwiseBinaryOp.h +183 -0
  58. data/vendor/Eigen/src/Core/CwiseNullaryOp.h +1001 -0
  59. data/vendor/Eigen/src/Core/CwiseTernaryOp.h +197 -0
  60. data/vendor/Eigen/src/Core/CwiseUnaryOp.h +103 -0
  61. data/vendor/Eigen/src/Core/CwiseUnaryView.h +132 -0
  62. data/vendor/Eigen/src/Core/DenseBase.h +701 -0
  63. data/vendor/Eigen/src/Core/DenseCoeffsBase.h +685 -0
  64. data/vendor/Eigen/src/Core/DenseStorage.h +652 -0
  65. data/vendor/Eigen/src/Core/Diagonal.h +258 -0
  66. data/vendor/Eigen/src/Core/DiagonalMatrix.h +391 -0
  67. data/vendor/Eigen/src/Core/DiagonalProduct.h +28 -0
  68. data/vendor/Eigen/src/Core/Dot.h +318 -0
  69. data/vendor/Eigen/src/Core/EigenBase.h +160 -0
  70. data/vendor/Eigen/src/Core/ForceAlignedAccess.h +150 -0
  71. data/vendor/Eigen/src/Core/Fuzzy.h +155 -0
  72. data/vendor/Eigen/src/Core/GeneralProduct.h +465 -0
  73. data/vendor/Eigen/src/Core/GenericPacketMath.h +1040 -0
  74. data/vendor/Eigen/src/Core/GlobalFunctions.h +194 -0
  75. data/vendor/Eigen/src/Core/IO.h +258 -0
  76. data/vendor/Eigen/src/Core/IndexedView.h +237 -0
  77. data/vendor/Eigen/src/Core/Inverse.h +117 -0
  78. data/vendor/Eigen/src/Core/Map.h +171 -0
  79. data/vendor/Eigen/src/Core/MapBase.h +310 -0
  80. data/vendor/Eigen/src/Core/MathFunctions.h +2057 -0
  81. data/vendor/Eigen/src/Core/MathFunctionsImpl.h +200 -0
  82. data/vendor/Eigen/src/Core/Matrix.h +565 -0
  83. data/vendor/Eigen/src/Core/MatrixBase.h +547 -0
  84. data/vendor/Eigen/src/Core/NestByValue.h +85 -0
  85. data/vendor/Eigen/src/Core/NoAlias.h +109 -0
  86. data/vendor/Eigen/src/Core/NumTraits.h +335 -0
  87. data/vendor/Eigen/src/Core/PartialReduxEvaluator.h +232 -0
  88. data/vendor/Eigen/src/Core/PermutationMatrix.h +605 -0
  89. data/vendor/Eigen/src/Core/PlainObjectBase.h +1128 -0
  90. data/vendor/Eigen/src/Core/Product.h +191 -0
  91. data/vendor/Eigen/src/Core/ProductEvaluators.h +1179 -0
  92. data/vendor/Eigen/src/Core/Random.h +218 -0
  93. data/vendor/Eigen/src/Core/Redux.h +515 -0
  94. data/vendor/Eigen/src/Core/Ref.h +381 -0
  95. data/vendor/Eigen/src/Core/Replicate.h +142 -0
  96. data/vendor/Eigen/src/Core/Reshaped.h +454 -0
  97. data/vendor/Eigen/src/Core/ReturnByValue.h +119 -0
  98. data/vendor/Eigen/src/Core/Reverse.h +217 -0
  99. data/vendor/Eigen/src/Core/Select.h +164 -0
  100. data/vendor/Eigen/src/Core/SelfAdjointView.h +365 -0
  101. data/vendor/Eigen/src/Core/SelfCwiseBinaryOp.h +47 -0
  102. data/vendor/Eigen/src/Core/Solve.h +188 -0
  103. data/vendor/Eigen/src/Core/SolveTriangular.h +235 -0
  104. data/vendor/Eigen/src/Core/SolverBase.h +168 -0
  105. data/vendor/Eigen/src/Core/StableNorm.h +251 -0
  106. data/vendor/Eigen/src/Core/StlIterators.h +463 -0
  107. data/vendor/Eigen/src/Core/Stride.h +116 -0
  108. data/vendor/Eigen/src/Core/Swap.h +68 -0
  109. data/vendor/Eigen/src/Core/Transpose.h +464 -0
  110. data/vendor/Eigen/src/Core/Transpositions.h +386 -0
  111. data/vendor/Eigen/src/Core/TriangularMatrix.h +1001 -0
  112. data/vendor/Eigen/src/Core/VectorBlock.h +96 -0
  113. data/vendor/Eigen/src/Core/VectorwiseOp.h +784 -0
  114. data/vendor/Eigen/src/Core/Visitor.h +381 -0
  115. data/vendor/Eigen/src/Core/arch/AVX/Complex.h +372 -0
  116. data/vendor/Eigen/src/Core/arch/AVX/MathFunctions.h +228 -0
  117. data/vendor/Eigen/src/Core/arch/AVX/PacketMath.h +1574 -0
  118. data/vendor/Eigen/src/Core/arch/AVX/TypeCasting.h +115 -0
  119. data/vendor/Eigen/src/Core/arch/AVX512/Complex.h +422 -0
  120. data/vendor/Eigen/src/Core/arch/AVX512/MathFunctions.h +362 -0
  121. data/vendor/Eigen/src/Core/arch/AVX512/PacketMath.h +2303 -0
  122. data/vendor/Eigen/src/Core/arch/AVX512/TypeCasting.h +89 -0
  123. data/vendor/Eigen/src/Core/arch/AltiVec/Complex.h +417 -0
  124. data/vendor/Eigen/src/Core/arch/AltiVec/MathFunctions.h +90 -0
  125. data/vendor/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2937 -0
  126. data/vendor/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +221 -0
  127. data/vendor/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +629 -0
  128. data/vendor/Eigen/src/Core/arch/AltiVec/PacketMath.h +2711 -0
  129. data/vendor/Eigen/src/Core/arch/CUDA/Complex.h +258 -0
  130. data/vendor/Eigen/src/Core/arch/Default/BFloat16.h +700 -0
  131. data/vendor/Eigen/src/Core/arch/Default/ConjHelper.h +117 -0
  132. data/vendor/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1649 -0
  133. data/vendor/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +110 -0
  134. data/vendor/Eigen/src/Core/arch/Default/Half.h +942 -0
  135. data/vendor/Eigen/src/Core/arch/Default/Settings.h +49 -0
  136. data/vendor/Eigen/src/Core/arch/Default/TypeCasting.h +120 -0
  137. data/vendor/Eigen/src/Core/arch/GPU/MathFunctions.h +103 -0
  138. data/vendor/Eigen/src/Core/arch/GPU/PacketMath.h +1685 -0
  139. data/vendor/Eigen/src/Core/arch/GPU/TypeCasting.h +80 -0
  140. data/vendor/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
  141. data/vendor/Eigen/src/Core/arch/MSA/Complex.h +648 -0
  142. data/vendor/Eigen/src/Core/arch/MSA/MathFunctions.h +387 -0
  143. data/vendor/Eigen/src/Core/arch/MSA/PacketMath.h +1233 -0
  144. data/vendor/Eigen/src/Core/arch/NEON/Complex.h +584 -0
  145. data/vendor/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +183 -0
  146. data/vendor/Eigen/src/Core/arch/NEON/MathFunctions.h +75 -0
  147. data/vendor/Eigen/src/Core/arch/NEON/PacketMath.h +4587 -0
  148. data/vendor/Eigen/src/Core/arch/NEON/TypeCasting.h +1419 -0
  149. data/vendor/Eigen/src/Core/arch/SSE/Complex.h +351 -0
  150. data/vendor/Eigen/src/Core/arch/SSE/MathFunctions.h +199 -0
  151. data/vendor/Eigen/src/Core/arch/SSE/PacketMath.h +1505 -0
  152. data/vendor/Eigen/src/Core/arch/SSE/TypeCasting.h +142 -0
  153. data/vendor/Eigen/src/Core/arch/SVE/MathFunctions.h +44 -0
  154. data/vendor/Eigen/src/Core/arch/SVE/PacketMath.h +752 -0
  155. data/vendor/Eigen/src/Core/arch/SVE/TypeCasting.h +49 -0
  156. data/vendor/Eigen/src/Core/arch/SYCL/InteropHeaders.h +232 -0
  157. data/vendor/Eigen/src/Core/arch/SYCL/MathFunctions.h +301 -0
  158. data/vendor/Eigen/src/Core/arch/SYCL/PacketMath.h +670 -0
  159. data/vendor/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +694 -0
  160. data/vendor/Eigen/src/Core/arch/SYCL/TypeCasting.h +85 -0
  161. data/vendor/Eigen/src/Core/arch/ZVector/Complex.h +426 -0
  162. data/vendor/Eigen/src/Core/arch/ZVector/MathFunctions.h +233 -0
  163. data/vendor/Eigen/src/Core/arch/ZVector/PacketMath.h +1060 -0
  164. data/vendor/Eigen/src/Core/functors/AssignmentFunctors.h +177 -0
  165. data/vendor/Eigen/src/Core/functors/BinaryFunctors.h +541 -0
  166. data/vendor/Eigen/src/Core/functors/NullaryFunctors.h +189 -0
  167. data/vendor/Eigen/src/Core/functors/StlFunctors.h +166 -0
  168. data/vendor/Eigen/src/Core/functors/TernaryFunctors.h +25 -0
  169. data/vendor/Eigen/src/Core/functors/UnaryFunctors.h +1131 -0
  170. data/vendor/Eigen/src/Core/products/GeneralBlockPanelKernel.h +2645 -0
  171. data/vendor/Eigen/src/Core/products/GeneralMatrixMatrix.h +517 -0
  172. data/vendor/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +317 -0
  173. data/vendor/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +145 -0
  174. data/vendor/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +124 -0
  175. data/vendor/Eigen/src/Core/products/GeneralMatrixVector.h +518 -0
  176. data/vendor/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +136 -0
  177. data/vendor/Eigen/src/Core/products/Parallelizer.h +180 -0
  178. data/vendor/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +544 -0
  179. data/vendor/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +295 -0
  180. data/vendor/Eigen/src/Core/products/SelfadjointMatrixVector.h +262 -0
  181. data/vendor/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h +118 -0
  182. data/vendor/Eigen/src/Core/products/SelfadjointProduct.h +133 -0
  183. data/vendor/Eigen/src/Core/products/SelfadjointRank2Update.h +94 -0
  184. data/vendor/Eigen/src/Core/products/TriangularMatrixMatrix.h +472 -0
  185. data/vendor/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +317 -0
  186. data/vendor/Eigen/src/Core/products/TriangularMatrixVector.h +350 -0
  187. data/vendor/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h +255 -0
  188. data/vendor/Eigen/src/Core/products/TriangularSolverMatrix.h +337 -0
  189. data/vendor/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +167 -0
  190. data/vendor/Eigen/src/Core/products/TriangularSolverVector.h +148 -0
  191. data/vendor/Eigen/src/Core/util/BlasUtil.h +583 -0
  192. data/vendor/Eigen/src/Core/util/ConfigureVectorization.h +512 -0
  193. data/vendor/Eigen/src/Core/util/Constants.h +563 -0
  194. data/vendor/Eigen/src/Core/util/DisableStupidWarnings.h +106 -0
  195. data/vendor/Eigen/src/Core/util/ForwardDeclarations.h +322 -0
  196. data/vendor/Eigen/src/Core/util/IndexedViewHelper.h +186 -0
  197. data/vendor/Eigen/src/Core/util/IntegralConstant.h +272 -0
  198. data/vendor/Eigen/src/Core/util/MKL_support.h +137 -0
  199. data/vendor/Eigen/src/Core/util/Macros.h +1464 -0
  200. data/vendor/Eigen/src/Core/util/Memory.h +1163 -0
  201. data/vendor/Eigen/src/Core/util/Meta.h +812 -0
  202. data/vendor/Eigen/src/Core/util/NonMPL2.h +3 -0
  203. data/vendor/Eigen/src/Core/util/ReenableStupidWarnings.h +31 -0
  204. data/vendor/Eigen/src/Core/util/ReshapedHelper.h +51 -0
  205. data/vendor/Eigen/src/Core/util/StaticAssert.h +221 -0
  206. data/vendor/Eigen/src/Core/util/SymbolicIndex.h +293 -0
  207. data/vendor/Eigen/src/Core/util/XprHelper.h +856 -0
  208. data/vendor/Eigen/src/Eigenvalues/ComplexEigenSolver.h +346 -0
  209. data/vendor/Eigen/src/Eigenvalues/ComplexSchur.h +462 -0
  210. data/vendor/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h +91 -0
  211. data/vendor/Eigen/src/Eigenvalues/EigenSolver.h +622 -0
  212. data/vendor/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +418 -0
  213. data/vendor/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +226 -0
  214. data/vendor/Eigen/src/Eigenvalues/HessenbergDecomposition.h +374 -0
  215. data/vendor/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +158 -0
  216. data/vendor/Eigen/src/Eigenvalues/RealQZ.h +657 -0
  217. data/vendor/Eigen/src/Eigenvalues/RealSchur.h +558 -0
  218. data/vendor/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +77 -0
  219. data/vendor/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +904 -0
  220. data/vendor/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +87 -0
  221. data/vendor/Eigen/src/Eigenvalues/Tridiagonalization.h +561 -0
  222. data/vendor/Eigen/src/Geometry/AlignedBox.h +486 -0
  223. data/vendor/Eigen/src/Geometry/AngleAxis.h +247 -0
  224. data/vendor/Eigen/src/Geometry/EulerAngles.h +114 -0
  225. data/vendor/Eigen/src/Geometry/Homogeneous.h +501 -0
  226. data/vendor/Eigen/src/Geometry/Hyperplane.h +282 -0
  227. data/vendor/Eigen/src/Geometry/OrthoMethods.h +235 -0
  228. data/vendor/Eigen/src/Geometry/ParametrizedLine.h +232 -0
  229. data/vendor/Eigen/src/Geometry/Quaternion.h +870 -0
  230. data/vendor/Eigen/src/Geometry/Rotation2D.h +199 -0
  231. data/vendor/Eigen/src/Geometry/RotationBase.h +206 -0
  232. data/vendor/Eigen/src/Geometry/Scaling.h +188 -0
  233. data/vendor/Eigen/src/Geometry/Transform.h +1563 -0
  234. data/vendor/Eigen/src/Geometry/Translation.h +202 -0
  235. data/vendor/Eigen/src/Geometry/Umeyama.h +166 -0
  236. data/vendor/Eigen/src/Geometry/arch/Geometry_SIMD.h +168 -0
  237. data/vendor/Eigen/src/Householder/BlockHouseholder.h +110 -0
  238. data/vendor/Eigen/src/Householder/Householder.h +176 -0
  239. data/vendor/Eigen/src/Householder/HouseholderSequence.h +545 -0
  240. data/vendor/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +226 -0
  241. data/vendor/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +212 -0
  242. data/vendor/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +229 -0
  243. data/vendor/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +394 -0
  244. data/vendor/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +453 -0
  245. data/vendor/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +444 -0
  246. data/vendor/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +198 -0
  247. data/vendor/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +117 -0
  248. data/vendor/Eigen/src/Jacobi/Jacobi.h +483 -0
  249. data/vendor/Eigen/src/KLUSupport/KLUSupport.h +358 -0
  250. data/vendor/Eigen/src/LU/Determinant.h +117 -0
  251. data/vendor/Eigen/src/LU/FullPivLU.h +877 -0
  252. data/vendor/Eigen/src/LU/InverseImpl.h +432 -0
  253. data/vendor/Eigen/src/LU/PartialPivLU.h +624 -0
  254. data/vendor/Eigen/src/LU/PartialPivLU_LAPACKE.h +83 -0
  255. data/vendor/Eigen/src/LU/arch/InverseSize4.h +351 -0
  256. data/vendor/Eigen/src/MetisSupport/MetisSupport.h +137 -0
  257. data/vendor/Eigen/src/OrderingMethods/Amd.h +435 -0
  258. data/vendor/Eigen/src/OrderingMethods/Eigen_Colamd.h +1863 -0
  259. data/vendor/Eigen/src/OrderingMethods/Ordering.h +153 -0
  260. data/vendor/Eigen/src/PaStiXSupport/PaStiXSupport.h +678 -0
  261. data/vendor/Eigen/src/PardisoSupport/PardisoSupport.h +545 -0
  262. data/vendor/Eigen/src/QR/ColPivHouseholderQR.h +674 -0
  263. data/vendor/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +97 -0
  264. data/vendor/Eigen/src/QR/CompleteOrthogonalDecomposition.h +635 -0
  265. data/vendor/Eigen/src/QR/FullPivHouseholderQR.h +713 -0
  266. data/vendor/Eigen/src/QR/HouseholderQR.h +434 -0
  267. data/vendor/Eigen/src/QR/HouseholderQR_LAPACKE.h +68 -0
  268. data/vendor/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +335 -0
  269. data/vendor/Eigen/src/SVD/BDCSVD.h +1366 -0
  270. data/vendor/Eigen/src/SVD/JacobiSVD.h +812 -0
  271. data/vendor/Eigen/src/SVD/JacobiSVD_LAPACKE.h +91 -0
  272. data/vendor/Eigen/src/SVD/SVDBase.h +376 -0
  273. data/vendor/Eigen/src/SVD/UpperBidiagonalization.h +414 -0
  274. data/vendor/Eigen/src/SparseCholesky/SimplicialCholesky.h +697 -0
  275. data/vendor/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +174 -0
  276. data/vendor/Eigen/src/SparseCore/AmbiVector.h +378 -0
  277. data/vendor/Eigen/src/SparseCore/CompressedStorage.h +274 -0
  278. data/vendor/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +352 -0
  279. data/vendor/Eigen/src/SparseCore/MappedSparseMatrix.h +67 -0
  280. data/vendor/Eigen/src/SparseCore/SparseAssign.h +270 -0
  281. data/vendor/Eigen/src/SparseCore/SparseBlock.h +571 -0
  282. data/vendor/Eigen/src/SparseCore/SparseColEtree.h +206 -0
  283. data/vendor/Eigen/src/SparseCore/SparseCompressedBase.h +370 -0
  284. data/vendor/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +722 -0
  285. data/vendor/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +150 -0
  286. data/vendor/Eigen/src/SparseCore/SparseDenseProduct.h +342 -0
  287. data/vendor/Eigen/src/SparseCore/SparseDiagonalProduct.h +138 -0
  288. data/vendor/Eigen/src/SparseCore/SparseDot.h +98 -0
  289. data/vendor/Eigen/src/SparseCore/SparseFuzzy.h +29 -0
  290. data/vendor/Eigen/src/SparseCore/SparseMap.h +305 -0
  291. data/vendor/Eigen/src/SparseCore/SparseMatrix.h +1518 -0
  292. data/vendor/Eigen/src/SparseCore/SparseMatrixBase.h +398 -0
  293. data/vendor/Eigen/src/SparseCore/SparsePermutation.h +178 -0
  294. data/vendor/Eigen/src/SparseCore/SparseProduct.h +181 -0
  295. data/vendor/Eigen/src/SparseCore/SparseRedux.h +49 -0
  296. data/vendor/Eigen/src/SparseCore/SparseRef.h +397 -0
  297. data/vendor/Eigen/src/SparseCore/SparseSelfAdjointView.h +659 -0
  298. data/vendor/Eigen/src/SparseCore/SparseSolverBase.h +124 -0
  299. data/vendor/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +198 -0
  300. data/vendor/Eigen/src/SparseCore/SparseTranspose.h +92 -0
  301. data/vendor/Eigen/src/SparseCore/SparseTriangularView.h +189 -0
  302. data/vendor/Eigen/src/SparseCore/SparseUtil.h +186 -0
  303. data/vendor/Eigen/src/SparseCore/SparseVector.h +478 -0
  304. data/vendor/Eigen/src/SparseCore/SparseView.h +254 -0
  305. data/vendor/Eigen/src/SparseCore/TriangularSolver.h +315 -0
  306. data/vendor/Eigen/src/SparseLU/SparseLU.h +923 -0
  307. data/vendor/Eigen/src/SparseLU/SparseLUImpl.h +66 -0
  308. data/vendor/Eigen/src/SparseLU/SparseLU_Memory.h +226 -0
  309. data/vendor/Eigen/src/SparseLU/SparseLU_Structs.h +110 -0
  310. data/vendor/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +375 -0
  311. data/vendor/Eigen/src/SparseLU/SparseLU_Utils.h +80 -0
  312. data/vendor/Eigen/src/SparseLU/SparseLU_column_bmod.h +181 -0
  313. data/vendor/Eigen/src/SparseLU/SparseLU_column_dfs.h +179 -0
  314. data/vendor/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +107 -0
  315. data/vendor/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +280 -0
  316. data/vendor/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +126 -0
  317. data/vendor/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +130 -0
  318. data/vendor/Eigen/src/SparseLU/SparseLU_panel_bmod.h +223 -0
  319. data/vendor/Eigen/src/SparseLU/SparseLU_panel_dfs.h +258 -0
  320. data/vendor/Eigen/src/SparseLU/SparseLU_pivotL.h +137 -0
  321. data/vendor/Eigen/src/SparseLU/SparseLU_pruneL.h +136 -0
  322. data/vendor/Eigen/src/SparseLU/SparseLU_relax_snode.h +83 -0
  323. data/vendor/Eigen/src/SparseQR/SparseQR.h +758 -0
  324. data/vendor/Eigen/src/StlSupport/StdDeque.h +116 -0
  325. data/vendor/Eigen/src/StlSupport/StdList.h +106 -0
  326. data/vendor/Eigen/src/StlSupport/StdVector.h +131 -0
  327. data/vendor/Eigen/src/StlSupport/details.h +84 -0
  328. data/vendor/Eigen/src/SuperLUSupport/SuperLUSupport.h +1025 -0
  329. data/vendor/Eigen/src/UmfPackSupport/UmfPackSupport.h +642 -0
  330. data/vendor/Eigen/src/misc/Image.h +82 -0
  331. data/vendor/Eigen/src/misc/Kernel.h +79 -0
  332. data/vendor/Eigen/src/misc/RealSvd2x2.h +55 -0
  333. data/vendor/Eigen/src/misc/blas.h +440 -0
  334. data/vendor/Eigen/src/misc/lapack.h +152 -0
  335. data/vendor/Eigen/src/misc/lapacke.h +16292 -0
  336. data/vendor/Eigen/src/misc/lapacke_mangling.h +17 -0
  337. data/vendor/Eigen/src/plugins/ArrayCwiseBinaryOps.h +358 -0
  338. data/vendor/Eigen/src/plugins/ArrayCwiseUnaryOps.h +696 -0
  339. data/vendor/Eigen/src/plugins/BlockMethods.h +1442 -0
  340. data/vendor/Eigen/src/plugins/CommonCwiseBinaryOps.h +115 -0
  341. data/vendor/Eigen/src/plugins/CommonCwiseUnaryOps.h +177 -0
  342. data/vendor/Eigen/src/plugins/IndexedViewMethods.h +262 -0
  343. data/vendor/Eigen/src/plugins/MatrixCwiseBinaryOps.h +152 -0
  344. data/vendor/Eigen/src/plugins/MatrixCwiseUnaryOps.h +95 -0
  345. data/vendor/Eigen/src/plugins/ReshapedMethods.h +149 -0
  346. data/vendor/aarand/aarand.hpp +114 -0
  347. data/vendor/annoy/annoylib.h +1495 -0
  348. data/vendor/annoy/kissrandom.h +120 -0
  349. data/vendor/annoy/mman.h +242 -0
  350. data/vendor/hnswlib/bruteforce.h +152 -0
  351. data/vendor/hnswlib/hnswalg.h +1192 -0
  352. data/vendor/hnswlib/hnswlib.h +108 -0
  353. data/vendor/hnswlib/space_ip.h +282 -0
  354. data/vendor/hnswlib/space_l2.h +281 -0
  355. data/vendor/hnswlib/visited_list_pool.h +79 -0
  356. data/vendor/irlba/irlba.hpp +575 -0
  357. data/vendor/irlba/lanczos.hpp +212 -0
  358. data/vendor/irlba/parallel.hpp +474 -0
  359. data/vendor/irlba/utils.hpp +224 -0
  360. data/vendor/irlba/wrappers.hpp +228 -0
  361. data/vendor/kmeans/Base.hpp +75 -0
  362. data/vendor/kmeans/Details.hpp +79 -0
  363. data/vendor/kmeans/HartiganWong.hpp +492 -0
  364. data/vendor/kmeans/InitializeKmeansPP.hpp +144 -0
  365. data/vendor/kmeans/InitializeNone.hpp +44 -0
  366. data/vendor/kmeans/InitializePCAPartition.hpp +309 -0
  367. data/vendor/kmeans/InitializeRandom.hpp +91 -0
  368. data/vendor/kmeans/Kmeans.hpp +161 -0
  369. data/vendor/kmeans/Lloyd.hpp +134 -0
  370. data/vendor/kmeans/MiniBatch.hpp +269 -0
  371. data/vendor/kmeans/QuickSearch.hpp +179 -0
  372. data/vendor/kmeans/compute_centroids.hpp +32 -0
  373. data/vendor/kmeans/compute_wcss.hpp +27 -0
  374. data/vendor/kmeans/is_edge_case.hpp +42 -0
  375. data/vendor/kmeans/random.hpp +55 -0
  376. data/vendor/knncolle/Annoy/Annoy.hpp +193 -0
  377. data/vendor/knncolle/BruteForce/BruteForce.hpp +120 -0
  378. data/vendor/knncolle/Hnsw/Hnsw.hpp +225 -0
  379. data/vendor/knncolle/Kmknn/Kmknn.hpp +286 -0
  380. data/vendor/knncolle/VpTree/VpTree.hpp +256 -0
  381. data/vendor/knncolle/knncolle.hpp +34 -0
  382. data/vendor/knncolle/utils/Base.hpp +100 -0
  383. data/vendor/knncolle/utils/NeighborQueue.hpp +94 -0
  384. data/vendor/knncolle/utils/distances.hpp +98 -0
  385. data/vendor/knncolle/utils/find_nearest_neighbors.hpp +112 -0
  386. data/vendor/powerit/PowerIterations.hpp +157 -0
  387. data/vendor/umappp/NeighborList.hpp +37 -0
  388. data/vendor/umappp/Umap.hpp +662 -0
  389. data/vendor/umappp/combine_neighbor_sets.hpp +95 -0
  390. data/vendor/umappp/find_ab.hpp +157 -0
  391. data/vendor/umappp/neighbor_similarities.hpp +136 -0
  392. data/vendor/umappp/optimize_layout.hpp +285 -0
  393. data/vendor/umappp/spectral_init.hpp +181 -0
  394. data/vendor/umappp/umappp.hpp +13 -0
  395. metadata +465 -0
@@ -0,0 +1,923 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>
5
+ // Copyright (C) 2012-2014 Gael Guennebaud <gael.guennebaud@inria.fr>
6
+ //
7
+ // This Source Code Form is subject to the terms of the Mozilla
8
+ // Public License v. 2.0. If a copy of the MPL was not distributed
9
+ // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10
+
11
+
12
+ #ifndef EIGEN_SPARSE_LU_H
13
+ #define EIGEN_SPARSE_LU_H
14
+
15
+ namespace Eigen {
16
+
17
+ template <typename _MatrixType, typename _OrderingType = COLAMDOrdering<typename _MatrixType::StorageIndex> > class SparseLU;
18
+ template <typename MappedSparseMatrixType> struct SparseLUMatrixLReturnType;
19
+ template <typename MatrixLType, typename MatrixUType> struct SparseLUMatrixUReturnType;
20
+
21
+ template <bool Conjugate,class SparseLUType>
22
+ class SparseLUTransposeView : public SparseSolverBase<SparseLUTransposeView<Conjugate,SparseLUType> >
23
+ {
24
+ protected:
25
+ typedef SparseSolverBase<SparseLUTransposeView<Conjugate,SparseLUType> > APIBase;
26
+ using APIBase::m_isInitialized;
27
+ public:
28
+ typedef typename SparseLUType::Scalar Scalar;
29
+ typedef typename SparseLUType::StorageIndex StorageIndex;
30
+ typedef typename SparseLUType::MatrixType MatrixType;
31
+ typedef typename SparseLUType::OrderingType OrderingType;
32
+
33
+ enum {
34
+ ColsAtCompileTime = MatrixType::ColsAtCompileTime,
35
+ MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
36
+ };
37
+
38
+ SparseLUTransposeView() : m_sparseLU(NULL) {}
39
+ SparseLUTransposeView(const SparseLUTransposeView& view) {
40
+ this->m_sparseLU = view.m_sparseLU;
41
+ }
42
+ void setIsInitialized(const bool isInitialized) {this->m_isInitialized = isInitialized;}
43
+ void setSparseLU(SparseLUType* sparseLU) {m_sparseLU = sparseLU;}
44
+ using APIBase::_solve_impl;
45
+ template<typename Rhs, typename Dest>
46
+ bool _solve_impl(const MatrixBase<Rhs> &B, MatrixBase<Dest> &X_base) const
47
+ {
48
+ Dest& X(X_base.derived());
49
+ eigen_assert(m_sparseLU->info() == Success && "The matrix should be factorized first");
50
+ EIGEN_STATIC_ASSERT((Dest::Flags&RowMajorBit)==0,
51
+ THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
52
+
53
+
54
+ // this ugly const_cast_derived() helps to detect aliasing when applying the permutations
55
+ for(Index j = 0; j < B.cols(); ++j){
56
+ X.col(j) = m_sparseLU->colsPermutation() * B.const_cast_derived().col(j);
57
+ }
58
+ //Forward substitution with transposed or adjoint of U
59
+ m_sparseLU->matrixU().template solveTransposedInPlace<Conjugate>(X);
60
+
61
+ //Backward substitution with transposed or adjoint of L
62
+ m_sparseLU->matrixL().template solveTransposedInPlace<Conjugate>(X);
63
+
64
+ // Permute back the solution
65
+ for (Index j = 0; j < B.cols(); ++j)
66
+ X.col(j) = m_sparseLU->rowsPermutation().transpose() * X.col(j);
67
+ return true;
68
+ }
69
+ inline Index rows() const { return m_sparseLU->rows(); }
70
+ inline Index cols() const { return m_sparseLU->cols(); }
71
+
72
+ private:
73
+ SparseLUType *m_sparseLU;
74
+ SparseLUTransposeView& operator=(const SparseLUTransposeView&);
75
+ };
76
+
77
+
78
+ /** \ingroup SparseLU_Module
79
+ * \class SparseLU
80
+ *
81
+ * \brief Sparse supernodal LU factorization for general matrices
82
+ *
83
+ * This class implements the supernodal LU factorization for general matrices.
84
+ * It uses the main techniques from the sequential SuperLU package
85
+ * (http://crd-legacy.lbl.gov/~xiaoye/SuperLU/). It handles transparently real
86
+ * and complex arithmetic with single and double precision, depending on the
87
+ * scalar type of your input matrix.
88
+ * The code has been optimized to provide BLAS-3 operations during supernode-panel updates.
89
+ * It benefits directly from the built-in high-performant Eigen BLAS routines.
90
+ * Moreover, when the size of a supernode is very small, the BLAS calls are avoided to
91
+ * enable a better optimization from the compiler. For best performance,
92
+ * you should compile it with NDEBUG flag to avoid the numerous bounds checking on vectors.
93
+ *
94
+ * An important parameter of this class is the ordering method. It is used to reorder the columns
95
+ * (and eventually the rows) of the matrix to reduce the number of new elements that are created during
96
+ * numerical factorization. The cheapest method available is COLAMD.
97
+ * See \link OrderingMethods_Module the OrderingMethods module \endlink for the list of
98
+ * built-in and external ordering methods.
99
+ *
100
+ * Simple example with key steps
101
+ * \code
102
+ * VectorXd x(n), b(n);
103
+ * SparseMatrix<double> A;
104
+ * SparseLU<SparseMatrix<double>, COLAMDOrdering<int> > solver;
105
+ * // fill A and b;
106
+ * // Compute the ordering permutation vector from the structural pattern of A
107
+ * solver.analyzePattern(A);
108
+ * // Compute the numerical factorization
109
+ * solver.factorize(A);
110
+ * //Use the factors to solve the linear system
111
+ * x = solver.solve(b);
112
+ * \endcode
113
+ *
114
+ * \warning The input matrix A should be in a \b compressed and \b column-major form.
115
+ * Otherwise an expensive copy will be made. You can call the inexpensive makeCompressed() to get a compressed matrix.
116
+ *
117
+ * \note Unlike the initial SuperLU implementation, there is no step to equilibrate the matrix.
118
+ * For badly scaled matrices, this step can be useful to reduce the pivoting during factorization.
119
+ * If this is the case for your matrices, you can try the basic scaling method at
120
+ * "unsupported/Eigen/src/IterativeSolvers/Scaling.h"
121
+ *
122
+ * \tparam _MatrixType The type of the sparse matrix. It must be a column-major SparseMatrix<>
123
+ * \tparam _OrderingType The ordering method to use, either AMD, COLAMD or METIS. Default is COLMAD
124
+ *
125
+ * \implsparsesolverconcept
126
+ *
127
+ * \sa \ref TutorialSparseSolverConcept
128
+ * \sa \ref OrderingMethods_Module
129
+ */
130
+ template <typename _MatrixType, typename _OrderingType>
131
+ class SparseLU : public SparseSolverBase<SparseLU<_MatrixType,_OrderingType> >, public internal::SparseLUImpl<typename _MatrixType::Scalar, typename _MatrixType::StorageIndex>
132
+ {
133
+ protected:
134
+ typedef SparseSolverBase<SparseLU<_MatrixType,_OrderingType> > APIBase;
135
+ using APIBase::m_isInitialized;
136
+ public:
137
+ using APIBase::_solve_impl;
138
+
139
+ typedef _MatrixType MatrixType;
140
+ typedef _OrderingType OrderingType;
141
+ typedef typename MatrixType::Scalar Scalar;
142
+ typedef typename MatrixType::RealScalar RealScalar;
143
+ typedef typename MatrixType::StorageIndex StorageIndex;
144
+ typedef SparseMatrix<Scalar,ColMajor,StorageIndex> NCMatrix;
145
+ typedef internal::MappedSuperNodalMatrix<Scalar, StorageIndex> SCMatrix;
146
+ typedef Matrix<Scalar,Dynamic,1> ScalarVector;
147
+ typedef Matrix<StorageIndex,Dynamic,1> IndexVector;
148
+ typedef PermutationMatrix<Dynamic, Dynamic, StorageIndex> PermutationType;
149
+ typedef internal::SparseLUImpl<Scalar, StorageIndex> Base;
150
+
151
+ enum {
152
+ ColsAtCompileTime = MatrixType::ColsAtCompileTime,
153
+ MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
154
+ };
155
+
156
+ public:
157
+
158
+ SparseLU():m_lastError(""),m_Ustore(0,0,0,0,0,0),m_symmetricmode(false),m_diagpivotthresh(1.0),m_detPermR(1)
159
+ {
160
+ initperfvalues();
161
+ }
162
+ explicit SparseLU(const MatrixType& matrix)
163
+ : m_lastError(""),m_Ustore(0,0,0,0,0,0),m_symmetricmode(false),m_diagpivotthresh(1.0),m_detPermR(1)
164
+ {
165
+ initperfvalues();
166
+ compute(matrix);
167
+ }
168
+
169
+ ~SparseLU()
170
+ {
171
+ // Free all explicit dynamic pointers
172
+ }
173
+
174
+ void analyzePattern (const MatrixType& matrix);
175
+ void factorize (const MatrixType& matrix);
176
+ void simplicialfactorize(const MatrixType& matrix);
177
+
178
+ /**
179
+ * Compute the symbolic and numeric factorization of the input sparse matrix.
180
+ * The input matrix should be in column-major storage.
181
+ */
182
+ void compute (const MatrixType& matrix)
183
+ {
184
+ // Analyze
185
+ analyzePattern(matrix);
186
+ //Factorize
187
+ factorize(matrix);
188
+ }
189
+
190
+ /** \returns an expression of the transposed of the factored matrix.
191
+ *
192
+ * A typical usage is to solve for the transposed problem A^T x = b:
193
+ * \code
194
+ * solver.compute(A);
195
+ * x = solver.transpose().solve(b);
196
+ * \endcode
197
+ *
198
+ * \sa adjoint(), solve()
199
+ */
200
+ const SparseLUTransposeView<false,SparseLU<_MatrixType,_OrderingType> > transpose()
201
+ {
202
+ SparseLUTransposeView<false, SparseLU<_MatrixType,_OrderingType> > transposeView;
203
+ transposeView.setSparseLU(this);
204
+ transposeView.setIsInitialized(this->m_isInitialized);
205
+ return transposeView;
206
+ }
207
+
208
+
209
+ /** \returns an expression of the adjoint of the factored matrix
210
+ *
211
+ * A typical usage is to solve for the adjoint problem A' x = b:
212
+ * \code
213
+ * solver.compute(A);
214
+ * x = solver.adjoint().solve(b);
215
+ * \endcode
216
+ *
217
+ * For real scalar types, this function is equivalent to transpose().
218
+ *
219
+ * \sa transpose(), solve()
220
+ */
221
+ const SparseLUTransposeView<true, SparseLU<_MatrixType,_OrderingType> > adjoint()
222
+ {
223
+ SparseLUTransposeView<true, SparseLU<_MatrixType,_OrderingType> > adjointView;
224
+ adjointView.setSparseLU(this);
225
+ adjointView.setIsInitialized(this->m_isInitialized);
226
+ return adjointView;
227
+ }
228
+
229
+ inline Index rows() const { return m_mat.rows(); }
230
+ inline Index cols() const { return m_mat.cols(); }
231
+ /** Indicate that the pattern of the input matrix is symmetric */
232
+ void isSymmetric(bool sym)
233
+ {
234
+ m_symmetricmode = sym;
235
+ }
236
+
237
+ /** \returns an expression of the matrix L, internally stored as supernodes
238
+ * The only operation available with this expression is the triangular solve
239
+ * \code
240
+ * y = b; matrixL().solveInPlace(y);
241
+ * \endcode
242
+ */
243
+ SparseLUMatrixLReturnType<SCMatrix> matrixL() const
244
+ {
245
+ return SparseLUMatrixLReturnType<SCMatrix>(m_Lstore);
246
+ }
247
+ /** \returns an expression of the matrix U,
248
+ * The only operation available with this expression is the triangular solve
249
+ * \code
250
+ * y = b; matrixU().solveInPlace(y);
251
+ * \endcode
252
+ */
253
+ SparseLUMatrixUReturnType<SCMatrix,MappedSparseMatrix<Scalar,ColMajor,StorageIndex> > matrixU() const
254
+ {
255
+ return SparseLUMatrixUReturnType<SCMatrix, MappedSparseMatrix<Scalar,ColMajor,StorageIndex> >(m_Lstore, m_Ustore);
256
+ }
257
+
258
+ /**
259
+ * \returns a reference to the row matrix permutation \f$ P_r \f$ such that \f$P_r A P_c^T = L U\f$
260
+ * \sa colsPermutation()
261
+ */
262
+ inline const PermutationType& rowsPermutation() const
263
+ {
264
+ return m_perm_r;
265
+ }
266
+ /**
267
+ * \returns a reference to the column matrix permutation\f$ P_c^T \f$ such that \f$P_r A P_c^T = L U\f$
268
+ * \sa rowsPermutation()
269
+ */
270
+ inline const PermutationType& colsPermutation() const
271
+ {
272
+ return m_perm_c;
273
+ }
274
+ /** Set the threshold used for a diagonal entry to be an acceptable pivot. */
275
+ void setPivotThreshold(const RealScalar& thresh)
276
+ {
277
+ m_diagpivotthresh = thresh;
278
+ }
279
+
280
+ #ifdef EIGEN_PARSED_BY_DOXYGEN
281
+ /** \returns the solution X of \f$ A X = B \f$ using the current decomposition of A.
282
+ *
283
+ * \warning the destination matrix X in X = this->solve(B) must be colmun-major.
284
+ *
285
+ * \sa compute()
286
+ */
287
+ template<typename Rhs>
288
+ inline const Solve<SparseLU, Rhs> solve(const MatrixBase<Rhs>& B) const;
289
+ #endif // EIGEN_PARSED_BY_DOXYGEN
290
+
291
+ /** \brief Reports whether previous computation was successful.
292
+ *
293
+ * \returns \c Success if computation was successful,
294
+ * \c NumericalIssue if the LU factorization reports a problem, zero diagonal for instance
295
+ * \c InvalidInput if the input matrix is invalid
296
+ *
297
+ * \sa iparm()
298
+ */
299
+ ComputationInfo info() const
300
+ {
301
+ eigen_assert(m_isInitialized && "Decomposition is not initialized.");
302
+ return m_info;
303
+ }
304
+
305
+ /**
306
+ * \returns A string describing the type of error
307
+ */
308
+ std::string lastErrorMessage() const
309
+ {
310
+ return m_lastError;
311
+ }
312
+
313
+ template<typename Rhs, typename Dest>
314
+ bool _solve_impl(const MatrixBase<Rhs> &B, MatrixBase<Dest> &X_base) const
315
+ {
316
+ Dest& X(X_base.derived());
317
+ eigen_assert(m_factorizationIsOk && "The matrix should be factorized first");
318
+ EIGEN_STATIC_ASSERT((Dest::Flags&RowMajorBit)==0,
319
+ THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
320
+
321
+ // Permute the right hand side to form X = Pr*B
322
+ // on return, X is overwritten by the computed solution
323
+ X.resize(B.rows(),B.cols());
324
+
325
+ // this ugly const_cast_derived() helps to detect aliasing when applying the permutations
326
+ for(Index j = 0; j < B.cols(); ++j)
327
+ X.col(j) = rowsPermutation() * B.const_cast_derived().col(j);
328
+
329
+ //Forward substitution with L
330
+ this->matrixL().solveInPlace(X);
331
+ this->matrixU().solveInPlace(X);
332
+
333
+ // Permute back the solution
334
+ for (Index j = 0; j < B.cols(); ++j)
335
+ X.col(j) = colsPermutation().inverse() * X.col(j);
336
+
337
+ return true;
338
+ }
339
+
340
+ /**
341
+ * \returns the absolute value of the determinant of the matrix of which
342
+ * *this is the QR decomposition.
343
+ *
344
+ * \warning a determinant can be very big or small, so for matrices
345
+ * of large enough dimension, there is a risk of overflow/underflow.
346
+ * One way to work around that is to use logAbsDeterminant() instead.
347
+ *
348
+ * \sa logAbsDeterminant(), signDeterminant()
349
+ */
350
+ Scalar absDeterminant()
351
+ {
352
+ using std::abs;
353
+ eigen_assert(m_factorizationIsOk && "The matrix should be factorized first.");
354
+ // Initialize with the determinant of the row matrix
355
+ Scalar det = Scalar(1.);
356
+ // Note that the diagonal blocks of U are stored in supernodes,
357
+ // which are available in the L part :)
358
+ for (Index j = 0; j < this->cols(); ++j)
359
+ {
360
+ for (typename SCMatrix::InnerIterator it(m_Lstore, j); it; ++it)
361
+ {
362
+ if(it.index() == j)
363
+ {
364
+ det *= abs(it.value());
365
+ break;
366
+ }
367
+ }
368
+ }
369
+ return det;
370
+ }
371
+
372
+ /** \returns the natural log of the absolute value of the determinant of the matrix
373
+ * of which **this is the QR decomposition
374
+ *
375
+ * \note This method is useful to work around the risk of overflow/underflow that's
376
+ * inherent to the determinant computation.
377
+ *
378
+ * \sa absDeterminant(), signDeterminant()
379
+ */
380
+ Scalar logAbsDeterminant() const
381
+ {
382
+ using std::log;
383
+ using std::abs;
384
+
385
+ eigen_assert(m_factorizationIsOk && "The matrix should be factorized first.");
386
+ Scalar det = Scalar(0.);
387
+ for (Index j = 0; j < this->cols(); ++j)
388
+ {
389
+ for (typename SCMatrix::InnerIterator it(m_Lstore, j); it; ++it)
390
+ {
391
+ if(it.row() < j) continue;
392
+ if(it.row() == j)
393
+ {
394
+ det += log(abs(it.value()));
395
+ break;
396
+ }
397
+ }
398
+ }
399
+ return det;
400
+ }
401
+
402
+ /** \returns A number representing the sign of the determinant
403
+ *
404
+ * \sa absDeterminant(), logAbsDeterminant()
405
+ */
406
+ Scalar signDeterminant()
407
+ {
408
+ eigen_assert(m_factorizationIsOk && "The matrix should be factorized first.");
409
+ // Initialize with the determinant of the row matrix
410
+ Index det = 1;
411
+ // Note that the diagonal blocks of U are stored in supernodes,
412
+ // which are available in the L part :)
413
+ for (Index j = 0; j < this->cols(); ++j)
414
+ {
415
+ for (typename SCMatrix::InnerIterator it(m_Lstore, j); it; ++it)
416
+ {
417
+ if(it.index() == j)
418
+ {
419
+ if(it.value()<0)
420
+ det = -det;
421
+ else if(it.value()==0)
422
+ return 0;
423
+ break;
424
+ }
425
+ }
426
+ }
427
+ return det * m_detPermR * m_detPermC;
428
+ }
429
+
430
+ /** \returns The determinant of the matrix.
431
+ *
432
+ * \sa absDeterminant(), logAbsDeterminant()
433
+ */
434
+ Scalar determinant()
435
+ {
436
+ eigen_assert(m_factorizationIsOk && "The matrix should be factorized first.");
437
+ // Initialize with the determinant of the row matrix
438
+ Scalar det = Scalar(1.);
439
+ // Note that the diagonal blocks of U are stored in supernodes,
440
+ // which are available in the L part :)
441
+ for (Index j = 0; j < this->cols(); ++j)
442
+ {
443
+ for (typename SCMatrix::InnerIterator it(m_Lstore, j); it; ++it)
444
+ {
445
+ if(it.index() == j)
446
+ {
447
+ det *= it.value();
448
+ break;
449
+ }
450
+ }
451
+ }
452
+ return (m_detPermR * m_detPermC) > 0 ? det : -det;
453
+ }
454
+
455
+ Index nnzL() const { return m_nnzL; };
456
+ Index nnzU() const { return m_nnzU; };
457
+
458
+ protected:
459
+ // Functions
460
+ void initperfvalues()
461
+ {
462
+ m_perfv.panel_size = 16;
463
+ m_perfv.relax = 1;
464
+ m_perfv.maxsuper = 128;
465
+ m_perfv.rowblk = 16;
466
+ m_perfv.colblk = 8;
467
+ m_perfv.fillfactor = 20;
468
+ }
469
+
470
+ // Variables
471
+ mutable ComputationInfo m_info;
472
+ bool m_factorizationIsOk;
473
+ bool m_analysisIsOk;
474
+ std::string m_lastError;
475
+ NCMatrix m_mat; // The input (permuted ) matrix
476
+ SCMatrix m_Lstore; // The lower triangular matrix (supernodal)
477
+ MappedSparseMatrix<Scalar,ColMajor,StorageIndex> m_Ustore; // The upper triangular matrix
478
+ PermutationType m_perm_c; // Column permutation
479
+ PermutationType m_perm_r ; // Row permutation
480
+ IndexVector m_etree; // Column elimination tree
481
+
482
+ typename Base::GlobalLU_t m_glu;
483
+
484
+ // SparseLU options
485
+ bool m_symmetricmode;
486
+ // values for performance
487
+ internal::perfvalues m_perfv;
488
+ RealScalar m_diagpivotthresh; // Specifies the threshold used for a diagonal entry to be an acceptable pivot
489
+ Index m_nnzL, m_nnzU; // Nonzeros in L and U factors
490
+ Index m_detPermR, m_detPermC; // Determinants of the permutation matrices
491
+ private:
492
+ // Disable copy constructor
493
+ SparseLU (const SparseLU& );
494
+ }; // End class SparseLU
495
+
496
+
497
+
498
+ // Functions needed by the anaysis phase
499
+ /**
500
+ * Compute the column permutation to minimize the fill-in
501
+ *
502
+ * - Apply this permutation to the input matrix -
503
+ *
504
+ * - Compute the column elimination tree on the permuted matrix
505
+ *
506
+ * - Postorder the elimination tree and the column permutation
507
+ *
508
+ */
509
+ template <typename MatrixType, typename OrderingType>
510
+ void SparseLU<MatrixType, OrderingType>::analyzePattern(const MatrixType& mat)
511
+ {
512
+
513
+ //TODO It is possible as in SuperLU to compute row and columns scaling vectors to equilibrate the matrix mat.
514
+
515
+ // Firstly, copy the whole input matrix.
516
+ m_mat = mat;
517
+
518
+ // Compute fill-in ordering
519
+ OrderingType ord;
520
+ ord(m_mat,m_perm_c);
521
+
522
+ // Apply the permutation to the column of the input matrix
523
+ if (m_perm_c.size())
524
+ {
525
+ m_mat.uncompress(); //NOTE: The effect of this command is only to create the InnerNonzeros pointers. FIXME : This vector is filled but not subsequently used.
526
+ // Then, permute only the column pointers
527
+ ei_declare_aligned_stack_constructed_variable(StorageIndex,outerIndexPtr,mat.cols()+1,mat.isCompressed()?const_cast<StorageIndex*>(mat.outerIndexPtr()):0);
528
+
529
+ // If the input matrix 'mat' is uncompressed, then the outer-indices do not match the ones of m_mat, and a copy is thus needed.
530
+ if(!mat.isCompressed())
531
+ IndexVector::Map(outerIndexPtr, mat.cols()+1) = IndexVector::Map(m_mat.outerIndexPtr(),mat.cols()+1);
532
+
533
+ // Apply the permutation and compute the nnz per column.
534
+ for (Index i = 0; i < mat.cols(); i++)
535
+ {
536
+ m_mat.outerIndexPtr()[m_perm_c.indices()(i)] = outerIndexPtr[i];
537
+ m_mat.innerNonZeroPtr()[m_perm_c.indices()(i)] = outerIndexPtr[i+1] - outerIndexPtr[i];
538
+ }
539
+ }
540
+
541
+ // Compute the column elimination tree of the permuted matrix
542
+ IndexVector firstRowElt;
543
+ internal::coletree(m_mat, m_etree,firstRowElt);
544
+
545
+ // In symmetric mode, do not do postorder here
546
+ if (!m_symmetricmode) {
547
+ IndexVector post, iwork;
548
+ // Post order etree
549
+ internal::treePostorder(StorageIndex(m_mat.cols()), m_etree, post);
550
+
551
+
552
+ // Renumber etree in postorder
553
+ Index m = m_mat.cols();
554
+ iwork.resize(m+1);
555
+ for (Index i = 0; i < m; ++i) iwork(post(i)) = post(m_etree(i));
556
+ m_etree = iwork;
557
+
558
+ // Postmultiply A*Pc by post, i.e reorder the matrix according to the postorder of the etree
559
+ PermutationType post_perm(m);
560
+ for (Index i = 0; i < m; i++)
561
+ post_perm.indices()(i) = post(i);
562
+
563
+ // Combine the two permutations : postorder the permutation for future use
564
+ if(m_perm_c.size()) {
565
+ m_perm_c = post_perm * m_perm_c;
566
+ }
567
+
568
+ } // end postordering
569
+
570
+ m_analysisIsOk = true;
571
+ }
572
+
573
+ // Functions needed by the numerical factorization phase
574
+
575
+
576
+ /**
577
+ * - Numerical factorization
578
+ * - Interleaved with the symbolic factorization
579
+ * On exit, info is
580
+ *
581
+ * = 0: successful factorization
582
+ *
583
+ * > 0: if info = i, and i is
584
+ *
585
+ * <= A->ncol: U(i,i) is exactly zero. The factorization has
586
+ * been completed, but the factor U is exactly singular,
587
+ * and division by zero will occur if it is used to solve a
588
+ * system of equations.
589
+ *
590
+ * > A->ncol: number of bytes allocated when memory allocation
591
+ * failure occurred, plus A->ncol. If lwork = -1, it is
592
+ * the estimated amount of space needed, plus A->ncol.
593
+ */
594
+ template <typename MatrixType, typename OrderingType>
595
+ void SparseLU<MatrixType, OrderingType>::factorize(const MatrixType& matrix)
596
+ {
597
+ using internal::emptyIdxLU;
598
+ eigen_assert(m_analysisIsOk && "analyzePattern() should be called first");
599
+ eigen_assert((matrix.rows() == matrix.cols()) && "Only for squared matrices");
600
+
601
+ m_isInitialized = true;
602
+
603
+ // Apply the column permutation computed in analyzepattern()
604
+ // m_mat = matrix * m_perm_c.inverse();
605
+ m_mat = matrix;
606
+ if (m_perm_c.size())
607
+ {
608
+ m_mat.uncompress(); //NOTE: The effect of this command is only to create the InnerNonzeros pointers.
609
+ //Then, permute only the column pointers
610
+ const StorageIndex * outerIndexPtr;
611
+ if (matrix.isCompressed()) outerIndexPtr = matrix.outerIndexPtr();
612
+ else
613
+ {
614
+ StorageIndex* outerIndexPtr_t = new StorageIndex[matrix.cols()+1];
615
+ for(Index i = 0; i <= matrix.cols(); i++) outerIndexPtr_t[i] = m_mat.outerIndexPtr()[i];
616
+ outerIndexPtr = outerIndexPtr_t;
617
+ }
618
+ for (Index i = 0; i < matrix.cols(); i++)
619
+ {
620
+ m_mat.outerIndexPtr()[m_perm_c.indices()(i)] = outerIndexPtr[i];
621
+ m_mat.innerNonZeroPtr()[m_perm_c.indices()(i)] = outerIndexPtr[i+1] - outerIndexPtr[i];
622
+ }
623
+ if(!matrix.isCompressed()) delete[] outerIndexPtr;
624
+ }
625
+ else
626
+ { //FIXME This should not be needed if the empty permutation is handled transparently
627
+ m_perm_c.resize(matrix.cols());
628
+ for(StorageIndex i = 0; i < matrix.cols(); ++i) m_perm_c.indices()(i) = i;
629
+ }
630
+
631
+ Index m = m_mat.rows();
632
+ Index n = m_mat.cols();
633
+ Index nnz = m_mat.nonZeros();
634
+ Index maxpanel = m_perfv.panel_size * m;
635
+ // Allocate working storage common to the factor routines
636
+ Index lwork = 0;
637
+ Index info = Base::memInit(m, n, nnz, lwork, m_perfv.fillfactor, m_perfv.panel_size, m_glu);
638
+ if (info)
639
+ {
640
+ m_lastError = "UNABLE TO ALLOCATE WORKING MEMORY\n\n" ;
641
+ m_factorizationIsOk = false;
642
+ return ;
643
+ }
644
+
645
+ // Set up pointers for integer working arrays
646
+ IndexVector segrep(m); segrep.setZero();
647
+ IndexVector parent(m); parent.setZero();
648
+ IndexVector xplore(m); xplore.setZero();
649
+ IndexVector repfnz(maxpanel);
650
+ IndexVector panel_lsub(maxpanel);
651
+ IndexVector xprune(n); xprune.setZero();
652
+ IndexVector marker(m*internal::LUNoMarker); marker.setZero();
653
+
654
+ repfnz.setConstant(-1);
655
+ panel_lsub.setConstant(-1);
656
+
657
+ // Set up pointers for scalar working arrays
658
+ ScalarVector dense;
659
+ dense.setZero(maxpanel);
660
+ ScalarVector tempv;
661
+ tempv.setZero(internal::LUnumTempV(m, m_perfv.panel_size, m_perfv.maxsuper, /*m_perfv.rowblk*/m) );
662
+
663
+ // Compute the inverse of perm_c
664
+ PermutationType iperm_c(m_perm_c.inverse());
665
+
666
+ // Identify initial relaxed snodes
667
+ IndexVector relax_end(n);
668
+ if ( m_symmetricmode == true )
669
+ Base::heap_relax_snode(n, m_etree, m_perfv.relax, marker, relax_end);
670
+ else
671
+ Base::relax_snode(n, m_etree, m_perfv.relax, marker, relax_end);
672
+
673
+
674
+ m_perm_r.resize(m);
675
+ m_perm_r.indices().setConstant(-1);
676
+ marker.setConstant(-1);
677
+ m_detPermR = 1; // Record the determinant of the row permutation
678
+
679
+ m_glu.supno(0) = emptyIdxLU; m_glu.xsup.setConstant(0);
680
+ m_glu.xsup(0) = m_glu.xlsub(0) = m_glu.xusub(0) = m_glu.xlusup(0) = Index(0);
681
+
682
+ // Work on one 'panel' at a time. A panel is one of the following :
683
+ // (a) a relaxed supernode at the bottom of the etree, or
684
+ // (b) panel_size contiguous columns, <panel_size> defined by the user
685
+ Index jcol;
686
+ Index pivrow; // Pivotal row number in the original row matrix
687
+ Index nseg1; // Number of segments in U-column above panel row jcol
688
+ Index nseg; // Number of segments in each U-column
689
+ Index irep;
690
+ Index i, k, jj;
691
+ for (jcol = 0; jcol < n; )
692
+ {
693
+ // Adjust panel size so that a panel won't overlap with the next relaxed snode.
694
+ Index panel_size = m_perfv.panel_size; // upper bound on panel width
695
+ for (k = jcol + 1; k < (std::min)(jcol+panel_size, n); k++)
696
+ {
697
+ if (relax_end(k) != emptyIdxLU)
698
+ {
699
+ panel_size = k - jcol;
700
+ break;
701
+ }
702
+ }
703
+ if (k == n)
704
+ panel_size = n - jcol;
705
+
706
+ // Symbolic outer factorization on a panel of columns
707
+ Base::panel_dfs(m, panel_size, jcol, m_mat, m_perm_r.indices(), nseg1, dense, panel_lsub, segrep, repfnz, xprune, marker, parent, xplore, m_glu);
708
+
709
+ // Numeric sup-panel updates in topological order
710
+ Base::panel_bmod(m, panel_size, jcol, nseg1, dense, tempv, segrep, repfnz, m_glu);
711
+
712
+ // Sparse LU within the panel, and below the panel diagonal
713
+ for ( jj = jcol; jj< jcol + panel_size; jj++)
714
+ {
715
+ k = (jj - jcol) * m; // Column index for w-wide arrays
716
+
717
+ nseg = nseg1; // begin after all the panel segments
718
+ //Depth-first-search for the current column
719
+ VectorBlock<IndexVector> panel_lsubk(panel_lsub, k, m);
720
+ VectorBlock<IndexVector> repfnz_k(repfnz, k, m);
721
+ info = Base::column_dfs(m, jj, m_perm_r.indices(), m_perfv.maxsuper, nseg, panel_lsubk, segrep, repfnz_k, xprune, marker, parent, xplore, m_glu);
722
+ if ( info )
723
+ {
724
+ m_lastError = "UNABLE TO EXPAND MEMORY IN COLUMN_DFS() ";
725
+ m_info = NumericalIssue;
726
+ m_factorizationIsOk = false;
727
+ return;
728
+ }
729
+ // Numeric updates to this column
730
+ VectorBlock<ScalarVector> dense_k(dense, k, m);
731
+ VectorBlock<IndexVector> segrep_k(segrep, nseg1, m-nseg1);
732
+ info = Base::column_bmod(jj, (nseg - nseg1), dense_k, tempv, segrep_k, repfnz_k, jcol, m_glu);
733
+ if ( info )
734
+ {
735
+ m_lastError = "UNABLE TO EXPAND MEMORY IN COLUMN_BMOD() ";
736
+ m_info = NumericalIssue;
737
+ m_factorizationIsOk = false;
738
+ return;
739
+ }
740
+
741
+ // Copy the U-segments to ucol(*)
742
+ info = Base::copy_to_ucol(jj, nseg, segrep, repfnz_k ,m_perm_r.indices(), dense_k, m_glu);
743
+ if ( info )
744
+ {
745
+ m_lastError = "UNABLE TO EXPAND MEMORY IN COPY_TO_UCOL() ";
746
+ m_info = NumericalIssue;
747
+ m_factorizationIsOk = false;
748
+ return;
749
+ }
750
+
751
+ // Form the L-segment
752
+ info = Base::pivotL(jj, m_diagpivotthresh, m_perm_r.indices(), iperm_c.indices(), pivrow, m_glu);
753
+ if ( info )
754
+ {
755
+ m_lastError = "THE MATRIX IS STRUCTURALLY SINGULAR ... ZERO COLUMN AT ";
756
+ std::ostringstream returnInfo;
757
+ returnInfo << info;
758
+ m_lastError += returnInfo.str();
759
+ m_info = NumericalIssue;
760
+ m_factorizationIsOk = false;
761
+ return;
762
+ }
763
+
764
+ // Update the determinant of the row permutation matrix
765
+ // FIXME: the following test is not correct, we should probably take iperm_c into account and pivrow is not directly the row pivot.
766
+ if (pivrow != jj) m_detPermR = -m_detPermR;
767
+
768
+ // Prune columns (0:jj-1) using column jj
769
+ Base::pruneL(jj, m_perm_r.indices(), pivrow, nseg, segrep, repfnz_k, xprune, m_glu);
770
+
771
+ // Reset repfnz for this column
772
+ for (i = 0; i < nseg; i++)
773
+ {
774
+ irep = segrep(i);
775
+ repfnz_k(irep) = emptyIdxLU;
776
+ }
777
+ } // end SparseLU within the panel
778
+ jcol += panel_size; // Move to the next panel
779
+ } // end for -- end elimination
780
+
781
+ m_detPermR = m_perm_r.determinant();
782
+ m_detPermC = m_perm_c.determinant();
783
+
784
+ // Count the number of nonzeros in factors
785
+ Base::countnz(n, m_nnzL, m_nnzU, m_glu);
786
+ // Apply permutation to the L subscripts
787
+ Base::fixupL(n, m_perm_r.indices(), m_glu);
788
+
789
+ // Create supernode matrix L
790
+ m_Lstore.setInfos(m, n, m_glu.lusup, m_glu.xlusup, m_glu.lsub, m_glu.xlsub, m_glu.supno, m_glu.xsup);
791
+ // Create the column major upper sparse matrix U;
792
+ new (&m_Ustore) MappedSparseMatrix<Scalar, ColMajor, StorageIndex> ( m, n, m_nnzU, m_glu.xusub.data(), m_glu.usub.data(), m_glu.ucol.data() );
793
+
794
+ m_info = Success;
795
+ m_factorizationIsOk = true;
796
+ }
797
+
798
+ template<typename MappedSupernodalType>
799
+ struct SparseLUMatrixLReturnType : internal::no_assignment_operator
800
+ {
801
+ typedef typename MappedSupernodalType::Scalar Scalar;
802
+ explicit SparseLUMatrixLReturnType(const MappedSupernodalType& mapL) : m_mapL(mapL)
803
+ { }
804
+ Index rows() const { return m_mapL.rows(); }
805
+ Index cols() const { return m_mapL.cols(); }
806
+ template<typename Dest>
807
+ void solveInPlace( MatrixBase<Dest> &X) const
808
+ {
809
+ m_mapL.solveInPlace(X);
810
+ }
811
+ template<bool Conjugate, typename Dest>
812
+ void solveTransposedInPlace( MatrixBase<Dest> &X) const
813
+ {
814
+ m_mapL.template solveTransposedInPlace<Conjugate>(X);
815
+ }
816
+
817
+ const MappedSupernodalType& m_mapL;
818
+ };
819
+
820
+ template<typename MatrixLType, typename MatrixUType>
821
+ struct SparseLUMatrixUReturnType : internal::no_assignment_operator
822
+ {
823
+ typedef typename MatrixLType::Scalar Scalar;
824
+ SparseLUMatrixUReturnType(const MatrixLType& mapL, const MatrixUType& mapU)
825
+ : m_mapL(mapL),m_mapU(mapU)
826
+ { }
827
+ Index rows() const { return m_mapL.rows(); }
828
+ Index cols() const { return m_mapL.cols(); }
829
+
830
+ template<typename Dest> void solveInPlace(MatrixBase<Dest> &X) const
831
+ {
832
+ Index nrhs = X.cols();
833
+ Index n = X.rows();
834
+ // Backward solve with U
835
+ for (Index k = m_mapL.nsuper(); k >= 0; k--)
836
+ {
837
+ Index fsupc = m_mapL.supToCol()[k];
838
+ Index lda = m_mapL.colIndexPtr()[fsupc+1] - m_mapL.colIndexPtr()[fsupc]; // leading dimension
839
+ Index nsupc = m_mapL.supToCol()[k+1] - fsupc;
840
+ Index luptr = m_mapL.colIndexPtr()[fsupc];
841
+
842
+ if (nsupc == 1)
843
+ {
844
+ for (Index j = 0; j < nrhs; j++)
845
+ {
846
+ X(fsupc, j) /= m_mapL.valuePtr()[luptr];
847
+ }
848
+ }
849
+ else
850
+ {
851
+ // FIXME: the following lines should use Block expressions and not Map!
852
+ Map<const Matrix<Scalar,Dynamic,Dynamic, ColMajor>, 0, OuterStride<> > A( &(m_mapL.valuePtr()[luptr]), nsupc, nsupc, OuterStride<>(lda) );
853
+ Map< Matrix<Scalar,Dynamic,Dest::ColsAtCompileTime, ColMajor>, 0, OuterStride<> > U (&(X.coeffRef(fsupc,0)), nsupc, nrhs, OuterStride<>(n) );
854
+ U = A.template triangularView<Upper>().solve(U);
855
+ }
856
+
857
+ for (Index j = 0; j < nrhs; ++j)
858
+ {
859
+ for (Index jcol = fsupc; jcol < fsupc + nsupc; jcol++)
860
+ {
861
+ typename MatrixUType::InnerIterator it(m_mapU, jcol);
862
+ for ( ; it; ++it)
863
+ {
864
+ Index irow = it.index();
865
+ X(irow, j) -= X(jcol, j) * it.value();
866
+ }
867
+ }
868
+ }
869
+ } // End For U-solve
870
+ }
871
+
872
+ template<bool Conjugate, typename Dest> void solveTransposedInPlace(MatrixBase<Dest> &X) const
873
+ {
874
+ using numext::conj;
875
+ Index nrhs = X.cols();
876
+ Index n = X.rows();
877
+ // Forward solve with U
878
+ for (Index k = 0; k <= m_mapL.nsuper(); k++)
879
+ {
880
+ Index fsupc = m_mapL.supToCol()[k];
881
+ Index lda = m_mapL.colIndexPtr()[fsupc+1] - m_mapL.colIndexPtr()[fsupc]; // leading dimension
882
+ Index nsupc = m_mapL.supToCol()[k+1] - fsupc;
883
+ Index luptr = m_mapL.colIndexPtr()[fsupc];
884
+
885
+ for (Index j = 0; j < nrhs; ++j)
886
+ {
887
+ for (Index jcol = fsupc; jcol < fsupc + nsupc; jcol++)
888
+ {
889
+ typename MatrixUType::InnerIterator it(m_mapU, jcol);
890
+ for ( ; it; ++it)
891
+ {
892
+ Index irow = it.index();
893
+ X(jcol, j) -= X(irow, j) * (Conjugate? conj(it.value()): it.value());
894
+ }
895
+ }
896
+ }
897
+ if (nsupc == 1)
898
+ {
899
+ for (Index j = 0; j < nrhs; j++)
900
+ {
901
+ X(fsupc, j) /= (Conjugate? conj(m_mapL.valuePtr()[luptr]) : m_mapL.valuePtr()[luptr]);
902
+ }
903
+ }
904
+ else
905
+ {
906
+ Map<const Matrix<Scalar,Dynamic,Dynamic, ColMajor>, 0, OuterStride<> > A( &(m_mapL.valuePtr()[luptr]), nsupc, nsupc, OuterStride<>(lda) );
907
+ Map< Matrix<Scalar,Dynamic,Dest::ColsAtCompileTime, ColMajor>, 0, OuterStride<> > U (&(X(fsupc,0)), nsupc, nrhs, OuterStride<>(n) );
908
+ if(Conjugate)
909
+ U = A.adjoint().template triangularView<Lower>().solve(U);
910
+ else
911
+ U = A.transpose().template triangularView<Lower>().solve(U);
912
+ }
913
+ }// End For U-solve
914
+ }
915
+
916
+
917
+ const MatrixLType& m_mapL;
918
+ const MatrixUType& m_mapU;
919
+ };
920
+
921
+ } // End namespace Eigen
922
+
923
+ #endif