1#ifndef TATAMI_STATS__UTILS_HPP
2#define TATAMI_STATS__UTILS_HPP
28template<
typename Group_>
31 return static_cast<std::size_t
>(*std::max_element(group, group + n)) + 1;
49template<
typename Group_,
typename Size_>
52 std::vector<Size_> group_sizes(ngroups);
53 for (Size_ r = 0; r < n; ++r) {
54 ++(group_sizes[group[r]]);
78template<
typename Output_>
89 template<
typename Index_>
90 LocalOutputBuffer(std::size_t thread, Index_ start, Index_ length, Output_* output, Output_ fill) : my_output(output + start), use_local(thread > 0), my_buffer(use_local ? length : 0, fill) {
93 std::fill_n(my_output, length, fill);
106 template<
typename Index_>
120 return (use_local ? my_buffer.data() : my_output);
129 return (use_local ? my_buffer.data() : my_output);
138 std::copy(my_buffer.begin(), my_buffer.end(), my_output);
143 Output_* my_output = NULL;
144 bool use_local =
false;
145 std::vector<Output_> my_buffer;
159template<
typename Output_,
class GetOutput_>
171 template<
typename Index_>
172 LocalOutputBuffers(std::size_t thread, std::size_t number, Index_ start, Index_ length, GetOutput_ outfun, Output_ fill) :
175 my_use_local(thread > 0),
176 my_getter(std::move(outfun))
179 for (
decltype(my_number) i = 0; i < my_number; ++i) {
181 std::fill_n(my_getter(i) + my_start, length, fill);
184 my_buffers.reserve(my_number);
185 for (
decltype(my_number) i = 0; i < my_number; ++i) {
186 my_buffers.emplace_back(length, fill);
201 template<
typename Index_>
202 LocalOutputBuffers(std::size_t thread, std::size_t number, Index_ start, Index_ length, GetOutput_ outfun) :
225 return (my_use_local ? my_buffers[i].
data() : my_getter(i) + my_start);
234 const Output_*
data(std::size_t i)
const {
235 return (my_use_local ? my_buffers[i].
data() : my_getter(i) + my_start);
244 for (
decltype(my_number) i = 0; i < my_number; ++i) {
245 const auto& current = my_buffers[i];
246 std::copy(current.begin(), current.end(), my_getter(i) + my_start);
252 std::size_t my_number = 0;
253 std::size_t my_start = 0;
254 bool my_use_local =
true;
255 std::vector<std::vector<Output_> > my_buffers;
256 GetOutput_ my_getter;
264template<
typename Value_,
class If_,
class Else_>
265void nanable_ifelse(
bool skip_nan, If_ iffun, Else_ elsefun) {
266 if constexpr(std::numeric_limits<Value_>::has_quiet_NaN) {
275template<
typename Value_,
class If_,
class Else_>
276auto nanable_ifelse_with_value(
bool skip_nan, If_ iffun, Else_ elsefun) {
277 if constexpr(std::numeric_limits<Value_>::has_quiet_NaN) {
Local output buffer for running calculations.
Definition utils.hpp:79
void transfer()
Definition utils.hpp:136
Output_ * data()
Definition utils.hpp:119
LocalOutputBuffer()=default
LocalOutputBuffer(std::size_t thread, Index_ start, Index_ length, Output_ *output, Output_ fill)
Definition utils.hpp:90
const Output_ * data() const
Definition utils.hpp:128
LocalOutputBuffer(std::size_t thread, Index_ start, Index_ length, Output_ *output)
Definition utils.hpp:107
Local output buffers for running calculations.
Definition utils.hpp:160
LocalOutputBuffers(std::size_t thread, std::size_t number, Index_ start, Index_ length, GetOutput_ outfun, Output_ fill)
Definition utils.hpp:172
const Output_ * data(std::size_t i) const
Definition utils.hpp:234
void transfer()
Definition utils.hpp:242
std::size_t size() const
Definition utils.hpp:214
Output_ * data(std::size_t i)
Definition utils.hpp:224
LocalOutputBuffers(std::size_t thread, std::size_t number, Index_ start, Index_ length, GetOutput_ outfun)
Definition utils.hpp:202
LocalOutputBuffers()=default
Functions to compute statistics from a tatami::Matrix.
Definition counts.hpp:18
std::size_t total_groups(const Group_ *group, std::size_t n)
Definition utils.hpp:29
std::vector< Size_ > tabulate_groups(const Group_ *group, Size_ n)
Definition utils.hpp:50