phylopomp
Phylodynamics for POMPs
Loading...
Searching...
No Matches
genealogy.h
Go to the documentation of this file.
1// -*- C++ -*-
2// GENEALOGY class
3
4#ifndef _GENEALOGY_H_
5#define _GENEALOGY_H_
6
7#include <utility>
8#include <stdexcept>
9#include <vector>
10
11#include "nodeseq.h"
12#include "internal.h"
13
14static const size_t MEMORY_MAX = (1<<28); // 256MB
15
17
20class genealogy_t : public nodeseq_t {
21
22private:
23
24 // GENEALOGY member data:
25 // - a counter of serial numbers
26 // - an initial time
27 // - the current time
28 // - a sequence of nodes
29
37 size_t _ndeme;
38
39 const static name_t magic = 1123581321;
40
41private:
42
44 name_t unique (void) {
45 name_t u = _unique;
46 _unique++;
47 return u;
48 };
49
51 void clean (void) {
52 _unique = 0;
53 _ndeme = 0;
54 _t0 = _time = R_NaReal;
55 };
56
57public:
58
60 size_t ndeme (void) const {
61 return _ndeme;
62 };
63
64 size_t& ndeme (void) {
65 return _ndeme;
66 };
67
68public:
69
70 // SERIALIZATION
72 size_t bytesize (void) const {
73 return 3*sizeof(name_t) +
74 2*sizeof(slate_t) + nodeseq_t::bytesize();
75 };
76
77 friend raw_t* operator>> (const genealogy_t& G, raw_t* o) {
78 name_t A[3]; A[0] = magic; A[1] = G._unique; A[2] = name_t(G.ndeme());
79 slate_t B[2]; B[0] = G.timezero(); B[1] = G.time();
80 memcpy(o,A,sizeof(A)); o += sizeof(A);
81 memcpy(o,B,sizeof(B)); o += sizeof(B);
82 return reinterpret_cast<const nodeseq_t&>(G) >> o;
83 };
84
86 G.clean();
87 name_t A[3];
88 slate_t B[2];
89 memcpy(A,o,sizeof(A)); o += sizeof(A);
90 memcpy(B,o,sizeof(B)); o += sizeof(B);
91 if (A[0] != magic)
92 err("in %s: corrupted genealogy serialization.",__func__);
93 G._unique = A[1]; G.ndeme() = size_t(A[2]);
94 G.timezero() = B[0]; G.time() = B[1];
95 return o >> reinterpret_cast<nodeseq_t&>(G);
96 };
97
98public:
99 // CONSTRUCTORS
103 genealogy_t (double t0 = R_NaReal, size_t ndeme = 0) {
104 clean();
105 _time = _t0 = slate_t(t0);
106 _ndeme = ndeme;
107 };
108
110 o >> *this;
111 };
112
113 genealogy_t (SEXP o) {
114 if (LENGTH(o)==0)
115 err("in %s: cannot deserialize a NULL.",__func__);
116 PROTECT(o = AS_RAW(o));
117 RAW(o) >> *this;
118 UNPROTECT(1);
119 };
120
122 raw_t *o = new raw_t[G.bytesize()];
123 G >> o;
124 o >> *this;
125 delete[] o;
126 };
127
129 clean();
130 raw_t *o = new raw_t[G.bytesize()];
131 G >> o;
132 o >> *this;
133 delete[] o;
134 return *this;
135 };
136
142 clean();
143 };
144
146 slate_t& time (void) {
147 return _time;
148 };
149
150 slate_t time (void) const {
151 return _time;
152 };
153
155 return _t0;
156 };
157
158 slate_t timezero (void) const {
159 return _t0;
160 };
161
162public:
163
171 void lineage_count (double *tout, int *deme,
172 int *ell, int *sat, int *etype) const;
174 SEXP lineage_count (void) const;
175
177 void gendat (double *tout, int *anc, int *lin,
178 int *sat, int *type, int *deme,
179 int *index, int *child) const;
181 SEXP gendat (void) const;
182
184 size_t nsample (void) const {
185 size_t n = 0;
186 for (const node_t *p : *this) {
187 if (p->holds(blue)) n++;
188 }
189 return n;
190 };
191
193 size_t nroot (void) const {
194 size_t n = 0;
195 for (const node_t *p : *this) {
196 if (p->is_root()) n++;
197 }
198 return n;
199 };
200
201public:
202
204 string_t yaml (string_t tab = "") const;
206 SEXP structure (void) const;
208 string_t newick (bool extended = true) const;
209
210public:
211
213 void valid (void) const {};
215 bool check_genealogy_size (size_t grace = 0) const {
216 static size_t maxq = MEMORY_MAX/(sizeof(node_t)+2*sizeof(ball_t));
217 bool ok = true;
218 if (size() > maxq+grace) {
219 err("maximum genealogy size exceeded!"); // #nocov
220 } else if (size() > maxq) {
221 ok = false; // #nocov
222 }
223 return ok;
224 };
225
226private:
227
232 name_t u = unique();
233 node_t *p = new node_t(u,_time);
234 ball_t *g = new ball_t(p,u,green,d);
235 p->green_ball() = g;
236 p->insert(g);
237 return p;
238 };
239
240public:
241
244 time() = t;
245 node_t *p = make_node(a->deme());
246 ball_t *b = new ball_t (p,p->uniq,black,d);
247 p->insert(b);
248 p->slate = time();
249 add(p,a);
250 return b;
251 };
252
254 ball_t *b = new ball_t(p,unique(),black,d);
255 p->insert(b);
256 return b;
257 };
258
259 void death (ball_t *a, slate_t t) {
260 time() = t;
261 drop(a);
262 };
263
265 time() = t;
266 node_t *p = make_node();
267 ball_t *b = new ball_t (p,p->uniq,black,d);
268 p->insert(b);
269 p->slate = timezero();
270 push_front(p);
271 return b;
272 };
273
274 void sample (ball_t* a, slate_t t) {
275 time() = t;
276 node_t *p = make_node(a->deme());
277 ball_t *b = new ball_t (p,p->uniq,blue,a->deme());
278 p->insert(b);
279 p->slate = time();
280 add(p,a);
281 };
282
284 time() = t;
285 node_t *p = make_node(a->deme());
286 ball_t *b = new ball_t (p,p->uniq,blue,a->deme());
287 p->insert(b);
288 p->slate = time();
289 add(p,a);
290 drop(a);
291 };
292
293 void migrate (ball_t* a, slate_t t, name_t d = 0) {
294 time() = t;
295 node_t *p = make_node(a->deme());
296 p->slate = time();
297 add(p,a);
298 a->deme() = d;
299 };
300
301 void sample_migrate (ball_t* a, slate_t t, name_t d = 0) {
302 time() = t;
303 node_t *p = make_node(a->deme());
304 ball_t *b = new ball_t (p,p->uniq,blue,a->deme());
305 p->insert(b);
306 p->slate = time();
307 add(p,a);
308 a->deme() = d;
309 };
310
312 pocket_t *blacks = colored(black);
313 while (!blacks->empty()) {
314 ball_t *b = *(blacks->begin());
315 blacks->erase(b);
316 drop(b);
317 }
318 delete blacks;
319 return *this;
320 };
321
323 // erase deme information from black balls.
324 pocket_t *blacks = colored(black);
325 while (!blacks->empty()) {
326 ball_t *a = *(blacks->begin());
327 a->deme() = undeme;
328 blacks->erase(a);
329 }
330 delete blacks;
331 // erase deme information from nodes.
332 for (node_t *p : *this) {
333 p->deme() = undeme;
334 }
335 // drop superfluous nodes (holding just one ball).
336 comb();
337 ndeme() = 0;
338 return *this;
339 };
340
343 void curtail (slate_t tnew, slate_t troot);
344
345private:
346
347 void reuniqify (name_t shift);
348
349public:
350
356 genealogy_t& operator+= (const genealogy_t& other);
357
360 for (node_t *p : *this) {
361 if (p->holds(green) && p->holds(blue)) {
362 assert(!p->holds(black)); // genealogy should have already been pruned
363 ball_t *b = p->last_ball();
364 assert(b->is(blue));
365 node_t *q = make_node(p->deme());
366 q->slate = p->slate;
367 swap(q->green_ball(),b);
368 push_back(q);
369 }
370 }
371 sort();
372 return *this;
373 };
374
375private:
377 void clip_zlb (void);
380 void cap_tips (void);
382 void cap_roots (void) {
383 node_nit j = begin();
384 while (j != end()) {
385 if ((*j)->is_root() && (*j)->slate > timezero()) {
386 node_t *q = make_node();
387 q->slate = timezero();
388 attach(q,*j);
389 push_front(q);
390 }
391 j++;
392 }
393 sort();
394 };
395
398 node_t *scan_branch_label (string_t::const_iterator b, string_t::const_iterator e, node_t *p, slate_t bl);
399
400public:
401
403 genealogy_t& parse (const string_t&);
404
405 void time_rescale (slate_t scale, slate_t origin = 0) {
406 timezero() = scale*(timezero()-origin);
407 for (node_t *p : *this ) {
408 p->slate = scale*(p->slate-origin);
409 }
410 time() = scale*(time()-origin);
411 };
412
414 friend SEXP cblv (genealogy_t&);
415
417 genealogy_t& parse_cblv (const double *, const double *, int, double);
418
419private:
420
424 std::pair<std::vector<slate_t>, std::vector<slate_t>> cblv (void) const;
425
426};
427
428#endif
@ green
Definition ball.h:12
@ black
Definition ball.h:12
@ blue
Definition ball.h:12
static const name_t undeme
Definition ball.h:15
Balls function as pointers.
Definition ball.h:27
name_t deme(void) const
view deme
Definition ball.h:84
bool is(color_t c) const
is a given ball of the given color?
Definition ball.h:115
Encodes a genealogy.
Definition genealogy.h:20
size_t & ndeme(void)
number of demes
Definition genealogy.h:64
void time_rescale(slate_t scale, slate_t origin=0)
Definition genealogy.h:405
slate_t time(void) const
view current time.
Definition genealogy.h:150
size_t nsample(void) const
number of samples
Definition genealogy.h:184
~genealogy_t(void)
destructor
Definition genealogy.h:141
SEXP structure(void) const
R list description.
Definition structure.cc:85
void clean(void)
clean up
Definition genealogy.h:51
void reuniqify(name_t shift)
shifts names to avoid overlap
Definition sum.cc:21
void valid(void) const
check the validity of the genealogy.
Definition genealogy.h:213
genealogy_t(SEXP o)
constructor from RAW SEXP (containing binary serialization)
Definition genealogy.h:113
genealogy_t & operator=(const genealogy_t &G)
copy assignment operator
Definition genealogy.h:128
void death(ball_t *a, slate_t t)
death
Definition genealogy.h:259
SEXP lineage_count(void) const
lineage count and saturation
Definition lineages.cc:80
genealogy_t & prune(void)
prune the tree (drop all black balls)
Definition genealogy.h:311
size_t bytesize(void) const
size of serialized binary form
Definition genealogy.h:72
genealogy_t(double t0=R_NaReal, size_t ndeme=0)
Definition genealogy.h:103
string_t yaml(string_t tab="") const
human/machine-readable info
Definition yaml.cc:64
size_t ndeme(void) const
number of demes
Definition genealogy.h:60
genealogy_t & parse_cblv(const double *, const double *, int, double)
parse a CBLV representation in the vectors x and y.
Definition cblv.cc:94
genealogy_t(const genealogy_t &G)
copy constructor
Definition genealogy.h:121
bool check_genealogy_size(size_t grace=0) const
check the size of the genealogy (to prevent memory exhaustion).
Definition genealogy.h:215
slate_t timezero(void) const
get zero time.
Definition genealogy.h:158
ball_t * graft(slate_t t, name_t d)
graft a new lineage into deme d
Definition genealogy.h:264
genealogy_t & parse(const string_t &)
Parse a Newick string and create the indicated genealogy.
Definition parse.cc:154
void cap_tips(void)
Definition parse.cc:9
void clip_zlb(void)
clip out all zero-length branches
Definition parse.cc:22
void migrate(ball_t *a, slate_t t, name_t d=0)
movement into deme d
Definition genealogy.h:293
slate_t _time
The current time.
Definition genealogy.h:35
SEXP gendat(void) const
genealogy information in list format
Definition gendat.cc:60
ball_t * birth(node_t *p, name_t d)
birth of second or subsequent sibling into deme d
Definition genealogy.h:253
genealogy_t & operator+=(const genealogy_t &other)
merges two genealogies, adjusting time, t0, and ndeme as needed
Definition sum.cc:30
size_t _ndeme
The number of demes (excluding the undeme).
Definition genealogy.h:37
slate_t & timezero(void)
view/set zero time.
Definition genealogy.h:154
std::pair< std::vector< slate_t >, std::vector< slate_t > > cblv(void) const
Definition cblv.cc:73
void cap_roots(void)
roots are added at zero time if needed
Definition genealogy.h:382
void sample_death(ball_t *a, slate_t t)
insert a sample node and simultaneously terminate the lineage
Definition genealogy.h:283
genealogy_t(raw_t *o)
constructor from serialized binary form
Definition genealogy.h:109
slate_t & time(void)
view/set current time.
Definition genealogy.h:146
node_t * make_node(name_t d=undeme)
Definition genealogy.h:230
void curtail(slate_t tnew, slate_t troot)
Definition curtail.cc:12
friend raw_t * operator>>(const genealogy_t &G, raw_t *o)
binary serialization
Definition genealogy.h:77
void sample_migrate(ball_t *a, slate_t t, name_t d=0)
insert a sample node and simultaneously migrate the lineage
Definition genealogy.h:301
static const name_t magic
Definition genealogy.h:39
name_t unique(void)
get the next unique name
Definition genealogy.h:44
void sample(ball_t *a, slate_t t)
insert a sample node
Definition genealogy.h:274
slate_t _t0
The initial time.
Definition genealogy.h:33
name_t _unique
The next unique name.
Definition genealogy.h:31
size_t nroot(void) const
number of roots
Definition genealogy.h:193
genealogy_t(genealogy_t &&)=default
move constructor
ball_t * birth(ball_t *a, slate_t t, name_t d)
birth into deme d
Definition genealogy.h:243
genealogy_t & obscure(void)
erase all deme information
Definition genealogy.h:322
node_t * scan_branch_label(string_t::const_iterator b, string_t::const_iterator e, node_t *p, slate_t bl)
Definition parse.cc:125
string_t newick(bool extended=true) const
put genealogy at current time into Newick format.
Definition newick.cc:107
genealogy_t & insert_zlb(void)
insert zero-length branches for samples where needed
Definition genealogy.h:359
Encodes a genealogical node.
Definition node.h:23
bool is_root(void) const
Definition node.h:120
name_t deme(void) const
view deme
Definition node.h:98
name_t uniq
Definition node.h:34
ball_t * green_ball(void) const
pointer to my green ball
Definition node.h:90
void insert(ball_t *a)
insert a ball into the pocket of a node
Definition node.h:167
slate_t slate
Definition node.h:35
A sequence of nodes.
Definition nodeseq.h:19
void comb(void)
Definition nodeseq.h:223
void sort(void)
order nodes in order of increasing time
Definition nodeseq.h:111
void attach(node_t *p, node_t *q)
Definition nodeseq.h:171
size_t bytesize(void) const
size of serialized binary form
Definition nodeseq.h:40
void drop(ball_t *a)
Definition nodeseq.h:189
void swap(ball_t *a, ball_t *b)
swap balls a and b, wherever they lie
Definition nodeseq.h:161
pocket_t * colored(color_t col) const
Get all balls of a color.
Definition nodeseq.h:118
void add(node_t *p, ball_t *a)
Definition nodeseq.h:181
A pocket is a set of balls.
Definition pocket.h:30
ball_t * last_ball(void) const
retrieve the last ball
Definition pocket.h:118
bool holds(ball_t *b) const
does this node hold the given ball?
Definition pocket.h:101
static const size_t MEMORY_MAX
Definition genealogy.h:14
Rbyte raw_t
Definition internal.h:52
size_t name_t
Definition internal.h:54
#define err(...)
Definition internal.h:18
double slate_t
Definition internal.h:53
static const int deme
Definition lbdp.cc:7
#define ell
Definition lbdp_pomp.c:11
#define n
Definition lbdp_pomp.c:9
std::list< node_t * >::iterator node_nit
Definition nodeseq.h:15