69 Index_ dim = (row ? mat.
nrow() : mat.
ncol());
70 Index_ otherdim = (row ? mat.
ncol() : mat.
nrow());
78 auto tmp = sanisizer::create<std::vector<Output_> >(num_groups);
80 for (Index_ i = 0; i < len; ++i) {
81 auto range = ext->fetch(xbuffer.data(), ibuffer.data());
82 std::fill(tmp.begin(), tmp.end(),
static_cast<Output_
>(0));
84 internal::nanable_ifelse<Value_>(
87 for (int j = 0; j < range.number; ++j) {
88 auto val = range.value[j];
89 if (!std::isnan(val)) {
90 tmp[group[range.index[j]]] += val;
95 for (
int j = 0; j < range.number; ++j) {
96 tmp[group[range.index[j]]] += range.value[j];
101 for (
decltype(num_groups) g = 0; g < num_groups; ++g) {
102 output[g][i + start] = tmp[g];
115 std::vector<sums::RunningSparse<Output_, Value_, Index_> > runners;
116 runners.reserve(num_groups);
117 std::vector<LocalOutputBuffer<Output_> > local_output;
118 local_output.reserve(num_groups);
120 for (
decltype(num_groups) g = 0; g < num_groups; ++g) {
121 local_output.emplace_back(thread, start, len, output[g]);
122 runners.emplace_back(local_output.back().data(), sopt.
skip_nan, start);
129 for (
int i = 0; i < otherdim; ++i) {
130 auto range = ext->fetch(xbuffer.data(), ibuffer.data());
131 runners[group[i]].add(range.value, range.index, range.number);
134 for (
decltype(num_groups) g = 0; g < num_groups; ++g) {
135 local_output[g].transfer();
141 if (mat.prefer_rows() == row) {
145 auto tmp = sanisizer::create<std::vector<Output_> >(num_groups);
147 for (Index_ i = 0; i < len; ++i) {
148 auto ptr = ext->fetch(xbuffer.data());
149 std::fill(tmp.begin(), tmp.end(),
static_cast<Output_
>(0));
151 internal::nanable_ifelse<Value_>(
154 for (Index_ j = 0; j < otherdim; ++j) {
156 if (!std::isnan(val)) {
157 tmp[group[j]] += val;
162 for (Index_ j = 0; j < otherdim; ++j) {
163 tmp[group[j]] += ptr[j];
168 for (
decltype(num_groups) g = 0; g < num_groups; ++g) {
169 output[g][i + start] = tmp[g];
172 }, dim, sopt.num_threads);
176 std::vector<sums::RunningDense<Output_, Value_, Index_> > runners;
177 runners.reserve(num_groups);
178 std::vector<LocalOutputBuffer<Output_> > local_output;
179 local_output.reserve(num_groups);
181 for (
decltype(num_groups) g = 0; g < num_groups; ++g) {
182 local_output.emplace_back(thread, start, len, output[g]);
183 runners.emplace_back(len, local_output.back().data(), sopt.skip_nan);
189 for (
int i = 0; i < otherdim; ++i) {
190 auto ptr = ext->fetch(xbuffer.data());
191 runners[group[i]].add(ptr);
194 for (
decltype(num_groups) g = 0; g < num_groups; ++g) {
195 local_output[g].transfer();
197 }, dim, sopt.num_threads);