package statalign.base.mcmc;
import statalign.base.Mcmc;
import statalign.base.Tree;
import statalign.base.Utils;
import statalign.mcmc.McmcModule;
import statalign.model.ext.ModelExtManager;
/**
* curLogLike for this McmcModule includes the
* contributions from the ModelExtensions.
*
* The core McmcMoves need to call functions in modelExtMan
* before and after execution, and also in order to update
* the likelihood contribution from all the ModelExtensions.
*
* @author herman
*
*/
public class CoreMcmcModule extends McmcModule {
private ModelExtManager modelExtMan;
public ModelExtManager getModelExtMan() {
return modelExtMan;
}
public CoreMcmcModule (Mcmc mc, ModelExtManager m) {
super("coreModel");
setMcmc(mc);
modelExtMan = m;
}
public double totalLogPrior(Tree tree) {
return(tree.getLogPrior());
}
public double logLikeFactor(Tree tree) {
return(tree.getLogLike());
}
@Override
public boolean proposeParamChange(Tree tree) {
// Each move will update the curLogLike variable
// for `this'
boolean accepted = false;
int[] weights = new int[2];
weights[0] = getParamChangeWeight();
weights[1] = modelExtMan.getParamChangeWeight();
int choice = Utils.weightedChoose(weights);
if (choice == 0) { // Core move selected
//System.out.println("Core move.");
accepted = super.proposeParamChange(tree);
}
else { // Model extension move selected
//System.out.println("Model extension move.");
modelExtMan.beforeModExtParamChange(tree);
accepted = modelExtMan.proposeParamChange(tree);
modelExtMan.afterModExtParamChange(tree, accepted);
}
return accepted;
}
@Override
public void beforeSampling(Tree tree) {
super.beforeSampling(tree);
modelExtMan.beforeSampling(tree);
}
}