GENEIAL  0.2=/
 All Classes Pages
BaseCouplingOperation.h
1 #pragma once
2 
3 #include <geneial/namespaces.h>
4 #include <geneial/core/operations/coupling/CouplingSettings.h>
5 #include <geneial/core/operations/selection/BaseSelectionOperation.h>
6 #include <geneial/core/operations/crossover/BaseCrossoverOperation.h>
7 #include <geneial/core/population/management/BaseManager.h>
8 #include <geneial/utility/mixins/Buildable.h>
9 
10 geneial_private_namespace(geneial)
11 {
12 geneial_private_namespace(operation)
13 {
14 geneial_private_namespace(coupling)
15 {
16 using ::geneial::population::Population;
17 using ::geneial::operation::crossover::BaseCrossoverOperation;
18 using ::geneial::operation::selection::BaseSelectionOperation;
19 using ::geneial::population::management::BaseManager;
20 using ::geneial::utility::Buildable;
21 
22 geneial_export_namespace
23 {
24 
25 
26 template<typename FITNESS_TYPE>
27 class BaseCouplingOperation : public Buildable<BaseCouplingOperation<FITNESS_TYPE>>
28 {
29 
30 private:
31  std::shared_ptr<const CouplingSettings> _settings;
32 
33 protected:
34  explicit BaseCouplingOperation(const std::shared_ptr<const CouplingSettings> &settings) :
35  _settings(settings)
36  {
37  }
38 
39 public:
40  using offspring_result_set = typename Population<FITNESS_TYPE>::chromosome_container;
41 
42  virtual ~BaseCouplingOperation()
43  {
44  }
45 
46  virtual offspring_result_set doCopulate(
47  const typename BaseSelectionOperation<FITNESS_TYPE>::selection_result_set &mating_pool,
48  const BaseCrossoverOperation<FITNESS_TYPE> &crossoverOperation,
49  BaseManager<FITNESS_TYPE> &manager) = 0;
50 
51  CouplingSettings const & getSettings() const
52  {
53  return *_settings;
54  }
55 
56  void setSettings(const std::shared_ptr<const CouplingSettings> settings)
57  {
58  _settings = settings;
59  }
60 
61  class Builder: public Buildable<BaseCouplingOperation<FITNESS_TYPE>>::Builder
62  {
63 
64  protected:
65  std::shared_ptr<CouplingSettings> _settings;
66 
67  public:
68  Builder():_settings(std::make_shared<CouplingSettings>())
69  {
70  }
71 
72  Builder(const std::shared_ptr<CouplingSettings> &settings):_settings(settings)
73  {
74  }
75 
76  inline CouplingSettings& getSettings()
77  {
78  return *_settings;
79  }
80 
81  void setSettings(const std::shared_ptr<CouplingSettings>& settings)
82  {
83  _settings = settings;
84  }
85 
86  };
87 
88 protected:
89  typename offspring_result_set::size_type copyUnlessMaximumReached(
90  offspring_result_set &dest,
91  const typename BaseCrossoverOperation<FITNESS_TYPE>::crossover_result_set &input,
92  const typename BaseCrossoverOperation<FITNESS_TYPE>::crossover_result_set::size_type limit) const;
93 
94 };
95 
96 } /* geneial_export_namespace */
97 } /* private namespace coupling */
98 } /* private namespace operation */
99 } /* private namespace geneial */
100 
101 
102 #include <geneial/core/operations/coupling/BaseCouplingOperation.hpp>