GENEIAL  0.2=/
 All Classes Pages
LambdaChoosingAdapter.h
1 #pragma once
2 
3 #include <geneial/namespaces.h>
4 #include <geneial/core/operations/choosing/BaseChoosingOperation.h>
5 
6 #include <geneial/utility/mixins/Buildable.h>
7 #include <geneial/utility/mixins/EnableMakeShared.h>
8 
9 geneial_private_namespace(geneial)
10 {
11 geneial_private_namespace(operation)
12 {
13 geneial_private_namespace(choosing)
14 {
15 using ::geneial::population::Population;
16 using ::geneial::utility::EnableMakeShared;
17 
18 geneial_export_namespace
19 {
20 
21 
22 template<typename FITNESS_TYPE>
23 class LambdaChoosingAdapter: public BaseChoosingOperation<FITNESS_TYPE>,
24  public EnableMakeShared<LambdaChoosingAdapter<FITNESS_TYPE>>
25 {
26 public:
27  using input_set = typename Population<FITNESS_TYPE>::chromosome_container;
28  using output_set = typename Population<FITNESS_TYPE>::chromosome_container;
29  using function_type = typename std::function<output_set(const input_set&)>;
30 
31  virtual ~LambdaChoosingAdapter()
32  {
33  }
34 
35  virtual output_set doChoose(const input_set&chromosomeInputSet) const override
36  {
37  return _function(chromosomeInputSet);
38  }
39 
40  class Builder: public BaseChoosingOperation<FITNESS_TYPE>::Builder
41  {
42  private:
43  function_type _function;
44  public:
45  const constexpr static double DEFAULT_PROBABILITY = 0.1;
46 
47  Builder(function_type func) :
48  BaseChoosingOperation<FITNESS_TYPE>::Builder(), _function(func)
49  {
50  }
51 
52  virtual typename BaseChoosingOperation<FITNESS_TYPE>::ptr create() override
53  {
54  return LambdaChoosingAdapter<FITNESS_TYPE>::makeShared(_function);
55  }
56 
57  const function_type& getFunction() const
58  {
59  return _function;
60  }
61 
62  Builder& setFunction(const function_type& function)
63  {
64  _function = function;
65  return *this;
66  }
67  };
68 private:
69  function_type _function;
70 protected:
71  explicit LambdaChoosingAdapter(const function_type& function) :
72  BaseChoosingOperation<FITNESS_TYPE>(),
73  _function(function)
74  {
75  }
76 };
77 
78 } /* geneial_export_namespace */
79 } /* private namespace choosing */
80 } /* private namespace operation */
81 } /* private namespace geneial */
82 
83 
84 #include <geneial/core/operations/choosing/ChooseRandom.hpp>
85