Example #1
0
void computeSystem(int myid, int nproc,char * dirIn,char * dirOut, char ** listFile, int numFile, int idxFile)
{
  
  BioSystem sistema;
  char * json_system;  
  
  //set input path file
  char * fileNameIn = (char *) malloc(1000*sizeof(char)); 
  char * fileNameOut = (char *) malloc(1000*sizeof(char)); 
  strcpy( fileNameIn, dirIn);
  strcat( fileNameIn, listFile[idxFile]);
  
  //extract system from file
  json_system = fget_contents(fileNameIn);
  sistema = extract_from_json(json_system);
  
  //set output path file
  strcpy( fileNameOut,dirOut);
  strcat( fileNameOut, sistema.name);
  strcat( fileNameOut, ".out");
  
  
  //algo submission
  gillespie(sistema,fileNameOut);
  
}
void beetles(double* s1, double* s2, double* s3, double* s4, double* inits, int* n_samples, int* reps, double* maxtime)
{
	/** Create a list of all event functions and their associated outcomes 
	 *  Order doesn't matter, but make sure outcomes are paired with the 
	 *  appropriate function! */
	const size_t n_event_types = 8;
	event_fn rate_fn[n_event_types];	
	event_fn outcome[n_event_types];
	rate_fn[0] = &bE;
	outcome[0] = &bE_out;
	rate_fn[1] = &dE;
	outcome[1] = &dE_out;
	rate_fn[2] = &dL;
	outcome[2] = &dL_out;
	rate_fn[3] = &dP;
	outcome[3] = &dP_out;
	rate_fn[4] = &dA;
	outcome[4] = &dA_out;
	rate_fn[5] = &mE;
	outcome[5] = &mE_out;
	rate_fn[6] = &mL;
	outcome[6] = &mL_out;
	rate_fn[7] = &mP;
	outcome[7] = &mP_out;

	RESET reset_fn = &beetles_reset;
	FIXED fixed_interval_fn = &beetles_fixed_interval;

	record * my_record = b_record_alloc(*n_samples, *reps, *maxtime);

	gillespie(	rate_fn, outcome, n_event_types, 
				inits, my_record, *maxtime, 
				*reps, reset_fn, fixed_interval_fn);

	int i;
	for(i = 0; i< *n_samples * *reps; i++)
	{ 
		s1[i] = my_record->s1[i]; 
		s2[i] = my_record->s2[i];
		s3[i] = my_record->s3[i]; 
		s4[i] = my_record->s4[i];
	}
	b_record_free(my_record);
}
Example #3
0
int main(int argc, char *argv[])
{
  /*no_mc == #MC ODEs; tstep = time step */
  int i, j, no_mc = 27;
  double tstep=1;
  int par_index, sim_index;
  gsl_matrix *pars_mat;

  int prior = 0;
  if(prior==1) {
    pars_mat = readMatrix("../data/prior.csv");
  } else {
    pars_mat = readMatrix("../data/post.csv");
  }
  gsl_matrix *sim_mat = readMatrix("../data/sim.csv");
  
  double *par_wts, *sim_wts;
  par_wts = calloc(sizeof(double), pars_mat->size1);
  sim_wts = calloc(sizeof(double), sim_mat->size1);

  double *sps, *pars, *sps_gil;
  sps = malloc(no_mc*sizeof(double));
  sps_gil = malloc(6*sizeof(double));

  /*Add in (fixed) k1 and k2 to pars*/
  pars = malloc((pars_mat->size2+1)*sizeof(double));
  /*total g & i*/
  pars[pars_mat->size2-1] = 10;  pars[pars_mat->size2] = 2;
  gsl_ran_discrete_t *sim_sample, *par_sample;
  gsl_rng *r = gsl_rng_alloc(gsl_rng_mt19937);  
  gsl_rng_set (r, 1);   

  par_sample = gsl_ran_discrete_preproc(pars_mat->size1, (const double *) par_wts);
  sim_sample = gsl_ran_discrete_preproc(sim_mat->size1, (const double *) sim_wts);
  
  /* 1. Select parameters from post (select row)
     2. Select time point of interest (select column)
     3. Simulate from MC and Gillespie one time unit
     4. Compare
     5. Profit
  */
  
  for(i=0; i<10000; i++) {
    if(prior == 1) {
      par_index = i;
    } else {
      par_index = gsl_ran_discrete(r, par_sample);
    }
    sim_index = gsl_ran_discrete(r, sim_sample);

    /*Reset MC */
    for(j=0; j<no_mc;j++) {
      sps[j] = 0;
    }
    /* Sps order: rg, ri, g, i, G, I 
       column zero iteration number
    */
    sps[0] = MGET(sim_mat, sim_index, 1);
    sps[2] = MGET(sim_mat, sim_index, 2);
    sps[5] = MGET(sim_mat, sim_index, 3);
    sps[9] = MGET(sim_mat, sim_index, 4);
    sps[14] = MGET(sim_mat, sim_index, 5);
    sps[20] = MGET(sim_mat, sim_index, 6);

    for(j=0; j<(pars_mat->size2-1); j++) {
      pars[j] = MGET(pars_mat, par_index, j+1);
    }

    sps_gil[0] = sps[0]; sps_gil[1] = sps[2]; sps_gil[2] = sps[5];
    sps_gil[3] = sps[9]; sps_gil[4] = sps[14]; sps_gil[5] = sps[20];

    /* simulate from MC */
    ode(pars, tstep, sps);
    gillespie(sps_gil, pars, tstep, r);

    
    printf("%f, %f, %f, %f, %f, %f, %d, %d\n", 
           (sps[0] - sps_gil[0])/(pow(sps[1], 0.5)),
           (sps[2] - sps_gil[1])/(pow(sps[4], 0.5)),
           (sps[5] - sps_gil[2])/(pow(sps[8], 0.5)),
           (sps[9] - sps_gil[3])/(pow(sps[13], 0.5)),
           (sps[14] - sps_gil[4])/(pow(sps[19], 0.5)),
           (sps[20] - sps_gil[5])/(pow(sps[26], 0.5)),
           par_index, sim_index
           );
    
  }


  return(EXIT_SUCCESS);
}
Example #4
0
File: ssa.c Project: kingaa/pomp
void SSA (pomp_ssa_rate_fn *ratefun, int irep,
          int nvar, int nevent, int npar, int nrep, int ntimes,
          int method,
          double *xstart, const double *times, const double *params, double *xout,
          const double *e, const double *v, const double *d,
          int ndeps, const int *ideps, int nzero, const int *izero,
          const int *istate, const int *ipar, int ncovar, const int *icovar,
          int lcov, int mcov, double *tcov, double *cov) {
  int flag = 0;
  double t = times[0];
  double tmax = times[ntimes-1];
  double *covars = NULL;
  double *f = NULL;
  double par[npar], y[nvar];
  struct lookup_table tab = {lcov, mcov, 0, tcov, cov};
  int i, j;

  if (mcov > 0) covars = (double *) Calloc(mcov,double);
  if (nevent > 0) f = (double *) Calloc(nevent,double);

  // Copy parameters and states
  for (i = 0; i < npar; i++) par[i] = params[i+npar*irep];
  for (i = 0; i < nvar; i++)
    xout[i+irep*nvar] = y[i] = xstart[i+nvar*irep];
  // Set appropriate states to zero
  for (i = 0; i < nzero; i++) y[izero[i]] = 0.0;
  // Initialize the covariate vector
  if (mcov > 0) table_lookup(&tab,t,covars);
  // Initialise propensity functions & tree
  for (j = 0; j < nevent; j++) {
    f[j] = ratefun(j+1,t,y,par,istate,ipar,icovar,mcov,covars);
    if (f[j] < 0.0)
      errorcall(R_NilValue,"'rate.fun' returns a negative rate");
  }
  int icount = 1;
  while (icount < ntimes) {
    R_CheckUserInterrupt();
    if (method == 0) {	// Gillespie's next reaction method
      flag = gillespie(ratefun,&t,f,y,v,d,par,nvar,nevent,npar,istate,ipar,ncovar,icovar,mcov,covars);
    } else {	 // Cai's K-leap method
      // Determine kappa (most accurate but slowest method)
      double kappa, tmp;
      int k;
      for (i = 0, kappa = 1e9; i < ndeps; i++) {
        k = ideps[i];
        tmp = e[k]*y[k];
        kappa = (tmp < kappa) ? tmp : kappa;
        if (kappa < 2.0) break;
      }
      if (kappa < 2.0) {
        flag = gillespie(ratefun,&t,f,y,v,d,par,nvar,nevent,npar,istate,ipar,ncovar,icovar,mcov,covars);
      } else {
        kappa = floor(kappa);
        flag = kleap(ratefun,kappa,&t,f,y,v,d,par,nvar,nevent,npar,istate,ipar,ncovar,icovar,mcov,covars);
      }
    }
    // Record output at required time points
    while ((icount < ntimes) && (t >= times[icount])) {
      for (i = 0; i < nvar; i++)
        xout[i+nvar*(irep+nrep*icount)] = y[i];
      // Set appropriate states to zero
      for (i = 0; i < nzero; i++) y[izero[i]] =0.0;
      // Recompute if zero event-rate encountered
      if (flag) t = times[icount];
      icount++;
    }

    if ((mcov > 0) && (t <= tmax)) table_lookup(&tab,t,covars);

  }
  if (mcov > 0) Free(covars);
  if (nevent > 0) Free(f);
}