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,870 @@
1
+ // This file is part of Eigen, a lightweight C++ template library
2
+ // for linear algebra.
3
+ //
4
+ // Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
5
+ // Copyright (C) 2009 Mathieu Gautier <mathieu.gautier@cea.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
+ #ifndef EIGEN_QUATERNION_H
12
+ #define EIGEN_QUATERNION_H
13
+ namespace Eigen {
14
+
15
+
16
+ /***************************************************************************
17
+ * Definition of QuaternionBase<Derived>
18
+ * The implementation is at the end of the file
19
+ ***************************************************************************/
20
+
21
+ namespace internal {
22
+ template<typename Other,
23
+ int OtherRows=Other::RowsAtCompileTime,
24
+ int OtherCols=Other::ColsAtCompileTime>
25
+ struct quaternionbase_assign_impl;
26
+ }
27
+
28
+ /** \geometry_module \ingroup Geometry_Module
29
+ * \class QuaternionBase
30
+ * \brief Base class for quaternion expressions
31
+ * \tparam Derived derived type (CRTP)
32
+ * \sa class Quaternion
33
+ */
34
+ template<class Derived>
35
+ class QuaternionBase : public RotationBase<Derived, 3>
36
+ {
37
+ public:
38
+ typedef RotationBase<Derived, 3> Base;
39
+
40
+ using Base::operator*;
41
+ using Base::derived;
42
+
43
+ typedef typename internal::traits<Derived>::Scalar Scalar;
44
+ typedef typename NumTraits<Scalar>::Real RealScalar;
45
+ typedef typename internal::traits<Derived>::Coefficients Coefficients;
46
+ typedef typename Coefficients::CoeffReturnType CoeffReturnType;
47
+ typedef typename internal::conditional<bool(internal::traits<Derived>::Flags&LvalueBit),
48
+ Scalar&, CoeffReturnType>::type NonConstCoeffReturnType;
49
+
50
+
51
+ enum {
52
+ Flags = Eigen::internal::traits<Derived>::Flags
53
+ };
54
+
55
+ // typedef typename Matrix<Scalar,4,1> Coefficients;
56
+ /** the type of a 3D vector */
57
+ typedef Matrix<Scalar,3,1> Vector3;
58
+ /** the equivalent rotation matrix type */
59
+ typedef Matrix<Scalar,3,3> Matrix3;
60
+ /** the equivalent angle-axis type */
61
+ typedef AngleAxis<Scalar> AngleAxisType;
62
+
63
+
64
+
65
+ /** \returns the \c x coefficient */
66
+ EIGEN_DEVICE_FUNC inline CoeffReturnType x() const { return this->derived().coeffs().coeff(0); }
67
+ /** \returns the \c y coefficient */
68
+ EIGEN_DEVICE_FUNC inline CoeffReturnType y() const { return this->derived().coeffs().coeff(1); }
69
+ /** \returns the \c z coefficient */
70
+ EIGEN_DEVICE_FUNC inline CoeffReturnType z() const { return this->derived().coeffs().coeff(2); }
71
+ /** \returns the \c w coefficient */
72
+ EIGEN_DEVICE_FUNC inline CoeffReturnType w() const { return this->derived().coeffs().coeff(3); }
73
+
74
+ /** \returns a reference to the \c x coefficient (if Derived is a non-const lvalue) */
75
+ EIGEN_DEVICE_FUNC inline NonConstCoeffReturnType x() { return this->derived().coeffs().x(); }
76
+ /** \returns a reference to the \c y coefficient (if Derived is a non-const lvalue) */
77
+ EIGEN_DEVICE_FUNC inline NonConstCoeffReturnType y() { return this->derived().coeffs().y(); }
78
+ /** \returns a reference to the \c z coefficient (if Derived is a non-const lvalue) */
79
+ EIGEN_DEVICE_FUNC inline NonConstCoeffReturnType z() { return this->derived().coeffs().z(); }
80
+ /** \returns a reference to the \c w coefficient (if Derived is a non-const lvalue) */
81
+ EIGEN_DEVICE_FUNC inline NonConstCoeffReturnType w() { return this->derived().coeffs().w(); }
82
+
83
+ /** \returns a read-only vector expression of the imaginary part (x,y,z) */
84
+ EIGEN_DEVICE_FUNC inline const VectorBlock<const Coefficients,3> vec() const { return coeffs().template head<3>(); }
85
+
86
+ /** \returns a vector expression of the imaginary part (x,y,z) */
87
+ EIGEN_DEVICE_FUNC inline VectorBlock<Coefficients,3> vec() { return coeffs().template head<3>(); }
88
+
89
+ /** \returns a read-only vector expression of the coefficients (x,y,z,w) */
90
+ EIGEN_DEVICE_FUNC inline const typename internal::traits<Derived>::Coefficients& coeffs() const { return derived().coeffs(); }
91
+
92
+ /** \returns a vector expression of the coefficients (x,y,z,w) */
93
+ EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Coefficients& coeffs() { return derived().coeffs(); }
94
+
95
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE QuaternionBase<Derived>& operator=(const QuaternionBase<Derived>& other);
96
+ template<class OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const QuaternionBase<OtherDerived>& other);
97
+
98
+ // disabled this copy operator as it is giving very strange compilation errors when compiling
99
+ // test_stdvector with GCC 4.4.2. This looks like a GCC bug though, so feel free to re-enable it if it's
100
+ // useful; however notice that we already have the templated operator= above and e.g. in MatrixBase
101
+ // we didn't have to add, in addition to templated operator=, such a non-templated copy operator.
102
+ // Derived& operator=(const QuaternionBase& other)
103
+ // { return operator=<Derived>(other); }
104
+
105
+ EIGEN_DEVICE_FUNC Derived& operator=(const AngleAxisType& aa);
106
+ template<class OtherDerived> EIGEN_DEVICE_FUNC Derived& operator=(const MatrixBase<OtherDerived>& m);
107
+
108
+ /** \returns a quaternion representing an identity rotation
109
+ * \sa MatrixBase::Identity()
110
+ */
111
+ EIGEN_DEVICE_FUNC static inline Quaternion<Scalar> Identity() { return Quaternion<Scalar>(Scalar(1), Scalar(0), Scalar(0), Scalar(0)); }
112
+
113
+ /** \sa QuaternionBase::Identity(), MatrixBase::setIdentity()
114
+ */
115
+ EIGEN_DEVICE_FUNC inline QuaternionBase& setIdentity() { coeffs() << Scalar(0), Scalar(0), Scalar(0), Scalar(1); return *this; }
116
+
117
+ /** \returns the squared norm of the quaternion's coefficients
118
+ * \sa QuaternionBase::norm(), MatrixBase::squaredNorm()
119
+ */
120
+ EIGEN_DEVICE_FUNC inline Scalar squaredNorm() const { return coeffs().squaredNorm(); }
121
+
122
+ /** \returns the norm of the quaternion's coefficients
123
+ * \sa QuaternionBase::squaredNorm(), MatrixBase::norm()
124
+ */
125
+ EIGEN_DEVICE_FUNC inline Scalar norm() const { return coeffs().norm(); }
126
+
127
+ /** Normalizes the quaternion \c *this
128
+ * \sa normalized(), MatrixBase::normalize() */
129
+ EIGEN_DEVICE_FUNC inline void normalize() { coeffs().normalize(); }
130
+ /** \returns a normalized copy of \c *this
131
+ * \sa normalize(), MatrixBase::normalized() */
132
+ EIGEN_DEVICE_FUNC inline Quaternion<Scalar> normalized() const { return Quaternion<Scalar>(coeffs().normalized()); }
133
+
134
+ /** \returns the dot product of \c *this and \a other
135
+ * Geometrically speaking, the dot product of two unit quaternions
136
+ * corresponds to the cosine of half the angle between the two rotations.
137
+ * \sa angularDistance()
138
+ */
139
+ template<class OtherDerived> EIGEN_DEVICE_FUNC inline Scalar dot(const QuaternionBase<OtherDerived>& other) const { return coeffs().dot(other.coeffs()); }
140
+
141
+ template<class OtherDerived> EIGEN_DEVICE_FUNC Scalar angularDistance(const QuaternionBase<OtherDerived>& other) const;
142
+
143
+ /** \returns an equivalent 3x3 rotation matrix */
144
+ EIGEN_DEVICE_FUNC inline Matrix3 toRotationMatrix() const;
145
+
146
+ /** \returns the quaternion which transform \a a into \a b through a rotation */
147
+ template<typename Derived1, typename Derived2>
148
+ EIGEN_DEVICE_FUNC Derived& setFromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b);
149
+
150
+ template<class OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Quaternion<Scalar> operator* (const QuaternionBase<OtherDerived>& q) const;
151
+ template<class OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator*= (const QuaternionBase<OtherDerived>& q);
152
+
153
+ /** \returns the quaternion describing the inverse rotation */
154
+ EIGEN_DEVICE_FUNC Quaternion<Scalar> inverse() const;
155
+
156
+ /** \returns the conjugated quaternion */
157
+ EIGEN_DEVICE_FUNC Quaternion<Scalar> conjugate() const;
158
+
159
+ template<class OtherDerived> EIGEN_DEVICE_FUNC Quaternion<Scalar> slerp(const Scalar& t, const QuaternionBase<OtherDerived>& other) const;
160
+
161
+ /** \returns true if each coefficients of \c *this and \a other are all exactly equal.
162
+ * \warning When using floating point scalar values you probably should rather use a
163
+ * fuzzy comparison such as isApprox()
164
+ * \sa isApprox(), operator!= */
165
+ template<class OtherDerived>
166
+ EIGEN_DEVICE_FUNC inline bool operator==(const QuaternionBase<OtherDerived>& other) const
167
+ { return coeffs() == other.coeffs(); }
168
+
169
+ /** \returns true if at least one pair of coefficients of \c *this and \a other are not exactly equal to each other.
170
+ * \warning When using floating point scalar values you probably should rather use a
171
+ * fuzzy comparison such as isApprox()
172
+ * \sa isApprox(), operator== */
173
+ template<class OtherDerived>
174
+ EIGEN_DEVICE_FUNC inline bool operator!=(const QuaternionBase<OtherDerived>& other) const
175
+ { return coeffs() != other.coeffs(); }
176
+
177
+ /** \returns \c true if \c *this is approximately equal to \a other, within the precision
178
+ * determined by \a prec.
179
+ *
180
+ * \sa MatrixBase::isApprox() */
181
+ template<class OtherDerived>
182
+ EIGEN_DEVICE_FUNC bool isApprox(const QuaternionBase<OtherDerived>& other, const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const
183
+ { return coeffs().isApprox(other.coeffs(), prec); }
184
+
185
+ /** return the result vector of \a v through the rotation*/
186
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Vector3 _transformVector(const Vector3& v) const;
187
+
188
+ #ifdef EIGEN_PARSED_BY_DOXYGEN
189
+ /** \returns \c *this with scalar type casted to \a NewScalarType
190
+ *
191
+ * Note that if \a NewScalarType is equal to the current scalar type of \c *this
192
+ * then this function smartly returns a const reference to \c *this.
193
+ */
194
+ template<typename NewScalarType>
195
+ EIGEN_DEVICE_FUNC inline typename internal::cast_return_type<Derived,Quaternion<NewScalarType> >::type cast() const;
196
+
197
+ #else
198
+
199
+ template<typename NewScalarType>
200
+ EIGEN_DEVICE_FUNC inline
201
+ typename internal::enable_if<internal::is_same<Scalar,NewScalarType>::value,const Derived&>::type cast() const
202
+ {
203
+ return derived();
204
+ }
205
+
206
+ template<typename NewScalarType>
207
+ EIGEN_DEVICE_FUNC inline
208
+ typename internal::enable_if<!internal::is_same<Scalar,NewScalarType>::value,Quaternion<NewScalarType> >::type cast() const
209
+ {
210
+ return Quaternion<NewScalarType>(coeffs().template cast<NewScalarType>());
211
+ }
212
+ #endif
213
+
214
+ #ifndef EIGEN_NO_IO
215
+ friend std::ostream& operator<<(std::ostream& s, const QuaternionBase<Derived>& q) {
216
+ s << q.x() << "i + " << q.y() << "j + " << q.z() << "k" << " + " << q.w();
217
+ return s;
218
+ }
219
+ #endif
220
+
221
+ #ifdef EIGEN_QUATERNIONBASE_PLUGIN
222
+ # include EIGEN_QUATERNIONBASE_PLUGIN
223
+ #endif
224
+ protected:
225
+ EIGEN_DEFAULT_COPY_CONSTRUCTOR(QuaternionBase)
226
+ EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(QuaternionBase)
227
+ };
228
+
229
+ /***************************************************************************
230
+ * Definition/implementation of Quaternion<Scalar>
231
+ ***************************************************************************/
232
+
233
+ /** \geometry_module \ingroup Geometry_Module
234
+ *
235
+ * \class Quaternion
236
+ *
237
+ * \brief The quaternion class used to represent 3D orientations and rotations
238
+ *
239
+ * \tparam _Scalar the scalar type, i.e., the type of the coefficients
240
+ * \tparam _Options controls the memory alignment of the coefficients. Can be \# AutoAlign or \# DontAlign. Default is AutoAlign.
241
+ *
242
+ * This class represents a quaternion \f$ w+xi+yj+zk \f$ that is a convenient representation of
243
+ * orientations and rotations of objects in three dimensions. Compared to other representations
244
+ * like Euler angles or 3x3 matrices, quaternions offer the following advantages:
245
+ * \li \b compact storage (4 scalars)
246
+ * \li \b efficient to compose (28 flops),
247
+ * \li \b stable spherical interpolation
248
+ *
249
+ * The following two typedefs are provided for convenience:
250
+ * \li \c Quaternionf for \c float
251
+ * \li \c Quaterniond for \c double
252
+ *
253
+ * \warning Operations interpreting the quaternion as rotation have undefined behavior if the quaternion is not normalized.
254
+ *
255
+ * \sa class AngleAxis, class Transform
256
+ */
257
+
258
+ namespace internal {
259
+ template<typename _Scalar,int _Options>
260
+ struct traits<Quaternion<_Scalar,_Options> >
261
+ {
262
+ typedef Quaternion<_Scalar,_Options> PlainObject;
263
+ typedef _Scalar Scalar;
264
+ typedef Matrix<_Scalar,4,1,_Options> Coefficients;
265
+ enum{
266
+ Alignment = internal::traits<Coefficients>::Alignment,
267
+ Flags = LvalueBit
268
+ };
269
+ };
270
+ }
271
+
272
+ template<typename _Scalar, int _Options>
273
+ class Quaternion : public QuaternionBase<Quaternion<_Scalar,_Options> >
274
+ {
275
+ public:
276
+ typedef QuaternionBase<Quaternion<_Scalar,_Options> > Base;
277
+ enum { NeedsAlignment = internal::traits<Quaternion>::Alignment>0 };
278
+
279
+ typedef _Scalar Scalar;
280
+
281
+ EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Quaternion)
282
+ using Base::operator*=;
283
+
284
+ typedef typename internal::traits<Quaternion>::Coefficients Coefficients;
285
+ typedef typename Base::AngleAxisType AngleAxisType;
286
+
287
+ /** Default constructor leaving the quaternion uninitialized. */
288
+ EIGEN_DEVICE_FUNC inline Quaternion() {}
289
+
290
+ /** Constructs and initializes the quaternion \f$ w+xi+yj+zk \f$ from
291
+ * its four coefficients \a w, \a x, \a y and \a z.
292
+ *
293
+ * \warning Note the order of the arguments: the real \a w coefficient first,
294
+ * while internally the coefficients are stored in the following order:
295
+ * [\c x, \c y, \c z, \c w]
296
+ */
297
+ EIGEN_DEVICE_FUNC inline Quaternion(const Scalar& w, const Scalar& x, const Scalar& y, const Scalar& z) : m_coeffs(x, y, z, w){}
298
+
299
+ /** Constructs and initialize a quaternion from the array data */
300
+ EIGEN_DEVICE_FUNC explicit inline Quaternion(const Scalar* data) : m_coeffs(data) {}
301
+
302
+ /** Copy constructor */
303
+ template<class Derived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Quaternion(const QuaternionBase<Derived>& other) { this->Base::operator=(other); }
304
+
305
+ /** Constructs and initializes a quaternion from the angle-axis \a aa */
306
+ EIGEN_DEVICE_FUNC explicit inline Quaternion(const AngleAxisType& aa) { *this = aa; }
307
+
308
+ /** Constructs and initializes a quaternion from either:
309
+ * - a rotation matrix expression,
310
+ * - a 4D vector expression representing quaternion coefficients.
311
+ */
312
+ template<typename Derived>
313
+ EIGEN_DEVICE_FUNC explicit inline Quaternion(const MatrixBase<Derived>& other) { *this = other; }
314
+
315
+ /** Explicit copy constructor with scalar conversion */
316
+ template<typename OtherScalar, int OtherOptions>
317
+ EIGEN_DEVICE_FUNC explicit inline Quaternion(const Quaternion<OtherScalar, OtherOptions>& other)
318
+ { m_coeffs = other.coeffs().template cast<Scalar>(); }
319
+
320
+ #if EIGEN_HAS_RVALUE_REFERENCES
321
+ // We define a copy constructor, which means we don't get an implicit move constructor or assignment operator.
322
+ /** Default move constructor */
323
+ EIGEN_DEVICE_FUNC inline Quaternion(Quaternion&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_constructible<Scalar>::value)
324
+ : m_coeffs(std::move(other.coeffs()))
325
+ {}
326
+
327
+ /** Default move assignment operator */
328
+ EIGEN_DEVICE_FUNC Quaternion& operator=(Quaternion&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_assignable<Scalar>::value)
329
+ {
330
+ m_coeffs = std::move(other.coeffs());
331
+ return *this;
332
+ }
333
+ #endif
334
+
335
+ EIGEN_DEVICE_FUNC static Quaternion UnitRandom();
336
+
337
+ template<typename Derived1, typename Derived2>
338
+ EIGEN_DEVICE_FUNC static Quaternion FromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b);
339
+
340
+ EIGEN_DEVICE_FUNC inline Coefficients& coeffs() { return m_coeffs;}
341
+ EIGEN_DEVICE_FUNC inline const Coefficients& coeffs() const { return m_coeffs;}
342
+
343
+ EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(bool(NeedsAlignment))
344
+
345
+ #ifdef EIGEN_QUATERNION_PLUGIN
346
+ # include EIGEN_QUATERNION_PLUGIN
347
+ #endif
348
+
349
+ protected:
350
+ Coefficients m_coeffs;
351
+
352
+ #ifndef EIGEN_PARSED_BY_DOXYGEN
353
+ static EIGEN_STRONG_INLINE void _check_template_params()
354
+ {
355
+ EIGEN_STATIC_ASSERT( (_Options & DontAlign) == _Options,
356
+ INVALID_MATRIX_TEMPLATE_PARAMETERS)
357
+ }
358
+ #endif
359
+ };
360
+
361
+ /** \ingroup Geometry_Module
362
+ * single precision quaternion type */
363
+ typedef Quaternion<float> Quaternionf;
364
+ /** \ingroup Geometry_Module
365
+ * double precision quaternion type */
366
+ typedef Quaternion<double> Quaterniond;
367
+
368
+ /***************************************************************************
369
+ * Specialization of Map<Quaternion<Scalar>>
370
+ ***************************************************************************/
371
+
372
+ namespace internal {
373
+ template<typename _Scalar, int _Options>
374
+ struct traits<Map<Quaternion<_Scalar>, _Options> > : traits<Quaternion<_Scalar, (int(_Options)&Aligned)==Aligned ? AutoAlign : DontAlign> >
375
+ {
376
+ typedef Map<Matrix<_Scalar,4,1>, _Options> Coefficients;
377
+ };
378
+ }
379
+
380
+ namespace internal {
381
+ template<typename _Scalar, int _Options>
382
+ struct traits<Map<const Quaternion<_Scalar>, _Options> > : traits<Quaternion<_Scalar, (int(_Options)&Aligned)==Aligned ? AutoAlign : DontAlign> >
383
+ {
384
+ typedef Map<const Matrix<_Scalar,4,1>, _Options> Coefficients;
385
+ typedef traits<Quaternion<_Scalar, (int(_Options)&Aligned)==Aligned ? AutoAlign : DontAlign> > TraitsBase;
386
+ enum {
387
+ Flags = TraitsBase::Flags & ~LvalueBit
388
+ };
389
+ };
390
+ }
391
+
392
+ /** \ingroup Geometry_Module
393
+ * \brief Quaternion expression mapping a constant memory buffer
394
+ *
395
+ * \tparam _Scalar the type of the Quaternion coefficients
396
+ * \tparam _Options see class Map
397
+ *
398
+ * This is a specialization of class Map for Quaternion. This class allows to view
399
+ * a 4 scalar memory buffer as an Eigen's Quaternion object.
400
+ *
401
+ * \sa class Map, class Quaternion, class QuaternionBase
402
+ */
403
+ template<typename _Scalar, int _Options>
404
+ class Map<const Quaternion<_Scalar>, _Options >
405
+ : public QuaternionBase<Map<const Quaternion<_Scalar>, _Options> >
406
+ {
407
+ public:
408
+ typedef QuaternionBase<Map<const Quaternion<_Scalar>, _Options> > Base;
409
+
410
+ typedef _Scalar Scalar;
411
+ typedef typename internal::traits<Map>::Coefficients Coefficients;
412
+ EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Map)
413
+ using Base::operator*=;
414
+
415
+ /** Constructs a Mapped Quaternion object from the pointer \a coeffs
416
+ *
417
+ * The pointer \a coeffs must reference the four coefficients of Quaternion in the following order:
418
+ * \code *coeffs == {x, y, z, w} \endcode
419
+ *
420
+ * If the template parameter _Options is set to #Aligned, then the pointer coeffs must be aligned. */
421
+ EIGEN_DEVICE_FUNC explicit EIGEN_STRONG_INLINE Map(const Scalar* coeffs) : m_coeffs(coeffs) {}
422
+
423
+ EIGEN_DEVICE_FUNC inline const Coefficients& coeffs() const { return m_coeffs;}
424
+
425
+ protected:
426
+ const Coefficients m_coeffs;
427
+ };
428
+
429
+ /** \ingroup Geometry_Module
430
+ * \brief Expression of a quaternion from a memory buffer
431
+ *
432
+ * \tparam _Scalar the type of the Quaternion coefficients
433
+ * \tparam _Options see class Map
434
+ *
435
+ * This is a specialization of class Map for Quaternion. This class allows to view
436
+ * a 4 scalar memory buffer as an Eigen's Quaternion object.
437
+ *
438
+ * \sa class Map, class Quaternion, class QuaternionBase
439
+ */
440
+ template<typename _Scalar, int _Options>
441
+ class Map<Quaternion<_Scalar>, _Options >
442
+ : public QuaternionBase<Map<Quaternion<_Scalar>, _Options> >
443
+ {
444
+ public:
445
+ typedef QuaternionBase<Map<Quaternion<_Scalar>, _Options> > Base;
446
+
447
+ typedef _Scalar Scalar;
448
+ typedef typename internal::traits<Map>::Coefficients Coefficients;
449
+ EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Map)
450
+ using Base::operator*=;
451
+
452
+ /** Constructs a Mapped Quaternion object from the pointer \a coeffs
453
+ *
454
+ * The pointer \a coeffs must reference the four coefficients of Quaternion in the following order:
455
+ * \code *coeffs == {x, y, z, w} \endcode
456
+ *
457
+ * If the template parameter _Options is set to #Aligned, then the pointer coeffs must be aligned. */
458
+ EIGEN_DEVICE_FUNC explicit EIGEN_STRONG_INLINE Map(Scalar* coeffs) : m_coeffs(coeffs) {}
459
+
460
+ EIGEN_DEVICE_FUNC inline Coefficients& coeffs() { return m_coeffs; }
461
+ EIGEN_DEVICE_FUNC inline const Coefficients& coeffs() const { return m_coeffs; }
462
+
463
+ protected:
464
+ Coefficients m_coeffs;
465
+ };
466
+
467
+ /** \ingroup Geometry_Module
468
+ * Map an unaligned array of single precision scalars as a quaternion */
469
+ typedef Map<Quaternion<float>, 0> QuaternionMapf;
470
+ /** \ingroup Geometry_Module
471
+ * Map an unaligned array of double precision scalars as a quaternion */
472
+ typedef Map<Quaternion<double>, 0> QuaternionMapd;
473
+ /** \ingroup Geometry_Module
474
+ * Map a 16-byte aligned array of single precision scalars as a quaternion */
475
+ typedef Map<Quaternion<float>, Aligned> QuaternionMapAlignedf;
476
+ /** \ingroup Geometry_Module
477
+ * Map a 16-byte aligned array of double precision scalars as a quaternion */
478
+ typedef Map<Quaternion<double>, Aligned> QuaternionMapAlignedd;
479
+
480
+ /***************************************************************************
481
+ * Implementation of QuaternionBase methods
482
+ ***************************************************************************/
483
+
484
+ // Generic Quaternion * Quaternion product
485
+ // This product can be specialized for a given architecture via the Arch template argument.
486
+ namespace internal {
487
+ template<int Arch, class Derived1, class Derived2, typename Scalar> struct quat_product
488
+ {
489
+ EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Quaternion<Scalar> run(const QuaternionBase<Derived1>& a, const QuaternionBase<Derived2>& b){
490
+ return Quaternion<Scalar>
491
+ (
492
+ a.w() * b.w() - a.x() * b.x() - a.y() * b.y() - a.z() * b.z(),
493
+ a.w() * b.x() + a.x() * b.w() + a.y() * b.z() - a.z() * b.y(),
494
+ a.w() * b.y() + a.y() * b.w() + a.z() * b.x() - a.x() * b.z(),
495
+ a.w() * b.z() + a.z() * b.w() + a.x() * b.y() - a.y() * b.x()
496
+ );
497
+ }
498
+ };
499
+ }
500
+
501
+ /** \returns the concatenation of two rotations as a quaternion-quaternion product */
502
+ template <class Derived>
503
+ template <class OtherDerived>
504
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Quaternion<typename internal::traits<Derived>::Scalar>
505
+ QuaternionBase<Derived>::operator* (const QuaternionBase<OtherDerived>& other) const
506
+ {
507
+ EIGEN_STATIC_ASSERT((internal::is_same<typename Derived::Scalar, typename OtherDerived::Scalar>::value),
508
+ YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
509
+ return internal::quat_product<Architecture::Target, Derived, OtherDerived,
510
+ typename internal::traits<Derived>::Scalar>::run(*this, other);
511
+ }
512
+
513
+ /** \sa operator*(Quaternion) */
514
+ template <class Derived>
515
+ template <class OtherDerived>
516
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& QuaternionBase<Derived>::operator*= (const QuaternionBase<OtherDerived>& other)
517
+ {
518
+ derived() = derived() * other.derived();
519
+ return derived();
520
+ }
521
+
522
+ /** Rotation of a vector by a quaternion.
523
+ * \remarks If the quaternion is used to rotate several points (>1)
524
+ * then it is much more efficient to first convert it to a 3x3 Matrix.
525
+ * Comparison of the operation cost for n transformations:
526
+ * - Quaternion2: 30n
527
+ * - Via a Matrix3: 24 + 15n
528
+ */
529
+ template <class Derived>
530
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename QuaternionBase<Derived>::Vector3
531
+ QuaternionBase<Derived>::_transformVector(const Vector3& v) const
532
+ {
533
+ // Note that this algorithm comes from the optimization by hand
534
+ // of the conversion to a Matrix followed by a Matrix/Vector product.
535
+ // It appears to be much faster than the common algorithm found
536
+ // in the literature (30 versus 39 flops). It also requires two
537
+ // Vector3 as temporaries.
538
+ Vector3 uv = this->vec().cross(v);
539
+ uv += uv;
540
+ return v + this->w() * uv + this->vec().cross(uv);
541
+ }
542
+
543
+ template<class Derived>
544
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE QuaternionBase<Derived>& QuaternionBase<Derived>::operator=(const QuaternionBase<Derived>& other)
545
+ {
546
+ coeffs() = other.coeffs();
547
+ return derived();
548
+ }
549
+
550
+ template<class Derived>
551
+ template<class OtherDerived>
552
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& QuaternionBase<Derived>::operator=(const QuaternionBase<OtherDerived>& other)
553
+ {
554
+ coeffs() = other.coeffs();
555
+ return derived();
556
+ }
557
+
558
+ /** Set \c *this from an angle-axis \a aa and returns a reference to \c *this
559
+ */
560
+ template<class Derived>
561
+ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& QuaternionBase<Derived>::operator=(const AngleAxisType& aa)
562
+ {
563
+ EIGEN_USING_STD(cos)
564
+ EIGEN_USING_STD(sin)
565
+ Scalar ha = Scalar(0.5)*aa.angle(); // Scalar(0.5) to suppress precision loss warnings
566
+ this->w() = cos(ha);
567
+ this->vec() = sin(ha) * aa.axis();
568
+ return derived();
569
+ }
570
+
571
+ /** Set \c *this from the expression \a xpr:
572
+ * - if \a xpr is a 4x1 vector, then \a xpr is assumed to be a quaternion
573
+ * - if \a xpr is a 3x3 matrix, then \a xpr is assumed to be rotation matrix
574
+ * and \a xpr is converted to a quaternion
575
+ */
576
+
577
+ template<class Derived>
578
+ template<class MatrixDerived>
579
+ EIGEN_DEVICE_FUNC inline Derived& QuaternionBase<Derived>::operator=(const MatrixBase<MatrixDerived>& xpr)
580
+ {
581
+ EIGEN_STATIC_ASSERT((internal::is_same<typename Derived::Scalar, typename MatrixDerived::Scalar>::value),
582
+ YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
583
+ internal::quaternionbase_assign_impl<MatrixDerived>::run(*this, xpr.derived());
584
+ return derived();
585
+ }
586
+
587
+ /** Convert the quaternion to a 3x3 rotation matrix. The quaternion is required to
588
+ * be normalized, otherwise the result is undefined.
589
+ */
590
+ template<class Derived>
591
+ EIGEN_DEVICE_FUNC inline typename QuaternionBase<Derived>::Matrix3
592
+ QuaternionBase<Derived>::toRotationMatrix(void) const
593
+ {
594
+ // NOTE if inlined, then gcc 4.2 and 4.4 get rid of the temporary (not gcc 4.3 !!)
595
+ // if not inlined then the cost of the return by value is huge ~ +35%,
596
+ // however, not inlining this function is an order of magnitude slower, so
597
+ // it has to be inlined, and so the return by value is not an issue
598
+ Matrix3 res;
599
+
600
+ const Scalar tx = Scalar(2)*this->x();
601
+ const Scalar ty = Scalar(2)*this->y();
602
+ const Scalar tz = Scalar(2)*this->z();
603
+ const Scalar twx = tx*this->w();
604
+ const Scalar twy = ty*this->w();
605
+ const Scalar twz = tz*this->w();
606
+ const Scalar txx = tx*this->x();
607
+ const Scalar txy = ty*this->x();
608
+ const Scalar txz = tz*this->x();
609
+ const Scalar tyy = ty*this->y();
610
+ const Scalar tyz = tz*this->y();
611
+ const Scalar tzz = tz*this->z();
612
+
613
+ res.coeffRef(0,0) = Scalar(1)-(tyy+tzz);
614
+ res.coeffRef(0,1) = txy-twz;
615
+ res.coeffRef(0,2) = txz+twy;
616
+ res.coeffRef(1,0) = txy+twz;
617
+ res.coeffRef(1,1) = Scalar(1)-(txx+tzz);
618
+ res.coeffRef(1,2) = tyz-twx;
619
+ res.coeffRef(2,0) = txz-twy;
620
+ res.coeffRef(2,1) = tyz+twx;
621
+ res.coeffRef(2,2) = Scalar(1)-(txx+tyy);
622
+
623
+ return res;
624
+ }
625
+
626
+ /** Sets \c *this to be a quaternion representing a rotation between
627
+ * the two arbitrary vectors \a a and \a b. In other words, the built
628
+ * rotation represent a rotation sending the line of direction \a a
629
+ * to the line of direction \a b, both lines passing through the origin.
630
+ *
631
+ * \returns a reference to \c *this.
632
+ *
633
+ * Note that the two input vectors do \b not have to be normalized, and
634
+ * do not need to have the same norm.
635
+ */
636
+ template<class Derived>
637
+ template<typename Derived1, typename Derived2>
638
+ EIGEN_DEVICE_FUNC inline Derived& QuaternionBase<Derived>::setFromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b)
639
+ {
640
+ EIGEN_USING_STD(sqrt)
641
+ Vector3 v0 = a.normalized();
642
+ Vector3 v1 = b.normalized();
643
+ Scalar c = v1.dot(v0);
644
+
645
+ // if dot == -1, vectors are nearly opposites
646
+ // => accurately compute the rotation axis by computing the
647
+ // intersection of the two planes. This is done by solving:
648
+ // x^T v0 = 0
649
+ // x^T v1 = 0
650
+ // under the constraint:
651
+ // ||x|| = 1
652
+ // which yields a singular value problem
653
+ if (c < Scalar(-1)+NumTraits<Scalar>::dummy_precision())
654
+ {
655
+ c = numext::maxi(c,Scalar(-1));
656
+ Matrix<Scalar,2,3> m; m << v0.transpose(), v1.transpose();
657
+ JacobiSVD<Matrix<Scalar,2,3> > svd(m, ComputeFullV);
658
+ Vector3 axis = svd.matrixV().col(2);
659
+
660
+ Scalar w2 = (Scalar(1)+c)*Scalar(0.5);
661
+ this->w() = sqrt(w2);
662
+ this->vec() = axis * sqrt(Scalar(1) - w2);
663
+ return derived();
664
+ }
665
+ Vector3 axis = v0.cross(v1);
666
+ Scalar s = sqrt((Scalar(1)+c)*Scalar(2));
667
+ Scalar invs = Scalar(1)/s;
668
+ this->vec() = axis * invs;
669
+ this->w() = s * Scalar(0.5);
670
+
671
+ return derived();
672
+ }
673
+
674
+ /** \returns a random unit quaternion following a uniform distribution law on SO(3)
675
+ *
676
+ * \note The implementation is based on http://planning.cs.uiuc.edu/node198.html
677
+ */
678
+ template<typename Scalar, int Options>
679
+ EIGEN_DEVICE_FUNC Quaternion<Scalar,Options> Quaternion<Scalar,Options>::UnitRandom()
680
+ {
681
+ EIGEN_USING_STD(sqrt)
682
+ EIGEN_USING_STD(sin)
683
+ EIGEN_USING_STD(cos)
684
+ const Scalar u1 = internal::random<Scalar>(0, 1),
685
+ u2 = internal::random<Scalar>(0, 2*EIGEN_PI),
686
+ u3 = internal::random<Scalar>(0, 2*EIGEN_PI);
687
+ const Scalar a = sqrt(Scalar(1) - u1),
688
+ b = sqrt(u1);
689
+ return Quaternion (a * sin(u2), a * cos(u2), b * sin(u3), b * cos(u3));
690
+ }
691
+
692
+
693
+ /** Returns a quaternion representing a rotation between
694
+ * the two arbitrary vectors \a a and \a b. In other words, the built
695
+ * rotation represent a rotation sending the line of direction \a a
696
+ * to the line of direction \a b, both lines passing through the origin.
697
+ *
698
+ * \returns resulting quaternion
699
+ *
700
+ * Note that the two input vectors do \b not have to be normalized, and
701
+ * do not need to have the same norm.
702
+ */
703
+ template<typename Scalar, int Options>
704
+ template<typename Derived1, typename Derived2>
705
+ EIGEN_DEVICE_FUNC Quaternion<Scalar,Options> Quaternion<Scalar,Options>::FromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b)
706
+ {
707
+ Quaternion quat;
708
+ quat.setFromTwoVectors(a, b);
709
+ return quat;
710
+ }
711
+
712
+
713
+ /** \returns the multiplicative inverse of \c *this
714
+ * Note that in most cases, i.e., if you simply want the opposite rotation,
715
+ * and/or the quaternion is normalized, then it is enough to use the conjugate.
716
+ *
717
+ * \sa QuaternionBase::conjugate()
718
+ */
719
+ template <class Derived>
720
+ EIGEN_DEVICE_FUNC inline Quaternion<typename internal::traits<Derived>::Scalar> QuaternionBase<Derived>::inverse() const
721
+ {
722
+ // FIXME should this function be called multiplicativeInverse and conjugate() be called inverse() or opposite() ??
723
+ Scalar n2 = this->squaredNorm();
724
+ if (n2 > Scalar(0))
725
+ return Quaternion<Scalar>(conjugate().coeffs() / n2);
726
+ else
727
+ {
728
+ // return an invalid result to flag the error
729
+ return Quaternion<Scalar>(Coefficients::Zero());
730
+ }
731
+ }
732
+
733
+ // Generic conjugate of a Quaternion
734
+ namespace internal {
735
+ template<int Arch, class Derived, typename Scalar> struct quat_conj
736
+ {
737
+ EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Quaternion<Scalar> run(const QuaternionBase<Derived>& q){
738
+ return Quaternion<Scalar>(q.w(),-q.x(),-q.y(),-q.z());
739
+ }
740
+ };
741
+ }
742
+
743
+ /** \returns the conjugate of the \c *this which is equal to the multiplicative inverse
744
+ * if the quaternion is normalized.
745
+ * The conjugate of a quaternion represents the opposite rotation.
746
+ *
747
+ * \sa Quaternion2::inverse()
748
+ */
749
+ template <class Derived>
750
+ EIGEN_DEVICE_FUNC inline Quaternion<typename internal::traits<Derived>::Scalar>
751
+ QuaternionBase<Derived>::conjugate() const
752
+ {
753
+ return internal::quat_conj<Architecture::Target, Derived,
754
+ typename internal::traits<Derived>::Scalar>::run(*this);
755
+
756
+ }
757
+
758
+ /** \returns the angle (in radian) between two rotations
759
+ * \sa dot()
760
+ */
761
+ template <class Derived>
762
+ template <class OtherDerived>
763
+ EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Scalar
764
+ QuaternionBase<Derived>::angularDistance(const QuaternionBase<OtherDerived>& other) const
765
+ {
766
+ EIGEN_USING_STD(atan2)
767
+ Quaternion<Scalar> d = (*this) * other.conjugate();
768
+ return Scalar(2) * atan2( d.vec().norm(), numext::abs(d.w()) );
769
+ }
770
+
771
+
772
+
773
+ /** \returns the spherical linear interpolation between the two quaternions
774
+ * \c *this and \a other at the parameter \a t in [0;1].
775
+ *
776
+ * This represents an interpolation for a constant motion between \c *this and \a other,
777
+ * see also http://en.wikipedia.org/wiki/Slerp.
778
+ */
779
+ template <class Derived>
780
+ template <class OtherDerived>
781
+ EIGEN_DEVICE_FUNC Quaternion<typename internal::traits<Derived>::Scalar>
782
+ QuaternionBase<Derived>::slerp(const Scalar& t, const QuaternionBase<OtherDerived>& other) const
783
+ {
784
+ EIGEN_USING_STD(acos)
785
+ EIGEN_USING_STD(sin)
786
+ const Scalar one = Scalar(1) - NumTraits<Scalar>::epsilon();
787
+ Scalar d = this->dot(other);
788
+ Scalar absD = numext::abs(d);
789
+
790
+ Scalar scale0;
791
+ Scalar scale1;
792
+
793
+ if(absD>=one)
794
+ {
795
+ scale0 = Scalar(1) - t;
796
+ scale1 = t;
797
+ }
798
+ else
799
+ {
800
+ // theta is the angle between the 2 quaternions
801
+ Scalar theta = acos(absD);
802
+ Scalar sinTheta = sin(theta);
803
+
804
+ scale0 = sin( ( Scalar(1) - t ) * theta) / sinTheta;
805
+ scale1 = sin( ( t * theta) ) / sinTheta;
806
+ }
807
+ if(d<Scalar(0)) scale1 = -scale1;
808
+
809
+ return Quaternion<Scalar>(scale0 * coeffs() + scale1 * other.coeffs());
810
+ }
811
+
812
+ namespace internal {
813
+
814
+ // set from a rotation matrix
815
+ template<typename Other>
816
+ struct quaternionbase_assign_impl<Other,3,3>
817
+ {
818
+ typedef typename Other::Scalar Scalar;
819
+ template<class Derived> EIGEN_DEVICE_FUNC static inline void run(QuaternionBase<Derived>& q, const Other& a_mat)
820
+ {
821
+ const typename internal::nested_eval<Other,2>::type mat(a_mat);
822
+ EIGEN_USING_STD(sqrt)
823
+ // This algorithm comes from "Quaternion Calculus and Fast Animation",
824
+ // Ken Shoemake, 1987 SIGGRAPH course notes
825
+ Scalar t = mat.trace();
826
+ if (t > Scalar(0))
827
+ {
828
+ t = sqrt(t + Scalar(1.0));
829
+ q.w() = Scalar(0.5)*t;
830
+ t = Scalar(0.5)/t;
831
+ q.x() = (mat.coeff(2,1) - mat.coeff(1,2)) * t;
832
+ q.y() = (mat.coeff(0,2) - mat.coeff(2,0)) * t;
833
+ q.z() = (mat.coeff(1,0) - mat.coeff(0,1)) * t;
834
+ }
835
+ else
836
+ {
837
+ Index i = 0;
838
+ if (mat.coeff(1,1) > mat.coeff(0,0))
839
+ i = 1;
840
+ if (mat.coeff(2,2) > mat.coeff(i,i))
841
+ i = 2;
842
+ Index j = (i+1)%3;
843
+ Index k = (j+1)%3;
844
+
845
+ t = sqrt(mat.coeff(i,i)-mat.coeff(j,j)-mat.coeff(k,k) + Scalar(1.0));
846
+ q.coeffs().coeffRef(i) = Scalar(0.5) * t;
847
+ t = Scalar(0.5)/t;
848
+ q.w() = (mat.coeff(k,j)-mat.coeff(j,k))*t;
849
+ q.coeffs().coeffRef(j) = (mat.coeff(j,i)+mat.coeff(i,j))*t;
850
+ q.coeffs().coeffRef(k) = (mat.coeff(k,i)+mat.coeff(i,k))*t;
851
+ }
852
+ }
853
+ };
854
+
855
+ // set from a vector of coefficients assumed to be a quaternion
856
+ template<typename Other>
857
+ struct quaternionbase_assign_impl<Other,4,1>
858
+ {
859
+ typedef typename Other::Scalar Scalar;
860
+ template<class Derived> EIGEN_DEVICE_FUNC static inline void run(QuaternionBase<Derived>& q, const Other& vec)
861
+ {
862
+ q.coeffs() = vec;
863
+ }
864
+ };
865
+
866
+ } // end namespace internal
867
+
868
+ } // end namespace Eigen
869
+
870
+ #endif // EIGEN_QUATERNION_H