forqs module reference
Forward simulation of Recombination, Quantitative traits, and Selection
 All Classes Groups Pages
FitnessFunctionImplementation.hpp
1 //
2 // FitnessFunctionImplementation.hpp
3 //
4 // Created by Darren Kessner with John Novembre
5 //
6 // Copyright (c) 2013 Regents of the University of California
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are met:
11 //
12 // * Redistributions of source code must retain the above copyright notice,
13 // this list of conditions and the following disclaimer.
14 //
15 // * Redistributions in binary form must reproduce the above copyright notice,
16 // this list of conditions and the following disclaimer in the documentation
17 // and/or other materials provided with the distribution.
18 //
19 // * Neither UCLA nor the names of its contributors may be used to endorse or
20 // promote products derived from this software without specific prior
21 // written permission.
22 //
23 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
24 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
27 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
31 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 //
34 
35 
36 #ifndef _FITNESSFUNCTIONIMPLEMENTATION_HPP_
37 #define _FITNESSFUNCTIONIMPLEMENTATION_HPP_
38 
39 
40 #include "FitnessFunction.hpp"
41 #include "QuantitativeTrait.hpp"
42 #include "shared_ptr.hpp"
43 #include <stdexcept>
44 
45 
51 
52 
53 //
54 // FitnessFunction_Trivial
55 //
56 
66 
67 class FitnessFunction_Trivial : public FitnessFunction
68 {
69  public:
70 
71  FitnessFunction_Trivial(const std::string& id) : FitnessFunction(id) {}
72 
73  virtual DataVectorPtr calculate_fitnesses(const TraitValueMap& trait_values,
74  size_t generation_index,
75  size_t population_index) const
76  {
77  return DataVectorPtr();
78  }
79 
80  // Configurable interface
81 
82  virtual std::string class_name() const {return "FitnessFunction_Trivial";}
83  virtual Parameters parameters() const {return Parameters();}
84  virtual void configure(const Parameters& parameters, const Registry& registry) {}
85 };
86 
87 
88 //
89 // FitnessFunction_Identity
90 //
91 
103 
104 class FitnessFunction_Identity : public FitnessFunction
105 {
106  public:
107 
108  FitnessFunction_Identity(const std::string& id, const std::string& quantitative_trait_id = "")
109  : FitnessFunction(id), qtid_(quantitative_trait_id)
110  {}
111 
112  virtual DataVectorPtr calculate_fitnesses(const TraitValueMap& trait_values,
113  size_t generation_index,
114  size_t population_index) const
115  {
116  if (!trait_values.count(qtid_))
117  throw std::runtime_error("[FitnessFunction_Identity] Quantitative trait id not found.");
118  return trait_values.at(qtid_);
119  }
120 
121  // Configurable interface
122 
123  virtual std::string class_name() const {return "FitnessFunction_Identity";}
124  virtual Parameters parameters() const;
125  virtual void configure(const Parameters& parameters, const Registry& registry);
126 
127  private:
128 
129  std::string qtid_;
130 };
131 
132 
133 //
134 // FitnessFunction_PopulationComposite
135 //
136 
148 
149 
150 class FitnessFunction_PopulationComposite : public FitnessFunction
151 {
152  public:
153 
154  FitnessFunction_PopulationComposite(const std::string& id,
155  const FitnessFunctionPtrs& ffs = FitnessFunctionPtrs());
156 
157  virtual DataVectorPtr calculate_fitnesses(const TraitValueMap& trait_values,
158  size_t generation_index,
159  size_t population_index) const;
160 
161  // Configurable interface
162 
163  virtual std::string class_name() const {return "FitnessFunction_PopulationComposite";}
164  virtual Parameters parameters() const;
165  virtual void configure(const Parameters& parameters, const Registry& registry);
166  virtual void initialize(const SimulatorConfig& config);
167  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
168 
169  private:
170 
171  FitnessFunctionPtrs ffs_;
172 };
173 
174 
175 //
176 // FitnessFunction_GenerationComposite
177 //
178 
188 
189 
190 class FitnessFunction_GenerationComposite : public FitnessFunction
191 {
192  public:
193 
194  typedef std::map<size_t, FitnessFunctionPtr> GenerationFFMap;
195 
196  FitnessFunction_GenerationComposite(const std::string& id,
197  const GenerationFFMap& ffs = GenerationFFMap());
198 
199  virtual DataVectorPtr calculate_fitnesses(const TraitValueMap& trait_values,
200  size_t generation_index,
201  size_t population_index) const;
202 
203  // Configurable interface
204 
205  virtual std::string class_name() const {return "FitnessFunction_GenerationComposite";}
206  virtual Parameters parameters() const;
207  virtual void configure(const Parameters& parameters, const Registry& registry);
208  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
209 
210  private:
211 
212  GenerationFFMap ffs_; // generation_index -> FF
213 };
214 
215 
216 //
217 // FitnessFunction_Optimum
218 //
219 
246 
247 class FitnessFunction_Optimum : public FitnessFunction
248 {
249  public:
250 
251  FitnessFunction_Optimum(const std::string& id, const std::string& quantitative_trait_id = "",
252  double optimum = 0, double radius = 0, double power = 0);
253 
254  virtual DataVectorPtr calculate_fitnesses(const TraitValueMap& trait_values,
255  size_t generation_index,
256  size_t population_index) const;
257  // Configurable interface
258 
259  virtual std::string class_name() const {return "FitnessFunction_Optimum";}
260  virtual Parameters parameters() const;
261  virtual void configure(const Parameters& parameters, const Registry& registry);
262 
263  private:
264 
265  std::string qtid_;
266  double optimum_;
267  double radius_;
268  double power_;
269  double gaussian_width_;
270 };
271 
272 
273 //
274 // FitnessFunction_TruncationSelection
275 //
276 
291 
292 class FitnessFunction_TruncationSelection : public FitnessFunction
293 {
294  public:
295 
296  FitnessFunction_TruncationSelection(const std::string& id,
297  const std::string& quantitative_trait_id = "",
298  double proportion_selected = 0);
299 
300  virtual DataVectorPtr calculate_fitnesses(const TraitValueMap& trait_values,
301  size_t generation_index,
302  size_t population_index) const;
303  // Configurable interface
304 
305  virtual std::string class_name() const {return "FitnessFunction_TruncationSelection";}
306  virtual Parameters parameters() const;
307  virtual void configure(const Parameters& parameters, const Registry& registry);
308 
309  private:
310 
311  std::string qtid_;
312  double proportion_selected_;
313 };
314 
315 
316 #endif // _FITNESSFUNCTIONIMPLEMENTATION_HPP_
317