IsoSpec  1.95
tabulator.h
1 #pragma once
2 
3 #include <stdlib.h>
4 
5 #include "isoSpec++.h"
6 
7 #define ISOSPEC_INIT_TABLE_SIZE 1024
8 
9 namespace IsoSpec
10 {
11 
12 template <typename T> class Tabulator
13 {
14 private:
15  double* _masses;
16  double* _lprobs;
17  double* _probs;
18  int* _confs;
19  size_t _confs_no;
20 public:
21  Tabulator(T* generator,
22  bool get_masses, bool get_probs,
23  bool get_lprobs, bool get_confs);
24 
25  ~Tabulator();
26 
27  inline double* masses(bool release = false) { double* ret = _masses; if(release) _masses = nullptr; return ret; };
28  inline double* lprobs(bool release = false) { double* ret = _lprobs; if(release) _lprobs = nullptr; return ret; };
29  inline double* probs(bool release = false) { double* ret = _probs; if(release) _probs = nullptr; return ret; };
30  inline int* confs(bool release = false) { int* ret = _confs; if(release) _confs = nullptr; return ret; };
31  inline size_t confs_no() { return _confs_no; };
32 };
33 
34 inline void reallocate(double **array, int new_size){
35  if( *array != nullptr ){
36  *array = (double *) realloc(*array, new_size);
37  }
38 }
39 
40 template <typename T> Tabulator<T>::Tabulator(T* generator,
41  bool get_masses, bool get_probs,
42  bool get_lprobs, bool get_confs )
43 {
44  size_t current_size = ISOSPEC_INIT_TABLE_SIZE;
45  int confs_tbl_idx = 0;
46  _confs_no = 0;
47 
48  const int allDimSizeOfInt = sizeof(int)*generator->getAllDim();
49 
50  _masses = get_masses ? (double *) malloc(ISOSPEC_INIT_TABLE_SIZE * sizeof(double)) : nullptr;
51  _lprobs = get_lprobs ? (double *) malloc(ISOSPEC_INIT_TABLE_SIZE * sizeof(double)) : nullptr;
52  _probs = get_probs ? (double *) malloc(ISOSPEC_INIT_TABLE_SIZE * sizeof(double)) : nullptr;
53  _confs = get_confs ? (int *) malloc(ISOSPEC_INIT_TABLE_SIZE * allDimSizeOfInt): nullptr;
54 
55 
56  while(generator->advanceToNextConfiguration()){
57  if( _confs_no == current_size )
58  {
59  current_size *= 2;
60 
61  // FIXME: Handle overflow gracefully here. It definitely could happen for people still stuck on 32 bits...
62 
63  reallocate(&_masses, current_size * sizeof(double));
64  reallocate(&_lprobs, current_size * sizeof(double));
65  reallocate(&_probs, current_size * sizeof(double));
66 
67  if( _confs != nullptr ){
68  _confs = (int *) realloc(_confs, current_size * allDimSizeOfInt);
69  }
70  }
71 
72  if(_masses != nullptr) _masses[_confs_no] = generator->mass();
73 
74  if(_lprobs != nullptr) _lprobs[_confs_no] = generator->lprob();
75 
76  if(_probs != nullptr) _probs[_confs_no] = generator->prob();
77 
78  if(_confs != nullptr){
79  generator->get_conf_signature(_confs + confs_tbl_idx);
80  confs_tbl_idx += generator->getAllDim();
81  }
82 
83  _confs_no++;
84  }
85 
86  _masses = (double *) realloc(_masses, _confs_no * sizeof(double));
87  _lprobs = (double *) realloc(_lprobs, _confs_no * sizeof(double));
88  _probs = (double *) realloc(_probs, _confs_no * sizeof(double));
89  _confs = (int *) realloc(_confs, confs_tbl_idx * sizeof(int));
90 }
91 
92 template <typename T> Tabulator<T>::~Tabulator()
93 {
94  if( _masses != nullptr ) free(_masses);
95  if( _lprobs != nullptr ) free(_lprobs);
96  if( _probs != nullptr ) free(_probs);
97  if( _confs != nullptr ) free(_confs);
98 }
99 
100 } // namespace IsoSpec
101 
IsoSpec
Definition: allocator.cpp:22
IsoSpec::Tabulator
Definition: tabulator.h:13