10 #ifndef EIGEN_CONSERVATIVESPARSESPARSEPRODUCT_H 11 #define EIGEN_CONSERVATIVESPARSESPARSEPRODUCT_H 17 template<
typename Lhs,
typename Rhs,
typename ResultType>
33 std::memset(mask,0,
sizeof(
bool)*rows);
44 Index estimated_nnz_prod = lhsEval.nonZerosEstimate() + rhsEval.nonZerosEstimate();
47 res.reserve(
Index(estimated_nnz_prod));
56 RhsScalar
y = rhsIt.value();
57 Index k = rhsIt.index();
61 LhsScalar
x = lhsIt.value();
76 for(
Index k=0; k<nnz; ++k)
79 res.insertBackByOuterInnerUnordered(
j,i) =
values[
i];
86 const Index t200 = rows/11;
87 const Index t = (rows*100)/139;
97 if(nnz>1) std::sort(indices,indices+nnz);
98 for(
Index k=0; k<nnz; ++k)
101 res.insertBackByOuterInner(
j,i) =
values[
i];
113 res.insertBackByOuterInner(
j,i) =
values[
i];
127 template<
typename Lhs,
typename Rhs,
typename ResultType,
133 template<
typename Lhs,
typename Rhs,
typename ResultType>
139 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType&
res)
148 if(lhs.rows()>rhs.cols())
150 ColMajorMatrix resCol(lhs.rows(),rhs.cols());
152 internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorMatrix>(lhs, rhs, resCol,
true);
153 res = resCol.markAsRValue();
157 ColMajorMatrixAux resCol(lhs.rows(),rhs.cols());
159 internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorMatrixAux>(lhs, rhs, resCol,
false);
160 RowMajorMatrix resRow(resCol);
161 res = resRow.markAsRValue();
166 template<
typename Lhs,
typename Rhs,
typename ResultType>
169 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType&
res)
173 RowMajorRhs rhsRow = rhs;
174 RowMajorRes resRow(lhs.rows(), rhs.cols());
175 internal::conservative_sparse_sparse_product_impl<RowMajorRhs,Lhs,RowMajorRes>(rhsRow, lhs, resRow);
180 template<
typename Lhs,
typename Rhs,
typename ResultType>
183 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType&
res)
187 RowMajorLhs lhsRow = lhs;
188 RowMajorRes resRow(lhs.rows(), rhs.cols());
189 internal::conservative_sparse_sparse_product_impl<Rhs,RowMajorLhs,RowMajorRes>(rhs, lhsRow, resRow);
194 template<
typename Lhs,
typename Rhs,
typename ResultType>
197 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType&
res)
200 RowMajorMatrix resRow(lhs.rows(), rhs.cols());
201 internal::conservative_sparse_sparse_product_impl<Rhs,Lhs,RowMajorMatrix>(rhs, lhs, resRow);
207 template<
typename Lhs,
typename Rhs,
typename ResultType>
212 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType&
res)
215 ColMajorMatrix resCol(lhs.rows(), rhs.cols());
216 internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorMatrix>(lhs, rhs, resCol);
221 template<
typename Lhs,
typename Rhs,
typename ResultType>
224 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType&
res)
228 ColMajorLhs lhsCol = lhs;
229 ColMajorRes resCol(lhs.rows(), rhs.cols());
230 internal::conservative_sparse_sparse_product_impl<ColMajorLhs,Rhs,ColMajorRes>(lhsCol, rhs, resCol);
235 template<
typename Lhs,
typename Rhs,
typename ResultType>
238 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType&
res)
242 ColMajorRhs rhsCol = rhs;
243 ColMajorRes resCol(lhs.rows(), rhs.cols());
244 internal::conservative_sparse_sparse_product_impl<Lhs,ColMajorRhs,ColMajorRes>(lhs, rhsCol, resCol);
249 template<
typename Lhs,
typename Rhs,
typename ResultType>
252 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType&
res)
256 RowMajorMatrix resRow(lhs.rows(),rhs.cols());
257 internal::conservative_sparse_sparse_product_impl<Rhs,Lhs,RowMajorMatrix>(rhs, lhs, resRow);
259 ColMajorMatrix resCol(resRow);
269 template<
typename Lhs,
typename Rhs,
typename ResultType>
284 RhsScalar
y = rhsIt.value();
285 Index k = rhsIt.index();
289 LhsScalar
x = lhsIt.value();
290 res.coeffRef(i,
j) += x *
y;
301 template<
typename Lhs,
typename Rhs,
typename ResultType,
306 template<
typename Lhs,
typename Rhs,
typename ResultType>
309 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType&
res)
311 internal::sparse_sparse_to_dense_product_impl<Lhs,Rhs,ResultType>(lhs, rhs,
res);
315 template<
typename Lhs,
typename Rhs,
typename ResultType>
318 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType&
res)
321 ColMajorLhs lhsCol(lhs);
322 internal::sparse_sparse_to_dense_product_impl<ColMajorLhs,Rhs,ResultType>(lhsCol, rhs,
res);
326 template<
typename Lhs,
typename Rhs,
typename ResultType>
329 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType&
res)
332 ColMajorRhs rhsCol(rhs);
333 internal::sparse_sparse_to_dense_product_impl<Lhs,ColMajorRhs,ResultType>(lhs, rhsCol,
res);
337 template<
typename Lhs,
typename Rhs,
typename ResultType>
340 static void run(
const Lhs& lhs,
const Rhs& rhs, ResultType&
res)
343 internal::sparse_sparse_to_dense_product_impl<Rhs,Lhs,Transpose<ResultType> >(rhs, lhs, trRes);
352 #endif // EIGEN_CONSERVATIVESPARSESPARSEPRODUCT_H
static void run(const Lhs &lhs, const Rhs &rhs, ResultType &res)
LhsCleaned::Scalar Scalar
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor > ColMajorMatrix
A versatible sparse matrix representation.
Expression of the transpose of a matrix.
static void conservative_sparse_sparse_product_impl(const Lhs &lhs, const Rhs &rhs, ResultType &res, bool sortedInsertion=false)
Namespace containing all symbols from the Eigen library.
static void run(const Lhs &lhs, const Rhs &rhs, ResultType &res)
const unsigned int RowMajorBit
static void run(const Lhs &lhs, const Rhs &rhs, ResultType &res)
traits< typename remove_all< Lhs >::type >::Scalar Scalar
static void run(const Lhs &lhs, const Rhs &rhs, ResultType &res)
static void run(const Lhs &lhs, const Rhs &rhs, ResultType &res)
cout<< "Here is the matrix m:"<< endl<< m<< endl;Matrix< ptrdiff_t, 3, 1 > res
static void run(const Lhs &lhs, const Rhs &rhs, ResultType &res)
static void sparse_sparse_to_dense_product_impl(const Lhs &lhs, const Rhs &rhs, ResultType &res)
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
static void run(const Lhs &lhs, const Rhs &rhs, ResultType &res)
#define ei_declare_aligned_stack_constructed_variable(TYPE, NAME, SIZE, BUFFER)
static void run(const Lhs &lhs, const Rhs &rhs, ResultType &res)
remove_all< Lhs >::type LhsCleaned
static void run(const Lhs &lhs, const Rhs &rhs, ResultType &res)
static void run(const Lhs &lhs, const Rhs &rhs, ResultType &res)
static void run(const Lhs &lhs, const Rhs &rhs, ResultType &res)
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy x
static void run(const Lhs &lhs, const Rhs &rhs, ResultType &res)