GENEIAL  0.2=/
 All Classes Pages
BaseGeneticAlgorithm.hpp
1 #pragma once
2 
3 #include <geneial/algorithm/BaseGeneticAlgorithm.h>
4 
5 #include <iterator>
6 #include <set>
7 
8 geneial_private_namespace(geneial)
9 {
10 geneial_private_namespace(algorithm)
11 {
12 geneial_export_namespace
13 {
14 
15 template<typename FITNESS_TYPE>
16 inline bool BaseGeneticAlgorithm<FITNESS_TYPE>::wasCriteriaReached() //TODO(bewo) Rethink about constness of this
17 {
18  const bool wasReached = _stoppingCriterion->wasReached(*_manager);
19  if (wasReached)
20  {
21  notifyObservers(AlgorithmObserver<FITNESS_TYPE>::CRITERIA_REACHED);
22  }
23  return wasReached;
24 }
25 
26 template<typename FITNESS_TYPE>
27 inline void BaseGeneticAlgorithm<FITNESS_TYPE>::notifyObservers(typename AlgorithmObserver<FITNESS_TYPE>::ObserveableEvent event)
28 {
29  typename observers_map::const_iterator lb = _observers.lower_bound(event);
30 
31  if (lb != _observers.end() && !(_observers.key_comp()(event, lb->first)))
32  {
33  switch (event)
34  {
35 
36  case AlgorithmObserver<FITNESS_TYPE>::AFTER_GENERATION:
37  {
38  for (const auto& it : lb->second)
39  {
40  it->updateAfterGeneration(*_manager);
41  }
42  break;
43  }
44 
45  case AlgorithmObserver<FITNESS_TYPE>::BEFORE_GENERATION:
46  {
47  for (const auto& it : lb->second)
48  {
49  it->updateBeforeGeneration(*_manager);
50  }
51  break;
52  }
53  case AlgorithmObserver<FITNESS_TYPE>::CRITERIA_REACHED:
54  {
55  for (const auto& it : lb->second)
56  {
57  it->updateCriteriaReached(*_manager, *_stoppingCriterion);
58  }
59  break;
60  }
61  }
62  }
63 }
64 
65 template<typename FITNESS_TYPE>
66 inline void BaseGeneticAlgorithm<FITNESS_TYPE>::registerObserver(const std::shared_ptr<AlgorithmObserver<FITNESS_TYPE>> &observer)
67 {
68  typedef std::set<typename AlgorithmObserver<FITNESS_TYPE>::ObserveableEvent> setType;
69  const setType events = observer->getSubscribedEvents();
70  for (const auto &it :events)
71  {
72 
73  typename observers_map::iterator lb = _observers.lower_bound(it);
74 
75  if (lb != _observers.end() && !(_observers.key_comp()(it, lb->first)))
76  {
77  // key already exists
78  // update lb->second if you care to
79  lb->second.emplace_back(observer);
80  }
81  else
82  {
83  // the key does not exist in the map
84  // add it to the map
85  typename std::vector<std::shared_ptr<AlgorithmObserver<FITNESS_TYPE>>> list;
86  list.emplace_back(observer);
87  _observers.insert(lb, typename observers_map::value_type(it, list)); // Use lb as a hint to insert,
88  }
89 
90  }
91 
92 }
93 
94 } /* geneial_export_namespace */
95 } /* private namespace algorithm */
96 } /* private namespace geneial */