@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,7 +11,10 @@
|
|
|
11
11
|
#ifndef EIGEN_REDUX_H
|
|
12
12
|
#define EIGEN_REDUX_H
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
// IWYU pragma: private
|
|
15
|
+
#include "./InternalHeaderCheck.h"
|
|
16
|
+
|
|
17
|
+
namespace Eigen {
|
|
15
18
|
|
|
16
19
|
namespace internal {
|
|
17
20
|
|
|
@@ -20,244 +23,300 @@ namespace internal {
|
|
|
20
23
|
// * factorize code
|
|
21
24
|
|
|
22
25
|
/***************************************************************************
|
|
23
|
-
* Part 1 : the logic deciding a strategy for vectorization and unrolling
|
|
24
|
-
***************************************************************************/
|
|
25
|
-
|
|
26
|
-
template<typename Func, typename
|
|
27
|
-
struct redux_traits
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
typedef typename find_best_packet<typename Derived::Scalar,Derived::SizeAtCompileTime>::type PacketType;
|
|
26
|
+
* Part 1 : the logic deciding a strategy for vectorization and unrolling
|
|
27
|
+
***************************************************************************/
|
|
28
|
+
|
|
29
|
+
template <typename Func, typename Evaluator>
|
|
30
|
+
struct redux_traits {
|
|
31
|
+
public:
|
|
32
|
+
typedef typename find_best_packet<typename Evaluator::Scalar, Evaluator::SizeAtCompileTime>::type PacketType;
|
|
31
33
|
enum {
|
|
32
34
|
PacketSize = unpacket_traits<PacketType>::size,
|
|
33
|
-
InnerMaxSize = int(
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
InnerMaxSize = int(Evaluator::IsRowMajor) ? Evaluator::MaxColsAtCompileTime : Evaluator::MaxRowsAtCompileTime,
|
|
36
|
+
OuterMaxSize = int(Evaluator::IsRowMajor) ? Evaluator::MaxRowsAtCompileTime : Evaluator::MaxColsAtCompileTime,
|
|
37
|
+
SliceVectorizedWork = int(InnerMaxSize) == Dynamic ? Dynamic
|
|
38
|
+
: int(OuterMaxSize) == Dynamic ? (int(InnerMaxSize) >= int(PacketSize) ? Dynamic : 0)
|
|
39
|
+
: (int(InnerMaxSize) / int(PacketSize)) * int(OuterMaxSize)
|
|
36
40
|
};
|
|
37
41
|
|
|
38
42
|
enum {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
MayLinearVectorize = bool(MightVectorize) && (
|
|
42
|
-
MaySliceVectorize
|
|
43
|
+
MayLinearize = (int(Evaluator::Flags) & LinearAccessBit),
|
|
44
|
+
MightVectorize = (int(Evaluator::Flags) & ActualPacketAccessBit) && (functor_traits<Func>::PacketAccess),
|
|
45
|
+
MayLinearVectorize = bool(MightVectorize) && bool(MayLinearize),
|
|
46
|
+
MaySliceVectorize = bool(MightVectorize) && (int(SliceVectorizedWork) == Dynamic || int(SliceVectorizedWork) >= 3)
|
|
43
47
|
};
|
|
44
48
|
|
|
45
|
-
public:
|
|
49
|
+
public:
|
|
46
50
|
enum {
|
|
47
|
-
Traversal = int(MayLinearVectorize)
|
|
48
|
-
|
|
49
|
-
|
|
51
|
+
Traversal = int(MayLinearVectorize) ? int(LinearVectorizedTraversal)
|
|
52
|
+
: int(MaySliceVectorize) ? int(SliceVectorizedTraversal)
|
|
53
|
+
: int(MayLinearize) ? int(LinearTraversal)
|
|
54
|
+
: int(DefaultTraversal)
|
|
50
55
|
};
|
|
51
56
|
|
|
52
|
-
public:
|
|
57
|
+
public:
|
|
53
58
|
enum {
|
|
54
|
-
Cost =
|
|
55
|
-
|
|
59
|
+
Cost = Evaluator::SizeAtCompileTime == Dynamic
|
|
60
|
+
? HugeCost
|
|
61
|
+
: int(Evaluator::SizeAtCompileTime) * int(Evaluator::CoeffReadCost) +
|
|
62
|
+
(Evaluator::SizeAtCompileTime - 1) * functor_traits<Func>::Cost,
|
|
56
63
|
UnrollingLimit = EIGEN_UNROLLING_LIMIT * (int(Traversal) == int(DefaultTraversal) ? 1 : int(PacketSize))
|
|
57
64
|
};
|
|
58
65
|
|
|
59
|
-
public:
|
|
60
|
-
enum {
|
|
61
|
-
|
|
62
|
-
};
|
|
63
|
-
|
|
66
|
+
public:
|
|
67
|
+
enum { Unrolling = Cost <= UnrollingLimit ? CompleteUnrolling : NoUnrolling };
|
|
68
|
+
|
|
64
69
|
#ifdef EIGEN_DEBUG_ASSIGN
|
|
65
|
-
static void debug()
|
|
66
|
-
|
|
67
|
-
std::cerr << "Xpr: " << typeid(typename Derived::XprType).name() << std::endl;
|
|
70
|
+
static void debug() {
|
|
71
|
+
std::cerr << "Xpr: " << typeid(typename Evaluator::XprType).name() << std::endl;
|
|
68
72
|
std::cerr.setf(std::ios::hex, std::ios::basefield);
|
|
69
|
-
EIGEN_DEBUG_VAR(
|
|
73
|
+
EIGEN_DEBUG_VAR(Evaluator::Flags)
|
|
70
74
|
std::cerr.unsetf(std::ios::hex);
|
|
71
75
|
EIGEN_DEBUG_VAR(InnerMaxSize)
|
|
76
|
+
EIGEN_DEBUG_VAR(OuterMaxSize)
|
|
77
|
+
EIGEN_DEBUG_VAR(SliceVectorizedWork)
|
|
72
78
|
EIGEN_DEBUG_VAR(PacketSize)
|
|
73
79
|
EIGEN_DEBUG_VAR(MightVectorize)
|
|
74
80
|
EIGEN_DEBUG_VAR(MayLinearVectorize)
|
|
75
81
|
EIGEN_DEBUG_VAR(MaySliceVectorize)
|
|
76
|
-
|
|
82
|
+
std::cerr << "Traversal"
|
|
83
|
+
<< " = " << Traversal << " (" << demangle_traversal(Traversal) << ")" << std::endl;
|
|
77
84
|
EIGEN_DEBUG_VAR(UnrollingLimit)
|
|
78
|
-
|
|
85
|
+
std::cerr << "Unrolling"
|
|
86
|
+
<< " = " << Unrolling << " (" << demangle_unrolling(Unrolling) << ")" << std::endl;
|
|
79
87
|
std::cerr << std::endl;
|
|
80
88
|
}
|
|
81
89
|
#endif
|
|
82
90
|
};
|
|
83
91
|
|
|
84
92
|
/***************************************************************************
|
|
85
|
-
* Part 2 : unrollers
|
|
86
|
-
***************************************************************************/
|
|
93
|
+
* Part 2 : unrollers
|
|
94
|
+
***************************************************************************/
|
|
87
95
|
|
|
88
96
|
/*** no vectorization ***/
|
|
89
97
|
|
|
90
|
-
template<typename Func, typename
|
|
91
|
-
struct redux_novec_unroller
|
|
92
|
-
|
|
93
|
-
enum {
|
|
94
|
-
HalfLength = Length/2
|
|
95
|
-
};
|
|
98
|
+
template <typename Func, typename Evaluator, Index Start, Index Length>
|
|
99
|
+
struct redux_novec_unroller {
|
|
100
|
+
static constexpr Index HalfLength = Length / 2;
|
|
96
101
|
|
|
97
|
-
typedef typename
|
|
102
|
+
typedef typename Evaluator::Scalar Scalar;
|
|
98
103
|
|
|
99
|
-
EIGEN_DEVICE_FUNC
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
return func(redux_novec_unroller<Func, Derived, Start, HalfLength>::run(mat,func),
|
|
103
|
-
redux_novec_unroller<Func, Derived, Start+HalfLength, Length-HalfLength>::run(mat,func));
|
|
104
|
+
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func) {
|
|
105
|
+
return func(redux_novec_unroller<Func, Evaluator, Start, HalfLength>::run(eval, func),
|
|
106
|
+
redux_novec_unroller<Func, Evaluator, Start + HalfLength, Length - HalfLength>::run(eval, func));
|
|
104
107
|
}
|
|
105
108
|
};
|
|
106
109
|
|
|
107
|
-
template<typename Func, typename
|
|
108
|
-
struct redux_novec_unroller<Func,
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
outer = Start / Derived::InnerSizeAtCompileTime,
|
|
112
|
-
inner = Start % Derived::InnerSizeAtCompileTime
|
|
113
|
-
};
|
|
110
|
+
template <typename Func, typename Evaluator, Index Start>
|
|
111
|
+
struct redux_novec_unroller<Func, Evaluator, Start, 1> {
|
|
112
|
+
static constexpr Index outer = Start / Evaluator::InnerSizeAtCompileTime;
|
|
113
|
+
static constexpr Index inner = Start % Evaluator::InnerSizeAtCompileTime;
|
|
114
114
|
|
|
115
|
-
typedef typename
|
|
115
|
+
typedef typename Evaluator::Scalar Scalar;
|
|
116
116
|
|
|
117
|
-
EIGEN_DEVICE_FUNC
|
|
118
|
-
|
|
119
|
-
{
|
|
120
|
-
return mat.coeffByOuterInner(outer, inner);
|
|
117
|
+
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func&) {
|
|
118
|
+
return eval.coeffByOuterInner(outer, inner);
|
|
121
119
|
}
|
|
122
120
|
};
|
|
123
121
|
|
|
124
122
|
// This is actually dead code and will never be called. It is required
|
|
125
123
|
// to prevent false warnings regarding failed inlining though
|
|
126
124
|
// for 0 length run() will never be called at all.
|
|
127
|
-
template<typename Func, typename
|
|
128
|
-
struct redux_novec_unroller<Func,
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
EIGEN_DEVICE_FUNC
|
|
132
|
-
static EIGEN_STRONG_INLINE Scalar run(const Derived&, const Func&) { return Scalar(); }
|
|
125
|
+
template <typename Func, typename Evaluator, Index Start>
|
|
126
|
+
struct redux_novec_unroller<Func, Evaluator, Start, 0> {
|
|
127
|
+
typedef typename Evaluator::Scalar Scalar;
|
|
128
|
+
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator&, const Func&) { return Scalar(); }
|
|
133
129
|
};
|
|
134
130
|
|
|
135
|
-
|
|
131
|
+
template <typename Func, typename Evaluator, Index Start, Index Length>
|
|
132
|
+
struct redux_novec_linear_unroller {
|
|
133
|
+
static constexpr Index HalfLength = Length / 2;
|
|
136
134
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
{
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
135
|
+
typedef typename Evaluator::Scalar Scalar;
|
|
136
|
+
|
|
137
|
+
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func) {
|
|
138
|
+
return func(redux_novec_linear_unroller<Func, Evaluator, Start, HalfLength>::run(eval, func),
|
|
139
|
+
redux_novec_linear_unroller<Func, Evaluator, Start + HalfLength, Length - HalfLength>::run(eval, func));
|
|
140
|
+
}
|
|
141
|
+
};
|
|
144
142
|
|
|
145
|
-
|
|
146
|
-
|
|
143
|
+
template <typename Func, typename Evaluator, Index Start>
|
|
144
|
+
struct redux_novec_linear_unroller<Func, Evaluator, Start, 1> {
|
|
145
|
+
typedef typename Evaluator::Scalar Scalar;
|
|
146
|
+
|
|
147
|
+
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func&) {
|
|
148
|
+
return eval.coeff(Start);
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
// This is actually dead code and will never be called. It is required
|
|
153
|
+
// to prevent false warnings regarding failed inlining though
|
|
154
|
+
// for 0 length run() will never be called at all.
|
|
155
|
+
template <typename Func, typename Evaluator, Index Start>
|
|
156
|
+
struct redux_novec_linear_unroller<Func, Evaluator, Start, 0> {
|
|
157
|
+
typedef typename Evaluator::Scalar Scalar;
|
|
158
|
+
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator&, const Func&) { return Scalar(); }
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
/*** vectorization ***/
|
|
162
|
+
|
|
163
|
+
template <typename Func, typename Evaluator, Index Start, Index Length>
|
|
164
|
+
struct redux_vec_unroller {
|
|
165
|
+
template <typename PacketType>
|
|
166
|
+
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE PacketType run(const Evaluator& eval, const Func& func) {
|
|
167
|
+
constexpr Index HalfLength = Length / 2;
|
|
147
168
|
|
|
148
|
-
static EIGEN_STRONG_INLINE PacketScalar run(const Derived &mat, const Func& func)
|
|
149
|
-
{
|
|
150
169
|
return func.packetOp(
|
|
151
|
-
|
|
152
|
-
|
|
170
|
+
redux_vec_unroller<Func, Evaluator, Start, HalfLength>::template run<PacketType>(eval, func),
|
|
171
|
+
redux_vec_unroller<Func, Evaluator, Start + HalfLength, Length - HalfLength>::template run<PacketType>(eval,
|
|
172
|
+
func));
|
|
153
173
|
}
|
|
154
174
|
};
|
|
155
175
|
|
|
156
|
-
template<typename Func, typename
|
|
157
|
-
struct redux_vec_unroller<Func,
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
176
|
+
template <typename Func, typename Evaluator, Index Start>
|
|
177
|
+
struct redux_vec_unroller<Func, Evaluator, Start, 1> {
|
|
178
|
+
template <typename PacketType>
|
|
179
|
+
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE PacketType run(const Evaluator& eval, const Func&) {
|
|
180
|
+
constexpr Index PacketSize = unpacket_traits<PacketType>::size;
|
|
181
|
+
constexpr Index index = Start * PacketSize;
|
|
182
|
+
constexpr Index outer = index / int(Evaluator::InnerSizeAtCompileTime);
|
|
183
|
+
constexpr Index inner = index % int(Evaluator::InnerSizeAtCompileTime);
|
|
184
|
+
constexpr int alignment = Evaluator::Alignment;
|
|
185
|
+
|
|
186
|
+
return eval.template packetByOuterInner<alignment, PacketType>(outer, inner);
|
|
187
|
+
}
|
|
188
|
+
};
|
|
165
189
|
|
|
166
|
-
|
|
167
|
-
|
|
190
|
+
template <typename Func, typename Evaluator, Index Start, Index Length>
|
|
191
|
+
struct redux_vec_linear_unroller {
|
|
192
|
+
template <typename PacketType>
|
|
193
|
+
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE PacketType run(const Evaluator& eval, const Func& func) {
|
|
194
|
+
constexpr Index HalfLength = Length / 2;
|
|
168
195
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
196
|
+
return func.packetOp(
|
|
197
|
+
redux_vec_linear_unroller<Func, Evaluator, Start, HalfLength>::template run<PacketType>(eval, func),
|
|
198
|
+
redux_vec_linear_unroller<Func, Evaluator, Start + HalfLength, Length - HalfLength>::template run<PacketType>(
|
|
199
|
+
eval, func));
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
template <typename Func, typename Evaluator, Index Start>
|
|
204
|
+
struct redux_vec_linear_unroller<Func, Evaluator, Start, 1> {
|
|
205
|
+
template <typename PacketType>
|
|
206
|
+
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE PacketType run(const Evaluator& eval, const Func&) {
|
|
207
|
+
constexpr Index PacketSize = unpacket_traits<PacketType>::size;
|
|
208
|
+
constexpr Index index = (Start * PacketSize);
|
|
209
|
+
constexpr int alignment = Evaluator::Alignment;
|
|
210
|
+
return eval.template packet<alignment, PacketType>(index);
|
|
172
211
|
}
|
|
173
212
|
};
|
|
174
213
|
|
|
175
214
|
/***************************************************************************
|
|
176
|
-
* Part 3 : implementation of all cases
|
|
177
|
-
***************************************************************************/
|
|
215
|
+
* Part 3 : implementation of all cases
|
|
216
|
+
***************************************************************************/
|
|
178
217
|
|
|
179
|
-
template<typename Func, typename
|
|
180
|
-
|
|
181
|
-
int Unrolling = redux_traits<Func, Derived>::Unrolling
|
|
182
|
-
>
|
|
218
|
+
template <typename Func, typename Evaluator, int Traversal = redux_traits<Func, Evaluator>::Traversal,
|
|
219
|
+
int Unrolling = redux_traits<Func, Evaluator>::Unrolling>
|
|
183
220
|
struct redux_impl;
|
|
184
221
|
|
|
185
|
-
template<typename Func, typename
|
|
186
|
-
struct redux_impl<Func,
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
static EIGEN_STRONG_INLINE Scalar run(const
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
222
|
+
template <typename Func, typename Evaluator>
|
|
223
|
+
struct redux_impl<Func, Evaluator, DefaultTraversal, NoUnrolling> {
|
|
224
|
+
typedef typename Evaluator::Scalar Scalar;
|
|
225
|
+
|
|
226
|
+
template <typename XprType>
|
|
227
|
+
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func, const XprType& xpr) {
|
|
228
|
+
eigen_assert(xpr.rows() > 0 && xpr.cols() > 0 && "you are using an empty matrix");
|
|
229
|
+
Scalar res = eval.coeffByOuterInner(0, 0);
|
|
230
|
+
for (Index i = 1; i < xpr.innerSize(); ++i) res = func(res, eval.coeffByOuterInner(0, i));
|
|
231
|
+
for (Index i = 1; i < xpr.outerSize(); ++i)
|
|
232
|
+
for (Index j = 0; j < xpr.innerSize(); ++j) res = func(res, eval.coeffByOuterInner(i, j));
|
|
233
|
+
return res;
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
template <typename Func, typename Evaluator>
|
|
238
|
+
struct redux_impl<Func, Evaluator, LinearTraversal, NoUnrolling> {
|
|
239
|
+
typedef typename Evaluator::Scalar Scalar;
|
|
240
|
+
|
|
241
|
+
template <typename XprType>
|
|
242
|
+
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func, const XprType& xpr) {
|
|
243
|
+
eigen_assert(xpr.size() > 0 && "you are using an empty matrix");
|
|
244
|
+
Scalar res = eval.coeff(0);
|
|
245
|
+
for (Index k = 1; k < xpr.size(); ++k) res = func(res, eval.coeff(k));
|
|
200
246
|
return res;
|
|
201
247
|
}
|
|
202
248
|
};
|
|
203
249
|
|
|
204
|
-
template<typename Func, typename
|
|
205
|
-
struct redux_impl<Func,
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
template<typename
|
|
210
|
-
|
|
211
|
-
{
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
250
|
+
template <typename Func, typename Evaluator>
|
|
251
|
+
struct redux_impl<Func, Evaluator, DefaultTraversal, CompleteUnrolling>
|
|
252
|
+
: redux_novec_unroller<Func, Evaluator, 0, Evaluator::SizeAtCompileTime> {
|
|
253
|
+
typedef redux_novec_unroller<Func, Evaluator, 0, Evaluator::SizeAtCompileTime> Base;
|
|
254
|
+
typedef typename Evaluator::Scalar Scalar;
|
|
255
|
+
template <typename XprType>
|
|
256
|
+
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func,
|
|
257
|
+
const XprType& /*xpr*/) {
|
|
258
|
+
return Base::run(eval, func);
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
template <typename Func, typename Evaluator>
|
|
263
|
+
struct redux_impl<Func, Evaluator, LinearTraversal, CompleteUnrolling>
|
|
264
|
+
: redux_novec_linear_unroller<Func, Evaluator, 0, Evaluator::SizeAtCompileTime> {
|
|
265
|
+
typedef redux_novec_linear_unroller<Func, Evaluator, 0, Evaluator::SizeAtCompileTime> Base;
|
|
266
|
+
typedef typename Evaluator::Scalar Scalar;
|
|
267
|
+
template <typename XprType>
|
|
268
|
+
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func,
|
|
269
|
+
const XprType& /*xpr*/) {
|
|
270
|
+
return Base::run(eval, func);
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
template <typename Func, typename Evaluator>
|
|
275
|
+
struct redux_impl<Func, Evaluator, LinearVectorizedTraversal, NoUnrolling> {
|
|
276
|
+
typedef typename Evaluator::Scalar Scalar;
|
|
277
|
+
typedef typename redux_traits<Func, Evaluator>::PacketType PacketScalar;
|
|
278
|
+
|
|
279
|
+
template <typename XprType>
|
|
280
|
+
static Scalar run(const Evaluator& eval, const Func& func, const XprType& xpr) {
|
|
281
|
+
const Index size = xpr.size();
|
|
282
|
+
|
|
283
|
+
constexpr Index packetSize = redux_traits<Func, Evaluator>::PacketSize;
|
|
284
|
+
constexpr int packetAlignment = unpacket_traits<PacketScalar>::alignment;
|
|
285
|
+
constexpr int alignment0 =
|
|
286
|
+
(bool(Evaluator::Flags & DirectAccessBit) && bool(packet_traits<Scalar>::AlignedOnScalar))
|
|
287
|
+
? int(packetAlignment)
|
|
288
|
+
: int(Unaligned);
|
|
289
|
+
constexpr int alignment = plain_enum_max(alignment0, Evaluator::Alignment);
|
|
290
|
+
const Index alignedStart = internal::first_default_aligned(xpr);
|
|
291
|
+
const Index alignedSize2 = ((size - alignedStart) / (2 * packetSize)) * (2 * packetSize);
|
|
292
|
+
const Index alignedSize = ((size - alignedStart) / (packetSize)) * (packetSize);
|
|
228
293
|
const Index alignedEnd2 = alignedStart + alignedSize2;
|
|
229
|
-
const Index alignedEnd
|
|
294
|
+
const Index alignedEnd = alignedStart + alignedSize;
|
|
230
295
|
Scalar res;
|
|
231
|
-
if(alignedSize)
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
if(alignedSize>packetSize) // we have at least two packets to partly unroll the loop
|
|
296
|
+
if (alignedSize) {
|
|
297
|
+
PacketScalar packet_res0 = eval.template packet<alignment, PacketScalar>(alignedStart);
|
|
298
|
+
if (alignedSize > packetSize) // we have at least two packets to partly unroll the loop
|
|
235
299
|
{
|
|
236
|
-
PacketScalar packet_res1 =
|
|
237
|
-
for(Index index = alignedStart + 2*packetSize; index < alignedEnd2; index += 2*packetSize)
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
packet_res1 = func.packetOp(packet_res1, mat.template packet<alignment,PacketScalar>(index+packetSize));
|
|
300
|
+
PacketScalar packet_res1 = eval.template packet<alignment, PacketScalar>(alignedStart + packetSize);
|
|
301
|
+
for (Index index = alignedStart + 2 * packetSize; index < alignedEnd2; index += 2 * packetSize) {
|
|
302
|
+
packet_res0 = func.packetOp(packet_res0, eval.template packet<alignment, PacketScalar>(index));
|
|
303
|
+
packet_res1 = func.packetOp(packet_res1, eval.template packet<alignment, PacketScalar>(index + packetSize));
|
|
241
304
|
}
|
|
242
305
|
|
|
243
|
-
packet_res0 = func.packetOp(packet_res0,packet_res1);
|
|
244
|
-
if(alignedEnd>alignedEnd2)
|
|
245
|
-
packet_res0 = func.packetOp(packet_res0,
|
|
306
|
+
packet_res0 = func.packetOp(packet_res0, packet_res1);
|
|
307
|
+
if (alignedEnd > alignedEnd2)
|
|
308
|
+
packet_res0 = func.packetOp(packet_res0, eval.template packet<alignment, PacketScalar>(alignedEnd2));
|
|
246
309
|
}
|
|
247
310
|
res = func.predux(packet_res0);
|
|
248
311
|
|
|
249
|
-
for(Index index = 0; index < alignedStart; ++index)
|
|
250
|
-
res = func(res,mat.coeff(index));
|
|
312
|
+
for (Index index = 0; index < alignedStart; ++index) res = func(res, eval.coeff(index));
|
|
251
313
|
|
|
252
|
-
for(Index index = alignedEnd; index < size; ++index)
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
else // too small to vectorize anything.
|
|
256
|
-
// since this is dynamic-size hence inefficient anyway for such small sizes, don't try to optimize.
|
|
314
|
+
for (Index index = alignedEnd; index < size; ++index) res = func(res, eval.coeff(index));
|
|
315
|
+
} else // too small to vectorize anything.
|
|
316
|
+
// since this is dynamic-size hence inefficient anyway for such small sizes, don't try to optimize.
|
|
257
317
|
{
|
|
258
|
-
res =
|
|
259
|
-
for(Index index = 1; index < size; ++index)
|
|
260
|
-
res = func(res,mat.coeff(index));
|
|
318
|
+
res = eval.coeff(0);
|
|
319
|
+
for (Index index = 1; index < size; ++index) res = func(res, eval.coeff(index));
|
|
261
320
|
}
|
|
262
321
|
|
|
263
322
|
return res;
|
|
@@ -265,241 +324,212 @@ struct redux_impl<Func, Derived, LinearVectorizedTraversal, NoUnrolling>
|
|
|
265
324
|
};
|
|
266
325
|
|
|
267
326
|
// NOTE: for SliceVectorizedTraversal we simply bypass unrolling
|
|
268
|
-
template<typename Func, typename
|
|
269
|
-
struct redux_impl<Func,
|
|
270
|
-
|
|
271
|
-
typedef typename
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
EIGEN_DEVICE_FUNC static Scalar run(const
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
const Index innerSize =
|
|
278
|
-
const Index outerSize =
|
|
279
|
-
|
|
280
|
-
packetSize = redux_traits<Func, Derived>::PacketSize
|
|
281
|
-
};
|
|
282
|
-
const Index packetedInnerSize = ((innerSize)/packetSize)*packetSize;
|
|
327
|
+
template <typename Func, typename Evaluator, int Unrolling>
|
|
328
|
+
struct redux_impl<Func, Evaluator, SliceVectorizedTraversal, Unrolling> {
|
|
329
|
+
typedef typename Evaluator::Scalar Scalar;
|
|
330
|
+
typedef typename redux_traits<Func, Evaluator>::PacketType PacketType;
|
|
331
|
+
|
|
332
|
+
template <typename XprType>
|
|
333
|
+
EIGEN_DEVICE_FUNC static Scalar run(const Evaluator& eval, const Func& func, const XprType& xpr) {
|
|
334
|
+
eigen_assert(xpr.rows() > 0 && xpr.cols() > 0 && "you are using an empty matrix");
|
|
335
|
+
constexpr Index packetSize = redux_traits<Func, Evaluator>::PacketSize;
|
|
336
|
+
const Index innerSize = xpr.innerSize();
|
|
337
|
+
const Index outerSize = xpr.outerSize();
|
|
338
|
+
const Index packetedInnerSize = ((innerSize) / packetSize) * packetSize;
|
|
283
339
|
Scalar res;
|
|
284
|
-
if(packetedInnerSize)
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
packet_res = func.packetOp(packet_res, mat.template packetByOuterInner<Unaligned,PacketType>(j,i));
|
|
340
|
+
if (packetedInnerSize) {
|
|
341
|
+
PacketType packet_res = eval.template packet<Unaligned, PacketType>(0, 0);
|
|
342
|
+
for (Index j = 0; j < outerSize; ++j)
|
|
343
|
+
for (Index i = (j == 0 ? packetSize : 0); i < packetedInnerSize; i += Index(packetSize))
|
|
344
|
+
packet_res = func.packetOp(packet_res, eval.template packetByOuterInner<Unaligned, PacketType>(j, i));
|
|
290
345
|
|
|
291
346
|
res = func.predux(packet_res);
|
|
292
|
-
for(Index j=0; j<outerSize; ++j)
|
|
293
|
-
for(Index i=packetedInnerSize; i<innerSize; ++i)
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
else // too small to vectorize anything.
|
|
297
|
-
// since this is dynamic-size hence inefficient anyway for such small sizes, don't try to optimize.
|
|
347
|
+
for (Index j = 0; j < outerSize; ++j)
|
|
348
|
+
for (Index i = packetedInnerSize; i < innerSize; ++i) res = func(res, eval.coeffByOuterInner(j, i));
|
|
349
|
+
} else // too small to vectorize anything.
|
|
350
|
+
// since this is dynamic-size hence inefficient anyway for such small sizes, don't try to optimize.
|
|
298
351
|
{
|
|
299
|
-
res = redux_impl<Func,
|
|
352
|
+
res = redux_impl<Func, Evaluator, DefaultTraversal, NoUnrolling>::run(eval, func, xpr);
|
|
300
353
|
}
|
|
301
354
|
|
|
302
355
|
return res;
|
|
303
356
|
}
|
|
304
357
|
};
|
|
305
358
|
|
|
306
|
-
template<typename Func, typename
|
|
307
|
-
struct redux_impl<Func,
|
|
308
|
-
|
|
309
|
-
typedef typename Derived::Scalar Scalar;
|
|
359
|
+
template <typename Func, typename Evaluator>
|
|
360
|
+
struct redux_impl<Func, Evaluator, LinearVectorizedTraversal, CompleteUnrolling> {
|
|
361
|
+
typedef typename Evaluator::Scalar Scalar;
|
|
310
362
|
|
|
311
|
-
typedef typename redux_traits<Func,
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const
|
|
318
|
-
|
|
319
|
-
eigen_assert(
|
|
363
|
+
typedef typename redux_traits<Func, Evaluator>::PacketType PacketType;
|
|
364
|
+
static constexpr Index PacketSize = redux_traits<Func, Evaluator>::PacketSize;
|
|
365
|
+
static constexpr Index Size = Evaluator::SizeAtCompileTime;
|
|
366
|
+
static constexpr Index VectorizedSize = (int(Size) / int(PacketSize)) * int(PacketSize);
|
|
367
|
+
|
|
368
|
+
template <typename XprType>
|
|
369
|
+
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE Scalar run(const Evaluator& eval, const Func& func, const XprType& xpr) {
|
|
370
|
+
EIGEN_ONLY_USED_FOR_DEBUG(xpr)
|
|
371
|
+
eigen_assert(xpr.rows() > 0 && xpr.cols() > 0 && "you are using an empty matrix");
|
|
320
372
|
if (VectorizedSize > 0) {
|
|
321
|
-
Scalar res = func.predux(
|
|
373
|
+
Scalar res = func.predux(
|
|
374
|
+
redux_vec_linear_unroller<Func, Evaluator, 0, Size / PacketSize>::template run<PacketType>(eval, func));
|
|
322
375
|
if (VectorizedSize != Size)
|
|
323
|
-
res = func(
|
|
376
|
+
res = func(
|
|
377
|
+
res, redux_novec_linear_unroller<Func, Evaluator, VectorizedSize, Size - VectorizedSize>::run(eval, func));
|
|
324
378
|
return res;
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
return redux_novec_unroller<Func, Derived, 0, Size>::run(mat,func);
|
|
379
|
+
} else {
|
|
380
|
+
return redux_novec_linear_unroller<Func, Evaluator, 0, Size>::run(eval, func);
|
|
328
381
|
}
|
|
329
382
|
}
|
|
330
383
|
};
|
|
331
384
|
|
|
332
385
|
// evaluator adaptor
|
|
333
|
-
template<typename
|
|
334
|
-
class redux_evaluator
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
386
|
+
template <typename XprType_>
|
|
387
|
+
class redux_evaluator : public internal::evaluator<XprType_> {
|
|
388
|
+
typedef internal::evaluator<XprType_> Base;
|
|
389
|
+
|
|
390
|
+
public:
|
|
391
|
+
typedef XprType_ XprType;
|
|
392
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE explicit redux_evaluator(const XprType& xpr) : Base(xpr) {}
|
|
393
|
+
|
|
340
394
|
typedef typename XprType::Scalar Scalar;
|
|
341
395
|
typedef typename XprType::CoeffReturnType CoeffReturnType;
|
|
342
396
|
typedef typename XprType::PacketScalar PacketScalar;
|
|
343
|
-
|
|
344
|
-
|
|
397
|
+
|
|
345
398
|
enum {
|
|
346
399
|
MaxRowsAtCompileTime = XprType::MaxRowsAtCompileTime,
|
|
347
400
|
MaxColsAtCompileTime = XprType::MaxColsAtCompileTime,
|
|
348
|
-
// TODO we should not remove DirectAccessBit and rather find an elegant way to query the alignment offset at runtime
|
|
349
|
-
|
|
401
|
+
// TODO we should not remove DirectAccessBit and rather find an elegant way to query the alignment offset at runtime
|
|
402
|
+
// from the evaluator
|
|
403
|
+
Flags = Base::Flags & ~DirectAccessBit,
|
|
350
404
|
IsRowMajor = XprType::IsRowMajor,
|
|
351
405
|
SizeAtCompileTime = XprType::SizeAtCompileTime,
|
|
352
|
-
InnerSizeAtCompileTime = XprType::InnerSizeAtCompileTime
|
|
353
|
-
CoeffReadCost = evaluator<XprType>::CoeffReadCost,
|
|
354
|
-
Alignment = evaluator<XprType>::Alignment
|
|
406
|
+
InnerSizeAtCompileTime = XprType::InnerSizeAtCompileTime
|
|
355
407
|
};
|
|
356
|
-
|
|
357
|
-
EIGEN_DEVICE_FUNC Index
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
EIGEN_DEVICE_FUNC
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
PacketType packet(Index row, Index col) const
|
|
373
|
-
{ return m_evaluator.template packet<LoadMode,PacketType>(row, col); }
|
|
374
|
-
|
|
375
|
-
template<int LoadMode, typename PacketType>
|
|
376
|
-
PacketType packet(Index index) const
|
|
377
|
-
{ return m_evaluator.template packet<LoadMode,PacketType>(index); }
|
|
378
|
-
|
|
379
|
-
EIGEN_DEVICE_FUNC
|
|
380
|
-
CoeffReturnType coeffByOuterInner(Index outer, Index inner) const
|
|
381
|
-
{ return m_evaluator.coeff(IsRowMajor ? outer : inner, IsRowMajor ? inner : outer); }
|
|
382
|
-
|
|
383
|
-
template<int LoadMode, typename PacketType>
|
|
384
|
-
PacketType packetByOuterInner(Index outer, Index inner) const
|
|
385
|
-
{ return m_evaluator.template packet<LoadMode,PacketType>(IsRowMajor ? outer : inner, IsRowMajor ? inner : outer); }
|
|
386
|
-
|
|
387
|
-
const XprType & nestedExpression() const { return m_xpr; }
|
|
388
|
-
|
|
389
|
-
protected:
|
|
390
|
-
internal::evaluator<XprType> m_evaluator;
|
|
391
|
-
const XprType &m_xpr;
|
|
408
|
+
|
|
409
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE CoeffReturnType coeffByOuterInner(Index outer, Index inner) const {
|
|
410
|
+
return Base::coeff(IsRowMajor ? outer : inner, IsRowMajor ? inner : outer);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
template <int LoadMode, typename PacketType>
|
|
414
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketType packetByOuterInner(Index outer, Index inner) const {
|
|
415
|
+
return Base::template packet<LoadMode, PacketType>(IsRowMajor ? outer : inner, IsRowMajor ? inner : outer);
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
template <int LoadMode, typename PacketType>
|
|
419
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE PacketType packetSegmentByOuterInner(Index outer, Index inner, Index begin,
|
|
420
|
+
Index count) const {
|
|
421
|
+
return Base::template packetSegment<LoadMode, PacketType>(IsRowMajor ? outer : inner, IsRowMajor ? inner : outer,
|
|
422
|
+
begin, count);
|
|
423
|
+
}
|
|
392
424
|
};
|
|
393
425
|
|
|
394
|
-
}
|
|
426
|
+
} // end namespace internal
|
|
395
427
|
|
|
396
428
|
/***************************************************************************
|
|
397
|
-
* Part 4 : public API
|
|
398
|
-
***************************************************************************/
|
|
399
|
-
|
|
429
|
+
* Part 4 : public API
|
|
430
|
+
***************************************************************************/
|
|
400
431
|
|
|
401
432
|
/** \returns the result of a full redux operation on the whole matrix or vector using \a func
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
433
|
+
*
|
|
434
|
+
* The template parameter \a BinaryOp is the type of the functor \a func which must be
|
|
435
|
+
* an associative operator. Both current C++98 and C++11 functor styles are handled.
|
|
436
|
+
*
|
|
437
|
+
* \warning the matrix must be not empty, otherwise an assertion is triggered.
|
|
438
|
+
*
|
|
439
|
+
* \sa DenseBase::sum(), DenseBase::minCoeff(), DenseBase::maxCoeff(), MatrixBase::colwise(), MatrixBase::rowwise()
|
|
440
|
+
*/
|
|
441
|
+
template <typename Derived>
|
|
442
|
+
template <typename Func>
|
|
443
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar DenseBase<Derived>::redux(
|
|
444
|
+
const Func& func) const {
|
|
445
|
+
eigen_assert(this->rows() > 0 && this->cols() > 0 && "you are using an empty matrix");
|
|
414
446
|
|
|
415
447
|
typedef typename internal::redux_evaluator<Derived> ThisEvaluator;
|
|
416
448
|
ThisEvaluator thisEval(derived());
|
|
417
|
-
|
|
418
|
-
|
|
449
|
+
|
|
450
|
+
// The initial expression is passed to the reducer as an additional argument instead of
|
|
451
|
+
// passing it as a member of redux_evaluator to help
|
|
452
|
+
return internal::redux_impl<Func, ThisEvaluator>::run(thisEval, func, derived());
|
|
419
453
|
}
|
|
420
454
|
|
|
421
455
|
/** \returns the minimum of all coefficients of \c *this.
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
456
|
+
* In case \c *this contains NaN, NaNPropagation determines the behavior:
|
|
457
|
+
* NaNPropagation == PropagateFast : undefined
|
|
458
|
+
* NaNPropagation == PropagateNaN : result is NaN
|
|
459
|
+
* NaNPropagation == PropagateNumbers : result is minimum of elements that are not NaN
|
|
460
|
+
* \warning the matrix must be not empty, otherwise an assertion is triggered.
|
|
461
|
+
*/
|
|
462
|
+
template <typename Derived>
|
|
463
|
+
template <int NaNPropagation>
|
|
464
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar DenseBase<Derived>::minCoeff() const {
|
|
465
|
+
return derived().redux(Eigen::internal::scalar_min_op<Scalar, Scalar, NaNPropagation>());
|
|
429
466
|
}
|
|
430
467
|
|
|
431
468
|
/** \returns the maximum of all coefficients of \c *this.
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
469
|
+
* In case \c *this contains NaN, NaNPropagation determines the behavior:
|
|
470
|
+
* NaNPropagation == PropagateFast : undefined
|
|
471
|
+
* NaNPropagation == PropagateNaN : result is NaN
|
|
472
|
+
* NaNPropagation == PropagateNumbers : result is maximum of elements that are not NaN
|
|
473
|
+
* \warning the matrix must be not empty, otherwise an assertion is triggered.
|
|
474
|
+
*/
|
|
475
|
+
template <typename Derived>
|
|
476
|
+
template <int NaNPropagation>
|
|
477
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar DenseBase<Derived>::maxCoeff() const {
|
|
478
|
+
return derived().redux(Eigen::internal::scalar_max_op<Scalar, Scalar, NaNPropagation>());
|
|
439
479
|
}
|
|
440
480
|
|
|
441
481
|
/** \returns the sum of all coefficients of \c *this
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
template<typename Derived>
|
|
448
|
-
EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
if(SizeAtCompileTime==0 || (SizeAtCompileTime==Dynamic && size()==0))
|
|
452
|
-
return Scalar(0);
|
|
453
|
-
return derived().redux(Eigen::internal::scalar_sum_op<Scalar,Scalar>());
|
|
482
|
+
*
|
|
483
|
+
* If \c *this is empty, then the value 0 is returned.
|
|
484
|
+
*
|
|
485
|
+
* \sa trace(), prod(), mean()
|
|
486
|
+
*/
|
|
487
|
+
template <typename Derived>
|
|
488
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar DenseBase<Derived>::sum() const {
|
|
489
|
+
if (SizeAtCompileTime == 0 || (SizeAtCompileTime == Dynamic && size() == 0)) return Scalar(0);
|
|
490
|
+
return derived().redux(Eigen::internal::scalar_sum_op<Scalar, Scalar>());
|
|
454
491
|
}
|
|
455
492
|
|
|
456
493
|
/** \returns the mean of all coefficients of *this
|
|
457
|
-
*
|
|
458
|
-
* \sa trace(), prod(), sum()
|
|
459
|
-
*/
|
|
460
|
-
template<typename Derived>
|
|
461
|
-
EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
|
|
462
|
-
DenseBase<Derived>::mean() const
|
|
463
|
-
{
|
|
494
|
+
*
|
|
495
|
+
* \sa trace(), prod(), sum()
|
|
496
|
+
*/
|
|
497
|
+
template <typename Derived>
|
|
498
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar DenseBase<Derived>::mean() const {
|
|
464
499
|
#ifdef __INTEL_COMPILER
|
|
465
|
-
|
|
466
|
-
|
|
500
|
+
#pragma warning push
|
|
501
|
+
#pragma warning(disable : 2259)
|
|
467
502
|
#endif
|
|
468
|
-
return Scalar(derived().redux(Eigen::internal::scalar_sum_op<Scalar,Scalar>())) / Scalar(this->size());
|
|
503
|
+
return Scalar(derived().redux(Eigen::internal::scalar_sum_op<Scalar, Scalar>())) / Scalar(this->size());
|
|
469
504
|
#ifdef __INTEL_COMPILER
|
|
470
|
-
|
|
505
|
+
#pragma warning pop
|
|
471
506
|
#endif
|
|
472
507
|
}
|
|
473
508
|
|
|
474
509
|
/** \returns the product of all coefficients of *this
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
template<typename Derived>
|
|
482
|
-
EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
|
|
483
|
-
|
|
484
|
-
{
|
|
485
|
-
if(SizeAtCompileTime==0 || (SizeAtCompileTime==Dynamic && size()==0))
|
|
486
|
-
return Scalar(1);
|
|
510
|
+
*
|
|
511
|
+
* Example: \include MatrixBase_prod.cpp
|
|
512
|
+
* Output: \verbinclude MatrixBase_prod.out
|
|
513
|
+
*
|
|
514
|
+
* \sa sum(), mean(), trace()
|
|
515
|
+
*/
|
|
516
|
+
template <typename Derived>
|
|
517
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar DenseBase<Derived>::prod() const {
|
|
518
|
+
if (SizeAtCompileTime == 0 || (SizeAtCompileTime == Dynamic && size() == 0)) return Scalar(1);
|
|
487
519
|
return derived().redux(Eigen::internal::scalar_product_op<Scalar>());
|
|
488
520
|
}
|
|
489
521
|
|
|
490
522
|
/** \returns the trace of \c *this, i.e. the sum of the coefficients on the main diagonal.
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
template<typename Derived>
|
|
497
|
-
EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
|
|
498
|
-
MatrixBase<Derived>::trace() const
|
|
499
|
-
{
|
|
523
|
+
*
|
|
524
|
+
* \c *this can be any matrix, not necessarily square.
|
|
525
|
+
*
|
|
526
|
+
* \sa diagonal(), sum()
|
|
527
|
+
*/
|
|
528
|
+
template <typename Derived>
|
|
529
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar MatrixBase<Derived>::trace() const {
|
|
500
530
|
return derived().diagonal().sum();
|
|
501
531
|
}
|
|
502
532
|
|
|
503
|
-
}
|
|
533
|
+
} // end namespace Eigen
|
|
504
534
|
|
|
505
|
-
#endif
|
|
535
|
+
#endif // EIGEN_REDUX_H
|