13#if !defined(ULTRA_SEARCH_LOG_H)
14# error "Don't include this file directly, include the specific .h instead"
17#if !defined(ULTRA_SEARCH_LOG_TCC)
18#define ULTRA_SEARCH_LOG_TCC
20template<Indiv
idual I, Fitness F>
21void search_log::save_dynamic(
const summary<I, F> &sum,
22 const distribution<F> &fit_dist)
24 if (!dynamic_file.is_open())
27 if (sum.generation == 0)
28 dynamic_file <<
"\n\n";
30 dynamic_file << sum.generation;
32 const auto best(sum.best());
36 dynamic_file <<
' ' << best.fit;
38 const auto length_dist(sum.az.length_dist());
39 dynamic_file <<
' ' << fit_dist.mean()
40 <<
' ' << fit_dist.standard_deviation()
41 <<
' ' << fit_dist.min()
42 <<
' ' <<
static_cast<unsigned>(length_dist.mean())
43 <<
' ' << length_dist.standard_deviation()
44 <<
' ' <<
static_cast<unsigned>(length_dist.max());
47 for (
bool first(
true);
const auto &[k, v] : sum.az.crossover_types())
53 dynamic_file << k <<
':' << v;
60 dynamic_file <<
" \"" << out::in_line << best.ind <<
'"';
62 dynamic_file <<
'\n' << std::flush;
66void search_log::save_population(
unsigned generation,
67 const distribution<F> &fit_dist)
69 if (!population_file.is_open())
73 population_file <<
"\n\n";
75 population_file << generation;
77 for (
const auto &[fit, freq] : fit_dist.seen())
78 population_file <<
' ' << std::fixed << std::scientific << fit <<
' '
81 population_file <<
'\n' << std::flush;
90template<Population P, Fitness F>
91void search_log::save_layers(
92 const P &pop,
const summary<std::ranges::range_value_t<P>, F> &sum)
94 if (!layers_file.is_open())
97 const auto ¶ms(pop.problem().params);
99 if (sum.generation == 0)
100 layers_file <<
"\n\n";
102 layers_file << sum.generation;
104 const auto layers(pop.layers());
105 for (std::size_t l(0); l < layers; ++l)
109 if (
const auto ma(params.alps.max_age(l, layers));
110 ma == std::numeric_limits<
decltype(ma)>::max())
113 layers_file << ma + 1;
115 const auto ¤t_layer(pop.layer(l));
117 const auto &age_dist(sum.az.age_dist(current_layer));
118 const auto &fit_dist(sum.az.fit_dist(current_layer));
120 layers_file <<
' ' << age_dist.mean()
121 <<
' ' << age_dist.standard_deviation()
122 <<
' ' <<
static_cast<unsigned>(age_dist.min())
123 <<
' ' <<
static_cast<unsigned>(age_dist.max())
124 <<
' ' << fit_dist.mean()
125 <<
' ' << fit_dist.standard_deviation()
126 <<
' ' << fit_dist.min()
127 <<
' ' << fit_dist.max()
128 <<
' ' << current_layer.size();
131 layers_file <<
'\n' << std::flush;
153template<Population P, Fitness F>
155 const P &pop,
const summary<std::ranges::range_value_t<P>, F> &sum)
162 const auto fit_dist(sum.az.fit_dist());
164 save_dynamic(sum, fit_dist);
165 save_population(sum.generation, fit_dist);
166 save_layers(pop, sum);
169template<Indiv
idual I, Fitness F>
void search_log::save_summary(
176 tinyxml2::XMLPrinter doc;
179 xml_closer ultra_e(doc,
"ultra");
182 xml_closer summary_e(doc,
"summary");
184 set_text(doc,
"runs", stats.
runs());
185 set_text(doc,
"elapsed_time", stats.
elapsed.count());
186 set_text(doc,
"success_rate", stats.
success_rate(threshold));
189 xml_closer distributions_e(doc,
"distributions");
192 xml_closer fitness_e(doc,
"fitness");
194 set_text(doc,
"standard_deviation",
200 xml_closer best_e(doc,
"best");
205 set_text(doc,
"run", stats.
best_run());
207 std::ostringstream ss;
209 set_text(doc,
"code", ss.str());
213 xml_closer solutions_e(doc,
"solutions");
214 for (
const auto good_runs(stats.
good_runs(threshold));
215 const auto &gr : good_runs)
216 set_text(doc,
"run", gr);
220 constexpr double perc(0.05);
222 xml_closer elite_e(doc,
"elite");
223 set_attr(doc,
"percentile", perc * 100.0);
226 xml_closer run_summary_e(doc,
"run");
227 set_attr(doc,
"id", e.run);
229 if (e.best_measurements.fitness)
230 set_text(doc,
"fitness", *e.best_measurements.fitness);
231 if (e.best_measurements.accuracy)
232 set_text(doc,
"accuracy", *e.best_measurements.accuracy);
237 set_text(doc,
"checksum",
"00000000");
240 const std::string base_xml(doc.CStr());
241 const std::string signed_xml(ultra::crc32::embed_xml_signature(base_xml));
243 if (std::ofstream
out(build_path(summary_file_path), std::ios::binary);
out)
244 out.write(signed_xml.data(),
245 static_cast<std::streamsize
>(signed_xml.size()));
T mean() const noexcept
Definition distribution.h:72
std::filesystem::path population_file_path
Definition search_log.h:65
std::filesystem::path dynamic_file_path
Definition search_log.h:51
void save_snapshot(const P &, const summary< std::ranges::range_value_t< P >, F > &)
Definition search_log.h:155
std::filesystem::path layers_file_path
Definition search_log.h:57
Definition search_stats.h:44
std::set< std::size_t > good_runs(const model_measurements< F > &) const
Definition search_stats.h:90
double success_rate(const model_measurements< F > &) const noexcept
Definition search_stats.h:170
const I & best_individual() const noexcept
Definition search_stats.h:130
distribution< F > fitness_distribution
Definition search_stats.h:71
std::chrono::milliseconds elapsed
Definition search_stats.h:76
std::size_t best_run() const noexcept
Definition search_stats.h:118
std::size_t runs() const noexcept
Definition search_stats.h:153
std::span< const run_summary > elite_runs(double=0.05) const noexcept
Definition search_stats.h:199
const model_measurements< F > & best_measurements() const noexcept
Definition search_stats.h:143
Definition evolution_summary.h:33
Definition model_measurements.h:28