63 const RightVectors_ right_vectors,
64 GetRightVector_ get_right_vector,
65 GetOutputVector_ get_output_vector,
68 const auto left_NR = left.
nrow();
69 const auto common_dim = left.
ncol();
70 const auto right_NC = right_vectors;
71 typedef I<
decltype(get_output_vector(0)[0])> Output;;
79 for (LeftIndex_ lr = 0; lr < length; ++lr) {
80 const auto range = ext->fetch(vbuffer.data(), ibuffer.data());
81 if (range.number == 0) {
82 for (RightVectors_ rv = 0; rv < right_NC; ++rv) {
83 get_output_vector(rv)[start + lr] = 0;
88 for (RightVectors_ rv = 0; rv < right_NC; ++rv) {
89 get_output_vector(rv)[start + lr] = sparse_dot_product<accumulators_>(
94 static_cast<Output
>(0)
104 std::vector<std::vector<LeftValue_> > left_vbuffers;
105 std::vector<std::vector<LeftIndex_> > left_ibuffers;
106 std::vector<tatami::SparseRange<LeftValue_, LeftIndex_> > left_ranges;
108 const LeftIndex_ max_block_rows = sanisizer::min(length, options.
block_size);
109 left_vbuffers.reserve(max_block_rows);
110 left_ibuffers.reserve(max_block_rows);
111 for (LeftIndex_ lr = 0; lr < max_block_rows; ++lr) {
115 sanisizer::resize(left_ranges, max_block_rows);
119 while (lr < length) {
123 const LeftIndex_ lr_num = sanisizer::min(options.
block_size, length - lr);
124 for (LeftIndex_ lr_counter = 0; lr_counter < lr_num; ++lr_counter) {
125 left_ranges[lr_counter] = ext->fetch(left_vbuffers[lr_counter].data(), left_ibuffers[lr_counter].data());
128 for (RightVectors_ rv = 0; rv < right_NC; ++rv) {
129 const auto rightvec = get_right_vector(rv);
130 const auto outvec = get_output_vector(rv);
131 for (LeftIndex_ lr_counter = 0; lr_counter < lr_num; ++lr_counter) {
132 const auto& currange = left_ranges[lr_counter];
133 outvec[start + lr + lr_counter] = sparse_dot_product<accumulators_>(
138 static_cast<Output
>(0)
void multiply_sparse_row_with_multiple_vectors(const tatami::Matrix< LeftValue_, LeftIndex_ > &left, const RightVectors_ right_vectors, GetRightVector_ get_right_vector, GetOutputVector_ get_output_vector, const MultiplySparseRowWithMultipleVectorsOptions &options)
Definition sparse_row.hpp:61
auto consecutive_extractor(const Matrix< Value_, Index_ > &matrix, const bool row, const Index_ iter_start, const Index_ iter_length, Args_ &&... args)