4#include "dense_row.hpp"
5#include "sparse_row.hpp"
6#include "dense_column.hpp"
7#include "sparse_column.hpp"
12#include "sanisizer/sanisizer.hpp"
66template<
typename Value_,
typename Index_,
typename Right_,
typename Output_>
70 internal::sparse_row_vector(left, right, output, opt.
num_threads);
72 internal::sparse_column_vector(left, right, output, opt.
num_threads);
76 internal::dense_row_vector(left, right, output, opt.
num_threads);
78 internal::dense_column_vector(left, right, output, opt.
num_threads);
98template<
typename Left_,
typename Value_,
typename Index_,
typename Output_>
101 if (tright->sparse()) {
102 if (tright->prefer_rows()) {
103 internal::sparse_row_vector(*tright, left, output, opt.
num_threads);
105 internal::sparse_column_vector(*tright, left, output, opt.
num_threads);
108 if (tright->prefer_rows()) {
109 internal::dense_row_vector(*tright, left, output, opt.
num_threads);
111 internal::dense_column_vector(*tright, left, output, opt.
num_threads);
131template<
typename Value_,
typename Index_,
typename Right_,
typename Output_>
135 internal::sparse_row_vectors(left, right, output, opt.
num_threads);
137 internal::sparse_column_vectors(left, right, output, opt.
num_threads);
141 internal::dense_row_vectors(left, right, output, opt.
num_threads);
143 internal::dense_column_vectors(left, right, output, opt.
num_threads);
163template<
typename Left_,
typename Value_,
typename Index_,
typename Output_>
166 if (tright->sparse()) {
167 if (tright->prefer_rows()) {
168 internal::sparse_row_vectors(*tright, left, output, opt.
num_threads);
170 internal::sparse_column_vectors(*tright, left, output, opt.
num_threads);
173 if (tright->prefer_rows()) {
174 internal::dense_row_vectors(*tright, left, output, opt.
num_threads);
176 internal::dense_column_vectors(*tright, left, output, opt.
num_threads);
186template<
typename LeftValue_,
typename LeftIndex_,
typename RightValue_,
typename RightIndex_,
typename Output_>
188 RightIndex_ row_shift;
189 LeftIndex_ col_shift;
190 if (column_major_out) {
192 col_shift = left.
nrow();
194 row_shift = right.
ncol();
201 internal::sparse_row_tatami_sparse(left, right, output, row_shift, col_shift, num_threads);
203 internal::sparse_row_tatami_dense(left, right, output, row_shift, col_shift, num_threads);
207 internal::sparse_column_tatami_sparse(left, right, output, row_shift, col_shift, num_threads);
209 internal::sparse_column_tatami_dense(left, right, output, row_shift, col_shift, num_threads);
215 internal::dense_row_tatami_sparse(left, right, output, row_shift, col_shift, num_threads);
217 internal::dense_row_tatami_dense(left, right, output, row_shift, col_shift, num_threads);
221 internal::dense_column_tatami_sparse(left, right, output, row_shift, col_shift, num_threads);
223 internal::dense_column_tatami_dense(left, right, output, row_shift, col_shift, num_threads);
250template<
typename LeftValue_,
typename LeftIndex_,
typename RightValue_,
typename RightIndex_,
typename Output_>
253 if (sanisizer::is_less_than(left.
nrow(), right.
ncol())) {
virtual Index_ ncol() const=0
virtual Index_ nrow() const=0
virtual bool prefer_rows() const=0
virtual std::unique_ptr< MyopicSparseExtractor< Value_, Index_ > > sparse(bool row, const Options &opt) const=0
Multiplication of tatami matrices.
void multiply(const tatami::Matrix< Value_, Index_ > &left, const Right_ *right, Output_ *output, const Options &opt)
Definition tatami_mult.hpp:67
std::shared_ptr< const Matrix< Value_, Index_ > > wrap_shared_ptr(const Matrix< Value_, Index_ > *ptr)
Options for multiply().
Definition tatami_mult.hpp:28
bool prefer_larger
Definition tatami_mult.hpp:41
int num_threads
Definition tatami_mult.hpp:32
bool column_major_output
Definition tatami_mult.hpp:48