GENEIAL  0.2=/
 All Classes Pages
LambdaCouplingAdapter.h
1 #pragma once
2 
3 #include <geneial/namespaces.h>
4 #include <geneial/core/operations/coupling/BaseCouplingOperation.h>
5 #include <geneial/utility/mixins/EnableMakeShared.h>
6 
7 geneial_private_namespace(geneial)
8 {
9 geneial_private_namespace(operation)
10 {
11 geneial_private_namespace(coupling)
12 {
13 using ::geneial::population::Population;
14 using ::geneial::operation::crossover::BaseCrossoverOperation;
15 using ::geneial::operation::selection::BaseSelectionOperation;
16 using ::geneial::population::management::BaseManager;
17 using ::geneial::utility::EnableMakeShared;
18 
19 geneial_export_namespace
20 {
21 
25 template<typename FITNESS_TYPE>
26 class LambdaCouplingAdapter: public BaseCouplingOperation<FITNESS_TYPE>,
27  public virtual EnableMakeShared<LambdaCouplingAdapter<FITNESS_TYPE>>
28 {
29 public:
30  using offspring_result_set = typename BaseCouplingOperation<FITNESS_TYPE>::offspring_result_set;
31  using selection_result_set = typename BaseSelectionOperation<FITNESS_TYPE>::selection_result_set;
32  using function_type = typename std::function<offspring_result_set(
33  const selection_result_set&,
34  const BaseCrossoverOperation<FITNESS_TYPE> &crossoverOperation,
35  BaseManager<FITNESS_TYPE> &manager
36  )>;
37 
38  virtual ~LambdaCouplingAdapter()
39  {
40  }
41 
42  virtual offspring_result_set doCopulate(const selection_result_set &mating_pool,
43  const BaseCrossoverOperation<FITNESS_TYPE> &crossoverOperation, BaseManager<FITNESS_TYPE> &manager) override
44  {
45  return _lmbda(mating_pool, crossoverOperation, manager);
46  }
47 
48  class Builder: public BaseCouplingOperation<FITNESS_TYPE>::Builder
49  {
50  function_type _function;
51  public:
52 
53  Builder(function_type func) :
54  BaseCouplingOperation<FITNESS_TYPE>::Builder(), _function(func)
55  {
56  }
57 
58  virtual typename BaseCouplingOperation<FITNESS_TYPE>::ptr create() override
59  {
60  return LambdaCouplingAdapter<FITNESS_TYPE>::makeShared(_function);
61  }
62 
63  const function_type& getFunction() const
64  {
65  return _function;
66  }
67 
68  Builder& setFunction(const function_type& function)
69  {
70  _function = function;
71  return *this;
72  }
73  };
74 private:
75  function_type _lmbda;
76 protected:
77  explicit LambdaCouplingAdapter(const function_type lmbda) :
78  BaseCouplingOperation<FITNESS_TYPE>(std::make_shared<CouplingSettings>()), _lmbda(lmbda)
79  {
80  }
81 };
82 
83 } /* geneial_export_namespace */
84 } /* private namespace coupling */
85 } /* private namespace operation */
86 } /* private namespace geneial */
87 
88 #include <geneial/core/operations/coupling/RandomCouplingOperation.hpp>
89