From 6059188f9dbac841ef0c9cc533047c0a3bd12d94 Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Tue, 1 Sep 2015 22:34:30 +0200 Subject: [PATCH] Simplify implementation of the evaluation's iterator of Sparse*Diagonal products to help the compiler to generate better code. --- Eigen/src/SparseCore/SparseDiagonalProduct.h | 42 ++++++++------------ 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/Eigen/src/SparseCore/SparseDiagonalProduct.h b/Eigen/src/SparseCore/SparseDiagonalProduct.h index d82927216..13b2f07bd 100644 --- a/Eigen/src/SparseCore/SparseDiagonalProduct.h +++ b/Eigen/src/SparseCore/SparseDiagonalProduct.h @@ -96,48 +96,38 @@ struct sparse_diagonal_product_evaluator, - const typename SparseXprType::ConstInnerVectorReturnType, - const DiagCoeffType> CwiseProductType; - - typedef typename evaluator::type CwiseProductEval; - typedef typename evaluator::InnerIterator CwiseProductIterator; + typedef typename nested_eval::type DiagCoeffNested; class InnerIterator { + typedef typename evaluator::InnerIterator SparseXprIter; public: InnerIterator(const sparse_diagonal_product_evaluator &xprEval, Index outer) - : m_cwiseXpr(xprEval.m_sparseXprNested.innerVector(outer).cwiseProduct(xprEval.m_diagCoeffNested)), - m_cwiseEval(m_cwiseXpr), - m_cwiseIter(m_cwiseEval, 0), - m_outer(outer) + : m_sparseIter(xprEval.m_sparseXprEval, outer), m_diagCoeffNested(xprEval.m_diagCoeffNested) {} - inline Scalar value() const { return m_cwiseIter.value(); } - inline Index index() const { return m_cwiseIter.index(); } - inline Index outer() const { return m_outer; } - inline Index col() const { return SparseXprType::IsRowMajor ? m_cwiseIter.index() : m_outer; } - inline Index row() const { return SparseXprType::IsRowMajor ? m_outer : m_cwiseIter.index(); } + inline Scalar value() const { return m_sparseIter.value() * m_diagCoeffNested.coeff(index()); } + inline Index index() const { return m_sparseIter.index(); } + inline Index outer() const { return m_sparseIter.outer(); } + inline Index col() const { return SparseXprType::IsRowMajor ? m_sparseIter.index() : m_sparseIter.outer(); } + inline Index row() const { return SparseXprType::IsRowMajor ? m_sparseIter.outer() : m_sparseIter.index(); } - EIGEN_STRONG_INLINE InnerIterator& operator++() - { ++m_cwiseIter; return *this; } - inline operator bool() const { return m_cwiseIter; } + EIGEN_STRONG_INLINE InnerIterator& operator++() { ++m_sparseIter; return *this; } + inline operator bool() const { return m_sparseIter; } protected: - const CwiseProductType m_cwiseXpr; - CwiseProductEval m_cwiseEval; - CwiseProductIterator m_cwiseIter; - Index m_outer; + SparseXprIter m_sparseIter; + DiagCoeffNested m_diagCoeffNested; }; sparse_diagonal_product_evaluator(const SparseXprType &sparseXpr, const DiagCoeffType &diagCoeff) - : m_sparseXprNested(sparseXpr), m_diagCoeffNested(diagCoeff) + : m_sparseXprEval(sparseXpr), m_diagCoeffNested(diagCoeff) {} protected: - typename nested_eval::type m_sparseXprNested; - typename nested_eval::type m_diagCoeffNested; + typename evaluator::type m_sparseXprEval; + DiagCoeffNested m_diagCoeffNested; }; } // end namespace internal