phylopomp
Phylodynamics for POMPs
Loading...
Searching...
No Matches
nodeseq_t Class Reference

A sequence of nodes. More...

#include <nodeseq.h>

Inheritance diagram for nodeseq_t:
Collaboration diagram for nodeseq_t:

Public Member Functions

 ~nodeseq_t (void)
 destructor
 
size_t bytesize (void) const
 size of serialized binary form
 
nodeseq_toperator+= (nodeseq_t &other)
 merge two node sequences
 
void sort (void)
 order nodes in order of increasing time
 
pocket_tcolored (color_t col) const
 Get all balls of a color.
 
size_t ntime (slate_t t) const
 Number of distinct timepoints.
 
size_t length (void) const
 Number of nodes in the sequence.
 
node_tposition (int n)
 traverse to nth node, retrieve pointer
 
void swap (ball_t *a, ball_t *b)
 swap balls a and b, wherever they lie
 
void add (node_t *p, ball_t *a)
 
void drop (ball_t *a)
 
void destroy_node (node_t *p)
 remove a dead root node
 
void comb (void)
 
void trace_lineages (void)
 
std::string describe (void) const
 human-readable info
 
virtual std::string yaml (std::string tab="") const
 human- & machine-readable info
 
SEXP structure (void) const
 R list description.
 
std::string newick (slate_t t) const
 put genealogy at time t into Newick format.
 

Private Member Functions

void clean (void)
 clean up: delete all nodes, reset globals
 
void repair_owners (std::unordered_map< name_t, ball_t * > &names)
 
slate_t dawn (void) const
 Earliest time in the sequence.
 
slate_t dusk (void) const
 Latest time in the sequence.
 
void trace_lineage (ball_t *b, name_t u)
 

Static Private Member Functions

static bool compare (node_t *p, node_t *q)
 

Friends

raw_toperator>> (const nodeseq_t &G, raw_t *o)
 binary serialization
 
raw_toperator>> (raw_t *o, nodeseq_t &G)
 binary deserialization
 

Detailed Description

A sequence of nodes.

Definition at line 19 of file nodeseq.h.

Constructor & Destructor Documentation

◆ ~nodeseq_t()

nodeseq_t::~nodeseq_t ( void )
inline

destructor

Definition at line 32 of file nodeseq.h.

32 {
33 clean();
34 };
void clean(void)
clean up: delete all nodes, reset globals
Definition nodeseq.h:24
Here is the call graph for this function:

Member Function Documentation

◆ add()

void nodeseq_t::add ( node_t * p,
ball_t * a )
inline

add node p; take as parent the node holding ball a. the deme of p is changed to match that of a

Definition at line 179 of file nodeseq.h.

179 {
180 swap(a,p->green_ball());
181 p->deme() = a->deme();
182 push_back(p);
183 };
name_t deme(void) const
view deme
Definition ball.h:86
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
void swap(ball_t *a, ball_t *b)
swap balls a and b, wherever they lie
Definition nodeseq.h:169
Here is the call graph for this function:
Here is the caller graph for this function:

◆ bytesize()

size_t nodeseq_t::bytesize ( void ) const
inline

size of serialized binary form

Definition at line 40 of file nodeseq.h.

40 {
41 size_t s = sizeof(size_t);
42 for (node_t *p : *this)
43 s += p->bytesize();
44 return s;
45 };
size_t bytesize(void) const
size of binary serialization
Definition node.h:40
Here is the call graph for this function:
Here is the caller graph for this function:

◆ clean()

void nodeseq_t::clean ( void )
inlineprivate

clean up: delete all nodes, reset globals

Definition at line 24 of file nodeseq.h.

24 {
25 for (node_t *p : *this) delete p;
26 clear();
27 };
Here is the caller graph for this function:

◆ colored()

pocket_t * nodeseq_t::colored ( color_t col) const
inline

Get all balls of a color.

Definition at line 131 of file nodeseq.h.

131 {
132 pocket_t *p = new pocket_t;
133 for (node_t *q : *this) {
134 for (ball_t *b : *q ) {
135 if (b->is(col)) p->insert(b);
136 }
137 }
138 return p;
139 };
Here is the caller graph for this function:

◆ comb()

void nodeseq_t::comb ( void )
inline

pass through the sequence, dropping superfluous nodes i.e., those holding just one ball that is green.

Definition at line 210 of file nodeseq.h.

210 {
211 for (node_rev_it i = crbegin(); i != crend(); i++) {
212 if ((*i)->size() == 1 && (*i)->holds(green)) {
213 swap((*i)->last_ball(),(*i)->green_ball());
214 }
215 }
216 node_nit j = begin();
217 while (j != end()) {
218 if ((*j)->dead_root()) {
219 destroy_node(*(j++));
220 } else {
221 j++;
222 }
223 }
224 };
@ green
Definition ball.h:14
void destroy_node(node_t *p)
remove a dead root node
Definition nodeseq.h:203
std::list< node_t * >::const_reverse_iterator node_rev_it
Definition nodeseq.h:16
std::list< node_t * >::iterator node_nit
Definition nodeseq.h:15
Here is the call graph for this function:
Here is the caller graph for this function:

◆ compare()

static bool nodeseq_t::compare ( node_t * p,
node_t * q )
inlinestaticprivate

Order relation among nodes. An ancestor node should always come before its descendants. Nodes should be ordered by time, then arbitrarily.

Definition at line 97 of file nodeseq.h.

97 {
98 return (p->slate < q->slate) ||
99 ((p->slate == q->slate) &&
100 ((p==q->green_ball()->holder()) ||
101 ((q!=p->green_ball()->holder()) && (p->uniq < q->uniq))));
102 };
node_t * holder(void) const
in whose pocket do I lie?
Definition ball.h:109
name_t uniq
Definition node.h:34
slate_t slate
Definition node.h:35
Here is the call graph for this function:
Here is the caller graph for this function:

◆ dawn()

slate_t nodeseq_t::dawn ( void ) const
inlineprivate

Earliest time in the sequence.

Definition at line 120 of file nodeseq.h.

120 {
121 return (empty()) ? R_NaReal : front()->slate;
122 };
Here is the caller graph for this function:

◆ describe()

std::string nodeseq_t::describe ( void ) const
inline

human-readable info

Definition at line 262 of file nodeseq.h.

262 {
263 std::string o = "";
264 for (node_t *p : *this) {
265 o += p->describe();
266 }
267 return o;
268 };
std::string describe(void) const
human-readable info
Definition node.h:177
Here is the call graph for this function:
Here is the caller graph for this function:

◆ destroy_node()

void nodeseq_t::destroy_node ( node_t * p)
inline

remove a dead root node

Definition at line 203 of file nodeseq.h.

203 {
204 assert(p->dead_root());
205 remove(p);
206 delete p;
207 };
bool dead_root(void) const
Definition node.h:124
Here is the call graph for this function:
Here is the caller graph for this function:

◆ drop()

void nodeseq_t::drop ( ball_t * a)
inline

drop the black ball 'a' and the node if either (1) the node becomes thereby a dead root, or (2) the node's pocket becomes thereby empty.

Definition at line 187 of file nodeseq.h.

187 {
188 assert(a->is(black));
189 node_t *p = a->holder();
190 if (p->size() > 1) {
191 p->erase(a);
192 delete a;
193 if (p->dead_root()) { // remove isolated root
194 destroy_node(p);
195 }
196 } else {
197 swap(a,p->green_ball());
198 destroy_node(p);
199 drop(a); // recurse
200 }
201 };
@ black
Definition ball.h:14
bool is(color_t c) const
is a given ball of the given color?
Definition ball.h:117
void drop(ball_t *a)
Definition nodeseq.h:187
Here is the call graph for this function:
Here is the caller graph for this function:

◆ dusk()

slate_t nodeseq_t::dusk ( void ) const
inlineprivate

Latest time in the sequence.

Definition at line 124 of file nodeseq.h.

124 {
125 return (empty()) ? R_NaReal : back()->slate;
126 }

◆ length()

size_t nodeseq_t::length ( void ) const
inline

Number of nodes in the sequence.

Definition at line 152 of file nodeseq.h.

152 {
153 return this->size();
154 };
Here is the caller graph for this function:

◆ newick()

std::string nodeseq_t::newick ( slate_t t) const
inline

put genealogy at time t into Newick format.

Definition at line 290 of file nodeseq.h.

290 {
291 slate_t te = dawn();
292 std::string o = "";
293 for (node_t *p : *this) {
294 if (p->is_root()) {
295 o += p->newick(t,te) + ";";
296 }
297 }
298 return o;
299 };
bool is_root(void) const
Definition node.h:121
std::string newick(const slate_t &tnow, const slate_t &tpar) const
Newick format.
Definition node.h:214
slate_t dawn(void) const
Earliest time in the sequence.
Definition nodeseq.h:120
double slate_t
Definition internal.h:44
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ntime()

size_t nodeseq_t::ntime ( slate_t t) const
inline

Number of distinct timepoints.

Definition at line 141 of file nodeseq.h.

141 {
142 size_t count = 1;
143 for (node_t *p : *this) {
144 if (t < p->slate) {
145 t = p->slate;
146 count++;
147 }
148 }
149 return count;
150 };
Here is the caller graph for this function:

◆ operator+=()

nodeseq_t & nodeseq_t::operator+= ( nodeseq_t & other)
inline

merge two node sequences

Definition at line 107 of file nodeseq.h.

107 {
108 merge(other,compare);
109 return *this;
110 };
static bool compare(node_t *p, node_t *q)
Definition nodeseq.h:97
Here is the call graph for this function:

◆ position()

node_t * nodeseq_t::position ( int n)
inline

traverse to nth node, retrieve pointer

Definition at line 156 of file nodeseq.h.

156 {
157 int i = 0;
158 node_it k = cbegin();
159 while (i < n && k != cend()) {
160 i++; k++;
161 }
162 assert(k != cend());
163 return *k;
164 };
#define n
Definition lbdp_pomp.c:8
std::list< node_t * >::const_iterator node_it
Definition nodeseq.h:14

◆ repair_owners()

void nodeseq_t::repair_owners ( std::unordered_map< name_t, ball_t * > & names)
inlineprivate

Needed in deserialization. This function repairs the links green balls and their names.

Definition at line 82 of file nodeseq.h.

82 {
83 std::unordered_map<name_t,ball_t*>::const_iterator n;
84 for (node_t *p : *this) {
85 n = names.find(p->uniq);
86 assert(n != names.end());
87 ball_t *b = n->second;
88 p->green_ball() = b;
89 }
90 };
Here is the call graph for this function:
Here is the caller graph for this function:

◆ sort()

void nodeseq_t::sort ( void )
inline

order nodes in order of increasing time

Definition at line 113 of file nodeseq.h.

113 {
114 std::list<node_t*>::sort(compare);
115 };
Here is the call graph for this function:
Here is the caller graph for this function:

◆ structure()

SEXP nodeseq_t::structure ( void ) const
inline

R list description.

Definition at line 279 of file nodeseq.h.

279 {
280 SEXP Nodes;
281 PROTECT(Nodes = NEW_LIST(size()));
282 int k = 0;
283 for (node_t *p : *this) {
284 SET_ELEMENT(Nodes,k++,p->structure());
285 }
286 UNPROTECT(1);
287 return Nodes;
288 };
SEXP structure(void) const
R list description.
Definition node.h:201
Here is the call graph for this function:
Here is the caller graph for this function:

◆ swap()

void nodeseq_t::swap ( ball_t * a,
ball_t * b )
inline

swap balls a and b, wherever they lie

Definition at line 169 of file nodeseq.h.

169 {
170 node_t *p = a->holder();
171 node_t *q = b->holder();
172 if (p != q) {
173 p->erase(a); q->insert(a); a->holder() = q;
174 q->erase(b); p->insert(b); b->holder() = p;
175 }
176 };
Here is the call graph for this function:
Here is the caller graph for this function:

◆ trace_lineage()

void nodeseq_t::trace_lineage ( ball_t * b,
name_t u )
inlineprivate

trace back a single lineage. this results in the deme slot for all green balls along the lineage of 'b' begin replaced by the lineage of 'b'.

Definition at line 231 of file nodeseq.h.

231 {
232 node_t *p = b->holder();
233 while (p->lineage() == null_lineage) {
234 p->lineage() = u;
235 p = p->parent();
236 }
237 };
node_t * parent(void) const
Definition node.h:115
name_t lineage(void) const
view lineage
Definition node.h:104
static const name_t null_lineage
Definition node.h:13
Here is the call graph for this function:
Here is the caller graph for this function:

◆ trace_lineages()

void nodeseq_t::trace_lineages ( void )
inline

trace back all sample lineages. this results in the deme slots of all green balls being replaced by the unique names of the lineages they trace.

Definition at line 244 of file nodeseq.h.

244 {
245 // we trace each lineage in turn.
246 // because we move from early to late,
247 // the order is guaranteed to be valid.
248 name_t u = 0;
249 for (node_t *p : *this ) {
250 for (ball_t *b : *p) {
251 if (b->color==blue) {
252 trace_lineage(b,u);
253 u++;
254 }
255 }
256 }
257 };
@ blue
Definition ball.h:14
void trace_lineage(ball_t *b, name_t u)
Definition nodeseq.h:231
size_t name_t
Definition internal.h:45
Here is the call graph for this function:
Here is the caller graph for this function:

◆ yaml()

virtual std::string nodeseq_t::yaml ( std::string tab = "") const
inlinevirtual

human- & machine-readable info

Reimplemented in genealogy_t.

Definition at line 270 of file nodeseq.h.

270 {
271 std::string o = "";
272 std::string t = tab + " ";
273 for (node_t *p : *this) {
274 o += tab + "- " + p->yaml(t);
275 }
276 return o;
277 };
std::string yaml(std::string tab="") const
machine-readable info
Definition node.h:189
Here is the call graph for this function:
Here is the caller graph for this function:

Friends And Related Symbol Documentation

◆ operator>> [1/2]

raw_t * operator>> ( const nodeseq_t & G,
raw_t * o )
friend

binary serialization

Definition at line 47 of file nodeseq.h.

47 {
48 size_t nnode = G.size();
49 memcpy(o,&nnode,sizeof(size_t)); o += sizeof(size_t);
50 for (node_t *p : G) {
51 o = (*p >> o);
52 }
53 return o;
54 };

◆ operator>> [2/2]

raw_t * operator>> ( raw_t * o,
nodeseq_t & G )
friend

binary deserialization

Definition at line 56 of file nodeseq.h.

56 {
57 G.clean();
58 std::unordered_map<name_t,node_t*> node_names;
59 std::unordered_map<name_t,ball_t*> ball_names;
60 size_t nnode = 0;
61 memcpy(&nnode,o,sizeof(size_t)); o += sizeof(size_t);
62 node_names.reserve(nnode);
63 ball_names.reserve(nnode);
64 for (size_t i = 0; i < nnode; i++) {
65 node_t *p = new node_t();
66 o = (o >> *p);
67 G.push_back(p);
68 node_names.insert({p->uniq,p});
69 }
70 for (node_t *q : G) {
71 q->repair_owners(node_names,&ball_names);
72 }
73 G.repair_owners(ball_names);
74 G.trace_lineages();
75 return o;
76 };

The documentation for this class was generated from the following file: