@smake/eigen 1.0.2 → 1.1.1
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.
- package/README.md +1 -1
- package/eigen/Eigen/AccelerateSupport +52 -0
- package/eigen/Eigen/Cholesky +18 -21
- package/eigen/Eigen/CholmodSupport +28 -28
- package/eigen/Eigen/Core +235 -326
- package/eigen/Eigen/Eigenvalues +16 -14
- package/eigen/Eigen/Geometry +21 -24
- package/eigen/Eigen/Householder +9 -8
- package/eigen/Eigen/IterativeLinearSolvers +8 -4
- package/eigen/Eigen/Jacobi +14 -14
- package/eigen/Eigen/KLUSupport +43 -0
- package/eigen/Eigen/LU +16 -20
- package/eigen/Eigen/MetisSupport +12 -12
- package/eigen/Eigen/OrderingMethods +54 -54
- package/eigen/Eigen/PaStiXSupport +23 -20
- package/eigen/Eigen/PardisoSupport +17 -14
- package/eigen/Eigen/QR +18 -21
- package/eigen/Eigen/QtAlignedMalloc +5 -13
- package/eigen/Eigen/SPQRSupport +21 -14
- package/eigen/Eigen/SVD +23 -18
- package/eigen/Eigen/Sparse +1 -4
- package/eigen/Eigen/SparseCholesky +18 -23
- package/eigen/Eigen/SparseCore +18 -17
- package/eigen/Eigen/SparseLU +12 -8
- package/eigen/Eigen/SparseQR +16 -14
- package/eigen/Eigen/StdDeque +5 -2
- package/eigen/Eigen/StdList +5 -2
- package/eigen/Eigen/StdVector +5 -2
- package/eigen/Eigen/SuperLUSupport +30 -24
- package/eigen/Eigen/ThreadPool +80 -0
- package/eigen/Eigen/UmfPackSupport +19 -17
- package/eigen/Eigen/Version +14 -0
- package/eigen/Eigen/src/AccelerateSupport/AccelerateSupport.h +423 -0
- package/eigen/Eigen/src/AccelerateSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Cholesky/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Cholesky/LDLT.h +377 -401
- package/eigen/Eigen/src/Cholesky/LLT.h +332 -360
- package/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +81 -56
- package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +620 -521
- package/eigen/Eigen/src/CholmodSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Core/ArithmeticSequence.h +239 -0
- package/eigen/Eigen/src/Core/Array.h +341 -294
- package/eigen/Eigen/src/Core/ArrayBase.h +190 -203
- package/eigen/Eigen/src/Core/ArrayWrapper.h +127 -171
- package/eigen/Eigen/src/Core/Assign.h +30 -40
- package/eigen/Eigen/src/Core/AssignEvaluator.h +711 -589
- package/eigen/Eigen/src/Core/Assign_MKL.h +130 -125
- package/eigen/Eigen/src/Core/BandMatrix.h +268 -283
- package/eigen/Eigen/src/Core/Block.h +375 -398
- package/eigen/Eigen/src/Core/CommaInitializer.h +86 -97
- package/eigen/Eigen/src/Core/ConditionEstimator.h +51 -53
- package/eigen/Eigen/src/Core/CoreEvaluators.h +1356 -1026
- package/eigen/Eigen/src/Core/CoreIterators.h +73 -59
- package/eigen/Eigen/src/Core/CwiseBinaryOp.h +114 -132
- package/eigen/Eigen/src/Core/CwiseNullaryOp.h +726 -617
- package/eigen/Eigen/src/Core/CwiseTernaryOp.h +77 -103
- package/eigen/Eigen/src/Core/CwiseUnaryOp.h +56 -68
- package/eigen/Eigen/src/Core/CwiseUnaryView.h +132 -95
- package/eigen/Eigen/src/Core/DenseBase.h +632 -571
- package/eigen/Eigen/src/Core/DenseCoeffsBase.h +511 -624
- package/eigen/Eigen/src/Core/DenseStorage.h +512 -509
- package/eigen/Eigen/src/Core/DeviceWrapper.h +153 -0
- package/eigen/Eigen/src/Core/Diagonal.h +169 -210
- package/eigen/Eigen/src/Core/DiagonalMatrix.h +351 -274
- package/eigen/Eigen/src/Core/DiagonalProduct.h +12 -10
- package/eigen/Eigen/src/Core/Dot.h +172 -222
- package/eigen/Eigen/src/Core/EigenBase.h +75 -85
- package/eigen/Eigen/src/Core/Fill.h +138 -0
- package/eigen/Eigen/src/Core/FindCoeff.h +464 -0
- package/eigen/Eigen/src/Core/ForceAlignedAccess.h +90 -109
- package/eigen/Eigen/src/Core/Fuzzy.h +82 -105
- package/eigen/Eigen/src/Core/GeneralProduct.h +327 -263
- package/eigen/Eigen/src/Core/GenericPacketMath.h +1472 -360
- package/eigen/Eigen/src/Core/GlobalFunctions.h +194 -151
- package/eigen/Eigen/src/Core/IO.h +147 -139
- package/eigen/Eigen/src/Core/IndexedView.h +321 -0
- package/eigen/Eigen/src/Core/InnerProduct.h +260 -0
- package/eigen/Eigen/src/Core/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Core/Inverse.h +56 -66
- package/eigen/Eigen/src/Core/Map.h +124 -142
- package/eigen/Eigen/src/Core/MapBase.h +256 -281
- package/eigen/Eigen/src/Core/MathFunctions.h +1620 -938
- package/eigen/Eigen/src/Core/MathFunctionsImpl.h +233 -71
- package/eigen/Eigen/src/Core/Matrix.h +491 -416
- package/eigen/Eigen/src/Core/MatrixBase.h +468 -453
- package/eigen/Eigen/src/Core/NestByValue.h +66 -85
- package/eigen/Eigen/src/Core/NoAlias.h +79 -85
- package/eigen/Eigen/src/Core/NumTraits.h +235 -148
- package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +253 -0
- package/eigen/Eigen/src/Core/PermutationMatrix.h +461 -511
- package/eigen/Eigen/src/Core/PlainObjectBase.h +871 -894
- package/eigen/Eigen/src/Core/Product.h +260 -139
- package/eigen/Eigen/src/Core/ProductEvaluators.h +863 -714
- package/eigen/Eigen/src/Core/Random.h +161 -136
- package/eigen/Eigen/src/Core/RandomImpl.h +262 -0
- package/eigen/Eigen/src/Core/RealView.h +250 -0
- package/eigen/Eigen/src/Core/Redux.h +366 -336
- package/eigen/Eigen/src/Core/Ref.h +308 -209
- package/eigen/Eigen/src/Core/Replicate.h +94 -106
- package/eigen/Eigen/src/Core/Reshaped.h +398 -0
- package/eigen/Eigen/src/Core/ReturnByValue.h +49 -55
- package/eigen/Eigen/src/Core/Reverse.h +136 -145
- package/eigen/Eigen/src/Core/Select.h +70 -140
- package/eigen/Eigen/src/Core/SelfAdjointView.h +262 -285
- package/eigen/Eigen/src/Core/SelfCwiseBinaryOp.h +23 -20
- package/eigen/Eigen/src/Core/SkewSymmetricMatrix3.h +382 -0
- package/eigen/Eigen/src/Core/Solve.h +97 -111
- package/eigen/Eigen/src/Core/SolveTriangular.h +131 -129
- package/eigen/Eigen/src/Core/SolverBase.h +138 -101
- package/eigen/Eigen/src/Core/StableNorm.h +156 -160
- package/eigen/Eigen/src/Core/StlIterators.h +619 -0
- package/eigen/Eigen/src/Core/Stride.h +91 -88
- package/eigen/Eigen/src/Core/Swap.h +70 -38
- package/eigen/Eigen/src/Core/Transpose.h +295 -273
- package/eigen/Eigen/src/Core/Transpositions.h +272 -317
- package/eigen/Eigen/src/Core/TriangularMatrix.h +670 -755
- package/eigen/Eigen/src/Core/VectorBlock.h +59 -72
- package/eigen/Eigen/src/Core/VectorwiseOp.h +668 -630
- package/eigen/Eigen/src/Core/Visitor.h +480 -216
- package/eigen/Eigen/src/Core/arch/AVX/Complex.h +407 -293
- package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +79 -388
- package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +2935 -491
- package/eigen/Eigen/src/Core/arch/AVX/Reductions.h +353 -0
- package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +279 -22
- package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +472 -0
- package/eigen/Eigen/src/Core/arch/AVX512/GemmKernel.h +1245 -0
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +85 -333
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctionsFP16.h +75 -0
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +2490 -649
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMathFP16.h +1413 -0
- package/eigen/Eigen/src/Core/arch/AVX512/Reductions.h +297 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TrsmKernel.h +1167 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TrsmUnrolls.inc +1219 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +277 -0
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCastingFP16.h +130 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +521 -298
- package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +39 -280
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +3686 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +205 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +901 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMAbfloat16.h +742 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixVectorProduct.inc +2818 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +3391 -723
- package/eigen/Eigen/src/Core/arch/AltiVec/TypeCasting.h +153 -0
- package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +866 -0
- package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +113 -14
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +2634 -0
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +227 -0
- package/eigen/Eigen/src/Core/arch/Default/Half.h +1091 -0
- package/eigen/Eigen/src/Core/arch/Default/Settings.h +11 -13
- package/eigen/Eigen/src/Core/arch/GPU/Complex.h +244 -0
- package/eigen/Eigen/src/Core/arch/GPU/MathFunctions.h +104 -0
- package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +1712 -0
- package/eigen/Eigen/src/Core/arch/GPU/Tuple.h +268 -0
- package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +77 -0
- package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
- package/eigen/Eigen/src/Core/arch/HVX/PacketMath.h +1088 -0
- package/eigen/Eigen/src/Core/arch/LSX/Complex.h +520 -0
- package/eigen/Eigen/src/Core/arch/LSX/GeneralBlockPanelKernel.h +23 -0
- package/eigen/Eigen/src/Core/arch/LSX/MathFunctions.h +43 -0
- package/eigen/Eigen/src/Core/arch/LSX/PacketMath.h +2866 -0
- package/eigen/Eigen/src/Core/arch/LSX/TypeCasting.h +526 -0
- package/eigen/Eigen/src/Core/arch/MSA/Complex.h +620 -0
- package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +379 -0
- package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +1237 -0
- package/eigen/Eigen/src/Core/arch/NEON/Complex.h +531 -289
- package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +243 -0
- package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +50 -73
- package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +5915 -579
- package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +1642 -0
- package/eigen/Eigen/src/Core/arch/NEON/UnaryFunctors.h +57 -0
- package/eigen/Eigen/src/Core/arch/SSE/Complex.h +366 -334
- package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +40 -514
- package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +2164 -675
- package/eigen/Eigen/src/Core/arch/SSE/Reductions.h +324 -0
- package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +188 -35
- package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +48 -0
- package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +674 -0
- package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +52 -0
- package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +227 -0
- package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +303 -0
- package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +576 -0
- package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +83 -0
- package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +434 -261
- package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +160 -53
- package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +1073 -605
- package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +123 -117
- package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +594 -322
- package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +204 -118
- package/eigen/Eigen/src/Core/functors/StlFunctors.h +110 -97
- package/eigen/Eigen/src/Core/functors/TernaryFunctors.h +34 -7
- package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +1158 -530
- package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +2329 -1333
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +328 -364
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +191 -178
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +85 -82
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +154 -73
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +396 -542
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +80 -77
- package/eigen/Eigen/src/Core/products/Parallelizer.h +208 -92
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +331 -375
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +206 -224
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +139 -146
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector_BLAS.h +58 -61
- package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +71 -71
- package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +48 -46
- package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +294 -369
- package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix_BLAS.h +246 -238
- package/eigen/Eigen/src/Core/products/TriangularMatrixVector.h +244 -247
- package/eigen/Eigen/src/Core/products/TriangularMatrixVector_BLAS.h +212 -192
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +328 -275
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +108 -109
- package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +70 -93
- package/eigen/Eigen/src/Core/util/Assert.h +158 -0
- package/eigen/Eigen/src/Core/util/BlasUtil.h +413 -290
- package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +543 -0
- package/eigen/Eigen/src/Core/util/Constants.h +314 -263
- package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +130 -78
- package/eigen/Eigen/src/Core/util/EmulateArray.h +270 -0
- package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +450 -224
- package/eigen/Eigen/src/Core/util/GpuHipCudaDefines.inc +101 -0
- package/eigen/Eigen/src/Core/util/GpuHipCudaUndefines.inc +45 -0
- package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +487 -0
- package/eigen/Eigen/src/Core/util/IntegralConstant.h +279 -0
- package/eigen/Eigen/src/Core/util/MKL_support.h +39 -30
- package/eigen/Eigen/src/Core/util/Macros.h +939 -646
- package/eigen/Eigen/src/Core/util/MaxSizeVector.h +139 -0
- package/eigen/Eigen/src/Core/util/Memory.h +1042 -650
- package/eigen/Eigen/src/Core/util/Meta.h +618 -426
- package/eigen/Eigen/src/Core/util/MoreMeta.h +638 -0
- package/eigen/Eigen/src/Core/util/ReenableStupidWarnings.h +32 -19
- package/eigen/Eigen/src/Core/util/ReshapedHelper.h +51 -0
- package/eigen/Eigen/src/Core/util/Serializer.h +209 -0
- package/eigen/Eigen/src/Core/util/StaticAssert.h +51 -164
- package/eigen/Eigen/src/Core/util/SymbolicIndex.h +445 -0
- package/eigen/Eigen/src/Core/util/XprHelper.h +793 -538
- package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +246 -277
- package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +299 -319
- package/eigen/Eigen/src/Eigenvalues/ComplexSchur_LAPACKE.h +52 -48
- package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +413 -456
- package/eigen/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h +309 -325
- package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +157 -171
- package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +292 -310
- package/eigen/Eigen/src/Eigenvalues/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +91 -107
- package/eigen/Eigen/src/Eigenvalues/RealQZ.h +539 -606
- package/eigen/Eigen/src/Eigenvalues/RealSchur.h +348 -382
- package/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +41 -35
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +579 -600
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +47 -44
- package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +434 -461
- package/eigen/Eigen/src/Geometry/AlignedBox.h +307 -214
- package/eigen/Eigen/src/Geometry/AngleAxis.h +135 -137
- package/eigen/Eigen/src/Geometry/EulerAngles.h +163 -74
- package/eigen/Eigen/src/Geometry/Homogeneous.h +289 -333
- package/eigen/Eigen/src/Geometry/Hyperplane.h +152 -161
- package/eigen/Eigen/src/Geometry/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Geometry/OrthoMethods.h +168 -145
- package/eigen/Eigen/src/Geometry/ParametrizedLine.h +141 -104
- package/eigen/Eigen/src/Geometry/Quaternion.h +595 -497
- package/eigen/Eigen/src/Geometry/Rotation2D.h +110 -108
- package/eigen/Eigen/src/Geometry/RotationBase.h +148 -145
- package/eigen/Eigen/src/Geometry/Scaling.h +115 -90
- package/eigen/Eigen/src/Geometry/Transform.h +896 -953
- package/eigen/Eigen/src/Geometry/Translation.h +100 -98
- package/eigen/Eigen/src/Geometry/Umeyama.h +79 -84
- package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +154 -0
- package/eigen/Eigen/src/Householder/BlockHouseholder.h +54 -42
- package/eigen/Eigen/src/Householder/Householder.h +104 -122
- package/eigen/Eigen/src/Householder/HouseholderSequence.h +416 -382
- package/eigen/Eigen/src/Householder/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +153 -166
- package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +127 -138
- package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +95 -124
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +269 -267
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +246 -259
- package/eigen/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +218 -217
- package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +80 -103
- package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +59 -63
- package/eigen/Eigen/src/Jacobi/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Jacobi/Jacobi.h +256 -291
- package/eigen/Eigen/src/KLUSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/KLUSupport/KLUSupport.h +339 -0
- package/eigen/Eigen/src/LU/Determinant.h +60 -63
- package/eigen/Eigen/src/LU/FullPivLU.h +561 -626
- package/eigen/Eigen/src/LU/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/LU/InverseImpl.h +213 -275
- package/eigen/Eigen/src/LU/PartialPivLU.h +407 -435
- package/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +54 -40
- package/eigen/Eigen/src/LU/arch/InverseSize4.h +353 -0
- package/eigen/Eigen/src/MetisSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/MetisSupport/MetisSupport.h +81 -93
- package/eigen/Eigen/src/OrderingMethods/Amd.h +250 -282
- package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +950 -1103
- package/eigen/Eigen/src/OrderingMethods/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/OrderingMethods/Ordering.h +111 -122
- package/eigen/Eigen/src/PaStiXSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +524 -570
- package/eigen/Eigen/src/PardisoSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +385 -429
- package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +494 -473
- package/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +120 -56
- package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +223 -137
- package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +517 -460
- package/eigen/Eigen/src/QR/HouseholderQR.h +412 -278
- package/eigen/Eigen/src/QR/HouseholderQR_LAPACKE.h +32 -23
- package/eigen/Eigen/src/QR/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SPQRSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +263 -261
- package/eigen/Eigen/src/SVD/BDCSVD.h +872 -679
- package/eigen/Eigen/src/SVD/BDCSVD_LAPACKE.h +174 -0
- package/eigen/Eigen/src/SVD/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SVD/JacobiSVD.h +585 -543
- package/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +85 -49
- package/eigen/Eigen/src/SVD/SVDBase.h +281 -160
- package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +202 -237
- package/eigen/Eigen/src/SparseCholesky/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +769 -590
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +318 -129
- package/eigen/Eigen/src/SparseCore/AmbiVector.h +202 -251
- package/eigen/Eigen/src/SparseCore/CompressedStorage.h +184 -236
- package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +140 -184
- package/eigen/Eigen/src/SparseCore/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCore/SparseAssign.h +174 -111
- package/eigen/Eigen/src/SparseCore/SparseBlock.h +408 -477
- package/eigen/Eigen/src/SparseCore/SparseColEtree.h +100 -112
- package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +531 -280
- package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +559 -347
- package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +100 -108
- package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +185 -191
- package/eigen/Eigen/src/SparseCore/SparseDiagonalProduct.h +71 -71
- package/eigen/Eigen/src/SparseCore/SparseDot.h +49 -47
- package/eigen/Eigen/src/SparseCore/SparseFuzzy.h +13 -11
- package/eigen/Eigen/src/SparseCore/SparseMap.h +243 -253
- package/eigen/Eigen/src/SparseCore/SparseMatrix.h +1614 -1142
- package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +403 -357
- package/eigen/Eigen/src/SparseCore/SparsePermutation.h +186 -115
- package/eigen/Eigen/src/SparseCore/SparseProduct.h +100 -91
- package/eigen/Eigen/src/SparseCore/SparseRedux.h +22 -24
- package/eigen/Eigen/src/SparseCore/SparseRef.h +268 -295
- package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +371 -414
- package/eigen/Eigen/src/SparseCore/SparseSolverBase.h +78 -87
- package/eigen/Eigen/src/SparseCore/SparseSparseProductWithPruning.h +81 -95
- package/eigen/Eigen/src/SparseCore/SparseTranspose.h +62 -71
- package/eigen/Eigen/src/SparseCore/SparseTriangularView.h +132 -144
- package/eigen/Eigen/src/SparseCore/SparseUtil.h +146 -115
- package/eigen/Eigen/src/SparseCore/SparseVector.h +426 -372
- package/eigen/Eigen/src/SparseCore/SparseView.h +164 -193
- package/eigen/Eigen/src/SparseCore/TriangularSolver.h +129 -170
- package/eigen/Eigen/src/SparseLU/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseLU/SparseLU.h +814 -618
- package/eigen/Eigen/src/SparseLU/SparseLUImpl.h +61 -48
- package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +102 -118
- package/eigen/Eigen/src/SparseLU/SparseLU_Structs.h +38 -35
- package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +273 -255
- package/eigen/Eigen/src/SparseLU/SparseLU_Utils.h +44 -49
- package/eigen/Eigen/src/SparseLU/SparseLU_column_bmod.h +104 -108
- package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +90 -101
- package/eigen/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h +57 -58
- package/eigen/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h +43 -55
- package/eigen/Eigen/src/SparseLU/SparseLU_kernel_bmod.h +74 -71
- package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +125 -133
- package/eigen/Eigen/src/SparseLU/SparseLU_panel_dfs.h +136 -159
- package/eigen/Eigen/src/SparseLU/SparseLU_pivotL.h +51 -52
- package/eigen/Eigen/src/SparseLU/SparseLU_pruneL.h +67 -73
- package/eigen/Eigen/src/SparseLU/SparseLU_relax_snode.h +24 -26
- package/eigen/Eigen/src/SparseQR/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseQR/SparseQR.h +451 -490
- package/eigen/Eigen/src/StlSupport/StdDeque.h +28 -105
- package/eigen/Eigen/src/StlSupport/StdList.h +28 -84
- package/eigen/Eigen/src/StlSupport/StdVector.h +28 -108
- package/eigen/Eigen/src/StlSupport/details.h +48 -50
- package/eigen/Eigen/src/SuperLUSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +634 -732
- package/eigen/Eigen/src/ThreadPool/Barrier.h +70 -0
- package/eigen/Eigen/src/ThreadPool/CoreThreadPoolDevice.h +336 -0
- package/eigen/Eigen/src/ThreadPool/EventCount.h +241 -0
- package/eigen/Eigen/src/ThreadPool/ForkJoin.h +140 -0
- package/eigen/Eigen/src/ThreadPool/InternalHeaderCheck.h +4 -0
- package/eigen/Eigen/src/ThreadPool/NonBlockingThreadPool.h +587 -0
- package/eigen/Eigen/src/ThreadPool/RunQueue.h +230 -0
- package/eigen/Eigen/src/ThreadPool/ThreadCancel.h +21 -0
- package/eigen/Eigen/src/ThreadPool/ThreadEnvironment.h +43 -0
- package/eigen/Eigen/src/ThreadPool/ThreadLocal.h +289 -0
- package/eigen/Eigen/src/ThreadPool/ThreadPoolInterface.h +50 -0
- package/eigen/Eigen/src/ThreadPool/ThreadYield.h +16 -0
- package/eigen/Eigen/src/UmfPackSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +480 -380
- package/eigen/Eigen/src/misc/Image.h +41 -43
- package/eigen/Eigen/src/misc/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/misc/Kernel.h +39 -41
- package/eigen/Eigen/src/misc/RealSvd2x2.h +19 -21
- package/eigen/Eigen/src/misc/blas.h +83 -426
- package/eigen/Eigen/src/misc/lapacke.h +9976 -16182
- package/eigen/Eigen/src/misc/lapacke_helpers.h +163 -0
- package/eigen/Eigen/src/misc/lapacke_mangling.h +4 -5
- package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.inc +344 -0
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.inc +544 -0
- package/eigen/Eigen/src/plugins/BlockMethods.inc +1370 -0
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.inc +116 -0
- package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.inc +167 -0
- package/eigen/Eigen/src/plugins/IndexedViewMethods.inc +192 -0
- package/eigen/Eigen/src/plugins/InternalHeaderCheck.inc +3 -0
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.inc +331 -0
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.inc +118 -0
- package/eigen/Eigen/src/plugins/ReshapedMethods.inc +133 -0
- package/lib/LibEigen.d.ts +4 -0
- package/lib/LibEigen.js +14 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.js +7 -3
- package/package.json +2 -10
- package/eigen/Eigen/CMakeLists.txt +0 -19
- package/eigen/Eigen/src/Core/BooleanRedux.h +0 -164
- package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +0 -103
- package/eigen/Eigen/src/Core/arch/CUDA/Half.h +0 -675
- package/eigen/Eigen/src/Core/arch/CUDA/MathFunctions.h +0 -91
- package/eigen/Eigen/src/Core/arch/CUDA/PacketMath.h +0 -333
- package/eigen/Eigen/src/Core/arch/CUDA/PacketMathHalf.h +0 -1124
- package/eigen/Eigen/src/Core/arch/CUDA/TypeCasting.h +0 -212
- package/eigen/Eigen/src/Core/util/NonMPL2.h +0 -3
- package/eigen/Eigen/src/Geometry/arch/Geometry_SSE.h +0 -161
- package/eigen/Eigen/src/LU/arch/Inverse_SSE.h +0 -338
- package/eigen/Eigen/src/SparseCore/MappedSparseMatrix.h +0 -67
- package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +0 -280
- package/eigen/Eigen/src/misc/lapack.h +0 -152
- package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +0 -332
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -552
- package/eigen/Eigen/src/plugins/BlockMethods.h +0 -1058
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -115
- package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +0 -163
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -152
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -85
- package/lib/eigen.d.ts +0 -2
- package/lib/eigen.js +0 -15
|
@@ -11,286 +11,270 @@
|
|
|
11
11
|
#ifndef EIGEN_JACOBI_H
|
|
12
12
|
#define EIGEN_JACOBI_H
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
// IWYU pragma: private
|
|
15
|
+
#include "./InternalHeaderCheck.h"
|
|
16
|
+
|
|
17
|
+
namespace Eigen {
|
|
15
18
|
|
|
16
19
|
/** \ingroup Jacobi_Module
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
template<typename Scalar>
|
|
35
|
-
{
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
}
|
|
20
|
+
* \jacobi_module
|
|
21
|
+
* \class JacobiRotation
|
|
22
|
+
* \brief Rotation given by a cosine-sine pair.
|
|
23
|
+
*
|
|
24
|
+
* This class represents a Jacobi or Givens rotation.
|
|
25
|
+
* This is a 2D rotation in the plane \c J of angle \f$ \theta \f$ defined by
|
|
26
|
+
* its cosine \c c and sine \c s as follow:
|
|
27
|
+
* \f$ J = \left ( \begin{array}{cc} c & \overline s \\ -s & \overline c \end{array} \right ) \f$
|
|
28
|
+
*
|
|
29
|
+
* You can apply the respective counter-clockwise rotation to a column vector \c v by
|
|
30
|
+
* applying its adjoint on the left: \f$ v = J^* v \f$ that translates to the following Eigen code:
|
|
31
|
+
* \code
|
|
32
|
+
* v.applyOnTheLeft(J.adjoint());
|
|
33
|
+
* \endcode
|
|
34
|
+
*
|
|
35
|
+
* \sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
|
|
36
|
+
*/
|
|
37
|
+
template <typename Scalar>
|
|
38
|
+
class JacobiRotation {
|
|
39
|
+
public:
|
|
40
|
+
typedef typename NumTraits<Scalar>::Real RealScalar;
|
|
41
|
+
|
|
42
|
+
/** Default constructor without any initialization. */
|
|
43
|
+
EIGEN_DEVICE_FUNC JacobiRotation() {}
|
|
44
|
+
|
|
45
|
+
/** Construct a planar rotation from a cosine-sine pair (\a c, \c s). */
|
|
46
|
+
EIGEN_DEVICE_FUNC JacobiRotation(const Scalar& c, const Scalar& s) : m_c(c), m_s(s) {}
|
|
47
|
+
|
|
48
|
+
EIGEN_DEVICE_FUNC Scalar& c() { return m_c; }
|
|
49
|
+
EIGEN_DEVICE_FUNC Scalar c() const { return m_c; }
|
|
50
|
+
EIGEN_DEVICE_FUNC Scalar& s() { return m_s; }
|
|
51
|
+
EIGEN_DEVICE_FUNC Scalar s() const { return m_s; }
|
|
52
|
+
|
|
53
|
+
/** Concatenates two planar rotation */
|
|
54
|
+
EIGEN_DEVICE_FUNC JacobiRotation operator*(const JacobiRotation& other) {
|
|
55
|
+
using numext::conj;
|
|
56
|
+
return JacobiRotation(m_c * other.m_c - conj(m_s) * other.m_s,
|
|
57
|
+
conj(m_c * conj(other.m_s) + conj(m_s) * conj(other.m_c)));
|
|
58
|
+
}
|
|
57
59
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
+
/** Returns the transposed transformation */
|
|
61
|
+
EIGEN_DEVICE_FUNC JacobiRotation transpose() const {
|
|
62
|
+
using numext::conj;
|
|
63
|
+
return JacobiRotation(m_c, -conj(m_s));
|
|
64
|
+
}
|
|
60
65
|
|
|
61
|
-
|
|
62
|
-
|
|
66
|
+
/** Returns the adjoint transformation */
|
|
67
|
+
EIGEN_DEVICE_FUNC JacobiRotation adjoint() const {
|
|
68
|
+
using numext::conj;
|
|
69
|
+
return JacobiRotation(conj(m_c), -m_s);
|
|
70
|
+
}
|
|
63
71
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
72
|
+
template <typename Derived>
|
|
73
|
+
EIGEN_DEVICE_FUNC bool makeJacobi(const MatrixBase<Derived>&, Index p, Index q);
|
|
74
|
+
EIGEN_DEVICE_FUNC bool makeJacobi(const RealScalar& x, const Scalar& y, const RealScalar& z);
|
|
67
75
|
|
|
68
|
-
|
|
76
|
+
EIGEN_DEVICE_FUNC void makeGivens(const Scalar& p, const Scalar& q, Scalar* r = 0);
|
|
69
77
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
78
|
+
protected:
|
|
79
|
+
EIGEN_DEVICE_FUNC void makeGivens(const Scalar& p, const Scalar& q, Scalar* r, internal::true_type);
|
|
80
|
+
EIGEN_DEVICE_FUNC void makeGivens(const Scalar& p, const Scalar& q, Scalar* r, internal::false_type);
|
|
73
81
|
|
|
74
|
-
|
|
82
|
+
Scalar m_c, m_s;
|
|
75
83
|
};
|
|
76
84
|
|
|
77
|
-
/** Makes \c *this as a Jacobi rotation \a J such that applying \a J on both the right and left sides of the selfadjoint
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
85
|
+
/** Makes \c *this as a Jacobi rotation \a J such that applying \a J on both the right and left sides of the selfadjoint
|
|
86
|
+
* 2x2 matrix \f$ B = \left ( \begin{array}{cc} x & y \\ \overline y & z \end{array} \right )\f$ yields a diagonal
|
|
87
|
+
* matrix \f$ A = J^* B J \f$
|
|
88
|
+
*
|
|
89
|
+
* \sa MatrixBase::makeJacobi(const MatrixBase<Derived>&, Index, Index), MatrixBase::applyOnTheLeft(),
|
|
90
|
+
* MatrixBase::applyOnTheRight()
|
|
91
|
+
*/
|
|
92
|
+
template <typename Scalar>
|
|
93
|
+
EIGEN_DEVICE_FUNC bool JacobiRotation<Scalar>::makeJacobi(const RealScalar& x, const Scalar& y, const RealScalar& z) {
|
|
86
94
|
using std::abs;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
95
|
+
using std::sqrt;
|
|
96
|
+
|
|
97
|
+
RealScalar deno = RealScalar(2) * abs(y);
|
|
98
|
+
if (deno < (std::numeric_limits<RealScalar>::min)()) {
|
|
90
99
|
m_c = Scalar(1);
|
|
91
100
|
m_s = Scalar(0);
|
|
92
101
|
return false;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
{
|
|
96
|
-
RealScalar tau = (x-z)/deno;
|
|
102
|
+
} else {
|
|
103
|
+
RealScalar tau = (x - z) / deno;
|
|
97
104
|
RealScalar w = sqrt(numext::abs2(tau) + RealScalar(1));
|
|
98
105
|
RealScalar t;
|
|
99
|
-
if(tau>RealScalar(0))
|
|
100
|
-
{
|
|
106
|
+
if (tau > RealScalar(0)) {
|
|
101
107
|
t = RealScalar(1) / (tau + w);
|
|
102
|
-
}
|
|
103
|
-
else
|
|
104
|
-
{
|
|
108
|
+
} else {
|
|
105
109
|
t = RealScalar(1) / (tau - w);
|
|
106
110
|
}
|
|
107
111
|
RealScalar sign_t = t > RealScalar(0) ? RealScalar(1) : RealScalar(-1);
|
|
108
|
-
RealScalar n = RealScalar(1) / sqrt(numext::abs2(t)+RealScalar(1));
|
|
109
|
-
m_s = -
|
|
112
|
+
RealScalar n = RealScalar(1) / sqrt(numext::abs2(t) + RealScalar(1));
|
|
113
|
+
m_s = -sign_t * (numext::conj(y) / abs(y)) * abs(t) * n;
|
|
110
114
|
m_c = n;
|
|
111
115
|
return true;
|
|
112
116
|
}
|
|
113
117
|
}
|
|
114
118
|
|
|
115
|
-
/** Makes \c *this as a Jacobi rotation \c J such that applying \a J on both the right and left sides of the 2x2
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
template<typename
|
|
126
|
-
|
|
127
|
-
{
|
|
128
|
-
return makeJacobi(numext::real(m.coeff(p,p)), m.coeff(p,q), numext::real(m.coeff(q,q)));
|
|
119
|
+
/** Makes \c *this as a Jacobi rotation \c J such that applying \a J on both the right and left sides of the 2x2
|
|
120
|
+
* selfadjoint matrix \f$ B = \left ( \begin{array}{cc} \text{this}_{pp} & \text{this}_{pq} \\ (\text{this}_{pq})^* &
|
|
121
|
+
* \text{this}_{qq} \end{array} \right )\f$ yields a diagonal matrix \f$ A = J^* B J \f$
|
|
122
|
+
*
|
|
123
|
+
* Example: \include Jacobi_makeJacobi.cpp
|
|
124
|
+
* Output: \verbinclude Jacobi_makeJacobi.out
|
|
125
|
+
*
|
|
126
|
+
* \sa JacobiRotation::makeJacobi(RealScalar, Scalar, RealScalar), MatrixBase::applyOnTheLeft(),
|
|
127
|
+
* MatrixBase::applyOnTheRight()
|
|
128
|
+
*/
|
|
129
|
+
template <typename Scalar>
|
|
130
|
+
template <typename Derived>
|
|
131
|
+
EIGEN_DEVICE_FUNC inline bool JacobiRotation<Scalar>::makeJacobi(const MatrixBase<Derived>& m, Index p, Index q) {
|
|
132
|
+
return makeJacobi(numext::real(m.coeff(p, p)), m.coeff(p, q), numext::real(m.coeff(q, q)));
|
|
129
133
|
}
|
|
130
134
|
|
|
131
135
|
/** Makes \c *this as a Givens rotation \c G such that applying \f$ G^* \f$ to the left of the vector
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
template<typename Scalar>
|
|
148
|
-
void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r)
|
|
149
|
-
|
|
150
|
-
makeGivens(p, q, r, typename internal::conditional<NumTraits<Scalar>::IsComplex, internal::true_type, internal::false_type>::type());
|
|
136
|
+
* \f$ V = \left ( \begin{array}{c} p \\ q \end{array} \right )\f$ yields:
|
|
137
|
+
* \f$ G^* V = \left ( \begin{array}{c} r \\ 0 \end{array} \right )\f$.
|
|
138
|
+
*
|
|
139
|
+
* The value of \a r is returned if \a r is not null (the default is null).
|
|
140
|
+
* Also note that G is built such that the cosine is always real.
|
|
141
|
+
*
|
|
142
|
+
* Example: \include Jacobi_makeGivens.cpp
|
|
143
|
+
* Output: \verbinclude Jacobi_makeGivens.out
|
|
144
|
+
*
|
|
145
|
+
* This function implements the continuous Givens rotation generation algorithm
|
|
146
|
+
* found in Anderson (2000), Discontinuous Plane Rotations and the Symmetric Eigenvalue Problem.
|
|
147
|
+
* LAPACK Working Note 150, University of Tennessee, UT-CS-00-454, December 4, 2000.
|
|
148
|
+
*
|
|
149
|
+
* \sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
|
|
150
|
+
*/
|
|
151
|
+
template <typename Scalar>
|
|
152
|
+
EIGEN_DEVICE_FUNC void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r) {
|
|
153
|
+
makeGivens(p, q, r, std::conditional_t<NumTraits<Scalar>::IsComplex, internal::true_type, internal::false_type>());
|
|
151
154
|
}
|
|
152
155
|
|
|
153
|
-
|
|
154
156
|
// specialization for complexes
|
|
155
|
-
template<typename Scalar>
|
|
156
|
-
void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r,
|
|
157
|
-
{
|
|
158
|
-
using std::sqrt;
|
|
159
|
-
using std::abs;
|
|
157
|
+
template <typename Scalar>
|
|
158
|
+
EIGEN_DEVICE_FUNC void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r,
|
|
159
|
+
internal::true_type) {
|
|
160
160
|
using numext::conj;
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
161
|
+
using std::abs;
|
|
162
|
+
using std::sqrt;
|
|
163
|
+
|
|
164
|
+
if (q == Scalar(0)) {
|
|
165
|
+
m_c = numext::real(p) < 0 ? Scalar(-1) : Scalar(1);
|
|
165
166
|
m_s = 0;
|
|
166
|
-
if(r) *r = m_c * p;
|
|
167
|
-
}
|
|
168
|
-
else if(p==Scalar(0))
|
|
169
|
-
{
|
|
167
|
+
if (r) *r = m_c * p;
|
|
168
|
+
} else if (p == Scalar(0)) {
|
|
170
169
|
m_c = 0;
|
|
171
|
-
m_s = -q/abs(q);
|
|
172
|
-
if(r) *r = abs(q);
|
|
173
|
-
}
|
|
174
|
-
else
|
|
175
|
-
{
|
|
170
|
+
m_s = -q / abs(q);
|
|
171
|
+
if (r) *r = abs(q);
|
|
172
|
+
} else {
|
|
176
173
|
RealScalar p1 = numext::norm1(p);
|
|
177
174
|
RealScalar q1 = numext::norm1(q);
|
|
178
|
-
if(p1>=q1)
|
|
179
|
-
{
|
|
175
|
+
if (p1 >= q1) {
|
|
180
176
|
Scalar ps = p / p1;
|
|
181
177
|
RealScalar p2 = numext::abs2(ps);
|
|
182
178
|
Scalar qs = q / p1;
|
|
183
179
|
RealScalar q2 = numext::abs2(qs);
|
|
184
180
|
|
|
185
|
-
RealScalar u = sqrt(RealScalar(1) + q2/p2);
|
|
186
|
-
if(numext::real(p)<RealScalar(0))
|
|
187
|
-
u = -u;
|
|
181
|
+
RealScalar u = sqrt(RealScalar(1) + q2 / p2);
|
|
182
|
+
if (numext::real(p) < RealScalar(0)) u = -u;
|
|
188
183
|
|
|
189
|
-
m_c = Scalar(1)/u;
|
|
190
|
-
m_s = -qs*conj(ps)*(m_c/p2);
|
|
191
|
-
if(r) *r = p * u;
|
|
192
|
-
}
|
|
193
|
-
else
|
|
194
|
-
{
|
|
184
|
+
m_c = Scalar(1) / u;
|
|
185
|
+
m_s = -qs * conj(ps) * (m_c / p2);
|
|
186
|
+
if (r) *r = p * u;
|
|
187
|
+
} else {
|
|
195
188
|
Scalar ps = p / q1;
|
|
196
189
|
RealScalar p2 = numext::abs2(ps);
|
|
197
190
|
Scalar qs = q / q1;
|
|
198
191
|
RealScalar q2 = numext::abs2(qs);
|
|
199
192
|
|
|
200
193
|
RealScalar u = q1 * sqrt(p2 + q2);
|
|
201
|
-
if(numext::real(p)<RealScalar(0))
|
|
202
|
-
u = -u;
|
|
194
|
+
if (numext::real(p) < RealScalar(0)) u = -u;
|
|
203
195
|
|
|
204
196
|
p1 = abs(p);
|
|
205
|
-
ps = p/p1;
|
|
206
|
-
m_c = p1/u;
|
|
207
|
-
m_s = -conj(ps) * (q/u);
|
|
208
|
-
if(r) *r = ps * u;
|
|
197
|
+
ps = p / p1;
|
|
198
|
+
m_c = p1 / u;
|
|
199
|
+
m_s = -conj(ps) * (q / u);
|
|
200
|
+
if (r) *r = ps * u;
|
|
209
201
|
}
|
|
210
202
|
}
|
|
211
203
|
}
|
|
212
204
|
|
|
213
205
|
// specialization for reals
|
|
214
|
-
template<typename Scalar>
|
|
215
|
-
void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r,
|
|
216
|
-
{
|
|
217
|
-
using std::sqrt;
|
|
206
|
+
template <typename Scalar>
|
|
207
|
+
EIGEN_DEVICE_FUNC void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r,
|
|
208
|
+
internal::false_type) {
|
|
218
209
|
using std::abs;
|
|
219
|
-
|
|
220
|
-
{
|
|
221
|
-
m_c = p<Scalar(0) ? Scalar(-1) : Scalar(1);
|
|
210
|
+
using std::sqrt;
|
|
211
|
+
if (numext::is_exactly_zero(q)) {
|
|
212
|
+
m_c = p < Scalar(0) ? Scalar(-1) : Scalar(1);
|
|
222
213
|
m_s = Scalar(0);
|
|
223
|
-
if(r) *r = abs(p);
|
|
224
|
-
}
|
|
225
|
-
else if(p==Scalar(0))
|
|
226
|
-
{
|
|
214
|
+
if (r) *r = abs(p);
|
|
215
|
+
} else if (numext::is_exactly_zero(p)) {
|
|
227
216
|
m_c = Scalar(0);
|
|
228
|
-
m_s = q<Scalar(0) ? Scalar(1) : Scalar(-1);
|
|
229
|
-
if(r) *r = abs(q);
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
{
|
|
233
|
-
Scalar t = q/p;
|
|
217
|
+
m_s = q < Scalar(0) ? Scalar(1) : Scalar(-1);
|
|
218
|
+
if (r) *r = abs(q);
|
|
219
|
+
} else if (abs(p) > abs(q)) {
|
|
220
|
+
Scalar t = q / p;
|
|
234
221
|
Scalar u = sqrt(Scalar(1) + numext::abs2(t));
|
|
235
|
-
if(p<Scalar(0))
|
|
236
|
-
|
|
237
|
-
m_c = Scalar(1)/u;
|
|
222
|
+
if (p < Scalar(0)) u = -u;
|
|
223
|
+
m_c = Scalar(1) / u;
|
|
238
224
|
m_s = -t * m_c;
|
|
239
|
-
if(r) *r = p * u;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
{
|
|
243
|
-
Scalar t = p/q;
|
|
225
|
+
if (r) *r = p * u;
|
|
226
|
+
} else {
|
|
227
|
+
Scalar t = p / q;
|
|
244
228
|
Scalar u = sqrt(Scalar(1) + numext::abs2(t));
|
|
245
|
-
if(q<Scalar(0))
|
|
246
|
-
|
|
247
|
-
m_s = -Scalar(1)/u;
|
|
229
|
+
if (q < Scalar(0)) u = -u;
|
|
230
|
+
m_s = -Scalar(1) / u;
|
|
248
231
|
m_c = -t * m_s;
|
|
249
|
-
if(r) *r = q * u;
|
|
232
|
+
if (r) *r = q * u;
|
|
250
233
|
}
|
|
251
|
-
|
|
252
234
|
}
|
|
253
235
|
|
|
254
236
|
/****************************************************************************************
|
|
255
|
-
* Implementation of MatrixBase methods
|
|
256
|
-
****************************************************************************************/
|
|
237
|
+
* Implementation of MatrixBase methods
|
|
238
|
+
****************************************************************************************/
|
|
257
239
|
|
|
258
240
|
namespace internal {
|
|
259
241
|
/** \jacobi_module
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
242
|
+
* Applies the clock wise 2D rotation \a j to the set of 2D vectors of coordinates \a x and \a y:
|
|
243
|
+
* \f$ \left ( \begin{array}{cc} x \\ y \end{array} \right ) = J \left ( \begin{array}{cc} x \\ y \end{array} \right )
|
|
244
|
+
* \f$
|
|
245
|
+
*
|
|
246
|
+
* \sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
|
|
247
|
+
*/
|
|
248
|
+
template <typename VectorX, typename VectorY, typename OtherScalar>
|
|
249
|
+
EIGEN_DEVICE_FUNC void apply_rotation_in_the_plane(DenseBase<VectorX>& xpr_x, DenseBase<VectorY>& xpr_y,
|
|
250
|
+
const JacobiRotation<OtherScalar>& j);
|
|
251
|
+
} // namespace internal
|
|
268
252
|
|
|
269
253
|
/** \jacobi_module
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
template<typename Derived>
|
|
276
|
-
template<typename OtherScalar>
|
|
277
|
-
inline void MatrixBase<Derived>::applyOnTheLeft(Index p, Index q,
|
|
278
|
-
{
|
|
254
|
+
* Applies the rotation in the plane \a j to the rows \a p and \a q of \c *this, i.e., it computes B = J * B,
|
|
255
|
+
* with \f$ B = \left ( \begin{array}{cc} \text{*this.row}(p) \\ \text{*this.row}(q) \end{array} \right ) \f$.
|
|
256
|
+
*
|
|
257
|
+
* \sa class JacobiRotation, MatrixBase::applyOnTheRight(), internal::apply_rotation_in_the_plane()
|
|
258
|
+
*/
|
|
259
|
+
template <typename Derived>
|
|
260
|
+
template <typename OtherScalar>
|
|
261
|
+
EIGEN_DEVICE_FUNC inline void MatrixBase<Derived>::applyOnTheLeft(Index p, Index q,
|
|
262
|
+
const JacobiRotation<OtherScalar>& j) {
|
|
279
263
|
RowXpr x(this->row(p));
|
|
280
264
|
RowXpr y(this->row(q));
|
|
281
265
|
internal::apply_rotation_in_the_plane(x, y, j);
|
|
282
266
|
}
|
|
283
267
|
|
|
284
|
-
/** \
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
template<typename Derived>
|
|
291
|
-
template<typename OtherScalar>
|
|
292
|
-
inline void MatrixBase<Derived>::applyOnTheRight(Index p, Index q,
|
|
293
|
-
{
|
|
268
|
+
/** \jacobi_module
|
|
269
|
+
* Applies the rotation in the plane \a j to the columns \a p and \a q of \c *this, i.e., it computes B = B * J
|
|
270
|
+
* with \f$ B = \left ( \begin{array}{cc} \text{*this.col}(p) & \text{*this.col}(q) \end{array} \right ) \f$.
|
|
271
|
+
*
|
|
272
|
+
* \sa class JacobiRotation, MatrixBase::applyOnTheLeft(), internal::apply_rotation_in_the_plane()
|
|
273
|
+
*/
|
|
274
|
+
template <typename Derived>
|
|
275
|
+
template <typename OtherScalar>
|
|
276
|
+
EIGEN_DEVICE_FUNC inline void MatrixBase<Derived>::applyOnTheRight(Index p, Index q,
|
|
277
|
+
const JacobiRotation<OtherScalar>& j) {
|
|
294
278
|
ColXpr x(this->col(p));
|
|
295
279
|
ColXpr y(this->col(q));
|
|
296
280
|
internal::apply_rotation_in_the_plane(x, y, j.transpose());
|
|
@@ -298,17 +282,14 @@ inline void MatrixBase<Derived>::applyOnTheRight(Index p, Index q, const JacobiR
|
|
|
298
282
|
|
|
299
283
|
namespace internal {
|
|
300
284
|
|
|
301
|
-
template<typename Scalar, typename OtherScalar,
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
{
|
|
305
|
-
|
|
306
|
-
{
|
|
307
|
-
for(Index i=0; i<size; ++i)
|
|
308
|
-
{
|
|
285
|
+
template <typename Scalar, typename OtherScalar, int SizeAtCompileTime, int MinAlignment, bool Vectorizable>
|
|
286
|
+
struct apply_rotation_in_the_plane_selector {
|
|
287
|
+
static EIGEN_DEVICE_FUNC inline void run(Scalar* x, Index incrx, Scalar* y, Index incry, Index size, OtherScalar c,
|
|
288
|
+
OtherScalar s) {
|
|
289
|
+
for (Index i = 0; i < size; ++i) {
|
|
309
290
|
Scalar xi = *x;
|
|
310
291
|
Scalar yi = *y;
|
|
311
|
-
*x =
|
|
292
|
+
*x = c * xi + numext::conj(s) * yi;
|
|
312
293
|
*y = -s * xi + numext::conj(c) * yi;
|
|
313
294
|
x += incrx;
|
|
314
295
|
y += incry;
|
|
@@ -316,124 +297,111 @@ struct apply_rotation_in_the_plane_selector
|
|
|
316
297
|
}
|
|
317
298
|
};
|
|
318
299
|
|
|
319
|
-
template<typename Scalar, typename OtherScalar,
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
{
|
|
323
|
-
static inline void run(Scalar *x, Index incrx, Scalar *y, Index incry, Index size, OtherScalar c, OtherScalar s)
|
|
324
|
-
{
|
|
325
|
-
enum {
|
|
326
|
-
PacketSize = packet_traits<Scalar>::size,
|
|
327
|
-
OtherPacketSize = packet_traits<OtherScalar>::size
|
|
328
|
-
};
|
|
300
|
+
template <typename Scalar, typename OtherScalar, int SizeAtCompileTime, int MinAlignment>
|
|
301
|
+
struct apply_rotation_in_the_plane_selector<Scalar, OtherScalar, SizeAtCompileTime, MinAlignment,
|
|
302
|
+
true /* vectorizable */> {
|
|
303
|
+
static inline void run(Scalar* x, Index incrx, Scalar* y, Index incry, Index size, OtherScalar c, OtherScalar s) {
|
|
329
304
|
typedef typename packet_traits<Scalar>::type Packet;
|
|
330
305
|
typedef typename packet_traits<OtherScalar>::type OtherPacket;
|
|
331
306
|
|
|
307
|
+
constexpr int RequiredAlignment =
|
|
308
|
+
(std::max)(unpacket_traits<Packet>::alignment, unpacket_traits<OtherPacket>::alignment);
|
|
309
|
+
constexpr Index PacketSize = packet_traits<Scalar>::size;
|
|
310
|
+
|
|
332
311
|
/*** dynamic-size vectorized paths ***/
|
|
333
|
-
if(SizeAtCompileTime == Dynamic && ((incrx==1 && incry==1) || PacketSize == 1))
|
|
334
|
-
{
|
|
312
|
+
if (size >= 2 * PacketSize && SizeAtCompileTime == Dynamic && ((incrx == 1 && incry == 1) || PacketSize == 1)) {
|
|
335
313
|
// both vectors are sequentially stored in memory => vectorization
|
|
336
|
-
|
|
314
|
+
constexpr Index Peeling = 2;
|
|
337
315
|
|
|
338
316
|
Index alignedStart = internal::first_default_aligned(y, size);
|
|
339
|
-
Index alignedEnd = alignedStart + ((size-alignedStart)/PacketSize)*PacketSize;
|
|
317
|
+
Index alignedEnd = alignedStart + ((size - alignedStart) / PacketSize) * PacketSize;
|
|
340
318
|
|
|
341
319
|
const OtherPacket pc = pset1<OtherPacket>(c);
|
|
342
320
|
const OtherPacket ps = pset1<OtherPacket>(s);
|
|
343
|
-
conj_helper<OtherPacket,Packet,NumTraits<OtherScalar>::IsComplex,false> pcj;
|
|
344
|
-
conj_helper<OtherPacket,Packet,false,false> pm;
|
|
321
|
+
conj_helper<OtherPacket, Packet, NumTraits<OtherScalar>::IsComplex, false> pcj;
|
|
322
|
+
conj_helper<OtherPacket, Packet, false, false> pm;
|
|
345
323
|
|
|
346
|
-
for(Index i=0; i<alignedStart; ++i)
|
|
347
|
-
{
|
|
324
|
+
for (Index i = 0; i < alignedStart; ++i) {
|
|
348
325
|
Scalar xi = x[i];
|
|
349
326
|
Scalar yi = y[i];
|
|
350
|
-
x[i] =
|
|
327
|
+
x[i] = c * xi + numext::conj(s) * yi;
|
|
351
328
|
y[i] = -s * xi + numext::conj(c) * yi;
|
|
352
329
|
}
|
|
353
330
|
|
|
354
331
|
Scalar* EIGEN_RESTRICT px = x + alignedStart;
|
|
355
332
|
Scalar* EIGEN_RESTRICT py = y + alignedStart;
|
|
356
333
|
|
|
357
|
-
if(internal::first_default_aligned(x, size)==alignedStart)
|
|
358
|
-
|
|
359
|
-
for(Index i=alignedStart; i<alignedEnd; i+=PacketSize)
|
|
360
|
-
{
|
|
334
|
+
if (internal::first_default_aligned(x, size) == alignedStart) {
|
|
335
|
+
for (Index i = alignedStart; i < alignedEnd; i += PacketSize) {
|
|
361
336
|
Packet xi = pload<Packet>(px);
|
|
362
337
|
Packet yi = pload<Packet>(py);
|
|
363
|
-
pstore(px, padd(pm.pmul(pc,xi),pcj.pmul(ps,yi)));
|
|
364
|
-
pstore(py, psub(pcj.pmul(pc,yi),pm.pmul(ps,xi)));
|
|
338
|
+
pstore(px, padd(pm.pmul(pc, xi), pcj.pmul(ps, yi)));
|
|
339
|
+
pstore(py, psub(pcj.pmul(pc, yi), pm.pmul(ps, xi)));
|
|
365
340
|
px += PacketSize;
|
|
366
341
|
py += PacketSize;
|
|
367
342
|
}
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
Packet
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
pstore (py+PacketSize, psub(pcj.pmul(pc,yi1),pm.pmul(ps,xi1)));
|
|
382
|
-
px += Peeling*PacketSize;
|
|
383
|
-
py += Peeling*PacketSize;
|
|
343
|
+
} else {
|
|
344
|
+
Index peelingEnd = alignedStart + ((size - alignedStart) / (Peeling * PacketSize)) * (Peeling * PacketSize);
|
|
345
|
+
for (Index i = alignedStart; i < peelingEnd; i += Peeling * PacketSize) {
|
|
346
|
+
Packet xi = ploadu<Packet>(px);
|
|
347
|
+
Packet xi1 = ploadu<Packet>(px + PacketSize);
|
|
348
|
+
Packet yi = pload<Packet>(py);
|
|
349
|
+
Packet yi1 = pload<Packet>(py + PacketSize);
|
|
350
|
+
pstoreu(px, padd(pm.pmul(pc, xi), pcj.pmul(ps, yi)));
|
|
351
|
+
pstoreu(px + PacketSize, padd(pm.pmul(pc, xi1), pcj.pmul(ps, yi1)));
|
|
352
|
+
pstore(py, psub(pcj.pmul(pc, yi), pm.pmul(ps, xi)));
|
|
353
|
+
pstore(py + PacketSize, psub(pcj.pmul(pc, yi1), pm.pmul(ps, xi1)));
|
|
354
|
+
px += Peeling * PacketSize;
|
|
355
|
+
py += Peeling * PacketSize;
|
|
384
356
|
}
|
|
385
|
-
if(alignedEnd!=peelingEnd)
|
|
386
|
-
|
|
387
|
-
Packet
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
pstore (y+peelingEnd, psub(pcj.pmul(pc,yi),pm.pmul(ps,xi)));
|
|
357
|
+
if (alignedEnd != peelingEnd) {
|
|
358
|
+
Packet xi = ploadu<Packet>(x + peelingEnd);
|
|
359
|
+
Packet yi = pload<Packet>(y + peelingEnd);
|
|
360
|
+
pstoreu(x + peelingEnd, padd(pm.pmul(pc, xi), pcj.pmul(ps, yi)));
|
|
361
|
+
pstore(y + peelingEnd, psub(pcj.pmul(pc, yi), pm.pmul(ps, xi)));
|
|
391
362
|
}
|
|
392
363
|
}
|
|
393
364
|
|
|
394
|
-
for(Index i=alignedEnd; i<size; ++i)
|
|
395
|
-
{
|
|
365
|
+
for (Index i = alignedEnd; i < size; ++i) {
|
|
396
366
|
Scalar xi = x[i];
|
|
397
367
|
Scalar yi = y[i];
|
|
398
|
-
x[i] =
|
|
368
|
+
x[i] = c * xi + numext::conj(s) * yi;
|
|
399
369
|
y[i] = -s * xi + numext::conj(c) * yi;
|
|
400
370
|
}
|
|
401
371
|
}
|
|
402
372
|
|
|
403
373
|
/*** fixed-size vectorized path ***/
|
|
404
|
-
else if(SizeAtCompileTime != Dynamic && MinAlignment
|
|
405
|
-
{
|
|
374
|
+
else if (SizeAtCompileTime != Dynamic && MinAlignment >= RequiredAlignment) {
|
|
406
375
|
const OtherPacket pc = pset1<OtherPacket>(c);
|
|
407
376
|
const OtherPacket ps = pset1<OtherPacket>(s);
|
|
408
|
-
conj_helper<OtherPacket,Packet,NumTraits<
|
|
409
|
-
conj_helper<OtherPacket,Packet,false,false> pm;
|
|
377
|
+
conj_helper<OtherPacket, Packet, NumTraits<OtherScalar>::IsComplex, false> pcj;
|
|
378
|
+
conj_helper<OtherPacket, Packet, false, false> pm;
|
|
410
379
|
Scalar* EIGEN_RESTRICT px = x;
|
|
411
380
|
Scalar* EIGEN_RESTRICT py = y;
|
|
412
|
-
for(Index i=0; i<size; i+=PacketSize)
|
|
413
|
-
{
|
|
381
|
+
for (Index i = 0; i < size; i += PacketSize) {
|
|
414
382
|
Packet xi = pload<Packet>(px);
|
|
415
383
|
Packet yi = pload<Packet>(py);
|
|
416
|
-
pstore(px, padd(pm.pmul(pc,xi),pcj.pmul(ps,yi)));
|
|
417
|
-
pstore(py, psub(pcj.pmul(pc,yi),pm.pmul(ps,xi)));
|
|
384
|
+
pstore(px, padd(pm.pmul(pc, xi), pcj.pmul(ps, yi)));
|
|
385
|
+
pstore(py, psub(pcj.pmul(pc, yi), pm.pmul(ps, xi)));
|
|
418
386
|
px += PacketSize;
|
|
419
387
|
py += PacketSize;
|
|
420
388
|
}
|
|
421
389
|
}
|
|
422
390
|
|
|
423
391
|
/*** non-vectorized path ***/
|
|
424
|
-
else
|
|
425
|
-
|
|
426
|
-
|
|
392
|
+
else {
|
|
393
|
+
apply_rotation_in_the_plane_selector<Scalar, OtherScalar, SizeAtCompileTime, MinAlignment, false>::run(
|
|
394
|
+
x, incrx, y, incry, size, c, s);
|
|
427
395
|
}
|
|
428
396
|
}
|
|
429
397
|
};
|
|
430
398
|
|
|
431
|
-
template<typename VectorX, typename VectorY, typename OtherScalar>
|
|
432
|
-
void
|
|
433
|
-
{
|
|
399
|
+
template <typename VectorX, typename VectorY, typename OtherScalar>
|
|
400
|
+
EIGEN_DEVICE_FUNC void inline apply_rotation_in_the_plane(DenseBase<VectorX>& xpr_x, DenseBase<VectorY>& xpr_y,
|
|
401
|
+
const JacobiRotation<OtherScalar>& j) {
|
|
434
402
|
typedef typename VectorX::Scalar Scalar;
|
|
435
|
-
|
|
436
|
-
|
|
403
|
+
constexpr bool Vectorizable = (int(evaluator<VectorX>::Flags) & int(evaluator<VectorY>::Flags) & PacketAccessBit) &&
|
|
404
|
+
(int(packet_traits<Scalar>::size) == int(packet_traits<OtherScalar>::size));
|
|
437
405
|
|
|
438
406
|
eigen_assert(xpr_x.size() == xpr_y.size());
|
|
439
407
|
Index size = xpr_x.size();
|
|
@@ -442,21 +410,18 @@ void /*EIGEN_DONT_INLINE*/ apply_rotation_in_the_plane(DenseBase<VectorX>& xpr_x
|
|
|
442
410
|
|
|
443
411
|
Scalar* EIGEN_RESTRICT x = &xpr_x.derived().coeffRef(0);
|
|
444
412
|
Scalar* EIGEN_RESTRICT y = &xpr_y.derived().coeffRef(0);
|
|
445
|
-
|
|
413
|
+
|
|
446
414
|
OtherScalar c = j.c();
|
|
447
415
|
OtherScalar s = j.s();
|
|
448
|
-
if (c
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
apply_rotation_in_the_plane_selector<
|
|
452
|
-
|
|
453
|
-
VectorX::SizeAtCompileTime,
|
|
454
|
-
EIGEN_PLAIN_ENUM_MIN(evaluator<VectorX>::Alignment, evaluator<VectorY>::Alignment),
|
|
455
|
-
Vectorizable>::run(x,incrx,y,incry,size,c,s);
|
|
416
|
+
if (numext::is_exactly_one(c) && numext::is_exactly_zero(s)) return;
|
|
417
|
+
|
|
418
|
+
constexpr int Alignment = (std::min)(int(evaluator<VectorX>::Alignment), int(evaluator<VectorY>::Alignment));
|
|
419
|
+
apply_rotation_in_the_plane_selector<Scalar, OtherScalar, VectorX::SizeAtCompileTime, Alignment, Vectorizable>::run(
|
|
420
|
+
x, incrx, y, incry, size, c, s);
|
|
456
421
|
}
|
|
457
422
|
|
|
458
|
-
}
|
|
423
|
+
} // end namespace internal
|
|
459
424
|
|
|
460
|
-
}
|
|
425
|
+
} // end namespace Eigen
|
|
461
426
|
|
|
462
|
-
#endif
|
|
427
|
+
#endif // EIGEN_JACOBI_H
|