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 
146 
147 class QuantitativeTrait_SingleLocusFitness : public QuantitativeTrait
148 {
149  public:
150 
151  QuantitativeTrait_SingleLocusFitness(const std::string& id,
152  Locus locus = Locus("id_dummy"),
153  std::vector<double> w = std::vector<double>(3));
154 
155  virtual void calculate_trait_values(const PopulationData& population_data) const;
156 
157  // Configurable interface
158 
159  virtual std::string class_name() const {return "QuantitativeTrait_SingleLocusFitness";}
160  virtual Parameters parameters() const;
161  virtual void configure(const Parameters& parameters, const Registry& registry);
162  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
163 
164  private:
165 
166  Locus locus_;
167  std::vector<double> w_; // relative fitnesses
168 };
169 
170 
171 //
172 // QTLEffect
173 //
174 
175 
176 struct QTLEffect
177 {
178  Locus locus;
179  std::vector<double> effects;
180 
181  QTLEffect();
182  QTLEffect(const Locus& l, double e0, double e1, double e2);
183  QTLEffect(const std::string& configuration, const Configurable::Registry& registry);
184  std::string configuration() const;
185 };
186 
187 
188 typedef std::vector<QTLEffect> QTLEffects;
189 
190 
191 //
192 // QTLEffectGenerator
193 //
194 
209 
211 {
212  public:
213 
214  QTLEffectGenerator(const std::string& id,
215  LocusListPtr locus_list = LocusListPtr(),
216  Random::DistributionPtr effect_size_distribution = Random::DistributionPtr(),
217  Random::DistributionPtr dominance_distribution = Random::DistributionPtr(),
218  bool random_effect_sign = false);
219 
220  void generate_qtl_effects(QTLEffects& qtl_effects) const;
221 
222  // Configurable interface
223 
224  virtual std::string class_name() const {return "QTLEffectGenerator";}
225  virtual Parameters parameters() const;
226  virtual void configure(const Parameters& parameters, const Registry& registry);
227  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
228 
229  private:
230 
231  LocusListPtr locus_list_;
232  Random::DistributionPtr effect_size_distribution_;
233  Random::DistributionPtr dominance_distribution_;
234  bool random_effect_sign_;
235 };
236 
237 
238 typedef shared_ptr<QTLEffectGenerator> QTLEffectGeneratorPtr;
239 
240 
241 //
242 // QuantitativeTrait_IndependentLoci
243 //
244 
258 
259 class QuantitativeTrait_IndependentLoci : public QuantitativeTrait
260 {
261  public:
262 
263  QuantitativeTrait_IndependentLoci(const std::string& id,
264  QTLEffects qtl_effects = QTLEffects(),
265  double environmental_variance = 0);
266 
267  virtual void calculate_trait_values(const PopulationData& population_data) const;
268 
269  const QTLEffects& qtl_effects() const {return qtl_effects_;}
270 
271  // Configurable interface
272 
273  virtual std::string class_name() const {return "QuantitativeTrait_IndependentLoci";}
274  virtual Parameters parameters() const;
275  virtual void configure(const Parameters& parameters, const Registry& registry);
276  virtual void initialize(const SimulatorConfig& config);
277  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& ids_written) const;
278 
279  private:
280 
281  QTLEffects qtl_effects_;
282  size_t qtl_effects_specified_;
283  double environmental_variance_;
284  Random::DistributionPtr environment_effect_;
285  std::vector<QTLEffectGeneratorPtr> qtl_effect_generators_;
286 };
287 
288 
289 //
290 // QuantitativeTrait_Expression
291 //
292 
293 namespace mu {class Parser;}
294 
308 
309 class QuantitativeTrait_Expression : public QuantitativeTrait
310 {
311  public:
312 
313  QuantitativeTrait_Expression(const std::string& id);
314 
315  virtual void calculate_trait_values(const PopulationData& population_data) const;
316 
317  // Configurable interface
318 
319  virtual std::string class_name() const {return "QuantitativeTrait_Expression";}
320  virtual Parameters parameters() const;
321  virtual void configure(const Parameters& parameters, const Registry& registry);
322 
323  private:
324 
325  struct Assignment
326  {
327  std::string variable;
328  std::string qtid;
329  };
330 
331  typedef std::vector<Assignment> Assignments;
332  Assignments assignments_;
333  std::string expression_;
334 
335  shared_ptr<mu::Parser> parser_;
336 };
337 
338 
339 //
340 // QuantitativeTrait_Alternator
341 //
342 
352 
353 class QuantitativeTrait_Alternator : public QuantitativeTrait
354 {
355  public:
356 
357  QuantitativeTrait_Alternator(const std::string& id) : QuantitativeTrait(id) {}
358 
359  virtual void calculate_trait_values(const PopulationData& population_data) const;
360 
361  // Configurable interface
362 
363  virtual std::string class_name() const {return "QuantitativeTrait_Alternator";}
364  virtual Parameters parameters() const {return Parameters();}
365  virtual void configure(const Parameters& parameters, const Registry& registry) {}
366 };
367 
368 
369 #endif // _QUANTITATIVETRAITIMPLEMENTATION_HPP_
370