diff --git a/Models/Notes.txt b/Models/Notes.txt new file mode 100644 index 0000000..be4b9be --- /dev/null +++ b/Models/Notes.txt @@ -0,0 +1,42 @@ +This code was used to generate results published in the paper, 'Rapid Identification of Genes Controlling Virulence and Immunity in Malaria Parasites' by Abkallo et al. These notes are written by Chris Illingworth. + +A standard GSL optimisation routine was used to fit a variety of models to sequenced allele frequencies + +OneFreq: Fits a single allele frequency to the data + +To compile use: + +make one + +Command line for this model is: + +./run_onefreq + +where contains the input allele frequencies, initialises the random number generator, specifies how many replicate calcualations to run, and is the noise parameter characterising the beta-binomial model. Note that beta is equal to the shrink parameter from the jump-diffusion code. + + +SingleDriver: Fits a model of allele frequencies given the presence of a single allele under positive selection + +make one compiles run_onetimesel + +./run_onetimesel + +This optimises model for a given dataset, finding a set of optimised parameters for each replicate optimisation. The model assumes a single local rate of recombination + + +SingleDriverRhoXStay: Fits a model of allele frequencies + +Compiled using make one + +./run_onetimeselrhoX_stay + +This optimises a model for a given dataset, finding a set of optimised parameters for each replicate optimisation. The model assumes that there are two local rates of recombination, which change in a stepwise fashion at a given locus. + +In order to obtain better results from the optimisation routine, this code specifies a locus at which selection might be found, and optimises the remaining parameters of the model. Code was run across a range of input loci. + + +SingleDriver2RhoXStay and SingleDriver3RhoXStay: + +Work as does the SingleDriverRhoXStay model, but with three and four local rates of recombination, with two and three recombination rate change points. + + diff --git a/Models/OneFreq/Makefile b/Models/OneFreq/Makefile new file mode 100644 index 0000000..2742b0b --- /dev/null +++ b/Models/OneFreq/Makefile @@ -0,0 +1,11 @@ +CC = g++ +CC_FLAGS = -g3 -O3 -Wall -I /Users/ci3/local/include/gsl/ +LD_FLAGS = -L/Users/ci3/local/include/gsl/lib/ -lm -lgsl -lcblas +ONE = onefreq.o utilities.o + +one : $(ONE) + $(CC) $(CC_FLAGS) $(ONE) -o run_onefreq $(LD_FLAGS) +onefreq.o: onefreq.cpp + $(CC) $(CC_FLAGS) -c onefreq.cpp +utilities.o: utilities.cpp + $(CC) $(CC_FLAGS) -c utilities.cpp diff --git a/Models/OneFreq/onefreq.cpp b/Models/OneFreq/onefreq.cpp new file mode 100644 index 0000000..b179ca4 --- /dev/null +++ b/Models/OneFreq/onefreq.cpp @@ -0,0 +1,140 @@ +#include +#include +#include +#include +#include +#include +using namespace std; +#include "shared.h" + +int main(int argc, char *argv[]){ + + vector traj; + vector traj_inf; + double x_final=0; + + string input(argv[1]); + int seed=atoi(argv[2]); + + //Set up random number generator + srand((unsigned int)(seed)); + gsl_rng *rgen = gsl_rng_alloc (gsl_rng_taus); + gsl_rng_set (rgen, seed); + + ImportData(input,traj); + + //return 0; + + //Number of data points + int p=traj.size(); + //cout << p << "\n"; + + //Parameters are l (locus), x (cross frequency), e (vertical movement), rho (recombination), xf (driver frequency) + + opt_data od; + double best_fit=-1e10; + double last_fit=-1e10; + + int reps=atoi(argv[3]); + int bparm=atoi(argv[4]); + + for (int r=1; r<=reps; r++) { + + //Set up initial parameters + od.x = 0.5+(0.5*gsl_rng_uniform(rgen)); + + //General setup for optimisation routine + + //Optimisation processs + for (int it=0;it<1000000;it++){ + + //cout << "it " << it << "\n"; + size_t iter=0; //GSL iteration number + + //CheckLastLikelihood + + //Vector x contains parameters to be optimised. Parameters are locus and two frequencies + int xx_size=1; + gsl_vector *xx = gsl_vector_calloc(xx_size); + SetXXVector(od,xx); + //cout << "Done set xx\n"; + + //Optimisation bit goes here + + int p_size = 4*(traj.size())+25; + + double *params; + params=(double *)calloc(p_size,sizeof(double)); + + SetParams(bparm,params,traj); + //cout << "Done set params\n"; + + //Define the optimisation function + gsl_multimin_function my_func; + my_func.n=xx_size; + my_func.f=&get_best_fit; + my_func.params=params; + + gsl_multimin_fminimizer *s; + const gsl_multimin_fminimizer_type *T=gsl_multimin_fminimizer_nmsimplex; + s=gsl_multimin_fminimizer_alloc(T,xx_size); + //cout << "Done define\n"; + + //Starting change magnitudes + gsl_vector* ss=gsl_vector_alloc(xx_size); + gsl_vector_set(ss,0,0.1); + //cout << "Done set ss\n"; + + gsl_multimin_fminimizer_set (s,&my_func,xx,ss); + //cout << "Done set mmin\n"; + int status; + double size; + do { + iter++; + status=gsl_multimin_fminimizer_iterate(s); + if (status) {break;} + + size=gsl_multimin_fminimizer_size(s); + status = gsl_multimin_test_size(size, 1e-4); + + if (status == GSL_SUCCESS) { + } + + } while (status==GSL_CONTINUE && iter<1000); + + last_fit = s->fval; + last_fit=-last_fit; + cout << "Last fit score = " << last_fit <<"\n"; + + if (last_fit>best_fit) { + best_fit=last_fit; + x_final=gsl_vector_get(s->x,0); + + } else { + break; + } + + gsl_vector_free(xx); + gsl_vector_free(ss); + gsl_multimin_fminimizer_free(s); + + + } + } + + + //Print values and frequencies + cout << "Optimised values\n"; + cout << " x " << x_final << " Log L " << best_fit << "\n"; + od.x = x_final; + int xx_size=1; + gsl_vector *xx = gsl_vector_calloc(xx_size); + SetXXVector(od,xx); + //cout << "Allele frequencies\n"; + ofstream out_file; + out_file.open("both"); + FindFrequenciesFinal(traj,traj_inf,xx,out_file); + + + return 0; +} \ No newline at end of file diff --git a/Models/OneFreq/shared.h b/Models/OneFreq/shared.h new file mode 100644 index 0000000..4470540 --- /dev/null +++ b/Models/OneFreq/shared.h @@ -0,0 +1,54 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +using namespace std; + +struct rec { + int chr; + int index; + int pos; + int obs; + double q; + int N; +}; + +struct opt_data { + double x; +}; + + +void ImportData (string input, vector& traj); + +void SetXXVector(opt_data od, gsl_vector* xx); +void SetParams (int betaparm, double *params, vector traj); +void GetParams (double *p, int& betaparm, vector& traj); +int CheckParams(const gsl_vector *xx, double *p); +double get_best_fit(const gsl_vector *xx, void *params); +void FindFrequencies (vector traj, vector& traj_inf, const gsl_vector *xx); +void FindFrequenciesFinal (vector traj, vector& traj_inf, const gsl_vector *xx, ofstream& out_file); +double GetLogLikelihood(int betaparm, vector traj, vector traj_inf, vector fact_store); +void FindLogFact(vector& fact_store,int N); +double BetaBinomCalc(int N, int r, float p, int betaparm, vector fact_store); diff --git a/Models/OneFreq/utilities.cpp b/Models/OneFreq/utilities.cpp new file mode 100644 index 0000000..71c4e6f --- /dev/null +++ b/Models/OneFreq/utilities.cpp @@ -0,0 +1,150 @@ +using namespace std; +#include "shared.h" + +void ImportData (string input, vector& traj) { + ifstream pass_file; + pass_file.open(input.c_str()); + + int i=0; + do { + rec new_traj; + pass_file >> new_traj.chr; + pass_file >> new_traj.pos; + pass_file >> new_traj.obs; + pass_file >> new_traj.N; + new_traj.index=i; + i++; + new_traj.q=(new_traj.obs+0.)/(new_traj.N+0.); + //cout << i << " " << new_traj.q << "\n"; + traj.push_back(new_traj); + + } while (!pass_file.eof()); +} + +void SetXXVector(opt_data od, gsl_vector* xx) { + gsl_vector_set(xx,0,od.x); //Frequency +} + +void SetParams (int betaparm, double *params, vector traj) { + params[0]=traj.size(); + params[1]=betaparm; + params[2]=traj.size(); + params[3]=traj.size(); + for (unsigned int i=1;i& traj) { + unsigned int ts=p[0]; + betaparm=p[1]; + for (unsigned int i=1;i traj; + vector traj_inf; + vector fact_store; + + GetParams(p,betaparm,traj); + //cout << "i " << gsl_vector_get(xx,0) << " x " << gsl_vector_get(xx,1) << " e " << gsl_vector_get(xx,2) << " rho " << gsl_vector_get(xx,3) << " xf " << gsl_vector_get(xx,4) << "\n"; + FindFrequencies(traj,traj_inf,xx); + //cout << "Done FindFrequencies\n"; + L=GetLogLikelihood(betaparm,traj,traj_inf,fact_store); + //cout << "L= " << L << "\n"; + L=-L; + return L; +} + +int CheckParams(const gsl_vector *xx, double *p) { + int chk=1; + double x=gsl_vector_get(xx,0); + if (x<=0.0 || x>=1.0) { + chk=0; + } + return chk; +} + +void FindFrequencies (vector traj, vector& traj_inf, const gsl_vector *xx) { + //Set up traj_inf + traj_inf=traj; + + //Optimisation parameters + double x=gsl_vector_get(xx,0); + + //Frequency at each of the loci + for (unsigned int j=0;j traj, vector& traj_inf, const gsl_vector *xx, ofstream& out_file) { + //Set up traj_inf + traj_inf=traj; + //cout << "i " << gsl_vector_get(xx,0) << " x " << gsl_vector_get(xx,1) << " e " << gsl_vector_get(xx,2) << " rho " << gsl_vector_get(xx,3) << " xf " << gsl_vector_get(xx,4) << "\n"; + + //Optimisation parameters + double x=gsl_vector_get(xx,0); + + //Frequency at each of the loci + for (unsigned int j=0;j traj, vector traj_inf, vector fact_store) { + double L=0; + for (unsigned int i=0;i fact_store) { + double alpha=betaparm*p; + double beta=betaparm*(1-p); + double bin=gsl_sf_lngamma(N+1)+gsl_sf_lngamma(r+alpha)+gsl_sf_lngamma(N-r+beta)+gsl_sf_lngamma(alpha+beta)-gsl_sf_lngamma(r+1)-gsl_sf_lngamma(N-r+1)-gsl_sf_lngamma(N+alpha+beta)-gsl_sf_lngamma(alpha)-gsl_sf_lngamma(beta); + bin=exp(bin); + if (bin<1e-300) { + bin=1e-300; + } + //cout<<"Binomial N r p0 = "<& fact_store,int N){ + double logN=0; + for (int i=1;i<=N;i++) { + logN=logN+log(i); + fact_store.push_back(logN); + //cout << "fact_store "< +#include +#include +#include +#include +#include +using namespace std; +#include "shared.h" + +int main(int argc, char *argv[]){ + + vector traj; + vector traj_inf; + double i_final=0; + double x_final=0; + double e_final=0; + double rho_final=0; + double xf_final=0; + + string input(argv[1]); + int seed=atoi(argv[2]); + + //Set up random number generator + srand((unsigned int)(seed)); + gsl_rng *rgen = gsl_rng_alloc (gsl_rng_taus); + gsl_rng_set (rgen, seed); + + ImportData(input,traj); + + //return 0; + + //Number of data points + int p=traj.size(); + //cout << p << "\n"; + + //Parameters are l (locus), x (cross frequency), e (vertical movement), rho (recombination), xf (driver frequency) + + opt_data od; + double best_fit=-1e10; + double last_fit=-1e10; + + int reps=atoi(argv[3]); + int bparm=atoi(argv[4]); + + for (int r=1; r<=reps; r++) { + cout << "Rep " << r << "\n"; + //Set up initial parameters + od.i = floor(gsl_rng_uniform(rgen)*p); + od.x = 0.5+(0.5*gsl_rng_uniform(rgen)); + double xx=pow(od.x,2); + //double mxmx=pow(1-od.x,2); + double xmx=od.x*(1-od.x); + double mxmx=(1-od.x)*(1-od.x); + od.e = (mxmx*gsl_rng_uniform(rgen))-(0.5*mxmx); + od.rho = 1e-6; + od.xf = xx + (2*xmx*gsl_rng_uniform(rgen)); + + //General setup for optimisation routine + + //Optimisation processs + for (int it=0;it<1000000;it++){ + + //cout << "it " << it << "\n"; + size_t iter=0; //GSL iteration number + + //CheckLastLikelihood + + //Vector x contains parameters to be optimised + int xx_size=5; + gsl_vector *xx = gsl_vector_calloc(xx_size); + SetXXVector(od,xx); + //cout << "Done set xx\n"; + + //Optimisation bit goes here + + int p_size = 4*(traj.size())+25; + + double *params; + params=(double *)calloc(p_size,sizeof(double)); + + SetParams(bparm,params,traj); + //cout << "Done set params\n"; + + //Define the optimisation function + gsl_multimin_function my_func; + my_func.n=xx_size; + my_func.f=&get_best_fit; + my_func.params=params; + + gsl_multimin_fminimizer *s; + const gsl_multimin_fminimizer_type *T=gsl_multimin_fminimizer_nmsimplex; + s=gsl_multimin_fminimizer_alloc(T,xx_size); + //cout << "Done define\n"; + + //Starting change magnitudes + gsl_vector* ss=gsl_vector_alloc(xx_size); + gsl_vector_set(ss,0,100); + gsl_vector_set(ss,1,0.1); + gsl_vector_set(ss,2,0.1); + gsl_vector_set(ss,3,od.rho/4.); + gsl_vector_set(ss,4,0.1); + //cout << "Done set ss\n"; + + gsl_multimin_fminimizer_set (s,&my_func,xx,ss); + //cout << "Done set mmin\n"; + int status; + double size; + do { + iter++; + status=gsl_multimin_fminimizer_iterate(s); + if (status) {break;} + + size=gsl_multimin_fminimizer_size(s); + status = gsl_multimin_test_size(size, 1e-4); + + if (status == GSL_SUCCESS) { + } + + } while (status==GSL_CONTINUE && iter<1000); + + last_fit = s->fval; + last_fit=-last_fit; + cout << "Last fit score = " << last_fit <<"\n"; + + if (last_fit>best_fit) { + best_fit=last_fit; + i_final=gsl_vector_get(s->x,0); + x_final=gsl_vector_get(s->x,1); + e_final=gsl_vector_get(s->x,2); + rho_final=gsl_vector_get(s->x,3); + xf_final=gsl_vector_get(s->x,4); + + } else { + break; + } + + gsl_vector_free(xx); + gsl_vector_free(ss); + gsl_multimin_fminimizer_free(s); + + + } + } + + + //Print values and frequencies + cout << "Optimised values\n"; + cout << "index " << floor(i_final) << " locus " << traj[i_final].pos << " x " << x_final << " e " << e_final << " rho " << rho_final << " xf " << xf_final << " Log L " << best_fit << "\n"; + od.i = i_final; + od.x = x_final; + od.e = e_final; + od.rho = rho_final; + od.xf = xf_final; + cout << od.xf << "\n"; + int xx_size=5; + gsl_vector *xx = gsl_vector_calloc(xx_size); + SetXXVector(od,xx); + //cout << "Allele frequencies\n"; + ofstream out_file; + out_file.open("both"); + FindFrequenciesFinal(traj,traj_inf,xx,out_file); + + + return 0; +} \ No newline at end of file diff --git a/Models/SingleDriver/shared.h b/Models/SingleDriver/shared.h new file mode 100644 index 0000000..282dc29 --- /dev/null +++ b/Models/SingleDriver/shared.h @@ -0,0 +1,58 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +using namespace std; + +struct rec { + int chr; + int index; + int pos; + int obs; + double q; + int N; +}; + +struct opt_data { + int i; + double x; + double e; + double rho; + double xf; +}; + + +void ImportData (string input, vector& traj); + +void SetXXVector(opt_data od, gsl_vector* xx); +void SetParams (int betaparm, double *params, vector traj); +void GetParams (double *p, int& betaparm, vector& traj); +int CheckParams(const gsl_vector *xx, double *p); +double get_best_fit(const gsl_vector *xx, void *params); +void FindFrequencies (vector traj, vector& traj_inf, const gsl_vector *xx); +void FindFrequenciesFinal (vector traj, vector& traj_inf, const gsl_vector *xx, ofstream& out_file); +double GetLogLikelihood(int betaparm, vector traj, vector traj_inf, vector fact_store); +void FindLogFact(vector& fact_store,int N); +double BetaBinomCalc(int N, int r, float p, int betaparm, vector fact_store); diff --git a/Models/SingleDriver/utilities.cpp b/Models/SingleDriver/utilities.cpp new file mode 100644 index 0000000..5b88176 --- /dev/null +++ b/Models/SingleDriver/utilities.cpp @@ -0,0 +1,228 @@ +using namespace std; +#include "shared.h" + +void ImportData (string input, vector& traj) { + ifstream pass_file; + pass_file.open(input.c_str()); + + int i=0; + do { + rec new_traj; + pass_file >> new_traj.chr; + pass_file >> new_traj.pos; + pass_file >> new_traj.obs; + pass_file >> new_traj.N; + new_traj.index=i; + i++; + new_traj.q=(new_traj.obs+0.)/(new_traj.N+0.); + //cout << i << " " << new_traj.q << "\n"; + traj.push_back(new_traj); + + } while (!pass_file.eof()); +} + +void SetXXVector(opt_data od, gsl_vector* xx) { + gsl_vector_set(xx,0,od.i); //Driver index + gsl_vector_set(xx,1,od.x); //Frequency at cross + gsl_vector_set(xx,2,od.e); //Vertical movement + gsl_vector_set(xx,3,od.rho); //Recombination rate + gsl_vector_set(xx,4,od.xf); //Driver frequency after selection +} + +void SetParams (int betaparm, double *params, vector traj) { + params[0]=traj.size(); + params[1]=betaparm; + params[2]=traj.size(); + params[3]=traj.size(); + for (unsigned int i=1;i& traj) { + unsigned int ts=p[0]; + betaparm=p[1]; + for (unsigned int i=1;i traj; + vector traj_inf; + vector fact_store; + + GetParams(p,betaparm,traj); + //cout << "i " << gsl_vector_get(xx,0) << " x " << gsl_vector_get(xx,1) << " e " << gsl_vector_get(xx,2) << " rho " << gsl_vector_get(xx,3) << " xf " << gsl_vector_get(xx,4) << "\n"; + FindFrequencies(traj,traj_inf,xx); + //cout << "Done FindFrequencies\n"; + L=GetLogLikelihood(betaparm,traj,traj_inf,fact_store); + //cout << "L= " << L << "\n"; + L=-L; + return L; +} + +int CheckParams(const gsl_vector *xx, double *p) { + int chk=1; + double i=gsl_vector_get(xx,0); + double x=gsl_vector_get(xx,1); + double e=gsl_vector_get(xx,2); + double rho=gsl_vector_get(xx,3); + double xf=gsl_vector_get(xx,4); + if (rho<0) { + //cout << "Rho " << rho << "\n"; + chk=0; + } + if (i<0 || i>p[0]) { + //cout << "i " << i << "\n"; + chk=0; + } + if (x<=0.5 || x>=1) { + //cout << "x " << x << "\n"; + chk=0; + } + if (e< -pow(x,2) || e> pow((1-x),2)) { + //cout << "e " << e << " " << -pow(x,2) << " " << pow((1-x),2) << "\n"; + chk=0; + } + if (xf 1-pow(1-x,2)) { + //cout << "xf " << xf << " " << pow(x,2) << " " << 1-pow(1-x,2) << "\n"; + chk=0; + } + if (xf+e>=1 || xf+e <=0) { + //cout << "xf+e " << xf+e << "\n"; + chk=0; + } + return chk; +} + +void FindFrequencies (vector traj, vector& traj_inf, const gsl_vector *xx) { + //Set up traj_inf + traj_inf=traj; + //Frequency at driver locus + unsigned int i=floor(gsl_vector_get(xx,0)); //Index of driver + //cout << i << " " << traj_inf.size() << " " << traj.size() << "\n"; + double x=gsl_vector_get(xx,1); + double e=gsl_vector_get(xx,2); + double rho=gsl_vector_get(xx,3); + double xf=gsl_vector_get(xx,4); + // double xf=gsl_vector_get(xx,4); //?? Sort out something around here? + + //cout << "FindFrequencies " << i << " " << x << " " << e << " " << rho << " " << xf << "\n"; + + + traj_inf[i].q=xf+e; + + //Frequency at passenger loci + for (unsigned int j=0;j1) { + cout << "Error2 " << traj_inf[i].pos << " " << traj_inf[j].pos << " " << x << " " << Delta_ij << " " << rho << " " << ExpRhoD << " " << xf << " " << e << " " << traj_inf[j].q << "\n"; ; + } + } + } +} + +void FindFrequenciesFinal (vector traj, vector& traj_inf, const gsl_vector *xx, ofstream& out_file) { + //Set up traj_inf + traj_inf=traj; + //cout << "i " << gsl_vector_get(xx,0) << " x " << gsl_vector_get(xx,1) << " e " << gsl_vector_get(xx,2) << " rho " << gsl_vector_get(xx,3) << " xf " << gsl_vector_get(xx,4) << "\n"; + + //Frequency at driver locus + unsigned int i=floor(gsl_vector_get(xx,0)); //Index of driver + //cout << i << " " << traj_inf.size() << " " << traj.size() << "\n"; + double x=gsl_vector_get(xx,1); + double e=gsl_vector_get(xx,2); + double rho=gsl_vector_get(xx,3); + double xf=gsl_vector_get(xx,4); + + traj_inf[i].q=xf+e; + //cout << traj_inf[i].q << "\n"; + out_file << i << " " << traj[i].pos << " " << traj[i].q << " " << traj_inf[i].q << "\n"; + + //Frequency at passenger loci + for (unsigned int j=0;j1) { + cout << "Error3 " << x << " " << Delta_ij << " " << ExpRhoD << " " << xf << " " << e << "\n"; ; + } + } + } +} + +double GetLogLikelihood(int betaparm, vector traj, vector traj_inf, vector fact_store) { + double L=0; + for (unsigned int i=0;i fact_store) { + double alpha=betaparm*p; + double beta=betaparm*(1-p); + double bin=1e10; + if ((alpha==0)||(beta==0)) { + bin=1e10; + } else { + bin=gsl_sf_lngamma(N+1)+gsl_sf_lngamma(r+alpha)+gsl_sf_lngamma(N-r+beta)+gsl_sf_lngamma(alpha+beta)-gsl_sf_lngamma(r+1)-gsl_sf_lngamma(N-r+1)-gsl_sf_lngamma(N+alpha+beta)-gsl_sf_lngamma(alpha)-gsl_sf_lngamma(beta); + bin=exp(bin); + } + if (bin<1e-300) { + bin=1e-300; + } + //cout<<"Binomial N r p0 = "<& fact_store,int N){ + double logN=0; + for (int i=1;i<=N;i++) { + logN=logN+log(i); + fact_store.push_back(logN); + //cout << "fact_store "< +#include +#include +#include +#include +#include +using namespace std; +#include "shared.h" + +int main(int argc, char *argv[]){ + + vector traj; + vector traj_inf; + double i_final=0; + double x_final=0; + double e_final=0; + double rho1_final=0; + double rho2_final=0; + double rho3_final=0; + double rx1_final=0; //Point of change in recombination rate + double rx2_final=0; //Point of change in recombination rate + double xf_final=0; + + string input(argv[1]); + int seed=atoi(argv[2]); + + //Set up random number generator + srand((unsigned int)(seed)); + gsl_rng *rgen = gsl_rng_alloc (gsl_rng_taus); + gsl_rng_set (rgen, seed); + + ImportData(input,traj); + + //return 0; + + //Number of data points + int p=traj.size(); + //cout << p << "\n"; + + //Parameters are l (locus), x (cross frequency), e (vertical movement), rho (recombination), xf (driver frequency) + + opt_data od; + double best_fit=-1e10; + double last_fit=-1e10; + + int reps=atoi(argv[3]); + int bparm=atoi(argv[4]); + int driver=atoi(argv[5]); + + for (int r=1; r<=reps; r++) { + + //Set up initial parameters + od.i = floor(gsl_rng_uniform(rgen)*p); + od.x = 0.5+(0.5*gsl_rng_uniform(rgen)); + double m=min(pow(od.x,2),pow((1-od.x),2)); + od.e = (m*gsl_rng_uniform(rgen)); + od.rho1 = 1e-6; + od.rho2 = 1e-6; + od.rho3 = 1e-6; + od.rx1 = floor((0.49*gsl_rng_uniform(rgen)*p)); + od.rx2 = floor((0.5*p)+(0.49*gsl_rng_uniform(rgen)*p)); + od.xf =0.5+(0.5*gsl_rng_uniform(rgen)); + //General setup for optimisation routine + + //Optimisation processs + for (int it=0;it<1000000;it++){ + + //cout << "it " << it << "\n"; + size_t iter=0; //GSL iteration number + + //CheckLastLikelihood + + //Vector x contains parameters to be optimised + int xx_size=8; + gsl_vector *xx = gsl_vector_calloc(xx_size); + SetXXVector(od,xx); + //cout << "Done set xx\n"; + + //Optimisation bit goes here + + int p_size = 4*(traj.size())+25; + + double *params; + params=(double *)calloc(p_size,sizeof(double)); + + SetParams(bparm,driver,params,traj); + //cout << "Done set params\n"; + + //Define the optimisation function + gsl_multimin_function my_func; + my_func.n=xx_size; + my_func.f=&get_best_fit; + my_func.params=params; + + gsl_multimin_fminimizer *s; + const gsl_multimin_fminimizer_type *T=gsl_multimin_fminimizer_nmsimplex; + s=gsl_multimin_fminimizer_alloc(T,xx_size); + //cout << "Done define\n"; + + //Starting change magnitudes + gsl_vector* ss=gsl_vector_alloc(xx_size); + gsl_vector_set(ss,0,0.1); + gsl_vector_set(ss,1,0.1); + gsl_vector_set(ss,2,od.rho1); + gsl_vector_set(ss,3,od.rho2); + gsl_vector_set(ss,4,od.rho3); + gsl_vector_set(ss,5,100); + gsl_vector_set(ss,6,100); + gsl_vector_set(ss,7,0.1); + //cout << "Done set ss\n"; + + gsl_multimin_fminimizer_set (s,&my_func,xx,ss); + //cout << "Done set mmin\n"; + int status; + double size; + do { + iter++; + status=gsl_multimin_fminimizer_iterate(s); + if (status) {break;} + + size=gsl_multimin_fminimizer_size(s); + status = gsl_multimin_test_size(size, 1e-4); + + if (status == GSL_SUCCESS) { + } + + } while (status==GSL_CONTINUE && iter<1000); + + last_fit = s->fval; + last_fit=-last_fit; + cout << "Last fit score = " << last_fit <<"\n"; + + if (last_fit>best_fit) { + best_fit=last_fit; + x_final=gsl_vector_get(s->x,0); + e_final=gsl_vector_get(s->x,1); + rho1_final=gsl_vector_get(s->x,2); + rho2_final=gsl_vector_get(s->x,3); + rho3_final=gsl_vector_get(s->x,4); + rx1_final=gsl_vector_get(s->x,5); + rx2_final=gsl_vector_get(s->x,6); + xf_final=gsl_vector_get(s->x,7); + + } else { + break; + } + + gsl_vector_free(xx); + gsl_vector_free(ss); + gsl_multimin_fminimizer_free(s); + + + } + } + + + //Print values and frequencies + cout << "Optimised values\n"; + cout << "index " << driver<< " locus " << traj[driver].pos << " x " << x_final << " rx1 " << rx1_final << " " << traj[floor(rx1_final)].pos << " rx2 " << traj[floor(rx2_final)].pos << " " << rx2_final << " e " << e_final << " rho1 " << rho1_final << " rho2 " << rho2_final << " rho3 " << rho3_final << " xf " << xf_final << " Log L " << best_fit << "\n"; + od.i = i_final; + od.x = x_final; + od.e = e_final; + od.rho1 = rho1_final; + od.rho2 = rho2_final; + od.rho3 = rho3_final; + od.rx1 = rx1_final; + od.rx2 = rx2_final; + od.xf = xf_final; +// cout << od.xf << "\n"; + int xx_size=9; + gsl_vector *xx = gsl_vector_calloc(xx_size); + SetXXVector(od,xx); + //cout << "Allele frequencies\n"; + ofstream out_file; + out_file.open("both"); + FindFrequenciesFinal(driver,traj,traj_inf,xx,out_file); + + + return 0; +} \ No newline at end of file diff --git a/Models/SingleDriver2RhoXStay/shared.h b/Models/SingleDriver2RhoXStay/shared.h new file mode 100644 index 0000000..8b65126 --- /dev/null +++ b/Models/SingleDriver2RhoXStay/shared.h @@ -0,0 +1,62 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +using namespace std; + +struct rec { + int chr; + int index; + int pos; + int obs; + double q; + int N; +}; + +struct opt_data { + int i; + double x; + double e; + double rho1; + double rho2; + double rho3; + double xf; + double rx1; + double rx2; +}; + + +void ImportData (string input, vector& traj); + +void SetXXVector(opt_data od, gsl_vector* xx); +void SetParams (int betaparm, int driver, double *params, vector traj); +void GetParams (double *p, int& betaparm, int& driver, vector& traj); +int CheckParams(const gsl_vector *xx, double *p); +double get_best_fit(const gsl_vector *xx, void *params); +void FindFrequencies (int driver, vector traj, vector& traj_inf, const gsl_vector *xx); +void FindFrequenciesFinal (int driver, vector traj, vector& traj_inf, const gsl_vector *xx, ofstream& out_file); +double GetLogLikelihood(int betaparm, vector traj, vector traj_inf, vector fact_store); +void FindLogFact(vector& fact_store,int N); +double BetaBinomCalc(int N, int r, float p, int betaparm, vector fact_store); diff --git a/Models/SingleDriver2RhoXStay/utilities.cpp b/Models/SingleDriver2RhoXStay/utilities.cpp new file mode 100644 index 0000000..2cc3402 --- /dev/null +++ b/Models/SingleDriver2RhoXStay/utilities.cpp @@ -0,0 +1,330 @@ +using namespace std; +#include "shared.h" + +void ImportData (string input, vector& traj) { + ifstream pass_file; + pass_file.open(input.c_str()); + + int i=0; + do { + rec new_traj; + pass_file >> new_traj.chr; + pass_file >> new_traj.pos; + pass_file >> new_traj.obs; + pass_file >> new_traj.N; + new_traj.index=i; + i++; + new_traj.q=(new_traj.obs+0.)/(new_traj.N+0.); + //cout << i << " " << new_traj.q << "\n"; + traj.push_back(new_traj); + + } while (!pass_file.eof()); +} + +void SetXXVector(opt_data od, gsl_vector* xx) { + gsl_vector_set(xx,0,od.x); //Frequency at cross + gsl_vector_set(xx,1,od.e); //Vertical movement + gsl_vector_set(xx,2,od.rho1); //Recombination rate driver left + gsl_vector_set(xx,3,od.rho2); //Recombination rate driver centre + gsl_vector_set(xx,4,od.rho3); //Recombination rate driver right + gsl_vector_set(xx,5,od.rx1); //Recombination rate switch point + gsl_vector_set(xx,6,od.rx2); //Recombination rate switch point + gsl_vector_set(xx,7,od.xf); //Driver frequency after selection +} + +void SetParams (int betaparm, int driver, double *params, vector traj) { + params[0]=traj.size(); + params[1]=betaparm; + params[2]=driver; + params[3]=traj.size(); + for (unsigned int i=1;i& traj) { + unsigned int ts=p[0]; + betaparm=p[1]; + driver=p[2]; + for (unsigned int i=1;i traj; + vector traj_inf; + vector fact_store; + + GetParams(p,betaparm,driver,traj); + //cout << "i " << gsl_vector_get(xx,0) << " x " << gsl_vector_get(xx,1) << " e " << gsl_vector_get(xx,2) << " rho " << gsl_vector_get(xx,3) << " xf " << gsl_vector_get(xx,4) << "\n"; + FindFrequencies(driver,traj,traj_inf,xx); + //cout << "Done FindFrequencies\n"; + L=GetLogLikelihood(betaparm,traj,traj_inf,fact_store); + //cout << "L= " << L << "\n"; + L=-L; + return L; +} + +int CheckParams(const gsl_vector *xx, double *p) { + int chk=1; + double x=gsl_vector_get(xx,0); + double e=gsl_vector_get(xx,1); + double rho1=gsl_vector_get(xx,2); + double rho2=gsl_vector_get(xx,3); + double rho3=gsl_vector_get(xx,4); + double rx1=gsl_vector_get(xx,5); + double rx2=gsl_vector_get(xx,6); + double xf=gsl_vector_get(xx,7); + if ((rho1<0)||(rho2<0)||(rho3<0)) { + chk=0; + } + if (rx1>=rx2) { + chk=0; + } + if ((rx1<0 || rx1>p[0])||(rx2<0 || rx2>p[0])) { + chk=0; + } + if (x<=0.5 || x>=1) { + chk=0; + } + if (e< -pow(x,2) || e> pow((1-x),2)) { + chk=0; + } + if (xf 1-pow(1-x,2)) { + chk=0; + } + if (xf+e>=1 || xf+e <=0) { + chk=0; + } + return chk; +} + +void FindFrequencies (int driver, vector traj, vector& traj_inf, const gsl_vector *xx) { + //Set up traj_inf + traj_inf=traj; + + //Frequency at driver locus + unsigned int i=driver; //Index of driver + //cout << i << " " << traj_inf.size() << " " << traj.size() << "\n"; + double x=gsl_vector_get(xx,0); + double e=gsl_vector_get(xx,1); + double rho1=gsl_vector_get(xx,2); + double rho2=gsl_vector_get(xx,3); + double rho3=gsl_vector_get(xx,4); + double rx1=gsl_vector_get(xx,5); + double rx2=gsl_vector_get(xx,6); + double xf=gsl_vector_get(xx,7); + + // double xf=gsl_vector_get(xx,4); //?? Sort out something around here? + + //cout << "RX1 " << rx1 << "\n"; + + traj_inf[i].q=xf+e; + + //Frequency at passenger loci + for (unsigned int j=0;jrx1)&&(j<=rx2)) { + rd=(rho2*Delta_jx1)+(rho1*Delta_ix1); + } + if (j>rx2) { + rd=(rho3*Delta_jx2)+(rho2*Delta_x1x2)+(rho1*Delta_ix1); + } + } + if ((i>rx1)&&(i<=rx2)) { + if (j<=rx1) { + rd=(rho1*Delta_jx1)+(rho2*Delta_ix1); + } + if ((j>rx1)&&(j<=rx2)) { + rd=rho2*Delta_ij; + } + if (j>rx2) { + rd=(rho3*Delta_jx2)+(rho2*Delta_ix2); + } + } + if (i>rx2) { + if (j<=rx1) { + rd=(rho1*Delta_jx1)+(rho2*Delta_x1x2)+(rho3*Delta_ix2); + } + + if ((j>rx1)&&(j<=rx2)) { + rd=(rho2*Delta_jx2)+(rho3*Delta_ix2); + } + + if (j>rx2) { + rd=rho3*Delta_ij; + } + } + + double ExpRhoD=exp(-1*rd); + + traj_inf[j].q= ((x+(0.5*(1-x)*(1+ExpRhoD)))*xf) + ((0.5*x*(1-ExpRhoD))*(1-xf)) + e; + if (traj_inf[j].q>1) { + cout << "Error2 " << x << " " << Delta_ij << " " << ExpRhoD << " " << xf << " " << e << "\n"; ; + } + } + } +} + +void FindFrequenciesFinal (int driver, vector traj, vector& traj_inf, const gsl_vector *xx, ofstream& out_file) { + //Set up traj_inf + traj_inf=traj; + //cout << "i " << gsl_vector_get(xx,0) << " x " << gsl_vector_get(xx,1) << " e " << gsl_vector_get(xx,2) << " rho " << gsl_vector_get(xx,3) << " xf " << gsl_vector_get(xx,4) << "\n"; + + //Frequency at driver locus + unsigned int i=driver; //Index of driver + //cout << i << " " << traj_inf.size() << " " << traj.size() << "\n"; + double x=gsl_vector_get(xx,0); + double e=gsl_vector_get(xx,1); + double rho1=gsl_vector_get(xx,2); + double rho2=gsl_vector_get(xx,3); + double rho3=gsl_vector_get(xx,4); + double rx1=gsl_vector_get(xx,5); + double rx2=gsl_vector_get(xx,6); + double xf=gsl_vector_get(xx,7); + + traj_inf[i].q=xf+e; + //cout << traj_inf[i].q << "\n"; + out_file << i << " " << traj[i].pos << " " << traj[i].q << " " << traj_inf[i].q << "\n"; + + //Frequency at passenger loci + for (unsigned int j=0;jrx1)&&(j<=rx2)) { + rd=(rho2*Delta_jx1)+(rho1*Delta_ix1); + } + if (j>rx2) { + rd=(rho3*Delta_jx2)+(rho2*Delta_x1x2)+(rho1*Delta_ix1); + } + } + if ((i>rx1)&&(i<=rx2)) { + if (j<=rx1) { + rd=(rho1*Delta_jx1)+(rho2*Delta_ix1); + } + if ((j>rx1)&&(j<=rx2)) { + rd=rho2*Delta_ij; + } + if (j>rx2) { + rd=(rho3*Delta_jx2)+(rho2*Delta_ix2); + } + } + if (i>rx2) { + if (j<=rx1) { + rd=(rho1*Delta_jx1)+(rho2*Delta_x1x2)+(rho3*Delta_ix2); + } + + if ((j>rx1)&&(j<=rx2)) { + rd=(rho2*Delta_jx2)+(rho3*Delta_ix2); + } + + if (j>rx2) { + rd=rho3*Delta_ij; + } + } + + double ExpRhoD=exp(-1*rd); + traj_inf[j].q= ((x+(0.5*(1-x)*(1+ExpRhoD)))*xf) + ((0.5*x*(1-ExpRhoD))*(1-xf)) + e; + out_file << j << " " << traj[j].pos << " " << traj[j].q << " " << traj_inf[j].q << "\n"; + if (traj_inf[j].q>1) { + cout << "Error2 " << x << " " << Delta_ij << " " << ExpRhoD << " " << xf << " " << e << "\n"; ; + } + } + } +} + +double GetLogLikelihood(int betaparm, vector traj, vector traj_inf, vector fact_store) { + double L=0; + for (unsigned int i=0;i fact_store) { + double alpha=betaparm*p; + double beta=betaparm*(1-p); + double bin=1e10; + if ((alpha==0)||(beta==0)) { + bin=1e10; + } else { + bin=gsl_sf_lngamma(N+1)+gsl_sf_lngamma(r+alpha)+gsl_sf_lngamma(N-r+beta)+gsl_sf_lngamma(alpha+beta)-gsl_sf_lngamma(r+1)-gsl_sf_lngamma(N-r+1)-gsl_sf_lngamma(N+alpha+beta)-gsl_sf_lngamma(alpha)-gsl_sf_lngamma(beta); + bin=exp(bin); + } + if (bin<1e-300) { + bin=1e-300; + } + return(bin); +} + + + +void FindLogFact(vector& fact_store,int N){ + double logN=0; + for (int i=1;i<=N;i++) { + logN=logN+log(i); + fact_store.push_back(logN); + //cout << "fact_store "< +#include +#include +#include +#include +#include +using namespace std; +#include "shared.h" + +int main(int argc, char *argv[]){ + + vector traj; + vector traj_inf; + double i_final=0; + double x_final=0; + double e_final=0; + double rho1_final=0; + double rho2_final=0; + double rho3_final=0; + double rho4_final=0; + double rx1_final=0; //Point of change in recombination rate + double rx2_final=0; //Point of change in recombination rate + double rx3_final=0; //Point of change in recombination rate + double xf_final=0; + + string input(argv[1]); + int seed=atoi(argv[2]); + + //Set up random number generator + srand((unsigned int)(seed)); + gsl_rng *rgen = gsl_rng_alloc (gsl_rng_taus); + gsl_rng_set (rgen, seed); + + ImportData(input,traj); + + //return 0; + + //Number of data points + int p=traj.size(); + //cout << p << "\n"; + + //Parameters are l (locus), x (cross frequency), e (vertical movement), rho (recombination), xf (driver frequency) + + opt_data od; + double best_fit=-1e10; + double last_fit=-1e10; + + int reps=atoi(argv[3]); + int bparm=atoi(argv[4]); + int driver=atoi(argv[5]); + + for (int r=1; r<=reps; r++) { + + //Set up initial parameters + od.i = floor(gsl_rng_uniform(rgen)*p); + od.x = 0.5+(0.5*gsl_rng_uniform(rgen)); + double m=min(pow(od.x,2),pow((1-od.x),2)); + od.e = (m*gsl_rng_uniform(rgen)); + od.rho1 = 1e-6; + od.rho2 = 1e-6; + od.rho3 = 1e-6; + od.rho4 = 1e-6; + od.rx1 = floor(0.33*gsl_rng_uniform(rgen)*p); + od.rx2 = floor((0.33*p)+(0.33*gsl_rng_uniform(rgen)*p)); + od.rx3 = floor((0.66*p)+(0.33*gsl_rng_uniform(rgen)*p)); + od.xf =0.5+(0.5*gsl_rng_uniform(rgen)); + + //General setup for optimisation routine + + //Optimisation processs + for (int it=0;it<1000000;it++){ + + //cout << "it " << it << "\n"; + size_t iter=0; //GSL iteration number + + //CheckLastLikelihood + + //Vector x contains parameters to be optimised + int xx_size=10; + gsl_vector *xx = gsl_vector_calloc(xx_size); + SetXXVector(od,xx); + //cout << "Done set xx\n"; + + //Optimisation bit goes here + + int p_size = 4*(traj.size())+25; + + double *params; + params=(double *)calloc(p_size,sizeof(double)); + + SetParams(bparm,driver,params,traj); + //cout << "Done set params\n"; + + //Define the optimisation function + gsl_multimin_function my_func; + my_func.n=xx_size; + my_func.f=&get_best_fit; + my_func.params=params; + + gsl_multimin_fminimizer *s; + const gsl_multimin_fminimizer_type *T=gsl_multimin_fminimizer_nmsimplex; + s=gsl_multimin_fminimizer_alloc(T,xx_size); + //cout << "Done define\n"; + + //Starting change magnitudes + gsl_vector* ss=gsl_vector_alloc(xx_size); + gsl_vector_set(ss,0,0.1); + gsl_vector_set(ss,1,0.1); + gsl_vector_set(ss,2,od.rho1/2.); + gsl_vector_set(ss,3,od.rho2/2.); + gsl_vector_set(ss,4,od.rho3/2.); + gsl_vector_set(ss,5,od.rho4/2.); + gsl_vector_set(ss,6,100); + gsl_vector_set(ss,7,100); + gsl_vector_set(ss,8,100); + gsl_vector_set(ss,9,0.1); + //cout << "Done set ss\n"; + + gsl_multimin_fminimizer_set (s,&my_func,xx,ss); + //cout << "Done set mmin\n"; + int status; + double size; + do { + iter++; + status=gsl_multimin_fminimizer_iterate(s); + if (status) {break;} + + size=gsl_multimin_fminimizer_size(s); + status = gsl_multimin_test_size(size, 1e-4); + + if (status == GSL_SUCCESS) { + } + + } while (status==GSL_CONTINUE && iter<1000); + + last_fit = s->fval; + last_fit=-last_fit; + cout << "Last fit score = " << last_fit <<"\n"; + + if (last_fit>best_fit) { + best_fit=last_fit; + x_final=gsl_vector_get(s->x,0); + e_final=gsl_vector_get(s->x,1); + rho1_final=gsl_vector_get(s->x,2); + rho2_final=gsl_vector_get(s->x,3); + rho3_final=gsl_vector_get(s->x,4); + rho4_final=gsl_vector_get(s->x,5); + rx1_final=gsl_vector_get(s->x,6); + rx2_final=gsl_vector_get(s->x,7); + rx3_final=gsl_vector_get(s->x,8); + xf_final=gsl_vector_get(s->x,9); + + } else { + break; + } + + gsl_vector_free(xx); + gsl_vector_free(ss); + gsl_multimin_fminimizer_free(s); + + + } + } + + + //Print values and frequencies + cout << "Optimised values\n"; + cout << "index " << floor(driver) << " locus " << traj[driver].pos << " x " << x_final << " rx1 " << rx1_final << " rx2 " << rx2_final << " rx3 " << rx3_final << " e " << e_final << " rho1 " << rho1_final << " rho2 " << rho2_final << " rho3 " << rho3_final << " rho4 " << rho4_final << " xf " << xf_final << " Log L " << best_fit << "\n"; + od.i = i_final; + od.x = x_final; + od.e = e_final; + od.rho1 = rho1_final; + od.rho2 = rho2_final; + od.rho3 = rho3_final; + od.rho4 = rho4_final; + od.rx1 = rx1_final; + od.rx2 = rx2_final; + od.rx3 = rx3_final; + od.xf = xf_final; + cout << od.xf << "\n"; + int xx_size=10; + gsl_vector *xx = gsl_vector_calloc(xx_size); + SetXXVector(od,xx); + //cout << "Allele frequencies\n"; + ofstream out_file; + out_file.open("both"); + FindFrequenciesFinal(driver,traj,traj_inf,xx,out_file); + + + return 0; +} \ No newline at end of file diff --git a/Models/SingleDriver3RhoXStay/shared.h b/Models/SingleDriver3RhoXStay/shared.h new file mode 100644 index 0000000..debd13f --- /dev/null +++ b/Models/SingleDriver3RhoXStay/shared.h @@ -0,0 +1,64 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +using namespace std; + +struct rec { + int chr; + int index; + int pos; + int obs; + double q; + int N; +}; + +struct opt_data { + int i; + double x; + double e; + double rho1; + double rho2; + double rho3; + double rho4; + double xf; + double rx1; + double rx2; + double rx3; +}; + + +void ImportData (string input, vector& traj); + +void SetXXVector(opt_data od, gsl_vector* xx); +void SetParams (int betaparm, int driver, double *params, vector traj); +void GetParams (double *p, int& betaparm, int& driver, vector& traj); +int CheckParams(const gsl_vector *xx, double *p); +double get_best_fit(const gsl_vector *xx, void *params); +void FindFrequencies (int driver, vector traj, vector& traj_inf, const gsl_vector *xx); +void FindFrequenciesFinal (int driver, vector traj, vector& traj_inf, const gsl_vector *xx, ofstream& out_file); +double GetLogLikelihood(int betaparm, vector traj, vector traj_inf, vector fact_store); +void FindLogFact(vector& fact_store,int N); +double BetaBinomCalc(int N, int r, float p, int betaparm, vector fact_store); diff --git a/Models/SingleDriver3RhoXStay/utilities.cpp b/Models/SingleDriver3RhoXStay/utilities.cpp new file mode 100644 index 0000000..f04ee11 --- /dev/null +++ b/Models/SingleDriver3RhoXStay/utilities.cpp @@ -0,0 +1,400 @@ +using namespace std; +#include "shared.h" + +void ImportData (string input, vector& traj) { + ifstream pass_file; + pass_file.open(input.c_str()); + + int i=0; + do { + rec new_traj; + pass_file >> new_traj.chr; + pass_file >> new_traj.pos; + pass_file >> new_traj.obs; + pass_file >> new_traj.N; + new_traj.index=i; + i++; + new_traj.q=(new_traj.obs+0.)/(new_traj.N+0.); + //cout << i << " " << new_traj.q << "\n"; + traj.push_back(new_traj); + + } while (!pass_file.eof()); +} + +void SetXXVector(opt_data od, gsl_vector* xx) { + gsl_vector_set(xx,0,od.x); //Frequency at cross + gsl_vector_set(xx,1,od.e); //Vertical movement + gsl_vector_set(xx,2,od.rho1); //Recombination rate driver left + gsl_vector_set(xx,3,od.rho2); //Recombination rate driver right + gsl_vector_set(xx,4,od.rho3); //Recombination rate driver right + gsl_vector_set(xx,5,od.rho4); //Recombination rate driver right + gsl_vector_set(xx,6,od.rx1); //Recombination rate switch point + gsl_vector_set(xx,7,od.rx2); //Recombination rate switch point + gsl_vector_set(xx,8,od.rx3); //Recombination rate switch point + gsl_vector_set(xx,9,od.xf); //Driver frequency after selection +} + +void SetParams (int betaparm, int driver, double *params, vector traj) { + params[0]=traj.size(); + params[1]=betaparm; + params[2]=driver; + params[3]=traj.size(); + for (unsigned int i=1;i& traj) { + unsigned int ts=p[0]; + betaparm=p[1]; + driver=p[2]; + for (unsigned int i=1;i traj; + vector traj_inf; + vector fact_store; + + GetParams(p,betaparm,driver,traj); + //cout << "i " << gsl_vector_get(xx,0) << " x " << gsl_vector_get(xx,1) << " e " << gsl_vector_get(xx,2) << " rho " << gsl_vector_get(xx,3) << " xf " << gsl_vector_get(xx,4) << "\n"; + FindFrequencies(driver,traj,traj_inf,xx); + //cout << "Done FindFrequencies\n"; + L=GetLogLikelihood(betaparm,traj,traj_inf,fact_store); + //cout << "L= " << L << "\n"; + L=-L; + return L; +} + +int CheckParams(const gsl_vector *xx, double *p) { + int chk=1; + double x=gsl_vector_get(xx,0); + double e=gsl_vector_get(xx,1); + double rho1=gsl_vector_get(xx,2); + double rho2=gsl_vector_get(xx,3); + double rho3=gsl_vector_get(xx,4); + double rho4=gsl_vector_get(xx,5); + double rx1=gsl_vector_get(xx,6); + double rx2=gsl_vector_get(xx,7); + double rx3=gsl_vector_get(xx,8); + double xf=gsl_vector_get(xx,9); + if ((rho1<0)||(rho2<0)||(rho3<0)||(rho4<0)) { + chk=0; + } + if ((rx1>=rx2)||(rx1>=rx3)||(rx2>=rx3)) { + chk=0; + } + if ((rx1<0 || rx1>p[0])||(rx2<0 || rx2>p[0])||(rx3<0 || rx3>p[0])) { + chk=0; + } + if (x<=0.5 || x>=1) { + chk=0; + } + if (e< -pow(x,2) || e> pow((1-x),2)) { + chk=0; + } + if (xf 1-pow(1-x,2)) { + chk=0; + } + if (xf+e>=1 || xf+e <=0) { + chk=0; + } + return chk; + +} + +void FindFrequencies (int driver, vector traj, vector& traj_inf, const gsl_vector *xx) { + //Set up traj_inf + traj_inf=traj; + + //Frequency at driver locus + unsigned int i=driver; //Index of driver + //cout << i << " " << traj_inf.size() << " " << traj.size() << "\n"; + double x=gsl_vector_get(xx,0); + double e=gsl_vector_get(xx,1); + double rho1=gsl_vector_get(xx,2); + double rho2=gsl_vector_get(xx,3); + double rho3=gsl_vector_get(xx,4); + double rho4=gsl_vector_get(xx,5); + double rx1=gsl_vector_get(xx,6); + double rx2=gsl_vector_get(xx,7); + double rx3=gsl_vector_get(xx,8); + double xf=gsl_vector_get(xx,9); + // double xf=gsl_vector_get(xx,4); //?? Sort out something around here? + + traj_inf[i].q=xf+e; + + //Frequency at passenger loci + for (unsigned int j=0;jrx1)&&(j<=rx2)) { + rd=(rho2*Delta_jx1)+(rho1*Delta_ix1); + } + if ((j>rx2)&&(j<=rx3)) { + rd=(rho3*Delta_jx2)+(rho2*Delta_x1x2)+(rho1*Delta_ix1); + } + if (j>rx3) { + rd=(rho4*Delta_jx3)+(rho3*Delta_x2x3)+(rho2*Delta_x1x2)+(rho1*Delta_ix1); + } + + } + if ((i>rx1)&&(i<=rx2)) { + if (j<=rx1) { + rd=(rho1*Delta_jx1)+(rho2*Delta_ix1); + } + if ((j>rx1)&&(j<=rx2)) { + rd=rho2*Delta_ij; + } + if ((j>rx2)&&(j<=rx3)) { + rd=(rho2*Delta_ix2)+(rho3*Delta_jx2); + } + if (j>rx3) { + rd=(rho2*Delta_ix2)+(rho3*Delta_x2x3)+(rho4*Delta_jx3); + } + } + + if ((i>rx2)&&(i<=rx3)) { + if (j<=rx1) { + rd=(rho1*Delta_jx1)+(rho2*Delta_x1x2)+(rho3*Delta_ix2); + } + + if ((j>rx1)&&(j<=rx2)) { + rd=(rho2*Delta_jx2)+(rho3*Delta_ix2); + } + + if ((j>rx2)&&(j<=rx3)) { + rd=rho3*Delta_ij; + } + if (j>rx3) { + rd=(rho4*Delta_jx3)+(rho3*Delta_ix3); + } + } + + if (i>rx3) { + if (j<=rx1) { + rd=(rho1*Delta_jx1)+(rho2*Delta_x1x2)+(rho3*Delta_x2x3)+(rho4*Delta_ix3); + } + + if ((j>rx1)&&(j<=rx2)) { + rd=(rho2*Delta_jx2)+(rho3*Delta_x2x3)+(rho4*Delta_ix3); + } + + if ((j>rx2)&&(j<=rx3)) { + rd=(rho3*Delta_jx3)+(rho4*Delta_ix3); + } + if (j>rx3) { + rd=rho4*Delta_ij; + } + } + + + double ExpRhoD=exp(-1*rd); + + traj_inf[j].q= ((x+(0.5*(1-x)*(1+ExpRhoD)))*xf) + ((0.5*x*(1-ExpRhoD))*(1-xf)) + e; + if (traj_inf[j].q>1) { + cout << "Error2 " << x << " " << Delta_ij << " " << ExpRhoD << " " << xf << " " << e << "\n"; ; + } + } + } +} + +void FindFrequenciesFinal (int driver, vector traj, vector& traj_inf, const gsl_vector *xx, ofstream& out_file) { + //Set up traj_inf + traj_inf=traj; + //cout << "i " << gsl_vector_get(xx,0) << " x " << gsl_vector_get(xx,1) << " e " << gsl_vector_get(xx,2) << " rho " << gsl_vector_get(xx,3) << " xf " << gsl_vector_get(xx,4) << "\n"; + + //Frequency at driver locus + unsigned int i=driver; //Index of driver + //cout << i << " " << traj_inf.size() << " " << traj.size() << "\n"; + double x=gsl_vector_get(xx,0); + double e=gsl_vector_get(xx,1); + double rho1=gsl_vector_get(xx,2); + double rho2=gsl_vector_get(xx,3); + double rho3=gsl_vector_get(xx,4); + double rho4=gsl_vector_get(xx,5); + double rx1=gsl_vector_get(xx,6); + double rx2=gsl_vector_get(xx,7); + double rx3=gsl_vector_get(xx,8); + double xf=gsl_vector_get(xx,9); + + traj_inf[i].q=xf+e; + //cout << traj_inf[i].q << "\n"; + out_file << i << " " << traj[i].pos << " " << traj[i].q << " " << traj_inf[i].q << "\n"; + + //Frequency at passenger loci + for (unsigned int j=0;jrx1)&&(j<=rx2)) { + rd=(rho2*Delta_jx1)+(rho1*Delta_ix1); + } + if ((j>rx2)&&(j<=rx3)) { + rd=(rho3*Delta_jx2)+(rho2*Delta_x1x2)+(rho1*Delta_ix1); + } + if (j>rx3) { + rd=(rho4*Delta_jx3)+(rho3*Delta_x2x3)+(rho2*Delta_x1x2)+(rho1*Delta_ix1); + } + + } + if ((i>rx1)&&(i<=rx2)) { + if (j<=rx1) { + rd=(rho1*Delta_jx1)+(rho2*Delta_ix1); + } + if ((j>rx1)&&(j<=rx2)) { + rd=rho2*Delta_ij; + } + if ((j>rx2)&&(j<=rx3)) { + rd=(rho2*Delta_ix2)+(rho3*Delta_jx2); + } + if (j>rx3) { + rd=(rho2*Delta_ix2)+(rho3*Delta_x2x3)+(rho4*Delta_jx3); + } + } + + if ((i>rx2)&&(i<=rx3)) { + if (j<=rx1) { + rd=(rho1*Delta_jx1)+(rho2*Delta_x1x2)+(rho3*Delta_ix2); + } + + if ((j>rx1)&&(j<=rx2)) { + rd=(rho2*Delta_jx2)+(rho3*Delta_ix2); + } + + if ((j>rx2)&&(j<=rx3)) { + rd=rho3*Delta_ij; + } + if (j>rx3) { + rd=(rho4*Delta_jx3)+(rho3*Delta_ix3); + } + } + + if (i>rx3) { + if (j<=rx1) { + rd=(rho1*Delta_jx1)+(rho2*Delta_x1x2)+(rho3*Delta_x2x3)+(rho4*Delta_ix3); + } + + if ((j>rx1)&&(j<=rx2)) { + rd=(rho2*Delta_jx2)+(rho3*Delta_x2x3)+(rho4*Delta_ix3); + } + + if ((j>rx2)&&(j<=rx3)) { + rd=(rho3*Delta_jx3)+(rho4*Delta_ix3); + } + if (j>rx3) { + rd=rho4*Delta_ij; + } + } + + double ExpRhoD=exp(-1*rd); + traj_inf[j].q= ((x+(0.5*(1-x)*(1+ExpRhoD)))*xf) + ((0.5*x*(1-ExpRhoD))*(1-xf)) + e; + out_file << j << " " << traj[j].pos << " " << traj[j].q << " " << traj_inf[j].q << "\n"; + if (traj_inf[j].q>1) { + cout << "Error2 " << x << " " << Delta_ij << " " << ExpRhoD << " " << xf << " " << e << "\n"; ; + } + } + } +} + +double GetLogLikelihood(int betaparm, vector traj, vector traj_inf, vector fact_store) { + double L=0; + for (unsigned int i=0;i fact_store) { + double alpha=betaparm*p; + double beta=betaparm*(1-p); + double bin=1e10; + if ((alpha==0)||(beta==0)) { + bin=1e10; + } else { + bin=gsl_sf_lngamma(N+1)+gsl_sf_lngamma(r+alpha)+gsl_sf_lngamma(N-r+beta)+gsl_sf_lngamma(alpha+beta)-gsl_sf_lngamma(r+1)-gsl_sf_lngamma(N-r+1)-gsl_sf_lngamma(N+alpha+beta)-gsl_sf_lngamma(alpha)-gsl_sf_lngamma(beta); + bin=exp(bin); + } + if (bin<1e-300) { + bin=1e-300; + } + return(bin); +} + + +void FindLogFact(vector& fact_store,int N){ + double logN=0; + for (int i=1;i<=N;i++) { + logN=logN+log(i); + fact_store.push_back(logN); + //cout << "fact_store "< +#include +#include +#include +#include +#include +using namespace std; +#include "shared.h" + +int main(int argc, char *argv[]){ + + vector traj; + vector traj_inf; + double i_final=0; + double x_final=0; + double e_final=0; + double rho1_final=0; + double rho2_final=0; + double rx_final=0; //Point of change in recombination rate + double xf_final=0; + + string input(argv[1]); + int seed=atoi(argv[2]); + + //Set up random number generator + srand((unsigned int)(seed)); + gsl_rng *rgen = gsl_rng_alloc (gsl_rng_taus); + gsl_rng_set (rgen, seed); + + ImportData(input,traj); + + //return 0; + + //Number of data points + int p=traj.size(); + //cout << p << "\n"; + + //Parameters are l (locus), x (cross frequency), e (vertical movement), rho (recombination), xf (driver frequency) + + opt_data od; + double best_fit=-1e10; + double last_fit=-1e10; + + int reps=atoi(argv[3]); + int bparm=atoi(argv[4]); + int driver=atoi(argv[5]); + + for (int r=1; r<=reps; r++) { + + //Set up initial parameters + od.i = floor(gsl_rng_uniform(rgen)*p); + od.x = 0.5+(0.5*gsl_rng_uniform(rgen)); + double xx=pow(od.x,2); + double xmx=od.x*(1-od.x); + double mxmx=(1-od.x)*(1-od.x); + od.e = (mxmx*gsl_rng_uniform(rgen))-(0.5*mxmx); + od.rho1 = 1e-6; + od.rho2 = 1e-6; + od.rx = floor(gsl_rng_uniform(rgen)*p); + od.xf = xx + (2*xmx*gsl_rng_uniform(rgen)); + + //General setup for optimisation routine + + //Optimisation processs + for (int it=0;it<1000000;it++){ + + //cout << "it " << it << "\n"; + size_t iter=0; //GSL iteration number + + //CheckLastLikelihood + + //Vector x contains parameters to be optimised + int xx_size=6; + gsl_vector *xx = gsl_vector_calloc(xx_size); + SetXXVector(od,xx); + //cout << "Done set xx\n"; + + //Optimisation bit goes here + + int p_size = 4*(traj.size())+25; + + double *params; + params=(double *)calloc(p_size,sizeof(double)); + + SetParams(bparm,driver,params,traj); + //cout << "Done set params\n"; + + //Define the optimisation function + gsl_multimin_function my_func; + my_func.n=xx_size; + my_func.f=&get_best_fit; + my_func.params=params; + + gsl_multimin_fminimizer *s; + const gsl_multimin_fminimizer_type *T=gsl_multimin_fminimizer_nmsimplex; + s=gsl_multimin_fminimizer_alloc(T,xx_size); + //cout << "Done define\n"; + + //Starting change magnitudes + gsl_vector* ss=gsl_vector_alloc(xx_size); + gsl_vector_set(ss,0,0.1); + gsl_vector_set(ss,1,0.1); + gsl_vector_set(ss,2,od.rho1/4); + gsl_vector_set(ss,3,od.rho2/4); + gsl_vector_set(ss,4,100); + gsl_vector_set(ss,5,0.1); + //cout << "Done set ss\n"; + + gsl_multimin_fminimizer_set (s,&my_func,xx,ss); + //cout << "Done set mmin\n"; + int status; + double size; + do { + iter++; + status=gsl_multimin_fminimizer_iterate(s); + if (status) {break;} + + size=gsl_multimin_fminimizer_size(s); + status = gsl_multimin_test_size(size, 1e-4); + + if (status == GSL_SUCCESS) { + } + + } while (status==GSL_CONTINUE && iter<1000); + + last_fit = s->fval; + last_fit=-last_fit; + cout << "Last fit score = " << last_fit <<"\n"; + + if (last_fit>best_fit) { + best_fit=last_fit; + x_final=gsl_vector_get(s->x,0); + e_final=gsl_vector_get(s->x,1); + rho1_final=gsl_vector_get(s->x,2); + rho2_final=gsl_vector_get(s->x,3); + rx_final=gsl_vector_get(s->x,4); + xf_final=gsl_vector_get(s->x,5); + + } else { + break; + } + + gsl_vector_free(xx); + gsl_vector_free(ss); + gsl_multimin_fminimizer_free(s); + + + } + } + + + //Print values and frequencies + cout << "Optimised values\n"; + cout << "index " << floor(driver) << " locus " << traj[driver].pos << " x " << x_final << " rx " << rx_final << " " << traj[floor(rx_final)].pos << " e " << e_final << " rho1 " << rho1_final << " rho2 " << rho2_final << " xf " << xf_final << " Log L " << best_fit << "\n"; + od.i = i_final; + od.x = x_final; + od.e = e_final; + od.rho1 = rho1_final; + od.rho2 = rho2_final; + od.rx = rx_final; + od.xf = xf_final; + cout << od.xf << "\n"; + int xx_size=6; + gsl_vector *xx = gsl_vector_calloc(xx_size); + SetXXVector(od,xx); + //cout << "Allele frequencies\n"; + ofstream out_file; + out_file.open("both"); + FindFrequenciesFinal(driver,traj,traj_inf,xx,out_file); + + + return 0; +} diff --git a/Models/SingleDriverRhoXStay/shared.h b/Models/SingleDriverRhoXStay/shared.h new file mode 100644 index 0000000..232bab7 --- /dev/null +++ b/Models/SingleDriverRhoXStay/shared.h @@ -0,0 +1,60 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +using namespace std; + +struct rec { + int chr; + int index; + int pos; + int obs; + double q; + int N; +}; + +struct opt_data { + int i; + int rx; + double x; + double e; + double rho1; + double rho2; + double xf; +}; + + +void ImportData (string input, vector& traj); + +void SetXXVector(opt_data od, gsl_vector* xx); +void SetParams (int betaparm, int driver, double *params, vector traj); +void GetParams (double *p, int& betaparm, int& driver, vector& traj); +int CheckParams(const gsl_vector *xx, double *p); +double get_best_fit(const gsl_vector *xx, void *params); +void FindFrequencies (int driver, vector traj, vector& traj_inf, const gsl_vector *xx); +void FindFrequenciesFinal (int driver, vector traj, vector& traj_inf, const gsl_vector *xx, ofstream& out_file); +double GetLogLikelihood(int betaparm, vector traj, vector traj_inf, vector fact_store); +void FindLogFact(vector& fact_store,int N); +double BetaBinomCalc(int N, int r, float p, int betaparm, vector fact_store); diff --git a/Models/SingleDriverRhoXStay/utilities.cpp b/Models/SingleDriverRhoXStay/utilities.cpp new file mode 100644 index 0000000..94fedc0 --- /dev/null +++ b/Models/SingleDriverRhoXStay/utilities.cpp @@ -0,0 +1,259 @@ +using namespace std; +#include "shared.h" + +void ImportData (string input, vector& traj) { + ifstream pass_file; + pass_file.open(input.c_str()); + + int i=0; + do { + rec new_traj; + pass_file >> new_traj.chr; + pass_file >> new_traj.pos; + pass_file >> new_traj.obs; + pass_file >> new_traj.N; + new_traj.index=i; + i++; + new_traj.q=(new_traj.obs+0.)/(new_traj.N+0.); + //cout << i << " " << new_traj.q << "\n"; + traj.push_back(new_traj); + + } while (!pass_file.eof()); +} + +void SetXXVector(opt_data od, gsl_vector* xx) { + gsl_vector_set(xx,0,od.x); //Frequency at cross + gsl_vector_set(xx,1,od.e); //Vertical movement + gsl_vector_set(xx,2,od.rho1); //Recombination rate driver left + gsl_vector_set(xx,3,od.rho2); //Recombination rate driver right + gsl_vector_set(xx,4,od.rx); //Recombination rate switch point + gsl_vector_set(xx,5,od.xf); //Driver frequency after selection +} + +void SetParams (int betaparm, int driver, double *params, vector traj) { + params[0]=traj.size(); + params[1]=betaparm; + params[2]=driver; + params[3]=traj.size(); + for (unsigned int i=1;i& traj) { + unsigned int ts=p[0]; + betaparm=p[1]; + driver=p[2]; + for (unsigned int i=1;i traj; + vector traj_inf; + vector fact_store; + + GetParams(p,betaparm,driver,traj); + //cout << "i " << gsl_vector_get(xx,0) << " x " << gsl_vector_get(xx,1) << " e " << gsl_vector_get(xx,2) << " rho " << gsl_vector_get(xx,3) << " xf " << gsl_vector_get(xx,4) << "\n"; + FindFrequencies(driver,traj,traj_inf,xx); + //cout << "Done FindFrequencies\n"; + L=GetLogLikelihood(betaparm,traj,traj_inf,fact_store); + //cout << "L= " << L << "\n"; + L=-L; + return L; +} + +int CheckParams(const gsl_vector *xx, double *p) { + int chk=1; + double x=gsl_vector_get(xx,0); + double e=gsl_vector_get(xx,1); + double rho1=gsl_vector_get(xx,2); + double rho2=gsl_vector_get(xx,3); + double rx=gsl_vector_get(xx,4); + double xf=gsl_vector_get(xx,5); + if ((rho1<0)||(rho2<0)) { + chk=0; + } + if (rx<0 || rx>p[0]) { + chk=0; + } + if (x<=0.5 || x>=1) { + chk=0; + } + if (e< -pow(x,2) || e> pow((1-x),2)) { + chk=0; + } + if (xf 1-pow(1-x,2)) { + chk=0; + } + + if (xf+e>=1 || xf+e <=0) { + chk=0; + } + return chk; +} + +void FindFrequencies (int driver, vector traj, vector& traj_inf, const gsl_vector *xx) { + //Set up traj_inf + traj_inf=traj; + + //Frequency at driver locus + unsigned int i=driver; //Index of driver + //cout << i << " " << traj_inf.size() << " " << traj.size() << "\n"; + double x=gsl_vector_get(xx,0); + double e=gsl_vector_get(xx,1); + double rho1=gsl_vector_get(xx,2); + double rho2=gsl_vector_get(xx,3); + double rx=gsl_vector_get(xx,4); + double xf=gsl_vector_get(xx,5); + // double xf=gsl_vector_get(xx,4); //?? Sort out something around here? + + traj_inf[i].q=xf+e; + + //Frequency at passenger loci + for (unsigned int j=0;jrx)) { + ExpRhoD=exp((-1)*((rho1*Delta_jx)+(rho2*Delta_ix))); + } + + if ((j>rx)&&(i<=rx)) { + ExpRhoD=exp((-1)*((rho2*Delta_jx)+(rho1*Delta_ix))); + } + if ((j>rx)&&(i>rx)) { + ExpRhoD=exp((-1)*rho2*Delta_ij); + } + + traj_inf[j].q= ((x+(0.5*(1-x)*(1+ExpRhoD)))*xf) + ((0.5*x*(1-ExpRhoD))*(1-xf)) + e; + if (traj_inf[j].q>1) { + cout << "Error2 " << x << " " << Delta_ij << " " << ExpRhoD << " " << xf << " " << e << "\n"; ; + } + } + } +} + +void FindFrequenciesFinal (int driver, vector traj, vector& traj_inf, const gsl_vector *xx, ofstream& out_file) { + //Set up traj_inf + traj_inf=traj; + //cout << "i " << gsl_vector_get(xx,0) << " x " << gsl_vector_get(xx,1) << " e " << gsl_vector_get(xx,2) << " rho " << gsl_vector_get(xx,3) << " xf " << gsl_vector_get(xx,4) << "\n"; + + //Frequency at driver locus + unsigned int i=driver; //Index of driver + //cout << i << " " << traj_inf.size() << " " << traj.size() << "\n"; + double x=gsl_vector_get(xx,0); + double e=gsl_vector_get(xx,1); + double rho1=gsl_vector_get(xx,2); + double rho2=gsl_vector_get(xx,3); + double rx=gsl_vector_get(xx,4); + double xf=gsl_vector_get(xx,5); + + traj_inf[i].q=xf+e; + //cout << traj_inf[i].q << "\n"; + out_file << i << " " << traj[i].pos << " " << traj[i].q << " " << traj_inf[i].q << "\n"; + + //Frequency at passenger loci + for (unsigned int j=0;jrx)) { + ExpRhoD=exp((-1)*((rho1*Delta_jx)+(rho2*Delta_ix))); + } + + if ((j>rx)&&(i<=rx)) { + ExpRhoD=exp((-1)*((rho2*Delta_jx)+(rho1*Delta_ix))); + } + if ((j>rx)&&(i>rx)) { + ExpRhoD=exp((-1)*rho2*Delta_ij); + } + traj_inf[j].q= ((x+(0.5*(1-x)*(1+ExpRhoD)))*xf) + ((0.5*x*(1-ExpRhoD))*(1-xf)) + e; + out_file << j << " " << traj[j].pos << " " << traj[j].q << " " << traj_inf[j].q << "\n"; + if (traj_inf[j].q>1) { + cout << "Error2 " << x << " " << Delta_ij << " " << ExpRhoD << " " << xf << " " << e << "\n"; ; + } + } + } +} + +double GetLogLikelihood(int betaparm, vector traj, vector traj_inf, vector fact_store) { + double L=0; + for (unsigned int i=0;i fact_store) { + double alpha=betaparm*p; + double beta=betaparm*(1-p); + double bin=1e10; + if ((alpha==0)||(beta==0)) { + bin=1e10; + } else { + bin=gsl_sf_lngamma(N+1)+gsl_sf_lngamma(r+alpha)+gsl_sf_lngamma(N-r+beta)+gsl_sf_lngamma(alpha+beta)-gsl_sf_lngamma(r+1)-gsl_sf_lngamma(N-r+1)-gsl_sf_lngamma(N+alpha+beta)-gsl_sf_lngamma(alpha)-gsl_sf_lngamma(beta); + bin=exp(bin); + } + if (bin<1e-300) { + bin=1e-300; + } + return(bin); +} + + +void FindLogFact(vector& fact_store,int N){ + double logN=0; + for (int i=1;i<=N;i++) { + logN=logN+log(i); + fact_store.push_back(logN); + //cout << "fact_store "<