17 return std::ranges::fold_left(values, 0.0, [&](
double acc,
const auto & value) {
18 return acc + std::invoke(valueMapper, value);
22static Option<double> mean(std::ranges::input_range
auto && values)
requires std::is_convertible_v<double,std::ranges::range_value_t<
decltype(values)>>{
23 return mean(values, [](
const auto & value){
24 return static_cast<double>(value);
29 return mean(values, valueMapper);
32static Option<double> avg(std::ranges::input_range
auto && values)
requires std::is_convertible_v<double,std::ranges::range_value_t<
decltype(values)>>{
33 return mean(values, [](
const auto & value){
34 return static_cast<double>(value);
43 return std::ranges::fold_left(values, 0.0, [&](
double acc,
const auto & value) {
44 double diff_to_mean = std::invoke(valueMapper, value) - meanValue;
45 return acc + diff_to_mean * diff_to_mean;
50 return mean(values,valueMapper).
and_then([&](
double meanValue){
51 return var(values, valueMapper, meanValue);
55static Option<double> var(std::ranges::input_range
auto && values)
requires std::is_convertible_v<double,std::ranges::range_value_t<
decltype(values)>>{
56 return var(values, [](
const auto & value){
57 return static_cast<double>(value);
61static Option<double> var(std::ranges::input_range
auto && values,
double mean)
requires std::is_convertible_v<double,std::ranges::range_value_t<
decltype(values)>>{
62 return var(values, [](
const auto & value){
63 return static_cast<double>(value);
68 return var(values, valueMapper, meanValue).transform([](
double variance){
69 return sqrt(variance);
75 return mean(values,valueMapper).and_then([&](
double meanValue){
76 return std(values, valueMapper, meanValue);
80static Option<double> std(std::ranges::input_range
auto && values)
requires std::is_convertible_v<double,std::ranges::range_value_t<
decltype(values)>>{
81 return std(values, [](
const auto & value){
82 return static_cast<double>(value);
86static Option<double> std(std::ranges::input_range
auto && values,
double mean)
requires std::is_convertible_v<double,std::ranges::range_value_t<
decltype(values)>>{
87 return std(values, [](
const auto & value){
88 return static_cast<double>(value);
Option< typename std::remove_cvref_t< std::invoke_result_t< F, T > >::value_type > and_then(F &&f) const &
FlatMap the value of the Option if it has a value, otherwise return an empty Option.
Definition Option.hpp:52
Definition FunctionalConcepts.hpp:9
Definition NumericConcepts.hpp:4
static Option< double > avg(std::ranges::input_range auto &&values, fishnet::util::UnaryFunction< std::ranges::range_value_t< decltype(values)>, double > auto const &valueMapper)
Definition Statistics.hpp:28
static Option< double > var(std::ranges::input_range auto &&values, fishnet::util::UnaryFunction< std::ranges::range_value_t< decltype(values)>, double > auto const &valueMapper, double meanValue)
Definition Statistics.hpp:38
static Option< double > mean(std::ranges::input_range auto &&values, fishnet::util::UnaryFunction< std::ranges::range_value_t< decltype(values)>, double > auto const &valueMapper)
Definition Statistics.hpp:12
constexpr size_t size(std::ranges::range auto &&range) noexcept
Definition CollectionConcepts.hpp:50
constexpr bool isEmpty(std::ranges::range auto &&range) noexcept
Definition CollectionConcepts.hpp:59