20 #include <unordered_map>
24 #include "dirtyAllocator.h"
26 #include "operators.h"
27 #include "marginalTrek++.h"
30 #if ISOSPEC_BUILDING_R
40 unsigned int parse_formula(
const char* formula,
41 std::vector<const double*>& isotope_masses,
42 std::vector<const double*>& isotope_probabilities,
45 unsigned int* confSize);
52 class ISOSPEC_EXPORT_SYMBOL
Iso {
62 void setupMarginals(
const double*
const * _isotopeMasses,
63 const double*
const * _isotopeProbabilities);
86 const int* _isotopeNumbers,
87 const int* _atomCounts,
88 const double*
const * _isotopeMasses,
89 const double*
const * _isotopeProbabilities
93 Iso(
const char* formula);
103 Iso(
const Iso& other,
bool fullcopy);
109 double getLightestPeakMass()
const;
112 double getHeaviestPeakMass()
const;
141 virtual bool advanceToNextConfiguration() = 0;
147 virtual double lprob()
const {
return partialLProbs[0]; };
153 virtual double mass()
const {
return partialMasses[0]; };
159 virtual double prob()
const {
return partialProbs[0]; };
162 virtual void get_conf_signature(
int* space)
const = 0;
183 std::priority_queue<void*,std::vector<void*>,
ConfOrder> pq;
186 const std::vector<double>** logProbs;
187 const std::vector<double>** masses;
188 const std::vector<int*>** marginalConfs;
195 bool advanceToNextConfiguration()
override final;
204 int* c = getConf(topConf);
209 for(
int ii=0; ii<dimNumber; ii++)
211 memcpy(space, marginalResults[ii]->confs()[c[ii]], isotopeNumbers[ii]*
sizeof(
int));
212 space += isotopeNumbers[ii];
240 double* maxConfsLPSum;
241 const double Lcutoff;
246 const double* lProbs_ptr;
247 const double* lProbs_ptr_start;
248 double* partialLProbs_second;
249 double partialLProbs_second_val, lcfmsv;
253 inline void get_conf_signature(
int* space)
const override final
255 counter[0] = lProbs_ptr - lProbs_ptr_start;
256 if(marginalOrder !=
nullptr)
257 for(
int ii=0; ii<dimNumber; ii++)
259 int jj = marginalOrder[ii];
260 memcpy(space, marginalResultsUnsorted[ii]->get_conf(counter[jj]), isotopeNumbers[ii]*
sizeof(
int));
261 space += isotopeNumbers[ii];
264 for(
int ii=0; ii<dimNumber; ii++)
266 memcpy(space, marginalResultsUnsorted[ii]->get_conf(counter[ii]), isotopeNumbers[ii]*
sizeof(
int));
267 space += isotopeNumbers[ii];
281 IsoThresholdGenerator(
Iso&& iso,
double _threshold,
bool _absolute=
true,
int _tabSize=1000,
int _hashSize=1000,
bool reorder_marginals =
true);
286 delete[] maxConfsLPSum;
287 if (marginalResultsUnsorted != marginalResults)
288 delete[] marginalResultsUnsorted;
289 dealloc_table(marginalResults, dimNumber);
290 if(marginalOrder !=
nullptr)
291 delete[] marginalOrder;
300 if(ISOSPEC_LIKELY(*lProbs_ptr >= lcfmsv))
308 lProbs_ptr = lProbs_ptr_start;
310 int * cntr_ptr = counter;
312 while(idx<dimNumber-1)
320 partialLProbs[idx] = partialLProbs[idx+1] + marginalResults[idx]->
get_lProb(counter[idx]);
321 if(partialLProbs[idx] + maxConfsLPSum[idx-1] >= Lcutoff)
323 partialMasses[idx] = partialMasses[idx+1] + marginalResults[idx]->
get_mass(counter[idx]);
324 partialProbs[idx] = partialProbs[idx+1] * marginalResults[idx]->
get_prob(counter[idx]);
335 ISOSPEC_FORCE_INLINE
double lprob() const override final {
return partialLProbs_second_val + (*(lProbs_ptr)); };
336 ISOSPEC_FORCE_INLINE
double mass() const override final {
return partialMasses[1] + marginalResults[0]->
get_mass(lProbs_ptr - lProbs_ptr_start); };
337 ISOSPEC_FORCE_INLINE
double prob() const override final {
return partialProbs[1] * marginalResults[0]->
get_prob(lProbs_ptr - lProbs_ptr_start); };
340 void terminate_search();
352 size_t count_confs();
356 ISOSPEC_FORCE_INLINE
void recalc(
int idx)
358 for(; idx > 0; idx--)
360 partialLProbs[idx] = partialLProbs[idx+1] + marginalResults[idx]->
get_lProb(counter[idx]);
361 partialMasses[idx] = partialMasses[idx+1] + marginalResults[idx]->
get_mass(counter[idx]);
362 partialProbs[idx] = partialProbs[idx+1] * marginalResults[idx]->
get_prob(counter[idx]);
364 partialLProbs_second_val = *partialLProbs_second;
365 partialLProbs[0] = *partialLProbs_second + marginalResults[0]->
get_lProb(counter[0]);
366 lcfmsv = Lcutoff - partialLProbs_second_val;
387 std::vector<void*> newaccepted;
390 const std::vector<double>** logProbs;
391 const std::vector<double>** masses;
392 const std::vector<int*>** marginalConfs;
394 std::vector<void*>* current;
395 std::vector<void*>* next;
397 double targetCoverage;
398 double percentageToExpand;
401 size_t generator_position;
403 bool advanceToNextLayer();
406 bool advanceToNextConfiguration()
override final;
408 inline void get_conf_signature(
int* space)
const override final
410 int* conf = getConf(newaccepted[generator_position]);
411 for(
int ii=0; ii<dimNumber; ii++)
413 memcpy(space, marginalResults[ii]->confs()[conf[ii]], isotopeNumbers[ii]*
sizeof(
int));
414 space += isotopeNumbers[ii];
419 IsoLayeredGenerator(
Iso&& iso,
double _targetCoverage,
double _percentageToExpand = 0.3,
int _tabSize = 1000,
int _hashSize = 1000,
bool trim =
false);
422 void terminate_search();
429 #if !ISOSPEC_BUILDING_R
431 void printConfigurations(
432 const std::tuple<double*,double*,int*,int>& results,