111 std::size_t num_groups,
112 const Index_* group_size,
113 Output_* output_means,
114 Output_* output_variances,
116 Index_* valid_group_size)
118 std::fill_n(output_means, num_groups, 0);
119 std::fill_n(output_variances, num_groups, 0);
121 ::tatami_stats::internal::nanable_ifelse<Value_>(
124 std::fill_n(valid_group_size, num_groups, 0);
126 for (Index_ j = 0; j < num; ++j) {
128 if (!std::isnan(x)) {
130 output_means[b] += x;
131 ++valid_group_size[b];
134 internal::finish_means(num_groups, valid_group_size, output_means);
136 for (Index_ j = 0; j < num; ++j) {
138 if (!std::isnan(x)) {
140 auto delta = x - output_means[b];
141 output_variances[b] += delta * delta;
144 internal::finish_variances(num_groups, valid_group_size, output_variances);
147 for (Index_ j = 0; j < num; ++j) {
148 output_means[group[j]] += ptr[j];
150 internal::finish_means(num_groups, group_size, output_means);
152 for (Index_ j = 0; j < num; ++j) {
154 auto delta = ptr[j] - output_means[b];
155 output_variances[b] += delta * delta;
157 internal::finish_variances(num_groups, group_size, output_variances);
201 std::size_t num_groups,
202 const Index_* group_size,
203 Output_* output_means,
204 Output_* output_variances,
205 Index_* output_nonzero,
207 Index_* valid_group_size)
209 std::fill_n(output_means, num_groups, 0);
210 std::fill_n(output_nonzero, num_groups, 0);
211 std::fill_n(output_variances, num_groups, 0);
213 ::tatami_stats::internal::nanable_ifelse<Value_>(
216 std::copy_n(group_size, num_groups, valid_group_size);
218 for (Index_ j = 0; j < num_nonzero; ++j) {
220 auto b = group[index[j]];
221 if (!std::isnan(x)) {
222 output_means[b] += x;
223 ++(output_nonzero[b]);
225 --(valid_group_size[b]);
228 internal::finish_means(num_groups, valid_group_size, output_means);
230 for (Index_ j = 0; j < num_nonzero; ++j) {
232 if (!std::isnan(x)) {
233 auto b = group[index[j]];
234 auto delta = x - output_means[b];
235 output_variances[b] += delta * delta;
238 for (I<
decltype(num_groups)> b = 0; b < num_groups; ++b) {
239 output_variances[b] += output_means[b] * output_means[b] * (valid_group_size[b] - output_nonzero[b]);
241 internal::finish_variances(num_groups, valid_group_size, output_variances);
244 for (Index_ j = 0; j < num_nonzero; ++j) {
245 auto b = group[index[j]];
246 output_means[b] += value[j];
249 internal::finish_means(num_groups, group_size, output_means);
251 for (Index_ j = 0; j < num_nonzero; ++j) {
252 auto b = group[index[j]];
253 auto delta = value[j] - output_means[b];
254 output_variances[b] += delta * delta;
256 for (I<
decltype(num_groups)> b = 0; b < num_groups; ++b) {
257 output_variances[b] += output_means[b] * output_means[b] * (group_size[b] - output_nonzero[b]);
259 internal::finish_variances(num_groups, group_size, output_variances);
288 const Index_ dim = (row ? mat.
nrow() : mat.
ncol());
289 const Index_ otherdim = (row ? mat.
ncol() : mat.
nrow());
298 auto tmp_means = sanisizer::create<std::vector<Output_> >(num_groups);
299 auto output_variances = sanisizer::create<std::vector<Output_> >(num_groups);
300 auto tmp_nonzero = sanisizer::create<std::vector<Index_> >(num_groups);
301 auto valid_group_size = sanisizer::create<std::vector<Index_> >(sopt.
skip_nan ? num_groups : 0);
303 for (Index_ i = 0; i < len; ++i) {
304 auto range = ext->fetch(xbuffer.data(), ibuffer.data());
313 output_variances.data(),
316 valid_group_size.data()
319 for (I<
decltype(num_groups)> g = 0; g < num_groups; ++g) {
320 output[g][i + start] = output_variances[g];
333 std::vector<variances::RunningSparse<Output_, Value_, Index_> > runners;
334 runners.reserve(num_groups);
335 std::vector<LocalOutputBuffer<Output_> > local_var_output;
336 local_var_output.reserve(num_groups);
337 std::vector<std::vector<Output_> > local_mean_output;
338 local_mean_output.reserve(num_groups);
340 for (I<
decltype(num_groups)> g = 0; g < num_groups; ++g) {
341 local_var_output.emplace_back(thread, start, len, output[g]);
342 local_mean_output.emplace_back(len);
343 runners.emplace_back(len, local_mean_output.back().data(), local_var_output.back().data(), sopt.
skip_nan, start);
350 for (Index_ i = 0; i < otherdim; ++i) {
351 auto range = ext->fetch(xbuffer.data(), ibuffer.data());
352 runners[group[i]].add(range.value, range.index, range.number);
355 for (I<
decltype(num_groups)> g = 0; g < num_groups; ++g) {
357 local_var_output[g].transfer();
368 auto tmp_means = sanisizer::create<std::vector<Output_> >(num_groups);
369 auto output_variances = sanisizer::create<std::vector<Output_> >(num_groups);
370 auto valid_group_size = sanisizer::create<std::vector<Index_> >(sopt.
skip_nan ? num_groups : 0);
372 for (Index_ i = 0; i < len; ++i) {
373 auto ptr = ext->fetch(xbuffer.data());
381 output_variances.data(),
383 valid_group_size.data()
386 for (I<
decltype(num_groups)> g = 0; g < num_groups; ++g) {
387 output[g][i + start] = output_variances[g];
394 std::vector<variances::RunningDense<Output_, Value_, Index_> > runners;
395 runners.reserve(num_groups);
396 std::vector<LocalOutputBuffer<Output_> > local_var_output;
397 local_var_output.reserve(num_groups);
398 std::vector<std::vector<Output_> > local_mean_output;
399 local_mean_output.reserve(num_groups);
401 for (I<
decltype(num_groups)> g = 0; g < num_groups; ++g) {
402 local_var_output.emplace_back(thread, start, len, output[g]);
403 local_mean_output.emplace_back(len);
404 runners.emplace_back(len, local_mean_output.back().data(), local_var_output.back().data(), sopt.
skip_nan);
410 for (Index_ i = 0; i < otherdim; ++i) {
411 auto ptr = ext->fetch(xbuffer.data());
412 runners[group[i]].add(ptr);
415 for (I<
decltype(num_groups)> g = 0; g < num_groups; ++g) {
417 local_var_output[g].transfer();
void direct(const Value_ *ptr, Index_ num, const Group_ *group, std::size_t num_groups, const Index_ *group_size, Output_ *output_means, Output_ *output_variances, bool skip_nan, Index_ *valid_group_size)
Definition grouped_variances.hpp:107