1#ifndef SCRAN_MARKERS_BLOCK_AVERAGES_HPP
2#define SCRAN_MARKERS_BLOCK_AVERAGES_HPP
8#include "sanisizer/sanisizer.hpp"
34template<
typename Stat_>
35class PrecomputedPairwiseWeights {
39 PrecomputedPairwiseWeights(
const std::size_t ngroups,
const std::size_t nblocks,
const Stat_*
const combo_weights) :
40 my_total(sanisizer::product<I<decltype(my_total.size())> >(ngroups, ngroups)),
41 my_by_block(sanisizer::product<I<decltype(my_by_block.size())> >(my_total.size(), nblocks)),
45 auto blocks_in_use = sanisizer::create<std::vector<std::size_t> >(my_total.size());
46 for (I<
decltype(nblocks)> b = 0; b < nblocks; ++b) {
47 for (I<
decltype(ngroups)> g1 = 1; g1 < ngroups; ++g1) {
48 const auto w1 = combo_weights[sanisizer::nd_offset<std::size_t>(g1, ngroups, b)];
53 for (I<
decltype(g1)> g2 = 0; g2 < g1; ++g2) {
54 const auto w2 = combo_weights[sanisizer::nd_offset<std::size_t>(g2, ngroups, b)];
61 const Stat_ combined = w1 * w2;
62 const auto out_offset1 = sanisizer::nd_offset<std::size_t>(g2, ngroups, g1);
63 my_by_block[sanisizer::nd_offset<std::size_t>(b, nblocks, out_offset1)] = combined;
64 my_by_block[sanisizer::nd_offset<std::size_t>(b, nblocks, g1, ngroups, g2)] = combined;
65 my_total[out_offset1] += combined;
66 blocks_in_use[out_offset1] += (combined > 0);
75 for (I<
decltype(ngroups)> g1 = 1; g1 < ngroups; ++g1) {
76 for (I<
decltype(g1)> g2 = 0; g2 < g1; ++g2) {
77 const auto out_offset1 = sanisizer::nd_offset<std::size_t>(g2, ngroups, g1);
78 if (blocks_in_use[out_offset1] != 1) {
82 my_total[out_offset1] = 1;
83 for (I<
decltype(nblocks)> b = 0; b < nblocks; ++b) {
84 auto& curweight = my_by_block[sanisizer::nd_offset<std::size_t>(b, nblocks, out_offset1)];
85 curweight = (curweight > 0);
86 my_by_block[sanisizer::nd_offset<std::size_t>(b, nblocks, g1, ngroups, g2)] = curweight;
92 for (I<
decltype(ngroups)> g1 = 1; g1 < ngroups; ++g1) {
93 for (I<
decltype(g1)> g2 = 0; g2 < g1; ++g2) {
94 my_total[sanisizer::nd_offset<std::size_t>(g1, ngroups, g2)] = my_total[sanisizer::nd_offset<std::size_t>(g2, ngroups, g1)];
100 std::pair<const Stat_*, Stat_> get(
const std::size_t g1,
const std::size_t g2)
const {
101 const auto offset = sanisizer::nd_offset<std::size_t>(g2, my_ngroups, g1);
102 return std::make_pair(
103 my_by_block.data() + offset * my_nblocks,
109 std::vector<Stat_> my_total;
110 std::vector<Stat_> my_by_block;
111 std::size_t my_ngroups, my_nblocks;
114template<
typename Stat_>
115class BlockAverageInfo {
117 BlockAverageInfo() =
default;
118 BlockAverageInfo(std::vector<Stat_> combo_weights) : my_combo_weights(std::move(combo_weights)) {}
119 BlockAverageInfo(
const double quantile) : my_quantile(quantile) {}
122 std::optional<std::vector<Stat_> > my_combo_weights;
123 double my_quantile = 0;
126 bool use_mean()
const {
127 return my_combo_weights.has_value();
130 const std::vector<Stat_>& combo_weights()
const {
131 return *my_combo_weights;
134 double quantile()
const {
Marker detection for single-cell data.
Definition score_markers_pairwise.hpp:26
BlockAveragePolicy
Definition block_averages.hpp:27