protected override double ComputeLLR(ModelScorer modelScorer, PhyloTree phyloTree, StringBuilder stringBuilder, double targetMarginal, double predictorMarginal, Converter <Leaf, SufficientStatistics> predictorDistributionClassFunction, Converter <Leaf, SufficientStatistics> targetDistributionClassFunction) { Converter <Leaf, SufficientStatistics> LeafToJointDistributionClass = CreateAlternativeSufficientStatisticsMap(predictorDistributionClassFunction, targetDistributionClassFunction); double logLikelihoodIndependentModel, logLikelihoodJointModel; Score scoreIndTarget, scoreIndPredictor, scoreJoint; MessageInitializer messageInitializer; // first score the target. NullModelDistribution.EmpiricalEquilibrium = targetMarginal; messageInitializer = modelScorer.CreateMessageInitializer(predictorDistributionClassFunction, targetDistributionClassFunction, NullModelDistribution); scoreIndTarget = modelScorer.ScoreModel(messageInitializer, false); NullModelDistribution.EmpiricalEquilibrium = predictorMarginal; messageInitializer = modelScorer.CreateMessageInitializer(targetDistributionClassFunction, predictorDistributionClassFunction, NullModelDistribution); scoreIndPredictor = modelScorer.ScoreModel(messageInitializer, false); DistributionDiscreteJointBinary jointDistn = (DistributionDiscreteJointBinary)AlternativeModelDistribution; jointDistn.SetInitialParams(scoreIndPredictor.OptimizationParameters, scoreIndTarget.OptimizationParameters); messageInitializer = modelScorer.CreateMessageInitializer(null, LeafToJointDistributionClass, jointDistn); scoreJoint = modelScorer.ScoreModel(messageInitializer, false); logLikelihoodIndependentModel = scoreIndTarget.Loglikelihood + scoreIndPredictor.Loglikelihood; logLikelihoodJointModel = scoreJoint.Loglikelihood; stringBuilder.Append(SpecialFunctions.CreateTabString(scoreIndPredictor.ToString(NullModelDistribution), scoreIndTarget.ToString(NullModelDistribution), logLikelihoodIndependentModel, scoreJoint.ToString(jointDistn), "")); double diff = logLikelihoodJointModel - logLikelihoodIndependentModel; return(diff); }