Ultra 0.9.4
Loading...
Searching...
No Matches
vector_individual.h
Go to the documentation of this file.
1
12
13#if !defined(ULTRA_VECTOR_INDIVIDUAL_H)
14#define ULTRA_VECTOR_INDIVIDUAL_H
15
16#include "kernel/individual.h"
17#include "kernel/problem.h"
18#include "utility/log.h"
19#include "utility/misc.h"
20
21#include <concepts>
22#include <functional>
23#include <utility>
24
25namespace ultra
26{
27
30///
31/// \tparam T gene value type
32///
33/// Shares genome access, signature maintenance and serialisation. Derived
34/// classes define evolutionary operators.
35///
36template<class T>
37class vector_individual : public individual
38{
39public:
40 static_assert(std::same_as<T, D_INT>
41 || std::same_as<T, D_DOUBLE>
42 || std::same_as<T, value_t>,
43 "Unsupported gene type");
45 // ---- Member types ----
46 using genome_t = std::vector<T>;
47 using const_iterator = genome_t::const_iterator;
48 using iterator = genome_t::iterator;
49 using value_type = genome_t::value_type;
50
51 // ---- Iterators ----
52 [[nodiscard]] const_iterator begin() const noexcept;
53 [[nodiscard]] const_iterator end() const noexcept;
54
55 // ---- Element access ----
56 [[nodiscard]] const value_type &operator[](std::size_t) const;
57
58 // ---- Modifiers ----
59 vector_individual &operator=(const std::vector<T> &);
60
61 // ---- Capacity ----
62 [[nodiscard]] bool empty() const noexcept;
63 [[nodiscard]] std::size_t size() const noexcept;
64 [[nodiscard]] std::size_t parameters() const noexcept;
66 // ---- Misc ----
67 [[nodiscard]] operator const std::vector<T> &() const noexcept;
68
69 [[nodiscard]] bool is_valid() const;
70
71protected:
72 // ---- Constructors ----
73 vector_individual() = default;
74 explicit vector_individual(std::size_t);
75 explicit vector_individual(const ultra::problem &);
76
77 // ---- Modifiers ----
78 template<class F>
79 requires std::invocable<F &, T &>
80 && std::same_as<std::invoke_result_t<F &, T &>, void>
81 void apply_each(std::size_t, std::size_t, F &&);
82
83 template<class F>
84 requires std::invocable<F &, T &>
85 && std::same_as<std::invoke_result_t<F &, T &>, void>
86 void apply_each(F &&);
88 // ---- Support methods ----
89 [[nodiscard]] hash_t hash() const override;
90
91 // This is the genome: the entire collection of genes (the entirety of an
92 // organism's hereditary information).
93 genome_t genome_;
94
95private:
96 // ---- Serialisation ----
97 [[nodiscard]] bool load_impl(std::istream &, const symbol_set &) override;
98 [[nodiscard]] bool save_impl(std::ostream &) const override;
99}; // class vector_individual
100
101// ---- Non-member functions ----
102template<class T> [[nodiscard]] bool operator==(
103 const vector_individual<T> &, const vector_individual<T> &) noexcept;
104template<class T> [[nodiscard]] std::size_t active_slots(
105 const vector_individual<T> &) noexcept;
106
107#include "kernel/vector_individual.tcc"
108
109} // namespace ultra
110
111#endif // include guard
void apply_each(std::size_t, std::size_t, F &&)
Definition vector_individual.h:114
Definition individual.h:54
Definition symbol_set.h:115
hash_t hash() const override
Definition vector_individual.h:193
std::size_t parameters() const noexcept
Definition vector_individual.h:173
bool empty() const noexcept
Definition vector_individual.h:164
bool is_valid() const
Definition vector_individual.h:231
const_iterator begin() const noexcept
Definition vector_individual.h:65
std::size_t active_slots(const vector_individual< T > &ind) noexcept
Definition vector_individual.h:222
const_iterator end() const noexcept
Definition vector_individual.h:75
std::size_t size() const noexcept
Definition vector_individual.h:182
STL namespace.
Definition hash_t.h:34
Definition problem.h:26