1 #ifndef INDIGOX_UTILS_NUMERICS_HPP 2 #define INDIGOX_UTILS_NUMERICS_HPP 14 template <
typename InputIter,
typename T>
16 std::vector<std::vector<T>> &out) {
18 std::vector<T> pool(first, last);
19 if (r > pool.size())
return 0;
20 std::vector<size_t> indices(r);
21 std::iota(indices.begin(), indices.end(), 0);
22 out.emplace_back(std::vector<T>());
23 for (
size_t i : indices) out.back().emplace_back(pool[i]);
24 std::vector<size_t> tmp(r);
25 std::iota(tmp.begin(), tmp.end(), 0);
26 std::reverse(tmp.begin(), tmp.end());
30 for (
size_t x : tmp) {
31 if (indices[x] != x + pool.size() - r) {
39 std::vector<size_t> tmp2(r - i - 1);
40 std::iota(tmp2.begin(), tmp2.end(), i + 1);
41 for (
size_t j : tmp2) indices[j] = indices[j - 1] + 1;
42 out.emplace_back(std::vector<T>());
43 for (
size_t i : indices) out.back().emplace_back(pool[i]);
53 double sum = std::accumulate(begin, end, 0.0);
54 return sum / std::distance(begin, end);
65 template <
class RandomIter>
68 throw std::runtime_error(
"Median of empty range is undefined");
69 size_t sz = end - begin;
71 RandomIter target = begin + mid;
72 std::nth_element(begin, target, end);
75 return static_cast<double>(*target);
77 double x = static_cast<double>(*target);
78 RandomIter next = std::max_element(begin, target);
79 return (x + static_cast<double>(*next)) / 2.0;
86 std::vector<double> d(std::distance(begin, end));
87 std::transform(begin, end, d.begin(),
88 [mean](
double x) {
return x - mean; });
89 double sum_sq = std::inner_product(d.begin(), d.end(), d.begin(), 0.0);
90 return std::sqrt(sum_sq / d.size());
size_t Combinations(InputIter first, InputIter last, size_t r, std::vector< std::vector< T >> &out)
Definition: numerics.hpp:15
Namespace for all graph related functionality.
Definition: access.hpp:7
double CalculateStandardDeviation(Iter begin, Iter end)
Definition: numerics.hpp:84
double CalculateMean(Iter begin, Iter end)
Calculate the mean of a range of numbers.
Definition: numerics.hpp:52
double CalculateMedian(RandomIter begin, RandomIter end)
Calculate the median of a range of numbers.
Definition: numerics.hpp:66