10 #ifndef EIGEN_CONSERVATIVESPARSESPARSEPRODUCT_H    11 #define EIGEN_CONSERVATIVESPARSESPARSEPRODUCT_H    17 template<
typename Lhs, 
typename Rhs, 
typename ResultType>
    23   Index rows = lhs.innerSize();
    24   Index cols = rhs.outerSize();
    31   std::memset(mask,0,
sizeof(
bool)*rows);
    42   Index estimated_nnz_prod = lhsEval.nonZerosEstimate() + rhsEval.nonZerosEstimate();
    45   res.reserve(
Index(estimated_nnz_prod));
    47   for (
Index j=0; j<cols; ++j)
    54       Scalar y = rhsIt.value();
    55       Index k = rhsIt.index();
    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];
   125 template<
typename Lhs, 
typename Rhs, 
typename ResultType,
   131 template<
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())
   148       ColMajorMatrix resCol(lhs.rows(),rhs.cols());
   150       internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorMatrix>(lhs, rhs, resCol, 
true);
   155       ColMajorMatrixAux resCol(lhs.rows(),rhs.cols());
   157       internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorMatrixAux>(lhs, rhs, resCol, 
false);
   158       RowMajorMatrix resRow(resCol);
   159       res = resRow.markAsRValue();
   164 template<
typename Lhs, 
typename Rhs, 
typename ResultType>
   167   static void run(
const Lhs& lhs, 
const Rhs& rhs, ResultType& res)
   170      RowMajorMatrix rhsRow = rhs;
   171      RowMajorMatrix resRow(lhs.rows(), rhs.cols());
   172      internal::conservative_sparse_sparse_product_impl<RowMajorMatrix,Lhs,RowMajorMatrix>(rhsRow, lhs, resRow);
   177 template<
typename Lhs, 
typename Rhs, 
typename ResultType>
   180   static void run(
const Lhs& lhs, 
const Rhs& rhs, ResultType& res)
   183     RowMajorMatrix lhsRow = lhs;
   184     RowMajorMatrix resRow(lhs.rows(), rhs.cols());
   185     internal::conservative_sparse_sparse_product_impl<Rhs,RowMajorMatrix,RowMajorMatrix>(rhs, lhsRow, resRow);
   190 template<
typename Lhs, 
typename Rhs, 
typename ResultType>
   193   static void run(
const Lhs& lhs, 
const Rhs& rhs, ResultType& res)
   196     RowMajorMatrix resRow(lhs.rows(), rhs.cols());
   197     internal::conservative_sparse_sparse_product_impl<Rhs,Lhs,RowMajorMatrix>(rhs, lhs, resRow);
   203 template<
typename Lhs, 
typename Rhs, 
typename ResultType>
   208   static void run(
const Lhs& lhs, 
const Rhs& rhs, ResultType& res)
   211     ColMajorMatrix resCol(lhs.rows(), rhs.cols());
   212     internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorMatrix>(lhs, rhs, resCol);
   217 template<
typename Lhs, 
typename Rhs, 
typename ResultType>
   220   static void run(
const Lhs& lhs, 
const Rhs& rhs, ResultType& res)
   223     ColMajorMatrix lhsCol = lhs;
   224     ColMajorMatrix resCol(lhs.rows(), rhs.cols());
   225     internal::conservative_sparse_sparse_product_impl<ColMajorMatrix,Rhs,ColMajorMatrix>(lhsCol, rhs, resCol);
   230 template<
typename Lhs, 
typename Rhs, 
typename ResultType>
   233   static void run(
const Lhs& lhs, 
const Rhs& rhs, ResultType& res)
   236     ColMajorMatrix rhsCol = rhs;
   237     ColMajorMatrix resCol(lhs.rows(), rhs.cols());
   238     internal::conservative_sparse_sparse_product_impl<Lhs,ColMajorMatrix,ColMajorMatrix>(lhs, rhsCol, resCol);
   243 template<
typename Lhs, 
typename Rhs, 
typename ResultType>
   246   static void run(
const Lhs& lhs, 
const Rhs& rhs, ResultType& res)
   250     RowMajorMatrix resRow(lhs.rows(),rhs.cols());
   251     internal::conservative_sparse_sparse_product_impl<Rhs,Lhs,RowMajorMatrix>(rhs, lhs, resRow);
   253     ColMajorMatrix resCol(resRow);
   263 template<
typename Lhs, 
typename Rhs, 
typename ResultType>
   267   Index cols = rhs.outerSize();
   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;
   294 template<
typename Lhs, 
typename Rhs, 
typename ResultType,
   299 template<
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);
   308 template<
typename Lhs, 
typename Rhs, 
typename ResultType>
   311   static void run(
const Lhs& lhs, 
const Rhs& rhs, ResultType& res)
   314     ColMajorMatrix lhsCol(lhs);
   315     internal::sparse_sparse_to_dense_product_impl<ColMajorMatrix,Rhs,ResultType>(lhsCol, rhs, res);
   319 template<
typename Lhs, 
typename Rhs, 
typename ResultType>
   322   static void run(
const Lhs& lhs, 
const Rhs& rhs, ResultType& res)
   325     ColMajorMatrix rhsCol(rhs);
   326     internal::sparse_sparse_to_dense_product_impl<Lhs,ColMajorMatrix,ResultType>(lhs, rhsCol, res);
   330 template<
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);
   345 #endif // EIGEN_CONSERVATIVESPARSESPARSEPRODUCT_H static void run(const Lhs &lhs, const Rhs &rhs, ResultType &res)
LhsCleaned::Scalar Scalar
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)
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)
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)
static void run(const Lhs &lhs, const Rhs &rhs, ResultType &res)