13#if !defined(ULTRA_SRC_SEARCH_H)
14# error "Don't include this file directly, include the specific .h instead"
17#if !defined(ULTRA_SRC_SEARCH_TCC)
18#define ULTRA_SRC_SEARCH_TCC
32[[nodiscard]] std::unique_ptr<basic_oracle> make_basic_oracle(P &&p)
34 using predictor_t = std::remove_cvref_t<P>;
36 if constexpr (std::derived_from<predictor_t, basic_oracle>)
37 return std::make_unique<predictor_t>(std::forward<P>(p));
39 else if constexpr (ClassificationPredictor<predictor_t>)
40 return std::make_unique<class_oracle_adaptor<predictor_t>>(std::forward<P>(p));
41 else if constexpr (RegressionPredictor<predictor_t>)
42 return std::make_unique<reg_oracle_adaptor<predictor_t>>(std::forward<P>(p));
49[[nodiscard]]
constexpr std::underlying_type_t<metric_flags> operator&(
50 metric_flags f1, metric_flags f2)
52 return std::to_underlying(f1) & std::to_underlying(f2);
63template<
template<
class>
class ES, Evaluator E>
64basic_search<ES, E>::basic_search(problem &p, metric_flags m)
65 :
ultra::basic_search<ES, E>(p, E(p.data)), metrics_(m)
67 Ensures(this->is_valid());
84template<
template<
class>
class ES,
Evaluator E>
87 const auto &eva_core(this->eva_.core());
89 if constexpr (
requires { eva_core.predictor(ind); })
90 return eva_core.predictor(ind);
98template<
template<
class>
class ES,
Evaluator E>
101 return static_cast<problem &
>(this->prob_);
116template<
template<
class>
class ES, Evaluator E>
117model_measurements<typename basic_search<ES, E>::fitness_t>
118basic_search<ES, E>::calculate_metrics(
const individual_t &prg)
const
121 const auto prg_predictor(predictor(prg));
123 if constexpr (ClassificationPredictor<
decltype(prg_predictor)>)
124 if ((metrics_ & metric_flags::accuracy) && prob().classification())
126 ret.accuracy = metrics::accuracy(prg_predictor, prob().data.selected());
160template<
template<
class>
class ES, Evaluator E>
165 const auto dflt(ES<E>::shape(
parameters().init()));
167 auto ¶ms(prob().params);
171 const auto constrained(params);
175 const auto d_size(prob().data.selected().size());
178 if (!constrained.population.init_subgroups)
180 if (dflt.population.init_subgroups > 1 && d_size > 8)
181 params.population.init_subgroups =
182 static_cast<std::size_t
>(std::log(d_size));
184 params.population.init_subgroups = dflt.population.init_subgroups;
186 ultraINFO(
"Number of layers set to {}", params.population.init_subgroups);
196 if (!constrained.population.individuals)
200 params.population.individuals =
201 2 *
static_cast<std::size_t
>(std::pow(std::log2(d_size), 3))
202 / params.population.init_subgroups;
205 params.population.individuals = dflt.population.individuals;
207 if (params.population.individuals < 4)
208 params.population.individuals = 4;
210 ultraINFO(
"Population size set to {}", params.population.individuals);
213 Ensures(params.is_valid(
true));
219template<
template<
class>
class ES,
Evaluator E>
225template<Indiv
idual P>
226search<P>::search(
problem &p, metric_flags m)
227 : engine_(make_engine(p, m)), prob_(p), classification_(p.classification())
231template<Indiv
idual P>
232typename search<P>::engine_t search<P>::make_engine(problem &p, metric_flags m)
234 if (p.classification())
235 return engine_t(std::in_place_type<class_search_t>, p, m);
237 return engine_t(std::in_place_type<reg_search_t>, p, m);
240template<Indiv
idual P>
243 return classification_ == prob_.classification();
253template<Indiv
idual P>
256 std::visit([&](
auto &s) { s.stop_source(ss); }, engine_);
271template<Indiv
idual P>
274 Expects(sl.is_valid());
276 std::visit([&](
auto &s) { s.logger(sl); }, engine_);
280template<Indiv
idual P>
281search<P> &search<P>::messages(
bool m)
noexcept
283 std::visit([&](
auto &s) { s.messages(m); }, engine_);
297template<Indiv
idual P>
300 std::visit([&](
auto &s) { s.tag(t); }, engine_);
304template<Indiv
idual P>
308 Expects(problem_type_unchanged());
310 return std::visit([&](
auto &s) {
return s.run(n, threshold); }, engine_);
359template<Indiv
idual P>
361search<P> &search<P>::refinement(F &&f)
363 using callback_t = std::remove_cvref_t<F>;
365 constexpr bool class_ok = std::is_invocable_r_v<
366 std::optional<fitness_t>, callback_t &, P &,
370 constexpr bool reg_ok = std::is_invocable_r_v<
371 std::optional<fitness_t>, callback_t &, P &,
375 static_assert(class_ok || reg_ok,
376 "Refinement callback is not compatible with available "
377 "evaluator signatures");
379 auto callback(std::forward<F>(f));
386 using search_t = std::remove_cvref_t<
decltype(s)>;
388 constexpr bool compatible =
389 (std::same_as<search_t, class_search_t> && class_ok)
390 || (std::same_as<search_t, reg_search_t> && reg_ok);
392 if constexpr (compatible)
393 s.refinement(callback);
416template<Indiv
idual P>
419 Expects(problem_type_unchanged());
422 [&](
const auto &s) {
return internal::make_basic_oracle(s.predictor(prg)); },
433template<Indiv
idual P>
436 std::visit([&](
auto &s) { s.after_generation(std::move(f)); }, engine_);
447template<Indiv
idual P>
450 std::visit([&](
auto &s) { s.on_training_new_best(std::move(f)); }, engine_);
460template<Indiv
idual P>
466 { s.template validation_strategy<V>(std::forward<Args>(args)...); },
search_stats< individual_t, fitness_t > run(unsigned=1, const model_measurements< fitness_t > &={})
Definition search.h:230
basic_search & logger(search_log &) noexcept
Definition search.h:92
basic_search & after_generation(after_generation_callback_t)
Definition search.h:166
virtual void tune_parameters()
Definition gp/src/search.tcc:161
basic_search & stop_source(std::stop_source)
Definition search.h:74
basic_search & tag(const std::string &)
Definition search.h:109
basic_search< alps_es, E > & validation_strategy(Args &&...args)
Definition search.h:309
virtual model_measurements< fitness_t > calculate_metrics(const individual_t &) const
Definition search.h:290
basic_search(problem &, E)
Definition search.h:28
basic_search & on_training_new_best(on_training_new_best_callback_t)
Definition search.h:181
virtual bool is_valid() const
Definition gp/src/search.tcc:220
Definition evaluator_proxy.h:45
Definition search_log.h:28
Definition search_stats.h:44
std::unique_ptr< basic_oracle > predictor(const P &) const
Definition gp/src/search.h:418
Definition evaluator.h:44
Definition validation_strategy.h:84
Definition gp/src/search.tcc:25
Definition model_measurements.h:28
Parameters controlling numerical optimisation of GP individuals.
Definition parameters.h:203
Definition parameters.h:26