src/UnityOncoSimul/intervention_private_2.cpp
9d183dd1
 #include "intervention.h"
 
 
 // This function is needed if what we are trying to descrease is the whole population, and not just the population of 1 genotype
 // nn by default is equal 1
 // n array con las poblaciones de cada genotipo y su ncols(diferentes tipos de genotipos en la población)
 // target is the target size, to which number the population would get reduced to.
 void reduceTotalPopulation(InterventionsInfo& iif, double target, double totPopSize){
     
     // first we take all the population from the structure, and we create a vector with its populations
     std::vector<double> populations;
     Rcpp::NumericMatrix rcpp_mhgeo_distribution; 
     Rcpp::NumericMatrix rcpp_populations_matrix;
     Rcpp::NumericVector rcpp_populations;
     Rcpp::NumericVector rcpp_target;
     //auxiliar variable to check the structure (and the atribute mapGenoToPop) is well populated
     double totalPop = 0.0;
     for(auto map : iif.mapGenoToPop){
         totalPop += map.second;
         populations.push_back(map.second);
     }
     // we convert the vector to something R can understand
     rcpp_populations = Rcpp::wrap(populations);
     rcpp_populations.attr("dim") = Dimension(1, populations.size());
 
     rcpp_populations_matrix = Rcpp::wrap(rcpp_populations);
     rcpp_target = Rcpp::wrap(target);
     
     // then, we specify the total genotypes of the populations and we obtain a distribution
     rcpp_mhgeo_distribution = my_rmvhyper(1, rcpp_populations_matrix, rcpp_target);
 
     populations = Rcpp::as<std::vector<double>>(rcpp_mhgeo_distribution);
 
     //quick check before creating the matrix CANT BE DONE HERE (totPopSize is not updated until crude is filled)
     //if(totPopSize != totalPop){
     //    throw std::runtime_error("TotalPop != totPopSize, exiting...");
     //}
 
     int i=0;
     for(auto &map : iif.mapGenoToPop){
         //check if it goes out of bounds
         map.second = populations[i];
         i++;
     }
     
 }