@smake/eigen 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/eigen/COPYING.APACHE +203 -0
- package/eigen/COPYING.BSD +1 -1
- package/eigen/COPYING.MINPACK +51 -52
- package/eigen/Eigen/Cholesky +0 -1
- package/eigen/Eigen/Core +108 -266
- package/eigen/Eigen/Eigenvalues +0 -1
- package/eigen/Eigen/Geometry +3 -6
- package/eigen/Eigen/Householder +0 -1
- package/eigen/Eigen/Jacobi +0 -1
- package/eigen/Eigen/KLUSupport +41 -0
- package/eigen/Eigen/LU +2 -5
- package/eigen/Eigen/OrderingMethods +0 -3
- package/eigen/Eigen/PaStiXSupport +1 -0
- package/eigen/Eigen/PardisoSupport +0 -0
- package/eigen/Eigen/QR +0 -1
- package/eigen/Eigen/QtAlignedMalloc +0 -1
- package/eigen/Eigen/SVD +0 -1
- package/eigen/Eigen/Sparse +0 -2
- package/eigen/Eigen/SparseCholesky +0 -8
- package/eigen/Eigen/SparseLU +4 -0
- package/eigen/Eigen/src/Cholesky/LDLT.h +42 -27
- package/eigen/Eigen/src/Cholesky/LLT.h +39 -23
- package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +90 -47
- package/eigen/Eigen/src/Core/ArithmeticSequence.h +413 -0
- package/eigen/Eigen/src/Core/Array.h +99 -11
- package/eigen/Eigen/src/Core/ArrayBase.h +1 -1
- package/eigen/Eigen/src/Core/ArrayWrapper.h +21 -21
- package/eigen/Eigen/src/Core/Assign.h +1 -1
- package/eigen/Eigen/src/Core/AssignEvaluator.h +125 -50
- package/eigen/Eigen/src/Core/Assign_MKL.h +10 -10
- package/eigen/Eigen/src/Core/BandMatrix.h +16 -16
- package/eigen/Eigen/src/Core/Block.h +56 -60
- package/eigen/Eigen/src/Core/BooleanRedux.h +29 -31
- package/eigen/Eigen/src/Core/CommaInitializer.h +7 -3
- package/eigen/Eigen/src/Core/CoreEvaluators.h +325 -272
- package/eigen/Eigen/src/Core/CoreIterators.h +5 -0
- package/eigen/Eigen/src/Core/CwiseBinaryOp.h +21 -22
- package/eigen/Eigen/src/Core/CwiseNullaryOp.h +153 -18
- package/eigen/Eigen/src/Core/CwiseUnaryOp.h +6 -6
- package/eigen/Eigen/src/Core/CwiseUnaryView.h +12 -10
- package/eigen/Eigen/src/Core/DenseBase.h +128 -39
- package/eigen/Eigen/src/Core/DenseCoeffsBase.h +25 -21
- package/eigen/Eigen/src/Core/DenseStorage.h +150 -68
- package/eigen/Eigen/src/Core/Diagonal.h +21 -23
- package/eigen/Eigen/src/Core/DiagonalMatrix.h +50 -2
- package/eigen/Eigen/src/Core/DiagonalProduct.h +1 -1
- package/eigen/Eigen/src/Core/Dot.h +10 -10
- package/eigen/Eigen/src/Core/EigenBase.h +10 -9
- package/eigen/Eigen/src/Core/ForceAlignedAccess.h +8 -4
- package/eigen/Eigen/src/Core/Fuzzy.h +3 -3
- package/eigen/Eigen/src/Core/GeneralProduct.h +20 -10
- package/eigen/Eigen/src/Core/GenericPacketMath.h +597 -147
- package/eigen/Eigen/src/Core/GlobalFunctions.h +40 -33
- package/eigen/Eigen/src/Core/IO.h +40 -7
- package/eigen/Eigen/src/Core/IndexedView.h +237 -0
- package/eigen/Eigen/src/Core/Inverse.h +9 -10
- package/eigen/Eigen/src/Core/Map.h +7 -7
- package/eigen/Eigen/src/Core/MapBase.h +5 -3
- package/eigen/Eigen/src/Core/MathFunctions.h +756 -120
- package/eigen/Eigen/src/Core/MathFunctionsImpl.h +118 -19
- package/eigen/Eigen/src/Core/Matrix.h +131 -25
- package/eigen/Eigen/src/Core/MatrixBase.h +19 -2
- package/eigen/Eigen/src/Core/NestByValue.h +25 -50
- package/eigen/Eigen/src/Core/NoAlias.h +4 -3
- package/eigen/Eigen/src/Core/NumTraits.h +107 -20
- package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +232 -0
- package/eigen/Eigen/src/Core/PermutationMatrix.h +3 -3
- package/eigen/Eigen/src/Core/PlainObjectBase.h +145 -54
- package/eigen/Eigen/src/Core/Product.h +30 -25
- package/eigen/Eigen/src/Core/ProductEvaluators.h +183 -142
- package/eigen/Eigen/src/Core/Random.h +37 -1
- package/eigen/Eigen/src/Core/Redux.h +180 -170
- package/eigen/Eigen/src/Core/Ref.h +118 -21
- package/eigen/Eigen/src/Core/Replicate.h +8 -8
- package/eigen/Eigen/src/Core/Reshaped.h +454 -0
- package/eigen/Eigen/src/Core/ReturnByValue.h +7 -5
- package/eigen/Eigen/src/Core/Reverse.h +18 -12
- package/eigen/Eigen/src/Core/Select.h +8 -6
- package/eigen/Eigen/src/Core/SelfAdjointView.h +33 -20
- package/eigen/Eigen/src/Core/Solve.h +14 -14
- package/eigen/Eigen/src/Core/SolveTriangular.h +13 -13
- package/eigen/Eigen/src/Core/SolverBase.h +41 -3
- package/eigen/Eigen/src/Core/StableNorm.h +100 -70
- package/eigen/Eigen/src/Core/StlIterators.h +463 -0
- package/eigen/Eigen/src/Core/Stride.h +9 -4
- package/eigen/Eigen/src/Core/Swap.h +5 -4
- package/eigen/Eigen/src/Core/Transpose.h +86 -27
- package/eigen/Eigen/src/Core/Transpositions.h +26 -8
- package/eigen/Eigen/src/Core/TriangularMatrix.h +88 -72
- package/eigen/Eigen/src/Core/VectorBlock.h +5 -5
- package/eigen/Eigen/src/Core/VectorwiseOp.h +159 -70
- package/eigen/Eigen/src/Core/Visitor.h +137 -29
- package/eigen/Eigen/src/Core/arch/AVX/Complex.h +50 -129
- package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +126 -337
- package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +1092 -155
- package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +65 -1
- package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +422 -0
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +186 -213
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1250 -252
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCasting.h +89 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +152 -165
- package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +19 -251
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2937 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +221 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +629 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/PacketMath.h +2042 -392
- package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +235 -80
- package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +700 -0
- package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +102 -14
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1649 -0
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +110 -0
- package/eigen/Eigen/src/Core/arch/Default/Half.h +942 -0
- package/eigen/Eigen/src/Core/arch/Default/Settings.h +1 -1
- package/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +120 -0
- package/eigen/Eigen/src/Core/arch/{CUDA → GPU}/MathFunctions.h +16 -4
- package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +1685 -0
- package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +80 -0
- package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +23 -0
- package/eigen/Eigen/src/Core/arch/MSA/Complex.h +648 -0
- package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +387 -0
- package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +1233 -0
- package/eigen/Eigen/src/Core/arch/NEON/Complex.h +313 -219
- package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +183 -0
- package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +54 -70
- package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4376 -549
- package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +1419 -0
- package/eigen/Eigen/src/Core/arch/SSE/Complex.h +59 -179
- package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +65 -428
- package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +893 -283
- package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +65 -0
- package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +44 -0
- package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +752 -0
- package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +49 -0
- package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +232 -0
- package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +301 -0
- package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +670 -0
- package/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +694 -0
- package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +85 -0
- package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +212 -183
- package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +101 -5
- package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +510 -395
- package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +11 -2
- package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +112 -46
- package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +31 -30
- package/eigen/Eigen/src/Core/functors/StlFunctors.h +32 -2
- package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +354 -15
- package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1073 -585
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +29 -7
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +4 -4
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +1 -1
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +382 -483
- package/eigen/Eigen/src/Core/products/Parallelizer.h +23 -9
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +23 -6
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +8 -6
- package/eigen/Eigen/src/Core/products/SelfadjointProduct.h +2 -2
- package/eigen/Eigen/src/Core/products/SelfadjointRank2Update.h +5 -4
- package/eigen/Eigen/src/Core/products/TriangularMatrixMatrix.h +3 -3
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix.h +5 -3
- package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +13 -10
- package/eigen/Eigen/src/Core/util/BlasUtil.h +208 -124
- package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +512 -0
- package/eigen/Eigen/src/Core/util/Constants.h +25 -9
- package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +14 -2
- package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +28 -4
- package/eigen/Eigen/src/Core/util/IndexedViewHelper.h +186 -0
- package/eigen/Eigen/src/Core/util/IntegralConstant.h +272 -0
- package/eigen/Eigen/src/Core/util/MKL_support.h +8 -1
- package/eigen/Eigen/src/Core/util/Macros.h +661 -250
- package/eigen/Eigen/src/Core/util/Memory.h +222 -52
- package/eigen/Eigen/src/Core/util/Meta.h +349 -105
- package/eigen/Eigen/src/Core/util/ReshapedHelper.h +51 -0
- package/eigen/Eigen/src/Core/util/StaticAssert.h +8 -5
- package/eigen/Eigen/src/Core/util/SymbolicIndex.h +293 -0
- package/eigen/Eigen/src/Core/util/XprHelper.h +48 -30
- package/eigen/Eigen/src/Eigenvalues/ComplexEigenSolver.h +1 -1
- package/eigen/Eigen/src/Eigenvalues/ComplexSchur.h +1 -1
- package/eigen/Eigen/src/Eigenvalues/EigenSolver.h +2 -2
- package/eigen/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h +1 -1
- package/eigen/Eigen/src/Eigenvalues/HessenbergDecomposition.h +2 -2
- package/eigen/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h +2 -2
- package/eigen/Eigen/src/Eigenvalues/RealQZ.h +9 -6
- package/eigen/Eigen/src/Eigenvalues/RealSchur.h +10 -5
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +75 -42
- package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +20 -15
- package/eigen/Eigen/src/Geometry/AlignedBox.h +99 -5
- package/eigen/Eigen/src/Geometry/AngleAxis.h +4 -4
- package/eigen/Eigen/src/Geometry/EulerAngles.h +3 -3
- package/eigen/Eigen/src/Geometry/Homogeneous.h +15 -11
- package/eigen/Eigen/src/Geometry/Hyperplane.h +1 -1
- package/eigen/Eigen/src/Geometry/OrthoMethods.h +3 -2
- package/eigen/Eigen/src/Geometry/ParametrizedLine.h +39 -2
- package/eigen/Eigen/src/Geometry/Quaternion.h +52 -14
- package/eigen/Eigen/src/Geometry/Rotation2D.h +3 -3
- package/eigen/Eigen/src/Geometry/Scaling.h +22 -4
- package/eigen/Eigen/src/Geometry/Transform.h +86 -65
- package/eigen/Eigen/src/Geometry/Translation.h +6 -6
- package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +168 -0
- package/eigen/Eigen/src/Householder/BlockHouseholder.h +9 -2
- package/eigen/Eigen/src/Householder/Householder.h +8 -4
- package/eigen/Eigen/src/Householder/HouseholderSequence.h +123 -48
- package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +15 -15
- package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +7 -23
- package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +5 -22
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +41 -47
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +51 -60
- package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +70 -20
- package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +2 -20
- package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +11 -9
- package/eigen/Eigen/src/Jacobi/Jacobi.h +31 -10
- package/eigen/Eigen/src/KLUSupport/KLUSupport.h +358 -0
- package/eigen/Eigen/src/LU/Determinant.h +35 -19
- package/eigen/Eigen/src/LU/FullPivLU.h +29 -43
- package/eigen/Eigen/src/LU/InverseImpl.h +25 -8
- package/eigen/Eigen/src/LU/PartialPivLU.h +67 -57
- package/eigen/Eigen/src/LU/arch/InverseSize4.h +351 -0
- package/eigen/Eigen/src/OrderingMethods/Amd.h +7 -17
- package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +297 -277
- package/eigen/Eigen/src/OrderingMethods/Ordering.h +6 -10
- package/eigen/Eigen/src/PaStiXSupport/PaStiXSupport.h +1 -1
- package/eigen/Eigen/src/PardisoSupport/PardisoSupport.h +10 -9
- package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +41 -20
- package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +100 -27
- package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +59 -22
- package/eigen/Eigen/src/QR/HouseholderQR.h +48 -23
- package/eigen/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h +25 -3
- package/eigen/Eigen/src/SVD/BDCSVD.h +137 -48
- package/eigen/Eigen/src/SVD/JacobiSVD.h +22 -14
- package/eigen/Eigen/src/SVD/SVDBase.h +82 -21
- package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +3 -3
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +16 -8
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +11 -36
- package/eigen/Eigen/src/SparseCore/CompressedStorage.h +16 -0
- package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +6 -6
- package/eigen/Eigen/src/SparseCore/SparseAssign.h +81 -27
- package/eigen/Eigen/src/SparseCore/SparseBlock.h +25 -57
- package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +40 -11
- package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +11 -15
- package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +2 -2
- package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +30 -8
- package/eigen/Eigen/src/SparseCore/SparseMatrix.h +124 -10
- package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +5 -12
- package/eigen/Eigen/src/SparseCore/SparseProduct.h +13 -1
- package/eigen/Eigen/src/SparseCore/SparseRef.h +7 -7
- package/eigen/Eigen/src/SparseCore/SparseSelfAdjointView.h +3 -0
- package/eigen/Eigen/src/SparseCore/SparseUtil.h +8 -0
- package/eigen/Eigen/src/SparseCore/SparseVector.h +1 -1
- package/eigen/Eigen/src/SparseLU/SparseLU.h +160 -10
- package/eigen/Eigen/src/SparseLU/SparseLU_Memory.h +1 -1
- package/eigen/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h +76 -2
- package/eigen/Eigen/src/SparseLU/SparseLU_column_dfs.h +2 -2
- package/eigen/Eigen/src/SparseLU/SparseLU_gemm_kernel.h +1 -1
- package/eigen/Eigen/src/SparseLU/SparseLU_panel_bmod.h +1 -1
- package/eigen/Eigen/src/SparseQR/SparseQR.h +19 -6
- package/eigen/Eigen/src/StlSupport/StdDeque.h +2 -14
- package/eigen/Eigen/src/StlSupport/StdList.h +2 -2
- package/eigen/Eigen/src/StlSupport/StdVector.h +2 -2
- package/eigen/Eigen/src/SuperLUSupport/SuperLUSupport.h +6 -8
- package/eigen/Eigen/src/UmfPackSupport/UmfPackSupport.h +175 -39
- package/eigen/Eigen/src/misc/lapacke.h +5 -4
- package/eigen/Eigen/src/plugins/ArrayCwiseBinaryOps.h +27 -1
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +155 -11
- package/eigen/Eigen/src/plugins/BlockMethods.h +626 -242
- package/eigen/Eigen/src/plugins/CommonCwiseUnaryOps.h +14 -0
- package/eigen/Eigen/src/plugins/IndexedViewMethods.h +262 -0
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +4 -4
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +10 -0
- package/eigen/Eigen/src/plugins/ReshapedMethods.h +149 -0
- package/eigen/README.md +2 -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/arch/CUDA/Half.h +0 -675
- 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/Geometry/arch/Geometry_SSE.h +0 -161
- package/eigen/Eigen/src/LU/arch/Inverse_SSE.h +0 -338
- package/lib/eigen.d.ts +0 -2
- package/lib/eigen.js +0 -15
|
@@ -24,7 +24,7 @@ struct gebp_kernel;
|
|
|
24
24
|
template<typename Scalar, typename Index, typename DataMapper, int nr, int StorageOrder, bool Conjugate = false, bool PanelMode=false>
|
|
25
25
|
struct gemm_pack_rhs;
|
|
26
26
|
|
|
27
|
-
template<typename Scalar, typename Index, typename DataMapper, int Pack1, int Pack2, int StorageOrder, bool Conjugate = false, bool PanelMode = false>
|
|
27
|
+
template<typename Scalar, typename Index, typename DataMapper, int Pack1, int Pack2, typename Packet, int StorageOrder, bool Conjugate = false, bool PanelMode = false>
|
|
28
28
|
struct gemm_pack_lhs;
|
|
29
29
|
|
|
30
30
|
template<
|
|
@@ -39,90 +39,6 @@ template<typename Index,
|
|
|
39
39
|
typename RhsScalar, typename RhsMapper, bool ConjugateRhs, int Version=Specialized>
|
|
40
40
|
struct general_matrix_vector_product;
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
template<bool Conjugate> struct conj_if;
|
|
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
42
|
template<typename From,typename To> struct get_factor {
|
|
127
43
|
EIGEN_DEVICE_FUNC static EIGEN_STRONG_INLINE To run(const From& x) { return To(x); }
|
|
128
44
|
};
|
|
@@ -159,11 +75,9 @@ template<typename Scalar, typename Index, int AlignmentType, int Incr=1>
|
|
|
159
75
|
class BlasLinearMapper;
|
|
160
76
|
|
|
161
77
|
template<typename Scalar, typename Index, int AlignmentType>
|
|
162
|
-
class BlasLinearMapper<Scalar,Index,AlignmentType
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
typedef typename packet_traits<Scalar>::half HalfPacket;
|
|
166
|
-
|
|
78
|
+
class BlasLinearMapper<Scalar,Index,AlignmentType>
|
|
79
|
+
{
|
|
80
|
+
public:
|
|
167
81
|
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasLinearMapper(Scalar *data, Index incr=1)
|
|
168
82
|
: m_data(data)
|
|
169
83
|
{
|
|
@@ -179,19 +93,17 @@ class BlasLinearMapper<Scalar,Index,AlignmentType,1> {
|
|
|
179
93
|
return m_data[i];
|
|
180
94
|
}
|
|
181
95
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE HalfPacket loadHalfPacket(Index i) const {
|
|
187
|
-
return ploadt<HalfPacket, AlignmentType>(m_data + i);
|
|
96
|
+
template<typename PacketType>
|
|
97
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i) const {
|
|
98
|
+
return ploadt<PacketType, AlignmentType>(m_data + i);
|
|
188
99
|
}
|
|
189
100
|
|
|
190
|
-
|
|
191
|
-
|
|
101
|
+
template<typename PacketType>
|
|
102
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacket(Index i, const PacketType &p) const {
|
|
103
|
+
pstoret<Scalar, PacketType, AlignmentType>(m_data + i, p);
|
|
192
104
|
}
|
|
193
105
|
|
|
194
|
-
|
|
106
|
+
protected:
|
|
195
107
|
Scalar *m_data;
|
|
196
108
|
};
|
|
197
109
|
|
|
@@ -199,13 +111,59 @@ class BlasLinearMapper<Scalar,Index,AlignmentType,1> {
|
|
|
199
111
|
template<typename Scalar, typename Index, int StorageOrder, int AlignmentType = Unaligned, int Incr = 1>
|
|
200
112
|
class blas_data_mapper;
|
|
201
113
|
|
|
114
|
+
// TMP to help PacketBlock store implementation.
|
|
115
|
+
// There's currently no known use case for PacketBlock load.
|
|
116
|
+
// The default implementation assumes ColMajor order.
|
|
117
|
+
// It always store each packet sequentially one `stride` apart.
|
|
118
|
+
template<typename Index, typename Scalar, typename Packet, int n, int idx, int StorageOrder>
|
|
119
|
+
struct PacketBlockManagement
|
|
120
|
+
{
|
|
121
|
+
PacketBlockManagement<Index, Scalar, Packet, n, idx - 1, StorageOrder> pbm;
|
|
122
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar *to, const Index stride, Index i, Index j, const PacketBlock<Packet, n> &block) const {
|
|
123
|
+
pbm.store(to, stride, i, j, block);
|
|
124
|
+
pstoreu<Scalar>(to + i + (j + idx)*stride, block.packet[idx]);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
// PacketBlockManagement specialization to take care of RowMajor order without ifs.
|
|
129
|
+
template<typename Index, typename Scalar, typename Packet, int n, int idx>
|
|
130
|
+
struct PacketBlockManagement<Index, Scalar, Packet, n, idx, RowMajor>
|
|
131
|
+
{
|
|
132
|
+
PacketBlockManagement<Index, Scalar, Packet, n, idx - 1, RowMajor> pbm;
|
|
133
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar *to, const Index stride, Index i, Index j, const PacketBlock<Packet, n> &block) const {
|
|
134
|
+
pbm.store(to, stride, i, j, block);
|
|
135
|
+
pstoreu<Scalar>(to + j + (i + idx)*stride, block.packet[idx]);
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
template<typename Index, typename Scalar, typename Packet, int n, int StorageOrder>
|
|
140
|
+
struct PacketBlockManagement<Index, Scalar, Packet, n, -1, StorageOrder>
|
|
141
|
+
{
|
|
142
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar *to, const Index stride, Index i, Index j, const PacketBlock<Packet, n> &block) const {
|
|
143
|
+
EIGEN_UNUSED_VARIABLE(to);
|
|
144
|
+
EIGEN_UNUSED_VARIABLE(stride);
|
|
145
|
+
EIGEN_UNUSED_VARIABLE(i);
|
|
146
|
+
EIGEN_UNUSED_VARIABLE(j);
|
|
147
|
+
EIGEN_UNUSED_VARIABLE(block);
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
template<typename Index, typename Scalar, typename Packet, int n>
|
|
152
|
+
struct PacketBlockManagement<Index, Scalar, Packet, n, -1, RowMajor>
|
|
153
|
+
{
|
|
154
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(Scalar *to, const Index stride, Index i, Index j, const PacketBlock<Packet, n> &block) const {
|
|
155
|
+
EIGEN_UNUSED_VARIABLE(to);
|
|
156
|
+
EIGEN_UNUSED_VARIABLE(stride);
|
|
157
|
+
EIGEN_UNUSED_VARIABLE(i);
|
|
158
|
+
EIGEN_UNUSED_VARIABLE(j);
|
|
159
|
+
EIGEN_UNUSED_VARIABLE(block);
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
|
|
202
163
|
template<typename Scalar, typename Index, int StorageOrder, int AlignmentType>
|
|
203
164
|
class blas_data_mapper<Scalar,Index,StorageOrder,AlignmentType,1>
|
|
204
165
|
{
|
|
205
166
|
public:
|
|
206
|
-
typedef typename packet_traits<Scalar>::type Packet;
|
|
207
|
-
typedef typename packet_traits<Scalar>::half HalfPacket;
|
|
208
|
-
|
|
209
167
|
typedef BlasLinearMapper<Scalar, Index, AlignmentType> LinearMapper;
|
|
210
168
|
typedef BlasVectorMapper<Scalar, Index> VectorMapper;
|
|
211
169
|
|
|
@@ -235,12 +193,14 @@ public:
|
|
|
235
193
|
return m_data[StorageOrder==RowMajor ? j + i*m_stride : i + j*m_stride];
|
|
236
194
|
}
|
|
237
195
|
|
|
238
|
-
|
|
239
|
-
|
|
196
|
+
template<typename PacketType>
|
|
197
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i, Index j) const {
|
|
198
|
+
return ploadt<PacketType, AlignmentType>(&operator()(i, j));
|
|
240
199
|
}
|
|
241
200
|
|
|
242
|
-
|
|
243
|
-
|
|
201
|
+
template <typename PacketT, int AlignmentT>
|
|
202
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketT load(Index i, Index j) const {
|
|
203
|
+
return ploadt<PacketT, AlignmentT>(&operator()(i, j));
|
|
244
204
|
}
|
|
245
205
|
|
|
246
206
|
template<typename SubPacket>
|
|
@@ -263,7 +223,12 @@ public:
|
|
|
263
223
|
return internal::first_default_aligned(m_data, size);
|
|
264
224
|
}
|
|
265
225
|
|
|
266
|
-
|
|
226
|
+
template<typename SubPacket, int n>
|
|
227
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketBlock(Index i, Index j, const PacketBlock<SubPacket, n> &block) const {
|
|
228
|
+
PacketBlockManagement<Index, Scalar, SubPacket, n, n-1, StorageOrder> pbm;
|
|
229
|
+
pbm.store(m_data, m_stride, i, j, block);
|
|
230
|
+
}
|
|
231
|
+
protected:
|
|
267
232
|
Scalar* EIGEN_RESTRICT m_data;
|
|
268
233
|
const Index m_stride;
|
|
269
234
|
};
|
|
@@ -275,9 +240,6 @@ template<typename Scalar, typename Index, int AlignmentType, int Incr>
|
|
|
275
240
|
class BlasLinearMapper
|
|
276
241
|
{
|
|
277
242
|
public:
|
|
278
|
-
typedef typename packet_traits<Scalar>::type Packet;
|
|
279
|
-
typedef typename packet_traits<Scalar>::half HalfPacket;
|
|
280
|
-
|
|
281
243
|
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE BlasLinearMapper(Scalar *data,Index incr) : m_data(data), m_incr(incr) {}
|
|
282
244
|
|
|
283
245
|
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void prefetch(int i) const {
|
|
@@ -288,8 +250,9 @@ public:
|
|
|
288
250
|
return m_data[i*m_incr.value()];
|
|
289
251
|
}
|
|
290
252
|
|
|
291
|
-
|
|
292
|
-
|
|
253
|
+
template<typename PacketType>
|
|
254
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i) const {
|
|
255
|
+
return pgather<Scalar,PacketType>(m_data + i*m_incr.value(), m_incr.value());
|
|
293
256
|
}
|
|
294
257
|
|
|
295
258
|
template<typename PacketType>
|
|
@@ -306,9 +269,6 @@ template<typename Scalar, typename Index, int StorageOrder, int AlignmentType,in
|
|
|
306
269
|
class blas_data_mapper
|
|
307
270
|
{
|
|
308
271
|
public:
|
|
309
|
-
typedef typename packet_traits<Scalar>::type Packet;
|
|
310
|
-
typedef typename packet_traits<Scalar>::half HalfPacket;
|
|
311
|
-
|
|
312
272
|
typedef BlasLinearMapper<Scalar, Index, AlignmentType,Incr> LinearMapper;
|
|
313
273
|
|
|
314
274
|
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE blas_data_mapper(Scalar* data, Index stride, Index incr) : m_data(data), m_stride(stride), m_incr(incr) {}
|
|
@@ -327,8 +287,9 @@ public:
|
|
|
327
287
|
return m_data[StorageOrder==RowMajor ? j*m_incr.value() + i*m_stride : i*m_incr.value() + j*m_stride];
|
|
328
288
|
}
|
|
329
289
|
|
|
330
|
-
|
|
331
|
-
|
|
290
|
+
template<typename PacketType>
|
|
291
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE PacketType loadPacket(Index i, Index j) const {
|
|
292
|
+
return pgather<Scalar,PacketType>(&operator()(i, j),m_incr.value());
|
|
332
293
|
}
|
|
333
294
|
|
|
334
295
|
template <typename PacketT, int AlignmentT>
|
|
@@ -346,6 +307,77 @@ public:
|
|
|
346
307
|
return pgather<Scalar, SubPacket>(&operator()(i, j), m_stride);
|
|
347
308
|
}
|
|
348
309
|
|
|
310
|
+
// storePacketBlock_helper defines a way to access values inside the PacketBlock, this is essentially required by the Complex types.
|
|
311
|
+
template<typename SubPacket, typename ScalarT, int n, int idx>
|
|
312
|
+
struct storePacketBlock_helper
|
|
313
|
+
{
|
|
314
|
+
storePacketBlock_helper<SubPacket, ScalarT, n, idx-1> spbh;
|
|
315
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>* sup, Index i, Index j, const PacketBlock<SubPacket, n>& block) const {
|
|
316
|
+
spbh.store(sup, i,j,block);
|
|
317
|
+
for(int l = 0; l < unpacket_traits<SubPacket>::size; l++)
|
|
318
|
+
{
|
|
319
|
+
ScalarT *v = &sup->operator()(i+l, j+idx);
|
|
320
|
+
*v = block.packet[idx][l];
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
template<typename SubPacket, int n, int idx>
|
|
326
|
+
struct storePacketBlock_helper<SubPacket, std::complex<float>, n, idx>
|
|
327
|
+
{
|
|
328
|
+
storePacketBlock_helper<SubPacket, std::complex<float>, n, idx-1> spbh;
|
|
329
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>* sup, Index i, Index j, const PacketBlock<SubPacket, n>& block) const {
|
|
330
|
+
spbh.store(sup,i,j,block);
|
|
331
|
+
for(int l = 0; l < unpacket_traits<SubPacket>::size; l++)
|
|
332
|
+
{
|
|
333
|
+
std::complex<float> *v = &sup->operator()(i+l, j+idx);
|
|
334
|
+
v->real(block.packet[idx].v[2*l+0]);
|
|
335
|
+
v->imag(block.packet[idx].v[2*l+1]);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
template<typename SubPacket, int n, int idx>
|
|
341
|
+
struct storePacketBlock_helper<SubPacket, std::complex<double>, n, idx>
|
|
342
|
+
{
|
|
343
|
+
storePacketBlock_helper<SubPacket, std::complex<double>, n, idx-1> spbh;
|
|
344
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>* sup, Index i, Index j, const PacketBlock<SubPacket, n>& block) const {
|
|
345
|
+
spbh.store(sup,i,j,block);
|
|
346
|
+
for(int l = 0; l < unpacket_traits<SubPacket>::size; l++)
|
|
347
|
+
{
|
|
348
|
+
std::complex<double> *v = &sup->operator()(i+l, j+idx);
|
|
349
|
+
v->real(block.packet[idx].v[2*l+0]);
|
|
350
|
+
v->imag(block.packet[idx].v[2*l+1]);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
|
|
355
|
+
template<typename SubPacket, typename ScalarT, int n>
|
|
356
|
+
struct storePacketBlock_helper<SubPacket, ScalarT, n, -1>
|
|
357
|
+
{
|
|
358
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>*, Index, Index, const PacketBlock<SubPacket, n>& ) const {
|
|
359
|
+
}
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
template<typename SubPacket, int n>
|
|
363
|
+
struct storePacketBlock_helper<SubPacket, std::complex<float>, n, -1>
|
|
364
|
+
{
|
|
365
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>*, Index, Index, const PacketBlock<SubPacket, n>& ) const {
|
|
366
|
+
}
|
|
367
|
+
};
|
|
368
|
+
|
|
369
|
+
template<typename SubPacket, int n>
|
|
370
|
+
struct storePacketBlock_helper<SubPacket, std::complex<double>, n, -1>
|
|
371
|
+
{
|
|
372
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void store(const blas_data_mapper<Scalar, Index, StorageOrder, AlignmentType, Incr>*, Index, Index, const PacketBlock<SubPacket, n>& ) const {
|
|
373
|
+
}
|
|
374
|
+
};
|
|
375
|
+
// This function stores a PacketBlock on m_data, this approach is really quite slow compare to Incr=1 and should be avoided when possible.
|
|
376
|
+
template<typename SubPacket, int n>
|
|
377
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE void storePacketBlock(Index i, Index j, const PacketBlock<SubPacket, n>&block) const {
|
|
378
|
+
storePacketBlock_helper<SubPacket, Scalar, n, n-1> spb;
|
|
379
|
+
spb.store(this, i,j,block);
|
|
380
|
+
}
|
|
349
381
|
protected:
|
|
350
382
|
Scalar* EIGEN_RESTRICT m_data;
|
|
351
383
|
const Index m_stride;
|
|
@@ -379,14 +411,15 @@ template<typename XprType> struct blas_traits
|
|
|
379
411
|
HasUsableDirectAccess = ( (int(XprType::Flags)&DirectAccessBit)
|
|
380
412
|
&& ( bool(XprType::IsVectorAtCompileTime)
|
|
381
413
|
|| int(inner_stride_at_compile_time<XprType>::ret) == 1)
|
|
382
|
-
) ? 1 : 0
|
|
414
|
+
) ? 1 : 0,
|
|
415
|
+
HasScalarFactor = false
|
|
383
416
|
};
|
|
384
417
|
typedef typename conditional<bool(HasUsableDirectAccess),
|
|
385
418
|
ExtractType,
|
|
386
419
|
typename _ExtractType::PlainObject
|
|
387
420
|
>::type DirectLinearAccessType;
|
|
388
|
-
static inline ExtractType extract(const XprType& x) { return x; }
|
|
389
|
-
static inline const Scalar extractScalarFactor(const XprType&) { return Scalar(1); }
|
|
421
|
+
static inline EIGEN_DEVICE_FUNC ExtractType extract(const XprType& x) { return x; }
|
|
422
|
+
static inline EIGEN_DEVICE_FUNC const Scalar extractScalarFactor(const XprType&) { return Scalar(1); }
|
|
390
423
|
};
|
|
391
424
|
|
|
392
425
|
// pop conjugate
|
|
@@ -411,17 +444,23 @@ template<typename Scalar, typename NestedXpr, typename Plain>
|
|
|
411
444
|
struct blas_traits<CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain>, NestedXpr> >
|
|
412
445
|
: blas_traits<NestedXpr>
|
|
413
446
|
{
|
|
447
|
+
enum {
|
|
448
|
+
HasScalarFactor = true
|
|
449
|
+
};
|
|
414
450
|
typedef blas_traits<NestedXpr> Base;
|
|
415
451
|
typedef CwiseBinaryOp<scalar_product_op<Scalar>, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain>, NestedXpr> XprType;
|
|
416
452
|
typedef typename Base::ExtractType ExtractType;
|
|
417
|
-
static inline ExtractType extract(const XprType& x) { return Base::extract(x.rhs()); }
|
|
418
|
-
static inline Scalar extractScalarFactor(const XprType& x)
|
|
453
|
+
static inline EIGEN_DEVICE_FUNC ExtractType extract(const XprType& x) { return Base::extract(x.rhs()); }
|
|
454
|
+
static inline EIGEN_DEVICE_FUNC Scalar extractScalarFactor(const XprType& x)
|
|
419
455
|
{ return x.lhs().functor().m_other * Base::extractScalarFactor(x.rhs()); }
|
|
420
456
|
};
|
|
421
457
|
template<typename Scalar, typename NestedXpr, typename Plain>
|
|
422
458
|
struct blas_traits<CwiseBinaryOp<scalar_product_op<Scalar>, NestedXpr, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain> > >
|
|
423
459
|
: blas_traits<NestedXpr>
|
|
424
460
|
{
|
|
461
|
+
enum {
|
|
462
|
+
HasScalarFactor = true
|
|
463
|
+
};
|
|
425
464
|
typedef blas_traits<NestedXpr> Base;
|
|
426
465
|
typedef CwiseBinaryOp<scalar_product_op<Scalar>, NestedXpr, const CwiseNullaryOp<scalar_constant_op<Scalar>,Plain> > XprType;
|
|
427
466
|
typedef typename Base::ExtractType ExtractType;
|
|
@@ -440,6 +479,9 @@ template<typename Scalar, typename NestedXpr>
|
|
|
440
479
|
struct blas_traits<CwiseUnaryOp<scalar_opposite_op<Scalar>, NestedXpr> >
|
|
441
480
|
: blas_traits<NestedXpr>
|
|
442
481
|
{
|
|
482
|
+
enum {
|
|
483
|
+
HasScalarFactor = true
|
|
484
|
+
};
|
|
443
485
|
typedef blas_traits<NestedXpr> Base;
|
|
444
486
|
typedef CwiseUnaryOp<scalar_opposite_op<Scalar>, NestedXpr> XprType;
|
|
445
487
|
typedef typename Base::ExtractType ExtractType;
|
|
@@ -476,7 +518,7 @@ struct blas_traits<const T>
|
|
|
476
518
|
|
|
477
519
|
template<typename T, bool HasUsableDirectAccess=blas_traits<T>::HasUsableDirectAccess>
|
|
478
520
|
struct extract_data_selector {
|
|
479
|
-
static const typename T::Scalar* run(const T& m)
|
|
521
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static const typename T::Scalar* run(const T& m)
|
|
480
522
|
{
|
|
481
523
|
return blas_traits<T>::extract(m).data();
|
|
482
524
|
}
|
|
@@ -487,11 +529,53 @@ struct extract_data_selector<T,false> {
|
|
|
487
529
|
static typename T::Scalar* run(const T&) { return 0; }
|
|
488
530
|
};
|
|
489
531
|
|
|
490
|
-
template<typename T>
|
|
532
|
+
template<typename T>
|
|
533
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE const typename T::Scalar* extract_data(const T& m)
|
|
491
534
|
{
|
|
492
535
|
return extract_data_selector<T>::run(m);
|
|
493
536
|
}
|
|
494
537
|
|
|
538
|
+
/**
|
|
539
|
+
* \c combine_scalar_factors extracts and multiplies factors from GEMM and GEMV products.
|
|
540
|
+
* There is a specialization for booleans
|
|
541
|
+
*/
|
|
542
|
+
template<typename ResScalar, typename Lhs, typename Rhs>
|
|
543
|
+
struct combine_scalar_factors_impl
|
|
544
|
+
{
|
|
545
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static ResScalar run(const Lhs& lhs, const Rhs& rhs)
|
|
546
|
+
{
|
|
547
|
+
return blas_traits<Lhs>::extractScalarFactor(lhs) * blas_traits<Rhs>::extractScalarFactor(rhs);
|
|
548
|
+
}
|
|
549
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static ResScalar run(const ResScalar& alpha, const Lhs& lhs, const Rhs& rhs)
|
|
550
|
+
{
|
|
551
|
+
return alpha * blas_traits<Lhs>::extractScalarFactor(lhs) * blas_traits<Rhs>::extractScalarFactor(rhs);
|
|
552
|
+
}
|
|
553
|
+
};
|
|
554
|
+
template<typename Lhs, typename Rhs>
|
|
555
|
+
struct combine_scalar_factors_impl<bool, Lhs, Rhs>
|
|
556
|
+
{
|
|
557
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static bool run(const Lhs& lhs, const Rhs& rhs)
|
|
558
|
+
{
|
|
559
|
+
return blas_traits<Lhs>::extractScalarFactor(lhs) && blas_traits<Rhs>::extractScalarFactor(rhs);
|
|
560
|
+
}
|
|
561
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE static bool run(const bool& alpha, const Lhs& lhs, const Rhs& rhs)
|
|
562
|
+
{
|
|
563
|
+
return alpha && blas_traits<Lhs>::extractScalarFactor(lhs) && blas_traits<Rhs>::extractScalarFactor(rhs);
|
|
564
|
+
}
|
|
565
|
+
};
|
|
566
|
+
|
|
567
|
+
template<typename ResScalar, typename Lhs, typename Rhs>
|
|
568
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE ResScalar combine_scalar_factors(const ResScalar& alpha, const Lhs& lhs, const Rhs& rhs)
|
|
569
|
+
{
|
|
570
|
+
return combine_scalar_factors_impl<ResScalar,Lhs,Rhs>::run(alpha, lhs, rhs);
|
|
571
|
+
}
|
|
572
|
+
template<typename ResScalar, typename Lhs, typename Rhs>
|
|
573
|
+
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE ResScalar combine_scalar_factors(const Lhs& lhs, const Rhs& rhs)
|
|
574
|
+
{
|
|
575
|
+
return combine_scalar_factors_impl<ResScalar,Lhs,Rhs>::run(lhs, rhs);
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
|
|
495
579
|
} // end namespace internal
|
|
496
580
|
|
|
497
581
|
} // end namespace Eigen
|