GENEIAL  0.2=/
 All Classes Pages
FitnessProportionalSelection.h
1 #pragma once
2 
3 #include <geneial/core/operations/selection/BaseSelectionOperation.h>
4 #include <geneial/core/operations/selection/FitnessProportionalSelectionSettings.h>
5 #include <geneial/utility/mixins/EnableMakeShared.h>
6 
7 #include <stdexcept>
8 #include <memory>
9 
10 geneial_private_namespace(geneial)
11 {
12 geneial_private_namespace(operation)
13 {
14 geneial_private_namespace(selection)
15 {
16 using ::geneial::utility::EnableMakeShared;
17 
18 geneial_export_namespace
19 {
20 
24 template<typename FITNESS_TYPE>
25 class FitnessProportionalSelection: public BaseSelectionOperation<FITNESS_TYPE>,
26  public virtual EnableMakeShared<FitnessProportionalSelection<FITNESS_TYPE>>
27 {
28 private:
29  //TODO(bewo) this is ugly since it hides the fact that there are base class settings.
30  const std::shared_ptr<FitnessProportionalSelectionSettings> _settings;
31 
32 protected:
33  FitnessProportionalSelection(const std::shared_ptr<FitnessProportionalSelectionSettings>& settings) :
34  BaseSelectionOperation<FITNESS_TYPE>(settings), _settings(settings)
35  {
36  }
37 
38 public:
39 
40  virtual ~FitnessProportionalSelection()
41  {
42  }
43 
44  virtual typename BaseSelectionOperation<FITNESS_TYPE>::selection_result_set doSelect(
45  const Population<FITNESS_TYPE> &population, BaseManager<FITNESS_TYPE> &manager) const override;
46 
47 
48  class Builder : public BaseSelectionOperation<FITNESS_TYPE>::Builder
49  {
50 
51  public:
52  Builder() : BaseSelectionOperation<FITNESS_TYPE>::Builder(std::make_shared<FitnessProportionalSelectionSettings>())
53  {
54  }
55 
56  FitnessProportionalSelectionSettings& getSettings()
57  {
58  return *std::dynamic_pointer_cast<FitnessProportionalSelectionSettings>(this->_settings);
59  }
60 
61  typename BaseSelectionOperation<FITNESS_TYPE>::ptr create() override
62  {
63  auto settings = std::dynamic_pointer_cast<FitnessProportionalSelectionSettings>(this->_settings);
64  return FitnessProportionalSelection<FITNESS_TYPE>::makeShared(settings);
65  }
66 
67  };
68 
69 };
70 
71 } /* geneial_export_namespace */
72 } /* private namespace selection */
73 } /* private namespace operation */
74 } /* private namespace geneial */
75 
76 #include <geneial/core/operations/selection/FitnessProportionalSelection.hpp>
77