GENEIAL  0.2=/
 All Classes Pages
MultiValueChromosome.hpp
1 #pragma once
2 
3 #include <geneial/namespaces.h>
4 
5 #include <geneial/core/population/chromosome/MultiValueChromosome.h>
6 
7 #include <boost/functional/hash.hpp>
8 
9 #include <iterator>
10 #include <algorithm>
11 #include <limits>
12 
13 
14 geneial_private_namespace(geneial)
15 {
16 geneial_private_namespace(population)
17 {
18 geneial_private_namespace(chromosome)
19 {
20 
21 geneial_export_namespace
22 {
23 
24 template<typename VALUE_TYPE, typename FITNESS_TYPE>
25 bool MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::equals(
26  const BaseChromosome<FITNESS_TYPE> &chromosome) const
27 {
28  return this->hashEquals(chromosome);
29 }
30 
31 template<typename VALUE_TYPE, typename FITNESS_TYPE>
32 typename BaseChromosome<FITNESS_TYPE>::chromsome_hash MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getHash() const
33 {
34 #ifndef NMVCHASH_CACHE
35  if(!hasCache())
36  {
37 #endif
38  //TODO (bewo): Introduce a mutex lock here for threading.
39  _hashCache = boost::hash_range(_container.begin(), _container.end());
40 #ifndef NMVCHASH_CACHE
41  _cacheValid = true;
42  }
43 #endif
44  typename BaseChromosome<FITNESS_TYPE>::chromsome_hash result = _hashCache;
45  return result;
46 }
47 
48 template<typename VALUE_TYPE, typename FITNESS_TYPE>
49 unsigned int MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getSize() const
50 {
51  return _container.size();
52 }
53 
54 template<typename VALUE_TYPE, typename FITNESS_TYPE>
55 typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::value_container& MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getContainer()
56 {
57  invalidateHashCache();
58  return _container;
59 }
60 
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
63 {
64  return _container;
65 }
66 
67 template<typename VALUE_TYPE, typename FITNESS_TYPE>
68 bool inline MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::hasCache() const
69 {
70  return _cacheValid;
71 }
72 
73 template<typename VALUE_TYPE, typename FITNESS_TYPE>
74 void inline MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::invalidateHashCache() const
75 {
76  _cacheValid = false;
77 }
78 
79 template<typename VALUE_TYPE, typename FITNESS_TYPE>
80 void MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::setValueContainer(const value_container &container)
81 {
82  invalidateHashCache();
83  _container = container;
84 }
85 
86 template<typename VALUE_TYPE, typename FITNESS_TYPE>
87 void MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::setValueContainer(value_container&& container)
88 {
89  invalidateHashCache();
90  std::swap(_container,container);
91 }
92 
93 
94 template<typename VALUE_TYPE, typename FITNESS_TYPE>
95 typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_it MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getConstIt() const
96 {
97  return _container.begin();
98 }
99 
100 template<typename VALUE_TYPE, typename FITNESS_TYPE>
101 typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::it MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getIt() const
102 {
103  invalidateHashCache();
104  return _container.begin();
105 }
106 
107 template<typename VALUE_TYPE, typename FITNESS_TYPE>
108 typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::it MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getMax() const
109 {
110  return std::max_element(_container.begin(), _container.end());
111 }
112 
113 template<typename VALUE_TYPE, typename FITNESS_TYPE>
114 typename MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::it MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getMin() const
115 {
116  return std::min_element(_container.begin(), _container.end());
117 }
118 
119 template<typename VALUE_TYPE, typename FITNESS_TYPE>
120 VALUE_TYPE MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getAverage() const
121 {
122  const VALUE_TYPE sum = std::accumulate(_container.begin(), _container.end(), 0);
123  const unsigned int size = getSize();
124 
125  if (size == 0)
126  {
127  return 0;
128  }
129  else
130  {
131  assert(size > 0);
132  return sum / size;
133  }
134 }
135 
136 template<typename VALUE_TYPE, typename FITNESS_TYPE>
137 VALUE_TYPE MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getRange() const
138 {
139  MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_it max = getMax();
140  MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::const_it min = getMin();
141  assert(max >= min);
142  return *max - *min;
143 }
144 
145 template<typename VALUE_TYPE, typename FITNESS_TYPE>
146 VALUE_TYPE MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::getSum() const
147 {
148  VALUE_TYPE sum = std::accumulate(_container.begin(), _container.end(), 0);
149  return sum;
150 }
151 
152 template<typename VALUE_TYPE, typename FITNESS_TYPE>
153 void MultiValueChromosome<VALUE_TYPE, FITNESS_TYPE>::print(std::ostream& os) const
154 {
155  os << "Fitness: ";
156  if (this->hasFitness())
157  {
158  os << this->getFitness();
159  }
160  else
161  {
162  os << "N/A";
163  }
164  os << ", ";
165  os << "Age: " << this->getAge() << ", ";
166 
167  os << "Hash: ";
168  this->printHash(os);
169  os << std::endl;
170 
171  os << "Values: " << std::endl;
172  std::ostream_iterator<VALUE_TYPE> out_it(os, "; ");
173  std::copy(_container.begin(), _container.end(), out_it);
174  os << std::endl;
175 }
176 
177 } /* geneial_export_namespace */
178 } /* private namespace chromosome */
179 } /* private namespace population */
180 } /* private namespace geneial */
181