package dr.evomodel.speciation;
import dr.inference.model.Likelihood;
/**
* User: Graham Jones
* Date: 10/05/12
*/
public class PopsIOMSCoalescent extends Likelihood.Abstract {
private final PopsIOSpeciesTreeModel piostm;
private final PopsIOSpeciesBindings piosb;
public PopsIOMSCoalescent(PopsIOSpeciesBindings piosb, PopsIOSpeciesTreeModel piostm) {
super(piostm);
this.piostm = piostm;
this.piosb = piosb;
piostm.addModelRestoreListener(this);
final PopsIOSpeciesBindings.GeneTreeInfo[] trees = piosb.getGeneTrees();
for(PopsIOSpeciesBindings.GeneTreeInfo geneTree : trees) {
geneTree.tree.addModelListener(this);
}
}
@Override
protected double calculateLogLikelihood() {
for (int i = 0; i < piosb.numberOfGeneTrees(); i++) {
if (!piosb.geneTreeFitsInNetwork(i, piostm)) {
return Double.NEGATIVE_INFINITY;
}
}
// grjtodo-oneday JH has compatible flags for efficiency. I'm checking
// every time.
double logl = 0;
for(int i = 0; i < piosb.numberOfGeneTrees(); i++) {
final double v = piosb.geneTreeLogLikelihood(i, piostm);
assert ! Double.isNaN(v);
logl += v;
}
return logl;
}
@Override
protected boolean getLikelihoodKnown() {
return false;
}
}