13#if !defined(ULTRA_POPULATION_H)
14#define ULTRA_POPULATION_H
21#include <shared_mutex>
33 std::ranges::random_access_range<P>
44 { p.layers() } -> std::integral;
45 { p.range_of_layers() } -> std::ranges::range;
52 && std::ranges::sized_range<P>
53 && std::ranges::random_access_range<P>
54 &&
requires(
const P &p)
57 p[
typename P::coord()];
70template<SizedRandomAccessPopulation P>
71[[nodiscard]]
typename P::coord coord(
const P &p)
73 Expects(p.size() > 0);
74 return static_cast<typename P::coord
>(sup(p.size()));
92template<SizedRandomAccessPopulation P>
93[[nodiscard]]
typename P::coord
94coord(
const P &p, std::size_t i, std::size_t mate_zone)
96 Expects(i < p.size());
99 return static_cast<typename P::coord
>(
random::ring(i, mate_zone, p.size()));
106template<PopulationWithMutex P>
107[[nodiscard]] std::ranges::range_value_t<P>
individual(
const P &p)
109 std::shared_lock lock(p.mutex());
110 return p[random::coord(p)];
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