13#if !defined(ULTRA_EVOLUTION_SUMMARY_H)
14# error "Don't include this file directly, include the specific .h instead"
17#if !defined(ULTRA_EVOLUTION_SUMMARY_TCC)
18#define ULTRA_EVOLUTION_SUMMARY_TCC
23template<Indiv
idual I, Fitness F>
24void summary<I, F>::clear()
38template<Indiv
idual I, Fitness F>
39evolution_status<I, F> summary<I, F>::starting_status()
41 return evolution_status<I, F>(&generation,
42 [
this](scored_individual<I, F> prg)
44 update_if_better(prg);
68template<Indiv
idual I, Fitness F>
69summary<I, F> &summary<I, F>::on_new_best(on_new_best_callback_t f)
73 std::lock_guard lock(mutex_);
75 Expects(elapsed == std::chrono::milliseconds(0));
77 Expects(data_.best.empty());
78 Expects(!data_.last_improvement);
80 on_new_best_callback_ = std::move(f);
84template<Indiv
idual I, Fitness F>
85typename summary<I, F>::data summary<I, F>::data_snapshot()
const
87 std::lock_guard lock(mutex_);
97template<Indiv
idual I, Fitness F>
98bool summary<I, F>::update_if_better(scored_individual<I, F> prg)
100 on_new_best_callback_t callback(
nullptr);
101 bool improved(
false);
103 if (std::lock_guard lock(mutex_); prg > data_.best)
106 data_.last_improvement = generation;
107 callback = on_new_best_callback_;
126template<Indiv
idual I, Fitness F>
127void summary<I, F>::set_best_fitness(F fit)
131 std::lock_guard lock(mutex_);
132 Expects(!data_.best.empty());
133 data_.best.fit = std::move(fit);
136template<Indiv
idual I, Fitness F>
137unsigned summary<I, F>::stagnation()
const
139 return generation - last_improvement();
145template<Indiv
idual I, Fitness F>
146scored_individual<I, F> summary<I, F>::best()
const
148 return data_snapshot().best;
154template<Indiv
idual I, Fitness F>
155unsigned summary<I, F>::last_improvement()
const
157 return data_snapshot().last_improvement;
170template<Indiv
idual I, Fitness F>
171bool summary<I, F>::load(std::istream &in,
const problem &p)
175 std::chrono::milliseconds tmp_elapsed;
176 if (
int ms; !(in >> ms))
179 tmp_elapsed = std::chrono::milliseconds(ms);
181 unsigned tmp_generation;
182 if (!(in >> tmp_generation))
185 struct data tmp_data;
187 if (!(in >> tmp_data.last_improvement))
190 if (!tmp_data.best.load(in, p))
193 elapsed = tmp_elapsed;
194 generation = tmp_generation;
206template<Indiv
idual I, Fitness F>
207bool summary<I, F>::save(std::ostream &
out)
const
209 const auto snapshot(data_snapshot());
213 out << elapsed.count() <<
' ' << generation <<
' '
214 << snapshot.last_improvement <<
'\n';
219 if (!snapshot.best.save(
out))