3 #include <geneial/algorithm/criteria/StatefulStoppingCriterion.h>
7 geneial_private_namespace(geneial)
9 geneial_private_namespace(algorithm)
11 geneial_private_namespace(stopping_criteria)
13 using ::geneial::population::management::BaseManager;
15 geneial_export_namespace
20 template<
typename FITNESS_TYPE>
21 class ConsecutiveDecorator:
public StatefulStoppingCriterion<FITNESS_TYPE>
25 using criterion = BaseStoppingCriterion<FITNESS_TYPE>;
27 ConsecutiveDecorator(
const unsigned int windowSize,
const unsigned int consecutiveHits,
28 const std::shared_ptr<criterion> & criterion) :
29 _criterion(criterion), _windowSize(windowSize), _consecutiveHits(consecutiveHits)
31 assert(windowSize >= 1);
32 assert(consecutiveHits > 0);
33 assert(windowSize >= consecutiveHits);
36 virtual ~ConsecutiveDecorator()
40 virtual bool wasStatefullyReached(BaseManager<FITNESS_TYPE> &manager)
42 updateWindowValues(manager);
46 std::deque<bool>::iterator it = _window.begin();
48 unsigned int count = 0;
49 while (it != _window.end())
57 if (count >= _consecutiveHits)
66 void inline updateWindowValues(BaseManager<FITNESS_TYPE> &manager)
68 assert(_window.size() <= _windowSize);
69 _window.push_front(_criterion->wasReached(manager));
71 while (_window.size() > _windowSize)
75 assert(_window.size() <= _windowSize);
78 virtual void print(std::ostream& os)
const
80 os <<
"Consecutive (criterion:" << *_criterion <<
", win: " << _windowSize <<
")";
83 const criterion& getCriterion()
const
88 void setCriterion(
const std::shared_ptr<criterion> & criterion)
90 _criterion = criterion;
94 std::shared_ptr<criterion> _criterion;
95 const unsigned int _windowSize;
96 const unsigned int _consecutiveHits;
97 std::deque<bool> _window;