10 #ifndef EIGEN_SPARSE_DIAGONAL_PRODUCT_H 11 #define EIGEN_SPARSE_DIAGONAL_PRODUCT_H 34 template<
typename SparseXprType,
typename DiagonalCoeffType,
int SDP_Tag>
35 struct sparse_diagonal_product_evaluator;
37 template<
typename Lhs,
typename Rhs,
int ProductTag>
38 struct product_evaluator<Product<Lhs, Rhs, DefaultProduct>, ProductTag, DiagonalShape, SparseShape>
39 :
public sparse_diagonal_product_evaluator<Rhs, typename Lhs::DiagonalVectorType, Rhs::Flags&RowMajorBit?SDP_AsScalarProduct:SDP_AsCwiseProduct>
41 typedef Product<Lhs, Rhs, DefaultProduct> XprType;
44 typedef sparse_diagonal_product_evaluator<Rhs, typename Lhs::DiagonalVectorType, Rhs::Flags&RowMajorBit?SDP_AsScalarProduct:SDP_AsCwiseProduct> Base;
45 explicit product_evaluator(
const XprType& xpr) : Base(xpr.rhs(), xpr.lhs().diagonal()) {}
48 template<
typename Lhs,
typename Rhs,
int ProductTag>
49 struct product_evaluator<Product<Lhs, Rhs, DefaultProduct>, ProductTag, SparseShape, DiagonalShape>
50 :
public sparse_diagonal_product_evaluator<Lhs, Transpose<const typename Rhs::DiagonalVectorType>, Lhs::Flags&RowMajorBit?SDP_AsCwiseProduct:SDP_AsScalarProduct>
52 typedef Product<Lhs, Rhs, DefaultProduct> XprType;
55 typedef sparse_diagonal_product_evaluator<Lhs, Transpose<const typename Rhs::DiagonalVectorType>, Lhs::Flags&
RowMajorBit?SDP_AsCwiseProduct:SDP_AsScalarProduct> Base;
56 explicit product_evaluator(
const XprType& xpr) : Base(xpr.lhs(), xpr.rhs().diagonal().transpose()) {}
59 template<
typename SparseXprType,
typename DiagonalCoeffType>
60 struct sparse_diagonal_product_evaluator<SparseXprType, DiagonalCoeffType, SDP_AsScalarProduct>
63 typedef typename evaluator<SparseXprType>::InnerIterator SparseXprInnerIterator;
64 typedef typename SparseXprType::Scalar Scalar;
67 class InnerIterator :
public SparseXprInnerIterator
70 InnerIterator(
const sparse_diagonal_product_evaluator &xprEval,
Index outer)
71 : SparseXprInnerIterator(xprEval.m_sparseXprImpl, outer),
72 m_coeff(xprEval.m_diagCoeffImpl.coeff(outer))
75 EIGEN_STRONG_INLINE Scalar value()
const {
return m_coeff * SparseXprInnerIterator::value(); }
77 typename DiagonalCoeffType::Scalar m_coeff;
80 sparse_diagonal_product_evaluator(
const SparseXprType &sparseXpr,
const DiagonalCoeffType &diagCoeff)
81 : m_sparseXprImpl(sparseXpr), m_diagCoeffImpl(diagCoeff)
84 Index nonZerosEstimate()
const {
return m_sparseXprImpl.nonZerosEstimate(); }
87 evaluator<SparseXprType> m_sparseXprImpl;
88 evaluator<DiagonalCoeffType> m_diagCoeffImpl;
92 template<
typename SparseXprType,
typename DiagCoeffType>
93 struct sparse_diagonal_product_evaluator<SparseXprType, DiagCoeffType, SDP_AsCwiseProduct>
95 typedef typename SparseXprType::Scalar Scalar;
96 typedef typename SparseXprType::StorageIndex StorageIndex;
98 typedef typename nested_eval<DiagCoeffType,SparseXprType::IsRowMajor ? SparseXprType::RowsAtCompileTime
99 : SparseXprType::ColsAtCompileTime>::type DiagCoeffNested;
103 typedef typename evaluator<SparseXprType>::InnerIterator SparseXprIter;
105 InnerIterator(
const sparse_diagonal_product_evaluator &xprEval,
Index outer)
106 : m_sparseIter(xprEval.m_sparseXprEval, outer), m_diagCoeffNested(xprEval.m_diagCoeffNested)
109 inline Scalar value()
const {
return m_sparseIter.value() * m_diagCoeffNested.coeff(index()); }
110 inline StorageIndex index()
const {
return m_sparseIter.index(); }
111 inline Index outer()
const {
return m_sparseIter.outer(); }
112 inline Index col()
const {
return SparseXprType::IsRowMajor ? m_sparseIter.index() : m_sparseIter.outer(); }
113 inline Index row()
const {
return SparseXprType::IsRowMajor ? m_sparseIter.outer() : m_sparseIter.index(); }
115 EIGEN_STRONG_INLINE InnerIterator& operator++() { ++m_sparseIter;
return *
this; }
116 inline operator bool()
const {
return m_sparseIter; }
119 SparseXprIter m_sparseIter;
120 DiagCoeffNested m_diagCoeffNested;
123 sparse_diagonal_product_evaluator(
const SparseXprType &sparseXpr,
const DiagCoeffType &diagCoeff)
124 : m_sparseXprEval(sparseXpr), m_diagCoeffNested(diagCoeff)
127 Index nonZerosEstimate()
const {
return m_sparseXprEval.nonZerosEstimate(); }
130 evaluator<SparseXprType> m_sparseXprEval;
131 DiagCoeffNested m_diagCoeffNested;
138 #endif // EIGEN_SPARSE_DIAGONAL_PRODUCT_H const int HugeCost
Definition: Constants.h:44
Namespace containing all symbols from the Eigen library.
Definition: Core:141
const unsigned int RowMajorBit
Definition: Constants.h:66
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
Definition: Eigen_Colamd.h:50