Ultra 0.9.4
Loading...
Searching...
No Matches
population.h
Go to the documentation of this file.
1
12
13#if !defined(ULTRA_POPULATION_H)
14#define ULTRA_POPULATION_H
15
16#include "kernel/individual.h"
17#include "kernel/random.h"
18
19#include <concepts>
20#include <ranges>
21#include <shared_mutex>
22
23namespace ultra
24{
25
29using population_uid = unsigned;
30
31template<class P>
33 std::ranges::random_access_range<P>
35
36template<class P>
37concept Population =
38 std::ranges::range<P>
40
41template<class P>
42concept LayeredPopulation = Population<P> && requires(P &p)
43{
44 { p.layers() } -> std::integral;
45 { p.range_of_layers() } -> std::ranges::range;
46 { p.back() };
47};
48
49template<class P>
52 && std::ranges::sized_range<P>
53 && std::ranges::random_access_range<P>
54 && requires(const P &p)
55{
56 typename P::coord;
57 p[typename P::coord()];
58};
59
60template<class P>
62 SizedRandomAccessPopulation<P> && requires(const P &p)
63{
64 p.mutex();
65};
66
67namespace random
68{
69
70template<SizedRandomAccessPopulation P>
71[[nodiscard]] typename P::coord coord(const P &p)
72{
73 Expects(p.size() > 0);
74 return static_cast<typename P::coord>(sup(p.size()));
75}
76
92template<SizedRandomAccessPopulation P>
93[[nodiscard]] typename P::coord
94coord(const P &p, std::size_t i, std::size_t mate_zone)
95{
96 Expects(i < p.size());
97 Expects(mate_zone); // non-zero after auto-tune
98
99 return static_cast<typename P::coord>(random::ring(i, mate_zone, p.size()));
100}
101
106template<PopulationWithMutex P>
107[[nodiscard]] std::ranges::range_value_t<P> individual(const P &p)
108{
109 std::shared_lock lock(p.mutex());
110 return p[random::coord(p)];
111}
112
113} // namespace random
114
115} // namespace ultra
116
117#endif // include guard
Definition individual.h:93
Definition population.h:42
Definition population.h:61
Definition population.h:37
Definition population.h:32
Definition population.h:50
unsigned population_uid
Definition population.h:29
std::ranges::range_value_t< P > individual(const P &p)
Definition population.h:107
std::size_t ring(std::size_t base, std::size_t radius, std::size_t n)
Definition random.cc:64