OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
PopulationTest.cpp
Go to the documentation of this file.
3 #include "gtest/gtest.h"
4 
5 #include "boost/smart_ptr.hpp"
6 
7 namespace {
8 
9  // The fixture for testing class Foo.
10  class PopulationTest : public ::testing::Test {
11  protected:
12 
13  PopulationTest() {
14  // You can do set-up work for each test here.
15  population_.reset(new Population<Individual>());
16  }
17 
18  virtual ~PopulationTest() {
19  // You can do clean-up work that doesn't throw exceptions here.
20  }
21 
22  // If the constructor and destructor are not enough for setting up
23  // and cleaning up each test, you can define the following methods:
24 
25  virtual void SetUp() {
26  // Code here will be called immediately after the constructor (right
27  // before each test).
28  }
29 
30  virtual void TearDown() {
31  // Code here will be called immediately after each test (right
32  // before the destructor).
33  // population_->clean_population();
34  }
35 
36  boost::shared_ptr<Individual> createIndividual(size_t num_genes) {
37 
39  Individual::names_t names;
40  Individual::constraints_t constraints;
41  for(size_t i=0; i < num_genes; i++) {
42  bounds.push_back(std::pair<double, double>(0.0, 10.0));
43  names.push_back("dvar"+std::to_string(i));
44  }
45 
46  boost::shared_ptr<Individual> ind(new Individual(bounds,names,constraints));
47  return ind;
48  }
49 
50  // Objects declared here can be used by all tests in the test case
51  boost::scoped_ptr< Population<Individual> > population_;
52  };
53 
54  TEST_F(PopulationTest, AddOneIndividual) {
55 
56  boost::shared_ptr<Individual> ind = createIndividual(1);
57  unsigned int id = population_->add_individual(ind);
58  double gene = ind->genes_m[0];
59  double obj = ind->objectives_m[0];
60 
61  EXPECT_EQ(static_cast<size_t>(0), id) << "first individuals id should be 0";
62 
63  boost::shared_ptr<Individual> tmp = population_->get_individual(id);
64  EXPECT_EQ(0, tmp.get()) << "no committed individuals after insert";
65 
66  tmp = population_->get_staging(id);
67  EXPECT_EQ(gene, tmp->genes_m[0]) << "gene should have specified value";
68  EXPECT_EQ(obj, tmp->objectives_m[0]) << "objective should have specified value";
69 
70  size_t my_size = population_->size();
71  EXPECT_EQ(static_cast<size_t>(0), my_size)
72  << "no committed individuals, population should still be 0";
73 
74  }
75 
76  TEST_F(PopulationTest, CommitOneIndividual) {
77 
78  boost::shared_ptr<Individual> ind = createIndividual(1);
79  unsigned int id = population_->add_individual(ind);
80  double gene = ind->genes_m[0];
81  double obj = ind->objectives_m[0];
82 
83  EXPECT_EQ(static_cast<size_t>(0), id) << "first individuals id should be 0";
84 
85  population_->commit_individuals();
86 
87  boost::shared_ptr<Individual> tmp = population_->get_staging(id);
88  EXPECT_EQ(0, tmp.get()) << "no staging individuals after commit";
89 
90  tmp = population_->get_individual(id);
91  EXPECT_EQ(gene, tmp->genes_m[0]);
92  EXPECT_EQ(obj, tmp->objectives_m[0]);
93 
94  size_t my_size = population_->size();
95  EXPECT_EQ(static_cast<size_t>(1), my_size);
96 
97  }
98 
99  TEST_F(PopulationTest, KeepIndividuals) {
100 
101  boost::shared_ptr<Individual> ind1 = createIndividual(1);
102  boost::shared_ptr<Individual> ind2 = createIndividual(1);
103  boost::shared_ptr<Individual> ind3 = createIndividual(1);
104  boost::shared_ptr<Individual> ind4 = createIndividual(1);
105 
106  size_t id0 = population_->add_individual(ind1);
107  EXPECT_EQ(static_cast<size_t>(0), id0);
108  size_t id1 = population_->add_individual(ind2);
109  EXPECT_EQ(static_cast<size_t>(1), id1);
110  size_t id2 = population_->add_individual(ind3);
111  EXPECT_EQ(static_cast<size_t>(2), id2);
112  size_t id3 = population_->add_individual(ind4);
113  EXPECT_EQ(static_cast<size_t>(3), id3);
114 
115  population_->commit_individuals();
116 
117  std::set<unsigned int> survivors;
118  survivors.insert(id1);
119  survivors.insert(id3);
120 
121  population_->keepSurvivors(survivors);
122 
123  size_t size = population_->size();
124  EXPECT_EQ(survivors.size(), size);
125 
126  boost::shared_ptr<Individual> tmp = population_->get_individual(id1);
127  EXPECT_EQ(ind2->genes_m[0], tmp->genes_m[0]);
128  EXPECT_EQ(ind2->objectives_m[0], tmp->objectives_m[0]);
129  }
130 
131  TEST_F(PopulationTest, IDsContinuous) {
132 
133  boost::shared_ptr<Individual> ind0 = createIndividual(1);
134  boost::shared_ptr<Individual> ind1 = createIndividual(1);
135  boost::shared_ptr<Individual> ind2 = createIndividual(1);
136  boost::shared_ptr<Individual> ind3 = createIndividual(1);
137 
138  size_t id0 = population_->add_individual(ind0);
139  EXPECT_EQ(static_cast<size_t>(0), id0);
140  size_t id1 = population_->add_individual(ind1);
141  EXPECT_EQ(static_cast<size_t>(1), id1);
142  size_t id2 = population_->add_individual(ind2);
143  EXPECT_EQ(static_cast<size_t>(2), id2);
144  size_t id3 = population_->add_individual(ind3);
145  EXPECT_EQ(static_cast<size_t>(3), id3);
146 
147  unsigned int individual_to_be_removed_id = 1;
148  population_->remove_individual(ind1);
149 
150  boost::shared_ptr<Individual> newind = createIndividual(1);
151  unsigned int id_new = population_->add_individual(newind);
152  EXPECT_EQ(individual_to_be_removed_id, id_new);
153 
154  boost::shared_ptr<Individual> tmp = population_->get_staging(id_new);
155  EXPECT_EQ(newind->genes_m[0], tmp->genes_m[0]);
156  EXPECT_EQ(newind->objectives_m[0], tmp->objectives_m[0]);
157  }
158 
159  TEST_F(PopulationTest, FindNonExistingStaging) {
160 
161  boost::shared_ptr<Individual> tmp = population_->get_staging(124);
162  EXPECT_EQ(0, tmp.get());
163  }
164 
165  TEST_F(PopulationTest, FindNonExistingIndividual) {
166 
167  boost::shared_ptr<Individual> tmp = population_->get_individual(124);
168  EXPECT_EQ(0, tmp.get());
169  }
170 
171  TEST_F(PopulationTest, RepresentedCheck) {
172 
173  boost::shared_ptr<Individual> ind = createIndividual(1);
174  population_->add_individual(ind);
175 
176  population_->add_individual(ind);
177  population_->commit_individuals();
178 
179  bool represented = population_->isRepresentedInPopulation(ind->genes_m);
180  EXPECT_TRUE(represented);
181 
182  std::vector<double> tmp_genes;
183  tmp_genes.push_back(12312);
184  represented = population_->isRepresentedInPopulation(tmp_genes);
185  EXPECT_FALSE(represented);
186  }
187 
188 }
189 
190 int main(int argc, char **argv) {
191  ::testing::InitGoogleTest(&argc, argv);
192  return RUN_ALL_TESTS();
193 }
void bounds(const PETE_Expr< T1 > &expr, Vektor< T2, D > &minval, Vektor< T2, D > &maxval)
int main(int argc, char *argv[])
Definition: Main.cpp:107
std::vector< std::string > names_t
gene names
Definition: Individual.h:28
Expressions::Named_t constraints_t
constraints
Definition: Individual.h:34
std::vector< std::pair< double, double > > bounds_t
bounds on design variables
Definition: Individual.h:32