OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
Population.h
Go to the documentation of this file.
1 #ifndef __POPULATION_H__
2 #define __POPULATION_H__
3 
4 #include <map>
5 #include <vector>
6 #include <utility>
7 #include <queue>
8 #include <set>
9 #include <cmath>
10 #include <fstream>
11 #include <sstream>
12 
13 #include "boost/smart_ptr.hpp"
14 
16 
17 
28 template< class Individual_t >
29 class Population {
30 
31 public:
33  last_identity = 0;
34  }
35 
37 
38  typedef typename Individual_t::genes_t genes_t;
39  typedef boost::shared_ptr<Individual_t> individual;
40  typedef std::pair< unsigned int, individual > ind_t;
41 
44 
50  unsigned int add_individual(individual ind) {
51 
52  unsigned int id = getFreeID();
53  stagingArea.insert(ind_t(id, ind));
54  ind->id_m = id;
55  //std::cout << "+++ staging id = " << id << "\xd";
56  return id;
57  }
58 
60 
61  indItr_t it = stagingArea.begin();
62  while(it != stagingArea.end()) {
63  if(it->second == ind) {
64  if(it->first == last_identity-1)
65  last_identity--;
66  else
67  freeids.push(it->first);
68 
69  //std::cout << "--- removing id = " << it->first << "\xd";
70  stagingArea.erase(it);
71  break;
72  }
73  it++;
74  }
75  }
76 
83  individual get_individual(int identity) {
84  indItr_t it;
85  if(identity == -1)
86  it = individuals.begin();
87  else {
88  it = individuals.find(identity);
89  if( it == individuals.end() )
90  return individual();
91  }
92 
93  return it->second;
94  }
95 
102  individual get_staging(int identity) {
103  indItr_t it;
104  if(identity == -1)
105  it = stagingArea.begin();
106  else {
107  it = stagingArea.find(identity);
108  if( it == stagingArea.end() )
109  return individual();
110  }
111 
112  return it->second;
113  }
114 
115 
116  void commit_individuals(std::set<unsigned int> ids) {
117 
118  for (unsigned int id : ids) {
119  //std::cout << "--+ committing id = " << id << "\xd";
120  individual ind = get_staging(id);
121  individuals.insert(ind_t(id, ind));
122  stagingArea.erase(id);
123  }
124  }
125 
131  void keepSurvivors(std::set<unsigned int> survivors) {
132 
133  indItr_t it = individuals.begin();
134  while(it != individuals.end()) {
135  if( survivors.count(it->first) == 0 ) {
136  if(it->first == last_identity-1)
137  last_identity--;
138  else
139  freeids.push(it->first);
140 
141  individuals.erase(it++);
142  } else
143  it++;
144  }
145  }
146 
147 
149  //XXX: currently O(n): add a fast look-up table?
151 
152  for(ind_t ind : individuals) {
153  if( ind_genes == ind.second->genes_m )
154  return true;
155  }
156 
157  return false;
158  }
159 
160 
161  double computeHypervolume(size_t island_id, const std::vector<double>& referencePoint) {
162  // protection check
163  if (individuals.empty() == true) return -1;
164 
165  std::ofstream file;
166  std::ostringstream filename;
167  filename << "hypervol.dat_" << island_id;
168  file.open(filename.str().c_str(), std::ios::out);
169 
170  file << "#" << std::endl;
171 
172  indItr_t it;
173  for(it = individuals.begin(); it != individuals.end(); it++) {
174 
175  individual temp = it->second;
176  for(size_t i=0; i<temp->objectives_m.size(); i++)
177  file << temp->objectives_m[i] << " ";
178  if (temp->objectives_m.size() > 0)
179  file << std::endl;
180  }
181 
182  file << "#" << std::endl;
183 
184  file.flush();
185  file.close();
186 
187  return Hypervolume::FromFile(filename.str(), referencePoint);
188  }
189 
190 
192  individuals.insert(stagingArea.begin(), stagingArea.end());
193  stagingArea.clear();
194  }
195 
196 
198  indItr_t stagingBegin() { return stagingArea.begin(); }
200  indItr_t stagingEnd() { return stagingArea.end(); }
201 
202 
207  unsigned int size() const { return individuals.size(); }
208 
210  indItr_t begin() { return individuals.begin(); }
212  indItr_t end() { return individuals.end(); }
214  indItr_t erase(indItr_t it) { return individuals.erase(it); }
215 
216 private:
217 
219  std::map<unsigned int, individual > individuals;
220 
222  std::map<unsigned int, individual > stagingArea;
223 
225  std::queue<unsigned int> freeids;
226 
228  unsigned int last_identity;
229 
234  unsigned int getFreeID() {
235 
236  unsigned int id = 0;
237  if(freeids.empty()) {
238  id = last_identity;
239  last_identity++;
240  } else {
241  id = freeids.front();
242  freeids.pop();
243  }
244 
245  return id;
246  }
247 };
248 
249 #endif
void commit_individuals(std::set< unsigned int > ids)
Definition: Population.h:116
indItr_t stagingEnd()
iterator end on staging area
Definition: Population.h:200
individual get_individual(int identity)
Definition: Population.h:83
void commit_individuals()
Definition: Population.h:191
Individual_t::genes_t genes_t
Definition: Population.h:38
std::map< unsigned int, individual >::iterator indItr_t
population iterator type
Definition: Population.h:43
unsigned int last_identity
last used (= next free) ID
Definition: Population.h:228
std::map< unsigned int, individual > stagingArea
staging area for individuals probably joining population
Definition: Population.h:222
individual get_staging(int identity)
Definition: Population.h:102
void keepSurvivors(std::set< unsigned int > survivors)
Definition: Population.h:131
indItr_t begin()
iterator begin on population container
Definition: Population.h:210
boost::shared_ptr< Individual_t > individual
Definition: Population.h:39
indItr_t end()
iterator end on population container
Definition: Population.h:212
unsigned int size() const
Definition: Population.h:207
std::map< unsigned int, individual > individuals
population container holding all individuals
Definition: Population.h:219
std::pair< unsigned int, individual > ind_t
Definition: Population.h:40
indItr_t stagingBegin()
iterator begin on staging area
Definition: Population.h:198
std::queue< unsigned int > freeids
queue to handle free individual IDs
Definition: Population.h:225
void remove_individual(individual ind)
Definition: Population.h:59
double FromFile(std::string file, const std::vector< double > &referencePoint)
unsigned int add_individual(individual ind)
Definition: Population.h:50
indItr_t erase(indItr_t it)
erase individual
Definition: Population.h:214
std::string::iterator iterator
Definition: MSLang.h:16
double computeHypervolume(size_t island_id, const std::vector< double > &referencePoint)
Definition: Population.h:161
unsigned int getFreeID()
Definition: Population.h:234
void flush()
Definition: Inform.h:117
Inform & endl(Inform &inf)
Definition: Inform.cpp:42
bool isRepresentedInPopulation(genes_t ind_genes)
check if a gene set is already represented in the population
Definition: Population.h:150