phylopomp
Phylodynamics for POMPs
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 176 of file nodeseq.h.

176 {
177 swap(a,p->green_ball());
178 p->deme() = a->deme();
179 push_back(p);
180 };
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:166
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 128 of file nodeseq.h.

128 {
129 pocket_t *p = new pocket_t;
130 for (node_t *q : *this) {
131 for (ball_t *b : *q ) {
132 if (b->is(col)) p->insert(b);
133 }
134 }
135 return p;
136 };
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 207 of file nodeseq.h.

207 {
208 for (node_rev_it i = crbegin(); i != crend(); i++) {
209 if ((*i)->size() == 1 && (*i)->holds(green)) {
210 swap((*i)->last_ball(),(*i)->green_ball());
211 }
212 }
213 node_nit j = begin();
214 while (j != end()) {
215 if ((*j)->dead_root()) {
216 destroy_node(*(j++));
217 } else {
218 j++;
219 }
220 }
221 };
@ green
Definition ball.h:14
void destroy_node(node_t *p)
remove a dead root node
Definition nodeseq.h:200
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. Nodes should be ordered by time, then by unique name.

Definition at line 96 of file nodeseq.h.

96 {
97 return (p->slate < q->slate) ||
98 ((p->slate == q->slate) && (p->uniq < q->uniq));
99 };
name_t uniq
Definition node.h:34
slate_t slate
Definition node.h:35
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 117 of file nodeseq.h.

117 {
118 return (empty()) ? R_NaReal : front()->slate;
119 };
Here is the caller graph for this function:

◆ describe()

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

human-readable info

Definition at line 259 of file nodeseq.h.

259 {
260 std::string o = "";
261 for (node_t *p : *this) {
262 o += p->describe();
263 }
264 return o;
265 };
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 200 of file nodeseq.h.

200 {
201 assert(p->dead_root());
202 remove(p);
203 delete p;
204 };
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 184 of file nodeseq.h.

184 {
185 assert(a->is(black));
186 node_t *p = a->holder();
187 if (p->size() > 1) {
188 p->erase(a);
189 delete a;
190 if (p->dead_root()) { // remove isolated root
191 destroy_node(p);
192 }
193 } else {
194 swap(a,p->green_ball());
195 destroy_node(p);
196 drop(a); // recurse
197 }
198 };
@ black
Definition ball.h:14
node_t * holder(void) const
in whose pocket do I lie?
Definition ball.h:109
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:184
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 121 of file nodeseq.h.

121 {
122 return (empty()) ? R_NaReal : back()->slate;
123 }

◆ length()

size_t nodeseq_t::length ( void ) const
inline

Number of nodes in the sequence.

Definition at line 149 of file nodeseq.h.

149 {
150 return this->size();
151 };
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 287 of file nodeseq.h.

287 {
288 slate_t te = dawn();
289 std::string o = "";
290 for (node_t *p : *this) {
291 if (p->is_root()) {
292 o += p->newick(t,te) + ";";
293 }
294 }
295 return o;
296 };
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:117
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 138 of file nodeseq.h.

138 {
139 size_t count = 1;
140 for (node_t *p : *this) {
141 if (t < p->slate) {
142 t = p->slate;
143 count++;
144 }
145 }
146 return count;
147 };
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 104 of file nodeseq.h.

104 {
105 merge(other,compare);
106 return *this;
107 };
static bool compare(node_t *p, node_t *q)
Definition nodeseq.h:96
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 153 of file nodeseq.h.

153 {
154 int i = 0;
155 node_it k = cbegin();
156 while (i < n && k != cend()) {
157 i++; k++;
158 }
159 assert(k != cend());
160 return *k;
161 };
#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 110 of file nodeseq.h.

110 {
111 std::list<node_t*>::sort(compare);
112 };
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 276 of file nodeseq.h.

276 {
277 SEXP Nodes;
278 PROTECT(Nodes = NEW_LIST(size()));
279 int k = 0;
280 for (node_t *p : *this) {
281 SET_ELEMENT(Nodes,k++,p->structure());
282 }
283 UNPROTECT(1);
284 return Nodes;
285 };
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 166 of file nodeseq.h.

166 {
167 node_t *p = a->holder();
168 node_t *q = b->holder();
169 if (p != q) {
170 p->erase(a); q->insert(a); a->holder() = q;
171 q->erase(b); p->insert(b); b->holder() = p;
172 }
173 };
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 228 of file nodeseq.h.

228 {
229 node_t *p = b->holder();
230 while (p->lineage() == null_lineage) {
231 p->lineage() = u;
232 p = p->parent();
233 }
234 };
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 241 of file nodeseq.h.

241 {
242 // we trace each lineage in turn.
243 // because we move from early to late,
244 // the order is guaranteed to be valid.
245 name_t u = 0;
246 for (node_t *p : *this ) {
247 for (ball_t *b : *p) {
248 if (b->color==blue) {
249 trace_lineage(b,u);
250 u++;
251 }
252 }
253 }
254 };
@ blue
Definition ball.h:14
void trace_lineage(ball_t *b, name_t u)
Definition nodeseq.h:228
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 267 of file nodeseq.h.

267 {
268 std::string o = "";
269 std::string t = tab + " ";
270 for (node_t *p : *this) {
271 o += tab + "- " + p->yaml(t);
272 }
273 return o;
274 };
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: