3 #include <geneial/algorithm/criteria/BaseStoppingCriterion.h>
8 geneial_private_namespace(geneial)
10 geneial_private_namespace(algorithm)
12 geneial_private_namespace(stopping_criteria)
14 using ::geneial::population::management::BaseManager;
16 geneial_export_namespace
22 template<
typename FITNESS_TYPE>
23 class CombinedCriterion:
public BaseStoppingCriterion<FITNESS_TYPE>
31 typedef typename BaseStoppingCriterion<FITNESS_TYPE>::ptr criterion;
33 typedef std::pair<glue, criterion> glue_criterion_pair;
35 typedef std::vector<glue_criterion_pair> container;
37 virtual ~CombinedCriterion()
47 virtual bool wasReached(BaseManager<FITNESS_TYPE> &manager)
49 bool accumulatedResult =
true;
51 assert(std::count_if(_criteria.begin(), _criteria.end(), [](glue_criterion_pair
const &b)
53 return b.first == INIT;
54 }) == 1 &&
"INIT type not found or there are more than one INIT glue for combined criterion!");
56 for (
const auto &criterionPair : _criteria)
58 if (criterionPair.first == INIT)
60 accumulatedResult = criterionPair.second->wasReached(manager);
62 else if (criterionPair.first == AND)
64 accumulatedResult &= criterionPair.second->wasReached(manager);
66 else if (criterionPair.first == XOR)
68 accumulatedResult &= !criterionPair.second->wasReached(manager);
72 accumulatedResult |= criterionPair.second->wasReached(manager);
75 return accumulatedResult;
78 virtual void print(std::ostream& os)
const
81 for (
const auto &criterionPair : _criteria)
83 if (criterionPair.first == AND)
87 else if (criterionPair.first == XOR)
95 os << criterionPair.second;
100 void add(
const glue_criterion_pair newCriterion)
102 _criteria.emplace_back(newCriterion);
105 void add(
const glue glue,
const criterion criterion)
107 add(glue_criterion_pair(glue, criterion));
110 const container& getCriteria()
const
115 void setCriteria(
const container& criteria)
117 _criteria = criteria;