mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-13 20:26:03 +08:00
Optimize sparse<bool> && sparse<bool> to use the same path as for coeff-wise products.
This commit is contained in:
parent
2e334f5da0
commit
0ee92aa38e
@ -84,6 +84,7 @@ class CwiseBinaryOp :
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
typedef typename internal::remove_all<BinaryOp>::type Functor;
|
||||||
typedef typename internal::remove_all<LhsType>::type Lhs;
|
typedef typename internal::remove_all<LhsType>::type Lhs;
|
||||||
typedef typename internal::remove_all<RhsType>::type Rhs;
|
typedef typename internal::remove_all<RhsType>::type Rhs;
|
||||||
|
|
||||||
|
@ -325,16 +325,79 @@ protected:
|
|||||||
const XprType &m_expr;
|
const XprType &m_expr;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename T,
|
||||||
|
typename LhsKind = typename evaluator_traits<typename T::Lhs>::Kind,
|
||||||
|
typename RhsKind = typename evaluator_traits<typename T::Rhs>::Kind,
|
||||||
|
typename LhsScalar = typename traits<typename T::Lhs>::Scalar,
|
||||||
|
typename RhsScalar = typename traits<typename T::Rhs>::Scalar> struct sparse_conjunction_evaluator;
|
||||||
|
|
||||||
// "sparse .* sparse"
|
// "sparse .* sparse"
|
||||||
template<typename T1, typename T2, typename Lhs, typename Rhs>
|
template<typename T1, typename T2, typename Lhs, typename Rhs>
|
||||||
struct binary_evaluator<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs>, IteratorBased, IteratorBased>
|
struct binary_evaluator<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs>, IteratorBased, IteratorBased>
|
||||||
: evaluator_base<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs> >
|
: sparse_conjunction_evaluator<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs> >
|
||||||
|
{
|
||||||
|
typedef CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs> XprType;
|
||||||
|
typedef sparse_conjunction_evaluator<XprType> Base;
|
||||||
|
explicit binary_evaluator(const XprType& xpr) : Base(xpr) {}
|
||||||
|
};
|
||||||
|
// "dense .* sparse"
|
||||||
|
template<typename T1, typename T2, typename Lhs, typename Rhs>
|
||||||
|
struct binary_evaluator<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs>, IndexBased, IteratorBased>
|
||||||
|
: sparse_conjunction_evaluator<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs> >
|
||||||
|
{
|
||||||
|
typedef CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs> XprType;
|
||||||
|
typedef sparse_conjunction_evaluator<XprType> Base;
|
||||||
|
explicit binary_evaluator(const XprType& xpr) : Base(xpr) {}
|
||||||
|
};
|
||||||
|
// "sparse .* dense"
|
||||||
|
template<typename T1, typename T2, typename Lhs, typename Rhs>
|
||||||
|
struct binary_evaluator<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs>, IteratorBased, IndexBased>
|
||||||
|
: sparse_conjunction_evaluator<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs> >
|
||||||
|
{
|
||||||
|
typedef CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs> XprType;
|
||||||
|
typedef sparse_conjunction_evaluator<XprType> Base;
|
||||||
|
explicit binary_evaluator(const XprType& xpr) : Base(xpr) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
// "sparse && sparse"
|
||||||
|
template<typename Lhs, typename Rhs>
|
||||||
|
struct binary_evaluator<CwiseBinaryOp<scalar_boolean_and_op, Lhs, Rhs>, IteratorBased, IteratorBased>
|
||||||
|
: sparse_conjunction_evaluator<CwiseBinaryOp<scalar_boolean_and_op, Lhs, Rhs> >
|
||||||
|
{
|
||||||
|
typedef CwiseBinaryOp<scalar_boolean_and_op, Lhs, Rhs> XprType;
|
||||||
|
typedef sparse_conjunction_evaluator<XprType> Base;
|
||||||
|
explicit binary_evaluator(const XprType& xpr) : Base(xpr) {}
|
||||||
|
};
|
||||||
|
// "dense && sparse"
|
||||||
|
template<typename Lhs, typename Rhs>
|
||||||
|
struct binary_evaluator<CwiseBinaryOp<scalar_boolean_and_op, Lhs, Rhs>, IndexBased, IteratorBased>
|
||||||
|
: sparse_conjunction_evaluator<CwiseBinaryOp<scalar_boolean_and_op, Lhs, Rhs> >
|
||||||
|
{
|
||||||
|
typedef CwiseBinaryOp<scalar_boolean_and_op, Lhs, Rhs> XprType;
|
||||||
|
typedef sparse_conjunction_evaluator<XprType> Base;
|
||||||
|
explicit binary_evaluator(const XprType& xpr) : Base(xpr) {}
|
||||||
|
};
|
||||||
|
// "sparse && dense"
|
||||||
|
template<typename Lhs, typename Rhs>
|
||||||
|
struct binary_evaluator<CwiseBinaryOp<scalar_boolean_and_op, Lhs, Rhs>, IteratorBased, IndexBased>
|
||||||
|
: sparse_conjunction_evaluator<CwiseBinaryOp<scalar_boolean_and_op, Lhs, Rhs> >
|
||||||
|
{
|
||||||
|
typedef CwiseBinaryOp<scalar_boolean_and_op, Lhs, Rhs> XprType;
|
||||||
|
typedef sparse_conjunction_evaluator<XprType> Base;
|
||||||
|
explicit binary_evaluator(const XprType& xpr) : Base(xpr) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
// "sparse ^ sparse"
|
||||||
|
template<typename XprType>
|
||||||
|
struct sparse_conjunction_evaluator<XprType, IteratorBased, IteratorBased>
|
||||||
|
: evaluator_base<XprType>
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
typedef scalar_product_op<T1,T2> BinaryOp;
|
typedef typename XprType::Functor BinaryOp;
|
||||||
|
typedef typename XprType::Lhs Lhs;
|
||||||
|
typedef typename XprType::Rhs Rhs;
|
||||||
typedef typename evaluator<Lhs>::InnerIterator LhsIterator;
|
typedef typename evaluator<Lhs>::InnerIterator LhsIterator;
|
||||||
typedef typename evaluator<Rhs>::InnerIterator RhsIterator;
|
typedef typename evaluator<Rhs>::InnerIterator RhsIterator;
|
||||||
typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> XprType;
|
|
||||||
typedef typename XprType::StorageIndex StorageIndex;
|
typedef typename XprType::StorageIndex StorageIndex;
|
||||||
typedef typename traits<XprType>::Scalar Scalar;
|
typedef typename traits<XprType>::Scalar Scalar;
|
||||||
public:
|
public:
|
||||||
@ -344,7 +407,7 @@ public:
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
EIGEN_STRONG_INLINE InnerIterator(const binary_evaluator& aEval, Index outer)
|
EIGEN_STRONG_INLINE InnerIterator(const sparse_conjunction_evaluator& aEval, Index outer)
|
||||||
: m_lhsIter(aEval.m_lhsImpl,outer), m_rhsIter(aEval.m_rhsImpl,outer), m_functor(aEval.m_functor)
|
: m_lhsIter(aEval.m_lhsImpl,outer), m_rhsIter(aEval.m_rhsImpl,outer), m_functor(aEval.m_functor)
|
||||||
{
|
{
|
||||||
while (m_lhsIter && m_rhsIter && (m_lhsIter.index() != m_rhsIter.index()))
|
while (m_lhsIter && m_rhsIter && (m_lhsIter.index() != m_rhsIter.index()))
|
||||||
@ -390,7 +453,7 @@ public:
|
|||||||
Flags = XprType::Flags
|
Flags = XprType::Flags
|
||||||
};
|
};
|
||||||
|
|
||||||
explicit binary_evaluator(const XprType& xpr)
|
explicit sparse_conjunction_evaluator(const XprType& xpr)
|
||||||
: m_functor(xpr.functor()),
|
: m_functor(xpr.functor()),
|
||||||
m_lhsImpl(xpr.lhs()),
|
m_lhsImpl(xpr.lhs()),
|
||||||
m_rhsImpl(xpr.rhs())
|
m_rhsImpl(xpr.rhs())
|
||||||
@ -409,16 +472,17 @@ protected:
|
|||||||
evaluator<Rhs> m_rhsImpl;
|
evaluator<Rhs> m_rhsImpl;
|
||||||
};
|
};
|
||||||
|
|
||||||
// "dense .* sparse"
|
// "dense ^ sparse"
|
||||||
template<typename T1, typename T2, typename Lhs, typename Rhs>
|
template<typename XprType>
|
||||||
struct binary_evaluator<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs>, IndexBased, IteratorBased>
|
struct sparse_conjunction_evaluator<XprType, IndexBased, IteratorBased>
|
||||||
: evaluator_base<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs> >
|
: evaluator_base<XprType>
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
typedef scalar_product_op<T1,T2> BinaryOp;
|
typedef typename XprType::Functor BinaryOp;
|
||||||
|
typedef typename XprType::Lhs Lhs;
|
||||||
|
typedef typename XprType::Rhs Rhs;
|
||||||
typedef evaluator<Lhs> LhsEvaluator;
|
typedef evaluator<Lhs> LhsEvaluator;
|
||||||
typedef typename evaluator<Rhs>::InnerIterator RhsIterator;
|
typedef typename evaluator<Rhs>::InnerIterator RhsIterator;
|
||||||
typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> XprType;
|
|
||||||
typedef typename XprType::StorageIndex StorageIndex;
|
typedef typename XprType::StorageIndex StorageIndex;
|
||||||
typedef typename traits<XprType>::Scalar Scalar;
|
typedef typename traits<XprType>::Scalar Scalar;
|
||||||
public:
|
public:
|
||||||
@ -430,7 +494,7 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
EIGEN_STRONG_INLINE InnerIterator(const binary_evaluator& aEval, Index outer)
|
EIGEN_STRONG_INLINE InnerIterator(const sparse_conjunction_evaluator& aEval, Index outer)
|
||||||
: m_lhsEval(aEval.m_lhsImpl), m_rhsIter(aEval.m_rhsImpl,outer), m_functor(aEval.m_functor), m_outer(outer)
|
: m_lhsEval(aEval.m_lhsImpl), m_rhsIter(aEval.m_rhsImpl,outer), m_functor(aEval.m_functor), m_outer(outer)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
@ -463,7 +527,7 @@ public:
|
|||||||
Flags = (XprType::Flags & ~RowMajorBit) | (int(Rhs::Flags)&RowMajorBit)
|
Flags = (XprType::Flags & ~RowMajorBit) | (int(Rhs::Flags)&RowMajorBit)
|
||||||
};
|
};
|
||||||
|
|
||||||
explicit binary_evaluator(const XprType& xpr)
|
explicit sparse_conjunction_evaluator(const XprType& xpr)
|
||||||
: m_functor(xpr.functor()),
|
: m_functor(xpr.functor()),
|
||||||
m_lhsImpl(xpr.lhs()),
|
m_lhsImpl(xpr.lhs()),
|
||||||
m_rhsImpl(xpr.rhs())
|
m_rhsImpl(xpr.rhs())
|
||||||
@ -482,16 +546,17 @@ protected:
|
|||||||
evaluator<Rhs> m_rhsImpl;
|
evaluator<Rhs> m_rhsImpl;
|
||||||
};
|
};
|
||||||
|
|
||||||
// "sparse .* dense"
|
// "sparse ^ dense"
|
||||||
template<typename T1, typename T2, typename Lhs, typename Rhs>
|
template<typename XprType>
|
||||||
struct binary_evaluator<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs>, IteratorBased, IndexBased>
|
struct sparse_conjunction_evaluator<XprType, IteratorBased, IndexBased>
|
||||||
: evaluator_base<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs> >
|
: evaluator_base<XprType>
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
typedef scalar_product_op<T1,T2> BinaryOp;
|
typedef typename XprType::Functor BinaryOp;
|
||||||
|
typedef typename XprType::Lhs Lhs;
|
||||||
|
typedef typename XprType::Rhs Rhs;
|
||||||
typedef typename evaluator<Lhs>::InnerIterator LhsIterator;
|
typedef typename evaluator<Lhs>::InnerIterator LhsIterator;
|
||||||
typedef evaluator<Rhs> RhsEvaluator;
|
typedef evaluator<Rhs> RhsEvaluator;
|
||||||
typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> XprType;
|
|
||||||
typedef typename XprType::StorageIndex StorageIndex;
|
typedef typename XprType::StorageIndex StorageIndex;
|
||||||
typedef typename traits<XprType>::Scalar Scalar;
|
typedef typename traits<XprType>::Scalar Scalar;
|
||||||
public:
|
public:
|
||||||
@ -503,7 +568,7 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
EIGEN_STRONG_INLINE InnerIterator(const binary_evaluator& aEval, Index outer)
|
EIGEN_STRONG_INLINE InnerIterator(const sparse_conjunction_evaluator& aEval, Index outer)
|
||||||
: m_lhsIter(aEval.m_lhsImpl,outer), m_rhsEval(aEval.m_rhsImpl), m_functor(aEval.m_functor), m_outer(outer)
|
: m_lhsIter(aEval.m_lhsImpl,outer), m_rhsEval(aEval.m_rhsImpl), m_functor(aEval.m_functor), m_outer(outer)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
@ -537,7 +602,7 @@ public:
|
|||||||
Flags = (XprType::Flags & ~RowMajorBit) | (int(Lhs::Flags)&RowMajorBit)
|
Flags = (XprType::Flags & ~RowMajorBit) | (int(Lhs::Flags)&RowMajorBit)
|
||||||
};
|
};
|
||||||
|
|
||||||
explicit binary_evaluator(const XprType& xpr)
|
explicit sparse_conjunction_evaluator(const XprType& xpr)
|
||||||
: m_functor(xpr.functor()),
|
: m_functor(xpr.functor()),
|
||||||
m_lhsImpl(xpr.lhs()),
|
m_lhsImpl(xpr.lhs()),
|
||||||
m_rhsImpl(xpr.rhs())
|
m_rhsImpl(xpr.rhs())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user