10#ifndef EIGEN_CONSERVATIVESPARSESPARSEPRODUCT_H
11#define EIGEN_CONSERVATIVESPARSESPARSEPRODUCT_H
17template<
typename Lhs,
typename Rhs,
typename ResultType>
18static void conservative_sparse_sparse_product_impl(
const Lhs& lhs,
const Rhs& rhs, ResultType& res,
bool sortedInsertion =
false)
20 typedef typename remove_all<Lhs>::type::Scalar Scalar;
23 Index rows = lhs.innerSize();
24 Index cols = rhs.outerSize();
25 eigen_assert(lhs.outerSize() == rhs.innerSize());
27 ei_declare_aligned_stack_constructed_variable(
bool, mask, rows, 0);
28 ei_declare_aligned_stack_constructed_variable(Scalar, values, rows, 0);
29 ei_declare_aligned_stack_constructed_variable(Index, indices, rows, 0);
31 std::memset(mask,0,
sizeof(
bool)*rows);
33 evaluator<Lhs> lhsEval(lhs);
34 evaluator<Rhs> rhsEval(rhs);
42 Index estimated_nnz_prod = lhsEval.nonZerosEstimate() + rhsEval.nonZerosEstimate();
45 res.reserve(Index(estimated_nnz_prod));
47 for (Index j=0; j<cols; ++j)
52 for (
typename evaluator<Rhs>::InnerIterator rhsIt(rhsEval, j); rhsIt; ++rhsIt)
54 Scalar y = rhsIt.value();
55 Index k = rhsIt.index();
56 for (
typename evaluator<Lhs>::InnerIterator lhsIt(lhsEval, k); lhsIt; ++lhsIt)
58 Index i = lhsIt.index();
59 Scalar x = lhsIt.value();
74 for(Index k=0; k<nnz; ++k)
77 res.insertBackByOuterInnerUnordered(j,i) = values[i];
84 const Index t200 = rows/11;
85 const Index t = (rows*100)/139;
93 if((nnz<200 && nnz<t200) || nnz * numext::log2(
int(nnz)) < t)
95 if(nnz>1) std::sort(indices,indices+nnz);
96 for(Index k=0; k<nnz; ++k)
99 res.insertBackByOuterInner(j,i) = values[i];
106 for(Index i=0; i<rows; ++i)
111 res.insertBackByOuterInner(j,i) = values[i];
125template<
typename Lhs,
typename Rhs,
typename ResultType,
131template<
typename Lhs,
typename Rhs,
typename ResultType>
135 typedef typename LhsCleaned::Scalar Scalar;
137 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType& res)
146 if(lhs.rows()>=rhs.cols())
150 internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorMatrix>(lhs, rhs,
resCol,
true);
151 res =
resCol.markAsRValue();
157 internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorMatrixAux>(lhs, rhs,
resCol,
false);
159 res =
resRow.markAsRValue();
164template<
typename Lhs,
typename Rhs,
typename ResultType>
167 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType& res)
172 internal::conservative_sparse_sparse_product_impl<RowMajorMatrix,Lhs,RowMajorMatrix>(
rhsRow, lhs,
resRow);
177template<
typename Lhs,
typename Rhs,
typename ResultType>
180 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType& res)
185 internal::conservative_sparse_sparse_product_impl<Rhs,RowMajorMatrix,RowMajorMatrix>(rhs,
lhsRow,
resRow);
190template<
typename Lhs,
typename Rhs,
typename ResultType>
193 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType& res)
197 internal::conservative_sparse_sparse_product_impl<Rhs,Lhs,RowMajorMatrix>(rhs, lhs,
resRow);
203template<
typename Lhs,
typename Rhs,
typename ResultType>
208 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType& res)
212 internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorMatrix>(lhs, rhs,
resCol);
217template<
typename Lhs,
typename Rhs,
typename ResultType>
220 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType& res)
225 internal::conservative_sparse_sparse_product_impl<ColMajorMatrix,Rhs,ColMajorMatrix>(
lhsCol, rhs,
resCol);
230template<
typename Lhs,
typename Rhs,
typename ResultType>
233 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType& res)
238 internal::conservative_sparse_sparse_product_impl<Lhs,ColMajorMatrix,ColMajorMatrix>(lhs,
rhsCol,
resCol);
243template<
typename Lhs,
typename Rhs,
typename ResultType>
246 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType& res)
251 internal::conservative_sparse_sparse_product_impl<Rhs,Lhs,RowMajorMatrix>(rhs, lhs,
resRow);
263template<
typename Lhs,
typename Rhs,
typename ResultType>
264static void sparse_sparse_to_dense_product_impl(
const Lhs& lhs,
const Rhs& rhs, ResultType& res)
266 typedef typename remove_all<Lhs>::type::Scalar Scalar;
267 Index cols = rhs.outerSize();
268 eigen_assert(lhs.outerSize() == rhs.innerSize());
273 for (Index
j=0;
j<cols; ++
j)
277 Scalar y =
rhsIt.value();
278 Index k =
rhsIt.index();
281 Index i =
lhsIt.index();
282 Scalar x =
lhsIt.value();
283 res.coeffRef(i,
j) += x * y;
294template<
typename Lhs,
typename Rhs,
typename ResultType,
299template<
typename Lhs,
typename Rhs,
typename ResultType>
302 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType& res)
304 internal::sparse_sparse_to_dense_product_impl<Lhs,Rhs,ResultType>(lhs, rhs, res);
308template<
typename Lhs,
typename Rhs,
typename ResultType>
311 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType& res)
315 internal::sparse_sparse_to_dense_product_impl<ColMajorMatrix,Rhs,ResultType>(
lhsCol, rhs, res);
319template<
typename Lhs,
typename Rhs,
typename ResultType>
322 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType& res)
326 internal::sparse_sparse_to_dense_product_impl<Lhs,ColMajorMatrix,ResultType>(lhs,
rhsCol, res);
330template<
typename Lhs,
typename Rhs,
typename ResultType>
333 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType& res)
336 internal::sparse_sparse_to_dense_product_impl<Rhs,Lhs,Transpose<ResultType> >(rhs, lhs,
trRes);
Pseudo expression representing a solving operation.
Definition Solve.h:63
@ ColMajor
Storage order is column major (see TopicStorageOrders).
Definition Constants.h:320
@ RowMajor
Storage order is row major (see TopicStorageOrders).
Definition Constants.h:322
const unsigned int RowMajorBit
for a matrix, this means that the storage order is row-major.
Definition Constants.h:61
Definition ConservativeSparseSparseProduct.h:129
Definition ConservativeSparseSparseProduct.h:297