1#ifndef TATAMI_STATS_GROUP_VARIANCE_HPP
2#define TATAMI_STATS_GROUP_VARIANCE_HPP
13#include "sanisizer/sanisizer.hpp"
31template<
typename Output_ =
double>
63template<
typename Output_>
70 std::vector<Output_*>
mean;
100template<
typename Value_,
typename Index_,
typename Group_,
typename Count_,
typename Output_>
104 const Group_*
const group,
105 const Group_ num_groups,
106 const Count_*
const group_size,
110 assert(sanisizer::is_equal(num_groups, output.
mean.size()));
111 assert(sanisizer::is_equal(num_groups, output.
variance.size()));
112 const auto dim = (row ? mat.
nrow() : mat.
ncol());
114 nanable_ifelse<Value_>(
118 skip_nan::GroupRssBuffers<Output_, Index_> tmp;
119 tmp.mean = output.mean;
120 tmp.rss = output.variance;
122 auto count = sanisizer::create<std::vector<std::vector<Index_> > >(num_groups);
123 tmp.count.reserve(num_groups);
124 for (Group_ g = 0; g < num_groups; ++g) {
125 tatami::resize_container_to_Index_size(count[g], dim);
126 tmp.count.push_back(count[g].data());
132 for (Group_ g = 0; g < num_groups; ++g) {
133 const auto outvar = output.
variance[g];
134 const auto curcounts =
count[g];
135 for (Index_ d = 0; d < dim; ++d) {
136 if (curcounts[d] <= 1) {
139 outvar[d] /= curcounts[d] - 1;
146 GroupRssBuffers<Output_> tmp;
147 tmp.mean = output.mean;
148 tmp.rss = output.variance;
150 GroupRssOptions ropt;
151 ropt.num_threads = opt.num_threads;
152 group_rss(row, mat, group, num_groups, group_size, tmp, ropt);
154 for (Group_ g = 0; g < num_groups; ++g) {
155 const auto outvar = output.variance[g];
156 const auto gsize = group_size[g];
158 std::fill_n(outvar, dim, opt.variance_placeholder);
160 for (Index_ d = 0; d < dim; ++d) {
161 outvar[d] /= gsize - 1;
187template<
typename Value_,
typename Index_,
typename Group_,
typename Output_>
191 const Group_*
const group,
192 const Group_ num_groups,
196 auto group_size = sanisizer::create<std::vector<Index_> >(num_groups);
197 const auto otherdim = (row ? mat.
ncol() : mat.
nrow());
198 for (Index_ o = 0; o < otherdim; ++o) {
199 group_size[group[o]] += 1;
201 group_variance(row, mat, group, num_groups, group_size.data(), output, opt);
209template<
typename Output_>
216 std::vector<std::vector<Output_> >
mean;
244template<
typename Output_ =
double,
typename Value_,
typename Index_,
typename Group_>
248 const Group_*
const group,
249 const Group_ num_groups,
253 sanisizer::resize(output.
mean, num_groups);
254 sanisizer::resize(output.
variance, num_groups);
257 sanisizer::resize(buffers.
mean, num_groups);
258 sanisizer::resize(buffers.
variance, num_groups);
259 const auto dim = (row ? mat.
nrow() : mat.
ncol());
261 for (Group_ g = 0; g < num_groups; ++g) {
263#ifdef TATAMI_STATS_TEST_DIRTY
267 buffers.
mean[g] = output.
mean[g].data();
269#ifdef TATAMI_STATS_TEST_DIRTY
virtual Index_ ncol() const=0
virtual Index_ nrow() const=0
constexpr Value_ nan_if_available_else_zero()
void group_rss(bool row, const tatami::Matrix< Value_, Index_ > &mat, const Group_ *const group, const Group_ num_groups, const GroupRssBuffers< Output_, Count_ > &output, const GroupRssOptions< Output_ > &opt)
Definition group_rss.hpp:446
Functions to compute statistics from a tatami::Matrix.
Definition count.hpp:20
void group_rss(bool row, const tatami::Matrix< Value_, Index_ > &mat, const Group_ *const group, const Group_ num_groups, const Count_ *const group_size, const GroupRssBuffers< Output_ > &output, const GroupRssOptions< Output_ > &opt)
Definition group_rss.hpp:490
void group_variance(bool row, const tatami::Matrix< Value_, Index_ > &mat, const Group_ *const group, const Group_ num_groups, const Count_ *const group_size, const GroupVarianceBuffers< Output_ > &output, const GroupVarianceOptions< Output_ > &opt)
Definition group_variance.hpp:101
void count(const bool row, const tatami::Matrix< Value_, Index_ > &mat, Output_ *const output, Condition_ condition, const CountOptions &opt)
Definition count.hpp:188
void resize_container_to_Index_size(Container_ &container, const Index_ x, Args_ &&... args)
Result buffers for group_variance().
Definition group_variance.hpp:64
std::vector< Output_ * > mean
Definition group_variance.hpp:70
std::vector< Output_ * > variance
Definition group_variance.hpp:77
Options for group_variance().
Definition group_variance.hpp:32
Output_ variance_placeholder
Definition group_variance.hpp:55
Output_ mean_placeholder
Definition group_variance.hpp:49
bool skip_nan
Definition group_variance.hpp:37
int num_threads
Definition group_variance.hpp:43
Results of group_variance().
Definition group_variance.hpp:210
std::vector< std::vector< Output_ > > mean
Definition group_variance.hpp:216
std::vector< std::vector< Output_ > > variance
Definition group_variance.hpp:223