genmodel 0.0.27 → 0.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,725 @@
1
+ //
2
+ // BitVector.cpp
3
+ //
4
+ //
5
+ // Created by Mathieu Bouchard on 2014-03-03.
6
+ //
7
+ //
8
+
9
+ #include "BitVector.h"
10
+ #include <stdio.h>
11
+ #include <string.h>
12
+ #include <algorithm>
13
+ #include <stdlib.h>
14
+ #include <time.h>
15
+
16
+ /****************************************** BitMatrix ******************************************/
17
+
18
+ BitMatrix::BitMatrix()
19
+ {
20
+ n = 0;
21
+ m = 0;
22
+ set_size(0,0);
23
+ }
24
+ BitMatrix::BitMatrix(size_t _m, size_t _n)
25
+ {
26
+ n = 0;
27
+ m = 0;
28
+ set_size(_m,_n);
29
+ }
30
+
31
+ BitMatrix::~BitMatrix()
32
+ {
33
+ reset();
34
+ }
35
+
36
+ void BitMatrix::set_size(size_t _m, size_t _n)
37
+ {
38
+ reset();
39
+ n = _n;
40
+ m = _m;
41
+ if(_m > 0 && n > 0)
42
+ {
43
+ rows = new BitVector[m];
44
+ cols = new BitVector[n];
45
+ a_c = new double*[n];
46
+ for(size_t i = 0; i < n; i++)
47
+ {
48
+ a_c[i] = new double[m];
49
+ memset(a_c[i], 0, m*sizeof(double));
50
+ }
51
+ a_r = new double*[m];
52
+ for(size_t i = 0; i < m; i++)
53
+ {
54
+ a_r[i] = new double[n];
55
+ memset(a_r[i], 0, n*sizeof(double));
56
+ }
57
+ }
58
+ else
59
+ {
60
+ rows = NULL;
61
+ cols = NULL;
62
+ a_c = NULL;
63
+ a_r = NULL;
64
+ }
65
+ }
66
+
67
+ void BitMatrix::reset()
68
+ {
69
+ if(m > 0 && n > 0)
70
+ {
71
+ delete[] rows;
72
+ delete[] cols;
73
+
74
+ for(size_t i = 0; i < n; i++)
75
+ delete[] a_c[i];
76
+ delete[] a_c;
77
+ for(size_t i = 0; i < m; i++)
78
+ delete[] a_r[i];
79
+ delete[] a_r;
80
+ }
81
+ }
82
+
83
+ void BitMatrix::seta(size_t index_i, size_t index_j, double val)
84
+ {
85
+ if(index_i >= m || index_j >=n)
86
+ throw string("BitMatrix : index out of bound\n");
87
+ a_r[index_i][index_j] = val;
88
+ a_c[index_j][index_i] = val;
89
+ }
90
+
91
+ double BitMatrix::geta(size_t index_i, size_t index_j) const
92
+ {
93
+ if(index_i >= m || index_j >=n)
94
+ throw string("BitMatrix : index out of bound\n");
95
+ return a_r[index_i][index_j];
96
+ }
97
+
98
+ double BitMatrix::sum(const BitVector& col, const BitVector& row) const
99
+ {
100
+ double ret = 0.0;
101
+ BitIndex ind_j = BitIndex(col);
102
+ BitIndex ind_i = BitIndex(row);
103
+ for(size_t i = 0; i < ind_i.n; i++)
104
+ for(size_t j = 0; j < ind_j.n; j++)
105
+ ret += a_r[ind_i[i]][ind_j[j]];
106
+ return ret;
107
+ }
108
+
109
+ double BitMatrix::sum_row(size_t index) const
110
+ {
111
+ double ret = 0.0;
112
+ for(size_t i = 0; i < n; i++)
113
+ ret += a_r[index][i];
114
+ return ret;
115
+ }
116
+
117
+ double BitMatrix::sum_col(size_t index) const
118
+ {
119
+ double ret = 0.0;
120
+ for(size_t i = 0; i < m; i++)
121
+ ret += a_c[index][i];
122
+ return ret;
123
+ }
124
+
125
+
126
+ void BitMatrix::setrow(size_t index, const string& bit_str)
127
+ {
128
+ if(index >= m)
129
+ throw string("BitMatrix : index out of bound\n");
130
+ size_t str_size = bit_str.size() - count(bit_str.begin(), bit_str.end(), '-');
131
+ if(str_size != n)
132
+ throw string("BitMatrix : The bit vector string has not the right size (string size %ld != nb_columns %ld)\n", str_size, n);
133
+ rows[index].set(bit_str);
134
+ }
135
+
136
+ void BitMatrix::setcol(size_t index, const string& bit_str)
137
+ {
138
+ if(index >= n)
139
+ throw string("BitMatrix : index out of bound\n");
140
+ size_t str_size = bit_str.size() - count(bit_str.begin(), bit_str.end(), '-');
141
+ if(str_size != m)
142
+ throw string("BitMatrix : The bit vector string has not the right size (string size %ld != nb rows %ld)\n", str_size, m);
143
+ cols[index].set(bit_str);
144
+ }
145
+ BitMatrix BitMatrix::operator*=(double m) const
146
+ {
147
+ BitMatrix ret = BitMatrix(m,n);
148
+ for(size_t i = 0; i < n; i++)
149
+ for(size_t j = 0; j < m; j++)
150
+ ret.a_c[i][j] = m*a_c[i][j];
151
+
152
+ for(size_t i = 0; i < m; i++)
153
+ for(size_t j = 0; j < n; j++)
154
+ ret.a_r[i][j] = m*a_r[i][j];
155
+ return ret;
156
+ }
157
+ BitMatrix& BitMatrix::operator*(double m)
158
+ {
159
+ for(size_t i = 0; i < n; i++)
160
+ for(size_t j = 0; j < m; j++)
161
+ a_c[i][j] *= m;
162
+
163
+ for(size_t i = 0; i < m; i++)
164
+ for(size_t j = 0; j < n; j++)
165
+ a_r[i][j] *= m;
166
+ return *this;
167
+ }
168
+
169
+ BitMatrix BitMatrix::add_m(const BitMatrix& bit_matrix, double m1) const
170
+ {
171
+ if(m != bit_matrix.m || n != bit_matrix.n)
172
+ throw string("BitMatrix : matrix size are incompatible\n");
173
+ BitMatrix ret = BitMatrix(m,n);
174
+ for(size_t i = 0; i < n; i++)
175
+ {
176
+ ret.rows[i] = (rows[i] | bit_matrix.rows[i]);
177
+ for(size_t j = 0; j < m; j++)
178
+ ret.a_c[i][j] = a_c[i][j] + m1*bit_matrix.a_c[i][j];
179
+ }
180
+ for(size_t i = 0; i < m; i++)
181
+ {
182
+ ret.cols[i] = (cols[i] | bit_matrix.cols[i]);
183
+ for(size_t j = 0; j < n; j++)
184
+ ret.a_r[i][j] = a_r[i][j] + m1*bit_matrix.a_r[i][j];
185
+ }
186
+ return ret;
187
+ }
188
+
189
+ BitMatrix& BitMatrix::s_add_m(const BitMatrix& bit_matrix, double m1)
190
+ {
191
+ if(m != bit_matrix.m || n != bit_matrix.n)
192
+ {
193
+ printf("[%ld %ld] [%ld %ld]\n", long(m),long(n),long(bit_matrix.m),long(bit_matrix.n));
194
+ throw string("BitMatrix : matrix size are incompatible\n");
195
+ }
196
+ for(size_t i = 0; i < n; i++)
197
+ {
198
+ cols[i] |= bit_matrix.cols[i];
199
+ for(size_t j = 0; j < m; j++)
200
+ a_c[i][j] += m1*bit_matrix.a_c[i][j];
201
+ }
202
+ for(size_t i = 0; i < m; i++)
203
+ {
204
+ rows[i] |= bit_matrix.rows[i];
205
+ for(size_t j = 0; j < n; j++)
206
+ a_r[i][j] += m1*bit_matrix.a_r[i][j];
207
+ }
208
+ return *this;
209
+ }
210
+
211
+ BitMatrix& BitMatrix::operator+=(const BitMatrix& bit_matrix)
212
+ {
213
+ return s_add_m(bit_matrix, 1.0);
214
+ }
215
+
216
+ BitMatrix BitMatrix::operator+(const BitMatrix& bit_matrix) const
217
+ {
218
+ return add_m(bit_matrix, 1.0);
219
+ }
220
+
221
+ BitMatrix& BitMatrix::operator-=(const BitMatrix& bit_matrix)
222
+ {
223
+ return s_add_m(bit_matrix, -1.0);
224
+ }
225
+
226
+ BitMatrix BitMatrix::operator-(const BitMatrix& bit_matrix) const
227
+ {
228
+ return add_m(bit_matrix, -1.0);
229
+ }
230
+
231
+ BitMatrix& BitMatrix::operator=(const BitMatrix& bit_matrix)
232
+ {
233
+ set_size(bit_matrix.m, bit_matrix.n);
234
+
235
+ for(size_t i = 0; i < m; i++)
236
+ rows[i] = bit_matrix.rows[i];
237
+ for(size_t i = 0; i < n; i++)
238
+ cols[i] = bit_matrix.cols[i];
239
+ for(size_t i = 0; i < n; i++)
240
+ memcpy(a_c[i], bit_matrix.a_c[i], m*sizeof(double));
241
+ for(size_t i = 0; i < m; i++)
242
+ memcpy(a_r[i], bit_matrix.a_r[i], n*sizeof(double));
243
+ return *this;
244
+ }
245
+
246
+ BitMatrix BitMatrix::copy() const
247
+ {
248
+ BitMatrix ret(m, n);
249
+ for(size_t i = 0; i < m; i++)
250
+ ret.rows[i] = rows[i];
251
+ for(size_t i = 0; i < n; i++)
252
+ ret.cols[i] = cols[i];
253
+ for(size_t i = 0; i < n; i++)
254
+ memcpy(ret.a_c[i], a_c[i], m*sizeof(double));
255
+ for(size_t i = 0; i < m; i++)
256
+ memcpy(ret.a_r[i], a_r[i], n*sizeof(double));
257
+ return ret;
258
+ }
259
+
260
+
261
+
262
+ /****************************************** BitVector ******************************************/
263
+
264
+
265
+ BitVector::BitVector(const BitVector& bit_vector)
266
+ {
267
+ bits = NULL;
268
+ n = 0;
269
+ m = 0;
270
+ extra = 0;
271
+ *this = bit_vector;
272
+ }
273
+
274
+ BitVector::BitVector(size_t _size)
275
+ {
276
+ bits = NULL;
277
+ init(_size);
278
+ }
279
+
280
+ BitVector::~BitVector()
281
+ {
282
+ if(bits != NULL)
283
+ delete[] bits;
284
+ }
285
+
286
+ void BitVector::init(size_t _size)
287
+ {
288
+ if(bits != NULL)
289
+ delete[] bits;
290
+ n = _size;
291
+ m = (ceil(n/double(sizeof(uint64_t))));
292
+ bits = new uint64_t[m];
293
+ memset(bits, 0, m*sizeof(uint64_t));
294
+ set_extra();
295
+ }
296
+
297
+ void BitVector::set_extra()
298
+ {
299
+ extra = 0;
300
+ size_t start = n%sizeof(uint64_t);
301
+ if(start == 0)
302
+ extra = ~extra;
303
+ else
304
+ {
305
+ for(size_t i = 0; i < start; i++)
306
+ extra |= (1<<i);
307
+ }
308
+ }
309
+
310
+ bool BitVector::is_zero() const
311
+ {
312
+ bool ret = true;
313
+ for(size_t i = 0; i < m && ret; i++)
314
+ ret = ret && bits[i] == 0;
315
+ return ret;
316
+ }
317
+
318
+ bool BitVector::is_one() const
319
+ {
320
+ bool ret = true;
321
+ for(size_t i = 0; i < m && ret; i++)
322
+ ret = ret && (~bits[i]) == 0;
323
+ return ret;
324
+ }
325
+
326
+ size_t BitVector::sum() const
327
+ {
328
+ size_t ret = 0;
329
+ for(size_t i = 0; i < n; i++)
330
+ ret += (get(i) ? 1 : 0);
331
+ return ret;
332
+ }
333
+
334
+ bool BitVector::get(size_t index) const
335
+ {
336
+ if(index >= n)
337
+ throw string("BitVector : index out of bound\n");
338
+ return ((1<<(index%sizeof(uint64_t))) & bits[size_t(floor(index/sizeof(uint64_t)))]) > 0;
339
+ }
340
+
341
+ void BitVector::set(size_t index, bool value)
342
+ {
343
+ if(index >= n)
344
+ throw string("BitVector : index out of bound\n");
345
+ if(value)
346
+ bits[size_t(floor(index/sizeof(uint64_t)))] |= 1<<(index%sizeof(uint64_t));
347
+ else
348
+ bits[size_t(floor(index/sizeof(uint64_t)))] &= ~(1<<(index%sizeof(uint64_t)));
349
+
350
+ }
351
+
352
+ string BitVector::to_s() const
353
+ {
354
+ size_t nn = n+ceil(n/8);
355
+ string ret('0', nn);
356
+ for(size_t i = 0; i < n; i++)
357
+ {
358
+ ret[nn-1-(i+i/8)] = (get(n-1-i) ? '1' : '0');
359
+ if(i > 0 && i%8==0)
360
+ ret[nn-1-(i+i/8-1)] = '-';
361
+ }
362
+ return ret;
363
+ }
364
+
365
+ void BitVector::random_fill()
366
+ {
367
+ srand (0);//(time(NULL));
368
+ for(size_t i = 0; i < n; i++)
369
+ {
370
+ if(rand()%2==1)
371
+ set(i,true);
372
+ else
373
+ set(i,false);
374
+ }
375
+ }
376
+
377
+ void BitVector::set(string val)
378
+ {
379
+ size_t new_size= val.size() - count(val.begin(), val.end(), '-');
380
+ if(n != new_size)
381
+ init(new_size);
382
+
383
+ int j = 0;
384
+ for(unsigned int i = 0; i < n; ++i)
385
+ {
386
+ if(val[i] == '1')
387
+ bits[size_t(floor((i-j)/sizeof(uint64_t)))] |= 1<<((i-j)%sizeof(uint64_t));
388
+ else if(val[i] == '0')
389
+ bits[size_t(floor((i-j)/sizeof(uint64_t)))] &= ~(1<<((i-j)%sizeof(uint64_t)));
390
+ else if(val[i] == '-')
391
+ ++j;
392
+ else
393
+ throw string("BitVector : Invalid string\n");
394
+ }
395
+ }
396
+
397
+ size_t BitVector::size() const
398
+ {
399
+ return n;
400
+ }
401
+
402
+ bool BitVector::operator[](size_t index) const
403
+ {
404
+ if(index >= n)
405
+ throw string("BitVector : index out of bound\n");
406
+ return ((1<<(index%sizeof(uint64_t))) & bits[size_t(floor(index/sizeof(uint64_t)))]) > 0;
407
+ }
408
+
409
+ BitVector BitVector::operator&(const BitVector& bit_vector) const
410
+ {
411
+ if(n != bit_vector.n)
412
+ throw string("BitVector : Vector size mismatch");
413
+ BitVector ret(n);
414
+ for(size_t i = 0; i < m; i++)
415
+ ret.bits[i] = bits[i] & bit_vector.bits[i];
416
+ return ret;
417
+ }
418
+
419
+ BitVector BitVector::operator|(const BitVector& bit_vector) const
420
+ {
421
+ if(n != bit_vector.n)
422
+ throw string("BitVector : The vectors size are not the same");
423
+ BitVector ret(n);
424
+ for(size_t i = 0; i < m; i++)
425
+ ret.bits[i] = bits[i] | bit_vector.bits[i];
426
+ return ret;
427
+ }
428
+
429
+ BitVector BitVector::operator^(const BitVector& bit_vector) const
430
+ {
431
+ if(n != bit_vector.n)
432
+ throw string("BitVector : The vectors size are not the same");
433
+ BitVector ret(n);
434
+ for(size_t i = 0; i < m; i++)
435
+ ret.bits[i] = bits[i] ^ bit_vector.bits[i];
436
+ return ret;
437
+ }
438
+
439
+ BitVector BitVector::operator~() const
440
+ {
441
+ BitVector ret(n);
442
+ ret.extra = extra;
443
+ for(size_t i = 0; i < m; i++)
444
+ ret.bits[i] = ~bits[i];
445
+ ret.bits[m-1] &= extra;
446
+ ret.extra = extra;
447
+ return ret;
448
+ }
449
+
450
+ BitVector& BitVector::operator=(const BitVector& bit_vector)
451
+ {
452
+ init(bit_vector.n);
453
+ memcpy(bits, bit_vector.bits, m*sizeof(uint64_t));
454
+ extra = bit_vector.extra;
455
+ return *this;
456
+ }
457
+
458
+ BitVector& BitVector::operator&=(const BitVector& bit_vector)
459
+ {
460
+ if(n != bit_vector.n)
461
+ throw string("BitVector : Vector size mismatch");
462
+ for(size_t i = 0; i < m; i++)
463
+ bits[i] &= bit_vector.bits[i];
464
+ return *this;
465
+ }
466
+
467
+ BitVector& BitVector::operator|=(const BitVector& bit_vector)
468
+ {
469
+ if(n != bit_vector.n)
470
+ throw string("BitVector : The vectors size are not the same");
471
+ for(size_t i = 0; i < m; i++)
472
+ bits[i] |= bit_vector.bits[i];
473
+ return *this;
474
+ }
475
+
476
+ BitVector& BitVector::operator^=(const BitVector& bit_vector)
477
+ {
478
+ if(n != bit_vector.n)
479
+ throw string("BitVector : The vectors size are not the same");
480
+ for(size_t i = 0; i < m; i++)
481
+ bits[i] ^= bit_vector.bits[i];
482
+ return *this;
483
+ }
484
+
485
+ BitVector BitVector::_and(const BitVector& bit_vector) const
486
+ {
487
+ return (*this & bit_vector);
488
+ }
489
+
490
+ BitVector BitVector::_or(const BitVector& bit_vector) const
491
+ {
492
+ return (*this | bit_vector);
493
+ }
494
+
495
+ BitVector BitVector::_xor(const BitVector& bit_vector) const
496
+ {
497
+ return (*this ^ bit_vector);
498
+ }
499
+
500
+ BitVector BitVector::_not() const
501
+ {
502
+ return (~(*this));
503
+ }
504
+
505
+
506
+ BitVector& BitVector::s_and(const BitVector& bit_vector)
507
+ {
508
+ return (*this &= bit_vector);
509
+ }
510
+
511
+ BitVector& BitVector::s_or(const BitVector& bit_vector)
512
+ {
513
+ return (*this |= bit_vector);
514
+ }
515
+
516
+ BitVector& BitVector::s_xor(const BitVector& bit_vector)
517
+ {
518
+ return (*this ^= bit_vector);
519
+ }
520
+
521
+ BitVector BitVector::kronecker(const BitVector& bit_vector) const
522
+ {
523
+ BitVector ret(n*bit_vector.n);
524
+ for(size_t i = 0; i < n; i++)
525
+ {
526
+ if(get(i))
527
+ {
528
+ for(size_t j = 0; j < bit_vector.n; j++)
529
+ ret.set(i*bit_vector.n+j, bit_vector.get(j));
530
+ }
531
+ }
532
+ return ret;
533
+ }
534
+
535
+ BitVector& BitVector::s_not()
536
+ {
537
+ for(size_t i = 0; i < m; i++)
538
+ bits[i] = ~bits[i];
539
+ bits[m-1] &= extra;
540
+ return *this;
541
+ }
542
+
543
+ void* BitVector::Ptr()
544
+ {
545
+ printf("From Ptr %p (bits = %p)\n", this, bits);
546
+ return this;
547
+ }
548
+
549
+
550
+ /*
551
+ BitVector BitVector::operator<<(size_t s)
552
+ {
553
+ if(s==0)
554
+ return *this;
555
+
556
+ size_t step = ceil(s/sizeof(uint64_t));
557
+ size_t mod = s%sizeof(uint64_t);
558
+ size_t mod_comp = sizeof(uint64_t)-s%sizeof(uint64_t);
559
+ for(size_t i = ceil(n/sizeof(uint64_t))-1; i >= 0; i--)
560
+ {
561
+ uint64_t temp = bits[i-step];
562
+ bits[i] = (bits[i] << mod) & temp;
563
+ }
564
+
565
+ return ret;
566
+ }
567
+
568
+ BitVector BitVector::operator>>(size_t s)
569
+ {
570
+
571
+ }*/
572
+
573
+
574
+ /****************************************** BitIndex ******************************************/
575
+
576
+ BitIndex::BitIndex(const BitVector& bit_vector)
577
+ {
578
+ n = bit_vector.sum();
579
+ if(n != 0)
580
+ index = new size_t[n];
581
+ size_t j = 0;
582
+ for(size_t i = 0; i < bit_vector.size(); i++)
583
+ {
584
+ if(bit_vector.get(i))
585
+ {
586
+ index[j] = i;
587
+ j++;
588
+ }
589
+ }
590
+ }
591
+
592
+ BitIndex::~BitIndex()
593
+ {
594
+ if(n != 0)
595
+ delete[] index;
596
+ }
597
+
598
+ bool BitIndex::operator[](size_t _index) const
599
+ {
600
+ if(_index >= n)
601
+ throw string("BitIndex : index out of bound\n");
602
+ return index[_index];
603
+ }
604
+
605
+ /****************************************** BitHash ******************************************/
606
+
607
+ size_t BitHash::id_for_oid(size_t _oid)
608
+ {
609
+ pair<map<size_t,size_t>::iterator, bool> it;
610
+ it = oid2id.insert(pair<size_t,size_t>(_oid, id2oid.size()));
611
+ if(it.second)
612
+ id2oid.push_back(_oid);
613
+ return it.first->second;
614
+ }
615
+ size_t BitHash::oid_for_id(size_t _id)
616
+ {
617
+ if(_id >= id2oid.size())
618
+ throw string("BitSet : index out of bound\n");
619
+ return id2oid[_id];
620
+ }
621
+
622
+ /****************************************** BitSet ******************************************/
623
+
624
+ void BitSet::set(char* feature, char* item, bool value)
625
+ {
626
+ string _feature = string(feature);
627
+ string _item = string(item);
628
+ if(id_for_feature.count(_feature) == 0)
629
+ throw string("No feature exist with name ")+_feature;
630
+ size_t feature_id = id_for_feature[_feature];
631
+
632
+ if(id_for_feature_item[feature_id].count(_item) == 0)
633
+ {
634
+ size_t curr_size=id_for_feature_item[feature_id].size();
635
+ if(curr_size >= features[feature_id].size() )
636
+ throw string("No item exist with name ")+_item+string(" and feature ")+_feature+string(" item list is full");
637
+ id_for_feature_item[feature_id][_item] = curr_size;
638
+ //throw string("No item exist with name ")+_item+string(" for feature ")+_feature;
639
+ }
640
+ size_t item_id = id_for_feature_item[feature_id][_item];
641
+
642
+ set(feature_id, item_id, value);
643
+ }
644
+
645
+ void BitSet::set(size_t feature_id, size_t item_id, bool value)
646
+ {
647
+ if(feature_id >= features.size() || feature_id >= id_for_feature_item.size())
648
+ throw string("BitSet : The internal feature index is too big (this is a bug there is not much you can do)");
649
+ if(item_id >= features[feature_id].size())
650
+ throw string("BitSet : The internal item index is too big (this is a bug there is not much you can do)");
651
+ features[feature_id].set(item_id, value);
652
+ }
653
+
654
+ bool BitSet::get(char* feature, char* item)
655
+ {
656
+ string _feature = string(feature);
657
+ string _item = string(item);
658
+ if(id_for_feature.count(_feature) == 0)
659
+ throw string("No feature exist with name ")+_feature;
660
+ size_t feature_id = id_for_feature[_feature];
661
+
662
+ if(id_for_feature_item[feature_id].count(_item) == 0)
663
+ {
664
+ size_t curr_size=id_for_feature_item[feature_id].size();
665
+ if(curr_size >= features[feature_id].size() )
666
+ throw string("No item exist with name ")+_item+string(" and feature ")+_feature+string(" item list is full");
667
+ id_for_feature_item[feature_id][_item] = curr_size;
668
+ //throw string("No item exist with name ")+_item+string(" for feature ")+_feature;
669
+ }
670
+ size_t item_id = id_for_feature_item[feature_id][_item];
671
+
672
+ return get(feature_id, item_id);
673
+ }
674
+
675
+ bool BitSet::get(size_t feature_id, size_t item_id)
676
+ {
677
+ if(feature_id >= features.size() || feature_id >= id_for_feature_item.size())
678
+ throw string("BitSet : The internal feature index is too big (this is a bug there is not much you can do)");
679
+ if(item_id >= features[feature_id].size())
680
+ throw string("BitSet : The internal item index is too big (this is a bug there is not much you can do)");
681
+ return features[feature_id][item_id];
682
+ }
683
+
684
+ void BitSet::add_feature(char* _name, size_t _size)
685
+ {
686
+ string __name = string(_name);
687
+ if(id_for_feature.count(__name) != 0)
688
+ throw string("BitSet : A feature already exist for name ")+__name;
689
+ id_for_feature[__name] = features.size();
690
+
691
+ //features.push_back(BitVector(_size));
692
+ features.push_back(BitVector());
693
+ features.back().init(_size);
694
+ id_for_feature_item.resize(_size);
695
+ feature_names.push_back(__name);
696
+ }
697
+
698
+
699
+ /****************************************** BitModel ******************************************/
700
+
701
+
702
+ void BitModel::add_set(char* _name)
703
+ {
704
+ string __name = string(_name);
705
+ if(set_for_set_name.count(__name) != 0)
706
+ throw string("BitModel : A set already exist for name ")+__name;
707
+ set_for_set_name[__name] = sets.size();
708
+ sets.push_back(BitSet(_name));
709
+ }
710
+
711
+ BitSet& BitModel::get_set(char* _name)
712
+ {
713
+ string __name = string(_name);
714
+ if(set_for_set_name.count(__name) == 0)
715
+ throw string("No set exist with name ")+__name;
716
+ size_t set_id = set_for_set_name[__name];
717
+ return get_set(set_id);
718
+ }
719
+
720
+ BitSet& BitModel::get_set(size_t set_id)
721
+ {
722
+ if(set_id >= sets.size())
723
+ throw string("BitModel : The internal set index is too big (this is a bug there is not much you can do)");
724
+ return sets[set_id];
725
+ }