@smake/eigen 1.1.0 → 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 -20
- package/eigen/Eigen/CholmodSupport +28 -28
- package/eigen/Eigen/Core +187 -120
- package/eigen/Eigen/Eigenvalues +16 -13
- package/eigen/Eigen/Geometry +18 -18
- package/eigen/Eigen/Householder +9 -7
- package/eigen/Eigen/IterativeLinearSolvers +8 -4
- package/eigen/Eigen/Jacobi +14 -13
- package/eigen/Eigen/KLUSupport +23 -21
- package/eigen/Eigen/LU +15 -16
- package/eigen/Eigen/MetisSupport +12 -12
- package/eigen/Eigen/OrderingMethods +54 -51
- package/eigen/Eigen/PaStiXSupport +23 -21
- package/eigen/Eigen/PardisoSupport +17 -14
- package/eigen/Eigen/QR +18 -20
- package/eigen/Eigen/QtAlignedMalloc +5 -12
- package/eigen/Eigen/SPQRSupport +21 -14
- package/eigen/Eigen/SVD +23 -17
- package/eigen/Eigen/Sparse +1 -2
- package/eigen/Eigen/SparseCholesky +18 -15
- package/eigen/Eigen/SparseCore +18 -17
- package/eigen/Eigen/SparseLU +9 -9
- 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 +366 -405
- package/eigen/Eigen/src/Cholesky/LLT.h +323 -367
- package/eigen/Eigen/src/Cholesky/LLT_LAPACKE.h +81 -56
- package/eigen/Eigen/src/CholmodSupport/CholmodSupport.h +585 -529
- package/eigen/Eigen/src/CholmodSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Core/ArithmeticSequence.h +143 -317
- package/eigen/Eigen/src/Core/Array.h +329 -370
- package/eigen/Eigen/src/Core/ArrayBase.h +190 -203
- package/eigen/Eigen/src/Core/ArrayWrapper.h +126 -170
- package/eigen/Eigen/src/Core/Assign.h +30 -40
- package/eigen/Eigen/src/Core/AssignEvaluator.h +651 -604
- package/eigen/Eigen/src/Core/Assign_MKL.h +125 -120
- package/eigen/Eigen/src/Core/BandMatrix.h +267 -282
- package/eigen/Eigen/src/Core/Block.h +371 -390
- package/eigen/Eigen/src/Core/CommaInitializer.h +85 -100
- package/eigen/Eigen/src/Core/ConditionEstimator.h +51 -53
- package/eigen/Eigen/src/Core/CoreEvaluators.h +1214 -937
- package/eigen/Eigen/src/Core/CoreIterators.h +72 -63
- package/eigen/Eigen/src/Core/CwiseBinaryOp.h +112 -129
- package/eigen/Eigen/src/Core/CwiseNullaryOp.h +676 -702
- package/eigen/Eigen/src/Core/CwiseTernaryOp.h +77 -103
- package/eigen/Eigen/src/Core/CwiseUnaryOp.h +55 -67
- package/eigen/Eigen/src/Core/CwiseUnaryView.h +127 -92
- package/eigen/Eigen/src/Core/DenseBase.h +630 -658
- package/eigen/Eigen/src/Core/DenseCoeffsBase.h +511 -628
- package/eigen/Eigen/src/Core/DenseStorage.h +511 -590
- package/eigen/Eigen/src/Core/DeviceWrapper.h +153 -0
- package/eigen/Eigen/src/Core/Diagonal.h +168 -207
- package/eigen/Eigen/src/Core/DiagonalMatrix.h +346 -317
- package/eigen/Eigen/src/Core/DiagonalProduct.h +12 -10
- package/eigen/Eigen/src/Core/Dot.h +167 -217
- package/eigen/Eigen/src/Core/EigenBase.h +74 -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 -113
- package/eigen/Eigen/src/Core/Fuzzy.h +82 -105
- package/eigen/Eigen/src/Core/GeneralProduct.h +315 -261
- package/eigen/Eigen/src/Core/GenericPacketMath.h +1182 -520
- package/eigen/Eigen/src/Core/GlobalFunctions.h +193 -157
- package/eigen/Eigen/src/Core/IO.h +131 -156
- package/eigen/Eigen/src/Core/IndexedView.h +209 -125
- 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 +50 -59
- package/eigen/Eigen/src/Core/Map.h +123 -141
- package/eigen/Eigen/src/Core/MapBase.h +255 -282
- package/eigen/Eigen/src/Core/MathFunctions.h +1247 -1201
- package/eigen/Eigen/src/Core/MathFunctionsImpl.h +162 -99
- package/eigen/Eigen/src/Core/Matrix.h +463 -494
- package/eigen/Eigen/src/Core/MatrixBase.h +468 -470
- package/eigen/Eigen/src/Core/NestByValue.h +58 -52
- package/eigen/Eigen/src/Core/NoAlias.h +79 -86
- package/eigen/Eigen/src/Core/NumTraits.h +206 -206
- package/eigen/Eigen/src/Core/PartialReduxEvaluator.h +163 -142
- package/eigen/Eigen/src/Core/PermutationMatrix.h +461 -511
- package/eigen/Eigen/src/Core/PlainObjectBase.h +858 -972
- package/eigen/Eigen/src/Core/Product.h +246 -130
- package/eigen/Eigen/src/Core/ProductEvaluators.h +779 -671
- package/eigen/Eigen/src/Core/Random.h +153 -164
- 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 +334 -314
- package/eigen/Eigen/src/Core/Ref.h +259 -257
- package/eigen/Eigen/src/Core/Replicate.h +92 -104
- package/eigen/Eigen/src/Core/Reshaped.h +215 -271
- package/eigen/Eigen/src/Core/ReturnByValue.h +47 -55
- package/eigen/Eigen/src/Core/Reverse.h +133 -148
- package/eigen/Eigen/src/Core/Select.h +68 -140
- package/eigen/Eigen/src/Core/SelfAdjointView.h +254 -290
- 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 +88 -102
- package/eigen/Eigen/src/Core/SolveTriangular.h +126 -124
- package/eigen/Eigen/src/Core/SolverBase.h +132 -133
- package/eigen/Eigen/src/Core/StableNorm.h +113 -147
- package/eigen/Eigen/src/Core/StlIterators.h +404 -248
- package/eigen/Eigen/src/Core/Stride.h +90 -92
- package/eigen/Eigen/src/Core/Swap.h +70 -39
- package/eigen/Eigen/src/Core/Transpose.h +258 -295
- package/eigen/Eigen/src/Core/Transpositions.h +270 -333
- package/eigen/Eigen/src/Core/TriangularMatrix.h +642 -743
- package/eigen/Eigen/src/Core/VectorBlock.h +59 -72
- package/eigen/Eigen/src/Core/VectorwiseOp.h +653 -704
- package/eigen/Eigen/src/Core/Visitor.h +464 -308
- package/eigen/Eigen/src/Core/arch/AVX/Complex.h +380 -187
- package/eigen/Eigen/src/Core/arch/AVX/MathFunctions.h +65 -163
- package/eigen/Eigen/src/Core/arch/AVX/PacketMath.h +2145 -638
- package/eigen/Eigen/src/Core/arch/AVX/Reductions.h +353 -0
- package/eigen/Eigen/src/Core/arch/AVX/TypeCasting.h +253 -60
- package/eigen/Eigen/src/Core/arch/AVX512/Complex.h +278 -228
- package/eigen/Eigen/src/Core/arch/AVX512/GemmKernel.h +1245 -0
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctions.h +48 -269
- package/eigen/Eigen/src/Core/arch/AVX512/MathFunctionsFP16.h +75 -0
- package/eigen/Eigen/src/Core/arch/AVX512/PacketMath.h +1597 -754
- 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 +229 -41
- package/eigen/Eigen/src/Core/arch/AVX512/TypeCastingFP16.h +130 -0
- package/eigen/Eigen/src/Core/arch/AltiVec/Complex.h +420 -184
- package/eigen/Eigen/src/Core/arch/AltiVec/MathFunctions.h +40 -49
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProduct.h +2962 -2213
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductCommon.h +196 -212
- package/eigen/Eigen/src/Core/arch/AltiVec/MatrixProductMMA.h +713 -441
- 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 +2380 -1362
- package/eigen/Eigen/src/Core/arch/AltiVec/TypeCasting.h +153 -0
- package/eigen/Eigen/src/Core/arch/Default/BFloat16.h +390 -224
- package/eigen/Eigen/src/Core/arch/Default/ConjHelper.h +78 -67
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +1784 -799
- package/eigen/Eigen/src/Core/arch/Default/GenericPacketMathFunctionsFwd.h +167 -50
- package/eigen/Eigen/src/Core/arch/Default/Half.h +528 -379
- package/eigen/Eigen/src/Core/arch/Default/Settings.h +10 -12
- package/eigen/Eigen/src/Core/arch/GPU/Complex.h +244 -0
- package/eigen/Eigen/src/Core/arch/GPU/MathFunctions.h +41 -40
- package/eigen/Eigen/src/Core/arch/GPU/PacketMath.h +550 -523
- package/eigen/Eigen/src/Core/arch/GPU/Tuple.h +268 -0
- package/eigen/Eigen/src/Core/arch/GPU/TypeCasting.h +27 -30
- package/eigen/Eigen/src/Core/arch/HIP/hcc/math_constants.h +8 -8
- 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 +54 -82
- package/eigen/Eigen/src/Core/arch/MSA/MathFunctions.h +84 -92
- package/eigen/Eigen/src/Core/arch/MSA/PacketMath.h +51 -47
- package/eigen/Eigen/src/Core/arch/NEON/Complex.h +454 -306
- package/eigen/Eigen/src/Core/arch/NEON/GeneralBlockPanelKernel.h +175 -115
- package/eigen/Eigen/src/Core/arch/NEON/MathFunctions.h +23 -30
- package/eigen/Eigen/src/Core/arch/NEON/PacketMath.h +4366 -2857
- package/eigen/Eigen/src/Core/arch/NEON/TypeCasting.h +616 -393
- package/eigen/Eigen/src/Core/arch/NEON/UnaryFunctors.h +57 -0
- package/eigen/Eigen/src/Core/arch/SSE/Complex.h +350 -198
- package/eigen/Eigen/src/Core/arch/SSE/MathFunctions.h +38 -149
- package/eigen/Eigen/src/Core/arch/SSE/PacketMath.h +1791 -912
- package/eigen/Eigen/src/Core/arch/SSE/Reductions.h +324 -0
- package/eigen/Eigen/src/Core/arch/SSE/TypeCasting.h +128 -40
- package/eigen/Eigen/src/Core/arch/SVE/MathFunctions.h +10 -6
- package/eigen/Eigen/src/Core/arch/SVE/PacketMath.h +156 -234
- package/eigen/Eigen/src/Core/arch/SVE/TypeCasting.h +6 -3
- package/eigen/Eigen/src/Core/arch/SYCL/InteropHeaders.h +27 -32
- package/eigen/Eigen/src/Core/arch/SYCL/MathFunctions.h +119 -117
- package/eigen/Eigen/src/Core/arch/SYCL/PacketMath.h +325 -419
- package/eigen/Eigen/src/Core/arch/SYCL/TypeCasting.h +15 -17
- package/eigen/Eigen/src/Core/arch/ZVector/Complex.h +325 -181
- package/eigen/Eigen/src/Core/arch/ZVector/MathFunctions.h +94 -83
- package/eigen/Eigen/src/Core/arch/ZVector/PacketMath.h +811 -458
- package/eigen/Eigen/src/Core/functors/AssignmentFunctors.h +121 -124
- package/eigen/Eigen/src/Core/functors/BinaryFunctors.h +576 -370
- package/eigen/Eigen/src/Core/functors/NullaryFunctors.h +194 -109
- package/eigen/Eigen/src/Core/functors/StlFunctors.h +95 -112
- package/eigen/Eigen/src/Core/functors/TernaryFunctors.h +34 -7
- package/eigen/Eigen/src/Core/functors/UnaryFunctors.h +1038 -749
- package/eigen/Eigen/src/Core/products/GeneralBlockPanelKernel.h +1883 -1375
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix.h +312 -370
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h +189 -176
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h +84 -81
- package/eigen/Eigen/src/Core/products/GeneralMatrixMatrix_BLAS.h +154 -73
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector.h +292 -337
- package/eigen/Eigen/src/Core/products/GeneralMatrixVector_BLAS.h +80 -77
- package/eigen/Eigen/src/Core/products/Parallelizer.h +207 -105
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix.h +327 -388
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixMatrix_BLAS.h +206 -224
- package/eigen/Eigen/src/Core/products/SelfadjointMatrixVector.h +138 -147
- 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 -47
- 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 -277
- package/eigen/Eigen/src/Core/products/TriangularSolverMatrix_BLAS.h +108 -109
- package/eigen/Eigen/src/Core/products/TriangularSolverVector.h +68 -94
- package/eigen/Eigen/src/Core/util/Assert.h +158 -0
- package/eigen/Eigen/src/Core/util/BlasUtil.h +342 -303
- package/eigen/Eigen/src/Core/util/ConfigureVectorization.h +348 -317
- package/eigen/Eigen/src/Core/util/Constants.h +297 -262
- package/eigen/Eigen/src/Core/util/DisableStupidWarnings.h +130 -90
- package/eigen/Eigen/src/Core/util/EmulateArray.h +270 -0
- package/eigen/Eigen/src/Core/util/ForwardDeclarations.h +449 -247
- 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 +417 -116
- package/eigen/Eigen/src/Core/util/IntegralConstant.h +211 -204
- package/eigen/Eigen/src/Core/util/MKL_support.h +39 -37
- package/eigen/Eigen/src/Core/util/Macros.h +655 -773
- package/eigen/Eigen/src/Core/util/MaxSizeVector.h +139 -0
- package/eigen/Eigen/src/Core/util/Memory.h +970 -748
- package/eigen/Eigen/src/Core/util/Meta.h +581 -633
- 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 +17 -17
- package/eigen/Eigen/src/Core/util/Serializer.h +209 -0
- package/eigen/Eigen/src/Core/util/StaticAssert.h +50 -166
- package/eigen/Eigen/src/Core/util/SymbolicIndex.h +377 -225
- package/eigen/Eigen/src/Core/util/XprHelper.h +784 -547
- 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 +89 -105
- package/eigen/Eigen/src/Eigenvalues/RealQZ.h +537 -607
- package/eigen/Eigen/src/Eigenvalues/RealSchur.h +342 -381
- package/eigen/Eigen/src/Eigenvalues/RealSchur_LAPACKE.h +41 -35
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h +541 -595
- package/eigen/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_LAPACKE.h +47 -44
- package/eigen/Eigen/src/Eigenvalues/Tridiagonalization.h +430 -462
- package/eigen/Eigen/src/Geometry/AlignedBox.h +226 -227
- package/eigen/Eigen/src/Geometry/AngleAxis.h +131 -133
- package/eigen/Eigen/src/Geometry/EulerAngles.h +163 -74
- package/eigen/Eigen/src/Geometry/Homogeneous.h +285 -333
- package/eigen/Eigen/src/Geometry/Hyperplane.h +151 -160
- package/eigen/Eigen/src/Geometry/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Geometry/OrthoMethods.h +168 -146
- package/eigen/Eigen/src/Geometry/ParametrizedLine.h +127 -127
- package/eigen/Eigen/src/Geometry/Quaternion.h +566 -506
- package/eigen/Eigen/src/Geometry/Rotation2D.h +107 -105
- package/eigen/Eigen/src/Geometry/RotationBase.h +148 -145
- package/eigen/Eigen/src/Geometry/Scaling.h +113 -106
- package/eigen/Eigen/src/Geometry/Transform.h +858 -936
- package/eigen/Eigen/src/Geometry/Translation.h +94 -92
- package/eigen/Eigen/src/Geometry/Umeyama.h +79 -84
- package/eigen/Eigen/src/Geometry/arch/Geometry_SIMD.h +90 -104
- package/eigen/Eigen/src/Householder/BlockHouseholder.h +51 -46
- package/eigen/Eigen/src/Householder/Householder.h +102 -124
- package/eigen/Eigen/src/Householder/HouseholderSequence.h +412 -453
- package/eigen/Eigen/src/Householder/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h +149 -162
- package/eigen/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h +124 -119
- package/eigen/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h +92 -104
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteCholesky.h +251 -243
- package/eigen/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h +224 -228
- package/eigen/Eigen/src/IterativeLinearSolvers/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h +178 -227
- package/eigen/Eigen/src/IterativeLinearSolvers/LeastSquareConjugateGradient.h +79 -84
- package/eigen/Eigen/src/IterativeLinearSolvers/SolveWithGuess.h +54 -60
- package/eigen/Eigen/src/Jacobi/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/Jacobi/Jacobi.h +252 -308
- package/eigen/Eigen/src/KLUSupport/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/KLUSupport/KLUSupport.h +208 -227
- package/eigen/Eigen/src/LU/Determinant.h +50 -69
- package/eigen/Eigen/src/LU/FullPivLU.h +545 -596
- package/eigen/Eigen/src/LU/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/LU/InverseImpl.h +206 -285
- package/eigen/Eigen/src/LU/PartialPivLU.h +390 -428
- package/eigen/Eigen/src/LU/PartialPivLU_LAPACKE.h +54 -40
- package/eigen/Eigen/src/LU/arch/InverseSize4.h +72 -70
- 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 +243 -265
- package/eigen/Eigen/src/OrderingMethods/Eigen_Colamd.h +831 -1004
- package/eigen/Eigen/src/OrderingMethods/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/OrderingMethods/Ordering.h +112 -119
- 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 -430
- package/eigen/Eigen/src/QR/ColPivHouseholderQR.h +479 -479
- package/eigen/Eigen/src/QR/ColPivHouseholderQR_LAPACKE.h +120 -56
- package/eigen/Eigen/src/QR/CompleteOrthogonalDecomposition.h +166 -153
- package/eigen/Eigen/src/QR/FullPivHouseholderQR.h +495 -475
- package/eigen/Eigen/src/QR/HouseholderQR.h +394 -285
- 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 +244 -264
- package/eigen/Eigen/src/SVD/BDCSVD.h +817 -713
- 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 +577 -543
- package/eigen/Eigen/src/SVD/JacobiSVD_LAPACKE.h +85 -49
- package/eigen/Eigen/src/SVD/SVDBase.h +242 -182
- package/eigen/Eigen/src/SVD/UpperBidiagonalization.h +200 -235
- package/eigen/Eigen/src/SparseCholesky/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky.h +765 -594
- package/eigen/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h +308 -94
- package/eigen/Eigen/src/SparseCore/AmbiVector.h +202 -251
- package/eigen/Eigen/src/SparseCore/CompressedStorage.h +184 -252
- package/eigen/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h +134 -178
- package/eigen/Eigen/src/SparseCore/InternalHeaderCheck.h +3 -0
- package/eigen/Eigen/src/SparseCore/SparseAssign.h +149 -140
- package/eigen/Eigen/src/SparseCore/SparseBlock.h +403 -440
- package/eigen/Eigen/src/SparseCore/SparseColEtree.h +100 -112
- package/eigen/Eigen/src/SparseCore/SparseCompressedBase.h +525 -303
- package/eigen/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +555 -339
- package/eigen/Eigen/src/SparseCore/SparseCwiseUnaryOp.h +100 -108
- package/eigen/Eigen/src/SparseCore/SparseDenseProduct.h +169 -197
- 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 +1603 -1245
- package/eigen/Eigen/src/SparseCore/SparseMatrixBase.h +403 -350
- package/eigen/Eigen/src/SparseCore/SparsePermutation.h +186 -115
- package/eigen/Eigen/src/SparseCore/SparseProduct.h +94 -97
- 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 +370 -416
- 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 +138 -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 +756 -710
- 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 +245 -301
- 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 +89 -100
- 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 +124 -132
- 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 +450 -502
- package/eigen/Eigen/src/StlSupport/StdDeque.h +28 -93
- 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 -730
- 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 +428 -464
- 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 +9972 -16179
- 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.h → BlockMethods.inc} +434 -506
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.inc +116 -0
- package/eigen/Eigen/src/plugins/{CommonCwiseUnaryOps.h → CommonCwiseUnaryOps.inc} +58 -68
- 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/package.json +1 -1
- package/eigen/COPYING.APACHE +0 -203
- package/eigen/COPYING.BSD +0 -26
- package/eigen/COPYING.GPL +0 -674
- package/eigen/COPYING.LGPL +0 -502
- package/eigen/COPYING.MINPACK +0 -51
- package/eigen/COPYING.MPL2 +0 -373
- package/eigen/COPYING.README +0 -18
- package/eigen/Eigen/src/Core/BooleanRedux.h +0 -162
- package/eigen/Eigen/src/Core/arch/CUDA/Complex.h +0 -258
- package/eigen/Eigen/src/Core/arch/Default/TypeCasting.h +0 -120
- package/eigen/Eigen/src/Core/arch/SYCL/SyclMemoryModel.h +0 -694
- package/eigen/Eigen/src/Core/util/NonMPL2.h +0 -3
- 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 -358
- package/eigen/Eigen/src/plugins/ArrayCwiseUnaryOps.h +0 -696
- package/eigen/Eigen/src/plugins/CommonCwiseBinaryOps.h +0 -115
- package/eigen/Eigen/src/plugins/IndexedViewMethods.h +0 -262
- package/eigen/Eigen/src/plugins/MatrixCwiseBinaryOps.h +0 -152
- package/eigen/Eigen/src/plugins/MatrixCwiseUnaryOps.h +0 -95
- package/eigen/Eigen/src/plugins/ReshapedMethods.h +0 -149
- package/eigen/README.md +0 -5
|
@@ -10,119 +10,123 @@
|
|
|
10
10
|
#ifndef EIGEN_BINARY_FUNCTORS_H
|
|
11
11
|
#define EIGEN_BINARY_FUNCTORS_H
|
|
12
12
|
|
|
13
|
+
// IWYU pragma: private
|
|
14
|
+
#include "../InternalHeaderCheck.h"
|
|
15
|
+
|
|
13
16
|
namespace Eigen {
|
|
14
17
|
|
|
15
18
|
namespace internal {
|
|
16
19
|
|
|
17
20
|
//---------- associative binary functors ----------
|
|
18
21
|
|
|
19
|
-
template<typename Arg1, typename Arg2>
|
|
20
|
-
struct binary_op_base
|
|
21
|
-
{
|
|
22
|
+
template <typename Arg1, typename Arg2>
|
|
23
|
+
struct binary_op_base {
|
|
22
24
|
typedef Arg1 first_argument_type;
|
|
23
25
|
typedef Arg2 second_argument_type;
|
|
24
26
|
};
|
|
25
27
|
|
|
26
28
|
/** \internal
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
template<typename LhsScalar,typename RhsScalar>
|
|
32
|
-
struct scalar_sum_op : binary_op_base<LhsScalar,RhsScalar>
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_sum_op)
|
|
37
|
-
#else
|
|
38
|
-
scalar_sum_op() {
|
|
39
|
-
EIGEN_SCALAR_BINARY_OP_PLUGIN
|
|
40
|
-
}
|
|
29
|
+
* \brief Template functor to compute the sum of two scalars
|
|
30
|
+
*
|
|
31
|
+
* \sa class CwiseBinaryOp, MatrixBase::operator+, class VectorwiseOp, DenseBase::sum()
|
|
32
|
+
*/
|
|
33
|
+
template <typename LhsScalar, typename RhsScalar>
|
|
34
|
+
struct scalar_sum_op : binary_op_base<LhsScalar, RhsScalar> {
|
|
35
|
+
typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_sum_op>::ReturnType result_type;
|
|
36
|
+
#ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
|
|
37
|
+
scalar_sum_op(){EIGEN_SCALAR_BINARY_OP_PLUGIN}
|
|
41
38
|
#endif
|
|
42
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
template<typename Packet>
|
|
47
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
template<typename
|
|
51
|
-
|
|
39
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type
|
|
40
|
+
operator()(const LhsScalar& a, const RhsScalar& b) const {
|
|
41
|
+
return a + b;
|
|
42
|
+
}
|
|
43
|
+
template <typename Packet>
|
|
44
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
|
|
45
|
+
return internal::padd(a, b);
|
|
46
|
+
}
|
|
47
|
+
template <typename Packet>
|
|
48
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const {
|
|
49
|
+
return internal::predux(a);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
template <typename LhsScalar, typename RhsScalar>
|
|
53
|
+
struct functor_traits<scalar_sum_op<LhsScalar, RhsScalar>> {
|
|
52
54
|
enum {
|
|
53
|
-
Cost = (int(NumTraits<LhsScalar>::AddCost) + int(NumTraits<RhsScalar>::AddCost)) / 2,
|
|
54
|
-
PacketAccess =
|
|
55
|
+
Cost = (int(NumTraits<LhsScalar>::AddCost) + int(NumTraits<RhsScalar>::AddCost)) / 2, // rough estimate!
|
|
56
|
+
PacketAccess =
|
|
57
|
+
is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasAdd && packet_traits<RhsScalar>::HasAdd
|
|
55
58
|
// TODO vectorize mixed sum
|
|
56
59
|
};
|
|
57
60
|
};
|
|
58
61
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
62
|
+
template <>
|
|
63
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool scalar_sum_op<bool, bool>::operator()(const bool& a, const bool& b) const {
|
|
64
|
+
return a || b;
|
|
65
|
+
}
|
|
63
66
|
|
|
64
67
|
/** \internal
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
template<typename LhsScalar,typename RhsScalar>
|
|
70
|
-
struct scalar_product_op
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_product_op)
|
|
75
|
-
#else
|
|
76
|
-
scalar_product_op() {
|
|
77
|
-
EIGEN_SCALAR_BINARY_OP_PLUGIN
|
|
78
|
-
}
|
|
68
|
+
* \brief Template functor to compute the product of two scalars
|
|
69
|
+
*
|
|
70
|
+
* \sa class CwiseBinaryOp, Cwise::operator*(), class VectorwiseOp, MatrixBase::redux()
|
|
71
|
+
*/
|
|
72
|
+
template <typename LhsScalar, typename RhsScalar>
|
|
73
|
+
struct scalar_product_op : binary_op_base<LhsScalar, RhsScalar> {
|
|
74
|
+
typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_product_op>::ReturnType result_type;
|
|
75
|
+
#ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
|
|
76
|
+
scalar_product_op(){EIGEN_SCALAR_BINARY_OP_PLUGIN}
|
|
79
77
|
#endif
|
|
80
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
template<typename Packet>
|
|
85
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
template<typename
|
|
89
|
-
|
|
78
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type
|
|
79
|
+
operator()(const LhsScalar& a, const RhsScalar& b) const {
|
|
80
|
+
return a * b;
|
|
81
|
+
}
|
|
82
|
+
template <typename Packet>
|
|
83
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
|
|
84
|
+
return internal::pmul(a, b);
|
|
85
|
+
}
|
|
86
|
+
template <typename Packet>
|
|
87
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const {
|
|
88
|
+
return internal::predux_mul(a);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
template <typename LhsScalar, typename RhsScalar>
|
|
92
|
+
struct functor_traits<scalar_product_op<LhsScalar, RhsScalar>> {
|
|
90
93
|
enum {
|
|
91
|
-
Cost = (int(NumTraits<LhsScalar>::MulCost) + int(NumTraits<RhsScalar>::MulCost))/2,
|
|
92
|
-
PacketAccess =
|
|
94
|
+
Cost = (int(NumTraits<LhsScalar>::MulCost) + int(NumTraits<RhsScalar>::MulCost)) / 2, // rough estimate!
|
|
95
|
+
PacketAccess =
|
|
96
|
+
is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMul && packet_traits<RhsScalar>::HasMul
|
|
93
97
|
// TODO vectorize mixed product
|
|
94
98
|
};
|
|
95
99
|
};
|
|
96
100
|
|
|
97
|
-
template<>
|
|
98
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool scalar_product_op<bool,bool>::operator()
|
|
99
|
-
|
|
101
|
+
template <>
|
|
102
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE bool scalar_product_op<bool, bool>::operator()(const bool& a,
|
|
103
|
+
const bool& b) const {
|
|
104
|
+
return a && b;
|
|
105
|
+
}
|
|
100
106
|
|
|
101
107
|
/** \internal
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
{
|
|
108
|
+
* \brief Template functor to compute the conjugate product of two scalars
|
|
109
|
+
*
|
|
110
|
+
* This is a short cut for conj(x) * y which is needed for optimization purpose; in Eigen2 support mode, this becomes x
|
|
111
|
+
* * conj(y)
|
|
112
|
+
*/
|
|
113
|
+
template <typename LhsScalar, typename RhsScalar>
|
|
114
|
+
struct scalar_conj_product_op : binary_op_base<LhsScalar, RhsScalar> {
|
|
115
|
+
enum { Conj = NumTraits<LhsScalar>::IsComplex };
|
|
109
116
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
};
|
|
124
|
-
template<typename LhsScalar,typename RhsScalar>
|
|
125
|
-
struct functor_traits<scalar_conj_product_op<LhsScalar,RhsScalar> > {
|
|
117
|
+
typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_conj_product_op>::ReturnType result_type;
|
|
118
|
+
|
|
119
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
|
|
120
|
+
return conj_helper<LhsScalar, RhsScalar, Conj, false>().pmul(a, b);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
template <typename Packet>
|
|
124
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
|
|
125
|
+
return conj_helper<Packet, Packet, Conj, false>().pmul(a, b);
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
template <typename LhsScalar, typename RhsScalar>
|
|
129
|
+
struct functor_traits<scalar_conj_product_op<LhsScalar, RhsScalar>> {
|
|
126
130
|
enum {
|
|
127
131
|
Cost = NumTraits<LhsScalar>::MulCost,
|
|
128
132
|
PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMul
|
|
@@ -130,183 +134,202 @@ struct functor_traits<scalar_conj_product_op<LhsScalar,RhsScalar> > {
|
|
|
130
134
|
};
|
|
131
135
|
|
|
132
136
|
/** \internal
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
template<typename LhsScalar,typename RhsScalar, int NaNPropagation>
|
|
138
|
-
struct scalar_min_op : binary_op_base<LhsScalar,RhsScalar>
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_min_op)
|
|
142
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const LhsScalar& a, const RhsScalar& b) const {
|
|
137
|
+
* \brief Template functor to compute the min of two scalars
|
|
138
|
+
*
|
|
139
|
+
* \sa class CwiseBinaryOp, MatrixBase::cwiseMin, class VectorwiseOp, MatrixBase::minCoeff()
|
|
140
|
+
*/
|
|
141
|
+
template <typename LhsScalar, typename RhsScalar, int NaNPropagation>
|
|
142
|
+
struct scalar_min_op : binary_op_base<LhsScalar, RhsScalar> {
|
|
143
|
+
typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_min_op>::ReturnType result_type;
|
|
144
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
|
|
143
145
|
return internal::pmin<NaNPropagation>(a, b);
|
|
144
146
|
}
|
|
145
|
-
template<typename Packet>
|
|
146
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const
|
|
147
|
-
|
|
148
|
-
return internal::pmin<NaNPropagation>(a,b);
|
|
147
|
+
template <typename Packet>
|
|
148
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
|
|
149
|
+
return internal::pmin<NaNPropagation>(a, b);
|
|
149
150
|
}
|
|
150
|
-
template<typename Packet>
|
|
151
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const
|
|
152
|
-
{
|
|
151
|
+
template <typename Packet>
|
|
152
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const {
|
|
153
153
|
return internal::predux_min<NaNPropagation>(a);
|
|
154
154
|
}
|
|
155
155
|
};
|
|
156
156
|
|
|
157
|
-
template<typename LhsScalar,typename RhsScalar, int NaNPropagation>
|
|
158
|
-
struct functor_traits<scalar_min_op<LhsScalar,RhsScalar, NaNPropagation
|
|
157
|
+
template <typename LhsScalar, typename RhsScalar, int NaNPropagation>
|
|
158
|
+
struct functor_traits<scalar_min_op<LhsScalar, RhsScalar, NaNPropagation>> {
|
|
159
159
|
enum {
|
|
160
|
-
Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
|
|
160
|
+
Cost = (NumTraits<LhsScalar>::AddCost + NumTraits<RhsScalar>::AddCost) / 2,
|
|
161
161
|
PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMin
|
|
162
162
|
};
|
|
163
163
|
};
|
|
164
164
|
|
|
165
165
|
/** \internal
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
template<typename LhsScalar,typename RhsScalar, int NaNPropagation>
|
|
171
|
-
struct scalar_max_op : binary_op_base<LhsScalar,RhsScalar>
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
}
|
|
183
|
-
template<typename Packet>
|
|
184
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const
|
|
185
|
-
{
|
|
166
|
+
* \brief Template functor to compute the max of two scalars
|
|
167
|
+
*
|
|
168
|
+
* \sa class CwiseBinaryOp, MatrixBase::cwiseMax, class VectorwiseOp, MatrixBase::maxCoeff()
|
|
169
|
+
*/
|
|
170
|
+
template <typename LhsScalar, typename RhsScalar, int NaNPropagation>
|
|
171
|
+
struct scalar_max_op : binary_op_base<LhsScalar, RhsScalar> {
|
|
172
|
+
typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_max_op>::ReturnType result_type;
|
|
173
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
|
|
174
|
+
return internal::pmax<NaNPropagation>(a, b);
|
|
175
|
+
}
|
|
176
|
+
template <typename Packet>
|
|
177
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
|
|
178
|
+
return internal::pmax<NaNPropagation>(a, b);
|
|
179
|
+
}
|
|
180
|
+
template <typename Packet>
|
|
181
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type predux(const Packet& a) const {
|
|
186
182
|
return internal::predux_max<NaNPropagation>(a);
|
|
187
183
|
}
|
|
188
184
|
};
|
|
189
185
|
|
|
190
|
-
template<typename LhsScalar,typename RhsScalar, int NaNPropagation>
|
|
191
|
-
struct functor_traits<scalar_max_op<LhsScalar,RhsScalar, NaNPropagation
|
|
186
|
+
template <typename LhsScalar, typename RhsScalar, int NaNPropagation>
|
|
187
|
+
struct functor_traits<scalar_max_op<LhsScalar, RhsScalar, NaNPropagation>> {
|
|
192
188
|
enum {
|
|
193
|
-
Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
|
|
189
|
+
Cost = (NumTraits<LhsScalar>::AddCost + NumTraits<RhsScalar>::AddCost) / 2,
|
|
194
190
|
PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMax
|
|
195
191
|
};
|
|
196
192
|
};
|
|
197
193
|
|
|
198
194
|
/** \internal
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
template<typename LhsScalar, typename RhsScalar, ComparisonName cmp
|
|
195
|
+
* \brief Template functors for comparison of two scalars
|
|
196
|
+
* \todo Implement packet-comparisons
|
|
197
|
+
*/
|
|
198
|
+
template <typename LhsScalar, typename RhsScalar, ComparisonName cmp, bool UseTypedComparators = false>
|
|
199
|
+
struct scalar_cmp_op;
|
|
203
200
|
|
|
204
|
-
template<typename LhsScalar, typename RhsScalar, ComparisonName cmp>
|
|
205
|
-
struct functor_traits<scalar_cmp_op<LhsScalar,RhsScalar, cmp
|
|
201
|
+
template <typename LhsScalar, typename RhsScalar, ComparisonName cmp, bool UseTypedComparators>
|
|
202
|
+
struct functor_traits<scalar_cmp_op<LhsScalar, RhsScalar, cmp, UseTypedComparators>> {
|
|
206
203
|
enum {
|
|
207
|
-
Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
|
|
208
|
-
PacketAccess =
|
|
204
|
+
Cost = (NumTraits<LhsScalar>::AddCost + NumTraits<RhsScalar>::AddCost) / 2,
|
|
205
|
+
PacketAccess = (UseTypedComparators || is_same<LhsScalar, bool>::value) && is_same<LhsScalar, RhsScalar>::value &&
|
|
206
|
+
packet_traits<LhsScalar>::HasCmp
|
|
209
207
|
};
|
|
210
208
|
};
|
|
211
209
|
|
|
212
|
-
template<
|
|
213
|
-
struct
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
template<typename
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
template<typename LhsScalar, typename RhsScalar>
|
|
226
|
-
struct scalar_cmp_op<LhsScalar,RhsScalar, cmp_LT> : binary_op_base<LhsScalar,RhsScalar>
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
{
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
210
|
+
template <typename LhsScalar, typename RhsScalar, bool UseTypedComparators>
|
|
211
|
+
struct scalar_cmp_op<LhsScalar, RhsScalar, cmp_EQ, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
|
|
212
|
+
using result_type = std::conditional_t<UseTypedComparators, LhsScalar, bool>;
|
|
213
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
|
|
214
|
+
return a == b ? result_type(1) : result_type(0);
|
|
215
|
+
}
|
|
216
|
+
template <typename Packet>
|
|
217
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
|
|
218
|
+
const Packet cst_one = pset1<Packet>(result_type(1));
|
|
219
|
+
return pand(pcmp_eq(a, b), cst_one);
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
template <typename LhsScalar, typename RhsScalar, bool UseTypedComparators>
|
|
224
|
+
struct scalar_cmp_op<LhsScalar, RhsScalar, cmp_LT, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
|
|
225
|
+
using result_type = std::conditional_t<UseTypedComparators, LhsScalar, bool>;
|
|
226
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
|
|
227
|
+
return a < b ? result_type(1) : result_type(0);
|
|
228
|
+
}
|
|
229
|
+
template <typename Packet>
|
|
230
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
|
|
231
|
+
const Packet cst_one = pset1<Packet>(result_type(1));
|
|
232
|
+
return pand(pcmp_lt(a, b), cst_one);
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
template <typename LhsScalar, typename RhsScalar, bool UseTypedComparators>
|
|
237
|
+
struct scalar_cmp_op<LhsScalar, RhsScalar, cmp_LE, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
|
|
238
|
+
using result_type = std::conditional_t<UseTypedComparators, LhsScalar, bool>;
|
|
239
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
|
|
240
|
+
return a <= b ? result_type(1) : result_type(0);
|
|
241
|
+
}
|
|
242
|
+
template <typename Packet>
|
|
243
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
|
|
244
|
+
const Packet cst_one = pset1<Packet>(result_type(1));
|
|
245
|
+
return pand(cst_one, pcmp_le(a, b));
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
template <typename LhsScalar, typename RhsScalar, bool UseTypedComparators>
|
|
250
|
+
struct scalar_cmp_op<LhsScalar, RhsScalar, cmp_GT, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
|
|
251
|
+
using result_type = std::conditional_t<UseTypedComparators, LhsScalar, bool>;
|
|
252
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
|
|
253
|
+
return a > b ? result_type(1) : result_type(0);
|
|
254
|
+
}
|
|
255
|
+
template <typename Packet>
|
|
256
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
|
|
257
|
+
const Packet cst_one = pset1<Packet>(result_type(1));
|
|
258
|
+
return pand(cst_one, pcmp_lt(b, a));
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
template <typename LhsScalar, typename RhsScalar, bool UseTypedComparators>
|
|
263
|
+
struct scalar_cmp_op<LhsScalar, RhsScalar, cmp_GE, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
|
|
264
|
+
using result_type = std::conditional_t<UseTypedComparators, LhsScalar, bool>;
|
|
265
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
|
|
266
|
+
return a >= b ? result_type(1) : result_type(0);
|
|
267
|
+
}
|
|
268
|
+
template <typename Packet>
|
|
269
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
|
|
270
|
+
const Packet cst_one = pset1<Packet>(result_type(1));
|
|
271
|
+
return pand(cst_one, pcmp_le(b, a));
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
template <typename LhsScalar, typename RhsScalar, bool UseTypedComparators>
|
|
276
|
+
struct scalar_cmp_op<LhsScalar, RhsScalar, cmp_UNORD, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
|
|
277
|
+
using result_type = std::conditional_t<UseTypedComparators, LhsScalar, bool>;
|
|
278
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
|
|
279
|
+
return !(a <= b || b <= a) ? result_type(1) : result_type(0);
|
|
280
|
+
}
|
|
281
|
+
template <typename Packet>
|
|
282
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
|
|
283
|
+
const Packet cst_one = pset1<Packet>(result_type(1));
|
|
284
|
+
return pandnot(cst_one, por(pcmp_le(a, b), pcmp_le(b, a)));
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
template <typename LhsScalar, typename RhsScalar, bool UseTypedComparators>
|
|
289
|
+
struct scalar_cmp_op<LhsScalar, RhsScalar, cmp_NEQ, UseTypedComparators> : binary_op_base<LhsScalar, RhsScalar> {
|
|
290
|
+
using result_type = std::conditional_t<UseTypedComparators, LhsScalar, bool>;
|
|
291
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator()(const LhsScalar& a, const RhsScalar& b) const {
|
|
292
|
+
return a != b ? result_type(1) : result_type(0);
|
|
293
|
+
}
|
|
294
|
+
template <typename Packet>
|
|
295
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
|
|
296
|
+
const Packet cst_one = pset1<Packet>(result_type(1));
|
|
297
|
+
return pandnot(cst_one, pcmp_eq(a, b));
|
|
298
|
+
}
|
|
266
299
|
};
|
|
267
300
|
|
|
268
301
|
/** \internal
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
template<typename Scalar>
|
|
274
|
-
struct scalar_hypot_op<Scalar,Scalar> : binary_op_base<Scalar,Scalar>
|
|
275
|
-
{
|
|
276
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_hypot_op)
|
|
277
|
-
|
|
278
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar &x, const Scalar &y) const
|
|
279
|
-
{
|
|
302
|
+
* \brief Template functor to compute the hypot of two \b positive \b and \b real scalars
|
|
303
|
+
*
|
|
304
|
+
* \sa MatrixBase::stableNorm(), class Redux
|
|
305
|
+
*/
|
|
306
|
+
template <typename Scalar>
|
|
307
|
+
struct scalar_hypot_op<Scalar, Scalar> : binary_op_base<Scalar, Scalar> {
|
|
308
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& x, const Scalar& y) const {
|
|
280
309
|
// This functor is used by hypotNorm only for which it is faster to first apply abs
|
|
281
310
|
// on all coefficients prior to reduction through hypot.
|
|
282
311
|
// This way we avoid calling abs on positive and real entries, and this also permits
|
|
283
312
|
// to seamlessly handle complexes. Otherwise we would have to handle both real and complexes
|
|
284
313
|
// through the same functor...
|
|
285
|
-
return internal::positive_real_hypot(x,y);
|
|
314
|
+
return internal::positive_real_hypot(x, y);
|
|
286
315
|
}
|
|
287
316
|
};
|
|
288
|
-
template<typename Scalar>
|
|
289
|
-
struct functor_traits<scalar_hypot_op<Scalar,Scalar
|
|
290
|
-
enum
|
|
291
|
-
|
|
292
|
-
Cost = 3 * NumTraits<Scalar>::AddCost +
|
|
293
|
-
2 * NumTraits<Scalar>::MulCost +
|
|
294
|
-
2 * scalar_div_cost<Scalar,false>::value,
|
|
317
|
+
template <typename Scalar>
|
|
318
|
+
struct functor_traits<scalar_hypot_op<Scalar, Scalar>> {
|
|
319
|
+
enum {
|
|
320
|
+
Cost = 3 * NumTraits<Scalar>::AddCost + 2 * NumTraits<Scalar>::MulCost + 2 * scalar_div_cost<Scalar, false>::value,
|
|
295
321
|
PacketAccess = false
|
|
296
322
|
};
|
|
297
323
|
};
|
|
298
324
|
|
|
299
325
|
/** \internal
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
template<typename Scalar, typename Exponent>
|
|
304
|
-
struct scalar_pow_op
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
#ifndef EIGEN_SCALAR_BINARY_OP_PLUGIN
|
|
308
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_pow_op)
|
|
309
|
-
#else
|
|
326
|
+
* \brief Template functor to compute the pow of two scalars
|
|
327
|
+
* See the specification of pow in https://en.cppreference.com/w/cpp/numeric/math/pow
|
|
328
|
+
*/
|
|
329
|
+
template <typename Scalar, typename Exponent>
|
|
330
|
+
struct scalar_pow_op : binary_op_base<Scalar, Exponent> {
|
|
331
|
+
typedef typename ScalarBinaryOpTraits<Scalar, Exponent, scalar_pow_op>::ReturnType result_type;
|
|
332
|
+
#ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
|
|
310
333
|
scalar_pow_op() {
|
|
311
334
|
typedef Scalar LhsScalar;
|
|
312
335
|
typedef Exponent RhsScalar;
|
|
@@ -314,228 +337,411 @@ struct scalar_pow_op : binary_op_base<Scalar,Exponent>
|
|
|
314
337
|
}
|
|
315
338
|
#endif
|
|
316
339
|
|
|
317
|
-
EIGEN_DEVICE_FUNC
|
|
318
|
-
|
|
340
|
+
EIGEN_DEVICE_FUNC inline result_type operator()(const Scalar& a, const Exponent& b) const {
|
|
341
|
+
return numext::pow(a, b);
|
|
342
|
+
}
|
|
319
343
|
|
|
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);
|
|
344
|
+
template <typename Packet>
|
|
345
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const {
|
|
346
|
+
return generic_pow(a, b);
|
|
324
347
|
}
|
|
325
348
|
};
|
|
326
349
|
|
|
327
|
-
template<typename Scalar, typename Exponent>
|
|
328
|
-
struct functor_traits<scalar_pow_op<Scalar,Exponent
|
|
350
|
+
template <typename Scalar, typename Exponent>
|
|
351
|
+
struct functor_traits<scalar_pow_op<Scalar, Exponent>> {
|
|
329
352
|
enum {
|
|
330
353
|
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
|
-
)
|
|
354
|
+
PacketAccess = (!NumTraits<Scalar>::IsComplex && !NumTraits<Scalar>::IsInteger && packet_traits<Scalar>::HasPow)
|
|
338
355
|
};
|
|
339
356
|
};
|
|
340
357
|
|
|
341
358
|
//---------- non associative binary functors ----------
|
|
342
359
|
|
|
343
360
|
/** \internal
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
template<typename LhsScalar,typename RhsScalar>
|
|
349
|
-
struct scalar_difference_op : binary_op_base<LhsScalar,RhsScalar>
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
EIGEN_EMPTY_STRUCT_CTOR(scalar_difference_op)
|
|
354
|
-
#else
|
|
355
|
-
scalar_difference_op() {
|
|
356
|
-
EIGEN_SCALAR_BINARY_OP_PLUGIN
|
|
357
|
-
}
|
|
361
|
+
* \brief Template functor to compute the difference of two scalars
|
|
362
|
+
*
|
|
363
|
+
* \sa class CwiseBinaryOp, MatrixBase::operator-
|
|
364
|
+
*/
|
|
365
|
+
template <typename LhsScalar, typename RhsScalar>
|
|
366
|
+
struct scalar_difference_op : binary_op_base<LhsScalar, RhsScalar> {
|
|
367
|
+
typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_difference_op>::ReturnType result_type;
|
|
368
|
+
#ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
|
|
369
|
+
scalar_difference_op(){EIGEN_SCALAR_BINARY_OP_PLUGIN}
|
|
358
370
|
#endif
|
|
359
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
371
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type
|
|
372
|
+
operator()(const LhsScalar& a, const RhsScalar& b) const {
|
|
373
|
+
return a - b;
|
|
374
|
+
}
|
|
375
|
+
template <typename Packet>
|
|
376
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const {
|
|
377
|
+
return internal::psub(a, b);
|
|
378
|
+
}
|
|
363
379
|
};
|
|
364
|
-
template<typename LhsScalar,typename RhsScalar>
|
|
365
|
-
struct functor_traits<scalar_difference_op<LhsScalar,RhsScalar
|
|
380
|
+
template <typename LhsScalar, typename RhsScalar>
|
|
381
|
+
struct functor_traits<scalar_difference_op<LhsScalar, RhsScalar>> {
|
|
366
382
|
enum {
|
|
367
383
|
Cost = (int(NumTraits<LhsScalar>::AddCost) + int(NumTraits<RhsScalar>::AddCost)) / 2,
|
|
368
|
-
PacketAccess =
|
|
384
|
+
PacketAccess =
|
|
385
|
+
is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasSub && packet_traits<RhsScalar>::HasSub
|
|
369
386
|
};
|
|
370
387
|
};
|
|
371
388
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
{
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
389
|
+
template <typename Packet, bool IsInteger = NumTraits<typename unpacket_traits<Packet>::type>::IsInteger>
|
|
390
|
+
struct maybe_raise_div_by_zero {
|
|
391
|
+
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Packet x) { EIGEN_UNUSED_VARIABLE(x); }
|
|
392
|
+
};
|
|
393
|
+
|
|
394
|
+
#ifndef EIGEN_GPU_COMPILE_PHASE
|
|
395
|
+
template <typename Packet>
|
|
396
|
+
struct maybe_raise_div_by_zero<Packet, true> {
|
|
397
|
+
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE void run(Packet x) {
|
|
398
|
+
if (EIGEN_PREDICT_FALSE(predux_any(pcmp_eq(x, pzero(x))))) {
|
|
399
|
+
// Use volatile variables to force a division by zero, which will
|
|
400
|
+
// result in the default platform behaviour (usually SIGFPE).
|
|
401
|
+
volatile typename unpacket_traits<Packet>::type zero = 0;
|
|
402
|
+
volatile typename unpacket_traits<Packet>::type val = 1;
|
|
403
|
+
val = val / zero;
|
|
404
|
+
}
|
|
386
405
|
}
|
|
406
|
+
};
|
|
407
|
+
#endif
|
|
408
|
+
|
|
409
|
+
/** \internal
|
|
410
|
+
* \brief Template functor to compute the quotient of two scalars
|
|
411
|
+
*
|
|
412
|
+
* \sa class CwiseBinaryOp, Cwise::operator/()
|
|
413
|
+
*/
|
|
414
|
+
template <typename LhsScalar, typename RhsScalar>
|
|
415
|
+
struct scalar_quotient_op : binary_op_base<LhsScalar, RhsScalar> {
|
|
416
|
+
typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_quotient_op>::ReturnType result_type;
|
|
417
|
+
#ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
|
|
418
|
+
scalar_quotient_op(){EIGEN_SCALAR_BINARY_OP_PLUGIN}
|
|
387
419
|
#endif
|
|
388
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
420
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type
|
|
421
|
+
operator()(const LhsScalar& a, const RhsScalar& b) const {
|
|
422
|
+
return a / b;
|
|
423
|
+
}
|
|
424
|
+
template <typename Packet>
|
|
425
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const {
|
|
426
|
+
return internal::pdiv(a, b);
|
|
427
|
+
}
|
|
428
|
+
};
|
|
429
|
+
template <typename LhsScalar, typename RhsScalar>
|
|
430
|
+
struct functor_traits<scalar_quotient_op<LhsScalar, RhsScalar>> {
|
|
431
|
+
typedef typename scalar_quotient_op<LhsScalar, RhsScalar>::result_type result_type;
|
|
396
432
|
enum {
|
|
397
|
-
PacketAccess =
|
|
398
|
-
|
|
433
|
+
PacketAccess =
|
|
434
|
+
is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasDiv && packet_traits<RhsScalar>::HasDiv,
|
|
435
|
+
Cost = scalar_div_cost<result_type, PacketAccess>::value
|
|
399
436
|
};
|
|
400
437
|
};
|
|
401
438
|
|
|
402
|
-
|
|
403
|
-
|
|
404
439
|
/** \internal
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
440
|
+
* \brief Template functor to compute the and of two scalars as if they were booleans
|
|
441
|
+
*
|
|
442
|
+
* \sa class CwiseBinaryOp, ArrayBase::operator&&
|
|
443
|
+
*/
|
|
444
|
+
template <typename Scalar>
|
|
409
445
|
struct scalar_boolean_and_op {
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
414
|
-
|
|
446
|
+
using result_type = Scalar;
|
|
447
|
+
// `false` any value `a` that satisfies `a == Scalar(0)`
|
|
448
|
+
// `true` is the complement of `false`
|
|
449
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a, const Scalar& b) const {
|
|
450
|
+
return (a != Scalar(0)) && (b != Scalar(0)) ? Scalar(1) : Scalar(0);
|
|
451
|
+
}
|
|
452
|
+
template <typename Packet>
|
|
453
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
|
|
454
|
+
const Packet cst_one = pset1<Packet>(Scalar(1));
|
|
455
|
+
// and(a,b) == !or(!a,!b)
|
|
456
|
+
Packet not_a = pcmp_eq(a, pzero(a));
|
|
457
|
+
Packet not_b = pcmp_eq(b, pzero(b));
|
|
458
|
+
Packet a_nand_b = por(not_a, not_b);
|
|
459
|
+
return pandnot(cst_one, a_nand_b);
|
|
460
|
+
}
|
|
415
461
|
};
|
|
416
|
-
template
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
PacketAccess = true
|
|
420
|
-
};
|
|
462
|
+
template <typename Scalar>
|
|
463
|
+
struct functor_traits<scalar_boolean_and_op<Scalar>> {
|
|
464
|
+
enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasCmp };
|
|
421
465
|
};
|
|
422
466
|
|
|
423
467
|
/** \internal
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
468
|
+
* \brief Template functor to compute the or of two scalars as if they were booleans
|
|
469
|
+
*
|
|
470
|
+
* \sa class CwiseBinaryOp, ArrayBase::operator||
|
|
471
|
+
*/
|
|
472
|
+
template <typename Scalar>
|
|
428
473
|
struct scalar_boolean_or_op {
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
433
|
-
|
|
474
|
+
using result_type = Scalar;
|
|
475
|
+
// `false` any value `a` that satisfies `a == Scalar(0)`
|
|
476
|
+
// `true` is the complement of `false`
|
|
477
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a, const Scalar& b) const {
|
|
478
|
+
return (a != Scalar(0)) || (b != Scalar(0)) ? Scalar(1) : Scalar(0);
|
|
479
|
+
}
|
|
480
|
+
template <typename Packet>
|
|
481
|
+
EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
|
|
482
|
+
const Packet cst_one = pset1<Packet>(Scalar(1));
|
|
483
|
+
// if or(a,b) == 0, then a == 0 and b == 0
|
|
484
|
+
// or(a,b) == !nor(a,b)
|
|
485
|
+
Packet a_nor_b = pcmp_eq(por(a, b), pzero(a));
|
|
486
|
+
return pandnot(cst_one, a_nor_b);
|
|
487
|
+
}
|
|
434
488
|
};
|
|
435
|
-
template
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
PacketAccess = true
|
|
439
|
-
};
|
|
489
|
+
template <typename Scalar>
|
|
490
|
+
struct functor_traits<scalar_boolean_or_op<Scalar>> {
|
|
491
|
+
enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasCmp };
|
|
440
492
|
};
|
|
441
493
|
|
|
442
494
|
/** \internal
|
|
443
|
-
* \brief Template functor to compute the xor of two booleans
|
|
495
|
+
* \brief Template functor to compute the xor of two scalars as if they were booleans
|
|
444
496
|
*
|
|
445
497
|
* \sa class CwiseBinaryOp, ArrayBase::operator^
|
|
446
498
|
*/
|
|
499
|
+
template <typename Scalar>
|
|
447
500
|
struct scalar_boolean_xor_op {
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE
|
|
452
|
-
|
|
501
|
+
using result_type = Scalar;
|
|
502
|
+
// `false` any value `a` that satisfies `a == Scalar(0)`
|
|
503
|
+
// `true` is the complement of `false`
|
|
504
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a, const Scalar& b) const {
|
|
505
|
+
return (a != Scalar(0)) != (b != Scalar(0)) ? Scalar(1) : Scalar(0);
|
|
506
|
+
}
|
|
507
|
+
template <typename Packet>
|
|
508
|
+
EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
|
|
509
|
+
const Packet cst_one = pset1<Packet>(Scalar(1));
|
|
510
|
+
// xor(a,b) == xor(!a,!b)
|
|
511
|
+
Packet not_a = pcmp_eq(a, pzero(a));
|
|
512
|
+
Packet not_b = pcmp_eq(b, pzero(b));
|
|
513
|
+
Packet a_xor_b = pxor(not_a, not_b);
|
|
514
|
+
return pand(cst_one, a_xor_b);
|
|
515
|
+
}
|
|
453
516
|
};
|
|
454
|
-
template
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
517
|
+
template <typename Scalar>
|
|
518
|
+
struct functor_traits<scalar_boolean_xor_op<Scalar>> {
|
|
519
|
+
enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasCmp };
|
|
520
|
+
};
|
|
521
|
+
|
|
522
|
+
template <typename Scalar, bool IsComplex = NumTraits<Scalar>::IsComplex>
|
|
523
|
+
struct bitwise_binary_impl {
|
|
524
|
+
static constexpr size_t Size = sizeof(Scalar);
|
|
525
|
+
using uint_t = typename numext::get_integer_by_size<Size>::unsigned_type;
|
|
526
|
+
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_and(const Scalar& a, const Scalar& b) {
|
|
527
|
+
uint_t a_as_uint = numext::bit_cast<uint_t, Scalar>(a);
|
|
528
|
+
uint_t b_as_uint = numext::bit_cast<uint_t, Scalar>(b);
|
|
529
|
+
uint_t result = a_as_uint & b_as_uint;
|
|
530
|
+
return numext::bit_cast<Scalar, uint_t>(result);
|
|
531
|
+
}
|
|
532
|
+
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_or(const Scalar& a, const Scalar& b) {
|
|
533
|
+
uint_t a_as_uint = numext::bit_cast<uint_t, Scalar>(a);
|
|
534
|
+
uint_t b_as_uint = numext::bit_cast<uint_t, Scalar>(b);
|
|
535
|
+
uint_t result = a_as_uint | b_as_uint;
|
|
536
|
+
return numext::bit_cast<Scalar, uint_t>(result);
|
|
537
|
+
}
|
|
538
|
+
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_xor(const Scalar& a, const Scalar& b) {
|
|
539
|
+
uint_t a_as_uint = numext::bit_cast<uint_t, Scalar>(a);
|
|
540
|
+
uint_t b_as_uint = numext::bit_cast<uint_t, Scalar>(b);
|
|
541
|
+
uint_t result = a_as_uint ^ b_as_uint;
|
|
542
|
+
return numext::bit_cast<Scalar, uint_t>(result);
|
|
543
|
+
}
|
|
544
|
+
};
|
|
545
|
+
|
|
546
|
+
template <typename Scalar>
|
|
547
|
+
struct bitwise_binary_impl<Scalar, true> {
|
|
548
|
+
using Real = typename NumTraits<Scalar>::Real;
|
|
549
|
+
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_and(const Scalar& a, const Scalar& b) {
|
|
550
|
+
Real real_result = bitwise_binary_impl<Real>::run_and(numext::real(a), numext::real(b));
|
|
551
|
+
Real imag_result = bitwise_binary_impl<Real>::run_and(numext::imag(a), numext::imag(b));
|
|
552
|
+
return Scalar(real_result, imag_result);
|
|
553
|
+
}
|
|
554
|
+
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_or(const Scalar& a, const Scalar& b) {
|
|
555
|
+
Real real_result = bitwise_binary_impl<Real>::run_or(numext::real(a), numext::real(b));
|
|
556
|
+
Real imag_result = bitwise_binary_impl<Real>::run_or(numext::imag(a), numext::imag(b));
|
|
557
|
+
return Scalar(real_result, imag_result);
|
|
558
|
+
}
|
|
559
|
+
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar run_xor(const Scalar& a, const Scalar& b) {
|
|
560
|
+
Real real_result = bitwise_binary_impl<Real>::run_xor(numext::real(a), numext::real(b));
|
|
561
|
+
Real imag_result = bitwise_binary_impl<Real>::run_xor(numext::imag(a), numext::imag(b));
|
|
562
|
+
return Scalar(real_result, imag_result);
|
|
563
|
+
}
|
|
459
564
|
};
|
|
460
565
|
|
|
461
566
|
/** \internal
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
template<typename
|
|
467
|
-
struct
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
567
|
+
* \brief Template functor to compute the bitwise and of two scalars
|
|
568
|
+
*
|
|
569
|
+
* \sa class CwiseBinaryOp, ArrayBase::operator&
|
|
570
|
+
*/
|
|
571
|
+
template <typename Scalar>
|
|
572
|
+
struct scalar_bitwise_and_op {
|
|
573
|
+
EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::RequireInitialization,
|
|
574
|
+
BITWISE OPERATIONS MAY ONLY BE PERFORMED ON PLAIN DATA TYPES)
|
|
575
|
+
EIGEN_STATIC_ASSERT((!internal::is_same<Scalar, bool>::value), DONT USE BITWISE OPS ON BOOLEAN TYPES)
|
|
576
|
+
using result_type = Scalar;
|
|
577
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a, const Scalar& b) const {
|
|
578
|
+
return bitwise_binary_impl<Scalar>::run_and(a, b);
|
|
579
|
+
}
|
|
580
|
+
template <typename Packet>
|
|
581
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
|
|
582
|
+
return pand(a, b);
|
|
475
583
|
}
|
|
584
|
+
};
|
|
585
|
+
template <typename Scalar>
|
|
586
|
+
struct functor_traits<scalar_bitwise_and_op<Scalar>> {
|
|
587
|
+
enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = true };
|
|
588
|
+
};
|
|
589
|
+
|
|
590
|
+
/** \internal
|
|
591
|
+
* \brief Template functor to compute the bitwise or of two scalars
|
|
592
|
+
*
|
|
593
|
+
* \sa class CwiseBinaryOp, ArrayBase::operator|
|
|
594
|
+
*/
|
|
595
|
+
template <typename Scalar>
|
|
596
|
+
struct scalar_bitwise_or_op {
|
|
597
|
+
EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::RequireInitialization,
|
|
598
|
+
BITWISE OPERATIONS MAY ONLY BE PERFORMED ON PLAIN DATA TYPES)
|
|
599
|
+
EIGEN_STATIC_ASSERT((!internal::is_same<Scalar, bool>::value), DONT USE BITWISE OPS ON BOOLEAN TYPES)
|
|
600
|
+
using result_type = Scalar;
|
|
601
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a, const Scalar& b) const {
|
|
602
|
+
return bitwise_binary_impl<Scalar>::run_or(a, b);
|
|
603
|
+
}
|
|
604
|
+
template <typename Packet>
|
|
605
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
|
|
606
|
+
return por(a, b);
|
|
607
|
+
}
|
|
608
|
+
};
|
|
609
|
+
template <typename Scalar>
|
|
610
|
+
struct functor_traits<scalar_bitwise_or_op<Scalar>> {
|
|
611
|
+
enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = true };
|
|
612
|
+
};
|
|
613
|
+
|
|
614
|
+
/** \internal
|
|
615
|
+
* \brief Template functor to compute the bitwise xor of two scalars
|
|
616
|
+
*
|
|
617
|
+
* \sa class CwiseBinaryOp, ArrayBase::operator^
|
|
618
|
+
*/
|
|
619
|
+
template <typename Scalar>
|
|
620
|
+
struct scalar_bitwise_xor_op {
|
|
621
|
+
EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::RequireInitialization,
|
|
622
|
+
BITWISE OPERATIONS MAY ONLY BE PERFORMED ON PLAIN DATA TYPES)
|
|
623
|
+
EIGEN_STATIC_ASSERT((!internal::is_same<Scalar, bool>::value), DONT USE BITWISE OPS ON BOOLEAN TYPES)
|
|
624
|
+
using result_type = Scalar;
|
|
625
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& a, const Scalar& b) const {
|
|
626
|
+
return bitwise_binary_impl<Scalar>::run_xor(a, b);
|
|
627
|
+
}
|
|
628
|
+
template <typename Packet>
|
|
629
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& a, const Packet& b) const {
|
|
630
|
+
return pxor(a, b);
|
|
631
|
+
}
|
|
632
|
+
};
|
|
633
|
+
template <typename Scalar>
|
|
634
|
+
struct functor_traits<scalar_bitwise_xor_op<Scalar>> {
|
|
635
|
+
enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = true };
|
|
636
|
+
};
|
|
637
|
+
|
|
638
|
+
/** \internal
|
|
639
|
+
* \brief Template functor to compute the absolute difference of two scalars
|
|
640
|
+
*
|
|
641
|
+
* \sa class CwiseBinaryOp, MatrixBase::absolute_difference
|
|
642
|
+
*/
|
|
643
|
+
template <typename LhsScalar, typename RhsScalar>
|
|
644
|
+
struct scalar_absolute_difference_op : binary_op_base<LhsScalar, RhsScalar> {
|
|
645
|
+
typedef typename ScalarBinaryOpTraits<LhsScalar, RhsScalar, scalar_absolute_difference_op>::ReturnType result_type;
|
|
646
|
+
#ifdef EIGEN_SCALAR_BINARY_OP_PLUGIN
|
|
647
|
+
scalar_absolute_difference_op(){EIGEN_SCALAR_BINARY_OP_PLUGIN}
|
|
476
648
|
#endif
|
|
477
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
649
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type
|
|
650
|
+
operator()(const LhsScalar& a, const RhsScalar& b) const {
|
|
651
|
+
return numext::absdiff(a, b);
|
|
652
|
+
}
|
|
653
|
+
template <typename Packet>
|
|
654
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const {
|
|
655
|
+
return internal::pabsdiff(a, b);
|
|
656
|
+
}
|
|
657
|
+
};
|
|
658
|
+
template <typename LhsScalar, typename RhsScalar>
|
|
659
|
+
struct functor_traits<scalar_absolute_difference_op<LhsScalar, RhsScalar>> {
|
|
485
660
|
enum {
|
|
486
|
-
Cost = (NumTraits<LhsScalar>::AddCost+NumTraits<RhsScalar>::AddCost)/2,
|
|
487
|
-
PacketAccess = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasAbsDiff
|
|
661
|
+
Cost = (NumTraits<LhsScalar>::AddCost + NumTraits<RhsScalar>::AddCost) / 2,
|
|
662
|
+
PacketAccess = is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasAbsDiff
|
|
488
663
|
};
|
|
489
664
|
};
|
|
490
665
|
|
|
666
|
+
template <typename LhsScalar, typename RhsScalar>
|
|
667
|
+
struct scalar_atan2_op {
|
|
668
|
+
using Scalar = LhsScalar;
|
|
669
|
+
|
|
670
|
+
static constexpr bool Enable =
|
|
671
|
+
is_same<LhsScalar, RhsScalar>::value && !NumTraits<Scalar>::IsInteger && !NumTraits<Scalar>::IsComplex;
|
|
672
|
+
EIGEN_STATIC_ASSERT(Enable, "LhsScalar and RhsScalar must be the same non-integer, non-complex type")
|
|
491
673
|
|
|
674
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar operator()(const Scalar& y, const Scalar& x) const {
|
|
675
|
+
return numext::atan2(y, x);
|
|
676
|
+
}
|
|
677
|
+
template <typename Packet>
|
|
678
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Packet packetOp(const Packet& y, const Packet& x) const {
|
|
679
|
+
return internal::patan2(y, x);
|
|
680
|
+
}
|
|
681
|
+
};
|
|
682
|
+
|
|
683
|
+
template <typename LhsScalar, typename RhsScalar>
|
|
684
|
+
struct functor_traits<scalar_atan2_op<LhsScalar, RhsScalar>> {
|
|
685
|
+
using Scalar = LhsScalar;
|
|
686
|
+
enum {
|
|
687
|
+
PacketAccess = is_same<LhsScalar, RhsScalar>::value && packet_traits<Scalar>::HasATan &&
|
|
688
|
+
packet_traits<Scalar>::HasDiv && !NumTraits<Scalar>::IsInteger && !NumTraits<Scalar>::IsComplex,
|
|
689
|
+
Cost = int(scalar_div_cost<Scalar, PacketAccess>::value) + int(functor_traits<scalar_atan_op<Scalar>>::Cost)
|
|
690
|
+
};
|
|
691
|
+
};
|
|
492
692
|
|
|
493
693
|
//---------- binary functors bound to a constant, thus appearing as a unary functor ----------
|
|
494
694
|
|
|
495
|
-
// The following two classes permits to turn any binary functor into a unary one with one argument bound to a constant
|
|
496
|
-
// They are analogues to std::binder1st/binder2nd but with the following differences:
|
|
695
|
+
// The following two classes permits to turn any binary functor into a unary one with one argument bound to a constant
|
|
696
|
+
// value. They are analogues to std::binder1st/binder2nd but with the following differences:
|
|
497
697
|
// - they are compatible with packetOp
|
|
498
698
|
// - they are portable across C++ versions (the std::binder* are deprecated in C++11)
|
|
499
|
-
template<typename BinaryOp>
|
|
500
|
-
|
|
501
|
-
typedef typename BinaryOp::first_argument_type
|
|
699
|
+
template <typename BinaryOp>
|
|
700
|
+
struct bind1st_op : BinaryOp {
|
|
701
|
+
typedef typename BinaryOp::first_argument_type first_argument_type;
|
|
502
702
|
typedef typename BinaryOp::second_argument_type second_argument_type;
|
|
503
|
-
typedef typename BinaryOp::result_type
|
|
703
|
+
typedef typename BinaryOp::result_type result_type;
|
|
504
704
|
|
|
505
|
-
EIGEN_DEVICE_FUNC explicit bind1st_op(const first_argument_type
|
|
705
|
+
EIGEN_DEVICE_FUNC explicit bind1st_op(const first_argument_type& val) : m_value(val) {}
|
|
506
706
|
|
|
507
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()
|
|
707
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const second_argument_type& b) const {
|
|
708
|
+
return BinaryOp::operator()(m_value, b);
|
|
709
|
+
}
|
|
508
710
|
|
|
509
|
-
template<typename Packet>
|
|
510
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& b) const
|
|
511
|
-
|
|
711
|
+
template <typename Packet>
|
|
712
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& b) const {
|
|
713
|
+
return BinaryOp::packetOp(internal::pset1<Packet>(m_value), b);
|
|
714
|
+
}
|
|
512
715
|
|
|
513
716
|
first_argument_type m_value;
|
|
514
717
|
};
|
|
515
|
-
template<typename BinaryOp>
|
|
718
|
+
template <typename BinaryOp>
|
|
719
|
+
struct functor_traits<bind1st_op<BinaryOp>> : functor_traits<BinaryOp> {};
|
|
516
720
|
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
typedef typename BinaryOp::first_argument_type first_argument_type;
|
|
721
|
+
template <typename BinaryOp>
|
|
722
|
+
struct bind2nd_op : BinaryOp {
|
|
723
|
+
typedef typename BinaryOp::first_argument_type first_argument_type;
|
|
521
724
|
typedef typename BinaryOp::second_argument_type second_argument_type;
|
|
522
|
-
typedef typename BinaryOp::result_type
|
|
725
|
+
typedef typename BinaryOp::result_type result_type;
|
|
523
726
|
|
|
524
|
-
EIGEN_DEVICE_FUNC explicit bind2nd_op(const second_argument_type
|
|
727
|
+
EIGEN_DEVICE_FUNC explicit bind2nd_op(const second_argument_type& val) : m_value(val) {}
|
|
525
728
|
|
|
526
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()
|
|
729
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const result_type operator()(const first_argument_type& a) const {
|
|
730
|
+
return BinaryOp::operator()(a, m_value);
|
|
731
|
+
}
|
|
527
732
|
|
|
528
|
-
template<typename Packet>
|
|
529
|
-
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
|
|
530
|
-
|
|
733
|
+
template <typename Packet>
|
|
734
|
+
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const {
|
|
735
|
+
return BinaryOp::packetOp(a, internal::pset1<Packet>(m_value));
|
|
736
|
+
}
|
|
531
737
|
|
|
532
738
|
second_argument_type m_value;
|
|
533
739
|
};
|
|
534
|
-
template<typename BinaryOp>
|
|
535
|
-
|
|
740
|
+
template <typename BinaryOp>
|
|
741
|
+
struct functor_traits<bind2nd_op<BinaryOp>> : functor_traits<BinaryOp> {};
|
|
536
742
|
|
|
537
|
-
}
|
|
743
|
+
} // end namespace internal
|
|
538
744
|
|
|
539
|
-
}
|
|
745
|
+
} // end namespace Eigen
|
|
540
746
|
|
|
541
|
-
#endif
|
|
747
|
+
#endif // EIGEN_BINARY_FUNCTORS_H
|