phylopomp
Phylodynamics for POMPs
Loading...
Searching...
No Matches
inventory.h
Go to the documentation of this file.
1// -*- C++ -*-
2// INVENTORY CLASS
3
4#ifndef _INVENTORY_H_
5#define _INVENTORY_H_
6
7#include "ball.h"
8#include "pocket.h"
9#include "node.h"
10#include "genealogy.h"
11#include "internal.h"
12
14
17template <size_t NDEME>
19
20private:
21
22 const static size_t ndeme = NDEME;
24
25public:
26
27 // CONSTRUCTORS, DESTRUCTORS, ETC.
29 inventory_t (void) = default;
32 o >> *this;
33 };
34
35 inventory_t (const inventory_t &) = default;
37 inventory_t (inventory_t &&) = delete;
40 assert(G.ndeme()==ndeme);
41 clean();
42 for (node_t *p : G) {
43 for (ball_t *b : *p) {
44 insert(b); // 'insert' checks color
45 }
46 }
47 };
48
50 assert(G.ndeme()==ndeme);
51 clean();
52 for (node_t *p : G) {
53 for (ball_t *b : *p) {
54 insert(b); // 'insert' checks color
55 }
56 }
57 return *this;
58 };
59
60 inventory_t & operator= (const inventory_t &) = default;
64 ~inventory_t (void) {
65 clean();
66 };
67
68private:
69
71 void clean (void) {
72 clear();
73 };
74
75 void clear (void) {
76 for (size_t i = 0; i < ndeme; i++)
77 _inven[i].clear();
78 };
79
80public:
81
82 // SERIALIZATION
84 size_t bytesize (void) const {
85 size_t s = 0;
86 for (size_t i = 0; i < ndeme; i++)
87 s += _inven[i].bytesize();
88 return s;
89 };
90
91 friend raw_t* operator>> (const inventory_t& I, raw_t* o) {
92 for (size_t i = 0; i < ndeme; i++) {
93 o = (I._inven[i] >> o);
94 }
95 return o;
96 };
97
99 I.clean();
100 for (size_t i = 0; i < ndeme; i++) {
101 o = (o >> I._inven[i]);
102 }
103 return o;
104 };
105
106public:
107
110 size_t size (void) const {
111 size_t n = 0;
112 for (name_t i = 0; i < ndeme; i++) {
113 n += size(i);
114 }
115 return n;
116 };
117
118 size_t size (name_t i) const {
119 return inven(i).size();
120 };
121
122 const pocket_t& operator[] (const name_t i) const {
123 return inven(i);
124 };
125
127 return inven(i);
128 };
129
130private:
131
133 const pocket_t& inven (const name_t i) const {
134 assert(i > 0);
135 return _inven[i-1];
136 };
137
138 pocket_t& inven (const name_t i) {
139 assert(i > 0);
140 return _inven[i-1];
141 };
142
143public:
144
148 void insert (ball_t *b) {
149 if (b->is(black)) {
150 inven(b->deme()).insert(b);
151 }
152 };
153
156 void erase (ball_t *b) {
157 if (b->is(black)) {
158 assert(!inven(b->deme()).empty());
159 inven(b->deme()).erase(b);
160 }
161 };
162
163 bool empty (void) const {
164 bool q = true;
165 for (name_t i = 0; i < ndeme; i++) {
166 q = q && _inven[i].empty();
167 }
168 return q;
169 };
170
172 name_t n = inven(i).size();
173 assert(n > 0);
174 name_t draw = random_integer(n);
175 ball_it k = inven(i).begin();
176 while (draw-- > 0) k++;
177 return *k;
178 };
179
180 pocket_t* random_balls (name_t i, int n = 1) const {
181 pocket_t *p = new pocket_t();
182 if (n == 1) {
183 ball_t *b = random_ball(i);
184 p->insert(b);
185 } else if (n > 1) {
186 int N = inven(i).size();
187 assert(N > 0);
188 assert(n <= N);
189 ball_it j = inven(i).begin();
190 int k = 0, m = 0;
191 while (m < n && k < N) {
192 int u = random_integer(N-k);
193 if (u < n-m) {
194 p->insert(*j);
195 m++;
196 }
197 k++; j++;
198 }
199 } else {
200 assert(0); // #nocov
201 }
202 return p;
203 };
204};
205
206#endif
@ black
Definition ball.h:12
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:19
size_t ndeme(void) const
number of demes
Definition genealogy.h:59
inventory_t & operator=(const genealogy_t &G)
copy an inventory from a genealogy
Definition inventory.h:49
const pocket_t & inven(const name_t i) const
access the i-th deme
Definition inventory.h:133
void insert(ball_t *b)
Definition inventory.h:148
inventory_t(void)=default
basic constructor for inventory class
void clean(void)
memory cleanup
Definition inventory.h:71
pocket_t * random_balls(name_t i, int n=1) const
choose a random set of n balls from deme i
Definition inventory.h:180
size_t size(name_t i) const
size of deme
Definition inventory.h:118
inventory_t(const inventory_t &)=default
copy constructor
inventory_t(raw_t *o)
constructor from serialized binary form
Definition inventory.h:31
pocket_t & inven(const name_t i)
access the i-th deme
Definition inventory.h:138
inventory_t(const genealogy_t &G)
constructs an inventory from a genealogy
Definition inventory.h:39
size_t bytesize(void) const
size of serialized binary form
Definition inventory.h:84
inventory_t(inventory_t &&)=delete
move constructor
~inventory_t(void)
destructor
Definition inventory.h:64
ball_t * random_ball(name_t i) const
choose one random ball from deme i
Definition inventory.h:171
static const size_t ndeme
Definition inventory.h:22
void clear(void)
memory cleanup
Definition inventory.h:75
friend raw_t * operator>>(const inventory_t &I, raw_t *o)
binary serialization
Definition inventory.h:91
size_t size(void) const
Definition inventory.h:110
bool empty(void) const
are all demes empty?
Definition inventory.h:163
void erase(ball_t *b)
Definition inventory.h:156
pocket_t _inven[ndeme]
Definition inventory.h:23
const pocket_t & operator[](const name_t i) const
return the i-th deme
Definition inventory.h:122
Encodes a genealogical node.
Definition node.h:21
A pocket is a set of balls.
Definition pocket.h:30
Rbyte raw_t
Definition internal.h:52
size_t name_t
Definition internal.h:54
static int random_integer(int n)
Definition internal.h:57
#define n
Definition lbdp_pomp.c:9
std::set< ball_t *, ball_order >::const_iterator ball_it
Definition pocket.h:24
#define N
Definition seirs_pomp.c:36
#define I
Definition seirs_pomp.c:39