src/bnb_common.h
e693f153
 //     Copyright 2013, 2014, 2015 Ramon Diaz-Uriarte
 
 //     This program is free software: you can redistribute it and/or modify
 //     it under the terms of the GNU General Public License as published by
 //     the Free Software Foundation, either version 3 of the License, or
 //     (at your option) any later version.
 
 //     This program is distributed in the hope that it will be useful,
 //     but WITHOUT ANY WARRANTY; without even the implied warranty of
 //     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 //     GNU General Public License for more details.
 
 //     You should have received a copy of the GNU General Public License
 //     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
 
 #ifndef _BNB_COMMON_H_
 #define _BNB_COMMON_H_
 
 #include<Rcpp.h>
50a94207
 #include "common_classes.h"
 #include "debug_common.h"
 // #include "new_restrict.h" // for the TypeModel enum
 
 // // Simple custom exception for exceptions that lead to re-runs.
 // class rerunExcept: public std::runtime_error {
 // public:
 //   rerunExcept(const std::string &s) :
 //     std::runtime_error(s) {}
 // };
 
 
 // struct spParamsP {
 //   double popSize;
 //   double birth;
 //   double death;
 //   double W;
 //   double R;
 //   double mutation; 
 //   double timeLastUpdate;
 //   std::multimap<double, int>::iterator pv;
 //   double absfitness; //convenient for Beerenwinkel
 //   int numMutablePos; //for mutator if need update of mutation
 // };
e693f153
 
 
 inline void W_f_st(spParamsP& spP){
   spP.W = spP.death + spP.birth + spP.mutation;
 }
 
 inline void R_f_st(spParamsP& spP) {
   spP.R = sqrt( pow( spP.birth - spP.death, 2) + 
 		( 2.0 * (spP.birth + spP.death) + 
 		  spP.mutation) * spP.mutation );
 }
 
 
 inline double pE_f_st(double& pM, const spParamsP& spP){
   double pE = (spP.death * (1.0 - pM ) )/(spP.W - spP.death - spP.birth * pM );
   if( !std::isfinite(pE) ) {
50a94207
     DP2(spP.death);  DP2(spP.birth); DP2(pM); DP2(spP.W);
     DP2(spP.mutation);
     std::string error_message = R"(pE.f: pE not finite.
       This is expected to happen when mutationPropGrowth = TRUE 
       and you have have an initMutant with death >> birth,
       as that inevitably leads to net birth rate of 0
       and mutation rate of 0)";
     throw std::range_error(error_message);
e693f153
   }
   return pE;
 }
 
 inline double pB_f_st(const double& pE,
 			     const spParamsP& spP) {
   return (spP.birth * pE)/spP.death; 
 }
 
 void mapTimes_updateP(std::multimap<double, int>& mapTimes,
 			     std::vector<spParamsP>& popParams,
 			     const int index,
 			     const double time);
 
 
 void getMinNextMutationTime4(int& nextMutant, double& minNextMutationTime,
 			     const std::multimap<double, int>& mapTimes);
 
 
 void fill_SStats(Rcpp::NumericMatrix& perSampleStats,
 			       const std::vector<double>& sampleTotPopSize,
 			       const std::vector<double>& sampleLargestPopSize,
 			       const std::vector<double>& sampleLargestPopProp,
 			       const std::vector<int>& sampleMaxNDr,
 		 const std::vector<int>& sampleNDrLargestPop);
 
 
 void print_spP(const spParamsP& spP);
 
 double pM_f_st(const double& t, const spParamsP& spP);
 
 double ti_nextTime_tmax_2_st(const spParamsP& spP,
 			     const double& currentTime,
 			     const double& tSample,
 			     int& ti_dbl_min,
 			     int& ti_e3);
 
 double Algo2_st(const spParamsP& spP,
50a94207
 		const double& ti,
 		const int& mutationPropGrowth);
e693f153
 
 double Algo3_st(const spParamsP& spP, const double& t);
 
 void precissionLoss();
 
 void init_tmpP(spParamsP& tmpParam);
 
fc38a875
 // double returnMFE(double& e1,
 // 		 const std::string& typeFitness);
 
 // double returnMFE(double& e1,
 // 		 const TypeModel typeModel);
 
 double returnMFE_new(double& en1,
 		     const std::string& typeFitness);
 
 double returnMFE_new(double& en1,
 		     const TypeModel typeModel);
 
 // void computeMcFarlandError(double& e1,
 // 			   double& n_0,
 // 			   double& tps_0,
 // 			   const std::string& typeFitness,
 // 			   const double& totPopSize,
 // 			   const double& K);
 
 // void computeMcFarlandError(double& e1,
 // 			   double& n_0,
 // 			   double& tps_0,
 // 			   const TypeModel typeModel,
 // 			   const double& totPopSize,
 // 			   const double& K);
 
 void computeMcFarlandError_new(double& en1,
 			       double& en1sc,
 			       double& totPopSize_previous,
 			       double& DA_previous,
 			       const TypeModel typeModel,
 			       const double& totPopSize,
 			       const double& K);
 
 void computeMcFarlandError_new(double& en1,
 			       double& en1sc,
 			       double& totPopSize_previous,
 			       double& DA_previous,
 			       const std::string& typeFitness,
 			       const double& totPopSize,
 			       const double& K);
5d9775a3
 
e693f153
 void updateRatesMcFarland(std::vector<spParamsP>& popParams,
 				 double& adjust_fitness_MF,
 				 const double& K,
 			  const double& totPopSize);
 
 void updateRatesMcFarlandLog(std::vector<spParamsP>& popParams,
 				    double& adjust_fitness_MF,
 				    const double& K,
 			     const double& totPopSize);
 
 
 void updateRatesMcFarland0(std::vector<spParamsP>& popParams,
 				  double& adjust_fitness_MF,
 				  const double& K,
 				  const double& totPopSize,
debcf5f5
 				  const int& mutationPropGrowth,
e693f153
 			   const double& mu);
 
 void updateRatesBeeren(std::vector<spParamsP>& popParams,
 			      double& adjust_fitness_B,
 			      const double& initSize,
 			      const double& currentTime,
 			      const double& alpha,
 			      const double& totPopSize,
debcf5f5
 			      const int& mutationPropGrowth,
e693f153
 		       const double& mu);
 
f9a38e24
 void detect_ti_duplicates(const std::multimap<double, int>& m,
 			  const double ti,
 			  const int spcies);
e693f153
 #endif