3 #include <geneial/namespaces.h>
4 #include <geneial/core/operations/crossover/MultiValueChromosomeCrossoverOperation.h>
5 #include <geneial/utility/mixins/EnableMakeShared.h>
9 geneial_private_namespace(geneial)
11 geneial_private_namespace(operation)
13 geneial_private_namespace(crossover)
15 using ::geneial::population::Population;
16 using ::geneial::population::chromosome::MultiValueChromosome;
17 using ::geneial::utility::EnableMakeShared;
19 geneial_export_namespace
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>>
27 const bool _operationIsSymmetric;
28 const function_type _function;
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),
37 _operationIsSymmetric(isSymmetric)
42 using return_type =
typename BaseCrossoverOperation<FITNESS_TYPE>::crossover_result_set;
43 using arg_type =
const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_ptr&;
46 typename std::function
50 MultiValueCrossoverLambdaAdapter<VALUE_TYPE,FITNESS_TYPE>&
53 virtual ~MultiValueCrossoverLambdaAdapter()
57 bool isSymmetric()
const override
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
66 return _function(mommy,daddy,*
this);
70 class Builder :
public MultiValueChromosomeCrossoverOperation<VALUE_TYPE,FITNESS_TYPE>::Builder
72 bool _operationIsSymmetric;
73 function_type _function;
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),
79 _operationIsSymmetric(operationIsSymmetric)
83 virtual typename BaseCrossoverOperation<FITNESS_TYPE>::ptr create()
override
85 if(! this->_builderFactory )
87 throw new std::runtime_error(
"Must set a Chromosome Factory to build MultiValueCrossover");
90 return MultiValueCrossoverLambdaAdapter<VALUE_TYPE, FITNESS_TYPE>::makeShared(this->_builderFactory,_function,_operationIsSymmetric);
100 #include <geneial/core/operations/crossover/MultiValueChromosomeAverageCrossover.hpp>