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; }
/* 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. }
/* 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); }