3 #include <geneial/namespaces.h>
4 #include <geneial/utility/mixins/Printable.h>
5 #include <geneial/core/fitness/Fitness.h>
6 #include <geneial/core/fitness/FitnessEvaluator.h>
13 geneial_private_namespace(geneial)
15 geneial_private_namespace(population)
17 geneial_private_namespace(chromosome)
19 using ::geneial::utility::Printable;
21 geneial_export_namespace
27 template<
typename FITNESS_TYPE>
28 class BaseChromosome:
public Printable,
public std::enable_shared_from_this<BaseChromosome<FITNESS_TYPE> >
31 static const int CHROMOSOME_AGE_UNITIALIZED = 0;
33 using chromosome_age =
unsigned int;
34 using chromsome_hash = std::size_t;
36 using ptr = std::shared_ptr<BaseChromosome<FITNESS_TYPE>>;
37 using const_ptr =std::shared_ptr<const BaseChromosome<FITNESS_TYPE>>;
41 return this->shared_from_this();
44 const_ptr getConstPtr()
46 return this->shared_from_this();
52 explicit BaseChromosome(
typename FitnessEvaluator<FITNESS_TYPE>::ptr fitnessEvaluator) :
53 _fitness(nullptr), _fitnessEvaluator(fitnessEvaluator), _age(CHROMOSOME_AGE_UNITIALIZED)
55 assert(_fitnessEvaluator);
58 virtual ~BaseChromosome()
62 virtual bool equals(
const BaseChromosome<FITNESS_TYPE> &chromosome)
const = 0;
68 chromosome_age doAge();
73 chromosome_age getAge()
const;
75 void setAge(
const chromosome_age age);
77 virtual void print(std::ostream& os)
const = 0;
79 bool inline hasFitness()
const
83 return _fitness !=
nullptr;
90 const Fitness<FITNESS_TYPE>& getFitness()
const;
100 void invalidateFitness();
104 inline void invalidate()
107 setAge(CHROMOSOME_AGE_UNITIALIZED);
112 virtual void doInvalidate()
119 void setFitness(
typename std::unique_ptr<Fitness<FITNESS_TYPE>> fitness);
121 const typename FitnessEvaluator<FITNESS_TYPE>::ptr getFitnessEvaluator()
const;
123 void setFitnessEvaluator(
const typename FitnessEvaluator<FITNESS_TYPE>::ptr& fitnessEvaluator);
125 virtual chromsome_hash getHash()
const = 0;
129 virtual bool hashEquals(
const BaseChromosome<FITNESS_TYPE> &chromosome)
const;
131 virtual void printHash(std::ostream& os)
const;
134 mutable std::unique_ptr<Fitness<FITNESS_TYPE>> _fitness;
136 typename FitnessEvaluator<FITNESS_TYPE>::ptr _fitnessEvaluator;
146 #include <geneial/core/population/chromosome/BaseChromosome.hpp>