forqs module reference
Forward simulation of Recombination, Quantitative traits, and Selection
 All Classes Groups Pages
QuantitativeTraitImplementation.hpp
1 //
2 // QuantitativeTraitImplementation.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 _QUANTITATIVETRAITIMPLEMENTATION_HPP_
37 #define _QUANTITATIVETRAITIMPLEMENTATION_HPP_
38 
39 
40 #include "QuantitativeTrait.hpp"
41 #include "Random.hpp"
42 
43 
50 
51 
52 //
53 // QuantitativeTrait_PopulationComposite
54 //
55 
65 
66 
67 class QuantitativeTrait_PopulationComposite : public QuantitativeTrait
68 {
69  public:
70 
71  QuantitativeTrait_PopulationComposite(const std::string& id,
72  const QuantitativeTraitPtrs& qts = QuantitativeTraitPtrs());
73 
74  virtual void calculate_trait_values(const PopulationData& population_data) const;
75  // Configurable interface
76 
77  virtual std::string class_name() const {return "QuantitativeTrait_PopulationComposite";}
78  virtual Parameters parameters() const;
79  virtual void configure(const Parameters& parameters, const Registry& registry);
80  virtual void initialize(const SimulatorConfig& config);
81  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
82 
83  private:
84 
85  QuantitativeTraitPtrs qts_;
86 };
87 
88 
89 //
90 // QuantitativeTrait_GenerationComposite
91 //
92 
102 
103 
104 class QuantitativeTrait_GenerationComposite : public QuantitativeTrait
105 {
106  public:
107 
108  typedef std::map<size_t, QuantitativeTraitPtr> GenerationQTMap;
109 
110  QuantitativeTrait_GenerationComposite(const std::string& id,
111  const GenerationQTMap& qts = GenerationQTMap());
112 
113  virtual void calculate_trait_values(const PopulationData& population_data) const;
114 
115  // Configurable interface
116 
117  virtual std::string class_name() const {return "QuantitativeTrait_GenerationComposite";}
118  virtual Parameters parameters() const;
119  virtual void configure(const Parameters& parameters, const Registry& registry);
120  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
121 
122  private:
123 
124  GenerationQTMap qts_; // generation_index -> QT
125 };
126 
127 
128 //
129 // QuantitativeTrait_SingleLocusFitness
130 //
131 
153 
154 class QuantitativeTrait_SingleLocusFitness : public QuantitativeTrait
155 {
156  public:
157 
158  QuantitativeTrait_SingleLocusFitness(const std::string& id,
159  Locus locus = Locus("id_dummy"),
160  std::vector<double> w = std::vector<double>(3));
161 
162  virtual void calculate_trait_values(const PopulationData& population_data) const;
163 
164  // Configurable interface
165 
166  virtual std::string class_name() const {return "QuantitativeTrait_SingleLocusFitness";}
167  virtual Parameters parameters() const;
168  virtual void configure(const Parameters& parameters, const Registry& registry);
169  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
170 
171  private:
172 
173  Locus locus_;
174  std::vector<double> w_; // relative fitnesses
175 };
176 
177 
178 //
179 // QTLEffect
180 //
181 
182 
183 struct QTLEffect
184 {
185  Locus locus;
186  std::vector<double> effects;
187 
188  QTLEffect();
189  QTLEffect(const Locus& l, double e0, double e1, double e2);
190  QTLEffect(const std::string& configuration, const Configurable::Registry& registry);
191  std::string configuration() const;
192 };
193 
194 
195 typedef std::vector<QTLEffect> QTLEffects;
196 
197 
198 //
199 // QTLEffectGenerator
200 //
201 
216 
218 {
219  public:
220 
221  QTLEffectGenerator(const std::string& id,
222  LocusListPtr locus_list = LocusListPtr(),
223  Random::DistributionPtr effect_size_distribution = Random::DistributionPtr(),
224  Random::DistributionPtr dominance_distribution = Random::DistributionPtr(),
225  bool random_effect_sign = false);
226 
227  void generate_qtl_effects(QTLEffects& qtl_effects) const;
228 
229  // Configurable interface
230 
231  virtual std::string class_name() const {return "QTLEffectGenerator";}
232  virtual Parameters parameters() const;
233  virtual void configure(const Parameters& parameters, const Registry& registry);
234  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
235 
236  private:
237 
238  LocusListPtr locus_list_;
239  Random::DistributionPtr effect_size_distribution_;
240  Random::DistributionPtr dominance_distribution_;
241  bool random_effect_sign_;
242 };
243 
244 
245 typedef shared_ptr<QTLEffectGenerator> QTLEffectGeneratorPtr;
246 
247 
248 //
249 // QuantitativeTrait_IndependentLoci
250 //
251 
265 
266 class QuantitativeTrait_IndependentLoci : public QuantitativeTrait
267 {
268  public:
269 
270  QuantitativeTrait_IndependentLoci(const std::string& id,
271  QTLEffects qtl_effects = QTLEffects(),
272  double environmental_variance = 0);
273 
274  virtual void calculate_trait_values(const PopulationData& population_data) const;
275 
276  const QTLEffects& qtl_effects() const {return qtl_effects_;}
277 
278  // Configurable interface
279 
280  virtual std::string class_name() const {return "QuantitativeTrait_IndependentLoci";}
281  virtual Parameters parameters() const;
282  virtual void configure(const Parameters& parameters, const Registry& registry);
283  virtual void initialize(const SimulatorConfig& config);
284  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
285 
286  private:
287 
288  QTLEffects qtl_effects_;
289  size_t qtl_effects_specified_;
290  double environmental_variance_;
291  Random::DistributionPtr environment_effect_;
292  std::vector<QTLEffectGeneratorPtr> qtl_effect_generators_;
293 };
294 
295 
296 //
297 // QuantitativeTrait_Expression
298 //
299 
300 namespace mu {class Parser;}
301 
315 
316 class QuantitativeTrait_Expression : public QuantitativeTrait
317 {
318  public:
319 
320  QuantitativeTrait_Expression(const std::string& id);
321 
322  virtual void calculate_trait_values(const PopulationData& population_data) const;
323 
324  // Configurable interface
325 
326  virtual std::string class_name() const {return "QuantitativeTrait_Expression";}
327  virtual Parameters parameters() const;
328  virtual void configure(const Parameters& parameters, const Registry& registry);
329 
330  private:
331 
332  struct Assignment
333  {
334  std::string variable;
335  std::string qtid;
336  };
337 
338  typedef std::vector<Assignment> Assignments;
339  Assignments assignments_;
340  std::string expression_;
341 
342  shared_ptr<mu::Parser> parser_;
343 };
344 
345 
346 //
347 // QuantitativeTrait_Alternator
348 //
349 
359 
360 class QuantitativeTrait_Alternator : public QuantitativeTrait
361 {
362  public:
363 
364  QuantitativeTrait_Alternator(const std::string& id) : QuantitativeTrait(id) {}
365 
366  virtual void calculate_trait_values(const PopulationData& population_data) const;
367 
368  // Configurable interface
369 
370  virtual std::string class_name() const {return "QuantitativeTrait_Alternator";}
371  virtual Parameters parameters() const {return Parameters();}
372  virtual void configure(const Parameters& parameters, const Registry& registry) {}
373 };
374 
375 
376 #endif // _QUANTITATIVETRAITIMPLEMENTATION_HPP_
377