@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
|
@@ -144,7 +144,7 @@ template<typename Scalar> struct swap_assign_op {
|
|
|
144
144
|
EIGEN_EMPTY_STRUCT_CTOR(swap_assign_op)
|
|
145
145
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void assignCoeff(Scalar& a, const Scalar& b) const
|
|
146
146
|
{
|
|
147
|
-
#ifdef
|
|
147
|
+
#ifdef EIGEN_GPUCC
|
|
148
148
|
// FIXME is there some kind of cuda::swap?
|
|
149
149
|
Scalar t=b; const_cast<Scalar&>(b)=a; a=t;
|
|
150
150
|
#else
|
|
@@ -157,7 +157,16 @@ template<typename Scalar>
|
|
|
157
157
|
struct functor_traits<swap_assign_op<Scalar> > {
|
|
158
158
|
enum {
|
|
159
159
|
Cost = 3 * NumTraits<Scalar>::ReadCost,
|
|
160
|
-
PacketAccess =
|
|
160
|
+
PacketAccess =
|
|
161
|
+
#if defined(EIGEN_VECTORIZE_AVX) && EIGEN_COMP_CLANG && (EIGEN_COMP_CLANG<800 || defined(__apple_build_version__))
|
|
162
|
+
// This is a partial workaround for a bug in clang generating bad code
|
|
163
|
+
// when mixing 256/512 bits loads and 128 bits moves.
|
|
164
|
+
// See http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1684
|
|
165
|
+
// https://bugs.llvm.org/show_bug.cgi?id=40815
|
|
166
|
+
0
|
|
167
|
+
#else
|
|
168
|
+
packet_traits<Scalar>::Vectorizable
|
|
169
|
+
#endif
|
|
161
170
|
};
|
|
162
171
|
};
|
|
163
172
|
|
|
@@ -39,32 +39,26 @@ struct scalar_sum_op : binary_op_base<LhsScalar,RhsScalar>
|
|
|
39
39
|
EIGEN_SCALAR_BINARY_OP_PLUGIN
|
|
40
40
|
}
|
|
41
41
|
#endif
|
|
42
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
42
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a + b; }
|
|
43
43
|
template<typename Packet>
|
|
44
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
44
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const
|
|
45
45
|
{ return internal::padd(a,b); }
|
|
46
46
|
template<typename Packet>
|
|
47
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
47
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const
|
|
48
48
|
{ return internal::predux(a); }
|
|
49
49
|
};
|
|
50
50
|
template<typename LhsScalar,typename RhsScalar>
|
|
51
51
|
struct functor_traits<scalar_sum_op<LhsScalar,RhsScalar> > {
|
|
52
52
|
enum {
|
|
53
|
-
Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2, // rough estimate!
|
|
53
|
+
Cost = (int(NumTraits<LhsScalar>::AddCost) + int(NumTraits<RhsScalar>::AddCost)) / 2, // rough estimate!
|
|
54
54
|
PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasAdd && packet_traits<RhsScalar>::HasAdd
|
|
55
55
|
// TODO vectorize mixed sum
|
|
56
56
|
};
|
|
57
57
|
};
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
* \sa DenseBase::count(), DenseBase::any(), ArrayBase::cast(), MatrixBase::cast()
|
|
63
|
-
*/
|
|
64
|
-
template<> struct scalar_sum_op<bool,bool> : scalar_sum_op<int,int> {
|
|
65
|
-
EIGEN_DEPRECATED
|
|
66
|
-
scalar_sum_op() {}
|
|
67
|
-
};
|
|
59
|
+
|
|
60
|
+
template<>
|
|
61
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool scalar_sum_op<bool,bool>::operator() (const bool& a, const bool& b) const { return a || b; }
|
|
68
62
|
|
|
69
63
|
|
|
70
64
|
/** \internal
|
|
@@ -83,23 +77,27 @@ struct scalar_product_op : binary_op_base<LhsScalar,RhsScalar>
|
|
|
83
77
|
EIGEN_SCALAR_BINARY_OP_PLUGIN
|
|
84
78
|
}
|
|
85
79
|
#endif
|
|
86
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
80
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a * b; }
|
|
87
81
|
template<typename Packet>
|
|
88
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
82
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const
|
|
89
83
|
{ return internal::pmul(a,b); }
|
|
90
84
|
template<typename Packet>
|
|
91
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
85
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const
|
|
92
86
|
{ return internal::predux_mul(a); }
|
|
93
87
|
};
|
|
94
88
|
template<typename LhsScalar,typename RhsScalar>
|
|
95
89
|
struct functor_traits<scalar_product_op<LhsScalar,RhsScalar> > {
|
|
96
90
|
enum {
|
|
97
|
-
Cost = (NumTraits<LhsScalar>::MulCost + NumTraits<RhsScalar>::MulCost)/2, // rough estimate!
|
|
91
|
+
Cost = (int(NumTraits<LhsScalar>::MulCost) + int(NumTraits<RhsScalar>::MulCost))/2, // rough estimate!
|
|
98
92
|
PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasMul && packet_traits<RhsScalar>::HasMul
|
|
99
93
|
// TODO vectorize mixed product
|
|
100
94
|
};
|
|
101
95
|
};
|
|
102
96
|
|
|
97
|
+
template<>
|
|
98
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool scalar_product_op<bool,bool>::operator() (const bool& a, const bool& b) const { return a && b; }
|
|
99
|
+
|
|
100
|
+
|
|
103
101
|
/** \internal
|
|
104
102
|
* \brief Template functor to compute the conjugate product of two scalars
|
|
105
103
|
*
|
|
@@ -116,11 +114,11 @@ struct scalar_conj_product_op : binary_op_base<LhsScalar,RhsScalar>
|
|
|
116
114
|
typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_conj_product_op>::ReturnType result_type;
|
|
117
115
|
|
|
118
116
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_conj_product_op)
|
|
119
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
117
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const LhsScalar& a, const RhsScalar& b) const
|
|
120
118
|
{ return conj_helper<LhsScalar,RhsScalar,Conj,false>().pmul(a,b); }
|
|
121
119
|
|
|
122
120
|
template<typename Packet>
|
|
123
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
121
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const
|
|
124
122
|
{ return conj_helper<Packet,Packet,Conj,false>().pmul(a,b); }
|
|
125
123
|
};
|
|
126
124
|
template<typename LhsScalar,typename RhsScalar>
|
|
@@ -136,21 +134,28 @@ struct functor_traits<scalar_conj_product_op<LhsScalar,RhsScalar> > {
|
|
|
136
134
|
*
|
|
137
135
|
* \sa class CwiseBinaryOp, MatrixBase::cwiseMin, class VectorwiseOp, MatrixBase::minCoeff()
|
|
138
136
|
*/
|
|
139
|
-
template<typename LhsScalar,typename RhsScalar>
|
|
137
|
+
template<typename LhsScalar,typename RhsScalar, int NaNPropagation>
|
|
140
138
|
struct scalar_min_op : binary_op_base<LhsScalar,RhsScalar>
|
|
141
139
|
{
|
|
142
140
|
typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_min_op>::ReturnType result_type;
|
|
143
141
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_min_op)
|
|
144
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
142
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const LhsScalar& a, const RhsScalar& b) const {
|
|
143
|
+
return internal::pmin<NaNPropagation>(a, b);
|
|
144
|
+
}
|
|
145
145
|
template<typename Packet>
|
|
146
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
147
|
-
{
|
|
146
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const
|
|
147
|
+
{
|
|
148
|
+
return internal::pmin<NaNPropagation>(a,b);
|
|
149
|
+
}
|
|
148
150
|
template<typename Packet>
|
|
149
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
150
|
-
{
|
|
151
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const
|
|
152
|
+
{
|
|
153
|
+
return internal::predux_min<NaNPropagation>(a);
|
|
154
|
+
}
|
|
151
155
|
};
|
|
152
|
-
|
|
153
|
-
|
|
156
|
+
|
|
157
|
+
template<typename LhsScalar,typename RhsScalar, int NaNPropagation>
|
|
158
|
+
struct functor_traits<scalar_min_op<LhsScalar,RhsScalar, NaNPropagation> > {
|
|
154
159
|
enum {
|
|
155
160
|
Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
|
|
156
161
|
PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMin
|
|
@@ -162,21 +167,28 @@ struct functor_traits<scalar_min_op<LhsScalar,RhsScalar> > {
|
|
|
162
167
|
*
|
|
163
168
|
* \sa class CwiseBinaryOp, MatrixBase::cwiseMax, class VectorwiseOp, MatrixBase::maxCoeff()
|
|
164
169
|
*/
|
|
165
|
-
template<typename LhsScalar,typename RhsScalar>
|
|
166
|
-
struct scalar_max_op
|
|
170
|
+
template<typename LhsScalar,typename RhsScalar, int NaNPropagation>
|
|
171
|
+
struct scalar_max_op : binary_op_base<LhsScalar,RhsScalar>
|
|
167
172
|
{
|
|
168
173
|
typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_max_op>::ReturnType result_type;
|
|
169
174
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_max_op)
|
|
170
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
175
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const LhsScalar& a, const RhsScalar& b) const {
|
|
176
|
+
return internal::pmax<NaNPropagation>(a,b);
|
|
177
|
+
}
|
|
171
178
|
template<typename Packet>
|
|
172
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
173
|
-
{
|
|
179
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const
|
|
180
|
+
{
|
|
181
|
+
return internal::pmax<NaNPropagation>(a,b);
|
|
182
|
+
}
|
|
174
183
|
template<typename Packet>
|
|
175
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
176
|
-
{
|
|
184
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const
|
|
185
|
+
{
|
|
186
|
+
return internal::predux_max<NaNPropagation>(a);
|
|
187
|
+
}
|
|
177
188
|
};
|
|
178
|
-
|
|
179
|
-
|
|
189
|
+
|
|
190
|
+
template<typename LhsScalar,typename RhsScalar, int NaNPropagation>
|
|
191
|
+
struct functor_traits<scalar_max_op<LhsScalar,RhsScalar, NaNPropagation> > {
|
|
180
192
|
enum {
|
|
181
193
|
Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
|
|
182
194
|
PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMax
|
|
@@ -253,7 +265,6 @@ struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_NEQ> : binary_op_base<LhsScalar,Rh
|
|
|
253
265
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator()(const LhsScalar& a, const RhsScalar& b) const {return a!=b;}
|
|
254
266
|
};
|
|
255
267
|
|
|
256
|
-
|
|
257
268
|
/** \internal
|
|
258
269
|
* \brief Template functor to compute the hypot of two \b positive \b and \b real scalars
|
|
259
270
|
*
|
|
@@ -287,6 +298,7 @@ struct functor_traits<scalar_hypot_op<Scalar,Scalar> > {
|
|
|
287
298
|
|
|
288
299
|
/** \internal
|
|
289
300
|
* \brief Template functor to compute the pow of two scalars
|
|
301
|
+
* See the specification of pow in https://en.cppreference.com/w/cpp/numeric/math/pow
|
|
290
302
|
*/
|
|
291
303
|
template<typename Scalar, typename Exponent>
|
|
292
304
|
struct scalar_pow_op : binary_op_base<Scalar,Exponent>
|
|
@@ -301,16 +313,31 @@ struct scalar_pow_op : binary_op_base<Scalar,Exponent>
|
|
|
301
313
|
EIGEN_SCALAR_BINARY_OP_PLUGIN
|
|
302
314
|
}
|
|
303
315
|
#endif
|
|
316
|
+
|
|
304
317
|
EIGEN_DEVICE_FUNC
|
|
305
318
|
inline result_type operator() (const Scalar& a, const Exponent& b) const { return numext::pow(a, b); }
|
|
319
|
+
|
|
320
|
+
template<typename Packet>
|
|
321
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
|
|
322
|
+
{
|
|
323
|
+
return generic_pow(a,b);
|
|
324
|
+
}
|
|
306
325
|
};
|
|
326
|
+
|
|
307
327
|
template<typename Scalar, typename Exponent>
|
|
308
328
|
struct functor_traits<scalar_pow_op<Scalar,Exponent> > {
|
|
309
|
-
enum {
|
|
329
|
+
enum {
|
|
330
|
+
Cost = 5 * NumTraits<Scalar>::MulCost,
|
|
331
|
+
PacketAccess = (!NumTraits<Scalar>::IsComplex && !NumTraits<Scalar>::IsInteger &&
|
|
332
|
+
packet_traits<Scalar>::HasExp && packet_traits<Scalar>::HasLog &&
|
|
333
|
+
packet_traits<Scalar>::HasRound && packet_traits<Scalar>::HasCmp &&
|
|
334
|
+
// Temporarly disable packet access for half/bfloat16 until
|
|
335
|
+
// accuracy is improved.
|
|
336
|
+
!is_same<Scalar, half>::value && !is_same<Scalar, bfloat16>::value
|
|
337
|
+
)
|
|
338
|
+
};
|
|
310
339
|
};
|
|
311
340
|
|
|
312
|
-
|
|
313
|
-
|
|
314
341
|
//---------- non associative binary functors ----------
|
|
315
342
|
|
|
316
343
|
/** \internal
|
|
@@ -337,7 +364,7 @@ struct scalar_difference_op : binary_op_base<LhsScalar,RhsScalar>
|
|
|
337
364
|
template<typename LhsScalar,typename RhsScalar>
|
|
338
365
|
struct functor_traits<scalar_difference_op<LhsScalar,RhsScalar> > {
|
|
339
366
|
enum {
|
|
340
|
-
Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
|
|
367
|
+
Cost = (int(NumTraits<LhsScalar>::AddCost) + int(NumTraits<RhsScalar>::AddCost)) / 2,
|
|
341
368
|
PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasSub && packet_traits<RhsScalar>::HasSub
|
|
342
369
|
};
|
|
343
370
|
};
|
|
@@ -382,11 +409,14 @@ struct functor_traits<scalar_quotient_op<LhsScalar,RhsScalar> > {
|
|
|
382
409
|
struct scalar_boolean_and_op {
|
|
383
410
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_and_op)
|
|
384
411
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a && b; }
|
|
412
|
+
template<typename Packet>
|
|
413
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
|
|
414
|
+
{ return internal::pand(a,b); }
|
|
385
415
|
};
|
|
386
416
|
template<> struct functor_traits<scalar_boolean_and_op> {
|
|
387
417
|
enum {
|
|
388
418
|
Cost = NumTraits<bool>::AddCost,
|
|
389
|
-
PacketAccess =
|
|
419
|
+
PacketAccess = true
|
|
390
420
|
};
|
|
391
421
|
};
|
|
392
422
|
|
|
@@ -398,11 +428,14 @@ template<> struct functor_traits<scalar_boolean_and_op> {
|
|
|
398
428
|
struct scalar_boolean_or_op {
|
|
399
429
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_or_op)
|
|
400
430
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a || b; }
|
|
431
|
+
template<typename Packet>
|
|
432
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
|
|
433
|
+
{ return internal::por(a,b); }
|
|
401
434
|
};
|
|
402
435
|
template<> struct functor_traits<scalar_boolean_or_op> {
|
|
403
436
|
enum {
|
|
404
437
|
Cost = NumTraits<bool>::AddCost,
|
|
405
|
-
PacketAccess =
|
|
438
|
+
PacketAccess = true
|
|
406
439
|
};
|
|
407
440
|
};
|
|
408
441
|
|
|
@@ -414,11 +447,44 @@ template<> struct functor_traits<scalar_boolean_or_op> {
|
|
|
414
447
|
struct scalar_boolean_xor_op {
|
|
415
448
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_xor_op)
|
|
416
449
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a ^ b; }
|
|
450
|
+
template<typename Packet>
|
|
451
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
|
|
452
|
+
{ return internal::pxor(a,b); }
|
|
417
453
|
};
|
|
418
454
|
template<> struct functor_traits<scalar_boolean_xor_op> {
|
|
419
455
|
enum {
|
|
420
456
|
Cost = NumTraits<bool>::AddCost,
|
|
421
|
-
PacketAccess =
|
|
457
|
+
PacketAccess = true
|
|
458
|
+
};
|
|
459
|
+
};
|
|
460
|
+
|
|
461
|
+
/** \internal
|
|
462
|
+
* \brief Template functor to compute the absolute difference of two scalars
|
|
463
|
+
*
|
|
464
|
+
* \sa class CwiseBinaryOp, MatrixBase::absolute_difference
|
|
465
|
+
*/
|
|
466
|
+
template<typename LhsScalar,typename RhsScalar>
|
|
467
|
+
struct scalar_absolute_difference_op : binary_op_base<LhsScalar,RhsScalar>
|
|
468
|
+
{
|
|
469
|
+
typedef typename ScalarBinaryOpTraits<LhsScalar,RhsScalar,scalar_absolute_difference_op>::ReturnType result_type;
|
|
470
|
+
#ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN
|
|
471
|
+
EIGEN_EMPTY_STRUCT_CTOR(scalar_absolute_difference_op)
|
|
472
|
+
#else
|
|
473
|
+
scalar_absolute_difference_op() {
|
|
474
|
+
EIGEN_SCALAR_BINARY_OP_PLUGIN
|
|
475
|
+
}
|
|
476
|
+
#endif
|
|
477
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const
|
|
478
|
+
{ return numext::absdiff(a,b); }
|
|
479
|
+
template<typename Packet>
|
|
480
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
|
|
481
|
+
{ return internal::pabsdiff(a,b); }
|
|
482
|
+
};
|
|
483
|
+
template<typename LhsScalar,typename RhsScalar>
|
|
484
|
+
struct functor_traits<scalar_absolute_difference_op<LhsScalar,RhsScalar> > {
|
|
485
|
+
enum {
|
|
486
|
+
Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
|
|
487
|
+
PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasAbsDiff
|
|
422
488
|
};
|
|
423
489
|
};
|
|
424
490
|
|
|
@@ -436,7 +502,7 @@ template<typename BinaryOp> struct bind1st_op : BinaryOp {
|
|
|
436
502
|
typedef typename BinaryOp::second_argument_type second_argument_type;
|
|
437
503
|
typedef typename BinaryOp::result_type result_type;
|
|
438
504
|
|
|
439
|
-
bind1st_op(const first_argument_type &val) : m_value(val) {}
|
|
505
|
+
EIGEN_DEVICE_FUNC explicit bind1st_op(const first_argument_type &val) : m_value(val) {}
|
|
440
506
|
|
|
441
507
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const second_argument_type& b) const { return BinaryOp::operator()(m_value,b); }
|
|
442
508
|
|
|
@@ -455,7 +521,7 @@ template<typename BinaryOp> struct bind2nd_op : BinaryOp {
|
|
|
455
521
|
typedef typename BinaryOp::second_argument_type second_argument_type;
|
|
456
522
|
typedef typename BinaryOp::result_type result_type;
|
|
457
523
|
|
|
458
|
-
bind2nd_op(const second_argument_type &val) : m_value(val) {}
|
|
524
|
+
EIGEN_DEVICE_FUNC explicit bind2nd_op(const second_argument_type &val) : m_value(val) {}
|
|
459
525
|
|
|
460
526
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator() (const first_argument_type& a) const { return BinaryOp::operator()(a,m_value); }
|
|
461
527
|
|
|
@@ -37,26 +37,27 @@ template<typename Scalar>
|
|
|
37
37
|
struct functor_traits<scalar_identity_op<Scalar> >
|
|
38
38
|
{ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = false, IsRepeatable = true }; };
|
|
39
39
|
|
|
40
|
-
template <typename Scalar,
|
|
40
|
+
template <typename Scalar, bool IsInteger> struct linspaced_op_impl;
|
|
41
41
|
|
|
42
|
-
template <typename Scalar
|
|
43
|
-
struct linspaced_op_impl<Scalar
|
|
42
|
+
template <typename Scalar>
|
|
43
|
+
struct linspaced_op_impl<Scalar,/*IsInteger*/false>
|
|
44
44
|
{
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
typedef typename NumTraits<Scalar>::Real RealScalar;
|
|
46
|
+
|
|
47
|
+
EIGEN_DEVICE_FUNC linspaced_op_impl(const Scalar& low, const Scalar& high, Index num_steps) :
|
|
48
|
+
m_low(low), m_high(high), m_size1(num_steps==1 ? 1 : num_steps-1), m_step(num_steps==1 ? Scalar() : Scalar((high-low)/RealScalar(num_steps-1))),
|
|
47
49
|
m_flip(numext::abs(high)<numext::abs(low))
|
|
48
50
|
{}
|
|
49
51
|
|
|
50
52
|
template<typename IndexType>
|
|
51
53
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (IndexType i) const {
|
|
52
|
-
typedef typename NumTraits<Scalar>::Real RealScalar;
|
|
53
54
|
if(m_flip)
|
|
54
|
-
return (i==0)? m_low : (m_high - RealScalar(m_size1-i)*m_step);
|
|
55
|
+
return (i==0)? m_low : Scalar(m_high - RealScalar(m_size1-i)*m_step);
|
|
55
56
|
else
|
|
56
|
-
return (i==m_size1)? m_high : (m_low + RealScalar(i)*m_step);
|
|
57
|
+
return (i==m_size1)? m_high : Scalar(m_low + RealScalar(i)*m_step);
|
|
57
58
|
}
|
|
58
59
|
|
|
59
|
-
template<typename IndexType>
|
|
60
|
+
template<typename Packet, typename IndexType>
|
|
60
61
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(IndexType i) const
|
|
61
62
|
{
|
|
62
63
|
// Principle:
|
|
@@ -65,17 +66,17 @@ struct linspaced_op_impl<Scalar,Packet,/*IsInteger*/false>
|
|
|
65
66
|
{
|
|
66
67
|
Packet pi = plset<Packet>(Scalar(i-m_size1));
|
|
67
68
|
Packet res = padd(pset1<Packet>(m_high), pmul(pset1<Packet>(m_step), pi));
|
|
68
|
-
if(i
|
|
69
|
-
|
|
70
|
-
return res;
|
|
69
|
+
if (EIGEN_PREDICT_TRUE(i != 0)) return res;
|
|
70
|
+
Packet mask = pcmp_lt(pset1<Packet>(0), plset<Packet>(0));
|
|
71
|
+
return pselect<Packet>(mask, res, pset1<Packet>(m_low));
|
|
71
72
|
}
|
|
72
73
|
else
|
|
73
74
|
{
|
|
74
75
|
Packet pi = plset<Packet>(Scalar(i));
|
|
75
76
|
Packet res = padd(pset1<Packet>(m_low), pmul(pset1<Packet>(m_step), pi));
|
|
76
|
-
if(i
|
|
77
|
-
|
|
78
|
-
return res;
|
|
77
|
+
if(EIGEN_PREDICT_TRUE(i != m_size1-unpacket_traits<Packet>::size+1)) return res;
|
|
78
|
+
Packet mask = pcmp_lt(plset<Packet>(0), pset1<Packet>(unpacket_traits<Packet>::size-1));
|
|
79
|
+
return pselect<Packet>(mask, res, pset1<Packet>(m_high));
|
|
79
80
|
}
|
|
80
81
|
}
|
|
81
82
|
|
|
@@ -86,10 +87,10 @@ struct linspaced_op_impl<Scalar,Packet,/*IsInteger*/false>
|
|
|
86
87
|
const bool m_flip;
|
|
87
88
|
};
|
|
88
89
|
|
|
89
|
-
template <typename Scalar
|
|
90
|
-
struct linspaced_op_impl<Scalar
|
|
90
|
+
template <typename Scalar>
|
|
91
|
+
struct linspaced_op_impl<Scalar,/*IsInteger*/true>
|
|
91
92
|
{
|
|
92
|
-
linspaced_op_impl(const Scalar& low, const Scalar& high, Index num_steps) :
|
|
93
|
+
EIGEN_DEVICE_FUNC linspaced_op_impl(const Scalar& low, const Scalar& high, Index num_steps) :
|
|
93
94
|
m_low(low),
|
|
94
95
|
m_multiplier((high-low)/convert_index<Scalar>(num_steps<=1 ? 1 : num_steps-1)),
|
|
95
96
|
m_divisor(convert_index<Scalar>((high>=low?num_steps:-num_steps)+(high-low))/((numext::abs(high-low)+1)==0?1:(numext::abs(high-low)+1))),
|
|
@@ -115,8 +116,8 @@ struct linspaced_op_impl<Scalar,Packet,/*IsInteger*/true>
|
|
|
115
116
|
// Forward declaration (we default to random access which does not really give
|
|
116
117
|
// us a speed gain when using packet access but it allows to use the functor in
|
|
117
118
|
// nested expressions).
|
|
118
|
-
template <typename Scalar
|
|
119
|
-
template <typename Scalar
|
|
119
|
+
template <typename Scalar> struct linspaced_op;
|
|
120
|
+
template <typename Scalar> struct functor_traits< linspaced_op<Scalar> >
|
|
120
121
|
{
|
|
121
122
|
enum
|
|
122
123
|
{
|
|
@@ -126,9 +127,9 @@ template <typename Scalar, typename PacketType> struct functor_traits< linspaced
|
|
|
126
127
|
IsRepeatable = true
|
|
127
128
|
};
|
|
128
129
|
};
|
|
129
|
-
template <typename Scalar
|
|
130
|
+
template <typename Scalar> struct linspaced_op
|
|
130
131
|
{
|
|
131
|
-
linspaced_op(const Scalar& low, const Scalar& high, Index num_steps)
|
|
132
|
+
EIGEN_DEVICE_FUNC linspaced_op(const Scalar& low, const Scalar& high, Index num_steps)
|
|
132
133
|
: impl((num_steps==1 ? high : low),high,num_steps)
|
|
133
134
|
{}
|
|
134
135
|
|
|
@@ -136,11 +137,11 @@ template <typename Scalar, typename PacketType> struct linspaced_op
|
|
|
136
137
|
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (IndexType i) const { return impl(i); }
|
|
137
138
|
|
|
138
139
|
template<typename Packet,typename IndexType>
|
|
139
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(IndexType i) const { return impl.packetOp(i); }
|
|
140
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(IndexType i) const { return impl.template packetOp<Packet>(i); }
|
|
140
141
|
|
|
141
142
|
// This proxy object handles the actual required temporaries and the different
|
|
142
143
|
// implementations (integer vs. floating point).
|
|
143
|
-
const linspaced_op_impl<Scalar,
|
|
144
|
+
const linspaced_op_impl<Scalar,NumTraits<Scalar>::IsInteger> impl;
|
|
144
145
|
};
|
|
145
146
|
|
|
146
147
|
// Linear access is automatically determined from the operator() prototypes available for the given functor.
|
|
@@ -166,12 +167,12 @@ struct has_unary_operator<scalar_identity_op<Scalar>,IndexType> { enum { value =
|
|
|
166
167
|
template<typename Scalar,typename IndexType>
|
|
167
168
|
struct has_binary_operator<scalar_identity_op<Scalar>,IndexType> { enum { value = 1}; };
|
|
168
169
|
|
|
169
|
-
template<typename Scalar,
|
|
170
|
-
struct has_nullary_operator<linspaced_op<Scalar
|
|
171
|
-
template<typename Scalar,
|
|
172
|
-
struct has_unary_operator<linspaced_op<Scalar
|
|
173
|
-
template<typename Scalar,
|
|
174
|
-
struct has_binary_operator<linspaced_op<Scalar
|
|
170
|
+
template<typename Scalar,typename IndexType>
|
|
171
|
+
struct has_nullary_operator<linspaced_op<Scalar>,IndexType> { enum { value = 0}; };
|
|
172
|
+
template<typename Scalar,typename IndexType>
|
|
173
|
+
struct has_unary_operator<linspaced_op<Scalar>,IndexType> { enum { value = 1}; };
|
|
174
|
+
template<typename Scalar,typename IndexType>
|
|
175
|
+
struct has_binary_operator<linspaced_op<Scalar>,IndexType> { enum { value = 0}; };
|
|
175
176
|
|
|
176
177
|
template<typename Scalar,typename IndexType>
|
|
177
178
|
struct has_nullary_operator<scalar_random_op<Scalar>,IndexType> { enum { value = 1}; };
|
|
@@ -12,6 +12,28 @@
|
|
|
12
12
|
|
|
13
13
|
namespace Eigen {
|
|
14
14
|
|
|
15
|
+
// Portable replacements for certain functors.
|
|
16
|
+
namespace numext {
|
|
17
|
+
|
|
18
|
+
template<typename T = void>
|
|
19
|
+
struct equal_to {
|
|
20
|
+
typedef bool result_type;
|
|
21
|
+
EIGEN_DEVICE_FUNC bool operator()(const T& lhs, const T& rhs) const {
|
|
22
|
+
return lhs == rhs;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
template<typename T = void>
|
|
27
|
+
struct not_equal_to {
|
|
28
|
+
typedef bool result_type;
|
|
29
|
+
EIGEN_DEVICE_FUNC bool operator()(const T& lhs, const T& rhs) const {
|
|
30
|
+
return lhs != rhs;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
|
|
15
37
|
namespace internal {
|
|
16
38
|
|
|
17
39
|
// default functor traits for STL functors:
|
|
@@ -68,11 +90,19 @@ template<typename T>
|
|
|
68
90
|
struct functor_traits<std::equal_to<T> >
|
|
69
91
|
{ enum { Cost = 1, PacketAccess = false }; };
|
|
70
92
|
|
|
93
|
+
template<typename T>
|
|
94
|
+
struct functor_traits<numext::equal_to<T> >
|
|
95
|
+
: functor_traits<std::equal_to<T> > {};
|
|
96
|
+
|
|
71
97
|
template<typename T>
|
|
72
98
|
struct functor_traits<std::not_equal_to<T> >
|
|
73
99
|
{ enum { Cost = 1, PacketAccess = false }; };
|
|
74
100
|
|
|
75
|
-
|
|
101
|
+
template<typename T>
|
|
102
|
+
struct functor_traits<numext::not_equal_to<T> >
|
|
103
|
+
: functor_traits<std::not_equal_to<T> > {};
|
|
104
|
+
|
|
105
|
+
#if (EIGEN_COMP_CXXVER < 11)
|
|
76
106
|
// std::binder* are deprecated since c++11 and will be removed in c++17
|
|
77
107
|
template<typename T>
|
|
78
108
|
struct functor_traits<std::binder2nd<T> >
|
|
@@ -83,7 +113,7 @@ struct functor_traits<std::binder1st<T> >
|
|
|
83
113
|
{ enum { Cost = functor_traits<T>::Cost, PacketAccess = false }; };
|
|
84
114
|
#endif
|
|
85
115
|
|
|
86
|
-
#if (
|
|
116
|
+
#if (EIGEN_COMP_CXXVER < 17)
|
|
87
117
|
// std::unary_negate is deprecated since c++17 and will be removed in c++20
|
|
88
118
|
template<typename T>
|
|
89
119
|
struct functor_traits<std::unary_negate<T> >
|