forqs module reference
Forward simulation of Recombination, Quantitative traits, and Selection
 All Classes Groups Pages
FitnessFunction.hpp
1 //
2 // FitnessFunction.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 _FITNESSFUNCTION_HPP_
37 #define _FITNESSFUNCTION_HPP_
38 
39 
40 #include "QuantitativeTrait.hpp"
41 #include "shared_ptr.hpp"
42 #include <stdexcept>
43 
44 
50 
51 
52 //
53 // FitnessFunction
54 //
55 
59 
61 {
62  public:
63 
64  virtual DataVectorPtr calculate_fitnesses(const TraitValueMap& trait_values,
65  size_t generation_index,
66  size_t population_index) const = 0;
67  virtual ~FitnessFunction() {}
68 
69  // Configurable interface
70 
71  virtual std::string class_name() const;
72  virtual Parameters parameters() const;
73  virtual void configure(const Parameters& parameters, const Registry& registry);
74 
75  protected:
76 
77  FitnessFunction(const std::string& id) : Configurable(id) {}
78 };
79 
80 
81 typedef shared_ptr<FitnessFunction> FitnessFunctionPtr;
82 typedef std::vector<FitnessFunctionPtr> FitnessFunctionPtrs;
83 
84 
85 //
86 // FitnessFunction_Trivial
87 //
88 
98 
100 {
101  public:
102 
103  FitnessFunction_Trivial(const std::string& id) : FitnessFunction(id) {}
104 
105  virtual DataVectorPtr calculate_fitnesses(const TraitValueMap& trait_values,
106  size_t generation_index,
107  size_t population_index) const
108  {
109  return DataVectorPtr();
110  }
111 
112  // Configurable interface
113 
114  virtual std::string class_name() const {return "FitnessFunction_Trivial";}
115  virtual Parameters parameters() const {return Parameters();}
116  virtual void configure(const Parameters& parameters, const Registry& registry) {}
117 };
118 
119 
120 //
121 // FitnessFunction_Identity
122 //
123 
135 
137 {
138  public:
139 
140  FitnessFunction_Identity(const std::string& id, const std::string& quantitative_trait_id = "")
141  : FitnessFunction(id), qtid_(quantitative_trait_id)
142  {}
143 
144  virtual DataVectorPtr calculate_fitnesses(const TraitValueMap& trait_values,
145  size_t generation_index,
146  size_t population_index) const
147  {
148  if (!trait_values.count(qtid_))
149  throw std::runtime_error("[FitnessFunction_Identity] Quantitative trait id not found.");
150  return trait_values.at(qtid_);
151  }
152 
153  // Configurable interface
154 
155  virtual std::string class_name() const {return "FitnessFunction_Identity";}
156  virtual Parameters parameters() const;
157  virtual void configure(const Parameters& parameters, const Registry& registry);
158 
159  private:
160 
161  std::string qtid_;
162 };
163 
164 
165 //
166 // FitnessFunction_PopulationComposite
167 //
168 
180 
181 
183 {
184  public:
185 
186  FitnessFunction_PopulationComposite(const std::string& id,
187  const FitnessFunctionPtrs& ffs = FitnessFunctionPtrs());
188 
189  virtual DataVectorPtr calculate_fitnesses(const TraitValueMap& trait_values,
190  size_t generation_index,
191  size_t population_index) const;
192 
193  // Configurable interface
194 
195  virtual std::string class_name() const {return "FitnessFunction_PopulationComposite";}
196  virtual Parameters parameters() const;
197  virtual void configure(const Parameters& parameters, const Registry& registry);
198  virtual void initialize(const SimulatorConfig& config);
199  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
200 
201  private:
202 
203  FitnessFunctionPtrs ffs_;
204 };
205 
206 
207 //
208 // FitnessFunction_GenerationComposite
209 //
210 
220 
221 
223 {
224  public:
225 
226  typedef std::map<size_t, FitnessFunctionPtr> GenerationFFMap;
227 
228  FitnessFunction_GenerationComposite(const std::string& id,
229  const GenerationFFMap& ffs = GenerationFFMap());
230 
231  virtual DataVectorPtr calculate_fitnesses(const TraitValueMap& trait_values,
232  size_t generation_index,
233  size_t population_index) const;
234 
235  // Configurable interface
236 
237  virtual std::string class_name() const {return "FitnessFunction_GenerationComposite";}
238  virtual Parameters parameters() const;
239  virtual void configure(const Parameters& parameters, const Registry& registry);
240  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
241 
242  private:
243 
244  GenerationFFMap ffs_; // generation_index -> FF
245 };
246 
247 
248 //
249 // FitnessFunction_Optimum
250 //
251 
269 
271 {
272  public:
273 
274  FitnessFunction_Optimum(const std::string& id, const std::string& quantitative_trait_id = "",
275  double optimum = 0, double radius = 0, double power = 0);
276 
277  virtual DataVectorPtr calculate_fitnesses(const TraitValueMap& trait_values,
278  size_t generation_index,
279  size_t population_index) const;
280  // Configurable interface
281 
282  virtual std::string class_name() const {return "FitnessFunction_Optimum";}
283  virtual Parameters parameters() const;
284  virtual void configure(const Parameters& parameters, const Registry& registry);
285 
286  private:
287 
288  std::string qtid_;
289  double optimum_;
290  double radius_;
291  double power_;
292 };
293 
294 
295 //
296 // FitnessFunction_TruncationSelection
297 //
298 
313 
315 {
316  public:
317 
318  FitnessFunction_TruncationSelection(const std::string& id,
319  const std::string& quantitative_trait_id = "",
320  double proportion_selected = 0);
321 
322  virtual DataVectorPtr calculate_fitnesses(const TraitValueMap& trait_values,
323  size_t generation_index,
324  size_t population_index) const;
325  // Configurable interface
326 
327  virtual std::string class_name() const {return "FitnessFunction_TruncationSelection";}
328  virtual Parameters parameters() const;
329  virtual void configure(const Parameters& parameters, const Registry& registry);
330 
331  private:
332 
333  std::string qtid_;
334  double proportion_selected_;
335 };
336 
337 
338 #endif // _FITNESSFUNCTION_HPP_
339