mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-06-04 18:54:00 +08:00
fix flag and cost computations for nested expressions
This commit is contained in:
parent
5588def0cf
commit
ef5b20bc50
@ -55,17 +55,25 @@ struct ei_traits<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >
|
|||||||
typename Rhs::Scalar
|
typename Rhs::Scalar
|
||||||
)
|
)
|
||||||
>::type Scalar;
|
>::type Scalar;
|
||||||
|
typedef typename Lhs::Nested LhsNested;
|
||||||
|
typedef typename Rhs::Nested RhsNested;
|
||||||
|
typedef typename ei_unref<LhsNested>::type _LhsNested;
|
||||||
|
typedef typename ei_unref<RhsNested>::type _RhsNested;
|
||||||
enum {
|
enum {
|
||||||
|
LhsCoeffReadCost = _LhsNested::CoeffReadCost,
|
||||||
|
RhsCoeffReadCost = _RhsNested::CoeffReadCost,
|
||||||
|
LhsFlags = _LhsNested::Flags,
|
||||||
|
RhsFlags = _RhsNested::Flags,
|
||||||
RowsAtCompileTime = Lhs::RowsAtCompileTime,
|
RowsAtCompileTime = Lhs::RowsAtCompileTime,
|
||||||
ColsAtCompileTime = Lhs::ColsAtCompileTime,
|
ColsAtCompileTime = Lhs::ColsAtCompileTime,
|
||||||
MaxRowsAtCompileTime = Lhs::MaxRowsAtCompileTime,
|
MaxRowsAtCompileTime = Lhs::MaxRowsAtCompileTime,
|
||||||
MaxColsAtCompileTime = Lhs::MaxColsAtCompileTime,
|
MaxColsAtCompileTime = Lhs::MaxColsAtCompileTime,
|
||||||
Flags = ((Lhs::Flags | Rhs::Flags) & (
|
Flags = ((LhsFlags | RhsFlags) & (
|
||||||
DefaultLostFlagMask
|
DefaultLostFlagMask
|
||||||
| Like1DArrayBit
|
| Like1DArrayBit
|
||||||
| (ei_functor_traits<BinaryOp>::IsVectorizable && ((Lhs::Flags & RowMajorBit)==(Rhs::Flags & RowMajorBit))
|
| (ei_functor_traits<BinaryOp>::IsVectorizable && ((LhsFlags & RowMajorBit)==(RhsFlags & RowMajorBit))
|
||||||
? Lhs::Flags & Rhs::Flags & VectorizableBit : 0))),
|
? LhsFlags & RhsFlags & VectorizableBit : 0))),
|
||||||
CoeffReadCost = Lhs::CoeffReadCost + Rhs::CoeffReadCost + ei_functor_traits<BinaryOp>::Cost
|
CoeffReadCost = LhsCoeffReadCost + RhsCoeffReadCost + ei_functor_traits<BinaryOp>::Cost
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -76,6 +84,8 @@ class CwiseBinaryOp : ei_no_assignment_operator,
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseBinaryOp)
|
EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseBinaryOp)
|
||||||
|
typedef typename ei_traits<CwiseBinaryOp>::LhsNested LhsNested;
|
||||||
|
typedef typename ei_traits<CwiseBinaryOp>::RhsNested RhsNested;
|
||||||
|
|
||||||
CwiseBinaryOp(const Lhs& lhs, const Rhs& rhs, const BinaryOp& func = BinaryOp())
|
CwiseBinaryOp(const Lhs& lhs, const Rhs& rhs, const BinaryOp& func = BinaryOp())
|
||||||
: m_lhs(lhs), m_rhs(rhs), m_functor(func)
|
: m_lhs(lhs), m_rhs(rhs), m_functor(func)
|
||||||
@ -99,8 +109,8 @@ class CwiseBinaryOp : ei_no_assignment_operator,
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const typename Lhs::Nested m_lhs;
|
const LhsNested m_lhs;
|
||||||
const typename Rhs::Nested m_rhs;
|
const RhsNested m_rhs;
|
||||||
const BinaryOp m_functor;
|
const BinaryOp m_functor;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -45,15 +45,19 @@ struct ei_traits<CwiseUnaryOp<UnaryOp, MatrixType> >
|
|||||||
typedef typename ei_result_of<
|
typedef typename ei_result_of<
|
||||||
UnaryOp(typename MatrixType::Scalar)
|
UnaryOp(typename MatrixType::Scalar)
|
||||||
>::type Scalar;
|
>::type Scalar;
|
||||||
|
typedef typename MatrixType::Nested MatrixTypeNested;
|
||||||
|
typedef typename ei_unref<MatrixTypeNested>::type _MatrixTypeNested;
|
||||||
enum {
|
enum {
|
||||||
|
MatrixTypeCoeffReadCost = _MatrixTypeNested::CoeffReadCost,
|
||||||
|
MatrixTypeFlags = _MatrixTypeNested::Flags,
|
||||||
RowsAtCompileTime = MatrixType::RowsAtCompileTime,
|
RowsAtCompileTime = MatrixType::RowsAtCompileTime,
|
||||||
ColsAtCompileTime = MatrixType::ColsAtCompileTime,
|
ColsAtCompileTime = MatrixType::ColsAtCompileTime,
|
||||||
MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
||||||
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
|
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
|
||||||
Flags = (MatrixType::Flags & (
|
Flags = (MatrixTypeFlags & (
|
||||||
DefaultLostFlagMask | Like1DArrayBit
|
DefaultLostFlagMask | Like1DArrayBit
|
||||||
| (ei_functor_traits<UnaryOp>::IsVectorizable ? VectorizableBit : 0))),
|
| (ei_functor_traits<UnaryOp>::IsVectorizable ? VectorizableBit : 0))),
|
||||||
CoeffReadCost = MatrixType::CoeffReadCost + ei_functor_traits<UnaryOp>::Cost
|
CoeffReadCost = MatrixTypeCoeffReadCost + ei_functor_traits<UnaryOp>::Cost
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -43,6 +43,8 @@ template<typename MatrixType>
|
|||||||
struct ei_traits<DiagonalCoeffs<MatrixType> >
|
struct ei_traits<DiagonalCoeffs<MatrixType> >
|
||||||
{
|
{
|
||||||
typedef typename MatrixType::Scalar Scalar;
|
typedef typename MatrixType::Scalar Scalar;
|
||||||
|
typedef typename ei_nested<MatrixType>::type MatrixTypeNested;
|
||||||
|
typedef typename ei_unref<MatrixTypeNested>::type _MatrixTypeNested;
|
||||||
enum {
|
enum {
|
||||||
RowsAtCompileTime = MatrixType::SizeAtCompileTime == Dynamic ? Dynamic
|
RowsAtCompileTime = MatrixType::SizeAtCompileTime == Dynamic ? Dynamic
|
||||||
: EIGEN_ENUM_MIN(MatrixType::RowsAtCompileTime,
|
: EIGEN_ENUM_MIN(MatrixType::RowsAtCompileTime,
|
||||||
@ -53,9 +55,9 @@ struct ei_traits<DiagonalCoeffs<MatrixType> >
|
|||||||
MatrixType::MaxColsAtCompileTime),
|
MatrixType::MaxColsAtCompileTime),
|
||||||
MaxColsAtCompileTime = 1,
|
MaxColsAtCompileTime = 1,
|
||||||
Flags = (RowsAtCompileTime == Dynamic && ColsAtCompileTime == Dynamic
|
Flags = (RowsAtCompileTime == Dynamic && ColsAtCompileTime == Dynamic
|
||||||
? (unsigned int)MatrixType::Flags
|
? (unsigned int)_MatrixTypeNested::Flags
|
||||||
: (unsigned int)MatrixType::Flags &~ LargeBit) & DefaultLostFlagMask,
|
: (unsigned int)_MatrixTypeNested::Flags &~ LargeBit) & DefaultLostFlagMask,
|
||||||
CoeffReadCost = MatrixType::CoeffReadCost
|
CoeffReadCost = _MatrixTypeNested::CoeffReadCost
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -42,13 +42,15 @@ template<typename CoeffsVectorType>
|
|||||||
struct ei_traits<DiagonalMatrix<CoeffsVectorType> >
|
struct ei_traits<DiagonalMatrix<CoeffsVectorType> >
|
||||||
{
|
{
|
||||||
typedef typename CoeffsVectorType::Scalar Scalar;
|
typedef typename CoeffsVectorType::Scalar Scalar;
|
||||||
|
typedef typename ei_nested<CoeffsVectorType>::type CoeffsVectorTypeTypeNested;
|
||||||
|
typedef typename ei_unref<CoeffsVectorTypeTypeNested>::type _CoeffsVectorTypeTypeNested;
|
||||||
enum {
|
enum {
|
||||||
RowsAtCompileTime = CoeffsVectorType::SizeAtCompileTime,
|
RowsAtCompileTime = CoeffsVectorType::SizeAtCompileTime,
|
||||||
ColsAtCompileTime = CoeffsVectorType::SizeAtCompileTime,
|
ColsAtCompileTime = CoeffsVectorType::SizeAtCompileTime,
|
||||||
MaxRowsAtCompileTime = CoeffsVectorType::MaxSizeAtCompileTime,
|
MaxRowsAtCompileTime = CoeffsVectorType::MaxSizeAtCompileTime,
|
||||||
MaxColsAtCompileTime = CoeffsVectorType::MaxSizeAtCompileTime,
|
MaxColsAtCompileTime = CoeffsVectorType::MaxSizeAtCompileTime,
|
||||||
Flags = CoeffsVectorType::Flags & DefaultLostFlagMask,
|
Flags = _CoeffsVectorTypeTypeNested::Flags & DefaultLostFlagMask,
|
||||||
CoeffReadCost = CoeffsVectorType::CoeffReadCost
|
CoeffReadCost = _CoeffsVectorTypeTypeNested::CoeffReadCost
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -41,6 +41,8 @@ template<typename MatrixType>
|
|||||||
struct ei_traits<Minor<MatrixType> >
|
struct ei_traits<Minor<MatrixType> >
|
||||||
{
|
{
|
||||||
typedef typename MatrixType::Scalar Scalar;
|
typedef typename MatrixType::Scalar Scalar;
|
||||||
|
typedef typename ei_nested<MatrixType>::type MatrixTypeNested;
|
||||||
|
typedef typename ei_unref<MatrixTypeNested>::type _MatrixTypeNested;
|
||||||
enum {
|
enum {
|
||||||
RowsAtCompileTime = (MatrixType::RowsAtCompileTime != Dynamic) ?
|
RowsAtCompileTime = (MatrixType::RowsAtCompileTime != Dynamic) ?
|
||||||
MatrixType::RowsAtCompileTime - 1 : Dynamic,
|
MatrixType::RowsAtCompileTime - 1 : Dynamic,
|
||||||
@ -50,8 +52,8 @@ struct ei_traits<Minor<MatrixType> >
|
|||||||
MatrixType::MaxRowsAtCompileTime - 1 : Dynamic,
|
MatrixType::MaxRowsAtCompileTime - 1 : Dynamic,
|
||||||
MaxColsAtCompileTime = (MatrixType::MaxColsAtCompileTime != Dynamic) ?
|
MaxColsAtCompileTime = (MatrixType::MaxColsAtCompileTime != Dynamic) ?
|
||||||
MatrixType::MaxColsAtCompileTime - 1 : Dynamic,
|
MatrixType::MaxColsAtCompileTime - 1 : Dynamic,
|
||||||
Flags = MatrixType::Flags & DefaultLostFlagMask,
|
Flags = _MatrixTypeNested::Flags & DefaultLostFlagMask,
|
||||||
CoeffReadCost = MatrixType::CoeffReadCost
|
CoeffReadCost = _MatrixTypeNested::CoeffReadCost
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -41,13 +41,15 @@ template<typename MatrixType>
|
|||||||
struct ei_traits<Transpose<MatrixType> >
|
struct ei_traits<Transpose<MatrixType> >
|
||||||
{
|
{
|
||||||
typedef typename MatrixType::Scalar Scalar;
|
typedef typename MatrixType::Scalar Scalar;
|
||||||
|
typedef typename ei_nested<MatrixType>::type MatrixTypeNested;
|
||||||
|
typedef typename ei_unref<MatrixTypeNested>::type _MatrixTypeNested;
|
||||||
enum {
|
enum {
|
||||||
RowsAtCompileTime = MatrixType::ColsAtCompileTime,
|
RowsAtCompileTime = MatrixType::ColsAtCompileTime,
|
||||||
ColsAtCompileTime = MatrixType::RowsAtCompileTime,
|
ColsAtCompileTime = MatrixType::RowsAtCompileTime,
|
||||||
MaxRowsAtCompileTime = MatrixType::MaxColsAtCompileTime,
|
MaxRowsAtCompileTime = MatrixType::MaxColsAtCompileTime,
|
||||||
MaxColsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
MaxColsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
||||||
Flags = MatrixType::Flags ^ RowMajorBit,
|
Flags = _MatrixTypeNested::Flags ^ RowMajorBit,
|
||||||
CoeffReadCost = MatrixType::CoeffReadCost
|
CoeffReadCost = _MatrixTypeNested::CoeffReadCost
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -60,13 +60,15 @@ template<int Mode, typename MatrixType>
|
|||||||
struct ei_traits<Triangular<Mode, MatrixType> >
|
struct ei_traits<Triangular<Mode, MatrixType> >
|
||||||
{
|
{
|
||||||
typedef typename MatrixType::Scalar Scalar;
|
typedef typename MatrixType::Scalar Scalar;
|
||||||
|
typedef typename ei_nested<MatrixType>::type MatrixTypeNested;
|
||||||
|
typedef typename ei_unref<MatrixTypeNested>::type _MatrixTypeNested;
|
||||||
enum {
|
enum {
|
||||||
RowsAtCompileTime = MatrixType::RowsAtCompileTime,
|
RowsAtCompileTime = MatrixType::RowsAtCompileTime,
|
||||||
ColsAtCompileTime = MatrixType::ColsAtCompileTime,
|
ColsAtCompileTime = MatrixType::ColsAtCompileTime,
|
||||||
MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
|
||||||
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
|
MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
|
||||||
Flags = MatrixType::Flags & (~(VectorizableBit | Like1DArrayBit)) | Mode,
|
Flags = _MatrixTypeNested::Flags & (~(VectorizableBit | Like1DArrayBit)) | Mode,
|
||||||
CoeffReadCost = MatrixType::CoeffReadCost
|
CoeffReadCost = _MatrixTypeNested::CoeffReadCost
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user