13#if !defined(ULTRA_VECTOR_INDIVIDUAL_H)
14# error "Don't include this file directly, include the specific .h instead"
17#if !defined(ULTRA_VECTOR_INDIVIDUAL_TCC)
18#define ULTRA_VECTOR_INDIVIDUAL_TCC
29vector_individual<T>::vector_individual(std::size_t n) : genome_(n)
31 Expects(parameters());
44 : vector_individual(p.sset.categories())
46 static_assert(std::same_as<T, D_INT> || std::same_as<T, D_DOUBLE>);
48 std::ranges::generate(
63typename vector_individual<T>::const_iterator
64vector_individual<T>::begin() const noexcept
66 return genome_.begin();
73typename vector_individual<T>::const_iterator
74vector_individual<T>::end() const noexcept
85const typename vector_individual<T>::value_type &
86vector_individual<T>::operator[](std::size_t i)
const
88 Expects(i < parameters());
96vector_individual<T>::operator
const std::vector<T> &()
const noexcept
111requires std::invocable<F &, T &>
112 && std::same_as<std::invoke_result_t<F &, T &>,
void>
115 Expects(first <= last);
118 for (
auto i(first); i < last; ++i)
119 std::invoke(std::forward<F>(f), genome_[i]);
133requires std::invocable<F &, T &>
134 && std::same_as<std::invoke_result_t<F &, T &>,
void>
150 Expects(empty() || v.size() == size());
163bool vector_individual<T>::empty() const noexcept
165 return genome_.empty();
172std::size_t vector_individual<T>::parameters() const noexcept
181std::size_t vector_individual<T>::size() const noexcept
183 return genome_.size();
192hash_t vector_individual<T>::hash()
const
194 const auto len(genome_.size() *
sizeof(genome_[0]));
207bool operator==(
const vector_individual<T> &lhs,
208 const vector_individual<T> &rhs)
noexcept
210 return std::ranges::equal(lhs, rhs);
221std::size_t active_slots(
const vector_individual<T> &ind)
noexcept
223 return ind.parameters();
230bool vector_individual<T>::is_valid()
const
232 const auto expected(hash());
233 if (signature() == expected)
236 ultraERROR(
"Wrong signature: {} should be {}",
237 internal::streamed(signature()),
238 internal::streamed(expected));
250bool vector_individual<T>::load_impl(std::istream &in,
const symbol_set &ss)
259 if constexpr (std::same_as<T, D_DOUBLE>)
261 if (!load_float_from_stream(in, &g))
264 else if constexpr (std::same_as<T, value_t>)
266 if (!ultra::load(in, ss, g))
273 genome_ = std::move(v);
284bool vector_individual<T>::save_impl(std::ostream &
out)
const
286 out << parameters() <<
'\n';
287 for (
const auto &g : genome_)
289 if constexpr (std::same_as<T, D_DOUBLE>)
290 save_float_to_stream(
out, g);
291 else if constexpr (std::same_as<T, value_t>)
static hash_t hash128(const void *const, std::size_t, std::uint32_t=1973) noexcept
Definition hash_t.h:273
value_t roulette_terminal(symbol::category_t=symbol::default_category) const
Definition symbol_set.cc:388
Definition vector_individual.h:38
hash_t hash() const override
Definition vector_individual.h:193
std::size_t parameters() const noexcept
Definition vector_individual.h:173
void apply_each(std::size_t first, std::size_t last, F &&f)
Definition vector_individual.tcc:113
bool is_valid() const
Definition vector_individual.h:231
void apply_each(std::size_t, std::size_t, F &&)
Definition vector_individual.h:114
vector_individual & operator=(const std::vector< T > &)
Definition vector_individual.h:149
std::size_t size() const noexcept
Definition vector_individual.h:182
bool save(std::ostream &out, F f)
Definition fitness.h:151