3 #include <geneial/namespaces.h>
4 #include <geneial/core/population/builder/BaseChromosomeFactory.h>
5 #include <geneial/core/population/builder/MultiValueBuilderSettings.h>
6 #include <geneial/utility/mixins/EnableMakeShared.h>
11 geneial_private_namespace(geneial)
13 geneial_private_namespace(population)
15 geneial_private_namespace(chromosome)
18 using ::geneial::utility::EnableMakeShared;
20 geneial_export_namespace
24 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
25 class MultiValueChromosomeFactory:
public BaseChromosomeFactory<FITNESS_TYPE>,
26 public virtual EnableMakeShared<MultiValueChromosomeFactory<VALUE_TYPE, FITNESS_TYPE>>
29 struct ChromosomeDeleter
31 std::weak_ptr<ResourcePool<MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>>> _resourcePool;
33 ChromosomeDeleter(
const std::weak_ptr<ResourcePool<MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>>> &resourcePool):_resourcePool(resourcePool)
37 inline void operator()(MultiValueChromosome<VALUE_TYPE,FITNESS_TYPE>* p)
const
39 if (
const auto resourcePool = _resourcePool.lock())
41 resourcePool->free(std::move(p));
52 const MultiValueBuilderSettings<VALUE_TYPE, FITNESS_TYPE> &_settings;
56 std::shared_ptr<ResourcePool<MultiValueChromosome<VALUE_TYPE,FITNESS_TYPE>>> _chromosomeResourcePool;
59 typename BaseChromosome<FITNESS_TYPE>::ptr doCreateChromosome(
60 typename BaseChromosomeFactory<FITNESS_TYPE>::PopulateBehavior populateValues
65 typename MultiValueChromosome<VALUE_TYPE,FITNESS_TYPE>::ptr allocateNewChromsome()
67 MultiValueChromosome<VALUE_TYPE,FITNESS_TYPE> *rawChromosome ;
69 if(this->_chromosomeResourcePool->retrieve(rawChromosome))
71 rawChromosome->invalidate();
72 rawChromosome->setFitnessEvaluator(_settings.getFitnessEvaluator());
76 rawChromosome =
new MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>(_settings.getFitnessEvaluator());
81 typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::ptr new_chromosome(
82 rawChromosome, ChromosomeDeleter(this->_chromosomeResourcePool));
85 new_chromosome->getContainer().resize(this->_settings.getNum());
87 return std::move(new_chromosome);
90 explicit MultiValueChromosomeFactory (
const MultiValueBuilderSettings<VALUE_TYPE, FITNESS_TYPE> &settings) :
91 BaseChromosomeFactory<FITNESS_TYPE>(),
93 _chromosomeResourcePool(std::make_shared<ResourcePool<MultiValueChromosome<VALUE_TYPE,FITNESS_TYPE>>>())
99 class Builder :
public BaseChromosomeFactory<FITNESS_TYPE>::Builder
101 MultiValueBuilderSettings<VALUE_TYPE, FITNESS_TYPE> _settings;
104 MultiValueBuilderSettings<VALUE_TYPE,FITNESS_TYPE>& getSettings()
109 Builder(
const typename FitnessEvaluator<FITNESS_TYPE>::ptr &fitnessEvaluator):
110 _settings(fitnessEvaluator)
114 virtual typename BaseChromosomeFactory<FITNESS_TYPE>::ptr create()
override
116 return std::move(MultiValueChromosomeFactory<VALUE_TYPE,FITNESS_TYPE>::makeShared(_settings));
121 virtual ~MultiValueChromosomeFactory()
125 inline const MultiValueBuilderSettings<VALUE_TYPE, FITNESS_TYPE> & getSettings()
const
130 void setSettings(
const MultiValueBuilderSettings<VALUE_TYPE, FITNESS_TYPE>& settings)
132 _settings = settings;
142 #include <geneial/core/population/builder/MultiValueChromosomeFactory.hpp>