1#ifndef TATAMI_STATS_RSS_HPP
2#define TATAMI_STATS_RSS_HPP
15#include "sanisizer/sanisizer.hpp"
16#include "quickstats/quickstats.hpp"
43template<
typename Output_>
61template<
typename Value_,
typename Index_,
typename Output_>
63 const auto dim = (row ? mat.
nrow() : mat.
ncol());
64 const auto otherdim = (row ? mat.
ncol() : mat.
nrow());
73 quickstats::RssWorkspace<Output_> work;
74 for (Index_ x = 0; x < l; ++x) {
75 auto out = ext->fetch(vbuffer.data(), NULL);
76 const auto res = quickstats::rss(otherdim, out.number, out.value, work);
77 output.
mean[x + s] = res.mean;
78 output.
rss[x + s] = res.rss;
86 quickstats::RssWorkspace<Output_> work;
87 for (Index_ x = 0; x < l; ++x) {
88 auto out = ext->fetch(buffer.data());
89 const auto res = quickstats::rss(otherdim, out, work);
90 output.
mean[x + s] = res.mean;
91 output.
rss[x + s] = res.rss;
97template<
typename Value_,
typename Index_,
typename Output_>
99 const auto dim = (row ? mat.
nrow() : mat.
ncol());
100 const auto otherdim = (row ? mat.
ncol() : mat.
nrow());
104 std::fill_n(output.mean, dim, std::numeric_limits<Output_>::quiet_NaN());
105 std::fill_n(output.rss, dim, 0);
109 assert(opt.num_threads > 0);
110 const bool do_parallel = opt.num_threads > 1;
111 std::optional<std::vector<std::optional<std::vector<Output_> > > > all_partial_mean, all_partial_rss;
112 std::optional<std::vector<Index_> > all_partial_count;
115 all_partial_rss.emplace(sanisizer::cast<I<
decltype(all_partial_rss->size())> >(opt.num_threads - 1));
116 all_partial_mean.emplace(sanisizer::cast<I<
decltype(all_partial_mean->size())> >(opt.num_threads));
117 all_partial_count.emplace(sanisizer::cast<I<
decltype(all_partial_count->size())> >(opt.num_threads));
120 std::fill_n(output.rss, dim, 0);
121 std::fill_n(output.mean, dim, 0);
126 std::optional<std::vector<Output_> > cur_rss, cur_mean;
130 rss_ptr = output.rss;
131 mean_ptr = output.mean;
136 mean_ptr = cur_mean->data();
138 rss_ptr = output.rss;
141 rss_ptr = cur_rss->data();
153 quickstats::RssRunningSparse<Index_, Value_, Output_> runner(dim, mean_ptr, rss_ptr, nonzeros.data());
154 for (Index_ x = 0; x < l; ++x) {
155 auto out = ext->fetch(vbuffer.data(), ibuffer.data());
156 runner.add(out.number, out.value, out.index);
164 quickstats::RssRunningDense<Value_, Output_> runner(dim, mean_ptr, rss_ptr);
165 for (Index_ x = 0; x < l; ++x) {
166 auto out = ext->fetch(buffer.data());
173 (*all_partial_count)[thread] = l;
174 (*all_partial_mean)[thread] = std::move(cur_mean);
176 (*all_partial_rss)[thread - 1] = std::move(cur_rss);
179 }, otherdim, opt.num_threads);
185 const auto& ap_count = *all_partial_count;
186 const auto& ap_mean = *all_partial_mean;
187 const auto& ap_rss = *all_partial_rss;
190 for (
int u = 0; u < nused; ++u) {
191 const Output_ mult =
static_cast<Output_
>(ap_count[u]) /
static_cast<Output_
>(otherdim);
192 const auto& cur_mean = *(ap_mean[u]);
193 for (Index_ d = 0; d < dim; ++d) {
194 output.mean[d] += cur_mean[d] * mult;
200 for (
int u = 0; u < nused; ++u) {
201 const auto cur_count = ap_count[u];
202 const auto& cur_mean = *(ap_mean[u]);
204 for (Index_ d = 0; d < dim; ++d) {
205 output.rss[d] = quickstats::recenter_rss_unsafe(cur_count, output.rss[d], cur_mean[d], output.mean[d]);
208 const auto& cur_rss = *(ap_rss[u - 1]);
209 for (Index_ d = 0; d < dim; ++d) {
210 output.rss[d] += quickstats::recenter_rss_unsafe(cur_count, cur_rss[d], cur_mean[d], output.mean[d]);
237template<
typename Value_,
typename Index_,
typename Output_>
240 rss_direct(row, mat, output, opt);
242 rss_running(row, mat, output, opt);
252template<
typename Output_>
282template<
typename Output_ =
double,
typename Value_,
typename Index_>
285 const auto dim = (row ? mat.
nrow() : mat.
ncol());
287#ifdef TATAMI_STATS_TEST_DIRTY
292#ifdef TATAMI_STATS_TEST_DIRTY
299 buffers.
rss = output.
rss.data();
301 rss(row, mat, buffers, opt);
virtual Index_ ncol() const=0
virtual Index_ nrow() const=0
virtual bool prefer_rows() const=0
virtual bool is_sparse() const=0
virtual std::unique_ptr< MyopicSparseExtractor< Value_, Index_ > > sparse(bool row, const Options &opt) const=0
Functions to compute statistics from a tatami::Matrix.
Definition count.hpp:20
void rss(bool row, const tatami::Matrix< Value_, Index_ > &mat, RssBuffers< Output_ > &output, const RssOptions &opt)
Definition rss.hpp:238
void resize_container_to_Index_size(Container_ &container, const Index_ x, Args_ &&... args)
int parallelize(Function_ fun, const Index_ tasks, const int workers)
I< decltype(std::declval< Container_ >().size())> cast_Index_to_container_size(const Index_ x)
Container_ create_container_of_Index_size(const Index_ x, Args_ &&... args)
auto consecutive_extractor(const Matrix< Value_, Index_ > &matrix, const bool row, const Index_ iter_start, const Index_ iter_length, Args_ &&... args)
bool sparse_extract_index
bool sparse_ordered_index