25 #ifndef EIGEN_SPARSEPRODUCT_H
26 #define EIGEN_SPARSEPRODUCT_H
30 template<
typename Lhs,
typename Rhs>
33 typedef typename internal::traits<Lhs>::Scalar
Scalar;
43 typename internal::nested<Lhs,Rhs::RowsAtCompileTime>::type>::type
LhsNested;
47 typename internal::nested<Rhs,Lhs::RowsAtCompileTime>::type>::type
RhsNested;
53 template<
typename LhsNested,
typename RhsNested>
54 struct traits<SparseSparseProduct<LhsNested, RhsNested> >
58 typedef typename remove_all<LhsNested>::type _LhsNested;
59 typedef typename remove_all<RhsNested>::type _RhsNested;
60 typedef typename _LhsNested::Scalar Scalar;
61 typedef typename promote_index_type<typename traits<_LhsNested>::Index,
65 LhsCoeffReadCost = _LhsNested::CoeffReadCost,
66 RhsCoeffReadCost = _RhsNested::CoeffReadCost,
67 LhsFlags = _LhsNested::Flags,
68 RhsFlags = _RhsNested::Flags,
70 RowsAtCompileTime = _LhsNested::RowsAtCompileTime,
71 ColsAtCompileTime = _RhsNested::ColsAtCompileTime,
72 MaxRowsAtCompileTime = _LhsNested::MaxRowsAtCompileTime,
73 MaxColsAtCompileTime = _RhsNested::MaxColsAtCompileTime,
77 EvalToRowMajor = (RhsFlags & LhsFlags &
RowMajorBit),
88 typedef Sparse StorageKind;
93 template<
typename LhsNested,
typename RhsNested>
94 class SparseSparseProduct : internal::no_assignment_operator,
104 typedef typename internal::
traits<SparseSparseProduct>::_LhsNested _LhsNested;
105 typedef typename internal::
traits<SparseSparseProduct>::_RhsNested _RhsNested;
109 template<typename Lhs, typename Rhs>
111 : m_lhs(lhs), m_rhs(rhs), m_tolerance(0), m_conservative(true)
116 template<
typename Lhs,
typename Rhs>
118 : m_lhs(lhs), m_rhs(rhs), m_tolerance(tolerance), m_conservative(false)
125 return SparseSparseProduct(m_lhs,m_rhs,
internal::abs(reference)*epsilon);
128 template<
typename Dest>
129 void evalTo(Dest& result)
const
132 internal::conservative_sparse_sparse_product_selector<_LhsNested, _RhsNested, Dest>::run(lhs(),rhs(),result);
134 internal::sparse_sparse_product_with_pruning_selector<_LhsNested, _RhsNested, Dest>::run(lhs(),rhs(),result,m_tolerance);
149 ProductIsValid = _LhsNested::ColsAtCompileTime==
Dynamic
150 || _RhsNested::RowsAtCompileTime==
Dynamic
151 ||
int(_LhsNested::ColsAtCompileTime)==
int(_RhsNested::RowsAtCompileTime),
152 AreVectors = _LhsNested::IsVectorAtCompileTime && _RhsNested::IsVectorAtCompileTime,
159 INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS)
161 INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION)
172 template<
typename Derived>
173 template<
typename Lhs,
typename Rhs>
176 product.
evalTo(derived());
191 template<
typename Derived>
192 template<
typename OtherDerived>
201 #endif // EIGEN_SPARSEPRODUCT_H