tomoto 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -22,6 +22,11 @@
22
22
  // #define EIGEN_BDCSVD_DEBUG_VERBOSE
23
23
  // #define EIGEN_BDCSVD_SANITY_CHECKS
24
24
 
25
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
26
+ #undef eigen_internal_assert
27
+ #define eigen_internal_assert(X) assert(X);
28
+ #endif
29
+
25
30
  namespace Eigen {
26
31
 
27
32
  #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
@@ -34,6 +39,7 @@ namespace internal {
34
39
 
35
40
  template<typename _MatrixType>
36
41
  struct traits<BDCSVD<_MatrixType> >
42
+ : traits<_MatrixType>
37
43
  {
38
44
  typedef _MatrixType MatrixType;
39
45
  };
@@ -57,7 +63,7 @@ struct traits<BDCSVD<_MatrixType> >
57
63
  * recommended and can several order of magnitude faster.
58
64
  *
59
65
  * \warning this algorithm is unlikely to provide accurate result when compiled with unsafe math optimizations.
60
- * For instance, this concerns Intel's compiler (ICC), which perfroms such optimization by default unless
66
+ * For instance, this concerns Intel's compiler (ICC), which performs such optimization by default unless
61
67
  * you compile with the \c -fp-model \c precise option. Likewise, the \c -ffast-math option of GCC or clang will
62
68
  * significantly degrade the accuracy.
63
69
  *
@@ -105,7 +111,7 @@ public:
105
111
  * The default constructor is useful in cases in which the user intends to
106
112
  * perform decompositions via BDCSVD::compute(const MatrixType&).
107
113
  */
108
- BDCSVD() : m_algoswap(16), m_numIters(0)
114
+ BDCSVD() : m_algoswap(16), m_isTranspose(false), m_compU(false), m_compV(false), m_numIters(0)
109
115
  {}
110
116
 
111
117
 
@@ -202,6 +208,7 @@ protected:
202
208
  using Base::m_computeThinV;
203
209
  using Base::m_matrixU;
204
210
  using Base::m_matrixV;
211
+ using Base::m_info;
205
212
  using Base::m_isInitialized;
206
213
  using Base::m_nonzeroSingularValues;
207
214
 
@@ -212,7 +219,7 @@ public:
212
219
 
213
220
  // Method to allocate and initialize matrix and attributes
214
221
  template<typename MatrixType>
215
- void BDCSVD<MatrixType>::allocate(Index rows, Index cols, unsigned int computationOptions)
222
+ void BDCSVD<MatrixType>::allocate(Eigen::Index rows, Eigen::Index cols, unsigned int computationOptions)
216
223
  {
217
224
  m_isTranspose = (cols > rows);
218
225
 
@@ -250,16 +257,25 @@ BDCSVD<MatrixType>& BDCSVD<MatrixType>::compute(const MatrixType& matrix, unsign
250
257
  {
251
258
  // FIXME this line involves temporaries
252
259
  JacobiSVD<MatrixType> jsvd(matrix,computationOptions);
253
- if(computeU()) m_matrixU = jsvd.matrixU();
254
- if(computeV()) m_matrixV = jsvd.matrixV();
255
- m_singularValues = jsvd.singularValues();
256
- m_nonzeroSingularValues = jsvd.nonzeroSingularValues();
257
260
  m_isInitialized = true;
261
+ m_info = jsvd.info();
262
+ if (m_info == Success || m_info == NoConvergence) {
263
+ if(computeU()) m_matrixU = jsvd.matrixU();
264
+ if(computeV()) m_matrixV = jsvd.matrixV();
265
+ m_singularValues = jsvd.singularValues();
266
+ m_nonzeroSingularValues = jsvd.nonzeroSingularValues();
267
+ }
258
268
  return *this;
259
269
  }
260
270
 
261
271
  //**** step 0 - Copy the input matrix and apply scaling to reduce over/under-flows
262
- RealScalar scale = matrix.cwiseAbs().maxCoeff();
272
+ RealScalar scale = matrix.cwiseAbs().template maxCoeff<PropagateNaN>();
273
+ if (!(numext::isfinite)(scale)) {
274
+ m_isInitialized = true;
275
+ m_info = InvalidInput;
276
+ return *this;
277
+ }
278
+
263
279
  if(scale==Literal(0)) scale = Literal(1);
264
280
  MatrixX copy;
265
281
  if (m_isTranspose) copy = matrix.adjoint()/scale;
@@ -276,7 +292,11 @@ BDCSVD<MatrixType>& BDCSVD<MatrixType>::compute(const MatrixType& matrix, unsign
276
292
  m_computed.topRows(m_diagSize) = bid.bidiagonal().toDenseMatrix().transpose();
277
293
  m_computed.template bottomRows<1>().setZero();
278
294
  divide(0, m_diagSize - 1, 0, 0, 0);
279
-
295
+ if (m_info != Success && m_info != NoConvergence) {
296
+ m_isInitialized = true;
297
+ return *this;
298
+ }
299
+
280
300
  //**** step 3 - Copy singular values and vectors
281
301
  for (int i=0; i<m_diagSize; i++)
282
302
  {
@@ -388,7 +408,7 @@ void BDCSVD<MatrixType>::structured_update(Block<MatrixXr,Dynamic,Dynamic> A, co
388
408
  //@param shift : Each time one takes the left submatrix, one must add 1 to the shift. Why? Because! We actually want the last column of the U submatrix
389
409
  // to become the first column (*coeff) and to shift all the other columns to the right. There are more details on the reference paper.
390
410
  template<typename MatrixType>
391
- void BDCSVD<MatrixType>::divide (Index firstCol, Index lastCol, Index firstRowW, Index firstColW, Index shift)
411
+ void BDCSVD<MatrixType>::divide(Eigen::Index firstCol, Eigen::Index lastCol, Eigen::Index firstRowW, Eigen::Index firstColW, Eigen::Index shift)
392
412
  {
393
413
  // requires rows = cols + 1;
394
414
  using std::pow;
@@ -408,6 +428,8 @@ void BDCSVD<MatrixType>::divide (Index firstCol, Index lastCol, Index firstRowW,
408
428
  {
409
429
  // FIXME this line involves temporaries
410
430
  JacobiSVD<MatrixXr> b(m_computed.block(firstCol, firstCol, n + 1, n), ComputeFullU | (m_compV ? ComputeFullV : 0));
431
+ m_info = b.info();
432
+ if (m_info != Success && m_info != NoConvergence) return;
411
433
  if (m_compU)
412
434
  m_naiveU.block(firstCol, firstCol, n + 1, n + 1).real() = b.matrixU();
413
435
  else
@@ -427,7 +449,9 @@ void BDCSVD<MatrixType>::divide (Index firstCol, Index lastCol, Index firstRowW,
427
449
  // and the divide of the right submatrice reads one column of the left submatrice. That's why we need to treat the
428
450
  // right submatrix before the left one.
429
451
  divide(k + 1 + firstCol, lastCol, k + 1 + firstRowW, k + 1 + firstColW, shift);
452
+ if (m_info != Success && m_info != NoConvergence) return;
430
453
  divide(firstCol, k - 1 + firstCol, firstRowW, firstColW + 1, shift + 1);
454
+ if (m_info != Success && m_info != NoConvergence) return;
431
455
 
432
456
  if (m_compU)
433
457
  {
@@ -568,7 +592,7 @@ void BDCSVD<MatrixType>::divide (Index firstCol, Index lastCol, Index firstRowW,
568
592
  // handling of round-off errors, be consistent in ordering
569
593
  // For instance, to solve the secular equation using FMM, see http://www.stat.uchicago.edu/~lekheng/courses/302/classics/greengard-rokhlin.pdf
570
594
  template <typename MatrixType>
571
- void BDCSVD<MatrixType>::computeSVDofM(Index firstCol, Index n, MatrixXr& U, VectorType& singVals, MatrixXr& V)
595
+ void BDCSVD<MatrixType>::computeSVDofM(Eigen::Index firstCol, Eigen::Index n, MatrixXr& U, VectorType& singVals, MatrixXr& V)
572
596
  {
573
597
  const RealScalar considerZero = (std::numeric_limits<RealScalar>::min)();
574
598
  using std::abs;
@@ -591,7 +615,7 @@ void BDCSVD<MatrixType>::computeSVDofM(Index firstCol, Index n, MatrixXr& U, Vec
591
615
  // but others are interleaved and we must ignore them at this stage.
592
616
  // To this end, let's compute a permutation skipping them:
593
617
  Index actual_n = n;
594
- while(actual_n>1 && diag(actual_n-1)==Literal(0)) --actual_n;
618
+ while(actual_n>1 && diag(actual_n-1)==Literal(0)) {--actual_n; eigen_internal_assert(col0(actual_n)==Literal(0)); }
595
619
  Index m = 0; // size of the deflated problem
596
620
  for(Index k=0;k<actual_n;++k)
597
621
  if(abs(col0(k))>considerZero)
@@ -618,13 +642,11 @@ void BDCSVD<MatrixType>::computeSVDofM(Index firstCol, Index n, MatrixXr& U, Vec
618
642
  std::cout << " shift: " << shifts.transpose() << "\n";
619
643
 
620
644
  {
621
- Index actual_n = n;
622
- while(actual_n>1 && abs(col0(actual_n-1))<considerZero) --actual_n;
623
645
  std::cout << "\n\n mus: " << mus.head(actual_n).transpose() << "\n\n";
624
646
  std::cout << " check1 (expect0) : " << ((singVals.array()-(shifts+mus)) / singVals.array()).head(actual_n).transpose() << "\n\n";
647
+ assert((((singVals.array()-(shifts+mus)) / singVals.array()).head(actual_n) >= 0).all());
625
648
  std::cout << " check2 (>0) : " << ((singVals.array()-diag) / singVals.array()).head(actual_n).transpose() << "\n\n";
626
- std::cout << " check3 (>0) : " << ((diag.segment(1,actual_n-1)-singVals.head(actual_n-1).array()) / singVals.head(actual_n-1).array()).transpose() << "\n\n\n";
627
- std::cout << " check4 (>0) : " << ((singVals.segment(1,actual_n-1)-singVals.head(actual_n-1))).transpose() << "\n\n\n";
649
+ assert((((singVals.array()-diag) / singVals.array()).head(actual_n) >= 0).all());
628
650
  }
629
651
  #endif
630
652
 
@@ -652,13 +674,13 @@ void BDCSVD<MatrixType>::computeSVDofM(Index firstCol, Index n, MatrixXr& U, Vec
652
674
  #endif
653
675
 
654
676
  #ifdef EIGEN_BDCSVD_SANITY_CHECKS
655
- assert(U.allFinite());
656
- assert(V.allFinite());
657
- assert((U.transpose() * U - MatrixXr(MatrixXr::Identity(U.cols(),U.cols()))).norm() < 1e-14 * n);
658
- assert((V.transpose() * V - MatrixXr(MatrixXr::Identity(V.cols(),V.cols()))).norm() < 1e-14 * n);
659
677
  assert(m_naiveU.allFinite());
660
678
  assert(m_naiveV.allFinite());
661
679
  assert(m_computed.allFinite());
680
+ assert(U.allFinite());
681
+ assert(V.allFinite());
682
+ // assert((U.transpose() * U - MatrixXr(MatrixXr::Identity(U.cols(),U.cols()))).norm() < 100*NumTraits<RealScalar>::epsilon() * n);
683
+ // assert((V.transpose() * V - MatrixXr(MatrixXr::Identity(V.cols(),V.cols()))).norm() < 100*NumTraits<RealScalar>::epsilon() * n);
662
684
  #endif
663
685
 
664
686
  // Because of deflation, the singular values might not be completely sorted.
@@ -673,6 +695,15 @@ void BDCSVD<MatrixType>::computeSVDofM(Index firstCol, Index n, MatrixXr& U, Vec
673
695
  if(m_compV) V.col(i).swap(V.col(i+1));
674
696
  }
675
697
  }
698
+
699
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
700
+ {
701
+ bool singular_values_sorted = (((singVals.segment(1,actual_n-1)-singVals.head(actual_n-1))).array() >= 0).all();
702
+ if(!singular_values_sorted)
703
+ std::cout << "Singular values are not sorted: " << singVals.segment(1,actual_n).transpose() << "\n";
704
+ assert(singular_values_sorted);
705
+ }
706
+ #endif
676
707
 
677
708
  // Reverse order so that singular values in increased order
678
709
  // Because of deflation, the zeros singular-values are already at the end
@@ -749,25 +780,43 @@ void BDCSVD<MatrixType>::computeSingVals(const ArrayRef& col0, const ArrayRef& d
749
780
  RealScalar mid = left + (right-left) / Literal(2);
750
781
  RealScalar fMid = secularEq(mid, col0, diag, perm, diag, Literal(0));
751
782
  #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
752
- std::cout << right-left << "\n";
753
- std::cout << "fMid = " << fMid << " " << secularEq(mid-left, col0, diag, perm, diag-left, left) << " " << secularEq(mid-right, col0, diag, perm, diag-right, right) << "\n";
754
- std::cout << " = " << secularEq(0.1*(left+right), col0, diag, perm, diag, 0)
755
- << " " << secularEq(0.2*(left+right), col0, diag, perm, diag, 0)
756
- << " " << secularEq(0.3*(left+right), col0, diag, perm, diag, 0)
757
- << " " << secularEq(0.4*(left+right), col0, diag, perm, diag, 0)
758
- << " " << secularEq(0.49*(left+right), col0, diag, perm, diag, 0)
759
- << " " << secularEq(0.5*(left+right), col0, diag, perm, diag, 0)
760
- << " " << secularEq(0.51*(left+right), col0, diag, perm, diag, 0)
761
- << " " << secularEq(0.6*(left+right), col0, diag, perm, diag, 0)
762
- << " " << secularEq(0.7*(left+right), col0, diag, perm, diag, 0)
763
- << " " << secularEq(0.8*(left+right), col0, diag, perm, diag, 0)
764
- << " " << secularEq(0.9*(left+right), col0, diag, perm, diag, 0) << "\n";
783
+ std::cout << "right-left = " << right-left << "\n";
784
+ // std::cout << "fMid = " << fMid << " " << secularEq(mid-left, col0, diag, perm, ArrayXr(diag-left), left)
785
+ // << " " << secularEq(mid-right, col0, diag, perm, ArrayXr(diag-right), right) << "\n";
786
+ std::cout << " = " << secularEq(left+RealScalar(0.000001)*(right-left), col0, diag, perm, diag, 0)
787
+ << " " << secularEq(left+RealScalar(0.1) *(right-left), col0, diag, perm, diag, 0)
788
+ << " " << secularEq(left+RealScalar(0.2) *(right-left), col0, diag, perm, diag, 0)
789
+ << " " << secularEq(left+RealScalar(0.3) *(right-left), col0, diag, perm, diag, 0)
790
+ << " " << secularEq(left+RealScalar(0.4) *(right-left), col0, diag, perm, diag, 0)
791
+ << " " << secularEq(left+RealScalar(0.49) *(right-left), col0, diag, perm, diag, 0)
792
+ << " " << secularEq(left+RealScalar(0.5) *(right-left), col0, diag, perm, diag, 0)
793
+ << " " << secularEq(left+RealScalar(0.51) *(right-left), col0, diag, perm, diag, 0)
794
+ << " " << secularEq(left+RealScalar(0.6) *(right-left), col0, diag, perm, diag, 0)
795
+ << " " << secularEq(left+RealScalar(0.7) *(right-left), col0, diag, perm, diag, 0)
796
+ << " " << secularEq(left+RealScalar(0.8) *(right-left), col0, diag, perm, diag, 0)
797
+ << " " << secularEq(left+RealScalar(0.9) *(right-left), col0, diag, perm, diag, 0)
798
+ << " " << secularEq(left+RealScalar(0.999999)*(right-left), col0, diag, perm, diag, 0) << "\n";
765
799
  #endif
766
800
  RealScalar shift = (k == actual_n-1 || fMid > Literal(0)) ? left : right;
767
801
 
768
802
  // measure everything relative to shift
769
803
  Map<ArrayXr> diagShifted(m_workspace.data()+4*n, n);
770
804
  diagShifted = diag - shift;
805
+
806
+ if(k!=actual_n-1)
807
+ {
808
+ // check that after the shift, f(mid) is still negative:
809
+ RealScalar midShifted = (right - left) / RealScalar(2);
810
+ if(shift==right)
811
+ midShifted = -midShifted;
812
+ RealScalar fMidShifted = secularEq(midShifted, col0, diag, perm, diagShifted, shift);
813
+ if(fMidShifted>0)
814
+ {
815
+ // fMid was erroneous, fix it:
816
+ shift = fMidShifted > Literal(0) ? left : right;
817
+ diagShifted = diag - shift;
818
+ }
819
+ }
771
820
 
772
821
  // initial guess
773
822
  RealScalar muPrev, muCur;
@@ -804,13 +853,16 @@ void BDCSVD<MatrixType>::computeSingVals(const ArrayRef& col0, const ArrayRef& d
804
853
  // And find mu such that f(mu)==0:
805
854
  RealScalar muZero = -a/b;
806
855
  RealScalar fZero = secularEq(muZero, col0, diag, perm, diagShifted, shift);
856
+
857
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
858
+ assert((numext::isfinite)(fZero));
859
+ #endif
807
860
 
808
861
  muPrev = muCur;
809
862
  fPrev = fCur;
810
863
  muCur = muZero;
811
864
  fCur = fZero;
812
865
 
813
-
814
866
  if (shift == left && (muCur < Literal(0) || muCur > right - left)) useBisection = true;
815
867
  if (shift == right && (muCur < -(right - left) || muCur > Literal(0))) useBisection = true;
816
868
  if (abs(fCur)>abs(fPrev)) useBisection = true;
@@ -843,44 +895,82 @@ void BDCSVD<MatrixType>::computeSingVals(const ArrayRef& col0, const ArrayRef& d
843
895
  else
844
896
  rightShifted = -(std::numeric_limits<RealScalar>::min)();
845
897
  }
846
-
898
+
847
899
  RealScalar fLeft = secularEq(leftShifted, col0, diag, perm, diagShifted, shift);
900
+ eigen_internal_assert(fLeft<Literal(0));
848
901
 
849
- #if defined EIGEN_INTERNAL_DEBUGGING || defined EIGEN_BDCSVD_DEBUG_VERBOSE
902
+ #if defined EIGEN_INTERNAL_DEBUGGING || defined EIGEN_BDCSVD_SANITY_CHECKS
850
903
  RealScalar fRight = secularEq(rightShifted, col0, diag, perm, diagShifted, shift);
851
904
  #endif
852
905
 
906
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
907
+ if(!(numext::isfinite)(fLeft))
908
+ std::cout << "f(" << leftShifted << ") =" << fLeft << " ; " << left << " " << shift << " " << right << "\n";
909
+ assert((numext::isfinite)(fLeft));
910
+
911
+ if(!(numext::isfinite)(fRight))
912
+ std::cout << "f(" << rightShifted << ") =" << fRight << " ; " << left << " " << shift << " " << right << "\n";
913
+ // assert((numext::isfinite)(fRight));
914
+ #endif
915
+
853
916
  #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
854
917
  if(!(fLeft * fRight<0))
855
918
  {
856
- std::cout << "fLeft: " << leftShifted << " - " << diagShifted.head(10).transpose() << "\n ; " << bool(left==shift) << " " << (left-shift) << "\n";
857
- std::cout << k << " : " << fLeft << " * " << fRight << " == " << fLeft * fRight << " ; " << left << " - " << right << " -> " << leftShifted << " " << rightShifted << " shift=" << shift << "\n";
919
+ std::cout << "f(leftShifted) using leftShifted=" << leftShifted << " ; diagShifted(1:10):" << diagShifted.head(10).transpose() << "\n ; "
920
+ << "left==shift=" << bool(left==shift) << " ; left-shift = " << (left-shift) << "\n";
921
+ std::cout << "k=" << k << ", " << fLeft << " * " << fRight << " == " << fLeft * fRight << " ; "
922
+ << "[" << left << " .. " << right << "] -> [" << leftShifted << " " << rightShifted << "], shift=" << shift
923
+ << " , f(right)=" << secularEq(0, col0, diag, perm, diagShifted, shift)
924
+ << " == " << secularEq(right, col0, diag, perm, diag, 0) << " == " << fRight << "\n";
858
925
  }
859
926
  #endif
860
927
  eigen_internal_assert(fLeft * fRight < Literal(0));
861
-
862
- while (rightShifted - leftShifted > Literal(2) * NumTraits<RealScalar>::epsilon() * numext::maxi<RealScalar>(abs(leftShifted), abs(rightShifted)))
928
+
929
+ if(fLeft<Literal(0))
863
930
  {
864
- RealScalar midShifted = (leftShifted + rightShifted) / Literal(2);
865
- fMid = secularEq(midShifted, col0, diag, perm, diagShifted, shift);
866
- if (fLeft * fMid < Literal(0))
931
+ while (rightShifted - leftShifted > Literal(2) * NumTraits<RealScalar>::epsilon() * numext::maxi<RealScalar>(abs(leftShifted), abs(rightShifted)))
867
932
  {
868
- rightShifted = midShifted;
869
- }
870
- else
871
- {
872
- leftShifted = midShifted;
873
- fLeft = fMid;
933
+ RealScalar midShifted = (leftShifted + rightShifted) / Literal(2);
934
+ fMid = secularEq(midShifted, col0, diag, perm, diagShifted, shift);
935
+ eigen_internal_assert((numext::isfinite)(fMid));
936
+
937
+ if (fLeft * fMid < Literal(0))
938
+ {
939
+ rightShifted = midShifted;
940
+ }
941
+ else
942
+ {
943
+ leftShifted = midShifted;
944
+ fLeft = fMid;
945
+ }
874
946
  }
947
+ muCur = (leftShifted + rightShifted) / Literal(2);
948
+ }
949
+ else
950
+ {
951
+ // We have a problem as shifting on the left or right give either a positive or negative value
952
+ // at the middle of [left,right]...
953
+ // Instead fo abbording or entering an infinite loop,
954
+ // let's just use the middle as the estimated zero-crossing:
955
+ muCur = (right - left) * RealScalar(0.5);
956
+ if(shift == right)
957
+ muCur = -muCur;
875
958
  }
876
-
877
- muCur = (leftShifted + rightShifted) / Literal(2);
878
959
  }
879
960
 
880
961
  singVals[k] = shift + muCur;
881
962
  shifts[k] = shift;
882
963
  mus[k] = muCur;
883
964
 
965
+ #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
966
+ if(k+1<n)
967
+ std::cout << "found " << singVals[k] << " == " << shift << " + " << muCur << " from " << diag(k) << " .. " << diag(k+1) << "\n";
968
+ #endif
969
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
970
+ assert(k==0 || singVals[k]>=singVals[k-1]);
971
+ assert(singVals[k]>=diag(k));
972
+ #endif
973
+
884
974
  // perturb singular value slightly if it equals diagonal entry to avoid division by zero later
885
975
  // (deflation is supposed to avoid this from happening)
886
976
  // - this does no seem to be necessary anymore -
@@ -904,7 +994,7 @@ void BDCSVD<MatrixType>::perturbCol0
904
994
  zhat.setZero();
905
995
  return;
906
996
  }
907
- Index last = perm(m-1);
997
+ Index lastIdx = perm(m-1);
908
998
  // The offset permits to skip deflated entries while computing zhat
909
999
  for (Index k = 0; k < n; ++k)
910
1000
  {
@@ -914,27 +1004,58 @@ void BDCSVD<MatrixType>::perturbCol0
914
1004
  {
915
1005
  // see equation (3.6)
916
1006
  RealScalar dk = diag(k);
917
- RealScalar prod = (singVals(last) + dk) * (mus(last) + (shifts(last) - dk));
1007
+ RealScalar prod = (singVals(lastIdx) + dk) * (mus(lastIdx) + (shifts(lastIdx) - dk));
1008
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
1009
+ if(prod<0) {
1010
+ std::cout << "k = " << k << " ; z(k)=" << col0(k) << ", diag(k)=" << dk << "\n";
1011
+ std::cout << "prod = " << "(" << singVals(lastIdx) << " + " << dk << ") * (" << mus(lastIdx) << " + (" << shifts(lastIdx) << " - " << dk << "))" << "\n";
1012
+ std::cout << " = " << singVals(lastIdx) + dk << " * " << mus(lastIdx) + (shifts(lastIdx) - dk) << "\n";
1013
+ }
1014
+ assert(prod>=0);
1015
+ #endif
918
1016
 
919
1017
  for(Index l = 0; l<m; ++l)
920
1018
  {
921
1019
  Index i = perm(l);
922
1020
  if(i!=k)
923
1021
  {
1022
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
1023
+ if(i>=k && (l==0 || l-1>=m))
1024
+ {
1025
+ std::cout << "Error in perturbCol0\n";
1026
+ std::cout << " " << k << "/" << n << " " << l << "/" << m << " " << i << "/" << n << " ; " << col0(k) << " " << diag(k) << " " << "\n";
1027
+ std::cout << " " <<diag(i) << "\n";
1028
+ Index j = (i<k /*|| l==0*/) ? i : perm(l-1);
1029
+ std::cout << " " << "j=" << j << "\n";
1030
+ }
1031
+ #endif
924
1032
  Index j = i<k ? i : perm(l-1);
1033
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
1034
+ if(!(dk!=Literal(0) || diag(i)!=Literal(0)))
1035
+ {
1036
+ std::cout << "k=" << k << ", i=" << i << ", l=" << l << ", perm.size()=" << perm.size() << "\n";
1037
+ }
1038
+ assert(dk!=Literal(0) || diag(i)!=Literal(0));
1039
+ #endif
925
1040
  prod *= ((singVals(j)+dk) / ((diag(i)+dk))) * ((mus(j)+(shifts(j)-dk)) / ((diag(i)-dk)));
1041
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
1042
+ assert(prod>=0);
1043
+ #endif
926
1044
  #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
927
- if(i!=k && std::abs(((singVals(j)+dk)*(mus(j)+(shifts(j)-dk)))/((diag(i)+dk)*(diag(i)-dk)) - 1) > 0.9 )
1045
+ if(i!=k && numext::abs(((singVals(j)+dk)*(mus(j)+(shifts(j)-dk)))/((diag(i)+dk)*(diag(i)-dk)) - 1) > 0.9 )
928
1046
  std::cout << " " << ((singVals(j)+dk)*(mus(j)+(shifts(j)-dk)))/((diag(i)+dk)*(diag(i)-dk)) << " == (" << (singVals(j)+dk) << " * " << (mus(j)+(shifts(j)-dk))
929
1047
  << ") / (" << (diag(i)+dk) << " * " << (diag(i)-dk) << ")\n";
930
1048
  #endif
931
1049
  }
932
1050
  }
933
1051
  #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
934
- std::cout << "zhat(" << k << ") = sqrt( " << prod << ") ; " << (singVals(last) + dk) << " * " << mus(last) + shifts(last) << " - " << dk << "\n";
1052
+ std::cout << "zhat(" << k << ") = sqrt( " << prod << ") ; " << (singVals(lastIdx) + dk) << " * " << mus(lastIdx) + shifts(lastIdx) << " - " << dk << "\n";
935
1053
  #endif
936
1054
  RealScalar tmp = sqrt(prod);
937
- zhat(k) = col0(k) > Literal(0) ? tmp : -tmp;
1055
+ #ifdef EIGEN_BDCSVD_SANITY_CHECKS
1056
+ assert((numext::isfinite)(tmp));
1057
+ #endif
1058
+ zhat(k) = col0(k) > Literal(0) ? RealScalar(tmp) : RealScalar(-tmp);
938
1059
  }
939
1060
  }
940
1061
  }
@@ -987,7 +1108,7 @@ void BDCSVD<MatrixType>::computeSingVecs
987
1108
  // i >= 1, di almost null and zi non null.
988
1109
  // We use a rotation to zero out zi applied to the left of M
989
1110
  template <typename MatrixType>
990
- void BDCSVD<MatrixType>::deflation43(Index firstCol, Index shift, Index i, Index size)
1111
+ void BDCSVD<MatrixType>::deflation43(Eigen::Index firstCol, Eigen::Index shift, Eigen::Index i, Eigen::Index size)
991
1112
  {
992
1113
  using std::abs;
993
1114
  using std::sqrt;
@@ -1016,7 +1137,7 @@ void BDCSVD<MatrixType>::deflation43(Index firstCol, Index shift, Index i, Index
1016
1137
  // We apply two rotations to have zj = 0;
1017
1138
  // TODO deflation44 is still broken and not properly tested
1018
1139
  template <typename MatrixType>
1019
- void BDCSVD<MatrixType>::deflation44(Index firstColu , Index firstColm, Index firstRowW, Index firstColW, Index i, Index j, Index size)
1140
+ void BDCSVD<MatrixType>::deflation44(Eigen::Index firstColu , Eigen::Index firstColm, Eigen::Index firstRowW, Eigen::Index firstColW, Eigen::Index i, Eigen::Index j, Eigen::Index size)
1020
1141
  {
1021
1142
  using std::abs;
1022
1143
  using std::sqrt;
@@ -1043,7 +1164,7 @@ void BDCSVD<MatrixType>::deflation44(Index firstColu , Index firstColm, Index fi
1043
1164
  }
1044
1165
  c/=r;
1045
1166
  s/=r;
1046
- m_computed(firstColm + i, firstColm) = r;
1167
+ m_computed(firstColm + i, firstColm) = r;
1047
1168
  m_computed(firstColm + j, firstColm + j) = m_computed(firstColm + i, firstColm + i);
1048
1169
  m_computed(firstColm + j, firstColm) = Literal(0);
1049
1170
 
@@ -1056,7 +1177,7 @@ void BDCSVD<MatrixType>::deflation44(Index firstColu , Index firstColm, Index fi
1056
1177
 
1057
1178
  // acts on block from (firstCol+shift, firstCol+shift) to (lastCol+shift, lastCol+shift) [inclusive]
1058
1179
  template <typename MatrixType>
1059
- void BDCSVD<MatrixType>::deflation(Index firstCol, Index lastCol, Index k, Index firstRowW, Index firstColW, Index shift)
1180
+ void BDCSVD<MatrixType>::deflation(Eigen::Index firstCol, Eigen::Index lastCol, Eigen::Index k, Eigen::Index firstRowW, Eigen::Index firstColW, Eigen::Index shift)
1060
1181
  {
1061
1182
  using std::sqrt;
1062
1183
  using std::abs;
@@ -1117,6 +1238,7 @@ void BDCSVD<MatrixType>::deflation(Index firstCol, Index lastCol, Index k, Index
1117
1238
  #endif
1118
1239
  #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
1119
1240
  std::cout << "to be sorted: " << diag.transpose() << "\n\n";
1241
+ std::cout << " : " << col0.transpose() << "\n\n";
1120
1242
  #endif
1121
1243
  {
1122
1244
  // Check for total deflation
@@ -1207,7 +1329,7 @@ void BDCSVD<MatrixType>::deflation(Index firstCol, Index lastCol, Index k, Index
1207
1329
  if( (diag(i) - diag(i-1)) < NumTraits<RealScalar>::epsilon()*maxDiag )
1208
1330
  {
1209
1331
  #ifdef EIGEN_BDCSVD_DEBUG_VERBOSE
1210
- std::cout << "deflation 4.4 with i = " << i << " because " << (diag(i) - diag(i-1)) << " < " << NumTraits<RealScalar>::epsilon()*diag(i) << "\n";
1332
+ std::cout << "deflation 4.4 with i = " << i << " because " << diag(i) << " - " << diag(i-1) << " == " << (diag(i) - diag(i-1)) << " < " << NumTraits<RealScalar>::epsilon()*/*diag(i)*/maxDiag << "\n";
1211
1333
  #endif
1212
1334
  eigen_internal_assert(abs(diag(i) - diag(i-1))<epsilon_coarse && " diagonal entries are not properly sorted");
1213
1335
  deflation44(firstCol, firstCol + shift, firstRowW, firstColW, i-1, i, length);
@@ -1226,7 +1348,6 @@ void BDCSVD<MatrixType>::deflation(Index firstCol, Index lastCol, Index k, Index
1226
1348
  #endif
1227
1349
  }//end deflation
1228
1350
 
1229
- #ifndef __CUDACC__
1230
1351
  /** \svd_module
1231
1352
  *
1232
1353
  * \return the singular value decomposition of \c *this computed by Divide & Conquer algorithm
@@ -1239,7 +1360,6 @@ MatrixBase<Derived>::bdcSvd(unsigned int computationOptions) const
1239
1360
  {
1240
1361
  return BDCSVD<PlainObject>(*this, computationOptions);
1241
1362
  }
1242
- #endif
1243
1363
 
1244
1364
  } // end namespace Eigen
1245
1365
 
@@ -112,12 +112,12 @@ public:
112
112
  ColsAtCompileTime = MatrixType::ColsAtCompileTime,
113
113
  MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
114
114
  MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
115
- TrOptions = RowsAtCompileTime==1 ? (MatrixType::Options & ~(RowMajor))
116
- : ColsAtCompileTime==1 ? (MatrixType::Options | RowMajor)
117
- : MatrixType::Options
115
+ Options = MatrixType::Options
118
116
  };
119
- typedef Matrix<Scalar, ColsAtCompileTime, RowsAtCompileTime, TrOptions, MaxColsAtCompileTime, MaxRowsAtCompileTime>
120
- TransposeTypeWithSameStorageOrder;
117
+
118
+ typedef typename internal::make_proper_matrix_type<
119
+ Scalar, ColsAtCompileTime, RowsAtCompileTime, Options, MaxColsAtCompileTime, MaxRowsAtCompileTime
120
+ >::type TransposeTypeWithSameStorageOrder;
121
121
 
122
122
  void allocate(const JacobiSVD<MatrixType, FullPivHouseholderQRPreconditioner>& svd)
123
123
  {
@@ -202,13 +202,12 @@ public:
202
202
  ColsAtCompileTime = MatrixType::ColsAtCompileTime,
203
203
  MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
204
204
  MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
205
- TrOptions = RowsAtCompileTime==1 ? (MatrixType::Options & ~(RowMajor))
206
- : ColsAtCompileTime==1 ? (MatrixType::Options | RowMajor)
207
- : MatrixType::Options
205
+ Options = MatrixType::Options
208
206
  };
209
207
 
210
- typedef Matrix<Scalar, ColsAtCompileTime, RowsAtCompileTime, TrOptions, MaxColsAtCompileTime, MaxRowsAtCompileTime>
211
- TransposeTypeWithSameStorageOrder;
208
+ typedef typename internal::make_proper_matrix_type<
209
+ Scalar, ColsAtCompileTime, RowsAtCompileTime, Options, MaxColsAtCompileTime, MaxRowsAtCompileTime
210
+ >::type TransposeTypeWithSameStorageOrder;
212
211
 
213
212
  void allocate(const JacobiSVD<MatrixType, ColPivHouseholderQRPreconditioner>& svd)
214
213
  {
@@ -303,8 +302,9 @@ public:
303
302
  Options = MatrixType::Options
304
303
  };
305
304
 
306
- typedef Matrix<Scalar, ColsAtCompileTime, RowsAtCompileTime, Options, MaxColsAtCompileTime, MaxRowsAtCompileTime>
307
- TransposeTypeWithSameStorageOrder;
305
+ typedef typename internal::make_proper_matrix_type<
306
+ Scalar, ColsAtCompileTime, RowsAtCompileTime, Options, MaxColsAtCompileTime, MaxRowsAtCompileTime
307
+ >::type TransposeTypeWithSameStorageOrder;
308
308
 
309
309
  void allocate(const JacobiSVD<MatrixType, HouseholderQRPreconditioner>& svd)
310
310
  {
@@ -425,6 +425,7 @@ struct svd_precondition_2x2_block_to_be_real<MatrixType, QRPreconditioner, true>
425
425
 
426
426
  template<typename _MatrixType, int QRPreconditioner>
427
427
  struct traits<JacobiSVD<_MatrixType,QRPreconditioner> >
428
+ : traits<_MatrixType>
428
429
  {
429
430
  typedef _MatrixType MatrixType;
430
431
  };
@@ -584,6 +585,7 @@ template<typename _MatrixType, int QRPreconditioner> class JacobiSVD
584
585
  using Base::m_matrixU;
585
586
  using Base::m_matrixV;
586
587
  using Base::m_singularValues;
588
+ using Base::m_info;
587
589
  using Base::m_isInitialized;
588
590
  using Base::m_isAllocated;
589
591
  using Base::m_usePrescribedThreshold;
@@ -610,7 +612,7 @@ template<typename _MatrixType, int QRPreconditioner> class JacobiSVD
610
612
  };
611
613
 
612
614
  template<typename MatrixType, int QRPreconditioner>
613
- void JacobiSVD<MatrixType, QRPreconditioner>::allocate(Index rows, Index cols, unsigned int computationOptions)
615
+ void JacobiSVD<MatrixType, QRPreconditioner>::allocate(Eigen::Index rows, Eigen::Index cols, unsigned int computationOptions)
614
616
  {
615
617
  eigen_assert(rows >= 0 && cols >= 0);
616
618
 
@@ -624,6 +626,7 @@ void JacobiSVD<MatrixType, QRPreconditioner>::allocate(Index rows, Index cols, u
624
626
 
625
627
  m_rows = rows;
626
628
  m_cols = cols;
629
+ m_info = Success;
627
630
  m_isInitialized = false;
628
631
  m_isAllocated = true;
629
632
  m_computationOptions = computationOptions;
@@ -673,7 +676,12 @@ JacobiSVD<MatrixType, QRPreconditioner>::compute(const MatrixType& matrix, unsig
673
676
  const RealScalar considerAsZero = (std::numeric_limits<RealScalar>::min)();
674
677
 
675
678
  // Scaling factor to reduce over/under-flows
676
- RealScalar scale = matrix.cwiseAbs().maxCoeff();
679
+ RealScalar scale = matrix.cwiseAbs().template maxCoeff<PropagateNaN>();
680
+ if (!(numext::isfinite)(scale)) {
681
+ m_isInitialized = true;
682
+ m_info = InvalidInput;
683
+ return *this;
684
+ }
677
685
  if(scale==RealScalar(0)) scale = RealScalar(1);
678
686
 
679
687
  /*** step 1. The R-SVD step: we use a QR decomposition to reduce to the case of a square matrix */