Example #1
0
void MBC_MCMC_loop(ERGMM_MCMC_Model *model, ERGMM_MCMC_Priors *prior,
		   ERGMM_MCMC_MCMCState *cur, ERGMM_MCMC_MCMCSettings *setting, ERGMM_MCMC_ROutput *outlists)
{  
  unsigned int pos=0;
  unsigned int iter, total_iters = setting->sample_size*setting->interval;

  //  Rprintf("Started MCMC loop.\n");
  /* Note that indexing here starts with 1.
     It can be thought of as follows:
     At the end of the updates, we have made iter complete MCMC updates. */
  for(iter=1;iter<=total_iters;iter++){

    R_CheckUserInterrupt(); // So that CTRL-C can interrupt the run.

    ERGMM_MCMC_CV_up(model,prior,cur);
    ERGMM_MCMC_logp_Z(model, cur->state);
    
    // If we have a new MLE (actually, the highest likelihood encountered to date), store it.
    if( cur->state->lpZ > outlists->lpZ[0] ) MBC_MCMC_store_iteration(0,model,cur->state,setting,outlists);
    if( cur->state->lpZ + cur->state->lpLV > outlists->lpZ[1] + outlists->lpLV[1] ) MBC_MCMC_store_iteration(1,model,cur->state,setting,outlists);

    /* every interval save the results */
    if((iter % setting->interval) == 0){
      pos = (iter/setting->interval-1)+MBC_OUTLISTS_RESERVE;

      // Store current iteration.
      MBC_MCMC_store_iteration(pos, model, cur->state, setting, outlists);

    }

  } // end main MCMC loop

  return;
  
}
Example #2
0
/* Initializes the MCMC sampler and allocates memory. */
void ERGMM_MCMC_init(unsigned int sample_size, unsigned int interval, 

		     unsigned int n,
		     unsigned int p, unsigned int d, unsigned int G,

		     unsigned int dir, int **iY, double **dY,

		     unsigned int family, 
		     int *iconsts, double *dconsts,
		     unsigned int latent_eff,

		     double ***X,

		     double *llk_mcmc, double *lpZ_mcmc, double *lpcoef_mcmc, double *lpRE_mcmc, double *lpLV_mcmc, double *lpREV_mcmc, double *lpdispersion_mcmc,

		     double **Z_start,
		     double *Z_pK_start, double **Z_mean_start, double *Z_var_start, unsigned int *Z_K_start,
		     double Z_var_prior, double Z_mean_prior_var, double Z_pK_prior,
		     double Z_var_prior_df,
		     double *Z_mcmc, double *Z_rate_move, int *K_mcmc,
		     double *Z_pK_mcmc,
		     double *Z_mean_mcmc, double *Z_var_mcmc,

		     double *coef_start,
		     double *coef_mcmc, double *coef_rate, 
		     double *coef_prior_mean, double *coef_var, 

		     double *sender_start, double *receiver_start,
		     double sender_var_start, double receiver_var_start,
		     double sender_var_prior, double sender_var_prior_df,
		     double receiver_var_prior, double receiver_var_prior_df,
		     double *sender_mcmc, double *receiver_mcmc,
		     double *sender_var_mcmc, double *receiver_var_mcmc,

		     double dispersion_start, double dispersion_prior,
		     double dispersion_prior_df, double *dispersion_mcmc,

		     unsigned int sociality,
		     unsigned int **observed_ties,
		     
		     double Z_delta,
		     double RE_delta,
		     double **group_deltas,
		     unsigned int group_prop_size,
		     double **coef_eff_sender,
		     unsigned int coef_eff_sender_size,
		     double **coef_eff_receiver,
		     unsigned int coef_eff_receiver_size,

		     unsigned int accept_all)
{
  unsigned int i;

  // Packing constants into structs.
  ERGMM_MCMC_Model model = {dir,
			    iY, // iY
			    dY, // dY
			    X, // X
			    (unsigned int **)observed_ties,
			    ERGMM_MCMC_lp_edge[family],
			    ERGMM_MCMC_E_edge[family],
			    0,
			    iconsts,
			    dconsts,
			    n, // verts
			    d, // latent
			    p, // coef
			    G, // clusters
			    sociality,
			    dispersion_mcmc!=NULL,
			    d ? ERGMM_MCMC_latent_eff[latent_eff] : NULL
  };
  ERGMM_MCMC_set_lp_Yconst[family](&model);

  ERGMM_MCMC_MCMCSettings setting = {Z_delta,
				     RE_delta,
				     group_deltas,
				     coef_eff_sender,
				     coef_eff_receiver,
				     group_prop_size,
				     coef_eff_sender_size,
				     coef_eff_receiver_size,
				     sample_size,interval,
				     accept_all
  };

  ERGMM_MCMC_Priors prior = {Z_mean_prior_var, // Z_mean_var
			     Z_var_prior, // Z_var
			     Z_var_prior_df, // a.k.a. Z_var_df (I hope)
			     coef_prior_mean,
			     coef_var,
			     Z_pK_prior,
			     sender_var_prior,
			     sender_var_prior_df,
			     receiver_var_prior,
			     receiver_var_prior_df,
			     dispersion_prior,
			     dispersion_prior_df};
  
  ERGMM_MCMC_Par state = {Z_start, // Z
			  coef_start, // coef
			  Z_mean_start, // Z_mean
			  Z_var_start, // Z_var
			  Z_pK_start, // Z_pK			  
			  sender_start,
			  sender_var_start,
			  model.sociality?sender_start:receiver_start,
			  receiver_var_start,
			  dispersion_start,
			  Z_K_start, // Z_K
			  0, // llk
			  dmatrix(model.verts,model.verts), // lpedge
			  0, // lpZ		  
			  0, // lpLV
			  0, // lpcoef
			  0, // lpRE
			  0, // lpREV
			  0, // lpdispersion
  };

  ERGMM_MCMC_Par prop = {model.latent ? dmatrix(model.verts,model.latent):NULL, // Z
			 model.coef ? dvector(model.coef):NULL, // coef
			 model.clusters ? dmatrix(model.clusters,model.latent):NULL, // Z_mean
			 model.latent ? dvector(model.clusters?model.clusters:1):NULL, // Z_var
			 model.clusters ? dvector(model.clusters):NULL, // Z_pK
			 sender_start ? dvector(model.verts):NULL, // sender
			 0, // sender_var
			 receiver_start && !model.sociality ? dvector(model.verts):NULL, // receiver
			 0, // receiver_var
			 0, // dispersion
			 state.Z_K, // prop.Z_K === state.Z_K
			 0, // llk
			 dmatrix(model.verts,model.verts), // lpedge
			 0, // lpZ
			 0, // lpLV
			 0, // lpcoef
			 0, // lpRE
			 0, // lpREV
			 0 // lpdispersion
  };
  if(model.sociality) prop.receiver=prop.sender;

  ERGMM_MCMC_MCMCState start = {&state,
				&prop,
				model.clusters ? dmatrix(model.clusters,model.latent) : NULL, // Z_bar
				setting.group_prop_size ? dvector(setting.group_prop_size) : NULL, // deltas
				model.clusters ? dvector(model.clusters): NULL, // pK
				model.clusters ? (unsigned int *) ivector(model.clusters) : NULL, // n
				PROP_NONE, // prop_Z
				PROP_NONE, // prop_RE
				PROP_NONE, // prop_coef
				PROP_NONE, // prop_LV
				PROP_NONE, // prop_REV
				PROP_NONE, // prop_dispersion
				FALSE, // after_Gibbs
				(model.latent || sender_start || receiver_start) ? (unsigned int *) ivector(model.verts) : NULL // update_order
  };
  
  ERGMM_MCMC_ROutput outlists = {llk_mcmc, lpZ_mcmc, lpcoef_mcmc, lpRE_mcmc, lpLV_mcmc, lpREV_mcmc, lpdispersion_mcmc,
				 Z_mcmc, Z_rate_move,
				 coef_mcmc,coef_rate,
				 Z_mean_mcmc,Z_var_mcmc,Z_pK_mcmc,
				 sender_mcmc,sender_var_mcmc,
				 receiver_mcmc,receiver_var_mcmc,
				 dispersion_mcmc,
				 K_mcmc};

  if(model.clusters>0)
    for(i=0;i<model.verts;i++)
      start.n[state.Z_K[i] - 1]++;

  // Initialize the log-probabilities.
  state.llk = ERGMM_MCMC_lp_Y(&model, &state, TRUE);
  if(model.latent) ERGMM_MCMC_logp_Z(&model, &state);
  if(state.sender || state.receiver) ERGMM_MCMC_logp_RE(&model, &state);
  if(state.coef) ERGMM_MCMC_logp_coef(&model, &state, &prior);
  if(model.latent) ERGMM_MCMC_logp_LV(&model, &state, &prior);
  if(state.sender || state.receiver) ERGMM_MCMC_logp_REV(&model, &state, &prior);
  if(model.dispersion) ERGMM_MCMC_logp_dispersion(&model, &state, &prior);
  copy_MCMC_Par(&model,&state,&prop);
  ERGMM_MCMC_store_iteration(0,&model,&state,&setting,&outlists);
  ERGMM_MCMC_store_iteration(1,&model,&state,&setting,&outlists);

  ERGMM_MCMC_loop(&model, &prior, &start, &setting, &outlists);


  // R's garbage collector takes care of freeing memory.
}
Example #3
0
/* Initializes the MCMC sampler and allocates memory. */
void MBC_MCMC_init(unsigned int sample_size, 
		   unsigned int interval, 

		   unsigned int n,
		   unsigned int d,
		   unsigned int G,
		   
		   double *lpZ_mcmc,
		   double *lpLV_mcmc, 
		   
		   double **Z,

		   double *Z_pK, 
		   double **Z_mean_start, 
		   double *Z_var, 
		   unsigned int *Z_K,

		   double Z_var_prior,
		   double Z_mean_prior_var,
		   double Z_K_prior,
		   double Z_var_df,

		   int *K_mcmc,
		   double *Z_pK_mcmc,
		   double *Z_mean_mcmc,
		   double *Z_var_mcmc){
  unsigned int i;


  // Packing constants into structs.
  ERGMM_MCMC_Model model = {0,
			    NULL, // iY
			    NULL, // dY
			    NULL, // X
			    NULL,
			    NULL,
			    NULL,
			    0,
			    NULL,
			    NULL,
			    n, // verts
			    d, // latent
			    0, // coef
			    G // clusters
  };

  ERGMM_MCMC_MCMCSettings setting = {0,0,NULL,NULL,NULL,0,0,0, // deltas
				     sample_size,interval,
				     FALSE // accept_all
  };

  ERGMM_MCMC_Priors prior = {Z_mean_prior_var, // Z_mean_var
			     Z_var_prior, // Z_var
			     Z_var_df, // a.k.a. Z_var_df (I hope)
			     NULL,
			     NULL,
			     Z_K_prior,
			     0,0,0,0};
  
  ERGMM_MCMC_Par state = {Z, // Z
			  NULL, // coef
			  Z_mean_start, // Z_mean
			  Z_var, // Z_var
			  Z_pK, // Z_pK			  
			  NULL,
			  0,
			  NULL,
			  0,
			  0, // dispersion
			  Z_K, // Z_K
			  0, // llk
			  NULL, // lpedge
			  0, // lpZ		  
			  0, // lpLV
			  0, // lpcoef
			  0, // lpRE
			  0, // lpREV
			  0  // lpdispersion
  };

  ERGMM_MCMC_MCMCState start = {&state,
				NULL,
				model.clusters ? dmatrix(model.clusters,model.latent) : NULL, // Z_bar
				NULL, // tr_by
				model.clusters ? dvector(model.clusters): NULL, // pK
				model.clusters ? (unsigned int *) ivector(model.clusters) : NULL, // n
				PROP_NONE, // prop_Z
				PROP_NONE, // prop_RE
				PROP_NONE, // prop_coef
				PROP_NONE, // prop_LV
				PROP_NONE, // prop_REV
				PROP_NONE, // prop_dispersion
				FALSE, // after_Gibbs
				NULL // update_order
  };
  
  ERGMM_MCMC_ROutput outlists = {NULL, // llk
				 lpZ_mcmc,
				 NULL, // lpcoef
				 NULL, // lpRE
				 lpLV_mcmc,
				 NULL, //lpREV,
				 NULL, //lpdispersion
				 NULL, // Z
				 NULL, // Z_rate_move
				 NULL, // coef
				 NULL, // coef_rate
				 Z_mean_mcmc,Z_var_mcmc,Z_pK_mcmc,
				 NULL,NULL,
				 NULL,NULL,
				 NULL, // dispersion_mcmc
				 K_mcmc};

  if(model.clusters>0)
    for(i=0;i<model.verts;i++)
      start.n[state.Z_K[i] - 1]++;

  // Initialize the log-probabilities.
  ERGMM_MCMC_logp_Z(&model, &state);
  MBC_MCMC_store_iteration(0,&model,&state,&setting,&outlists);
  MBC_MCMC_store_iteration(1,&model,&state,&setting,&outlists);
  
  MBC_MCMC_loop(&model, &prior, &start, &setting, &outlists);

}