diff options
author | Gael Guennebaud <g.gael@free.fr> | 2016-11-14 18:47:41 +0100 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2016-11-14 18:47:41 +0100 |
commit | 0ee92aa38eebcf5c3274f2f23ae56d0a4e722a65 (patch) | |
tree | 167788c62a0dd98d465b460b6bf795e824e982e0 /Eigen/src/SparseCore | |
parent | 2e334f5da0c37eea3bd91f0e80adb5f509d2416b (diff) |
Optimize sparse<bool> && sparse<bool> to use the same path as for coeff-wise products.
Diffstat (limited to 'Eigen/src/SparseCore')
-rw-r--r-- | Eigen/src/SparseCore/SparseCwiseBinaryOp.h | 107 |
1 files changed, 86 insertions, 21 deletions
diff --git a/Eigen/src/SparseCore/SparseCwiseBinaryOp.h b/Eigen/src/SparseCore/SparseCwiseBinaryOp.h index aad7b7d79..04cef66fc 100644 --- a/Eigen/src/SparseCore/SparseCwiseBinaryOp.h +++ b/Eigen/src/SparseCore/SparseCwiseBinaryOp.h @@ -325,16 +325,79 @@ protected: 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" template<typename T1, typename T2, typename Lhs, typename Rhs> 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: - 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<Rhs>::InnerIterator RhsIterator; - typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> XprType; typedef typename XprType::StorageIndex StorageIndex; typedef typename traits<XprType>::Scalar Scalar; public: @@ -344,7 +407,7 @@ 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) { while (m_lhsIter && m_rhsIter && (m_lhsIter.index() != m_rhsIter.index())) @@ -390,7 +453,7 @@ public: Flags = XprType::Flags }; - explicit binary_evaluator(const XprType& xpr) + explicit sparse_conjunction_evaluator(const XprType& xpr) : m_functor(xpr.functor()), m_lhsImpl(xpr.lhs()), m_rhsImpl(xpr.rhs()) @@ -409,16 +472,17 @@ protected: evaluator<Rhs> m_rhsImpl; }; -// "dense .* sparse" -template<typename T1, typename T2, typename Lhs, typename Rhs> -struct binary_evaluator<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs>, IndexBased, IteratorBased> - : evaluator_base<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs> > +// "dense ^ sparse" +template<typename XprType> +struct sparse_conjunction_evaluator<XprType, IndexBased, IteratorBased> + : evaluator_base<XprType> { 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 typename evaluator<Rhs>::InnerIterator RhsIterator; - typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> XprType; typedef typename XprType::StorageIndex StorageIndex; typedef typename traits<XprType>::Scalar Scalar; public: @@ -430,7 +494,7 @@ 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) {} @@ -463,7 +527,7 @@ public: 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_lhsImpl(xpr.lhs()), m_rhsImpl(xpr.rhs()) @@ -482,16 +546,17 @@ protected: evaluator<Rhs> m_rhsImpl; }; -// "sparse .* dense" -template<typename T1, typename T2, typename Lhs, typename Rhs> -struct binary_evaluator<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs>, IteratorBased, IndexBased> - : evaluator_base<CwiseBinaryOp<scalar_product_op<T1,T2>, Lhs, Rhs> > +// "sparse ^ dense" +template<typename XprType> +struct sparse_conjunction_evaluator<XprType, IteratorBased, IndexBased> + : evaluator_base<XprType> { 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 evaluator<Rhs> RhsEvaluator; - typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> XprType; typedef typename XprType::StorageIndex StorageIndex; typedef typename traits<XprType>::Scalar Scalar; public: @@ -503,7 +568,7 @@ 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) {} @@ -537,7 +602,7 @@ public: 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_lhsImpl(xpr.lhs()), m_rhsImpl(xpr.rhs()) |