13#if !defined(ULTRA_TEAM_H)
14# error "Don't include this file directly, include the specific .h instead"
17#if !defined(ULTRA_TEAM_TCC)
24team<I>::team(std::size_t n)
26 Expects(n <= max_team_size);
28 individuals_.resize(n);
38team<I>::team(
const problem &p)
40 Expects(p.params.team.individuals);
41 Expects(p.params.team.individuals <= max_team_size);
43 auto n(p.params.team.individuals);
44 individuals_.reserve(n);
46 for (std::size_t i(0); i < n; ++i)
47 individuals_.emplace_back(p);
60team<I>::team(std::vector<I> v) : individuals_(
std::move(v))
79unsigned team<I>::mutation(
const problem &prb,
double temperature)
87 for (
auto &i : individuals_)
88 nm += i.mutation(prb, temperature);
108template<Indiv
idual I>
109team<I> crossover(
const problem &prb,
const team<I> &lhs,
const team<I> &rhs)
111 Expects(lhs.size() == rhs.size());
113 std::vector<I> crossed;
114 crossed.reserve(lhs.size());
116 std::ranges::transform(
117 lhs, rhs, std::back_inserter(crossed),
118 [&prb](
const auto &i1,
const auto &i2) {
return crossover(prb, i1, i2); });
120 return team(std::move(crossed));
136template<Indiv
idual I>
141 for (std::size_t i(0); i < t.size(); ++i)
145 for (std::size_t j(0); j < i_dv.size(); ++j)
147 const auto &e(i_dv.coords[j]);
148 ret.values.push_back(i_dv.values[j]);
149 ret.coords.push_back({{i, e.coord.loc, e.coord.arg_index}, e.kind});
153 Ensures(ret.is_valid());
177template<Indiv
idual I>
178void team<I>::apply_decision_vector(
const team_decision_vector &v)
180 Expects(v.is_valid());
184 std::vector<ind_dv_t> per_ind(size());
186 for (
auto &&[value, c] : std::views::zip(v.values, v.coords))
188 Expects(c.coord.ind_index < size());
190 auto &ind_v(per_ind[c.coord.ind_index]);
191 ind_v.values.push_back(value);
192 ind_v.coords.push_back({{c.coord.loc, c.coord.arg_index}, c.kind});
195 for (std::size_t i(0); i < size(); ++i)
196 if (!per_ind[i].empty())
197 individuals_[i].apply_decision_vector(per_ind[i]);
206template<Indiv
idual I>
207typename team<I>::const_iterator team<I>::begin() const noexcept
209 return individuals_.begin();
215template<Indiv
idual I>
216typename team<I>::const_iterator team<I>::end() const noexcept
218 return individuals_.end();
225template<Indiv
idual I>
226const I &team<I>::operator[](std::size_t i)
const
229 return individuals_[i];
235template<Indiv
idual I>
236bool team<I>::empty() const noexcept
238 return individuals_.empty();
244template<Indiv
idual I>
245std::size_t team<I>::size() const noexcept
247 return individuals_.size();
261template<Indiv
idual I>
unsigned active_slots(
const team<I> &t)
263 return std::accumulate(t.begin(), t.end(), 0u,
264 [](
unsigned n,
const I &ind)
266 return n + active_slots(ind);
284template<Indiv
idual I>
285hash_t team<I>::signature() const noexcept
294template<Indiv
idual I>
295hash_t team<I>::hash()
const
299 for (
const auto &i : individuals_)
300 ret.combine(i.signature());
315template<Indiv
idual I>
316bool operator==(
const team<I> &lhs,
const team<I> &rhs)
noexcept
318 return std::ranges::equal(lhs, rhs);
329template<Indiv
idual I>
330unsigned distance(
const team<I> &lhs,
const team<I> &rhs)
332 Expects(lhs.size() == rhs.size());
334 return std::inner_product(lhs.begin(), lhs.end(), rhs.begin(), 0u,
336 [](
const auto &i1,
const auto &i2)
338 return distance(i1, i2);
345template<Indiv
idual I>
346ultra::individual::age_t team<I>::age()
const
351 using age_t = ultra::individual::age_t;
353 const unsigned age_sum(std::accumulate(
354 begin(), end(),
static_cast<age_t
>(0),
355 [](age_t sum,
const I &i)
357 return sum + i.age();
360 return age_sum / size();
368template<Indiv
idual I>
369void team<I>::inc_age(
unsigned delta)
371 for (
auto &i : individuals_)
378template<Indiv
idual I>
379bool team<I>::is_valid()
const
381 if (size() > max_team_size)
384 if (std::ranges::any_of(individuals_,
385 [](
const I &i) {
return !i.is_valid(); }))
388 return signature_ == hash();
399template<Indiv
idual I>
400bool team<I>::load(std::istream &in,
const symbol_set &ss)
403 if (!(in >> n) || n > max_team_size)
406 decltype(individuals_) v;
409 for (std::size_t j(0); j < n; ++j)
415 v.push_back(std::move(i));
418 individuals_ = std::move(v);
430template<Indiv
idual I>
431bool team<I>::save(std::ostream &
out)
const
433 out << size() <<
'\n';
437 if (std::ranges::any_of(*
this,
438 [&](
const I &i) {
return !i.save(
out); }))
451template<Indiv
idual I>
452std::ostream &operator<<(std::ostream &s,
const team<I> &t)
454 const auto format(out::print_format_flag(s));
456 for (
const auto &i : t)
458 if (format == out::in_line_f)
463 if (format == out::in_line_f)
double distance(F f1, F f2)
Definition fitness.tcc:117
decision_vector extract_decision_vector(const individual &ind)
Definition gp/individual.cc:394
std::remove_cvref_t< decltype(extract_decision_vector(std::declval< const I & >()))> decision_vector_t
Concrete decision-vector type associated with I.
Definition decision_vector.h:91
ultra::decision_vector< team_decision_coordinate > team_decision_vector
Team-specific decision-vector type used for numerical optimisation.
Definition team.h:41