Simplify implementation of the evaluation's iterator of Sparse*Diagonal products to help the compiler to generate better code.

This commit is contained in:
Gael Guennebaud 2015-09-01 22:34:30 +02:00
parent 0b2412df50
commit 6059188f9d

View File

@ -96,48 +96,38 @@ struct sparse_diagonal_product_evaluator<SparseXprType, DiagCoeffType, SDP_AsCwi
{ {
typedef typename SparseXprType::Scalar Scalar; typedef typename SparseXprType::Scalar Scalar;
typedef CwiseBinaryOp<scalar_product_op<Scalar>, typedef typename nested_eval<DiagCoeffType,SparseXprType::IsRowMajor ? SparseXprType::RowsAtCompileTime
const typename SparseXprType::ConstInnerVectorReturnType, : SparseXprType::ColsAtCompileTime>::type DiagCoeffNested;
const DiagCoeffType> CwiseProductType;
typedef typename evaluator<CwiseProductType>::type CwiseProductEval;
typedef typename evaluator<CwiseProductType>::InnerIterator CwiseProductIterator;
class InnerIterator class InnerIterator
{ {
typedef typename evaluator<SparseXprType>::InnerIterator SparseXprIter;
public: public:
InnerIterator(const sparse_diagonal_product_evaluator &xprEval, Index outer) InnerIterator(const sparse_diagonal_product_evaluator &xprEval, Index outer)
: m_cwiseXpr(xprEval.m_sparseXprNested.innerVector(outer).cwiseProduct(xprEval.m_diagCoeffNested)), : m_sparseIter(xprEval.m_sparseXprEval, outer), m_diagCoeffNested(xprEval.m_diagCoeffNested)
m_cwiseEval(m_cwiseXpr),
m_cwiseIter(m_cwiseEval, 0),
m_outer(outer)
{} {}
inline Scalar value() const { return m_cwiseIter.value(); } inline Scalar value() const { return m_sparseIter.value() * m_diagCoeffNested.coeff(index()); }
inline Index index() const { return m_cwiseIter.index(); } inline Index index() const { return m_sparseIter.index(); }
inline Index outer() const { return m_outer; } inline Index outer() const { return m_sparseIter.outer(); }
inline Index col() const { return SparseXprType::IsRowMajor ? m_cwiseIter.index() : m_outer; } inline Index col() const { return SparseXprType::IsRowMajor ? m_sparseIter.index() : m_sparseIter.outer(); }
inline Index row() const { return SparseXprType::IsRowMajor ? m_outer : m_cwiseIter.index(); } inline Index row() const { return SparseXprType::IsRowMajor ? m_sparseIter.outer() : m_sparseIter.index(); }
EIGEN_STRONG_INLINE InnerIterator& operator++() EIGEN_STRONG_INLINE InnerIterator& operator++() { ++m_sparseIter; return *this; }
{ ++m_cwiseIter; return *this; } inline operator bool() const { return m_sparseIter; }
inline operator bool() const { return m_cwiseIter; }
protected: protected:
const CwiseProductType m_cwiseXpr; SparseXprIter m_sparseIter;
CwiseProductEval m_cwiseEval; DiagCoeffNested m_diagCoeffNested;
CwiseProductIterator m_cwiseIter;
Index m_outer;
}; };
sparse_diagonal_product_evaluator(const SparseXprType &sparseXpr, const DiagCoeffType &diagCoeff) sparse_diagonal_product_evaluator(const SparseXprType &sparseXpr, const DiagCoeffType &diagCoeff)
: m_sparseXprNested(sparseXpr), m_diagCoeffNested(diagCoeff) : m_sparseXprEval(sparseXpr), m_diagCoeffNested(diagCoeff)
{} {}
protected: protected:
typename nested_eval<SparseXprType,1>::type m_sparseXprNested; typename evaluator<SparseXprType>::type m_sparseXprEval;
typename nested_eval<DiagCoeffType,SparseXprType::IsRowMajor ? SparseXprType::RowsAtCompileTime DiagCoeffNested m_diagCoeffNested;
: SparseXprType::ColsAtCompileTime>::type m_diagCoeffNested;
}; };
} // end namespace internal } // end namespace internal