@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
|
@@ -13,134 +13,52 @@
|
|
|
13
13
|
// This file contains many lightweight helper classes used to
|
|
14
14
|
// implement and control fast level 2 and level 3 BLAS-like routines.
|
|
15
15
|
|
|
16
|
+
// IWYU pragma: private
|
|
17
|
+
#include "../InternalHeaderCheck.h"
|
|
18
|
+
|
|
16
19
|
namespace Eigen {
|
|
17
20
|
|
|
18
21
|
namespace internal {
|
|
19
22
|
|
|
20
23
|
// forward declarations
|
|
21
|
-
template<typename LhsScalar, typename RhsScalar, typename Index, typename DataMapper, int mr, int nr,
|
|
24
|
+
template <typename LhsScalar, typename RhsScalar, typename Index, typename DataMapper, int mr, int nr,
|
|
25
|
+
bool ConjugateLhs = false, bool ConjugateRhs = false>
|
|
22
26
|
struct gebp_kernel;
|
|
23
27
|
|
|
24
|
-
template<typename Scalar, typename Index, typename DataMapper, int nr, int StorageOrder, bool Conjugate = false,
|
|
28
|
+
template <typename Scalar, typename Index, typename DataMapper, int nr, int StorageOrder, bool Conjugate = false,
|
|
29
|
+
bool PanelMode = false>
|
|
25
30
|
struct gemm_pack_rhs;
|
|
26
31
|
|
|
27
|
-
template<typename Scalar, typename Index, typename DataMapper, int Pack1, int Pack2,
|
|
32
|
+
template <typename Scalar, typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, int StorageOrder,
|
|
33
|
+
bool Conjugate = false, bool PanelMode = false>
|
|
28
34
|
struct gemm_pack_lhs;
|
|
29
35
|
|
|
30
|
-
template<
|
|
31
|
-
|
|
32
|
-
typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,
|
|
33
|
-
typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs,
|
|
34
|
-
int ResStorageOrder, int ResInnerStride>
|
|
36
|
+
template <typename Index, typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs, typename RhsScalar,
|
|
37
|
+
int RhsStorageOrder, bool ConjugateRhs, int ResStorageOrder, int ResInnerStride>
|
|
35
38
|
struct general_matrix_matrix_product;
|
|
36
39
|
|
|
37
|
-
template<typename Index,
|
|
38
|
-
|
|
39
|
-
typename RhsScalar, typename RhsMapper, bool ConjugateRhs, int Version=Specialized>
|
|
40
|
+
template <typename Index, typename LhsScalar, typename LhsMapper, int LhsStorageOrder, bool ConjugateLhs,
|
|
41
|
+
typename RhsScalar, typename RhsMapper, bool ConjugateRhs, int Version = Specialized>
|
|
40
42
|
struct general_matrix_vector_product;
|
|
41
43
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
template<> struct conj_if<true> {
|
|
46
|
-
template<typename T>
|
|
47
|
-
inline T operator()(const T& x) const { return numext::conj(x); }
|
|
48
|
-
template<typename T>
|
|
49
|
-
inline T pconj(const T& x) const { return internal::pconj(x); }
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
template<> struct conj_if<false> {
|
|
53
|
-
template<typename T>
|
|
54
|
-
inline const T& operator()(const T& x) const { return x; }
|
|
55
|
-
template<typename T>
|
|
56
|
-
inline const T& pconj(const T& x) const { return x; }
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
// Generic implementation for custom complex types.
|
|
60
|
-
template<typename LhsScalar, typename RhsScalar, bool ConjLhs, bool ConjRhs>
|
|
61
|
-
struct conj_helper
|
|
62
|
-
{
|
|
63
|
-
typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar>::ReturnType Scalar;
|
|
64
|
-
|
|
65
|
-
EIGEN_STRONG_INLINE Scalar pmadd(const LhsScalar& x, const RhsScalar& y, const Scalar& c) const
|
|
66
|
-
{ return padd(c, pmul(x,y)); }
|
|
67
|
-
|
|
68
|
-
EIGEN_STRONG_INLINE Scalar pmul(const LhsScalar& x, const RhsScalar& y) const
|
|
69
|
-
{ return conj_if<ConjLhs>()(x) * conj_if<ConjRhs>()(y); }
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
template<typename Scalar> struct conj_helper<Scalar,Scalar,false,false>
|
|
73
|
-
{
|
|
74
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const Scalar& y, const Scalar& c) const { return internal::pmadd(x,y,c); }
|
|
75
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const Scalar& y) const { return internal::pmul(x,y); }
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
template<typename RealScalar> struct conj_helper<std::complex<RealScalar>, std::complex<RealScalar>, false,true>
|
|
79
|
-
{
|
|
80
|
-
typedef std::complex<RealScalar> Scalar;
|
|
81
|
-
EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const Scalar& y, const Scalar& c) const
|
|
82
|
-
{ return c + pmul(x,y); }
|
|
83
|
-
|
|
84
|
-
EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const Scalar& y) const
|
|
85
|
-
{ return Scalar(numext::real(x)*numext::real(y) + numext::imag(x)*numext::imag(y), numext::imag(x)*numext::real(y) - numext::real(x)*numext::imag(y)); }
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
template<typename RealScalar> struct conj_helper<std::complex<RealScalar>, std::complex<RealScalar>, true,false>
|
|
89
|
-
{
|
|
90
|
-
typedef std::complex<RealScalar> Scalar;
|
|
91
|
-
EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const Scalar& y, const Scalar& c) const
|
|
92
|
-
{ return c + pmul(x,y); }
|
|
93
|
-
|
|
94
|
-
EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const Scalar& y) const
|
|
95
|
-
{ return Scalar(numext::real(x)*numext::real(y) + numext::imag(x)*numext::imag(y), numext::real(x)*numext::imag(y) - numext::imag(x)*numext::real(y)); }
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
template<typename RealScalar> struct conj_helper<std::complex<RealScalar>, std::complex<RealScalar>, true,true>
|
|
99
|
-
{
|
|
100
|
-
typedef std::complex<RealScalar> Scalar;
|
|
101
|
-
EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const Scalar& y, const Scalar& c) const
|
|
102
|
-
{ return c + pmul(x,y); }
|
|
103
|
-
|
|
104
|
-
EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const Scalar& y) const
|
|
105
|
-
{ return Scalar(numext::real(x)*numext::real(y) - numext::imag(x)*numext::imag(y), - numext::real(x)*numext::imag(y) - numext::imag(x)*numext::real(y)); }
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
template<typename RealScalar,bool Conj> struct conj_helper<std::complex<RealScalar>, RealScalar, Conj,false>
|
|
109
|
-
{
|
|
110
|
-
typedef std::complex<RealScalar> Scalar;
|
|
111
|
-
EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const RealScalar& y, const Scalar& c) const
|
|
112
|
-
{ return padd(c, pmul(x,y)); }
|
|
113
|
-
EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const RealScalar& y) const
|
|
114
|
-
{ return conj_if<Conj>()(x)*y; }
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
template<typename RealScalar,bool Conj> struct conj_helper<RealScalar, std::complex<RealScalar>, false,Conj>
|
|
118
|
-
{
|
|
119
|
-
typedef std::complex<RealScalar> Scalar;
|
|
120
|
-
EIGEN_STRONG_INLINE Scalar pmadd(const RealScalar& x, const Scalar& y, const Scalar& c) const
|
|
121
|
-
{ return padd(c, pmul(x,y)); }
|
|
122
|
-
EIGEN_STRONG_INLINE Scalar pmul(const RealScalar& x, const Scalar& y) const
|
|
123
|
-
{ return x*conj_if<Conj>()(y); }
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
template<typename From,typename To> struct get_factor {
|
|
44
|
+
template <typename From, typename To>
|
|
45
|
+
struct get_factor {
|
|
127
46
|
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE To run(const From& x) { return To(x); }
|
|
128
47
|
};
|
|
129
48
|
|
|
130
|
-
template
|
|
131
|
-
|
|
132
|
-
static EIGEN_STRONG_INLINE typename NumTraits<Scalar>::Real run(const Scalar& x) {
|
|
49
|
+
template <typename Scalar>
|
|
50
|
+
struct get_factor<Scalar, typename NumTraits<Scalar>::Real> {
|
|
51
|
+
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE typename NumTraits<Scalar>::Real run(const Scalar& x) {
|
|
52
|
+
return numext::real(x);
|
|
53
|
+
}
|
|
133
54
|
};
|
|
134
55
|
|
|
135
|
-
|
|
136
|
-
template<typename Scalar, typename Index>
|
|
56
|
+
template <typename Scalar, typename Index>
|
|
137
57
|
class BlasVectorMapper {
|
|
138
|
-
|
|
139
|
-
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasVectorMapper(Scalar
|
|
58
|
+
public:
|
|
59
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasVectorMapper(Scalar* data) : m_data(data) {}
|
|
140
60
|
|
|
141
|
-
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar operator()(Index i) const {
|
|
142
|
-
return m_data[i];
|
|
143
|
-
}
|
|
61
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar operator()(Index i) const { return m_data[i]; }
|
|
144
62
|
template <typename Packet, int AlignmentType>
|
|
145
63
|
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Packet load(Index i) const {
|
|
146
64
|
return ploadt<Packet, AlignmentType>(m_data + i);
|
|
@@ -148,122 +66,198 @@ class BlasVectorMapper {
|
|
|
148
66
|
|
|
149
67
|
template <typename Packet>
|
|
150
68
|
EIGEN_DEVICE_FUNC bool aligned(Index i) const {
|
|
151
|
-
return (
|
|
69
|
+
return (std::uintptr_t(m_data + i) % sizeof(Packet)) == 0;
|
|
152
70
|
}
|
|
153
71
|
|
|
154
|
-
|
|
72
|
+
protected:
|
|
155
73
|
Scalar* m_data;
|
|
156
74
|
};
|
|
157
75
|
|
|
158
|
-
template<typename Scalar, typename Index, int AlignmentType, int Incr=1>
|
|
76
|
+
template <typename Scalar, typename Index, int AlignmentType, int Incr = 1>
|
|
159
77
|
class BlasLinearMapper;
|
|
160
78
|
|
|
161
|
-
template<typename Scalar, typename Index, int AlignmentType>
|
|
162
|
-
class BlasLinearMapper<Scalar,Index,AlignmentType
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
typedef typename packet_traits<Scalar>::half HalfPacket;
|
|
166
|
-
|
|
167
|
-
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasLinearMapper(Scalar *data, Index incr=1)
|
|
168
|
-
: m_data(data)
|
|
169
|
-
{
|
|
79
|
+
template <typename Scalar, typename Index, int AlignmentType>
|
|
80
|
+
class BlasLinearMapper<Scalar, Index, AlignmentType> {
|
|
81
|
+
public:
|
|
82
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasLinearMapper(Scalar* data, Index incr = 1) : m_data(data) {
|
|
170
83
|
EIGEN_ONLY_USED_FOR_DEBUG(incr);
|
|
171
|
-
eigen_assert(incr==1);
|
|
84
|
+
eigen_assert(incr == 1);
|
|
172
85
|
}
|
|
173
86
|
|
|
174
|
-
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(
|
|
175
|
-
|
|
87
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(Index i) const { internal::prefetch(&operator()(i)); }
|
|
88
|
+
|
|
89
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar& operator()(Index i) const { return m_data[i]; }
|
|
90
|
+
|
|
91
|
+
template <typename PacketType>
|
|
92
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i) const {
|
|
93
|
+
return ploadt<PacketType, AlignmentType>(m_data + i);
|
|
176
94
|
}
|
|
177
95
|
|
|
178
|
-
|
|
179
|
-
|
|
96
|
+
template <typename PacketType>
|
|
97
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacketPartial(Index i, Index n, Index offset = 0) const {
|
|
98
|
+
return ploadt_partial<PacketType, AlignmentType>(m_data + i, n, offset);
|
|
180
99
|
}
|
|
181
100
|
|
|
182
|
-
|
|
183
|
-
|
|
101
|
+
template <typename PacketType, int AlignmentT>
|
|
102
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType load(Index i) const {
|
|
103
|
+
return ploadt<PacketType, AlignmentT>(m_data + i);
|
|
184
104
|
}
|
|
185
105
|
|
|
186
|
-
|
|
187
|
-
|
|
106
|
+
template <typename PacketType>
|
|
107
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, const PacketType& p) const {
|
|
108
|
+
pstoret<Scalar, PacketType, AlignmentType>(m_data + i, p);
|
|
188
109
|
}
|
|
189
110
|
|
|
190
|
-
|
|
191
|
-
|
|
111
|
+
template <typename PacketType>
|
|
112
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketPartial(Index i, const PacketType& p, Index n,
|
|
113
|
+
Index offset = 0) const {
|
|
114
|
+
pstoret_partial<Scalar, PacketType, AlignmentType>(m_data + i, p, n, offset);
|
|
192
115
|
}
|
|
193
116
|
|
|
194
|
-
|
|
195
|
-
Scalar
|
|
117
|
+
protected:
|
|
118
|
+
Scalar* m_data;
|
|
196
119
|
};
|
|
197
120
|
|
|
198
121
|
// Lightweight helper class to access matrix coefficients.
|
|
199
|
-
template<typename Scalar, typename Index, int StorageOrder, int AlignmentType = Unaligned, int Incr = 1>
|
|
122
|
+
template <typename Scalar, typename Index, int StorageOrder, int AlignmentType = Unaligned, int Incr = 1>
|
|
200
123
|
class blas_data_mapper;
|
|
201
124
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
125
|
+
// TMP to help PacketBlock store implementation.
|
|
126
|
+
// There's currently no known use case for PacketBlock load.
|
|
127
|
+
// The default implementation assumes ColMajor order.
|
|
128
|
+
// It always store each packet sequentially one `stride` apart.
|
|
129
|
+
template <typename Index, typename Scalar, typename Packet, int n, int idx, int StorageOrder>
|
|
130
|
+
struct PacketBlockManagement {
|
|
131
|
+
PacketBlockManagement<Index, Scalar, Packet, n, idx - 1, StorageOrder> pbm;
|
|
132
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar* to, const Index stride, Index i, Index j,
|
|
133
|
+
const PacketBlock<Packet, n>& block) const {
|
|
134
|
+
pbm.store(to, stride, i, j, block);
|
|
135
|
+
pstoreu<Scalar>(to + i + (j + idx) * stride, block.packet[idx]);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
208
138
|
|
|
139
|
+
// PacketBlockManagement specialization to take care of RowMajor order without ifs.
|
|
140
|
+
template <typename Index, typename Scalar, typename Packet, int n, int idx>
|
|
141
|
+
struct PacketBlockManagement<Index, Scalar, Packet, n, idx, RowMajor> {
|
|
142
|
+
PacketBlockManagement<Index, Scalar, Packet, n, idx - 1, RowMajor> pbm;
|
|
143
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar* to, const Index stride, Index i, Index j,
|
|
144
|
+
const PacketBlock<Packet, n>& block) const {
|
|
145
|
+
pbm.store(to, stride, i, j, block);
|
|
146
|
+
pstoreu<Scalar>(to + j + (i + idx) * stride, block.packet[idx]);
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
template <typename Index, typename Scalar, typename Packet, int n, int StorageOrder>
|
|
151
|
+
struct PacketBlockManagement<Index, Scalar, Packet, n, -1, StorageOrder> {
|
|
152
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar* to, const Index stride, Index i, Index j,
|
|
153
|
+
const PacketBlock<Packet, n>& block) const {
|
|
154
|
+
EIGEN_UNUSED_VARIABLE(to);
|
|
155
|
+
EIGEN_UNUSED_VARIABLE(stride);
|
|
156
|
+
EIGEN_UNUSED_VARIABLE(i);
|
|
157
|
+
EIGEN_UNUSED_VARIABLE(j);
|
|
158
|
+
EIGEN_UNUSED_VARIABLE(block);
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
template <typename Index, typename Scalar, typename Packet, int n>
|
|
163
|
+
struct PacketBlockManagement<Index, Scalar, Packet, n, -1, RowMajor> {
|
|
164
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar* to, const Index stride, Index i, Index j,
|
|
165
|
+
const PacketBlock<Packet, n>& block) const {
|
|
166
|
+
EIGEN_UNUSED_VARIABLE(to);
|
|
167
|
+
EIGEN_UNUSED_VARIABLE(stride);
|
|
168
|
+
EIGEN_UNUSED_VARIABLE(i);
|
|
169
|
+
EIGEN_UNUSED_VARIABLE(j);
|
|
170
|
+
EIGEN_UNUSED_VARIABLE(block);
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
template <typename Scalar, typename Index, int StorageOrder, int AlignmentType>
|
|
175
|
+
class blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, 1> {
|
|
176
|
+
public:
|
|
209
177
|
typedef BlasLinearMapper<Scalar, Index, AlignmentType> LinearMapper;
|
|
178
|
+
typedef blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType> SubMapper;
|
|
210
179
|
typedef BlasVectorMapper<Scalar, Index> VectorMapper;
|
|
211
180
|
|
|
212
|
-
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE blas_data_mapper(Scalar* data, Index stride, Index incr=1)
|
|
213
|
-
|
|
214
|
-
{
|
|
181
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE blas_data_mapper(Scalar* data, Index stride, Index incr = 1)
|
|
182
|
+
: m_data(data), m_stride(stride) {
|
|
215
183
|
EIGEN_ONLY_USED_FOR_DEBUG(incr);
|
|
216
|
-
eigen_assert(incr==1);
|
|
184
|
+
eigen_assert(incr == 1);
|
|
217
185
|
}
|
|
218
186
|
|
|
219
|
-
EIGEN_DEVICE_FUNC
|
|
220
|
-
|
|
221
|
-
return blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType>(&operator()(i, j), m_stride);
|
|
187
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE SubMapper getSubMapper(Index i, Index j) const {
|
|
188
|
+
return SubMapper(&operator()(i, j), m_stride);
|
|
222
189
|
}
|
|
223
190
|
|
|
224
|
-
EIGEN_DEVICE_FUNC
|
|
191
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE LinearMapper getLinearMapper(Index i, Index j) const {
|
|
225
192
|
return LinearMapper(&operator()(i, j));
|
|
226
193
|
}
|
|
227
194
|
|
|
228
|
-
EIGEN_DEVICE_FUNC
|
|
195
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE VectorMapper getVectorMapper(Index i, Index j) const {
|
|
229
196
|
return VectorMapper(&operator()(i, j));
|
|
230
197
|
}
|
|
231
198
|
|
|
199
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(Index i, Index j) const { internal::prefetch(&operator()(i, j)); }
|
|
232
200
|
|
|
233
|
-
EIGEN_DEVICE_FUNC
|
|
234
|
-
|
|
235
|
-
return m_data[StorageOrder==RowMajor ? j + i*m_stride : i + j*m_stride];
|
|
201
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar& operator()(Index i, Index j) const {
|
|
202
|
+
return m_data[StorageOrder == RowMajor ? j + i * m_stride : i + j * m_stride];
|
|
236
203
|
}
|
|
237
204
|
|
|
238
|
-
|
|
239
|
-
|
|
205
|
+
template <typename PacketType>
|
|
206
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i, Index j) const {
|
|
207
|
+
return ploadt<PacketType, AlignmentType>(&operator()(i, j));
|
|
240
208
|
}
|
|
241
209
|
|
|
242
|
-
|
|
243
|
-
|
|
210
|
+
template <typename PacketType>
|
|
211
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacketPartial(Index i, Index j, Index n,
|
|
212
|
+
Index offset = 0) const {
|
|
213
|
+
return ploadt_partial<PacketType, AlignmentType>(&operator()(i, j), n, offset);
|
|
244
214
|
}
|
|
245
215
|
|
|
246
|
-
template<typename
|
|
247
|
-
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
|
|
216
|
+
template <typename PacketT, int AlignmentT>
|
|
217
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketT load(Index i, Index j) const {
|
|
218
|
+
return ploadt<PacketT, AlignmentT>(&operator()(i, j));
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
template <typename PacketType>
|
|
222
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, Index j, const PacketType& p) const {
|
|
223
|
+
pstoret<Scalar, PacketType, AlignmentType>(&operator()(i, j), p);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
template <typename PacketType>
|
|
227
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketPartial(Index i, Index j, const PacketType& p, Index n,
|
|
228
|
+
Index offset = 0) const {
|
|
229
|
+
pstoret_partial<Scalar, PacketType, AlignmentType>(&operator()(i, j), p, n, offset);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
template <typename SubPacket>
|
|
233
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void scatterPacket(Index i, Index j, const SubPacket& p) const {
|
|
248
234
|
pscatter<Scalar, SubPacket>(&operator()(i, j), p, m_stride);
|
|
249
235
|
}
|
|
250
236
|
|
|
251
|
-
template<typename SubPacket>
|
|
237
|
+
template <typename SubPacket>
|
|
252
238
|
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE SubPacket gatherPacket(Index i, Index j) const {
|
|
253
239
|
return pgather<Scalar, SubPacket>(&operator()(i, j), m_stride);
|
|
254
240
|
}
|
|
255
241
|
|
|
256
242
|
EIGEN_DEVICE_FUNC const Index stride() const { return m_stride; }
|
|
257
|
-
EIGEN_DEVICE_FUNC const
|
|
243
|
+
EIGEN_DEVICE_FUNC const Index incr() const { return 1; }
|
|
244
|
+
EIGEN_DEVICE_FUNC constexpr const Scalar* data() const { return m_data; }
|
|
258
245
|
|
|
259
246
|
EIGEN_DEVICE_FUNC Index firstAligned(Index size) const {
|
|
260
|
-
if (
|
|
247
|
+
if (std::uintptr_t(m_data) % sizeof(Scalar)) {
|
|
261
248
|
return -1;
|
|
262
249
|
}
|
|
263
250
|
return internal::first_default_aligned(m_data, size);
|
|
264
251
|
}
|
|
265
252
|
|
|
266
|
-
|
|
253
|
+
template <typename SubPacket, int n>
|
|
254
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketBlock(Index i, Index j,
|
|
255
|
+
const PacketBlock<SubPacket, n>& block) const {
|
|
256
|
+
PacketBlockManagement<Index, Scalar, SubPacket, n, n - 1, StorageOrder> pbm;
|
|
257
|
+
pbm.store(m_data, m_stride, i, j, block);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
protected:
|
|
267
261
|
Scalar* EIGEN_RESTRICT m_data;
|
|
268
262
|
const Index m_stride;
|
|
269
263
|
};
|
|
@@ -271,229 +265,358 @@ public:
|
|
|
271
265
|
// Implementation of non-natural increment (i.e. inner-stride != 1)
|
|
272
266
|
// The exposed API is not complete yet compared to the Incr==1 case
|
|
273
267
|
// because some features makes less sense in this case.
|
|
274
|
-
template<typename Scalar, typename Index, int AlignmentType, int Incr>
|
|
275
|
-
class BlasLinearMapper
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
268
|
+
template <typename Scalar, typename Index, int AlignmentType, int Incr>
|
|
269
|
+
class BlasLinearMapper {
|
|
270
|
+
public:
|
|
271
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasLinearMapper(Scalar* data, Index incr) : m_data(data), m_incr(incr) {}
|
|
272
|
+
|
|
273
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(int i) const { internal::prefetch(&operator()(i)); }
|
|
280
274
|
|
|
281
|
-
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE
|
|
275
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar& operator()(Index i) const { return m_data[i * m_incr.value()]; }
|
|
282
276
|
|
|
283
|
-
|
|
284
|
-
|
|
277
|
+
template <typename PacketType>
|
|
278
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i) const {
|
|
279
|
+
return pgather<Scalar, PacketType>(m_data + i * m_incr.value(), m_incr.value());
|
|
285
280
|
}
|
|
286
281
|
|
|
287
|
-
|
|
288
|
-
|
|
282
|
+
template <typename PacketType>
|
|
283
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacketPartial(Index i, Index n, Index /*offset*/ = 0) const {
|
|
284
|
+
return pgather_partial<Scalar, PacketType>(m_data + i * m_incr.value(), m_incr.value(), n);
|
|
289
285
|
}
|
|
290
286
|
|
|
291
|
-
|
|
292
|
-
|
|
287
|
+
template <typename PacketType>
|
|
288
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, const PacketType& p) const {
|
|
289
|
+
pscatter<Scalar, PacketType>(m_data + i * m_incr.value(), p, m_incr.value());
|
|
293
290
|
}
|
|
294
291
|
|
|
295
|
-
template<typename PacketType>
|
|
296
|
-
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void
|
|
297
|
-
|
|
292
|
+
template <typename PacketType>
|
|
293
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketPartial(Index i, const PacketType& p, Index n,
|
|
294
|
+
Index /*offset*/ = 0) const {
|
|
295
|
+
pscatter_partial<Scalar, PacketType>(m_data + i * m_incr.value(), p, m_incr.value(), n);
|
|
298
296
|
}
|
|
299
297
|
|
|
300
|
-
protected:
|
|
301
|
-
Scalar
|
|
302
|
-
const internal::variable_if_dynamic<Index,Incr> m_incr;
|
|
298
|
+
protected:
|
|
299
|
+
Scalar* m_data;
|
|
300
|
+
const internal::variable_if_dynamic<Index, Incr> m_incr;
|
|
303
301
|
};
|
|
304
302
|
|
|
305
|
-
template<typename Scalar, typename Index, int StorageOrder, int AlignmentType,int Incr>
|
|
306
|
-
class blas_data_mapper
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
typedef
|
|
310
|
-
typedef typename packet_traits<Scalar>::half HalfPacket;
|
|
311
|
-
|
|
312
|
-
typedef BlasLinearMapper<Scalar, Index, AlignmentType,Incr> LinearMapper;
|
|
303
|
+
template <typename Scalar, typename Index, int StorageOrder, int AlignmentType, int Incr>
|
|
304
|
+
class blas_data_mapper {
|
|
305
|
+
public:
|
|
306
|
+
typedef BlasLinearMapper<Scalar, Index, AlignmentType, Incr> LinearMapper;
|
|
307
|
+
typedef blas_data_mapper SubMapper;
|
|
313
308
|
|
|
314
|
-
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE blas_data_mapper(Scalar* data, Index stride, Index incr)
|
|
309
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE blas_data_mapper(Scalar* data, Index stride, Index incr)
|
|
310
|
+
: m_data(data), m_stride(stride), m_incr(incr) {}
|
|
315
311
|
|
|
316
|
-
EIGEN_DEVICE_FUNC
|
|
317
|
-
|
|
318
|
-
return blas_data_mapper(&operator()(i, j), m_stride, m_incr.value());
|
|
312
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE SubMapper getSubMapper(Index i, Index j) const {
|
|
313
|
+
return SubMapper(&operator()(i, j), m_stride, m_incr.value());
|
|
319
314
|
}
|
|
320
315
|
|
|
321
|
-
EIGEN_DEVICE_FUNC
|
|
316
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE LinearMapper getLinearMapper(Index i, Index j) const {
|
|
322
317
|
return LinearMapper(&operator()(i, j), m_incr.value());
|
|
323
318
|
}
|
|
324
319
|
|
|
325
|
-
EIGEN_DEVICE_FUNC
|
|
326
|
-
|
|
327
|
-
|
|
320
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(Index i, Index j) const { internal::prefetch(&operator()(i, j)); }
|
|
321
|
+
|
|
322
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE Scalar& operator()(Index i, Index j) const {
|
|
323
|
+
return m_data[StorageOrder == RowMajor ? j * m_incr.value() + i * m_stride : i * m_incr.value() + j * m_stride];
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
template <typename PacketType>
|
|
327
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i, Index j) const {
|
|
328
|
+
return pgather<Scalar, PacketType>(&operator()(i, j), m_incr.value());
|
|
328
329
|
}
|
|
329
330
|
|
|
330
|
-
|
|
331
|
-
|
|
331
|
+
template <typename PacketType>
|
|
332
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacketPartial(Index i, Index j, Index n,
|
|
333
|
+
Index /*offset*/ = 0) const {
|
|
334
|
+
return pgather_partial<Scalar, PacketType>(&operator()(i, j), m_incr.value(), n);
|
|
332
335
|
}
|
|
333
336
|
|
|
334
337
|
template <typename PacketT, int AlignmentT>
|
|
335
338
|
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketT load(Index i, Index j) const {
|
|
336
|
-
return pgather<Scalar,PacketT>(&operator()(i, j),m_incr.value());
|
|
339
|
+
return pgather<Scalar, PacketT>(&operator()(i, j), m_incr.value());
|
|
337
340
|
}
|
|
338
341
|
|
|
339
|
-
template<typename
|
|
340
|
-
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void
|
|
342
|
+
template <typename PacketType>
|
|
343
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, Index j, const PacketType& p) const {
|
|
344
|
+
pscatter<Scalar, PacketType>(&operator()(i, j), p, m_incr.value());
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
template <typename PacketType>
|
|
348
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketPartial(Index i, Index j, const PacketType& p, Index n,
|
|
349
|
+
Index /*offset*/ = 0) const {
|
|
350
|
+
pscatter_partial<Scalar, PacketType>(&operator()(i, j), p, m_incr.value(), n);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
template <typename SubPacket>
|
|
354
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void scatterPacket(Index i, Index j, const SubPacket& p) const {
|
|
341
355
|
pscatter<Scalar, SubPacket>(&operator()(i, j), p, m_stride);
|
|
342
356
|
}
|
|
343
357
|
|
|
344
|
-
template<typename SubPacket>
|
|
358
|
+
template <typename SubPacket>
|
|
345
359
|
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE SubPacket gatherPacket(Index i, Index j) const {
|
|
346
360
|
return pgather<Scalar, SubPacket>(&operator()(i, j), m_stride);
|
|
347
361
|
}
|
|
348
362
|
|
|
349
|
-
|
|
363
|
+
// storePacketBlock_helper defines a way to access values inside the PacketBlock, this is essentially required by the
|
|
364
|
+
// Complex types.
|
|
365
|
+
template <typename SubPacket, typename Scalar_, int n, int idx>
|
|
366
|
+
struct storePacketBlock_helper {
|
|
367
|
+
storePacketBlock_helper<SubPacket, Scalar_, n, idx - 1> spbh;
|
|
368
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(
|
|
369
|
+
const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>* sup, Index i, Index j,
|
|
370
|
+
const PacketBlock<SubPacket, n>& block) const {
|
|
371
|
+
spbh.store(sup, i, j, block);
|
|
372
|
+
sup->template storePacket<SubPacket>(i, j + idx, block.packet[idx]);
|
|
373
|
+
}
|
|
374
|
+
};
|
|
375
|
+
|
|
376
|
+
template <typename SubPacket, int n, int idx>
|
|
377
|
+
struct storePacketBlock_helper<SubPacket, std::complex<float>, n, idx> {
|
|
378
|
+
storePacketBlock_helper<SubPacket, std::complex<float>, n, idx - 1> spbh;
|
|
379
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(
|
|
380
|
+
const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>* sup, Index i, Index j,
|
|
381
|
+
const PacketBlock<SubPacket, n>& block) const {
|
|
382
|
+
spbh.store(sup, i, j, block);
|
|
383
|
+
sup->template storePacket<SubPacket>(i, j + idx, block.packet[idx]);
|
|
384
|
+
}
|
|
385
|
+
};
|
|
386
|
+
|
|
387
|
+
template <typename SubPacket, int n, int idx>
|
|
388
|
+
struct storePacketBlock_helper<SubPacket, std::complex<double>, n, idx> {
|
|
389
|
+
storePacketBlock_helper<SubPacket, std::complex<double>, n, idx - 1> spbh;
|
|
390
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(
|
|
391
|
+
const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>* sup, Index i, Index j,
|
|
392
|
+
const PacketBlock<SubPacket, n>& block) const {
|
|
393
|
+
spbh.store(sup, i, j, block);
|
|
394
|
+
for (int l = 0; l < unpacket_traits<SubPacket>::size; l++) {
|
|
395
|
+
std::complex<double>* v = &sup->operator()(i + l, j + idx);
|
|
396
|
+
v->real(block.packet[idx].v[2 * l + 0]);
|
|
397
|
+
v->imag(block.packet[idx].v[2 * l + 1]);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
};
|
|
401
|
+
|
|
402
|
+
template <typename SubPacket, typename Scalar_, int n>
|
|
403
|
+
struct storePacketBlock_helper<SubPacket, Scalar_, n, -1> {
|
|
404
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(
|
|
405
|
+
const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>*, Index, Index,
|
|
406
|
+
const PacketBlock<SubPacket, n>&) const {}
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
template <typename SubPacket, int n>
|
|
410
|
+
struct storePacketBlock_helper<SubPacket, std::complex<float>, n, -1> {
|
|
411
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(
|
|
412
|
+
const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>*, Index, Index,
|
|
413
|
+
const PacketBlock<SubPacket, n>&) const {}
|
|
414
|
+
};
|
|
415
|
+
|
|
416
|
+
template <typename SubPacket, int n>
|
|
417
|
+
struct storePacketBlock_helper<SubPacket, std::complex<double>, n, -1> {
|
|
418
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(
|
|
419
|
+
const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>*, Index, Index,
|
|
420
|
+
const PacketBlock<SubPacket, n>&) const {}
|
|
421
|
+
};
|
|
422
|
+
// This function stores a PacketBlock on m_data, this approach is really quite slow compare to Incr=1 and should be
|
|
423
|
+
// avoided when possible.
|
|
424
|
+
template <typename SubPacket, int n>
|
|
425
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketBlock(Index i, Index j,
|
|
426
|
+
const PacketBlock<SubPacket, n>& block) const {
|
|
427
|
+
storePacketBlock_helper<SubPacket, Scalar, n, n - 1> spb;
|
|
428
|
+
spb.store(this, i, j, block);
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
EIGEN_DEVICE_FUNC const Index stride() const { return m_stride; }
|
|
432
|
+
EIGEN_DEVICE_FUNC const Index incr() const { return m_incr.value(); }
|
|
433
|
+
EIGEN_DEVICE_FUNC constexpr Scalar* data() const { return m_data; }
|
|
434
|
+
|
|
435
|
+
protected:
|
|
350
436
|
Scalar* EIGEN_RESTRICT m_data;
|
|
351
437
|
const Index m_stride;
|
|
352
|
-
const internal::variable_if_dynamic<Index,Incr> m_incr;
|
|
438
|
+
const internal::variable_if_dynamic<Index, Incr> m_incr;
|
|
353
439
|
};
|
|
354
440
|
|
|
355
441
|
// lightweight helper class to access matrix coefficients (const version)
|
|
356
|
-
template<typename Scalar, typename Index, int StorageOrder>
|
|
442
|
+
template <typename Scalar, typename Index, int StorageOrder>
|
|
357
443
|
class const_blas_data_mapper : public blas_data_mapper<const Scalar, Index, StorageOrder> {
|
|
358
|
-
|
|
359
|
-
|
|
444
|
+
public:
|
|
445
|
+
typedef const_blas_data_mapper<Scalar, Index, StorageOrder> SubMapper;
|
|
360
446
|
|
|
361
|
-
EIGEN_ALWAYS_INLINE const_blas_data_mapper
|
|
362
|
-
|
|
447
|
+
EIGEN_ALWAYS_INLINE const_blas_data_mapper(const Scalar* data, Index stride)
|
|
448
|
+
: blas_data_mapper<const Scalar, Index, StorageOrder>(data, stride) {}
|
|
449
|
+
|
|
450
|
+
EIGEN_ALWAYS_INLINE SubMapper getSubMapper(Index i, Index j) const {
|
|
451
|
+
return SubMapper(&(this->operator()(i, j)), this->m_stride);
|
|
363
452
|
}
|
|
364
453
|
};
|
|
365
454
|
|
|
366
|
-
|
|
367
455
|
/* Helper class to analyze the factors of a Product expression.
|
|
368
456
|
* In particular it allows to pop out operator-, scalar multiples,
|
|
369
457
|
* and conjugate */
|
|
370
|
-
template<typename XprType>
|
|
371
|
-
{
|
|
458
|
+
template <typename XprType>
|
|
459
|
+
struct blas_traits {
|
|
372
460
|
typedef typename traits<XprType>::Scalar Scalar;
|
|
373
461
|
typedef const XprType& ExtractType;
|
|
374
|
-
typedef XprType
|
|
462
|
+
typedef XprType ExtractType_;
|
|
375
463
|
enum {
|
|
376
464
|
IsComplex = NumTraits<Scalar>::IsComplex,
|
|
377
465
|
IsTransposed = false,
|
|
378
466
|
NeedToConjugate = false,
|
|
379
|
-
HasUsableDirectAccess =
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
467
|
+
HasUsableDirectAccess =
|
|
468
|
+
((int(XprType::Flags) & DirectAccessBit) &&
|
|
469
|
+
(bool(XprType::IsVectorAtCompileTime) || int(inner_stride_at_compile_time<XprType>::ret) == 1))
|
|
470
|
+
? 1
|
|
471
|
+
: 0,
|
|
472
|
+
HasScalarFactor = false
|
|
383
473
|
};
|
|
384
|
-
typedef
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
474
|
+
typedef std::conditional_t<bool(HasUsableDirectAccess), ExtractType, typename ExtractType_::PlainObject>
|
|
475
|
+
DirectLinearAccessType;
|
|
476
|
+
EIGEN_DEVICE_FUNC static inline EIGEN_DEVICE_FUNC ExtractType extract(const XprType& x) { return x; }
|
|
477
|
+
EIGEN_DEVICE_FUNC static inline EIGEN_DEVICE_FUNC const Scalar extractScalarFactor(const XprType&) {
|
|
478
|
+
return Scalar(1);
|
|
479
|
+
}
|
|
390
480
|
};
|
|
391
481
|
|
|
392
482
|
// pop conjugate
|
|
393
|
-
template<typename Scalar, typename NestedXpr>
|
|
394
|
-
struct blas_traits<CwiseUnaryOp<scalar_conjugate_op<Scalar>, NestedXpr> >
|
|
395
|
-
: blas_traits<NestedXpr>
|
|
396
|
-
{
|
|
483
|
+
template <typename Scalar, typename NestedXpr>
|
|
484
|
+
struct blas_traits<CwiseUnaryOp<scalar_conjugate_op<Scalar>, NestedXpr> > : blas_traits<NestedXpr> {
|
|
397
485
|
typedef blas_traits<NestedXpr> Base;
|
|
398
486
|
typedef CwiseUnaryOp<scalar_conjugate_op<Scalar>, NestedXpr> XprType;
|
|
399
487
|
typedef typename Base::ExtractType ExtractType;
|
|
400
488
|
|
|
401
|
-
enum {
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
static inline Scalar extractScalarFactor(const XprType& x) { return conj(Base::extractScalarFactor(x.nestedExpression())); }
|
|
489
|
+
enum { IsComplex = NumTraits<Scalar>::IsComplex, NeedToConjugate = Base::NeedToConjugate ? 0 : IsComplex };
|
|
490
|
+
EIGEN_DEVICE_FUNC static inline ExtractType extract(const XprType& x) { return Base::extract(x.nestedExpression()); }
|
|
491
|
+
EIGEN_DEVICE_FUNC static inline Scalar extractScalarFactor(const XprType& x) {
|
|
492
|
+
return conj(Base::extractScalarFactor(x.nestedExpression()));
|
|
493
|
+
}
|
|
407
494
|
};
|
|
408
495
|
|
|
409
496
|
// pop scalar multiple
|
|
410
|
-
template<typename Scalar, typename NestedXpr, typename Plain>
|
|
411
|
-
struct blas_traits<
|
|
412
|
-
|
|
413
|
-
{
|
|
497
|
+
template <typename Scalar, typename NestedXpr, typename Plain>
|
|
498
|
+
struct blas_traits<
|
|
499
|
+
CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>, Plain>, NestedXpr> >
|
|
500
|
+
: blas_traits<NestedXpr> {
|
|
501
|
+
enum { HasScalarFactor = true };
|
|
414
502
|
typedef blas_traits<NestedXpr> Base;
|
|
415
|
-
typedef CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain>, NestedXpr>
|
|
503
|
+
typedef CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>, Plain>, NestedXpr>
|
|
504
|
+
XprType;
|
|
416
505
|
typedef typename Base::ExtractType ExtractType;
|
|
417
|
-
static inline ExtractType extract(const XprType& x) {
|
|
418
|
-
|
|
419
|
-
|
|
506
|
+
EIGEN_DEVICE_FUNC static inline EIGEN_DEVICE_FUNC ExtractType extract(const XprType& x) {
|
|
507
|
+
return Base::extract(x.rhs());
|
|
508
|
+
}
|
|
509
|
+
EIGEN_DEVICE_FUNC static inline EIGEN_DEVICE_FUNC Scalar extractScalarFactor(const XprType& x) {
|
|
510
|
+
return x.lhs().functor().m_other * Base::extractScalarFactor(x.rhs());
|
|
511
|
+
}
|
|
420
512
|
};
|
|
421
|
-
template<typename Scalar, typename NestedXpr, typename Plain>
|
|
422
|
-
struct blas_traits<
|
|
423
|
-
|
|
424
|
-
{
|
|
513
|
+
template <typename Scalar, typename NestedXpr, typename Plain>
|
|
514
|
+
struct blas_traits<
|
|
515
|
+
CwiseBinaryOp<scalar_product_op<Scalar>, NestedXpr, const CwiseNullaryOp<scalar_constant_op<Scalar>, Plain> > >
|
|
516
|
+
: blas_traits<NestedXpr> {
|
|
517
|
+
enum { HasScalarFactor = true };
|
|
425
518
|
typedef blas_traits<NestedXpr> Base;
|
|
426
|
-
typedef CwiseBinaryOp<scalar_product_op<Scalar>, NestedXpr, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain> >
|
|
519
|
+
typedef CwiseBinaryOp<scalar_product_op<Scalar>, NestedXpr, const CwiseNullaryOp<scalar_constant_op<Scalar>, Plain> >
|
|
520
|
+
XprType;
|
|
427
521
|
typedef typename Base::ExtractType ExtractType;
|
|
428
|
-
static inline ExtractType extract(const XprType& x) { return Base::extract(x.lhs()); }
|
|
429
|
-
static inline Scalar extractScalarFactor(const XprType& x)
|
|
430
|
-
|
|
522
|
+
EIGEN_DEVICE_FUNC static inline ExtractType extract(const XprType& x) { return Base::extract(x.lhs()); }
|
|
523
|
+
EIGEN_DEVICE_FUNC static inline Scalar extractScalarFactor(const XprType& x) {
|
|
524
|
+
return Base::extractScalarFactor(x.lhs()) * x.rhs().functor().m_other;
|
|
525
|
+
}
|
|
431
526
|
};
|
|
432
|
-
template<typename Scalar, typename Plain1, typename Plain2>
|
|
433
|
-
struct blas_traits<CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain1>,
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
{};
|
|
527
|
+
template <typename Scalar, typename Plain1, typename Plain2>
|
|
528
|
+
struct blas_traits<CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>, Plain1>,
|
|
529
|
+
const CwiseNullaryOp<scalar_constant_op<Scalar>, Plain2> > >
|
|
530
|
+
: blas_traits<CwiseNullaryOp<scalar_constant_op<Scalar>, Plain1> > {};
|
|
437
531
|
|
|
438
532
|
// pop opposite
|
|
439
|
-
template<typename Scalar, typename NestedXpr>
|
|
440
|
-
struct blas_traits<CwiseUnaryOp<scalar_opposite_op<Scalar>, NestedXpr> >
|
|
441
|
-
|
|
442
|
-
{
|
|
533
|
+
template <typename Scalar, typename NestedXpr>
|
|
534
|
+
struct blas_traits<CwiseUnaryOp<scalar_opposite_op<Scalar>, NestedXpr> > : blas_traits<NestedXpr> {
|
|
535
|
+
enum { HasScalarFactor = true };
|
|
443
536
|
typedef blas_traits<NestedXpr> Base;
|
|
444
537
|
typedef CwiseUnaryOp<scalar_opposite_op<Scalar>, NestedXpr> XprType;
|
|
445
538
|
typedef typename Base::ExtractType ExtractType;
|
|
446
|
-
static inline ExtractType extract(const XprType& x) { return Base::extract(x.nestedExpression()); }
|
|
447
|
-
static inline Scalar extractScalarFactor(const XprType& x)
|
|
448
|
-
|
|
539
|
+
EIGEN_DEVICE_FUNC static inline ExtractType extract(const XprType& x) { return Base::extract(x.nestedExpression()); }
|
|
540
|
+
EIGEN_DEVICE_FUNC static inline Scalar extractScalarFactor(const XprType& x) {
|
|
541
|
+
return -Base::extractScalarFactor(x.nestedExpression());
|
|
542
|
+
}
|
|
449
543
|
};
|
|
450
544
|
|
|
451
545
|
// pop/push transpose
|
|
452
|
-
template<typename NestedXpr>
|
|
453
|
-
struct blas_traits<Transpose<NestedXpr> >
|
|
454
|
-
: blas_traits<NestedXpr>
|
|
455
|
-
{
|
|
546
|
+
template <typename NestedXpr>
|
|
547
|
+
struct blas_traits<Transpose<NestedXpr> > : blas_traits<NestedXpr> {
|
|
456
548
|
typedef typename NestedXpr::Scalar Scalar;
|
|
457
549
|
typedef blas_traits<NestedXpr> Base;
|
|
458
550
|
typedef Transpose<NestedXpr> XprType;
|
|
459
|
-
typedef Transpose<const typename Base::
|
|
460
|
-
|
|
461
|
-
typedef typename
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
}
|
|
468
|
-
static inline
|
|
469
|
-
|
|
551
|
+
typedef Transpose<const typename Base::ExtractType_>
|
|
552
|
+
ExtractType; // const to get rid of a compile error; anyway blas traits are only used on the RHS
|
|
553
|
+
typedef Transpose<const typename Base::ExtractType_> ExtractType_;
|
|
554
|
+
typedef std::conditional_t<bool(Base::HasUsableDirectAccess), ExtractType, typename ExtractType::PlainObject>
|
|
555
|
+
DirectLinearAccessType;
|
|
556
|
+
enum { IsTransposed = Base::IsTransposed ? 0 : 1 };
|
|
557
|
+
EIGEN_DEVICE_FUNC static inline ExtractType extract(const XprType& x) {
|
|
558
|
+
return ExtractType(Base::extract(x.nestedExpression()));
|
|
559
|
+
}
|
|
560
|
+
EIGEN_DEVICE_FUNC static inline Scalar extractScalarFactor(const XprType& x) {
|
|
561
|
+
return Base::extractScalarFactor(x.nestedExpression());
|
|
562
|
+
}
|
|
470
563
|
};
|
|
471
564
|
|
|
472
|
-
template<typename T>
|
|
473
|
-
struct blas_traits<const T>
|
|
474
|
-
: blas_traits<T>
|
|
475
|
-
{};
|
|
565
|
+
template <typename T>
|
|
566
|
+
struct blas_traits<const T> : blas_traits<T> {};
|
|
476
567
|
|
|
477
|
-
template<typename T, bool HasUsableDirectAccess=blas_traits<T>::HasUsableDirectAccess>
|
|
568
|
+
template <typename T, bool HasUsableDirectAccess = blas_traits<T>::HasUsableDirectAccess>
|
|
478
569
|
struct extract_data_selector {
|
|
479
|
-
static const typename T::Scalar* run(const T& m)
|
|
480
|
-
{
|
|
570
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static const typename T::Scalar* run(const T& m) {
|
|
481
571
|
return blas_traits<T>::extract(m).data();
|
|
482
572
|
}
|
|
483
573
|
};
|
|
484
574
|
|
|
485
|
-
template<typename T>
|
|
486
|
-
struct extract_data_selector<T,false> {
|
|
487
|
-
static typename T::Scalar* run(const T&) { return 0; }
|
|
575
|
+
template <typename T>
|
|
576
|
+
struct extract_data_selector<T, false> {
|
|
577
|
+
EIGEN_DEVICE_FUNC static typename T::Scalar* run(const T&) { return 0; }
|
|
488
578
|
};
|
|
489
579
|
|
|
490
|
-
template<typename T>
|
|
491
|
-
{
|
|
580
|
+
template <typename T>
|
|
581
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const typename T::Scalar* extract_data(const T& m) {
|
|
492
582
|
return extract_data_selector<T>::run(m);
|
|
493
583
|
}
|
|
494
584
|
|
|
495
|
-
|
|
585
|
+
/**
|
|
586
|
+
* \c combine_scalar_factors extracts and multiplies factors from GEMM and GEMV products.
|
|
587
|
+
* There is a specialization for booleans
|
|
588
|
+
*/
|
|
589
|
+
template <typename ResScalar, typename Lhs, typename Rhs>
|
|
590
|
+
struct combine_scalar_factors_impl {
|
|
591
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static ResScalar run(const Lhs& lhs, const Rhs& rhs) {
|
|
592
|
+
return blas_traits<Lhs>::extractScalarFactor(lhs) * blas_traits<Rhs>::extractScalarFactor(rhs);
|
|
593
|
+
}
|
|
594
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static ResScalar run(const ResScalar& alpha, const Lhs& lhs, const Rhs& rhs) {
|
|
595
|
+
return alpha * blas_traits<Lhs>::extractScalarFactor(lhs) * blas_traits<Rhs>::extractScalarFactor(rhs);
|
|
596
|
+
}
|
|
597
|
+
};
|
|
598
|
+
template <typename Lhs, typename Rhs>
|
|
599
|
+
struct combine_scalar_factors_impl<bool, Lhs, Rhs> {
|
|
600
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static bool run(const Lhs& lhs, const Rhs& rhs) {
|
|
601
|
+
return blas_traits<Lhs>::extractScalarFactor(lhs) && blas_traits<Rhs>::extractScalarFactor(rhs);
|
|
602
|
+
}
|
|
603
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static bool run(const bool& alpha, const Lhs& lhs, const Rhs& rhs) {
|
|
604
|
+
return alpha && blas_traits<Lhs>::extractScalarFactor(lhs) && blas_traits<Rhs>::extractScalarFactor(rhs);
|
|
605
|
+
}
|
|
606
|
+
};
|
|
607
|
+
|
|
608
|
+
template <typename ResScalar, typename Lhs, typename Rhs>
|
|
609
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE ResScalar combine_scalar_factors(const ResScalar& alpha, const Lhs& lhs,
|
|
610
|
+
const Rhs& rhs) {
|
|
611
|
+
return combine_scalar_factors_impl<ResScalar, Lhs, Rhs>::run(alpha, lhs, rhs);
|
|
612
|
+
}
|
|
613
|
+
template <typename ResScalar, typename Lhs, typename Rhs>
|
|
614
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE ResScalar combine_scalar_factors(const Lhs& lhs, const Rhs& rhs) {
|
|
615
|
+
return combine_scalar_factors_impl<ResScalar, Lhs, Rhs>::run(lhs, rhs);
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
} // end namespace internal
|
|
496
619
|
|
|
497
|
-
}
|
|
620
|
+
} // end namespace Eigen
|
|
498
621
|
|
|
499
|
-
#endif
|
|
622
|
+
#endif // EIGEN_BLASUTIL_H
|