3 #include <geneial/namespaces.h>
5 #include <geneial/core/population/chromosome/MultiValueChromosome.h>
7 #include <boost/functional/hash.hpp>
14 geneial_private_namespace(geneial)
16 geneial_private_namespace(population)
18 geneial_private_namespace(chromosome)
21 geneial_export_namespace
24 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
25 bool MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::equals(
26 const BaseChromosome<FITNESS_TYPE> &chromosome)
const
28 return this->hashEquals(chromosome);
31 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
32 typename BaseChromosome<FITNESS_TYPE>::chromsome_hash MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getHash()
const
34 #ifndef NMVCHASH_CACHE
39 _hashCache = boost::hash_range(_container.begin(), _container.end());
40 #ifndef NMVCHASH_CACHE
44 typename BaseChromosome<FITNESS_TYPE>::chromsome_hash result = _hashCache;
48 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
49 unsigned int MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getSize()
const
51 return _container.size();
54 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
55 typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::value_container& MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getContainer()
57 invalidateHashCache();
61 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
62 const typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::value_container& MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getContainer()
const
67 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
68 bool inline MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::hasCache()
const
73 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
74 void inline MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::invalidateHashCache()
const
79 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
80 void MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::setValueContainer(
const value_container &container)
82 invalidateHashCache();
83 _container = container;
86 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
87 void MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::setValueContainer(value_container&& container)
89 invalidateHashCache();
90 std::swap(_container,container);
94 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
95 typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_it MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getConstIt()
const
97 return _container.begin();
100 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
101 typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::it MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getIt()
const
103 invalidateHashCache();
104 return _container.begin();
107 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
108 typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::it MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getMax()
const
110 return std::max_element(_container.begin(), _container.end());
113 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
114 typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::it MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getMin()
const
116 return std::min_element(_container.begin(), _container.end());
119 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
120 VALUE_TYPE MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getAverage()
const
122 const VALUE_TYPE sum = std::accumulate(_container.begin(), _container.end(), 0);
123 const unsigned int size = getSize();
136 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
137 VALUE_TYPE MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getRange()
const
139 MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_it max = getMax();
140 MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_it min = getMin();
145 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
146 VALUE_TYPE MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getSum()
const
148 VALUE_TYPE sum = std::accumulate(_container.begin(), _container.end(), 0);
152 template<
typename VALUE_TYPE,
typename FITNESS_TYPE>
153 void MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::print(std::ostream& os)
const
156 if (this->hasFitness())
158 os << this->getFitness();
165 os <<
"Age: " << this->getAge() <<
", ";
171 os <<
"Values: " << std::endl;
172 std::ostream_iterator<VALUE_TYPE> out_it(os,
"; ");
173 std::copy(_container.begin(), _container.end(), out_it);