Fishnet 2.0.1
Framework for Graph-Based Analysis of GIS Vector Data
Loading...
Searching...
No Matches
Statistics.hpp
Go to the documentation of this file.
1#pragma once
2#include <cmath>
3#include <ranges>
4#include <algorithm>
7#include <fishnet/Option.hpp>
8#include <type_traits>
9
10namespace fishnet::math{
11
12static Option<double> mean(std::ranges::input_range auto && values, fishnet::util::UnaryFunction<std::ranges::range_value_t<decltype(values)>, double> auto const& valueMapper){
13 if(fishnet::util::isEmpty(values)){
14 return std::nullopt;
15 }
16 double count = static_cast<double>(fishnet::util::size(values));
17 return std::ranges::fold_left(values, 0.0, [&](double acc, const auto & value) {
18 return acc + std::invoke(valueMapper, value);
19 }) / count;
20}
21
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);
25 });
26}
27
28static Option<double> avg(std::ranges::input_range auto && values, fishnet::util::UnaryFunction<std::ranges::range_value_t<decltype(values)>, double> auto const& valueMapper){
29 return mean(values, valueMapper);
30}
31
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);
35 });
36}
37
38static 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){
39 if(fishnet::util::isEmpty(values)){
40 return std::nullopt;
41 }
42 double count = static_cast<double>(fishnet::util::size(values));
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;
46 }) / count;
47}
48
49static Option<double> var(std::ranges::input_range auto && values, fishnet::util::UnaryFunction<std::ranges::range_value_t<decltype(values)>, double> auto const& valueMapper){
50 return mean(values,valueMapper).and_then([&](double meanValue){
51 return var(values, valueMapper, meanValue);
52 });
53}
54
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);
58 });
59}
60
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);
64 }, mean);
65}
66
67static Option<double> std(std::ranges::input_range auto && values, fishnet::util::UnaryFunction<std::ranges::range_value_t<decltype(values)>, double> auto const& valueMapper, double meanValue){
68 return var(values, valueMapper, meanValue).transform([](double variance){
69 return sqrt(variance);
70 });
71}
72
73
74static Option<double> std(std::ranges::input_range auto && values, fishnet::util::UnaryFunction<std::ranges::range_value_t<decltype(values)>, double> auto const& valueMapper){
75 return mean(values,valueMapper).and_then([&](double meanValue){
76 return std(values, valueMapper, meanValue);
77 });
78}
79
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);
83 });
84}
85
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);
89 }, mean);
90}
91
92}// namespace fishnet::math
Definition Option.hpp:13
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
STL namespace.