1#ifndef TATAMI_STATS_GROUP_VARIANCE_HPP
2#define TATAMI_STATS_GROUP_VARIANCE_HPP
13#include "sanisizer/sanisizer.hpp"
50template<
typename Output_>
57 std::vector<Output_*>
mean;
86template<
typename Value_,
typename Index_,
typename Group_,
typename Output_>
90 const Group_*
const group,
91 const std::size_t num_groups,
95 assert(sanisizer::is_equal(num_groups, output.
mean.size()));
96 assert(sanisizer::is_equal(num_groups, output.
variance.size()));
97 const auto dim = (row ? mat.
nrow() : mat.
ncol());
99 nanable_ifelse<Value_>(
102 skip_nan::GroupRssBuffers<Output_, Index_> tmp;
103 tmp.mean = output.mean;
104 tmp.rss = output.variance;
106 auto count = sanisizer::create<std::vector<std::vector<Index_> > >(num_groups);
107 tmp.count.reserve(num_groups);
108 for (std::size_t g = 0; g < num_groups; ++g) {
109 tatami::resize_container_to_Index_size(count[g], dim);
110 tmp.count.push_back(count[g].data());
116 for (std::size_t g = 0; g < num_groups; ++g) {
117 quickstats::rss_to_variance(dim,
count[g].data(), output.
variance[g]);
121 GroupRssBuffers<Output_, Index_> tmp;
122 tmp.mean = output.mean;
123 tmp.rss = output.variance;
124 auto group_sizes = sanisizer::create<std::vector<Index_> >(num_groups);
125 tmp.count = group_sizes.data();
127 GroupRssOptions ropt;
128 ropt.num_threads = opt.num_threads;
129 group_rss(row, mat, group, num_groups, tmp, ropt);
130 for (std::size_t g = 0; g < num_groups; ++g) {
131 quickstats::rss_to_variance(dim, group_sizes[g], output.variance[g]);
143template<
typename Output_>
150 std::vector<std::vector<Output_> >
mean;
179template<
typename Output_ =
double,
typename Value_,
typename Index_,
typename Group_>
183 const Group_*
const group,
184 const std::size_t num_groups,
188 sanisizer::resize(output.
mean, num_groups);
189 sanisizer::resize(output.
variance, num_groups);
192 sanisizer::resize(buffers.
mean, num_groups);
193 sanisizer::resize(buffers.
variance, num_groups);
194 const auto dim = (row ? mat.
nrow() : mat.
ncol());
196 for (std::size_t g = 0; g < num_groups; ++g) {
198#ifdef TATAMI_STATS_TEST_DIRTY
202 buffers.
mean[g] = output.
mean[g].data();
204#ifdef TATAMI_STATS_TEST_DIRTY
virtual Index_ ncol() const=0
virtual Index_ nrow() const=0
void group_rss(bool row, const tatami::Matrix< Value_, Index_ > &mat, const Group_ *const group, const std::size_t num_groups, GroupRssBuffers< Output_, Count_ > &output, const GroupRssOptions &opt)
Definition group_rss.hpp:428
Functions to compute statistics from a tatami::Matrix.
Definition count.hpp:20
void count(const bool row, const tatami::Matrix< Value_, Index_ > &mat, Output_ *const output, Condition_ condition, const CountOptions &opt)
Definition count.hpp:188
void group_variance(bool row, const tatami::Matrix< Value_, Index_ > &mat, const Group_ *const group, const std::size_t num_groups, GroupVarianceBuffers< Output_ > &output, const GroupVarianceOptions &opt)
Definition group_variance.hpp:87
void group_rss(bool row, const tatami::Matrix< Value_, Index_ > &mat, const Group_ *const group, const std::size_t num_groups, GroupRssBuffers< Output_, Count_ > &output, const GroupRssOptions &opt)
Definition group_rss.hpp:397
void resize_container_to_Index_size(Container_ &container, const Index_ x, Args_ &&... args)
Result buffers for group_variance().
Definition group_variance.hpp:51
std::vector< Output_ * > mean
Definition group_variance.hpp:57
std::vector< Output_ * > variance
Definition group_variance.hpp:64
Options for group_variance().
Definition group_variance.hpp:30
bool skip_nan
Definition group_variance.hpp:35
int num_threads
Definition group_variance.hpp:41
Results of group_variance().
Definition group_variance.hpp:144
std::vector< std::vector< Output_ > > mean
Definition group_variance.hpp:150
std::vector< std::vector< Output_ > > variance
Definition group_variance.hpp:157