package test.dr.evomodel.substmodel;
import dr.oldevomodel.substmodel.AsymmetricQuadraticModel;
import dr.oldevomodel.substmodel.OnePhaseModel;
import dr.oldevomodel.substmodel.TwoPhaseModel;
import junit.framework.TestCase;
import dr.evolution.datatype.Microsatellite;
import dr.evomodel.substmodel.*;
import dr.inference.model.Parameter;
/**
* @author Chieh-Hsi Wu
*
* JUnit test for TwoPhaseModel of microsatellites
*
*/
public class TwoPhaseModelTest extends TestCase {
interface Instance {
public OnePhaseModel getSubModel();
double getPParam();
double getMParam();
double getDistance();
double[] getPi();
public double[] getExpectedResult();
}
Instance test0 = new Instance() {
public OnePhaseModel getSubModel(){
return new AsymmetricQuadraticModel(new Microsatellite(1,6), null);
}
public double getPParam(){
return 0.75;
}
public double getMParam(){
return 0.58;
}
public double getDistance(){
return 0.94;
}
public double[] getPi(){
return new double[]{0.18744637901040673, 0.1607567474109271, 0.15179687357866556, 0.15179687357866556, 0.16075674741092702, 0.18744637901040695};
}
public double[] getExpectedResult(){
return new double[]{
0.63398241451779758, 0.23675486586787650, 0.07330431013568975, 0.02919578818459456, 0.01589013386525921, 0.01087248742878196,
0.27524752392268953, 0.42098887984631489, 0.19147132450808460, 0.06606140653506744, 0.02837812583210070, 0.01785273935574281,
0.09233761983753200, 0.20121070458110243, 0.40820601172807069, 0.19248802732743994, 0.06994493808030816, 0.03581269844554699,
0.03581269844554700, 0.06994493808030799, 0.19248802732743994, 0.40820601172807053, 0.20121070458110252, 0.09233761983753204,
0.01785273935574278, 0.02837812583210064, 0.06606140653506756, 0.19147132450808424, 0.42098887984631500, 0.27524752392268970,
0.01087248742878200, 0.01589013386525917, 0.02919578818459453, 0.07330431013568960, 0.23675486586787683, 0.63398241451779769
};
}
};
Instance[] all = {test0};
public void testTwoPhaseModel() {
for (Instance test : all) {
OnePhaseModel subModel = test.getSubModel();
Microsatellite microsat = (Microsatellite)subModel.getDataType();
Parameter pParam = new Parameter.Default(test.getPParam());
Parameter mParam = new Parameter.Default(test.getMParam());
TwoPhaseModel tpm = new TwoPhaseModel(microsat, null, subModel, pParam, mParam, null,false);
int k;
tpm.computeStationaryDistribution();
double[] statDist = tpm.getStationaryDistribution();
final double[] expectedStatDist = test.getPi();
for (k = 0; k < statDist.length; ++k) {
assertEquals(statDist[k], expectedStatDist[k], 1e-10);
}
int stateCount = microsat.getStateCount();
double[] mat = new double[stateCount*stateCount];
tpm.getTransitionProbabilities(test.getDistance(), mat);
final double[] result = test.getExpectedResult();
for (k = 0; k < mat.length; ++k) {
assertEquals(result[k], mat[k], 5e-9);
//System.out.print(" " + (mat[k]));// - result[k]));
}
k = 0;
for(int i = 0; i < microsat.getStateCount(); i ++){
for(int j = 0; j < microsat.getStateCount(); j ++){
assertEquals(result[k++], tpm.getOneTransitionProbabilityEntry(test.getDistance(), i , j), 1e-10);
}
}
for(int j = 0; j < microsat.getStateCount();j ++){
double[] colTransitionProb = tpm.getColTransitionProbabilities(test.getDistance(), j);
for(int i =0 ; i < microsat.getStateCount(); i++){
assertEquals(result[i*microsat.getStateCount()+j], colTransitionProb[i], 1e-10);
}
}
for(int i = 0; i < microsat.getStateCount();i ++){
double[] rowTransitionProb = tpm.getRowTransitionProbabilities(test.getDistance(), i);
for(int j =0 ; j < microsat.getStateCount(); j++){
assertEquals(result[i*microsat.getStateCount()+j], rowTransitionProb[j], 1e-10);
}
}
}
}
}