10 #ifndef EIGEN_SPARSEPRODUCT_H
11 #define EIGEN_SPARSEPRODUCT_H
26 template<
typename Derived>
27 template<
typename OtherDerived>
28 inline const Product<Derived,OtherDerived,AliasFreeProduct>
37 template<
typename Lhs,
typename Rhs,
int ProductType>
38 struct generic_product_impl<Lhs, Rhs, SparseShape, SparseShape, ProductType>
40 template<
typename Dest>
41 static void evalTo(Dest& dst,
const Lhs& lhs,
const Rhs& rhs)
43 evalTo(dst, lhs, rhs,
typename evaluator_traits<Dest>::Shape());
47 template<
typename Dest,
typename ActualLhs>
48 static void addTo(Dest& dst,
const ActualLhs& lhs,
const Rhs& rhs,
int* =
typename enable_if<is_same<
typename evaluator_traits<Dest>::Shape,DenseShape>::value,
int*>::type(0) )
50 typedef typename nested_eval<ActualLhs,Dynamic>::type LhsNested;
51 typedef typename nested_eval<Rhs,Dynamic>::type RhsNested;
52 LhsNested lhsNested(lhs);
53 RhsNested rhsNested(rhs);
54 internal::sparse_sparse_to_dense_product_selector<typename remove_all<LhsNested>::type,
55 typename remove_all<RhsNested>::type, Dest>::run(lhsNested,rhsNested,dst);
59 template<
typename Dest>
60 static void subTo(Dest& dst,
const Lhs& lhs,
const Rhs& rhs,
int* =
typename enable_if<is_same<
typename evaluator_traits<Dest>::Shape,DenseShape>::value,
int*>::type(0) )
62 addTo(dst, -lhs, rhs);
68 template<
typename Dest>
69 static void evalTo(Dest& dst,
const Lhs& lhs,
const Rhs& rhs, SparseShape)
71 typedef typename nested_eval<Lhs,Dynamic>::type LhsNested;
72 typedef typename nested_eval<Rhs,Dynamic>::type RhsNested;
73 LhsNested lhsNested(lhs);
74 RhsNested rhsNested(rhs);
75 internal::conservative_sparse_sparse_product_selector<typename remove_all<LhsNested>::type,
76 typename remove_all<RhsNested>::type, Dest>::run(lhsNested,rhsNested,dst);
80 template<
typename Dest>
81 static void evalTo(Dest& dst,
const Lhs& lhs,
const Rhs& rhs, DenseShape)
89 template<
typename Lhs,
typename Rhs,
int ProductType>
90 struct generic_product_impl<Lhs, Rhs, SparseShape, SparseTriangularShape, ProductType>
91 :
public generic_product_impl<Lhs, Rhs, SparseShape, SparseShape, ProductType>
95 template<
typename Lhs,
typename Rhs,
int ProductType>
96 struct generic_product_impl<Lhs, Rhs, SparseTriangularShape, SparseShape, ProductType>
97 :
public generic_product_impl<Lhs, Rhs, SparseShape, SparseShape, ProductType>
101 template<
typename DstXprType,
typename Lhs,
typename Rhs>
102 struct Assignment<DstXprType, Product<Lhs,Rhs,AliasFreeProduct>,
internal::assign_op<typename DstXprType::Scalar>, Sparse2Dense>
104 typedef Product<Lhs,Rhs,AliasFreeProduct> SrcXprType;
105 static void run(DstXprType &dst,
const SrcXprType &src,
const internal::assign_op<typename DstXprType::Scalar> &)
107 generic_product_impl<Lhs, Rhs>::evalTo(dst,src.lhs(),src.rhs());
112 template<
typename DstXprType,
typename Lhs,
typename Rhs>
113 struct Assignment<DstXprType, Product<Lhs,Rhs,AliasFreeProduct>,
internal::add_assign_op<typename DstXprType::Scalar>, Sparse2Dense>
115 typedef Product<Lhs,Rhs,AliasFreeProduct> SrcXprType;
116 static void run(DstXprType &dst,
const SrcXprType &src,
const internal::add_assign_op<typename DstXprType::Scalar> &)
118 generic_product_impl<Lhs, Rhs>::addTo(dst,src.lhs(),src.rhs());
123 template<
typename DstXprType,
typename Lhs,
typename Rhs>
124 struct Assignment<DstXprType, Product<Lhs,Rhs,AliasFreeProduct>,
internal::sub_assign_op<typename DstXprType::Scalar>, Sparse2Dense>
126 typedef Product<Lhs,Rhs,AliasFreeProduct> SrcXprType;
127 static void run(DstXprType &dst,
const SrcXprType &src,
const internal::sub_assign_op<typename DstXprType::Scalar> &)
129 generic_product_impl<Lhs, Rhs>::subTo(dst,src.lhs(),src.rhs());
133 template<
typename Lhs,
typename Rhs,
int Options>
134 struct evaluator<SparseView<Product<Lhs, Rhs, Options> > >
135 :
public evaluator<typename Product<Lhs, Rhs, DefaultProduct>::PlainObject>
137 typedef SparseView<Product<Lhs, Rhs, Options> > XprType;
138 typedef typename XprType::PlainObject PlainObject;
139 typedef evaluator<PlainObject> Base;
141 explicit evaluator(
const XprType& xpr)
142 : m_result(xpr.rows(), xpr.cols())
145 ::new (static_cast<Base*>(
this)) Base(m_result);
146 typedef typename nested_eval<Lhs,Dynamic>::type LhsNested;
147 typedef typename nested_eval<Rhs,Dynamic>::type RhsNested;
148 LhsNested lhsNested(xpr.nestedExpression().lhs());
149 RhsNested rhsNested(xpr.nestedExpression().rhs());
151 internal::sparse_sparse_product_with_pruning_selector<typename remove_all<LhsNested>::type,
152 typename remove_all<RhsNested>::type, PlainObject>::run(lhsNested,rhsNested,m_result,
153 abs(xpr.reference())*xpr.epsilon());
157 PlainObject m_result;
164 #endif // EIGEN_SPARSEPRODUCT_H
Expression of the product of two arbitrary matrices or vectors.
Definition: Product.h:107
Derived & derived()
Definition: EigenBase.h:44
Base class of any sparse matrices or sparse expressions.
Definition: ForwardDeclarations.h:278
const ScalarMultipleReturnType operator*(const Scalar &scalar) const
Definition: SparseMatrixBase.h:57
Definition: Eigen_Colamd.h:54