GENEIAL  0.2=/
 All Classes Pages
MultiValueCrossoverLambdaAdapter.h
1 #pragma once
2 
3 #include <geneial/namespaces.h>
4 #include <geneial/core/operations/crossover/MultiValueChromosomeCrossoverOperation.h>
5 #include <geneial/utility/mixins/EnableMakeShared.h>
6 
7 #include <cassert>
8 
9 geneial_private_namespace(geneial)
10 {
11 geneial_private_namespace(operation)
12 {
13 geneial_private_namespace(crossover)
14 {
15 using ::geneial::population::Population;
16 using ::geneial::population::chromosome::MultiValueChromosome;
17 using ::geneial::utility::EnableMakeShared;
18 
19 geneial_export_namespace
20 {
21 
22 template<typename VALUE_TYPE, typename FITNESS_TYPE>
23 class MultiValueCrossoverLambdaAdapter: public MultiValueChromosomeCrossoverOperation<VALUE_TYPE,FITNESS_TYPE>,
24  public virtual EnableMakeShared<MultiValueCrossoverLambdaAdapter<VALUE_TYPE,FITNESS_TYPE>>
25 {
26 private:
27  const bool _operationIsSymmetric;
28  const function_type _function;
29 
30 protected:
31  MultiValueCrossoverLambdaAdapter(
32  const std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> &builderFactory,
33  const function_type &function,
34  const bool isSymmetric = false
35  ) : MultiValueChromosomeCrossoverOperation<VALUE_TYPE,FITNESS_TYPE>(builderFactory),
36  _function(function),
37  _operationIsSymmetric(isSymmetric)
38  {
39  }
40 
41 public:
42  using return_type = typename BaseCrossoverOperation<FITNESS_TYPE>::crossover_result_set;
43  using arg_type = const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr&;
44 
45  using function_type =
46  typename std::function
47  <return_type(
48  arg_type mommy,
49  arg_type daddy,
50  MultiValueCrossoverLambdaAdapter<VALUE_TYPE,FITNESS_TYPE>&
51  )>;
52 
53  virtual ~MultiValueCrossoverLambdaAdapter()
54  {
55  }
56 
57  bool isSymmetric() const override
58  {
59  return false;
60  }
61 
62  virtual typename BaseCrossoverOperation<FITNESS_TYPE>::crossover_result_set doMultiValueCrossover(
63  const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &mommy,
64  const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr &daddy) const override
65  {
66  return _function(mommy,daddy,*this);
67  }
68 
69 
70  class Builder : public MultiValueChromosomeCrossoverOperation<VALUE_TYPE,FITNESS_TYPE>::Builder
71  {
72  bool _operationIsSymmetric;
73  function_type _function;
74  public:
75  Builder(const std::shared_ptr<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>> & builderFactory,
76  const function_type function,
77  const bool operationIsSymmetric = false) : MultiValueChromosomeCrossoverOperation<VALUE_TYPE, FITNESS_TYPE>::Builder(builderFactory),
78  _function(function),
79  _operationIsSymmetric(operationIsSymmetric)
80  {
81  }
82 
83  virtual typename BaseCrossoverOperation<FITNESS_TYPE>::ptr create() override
84  {
85  if(! this->_builderFactory )
86  {
87  throw new std::runtime_error("Must set a Chromosome Factory to build MultiValueCrossover");
88  }
89 
90  return MultiValueCrossoverLambdaAdapter<VALUE_TYPE, FITNESS_TYPE>::makeShared(this->_builderFactory,_function,_operationIsSymmetric);
91  }
92  };
93 };
94 
95 } /* geneial_export_namespace */
96 } /* private namespace crossover */
97 } /* private namespace operation */
98 } /* private namespace geneial */
99 
100 #include <geneial/core/operations/crossover/MultiValueChromosomeAverageCrossover.hpp>
101