forqs module reference
Forward simulation of Recombination, Quantitative traits, and Selection
 All Classes Groups Pages
VariantIndicatorImplementation.hpp
1 //
2 // VariantIndicatorImplementation.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 _VARIANTINDICATORIMPLEMENTATION_HPP_
37 #define _VARIANTINDICATORIMPLEMENTATION_HPP_
38 
39 
40 #include "VariantIndicator.hpp"
41 #include "MSFormat.hpp"
42 #include "Random.hpp"
43 #include "Reporter.hpp"
44 
45 
51 
52 
53 //
54 // VariantIndicator_Trivial
55 //
56 
64 
65 class VariantIndicator_Trivial : public VariantIndicator
66 {
67  public:
68 
69  VariantIndicator_Trivial(const std::string& id) : Configurable(id) {}
70 
71  virtual unsigned int operator()(unsigned int chunk_id, const Locus& locus) const {return 0;}
72 
73  // Configurable interface
74 
75  virtual std::string class_name() const {return "VariantIndicator_Trivial";}
76  virtual Parameters parameters() const {return Parameters();}
77  virtual void configure(const Parameters& parameters, const Registry& registry) {}
78 };
79 
80 
81 //
82 // VariantIndicator_Composite
83 //
84 
97 
98 class VariantIndicator_Composite : public VariantIndicator
99 {
100  public:
101 
102  VariantIndicator_Composite(const std::string& id) : Configurable(id) {}
103 
104  virtual unsigned int operator()(unsigned int chunk_id, const Locus& locus) const;
105 
106  // Configurable interface
107 
108  virtual std::string class_name() const {return "VariantIndicator_Composite";}
109  virtual Parameters parameters() const;
110  virtual void configure(const Parameters& parameters, const Registry& registry);
111  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& written) const;
112 
113  private:
114 
115  VariantIndicatorPtrs variant_indicators_;
116 };
117 
118 
119 //
120 // VariantIndicator_IDRange
121 //
122 
134 
135 class VariantIndicator_IDRange : public VariantIndicator
136 {
137  public:
138 
139  VariantIndicator_IDRange(const std::string& id) : Configurable(id) {}
140 
141  virtual unsigned int operator()(unsigned int chunk_id, const Locus& locus) const;
142 
143  // Configurable interface
144 
145  virtual std::string class_name() const {return "VariantIndicator_IDRange";}
146  virtual Parameters parameters() const;
147  virtual void configure(const Parameters& parameters, const Registry& registry);
148  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& written) const;
149 
150  protected:
151 
152  struct Entry
153  {
154  unsigned int id_start;
155  unsigned int id_count;
156  unsigned int id_step;
157  unsigned int value;
158 
159  Entry(unsigned int _id_start, unsigned int _id_count, unsigned int _id_step, unsigned int _value)
160  : id_start(_id_start), id_count(_id_count), id_step(_id_step), value(_value)
161  {}
162  };
163 
164  typedef std::multimap<Locus,Entry> EntryMap;
165  EntryMap entries_;
166 };
167 
168 
169 //
170 // VariantIndicator_IDSet
171 //
172 
184 
185 class VariantIndicator_IDSet : public VariantIndicator
186 {
187  public:
188 
189  VariantIndicator_IDSet(const std::string& id) : Configurable(id) {}
190  virtual unsigned int operator()(unsigned int chunk_id, const Locus& locus) const;
191  virtual void write_file(const std::string& filename) const;
192 
193  // Configurable interface
194 
195  virtual std::string class_name() const {return "VariantIndicator_IDSet";}
196  virtual Parameters parameters() const;
197  virtual void configure(const Parameters& parameters, const Registry& registry);
198  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& written) const;
199 
200  struct Entry
201  {
202  unsigned int value;
203  std::set<unsigned int> ids;
204 
205  Entry(unsigned int _value = -1u, std::set<unsigned int> _ids = std::set<unsigned int>())
206  : value(_value), ids(_ids)
207  {}
208  };
209 
210  typedef std::map<Locus,Entry> EntryMap;
211 
212  const EntryMap& entries() const {return entries_;} // for testing
213 
214  protected:
215 
216  EntryMap entries_;
217 };
218 
219 
220 //
221 // VariantIndicator_Random
222 //
223 
240 
242 {
243  public:
244 
245  VariantIndicator_Random(const std::string& id) : Configurable(id), VariantIndicator_IDSet(id) {}
246 
247  // Configurable interface
248 
249  virtual std::string class_name() const {return "VariantIndicator_Random";}
250  virtual Parameters parameters() const;
251  virtual void configure(const Parameters& parameters, const Registry& registry);
252  virtual void initialize(const SimulatorConfig& simconfig);
253  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& written) const;
254 
255  private:
256 
257  struct LocusListInfo
258  {
259  size_t population_index;
260  LocusListPtr locus_list;
261  std::vector<double> frequencies;
262  Random::DistributionPtr distribution;
263 
264  LocusListInfo(size_t _population_index, const LocusListPtr& _locus_list,
265  std::vector<double> _frequencies)
266  : population_index(_population_index), locus_list(_locus_list), frequencies(_frequencies)
267  {}
268 
269  LocusListInfo(size_t _population_index, const LocusListPtr& _locus_list,
270  Random::DistributionPtr _distribution)
271  : population_index(_population_index), locus_list(_locus_list), distribution(_distribution)
272  {}
273  };
274 
275  typedef std::vector<LocusListInfo> LocusListInfos;
276  LocusListInfos locus_list_infos_;
277 };
278 
279 
280 //
281 // VariantIndicator_File
282 //
283 
299 
300 class VariantIndicator_File : public VariantIndicator
301 {
302  public:
303 
304  VariantIndicator_File(const std::string& id) : Configurable(id) {}
305 
306  virtual unsigned int operator()(unsigned int chunk_id, const Locus& locus) const;
307 
308  // Configurable interface
309 
310  virtual std::string class_name() const {return "VariantIndicator_File";}
311  virtual Parameters parameters() const;
312  virtual void configure(const Parameters& parameters, const Registry& registry);
313  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& written) const;
314 
315  private:
316 
317  std::string msfile_;
318  MSFormatPtr ms_;
319  std::vector<std::string> locus_ids_;
320 
321  std::vector<Locus> loci_;
322  std::map<Locus, size_t> locus_index_map_;
323  ConfigurablePtrs children_;
324 };
325 
326 
327 //
328 // VariantIndicator_SingleLocusHardyWeinberg
329 //
330 
351 
353 {
354  public:
355 
356  VariantIndicator_SingleLocusHardyWeinberg(const std::string& id,
357  Locus locus = Locus("id_dummy"),
358  double allele_frequency = 0);
359  // Configurable interface
360 
361  virtual std::string class_name() const {return "VariantIndicator_SingleLocusHardyWeinberg";}
362  virtual Parameters parameters() const;
363  virtual void configure(const Parameters& parameters, const Registry& registry);
364  virtual void initialize(const SimulatorConfig& simconfig);
365  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& written) const;
366 
367  private:
368 
369  Locus locus_;
370  double allele_frequency_;
371 };
372 
373 
374 //
375 // VariantIndicator_TwoLocusLD
376 //
377 
398 
399 class VariantIndicator_TwoLocusLD : public VariantIndicator
400 {
401  public:
402 
403  VariantIndicator_TwoLocusLD(const std::string& id,
404  size_t population_size = 0,
405  Locus locus_1 = Locus("id_dummy_1"),
406  double allele_frequency_1 = 0,
407  Locus locus_2 = Locus("id_dummy_2"),
408  double allele_frequency_2 = 0,
409  double D = 0,
410  unsigned int id_offset_step = 0);
411 
412  virtual unsigned int operator()(unsigned int chunk_id, const Locus& locus) const;
413 
414  // Configurable interface
415 
416  virtual std::string class_name() const {return "VariantIndicator_TwoLocusLD";}
417  virtual Parameters parameters() const;
418  virtual void configure(const Parameters& parameters, const Registry& registry);
419  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& written) const;
420 
421  private:
422 
423  size_t population_size_;
424  Locus locus_1_;
425  double allele_frequency_1_;
426  Locus locus_2_;
427  double allele_frequency_2_;
428  double D_;
429  unsigned int id_offset_step_;
430 
431  size_t max_00_;
432  size_t max_01_;
433  size_t max_10_;
434  size_t max_11_;
435 
436  void initialize_internal();
437 };
438 
439 
440 //
441 // VariantIndicator_Mutable
442 //
443 
444 //
445 // wrapper implementation for handling mutation
446 //
447 
448 class VariantIndicator_Mutable : public VariantIndicator, public Reporter
449 {
450  public:
451 
452  VariantIndicator_Mutable(const std::string& id,
453  unsigned int unused_id_start = 0,
454  VariantIndicatorPtr vi = VariantIndicatorPtr(),
455  const std::string& output_directory = "");
456 
457  virtual unsigned int operator()(unsigned int chunk_id, const Locus& locus) const;
458 
459  virtual unsigned int mutate(unsigned int old_chunk_id, const Locus& locus, unsigned int value);
460 
461  void report(std::ostream& os) const;
462 
463  // Configurable interface
464 
465  virtual std::string class_name() const {return "VariantIndicator_Mutable";}
466  virtual Parameters parameters() const;
467  virtual void configure(const Parameters& parameters, const Registry& registry);
468  virtual void initialize(const SimulatorConfig& simconfig);
469  virtual void write_child_configurations(std::ostream& os, std::set<std::string>& written) const;
470 
471  // Reporter interface
472 
473  virtual void update(size_t generation_index,
474  const PopulationPtrs& populations,
475  const PopulationDataPtrs& population_datas,
476  bool is_final_generation);
477 
478  virtual Loci loci(size_t generation_index,
479  bool is_final_generation) const;
480 
481  private:
482 
483  unsigned int unused_id_start_;
484  unsigned int unused_id_current_;
485  VariantIndicatorPtr vi_;
486  bfs::path outdir_;
487  bfs::ofstream os_debug_;
488 
489  typedef std::map<unsigned int, unsigned int> IDAncestry;
490  IDAncestry id_ancestry_;
491 
492  typedef std::map<unsigned int, unsigned int> IDValueMap;
493  typedef std::map<Locus, IDValueMap> IDValueMaps;
494  IDValueMaps id_value_maps_;
495 };
496 
497 
498 #endif // _VARIANTINDICATORIMPLEMENTATION_HPP_
499 
500