Ultra 0.9.4
Loading...
Searching...
No Matches
analyzer.h
Go to the documentation of this file.
1
12
13#if !defined(ULTRA_ANALYZER_H)
14#define ULTRA_ANALYZER_H
15
16#include "kernel/distribution.h"
17#include "kernel/evaluator.h"
18#include "kernel/population.h"
19
20#include <concepts>
21#include <future>
22#include <numeric>
23#include <vector>
24
25namespace ultra
26{
27
28template<Individual I, Fitness F>
29struct group_stat
30{
31 explicit group_stat(population_uid);
33 void add(const I &, const F &);
34 void merge(group_stat);
35
37
39 distribution<F> fitness {};
40 distribution<double> length {};
41
42 std::map<int, unsigned> crossover_type {};
43};
44
49/// 1. the population set should be loaded adding one individual at time
50/// (analyzer::add method);
51/// 2. statistics can be checked calling specific methods.
52///
53/// You can get information about:
54/// - the set as a whole (`age_dist()`, `fit_dist()`, `length_dist()`);
55/// - grouped information (`age_dist(unsigned)`, `fit_dist(unsigned)`...).
56///
57template<Individual I, Fitness F>
58class analyzer
59{
60public:
61 analyzer() = default;
62 template<LayeredPopulation P, Evaluator E> explicit analyzer(
63 const P &, const E &);
64
65 void add(const I &, const F &, population_uid);
66
67 void clear();
68
69 [[nodiscard]] group_stat<I, F> overall_group_stat() const;
70
71 [[nodiscard]] distribution<double> age_dist() const;
72 [[nodiscard]] auto crossover_types() const;
73 [[nodiscard]] distribution<F> fit_dist() const;
74 [[nodiscard]] distribution<double> length_dist() const;
75
76 [[nodiscard]] const distribution<double> &age_dist(population_uid) const;
77 [[nodiscard]] const auto &crossover_types(population_uid) const;
78 [[nodiscard]] const distribution<F> &fit_dist(population_uid) const;
79 [[nodiscard]] const distribution<double> &length_dist(population_uid) const;
80
81 template<Population P> [[nodiscard]] const distribution<double> &age_dist(
82 const P &) const;
83 template<Population P> [[nodiscard]] const auto &crossover_types(
84 const P &) const;
85 template<Population P> [[nodiscard]] const distribution<F> &fit_dist(
86 const P &) const;
87 template<Population P> [[nodiscard]] const distribution<double> &length_dist(
88 const P &) const;
89
90 [[nodiscard]] bool is_valid() const;
91
92private:
93 [[nodiscard]] group_stat<I, F> *group(population_uid);
94 [[nodiscard]] const group_stat<I, F> *group(population_uid) const;
95
96 std::vector<group_stat<I, F>> group_stat_ {};
97}; // analyzer
98
99template<LayeredPopulation P, Evaluator E>
100analyzer(const P &, const E &) -> analyzer<typename P::value_type,
101 evaluator_fitness_t<E>>;
102
103#include "kernel/analyzer.tcc"
104
105} // namespace ultra
106
107#endif // include guard
distribution< double > age_dist() const
Definition analyzer.h:188
distribution< double > length_dist() const
Definition analyzer.h:268
group_stat< I, F > overall_group_stat() const
Definition analyzer.h:135
auto crossover_types() const
Definition analyzer.h:150
bool is_valid() const
Definition analyzer.h:307
distribution< F > fit_dist() const
Definition analyzer.h:228
void add(const I &, const F &, population_uid)
Definition analyzer.h:380
void clear()
Definition analyzer.h:107
Definition distribution.h:36
unsigned population_uid
Definition population.h:29
Definition analyzer.h:30
void add(const I &, const F &)
Definition analyzer.h:49