Nemo  2.3.56
Simulate forward-in-time genetic evolution in a spatially explicit, individual-based stochastic simulator
datatable.h
Go to the documentation of this file.
1
30#ifndef DATATABLE_H
31#define DATATABLE_H
32
33#include "output.h"
37template <class T> class DataTable {
38
39private:
41 unsigned int _length;
43 unsigned int _groups;
45 unsigned int _classes;
50 unsigned int **_cumulClassSizes;
55 unsigned int *_cumulGroupSizes;
56
57 unsigned int **_sizes;
58
60
61 void store_sizes (unsigned int nbgroups, unsigned int nbclasses, unsigned int** classSizes) {
62
63 if (_sizes != NULL) {
64 for(unsigned int i = 0; i < nbgroups; ++i) delete [] _sizes[i];
65 delete [] _sizes;
66 }
67
68 _sizes = new unsigned int * [nbgroups];
69
70 for(unsigned int i = 0; i < nbgroups; ++i) {
71 _sizes[i] = new unsigned int [nbclasses];
72 for(unsigned int j = 0; j < nbclasses; ++j)
73 _sizes[i][j] = classSizes[i][j];
74 }
75 }
76
77 bool sizeChange (unsigned int nbgroups, unsigned int nbclasses, unsigned int** classSizes) {
78 bool status = 0;
79 if( nbgroups != _groups || nbclasses != _classes ) return true;
80 else {
81 for (unsigned int i = 0; i < _groups; i++)
82 for (unsigned int j = 0; j < _classes; j++)
83 status |= _sizes[i][j] != classSizes[i][j];
84 }
85 return status;
86 }
87
88public:
96 DataTable(unsigned int nbgroups, unsigned int nbclasses, unsigned int** classSizes) :
98 { allocate(nbgroups, nbclasses, classSizes); }
99
101
107 inline void allocate (unsigned int nbgroups, unsigned int nbclasses, unsigned int** classSizes) {
108 //#ifdef _DEBUG_
109 // message("DataTable::allocate:\n");
110 //#endif
111
112 free();
113
114 store_sizes(nbgroups, nbclasses, classSizes);
115
116 _groups = nbgroups;
117 _classes = nbclasses;
118 _length = 0;
119
120 _cumulClassSizes = new unsigned int*[_groups];
121
122 for(unsigned int i = 0; i < _groups; i++){
123 _cumulClassSizes[i] = new unsigned int [_classes];
124 _cumulClassSizes[i][0] = 0;
125 for(unsigned int j = 1; j < _classes; ++j)
126 _cumulClassSizes[i][j] = _cumulClassSizes[i][j-1] + classSizes[i][j-1];
127 }
128
129 _cumulGroupSizes = new unsigned int[_groups];
130
131 _cumulGroupSizes[0] = 0;
132 for(unsigned int i = 1; i < _groups; i++){
134 for(unsigned int j = 0; j < _classes; ++j) {
135 _cumulGroupSizes[i] += classSizes[(i-1)][j];//total size of the previous group
136 _length += classSizes[i][j];//aggregate to compute total length
137 }
138 }
139 //add the sizes of first group classes to have the total length of the table
140 for(unsigned int j = 0; j < _classes; ++j)
141 _length += classSizes[0][j];
142
143 _table = new T[_length];
144 //#ifdef _DEBUG_
145// cout<<"DataTable::allocate:_table="<<_table<<endl;
146 //#endif
147 }
148
154 inline void update(unsigned int nbgroups, unsigned int nbclasses, unsigned int** classSizes) {
155 //#ifdef _DEBUG_
156 // message("DataTable::update:\n");
157 //#endif
158 if( nbgroups != _groups || nbclasses != _classes )
159
160 allocate(nbgroups, nbclasses, classSizes); //free() is called in allocate
161
162 else if ( sizeChange(nbgroups, nbclasses, classSizes) ) {
163
164 store_sizes(nbgroups, nbclasses, classSizes);
165
166 for(unsigned int i = 0; i < _groups; i++){
167 for(unsigned int j = 1; j < _classes; ++j)
168 _cumulClassSizes[i][j] = _cumulClassSizes[i][j-1] + classSizes[i][j-1];
169 }
170 _length = 0;
171 _cumulGroupSizes[0] = 0;
172 for(unsigned int i = 1; i < _groups; i++){
174 for(unsigned int j = 0; j < _classes; ++j) {
175 _cumulGroupSizes[i] += classSizes[(i-1)][j];
176 _length += classSizes[i][j];
177 }
178 }
179
180 for(unsigned int j = 0; j < _classes; ++j)
181 _length += classSizes[0][j];
182
183 if(_table != NULL) delete [] _table;
184
185 _table = new T[_length];
186 }
187 }
189 void free ( ) {
190// cout << "\ncalling DataTable::free()\n";
191// cout << " pointer state: table="<<_table<<" cumulGroupSizes="<<_cumulGroupSizes
192// <<"\n cumulClassSizes="<<_cumulClassSizes<<" sizes="<<_sizes
193// <<endl;
194
195 if(_table != NULL) delete [] _table;
196
197 if(_cumulGroupSizes != NULL) delete [] _cumulGroupSizes;
198// cout << " delete _cumulClassSizes\n";
199 if(_cumulClassSizes != NULL){
200 for(unsigned int i = 0; i < _groups; ++i) {
201// cout << " "<<i<<":"<<_cumulClassSizes[i]<<endl;
202 delete [] _cumulClassSizes[i];}
203 delete [] _cumulClassSizes;
204 }
205// cout << " delete _sizes\n";
206 if(_sizes != NULL){
207 for(unsigned int i = 0; i < _groups; ++i) delete [] _sizes[i];
208 delete [] _sizes;
209 }
210
211 _table = NULL;
212 _cumulGroupSizes = NULL;
213 _cumulClassSizes = NULL;
214 _sizes = NULL;
215 _length = 0;
216// cout << "DataTable::free() done\n";
217}
219 inline unsigned int length ( ) {return _length;}
221 inline T* getTable ( ) {return _table;}
223 inline T* getGroup (unsigned int group) {return &_table[ _cumulGroupSizes[group] ];}
225 inline T* getClassWithinGroup (unsigned int group, unsigned int Class) {
226 return &_table[ _cumulGroupSizes[group] + _cumulClassSizes[group][Class] ];}
228 inline T get (unsigned int group, unsigned int Class, unsigned int elmnt) {
229 return _table[ _cumulGroupSizes[group] + _cumulClassSizes[group][Class] + elmnt ];
230 }
232 inline void set (unsigned int group, unsigned int Class, unsigned int elmnt, T val) {
233 _table[ _cumulGroupSizes[group] + _cumulClassSizes[group][Class] + elmnt ] = val;
234 }
236 inline void increment (unsigned int group, unsigned int Class, unsigned int elmnt) {
237 ++_table[ _cumulGroupSizes[group] + _cumulClassSizes[group][Class] + elmnt ];
238 }
240 inline void plus (unsigned int group, unsigned int Class, unsigned int elmnt, T val) {
241 _table[ _cumulGroupSizes[group] + _cumulClassSizes[group][Class] + elmnt ] += val;
242 }
244 inline void minus (unsigned int group, unsigned int Class, unsigned int elmnt, T val) {
245 _table[ _cumulGroupSizes[group] + _cumulClassSizes[group][Class] + elmnt ] -= val;
246 }
248 inline void multiply (unsigned int group, unsigned int Class, unsigned int elmnt, T val) {
249 _table[ _cumulGroupSizes[group] + _cumulClassSizes[group][Class] + elmnt ] *= val;
250 }
252 inline void divide (unsigned int group, unsigned int Class, unsigned int elmnt, T val) {
253 _table[ _cumulGroupSizes[group] + _cumulClassSizes[group][Class] + elmnt ] /= val;
254 }
256 inline void init (T val) {for(unsigned int i = 0; i < _length; ++i) _table[i] = val;}
257
258 unsigned int getNumGroups () {return _groups;}
259 unsigned int getNumClasses () {return _classes;}
260 unsigned int size (unsigned int i, unsigned int j) {return _sizes[i][j];}
261
262 void show_up ()
263 {
264 message("DataTable: got %i groups of %i classes; total length is %i.\n", _groups, _classes, _length);
265 }
266};
267
268#endif //DATATABLE_H
A class to aggregate structured data in an array.
Definition: datatable.h:37
void show_up()
Definition: datatable.h:262
DataTable(unsigned int nbgroups, unsigned int nbclasses, unsigned int **classSizes)
Constructor.
Definition: datatable.h:96
void minus(unsigned int group, unsigned int Class, unsigned int elmnt, T val)
Substracts 'val' from 'elmnt' in the class 'Class' in the group 'group'.
Definition: datatable.h:244
void allocate(unsigned int nbgroups, unsigned int nbclasses, unsigned int **classSizes)
Creates a table of size given by the sum of all classes passed by the 'classSizes' matrix.
Definition: datatable.h:107
void set(unsigned int group, unsigned int Class, unsigned int elmnt, T val)
Sets the element 'elmnt' of the class 'Class' in the group 'group' to the value 'val'.
Definition: datatable.h:232
bool sizeChange(unsigned int nbgroups, unsigned int nbclasses, unsigned int **classSizes)
Definition: datatable.h:77
unsigned int size(unsigned int i, unsigned int j)
Definition: datatable.h:260
~DataTable()
Definition: datatable.h:100
void divide(unsigned int group, unsigned int Class, unsigned int elmnt, T val)
Subdivide 'elmnt' of the class 'Class' in the group 'group' by 'val'.
Definition: datatable.h:252
unsigned int getNumClasses()
Definition: datatable.h:259
void plus(unsigned int group, unsigned int Class, unsigned int elmnt, T val)
Adds 'val' to 'elmnt' in the class 'Class' in the group 'group'.
Definition: datatable.h:240
void store_sizes(unsigned int nbgroups, unsigned int nbclasses, unsigned int **classSizes)
Definition: datatable.h:61
void free()
Deallocates all the allocated tables.
Definition: datatable.h:189
T get(unsigned int group, unsigned int Class, unsigned int elmnt)
Returns value stored of the element 'elmnt' of the class 'Class' in the group 'group'.
Definition: datatable.h:228
T * getTable()
Accessor to the table array.
Definition: datatable.h:221
unsigned int * _cumulGroupSizes
Stores the indexes of each group present in the table.
Definition: datatable.h:55
unsigned int getNumGroups()
Definition: datatable.h:258
unsigned int ** _sizes
Definition: datatable.h:57
T * _table
Definition: datatable.h:59
DataTable()
Default constructor.
Definition: datatable.h:90
void update(unsigned int nbgroups, unsigned int nbclasses, unsigned int **classSizes)
Updates the group and classe sizes and re-allocates the table according to its new length.
Definition: datatable.h:154
void init(T val)
Sets all elements of the table to value 'val'.
Definition: datatable.h:256
T * getGroup(unsigned int group)
Accessor to a group array.
Definition: datatable.h:223
unsigned int _length
length of the table
Definition: datatable.h:41
T * getClassWithinGroup(unsigned int group, unsigned int Class)
Accessor to a class array whithin a group.
Definition: datatable.h:225
unsigned int _groups
number of groups in the table
Definition: datatable.h:43
unsigned int length()
Returns the length of the table (total number of elements present).
Definition: datatable.h:219
unsigned int ** _cumulClassSizes
Stores the indexes of each class of each group present in the table.
Definition: datatable.h:50
void multiply(unsigned int group, unsigned int Class, unsigned int elmnt, T val)
Multiplies 'elmnt' of the class 'Class' in the group 'group' by 'val'.
Definition: datatable.h:248
unsigned int _classes
number of classes within each group
Definition: datatable.h:45
void increment(unsigned int group, unsigned int Class, unsigned int elmnt)
Increments 'elmnt' of the class 'Class' in the group 'group' by one.
Definition: datatable.h:236
void message(const char *message,...)
Definition: output.cc:40

Generated for Nemo v2.3.56 by  doxygen 1.9.0 -- Nemo is hosted on  Download Nemo

Locations of visitors to this page
Catalogued on GSR