phylopomp
Phylodynamics for POMPs
Loading...
Searching...
No Matches
curtail.cc
Go to the documentation of this file.
1// Curtail a genealogy
2// i.e., shrink the time-interval on which it is defined.
3
4#include "genealogy.h"
5#include "generics.h"
6#include "internal.h"
7
10void
12(slate_t tnew, slate_t troot)
13{
14 if (tnew < troot) troot = tnew;
15 if (!empty() && tnew < time()) {
16 node_t *p = back();
17 while (!empty() && p->slate > tnew) {
18 ball_t *b;
19 while (p->size() > 1) {
20 b = p->last_ball();
21 switch (b->color) {
22 case black:
23 p->erase(b); delete b;
24 break;
25 case green: case blue: // #nocov
26 assert(0); // #nocov
27 break; // #nocov
28 }
29 }
30 b = p->last_ball();
31 switch (b->color) {
32 case blue:
33 b->color = black;
34 case black:
35 b->deme() = p->deme();
36 swap(b,p->green_ball());
37 case green:
38 destroy_node(p);
39 break;
40 }
41 if (!empty()) p = back();
42 }
43 }
44 time() = tnew;
45 if (!empty() && troot > timezero()) {
46 node_t *p = front();
47 node_t *q;
48 while (!empty() && p->slate < troot) {
49 ball_t *b;
50 assert(p->holds_own());
51 while (p->size() > 1) {
52 b = p->last_ball();
53 switch (b->color) {
54 case blue:
55 p->erase(b); delete b;
56 break;
57 case black:
58 q = make_node(b->deme());
59 q->slate = troot;
60 move(b,p,q); push_back(q);
61 break;
62 case green:
63 q = b->child();
64 if (q == p) {
65 b = p->first_ball();
66 q = b->child();
67 }
68 if (q->slate < troot) {
69 move(b,p,q);
70 } else {
71 node_t *pp = make_node(b->deme());
72 pp->slate = troot;
73 move(b,p,pp); push_back(pp);
74 }
75 break;
76 }
77 }
78 destroy_node(p);
79 if (!empty()) p = front();
80 }
81 sort();
82 }
83 if (troot > timezero()) timezero() = troot;
84}
85
86extern "C" {
87
89 SEXP curtail (SEXP State, SEXP Time, SEXP Troot) {
90 genealogy_t A = State;
91 double t, t0;
92 t = *REAL(AS_NUMERIC(Time));
93 t0 = *REAL(AS_NUMERIC(Troot));
94 if (ISNA(t)) t = A.time();
95 if (ISNA(t0)) t0 = A.timezero();
96 A.curtail(t,t0);
97 SEXP out;
98 PROTECT(out = serial(A));
99 SET_ATTR(out,install("class"),mkString("gpgen"));
100 UNPROTECT(1);
101 return out;
102 }
103
104}
@ green
Definition ball.h:12
@ black
Definition ball.h:12
@ blue
Definition ball.h:12
Balls function as pointers.
Definition ball.h:27
name_t deme(void) const
view deme
Definition ball.h:84
color_t color
Definition ball.h:36
node_t * child(void) const
a child is the owner of a green ball
Definition ball.h:102
Encodes a genealogy.
Definition genealogy.h:19
slate_t & timezero(void)
view/set zero time.
Definition genealogy.h:153
slate_t & time(void)
view/set current time.
Definition genealogy.h:145
node_t * make_node(name_t d=undeme)
Definition genealogy.h:229
void curtail(slate_t tnew, slate_t troot)
Definition curtail.cc:12
Encodes a genealogical node.
Definition node.h:21
name_t deme(void) const
view deme
Definition node.h:96
ball_t * green_ball(void) const
pointer to my green ball
Definition node.h:88
slate_t slate
Definition node.h:33
bool holds_own(void) const
Definition node.h:118
void sort(void)
order nodes in order of increasing time
Definition nodeseq.h:103
void destroy_node(node_t *p)
remove a dead root node
Definition nodeseq.h:197
void swap(ball_t *a, ball_t *b)
swap balls a and b, wherever they lie
Definition nodeseq.h:153
void move(ball_t *b, node_t *p, node_t *q)
move ball b from p to q
Definition nodeseq.h:148
ball_t * last_ball(void) const
retrieve the last ball
Definition pocket.h:126
ball_t * first_ball(void) const
retrieve the first ball
Definition pocket.h:122
SEXP curtail(SEXP State, SEXP Time, SEXP Troot)
curtail the given genealogy
Definition curtail.cc:89
SEXP serial(const TYPE &X)
binary serialization
Definition generics.h:33
double slate_t
Definition internal.h:53