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,
The generator of isotopologues.
ISOSPEC_FORCE_INLINE double lprob() const override final
Get the log-probability of the current isotopologue.
The Iso class for the calculation of the isotopic distribution.
The class that represents isotopologues above a given joint probability value.
ISOSPEC_FORCE_INLINE double mass() const override final
Get the mass of the current isotopologue.
int getDimNumber() const
Get the number of elements in the chemical formula of the molecule.
The marginal distribution class (a subisotopologue).
ISOSPEC_FORCE_INLINE bool advanceToNextConfiguration() override final
Advance to the next, not yet visited, most probable isotopologue.
const double & get_prob(int idx) const
Get the probability of the idx-th subisotopologue.
virtual double mass() const
Get the mass of the current isotopologue.
double getModeLProb() const
Get the log-probability of the mode-configuration (if there are many modes, they share this value)...
const double & get_lProb(int idx) const
Get the log-probability of the idx-th subisotopologue.
virtual double prob() const
Get the probability of the current isotopologue.
int getAllDim() const
Get the total number of isotopes of elements present in a chemical formula.
virtual double lprob() const
Get the log-probability of the current isotopologue.
const double & get_mass(int idx) const
Get the mass of the idx-th subisotopologue.
The generator of isotopologues above a given threshold value.
The generator of isotopologues sorted by their probability of occurrence.
ISOSPEC_FORCE_INLINE double prob() const override final
Get the probability of the current isotopologue.
The marginal distribution class (a subisotopologue).
Precalculated Marginal class.
void get_conf_signature(int *space) const override final
Save the counts of isotopes in the space.