package test.beast.evolution.substmodel; import org.junit.Test; import beast.core.parameter.RealParameter; import beast.evolution.substitutionmodel.BinaryCovarion; import beast.evolution.substitutionmodel.Frequencies; import beast.util.Randomizer; import cern.colt.Arrays; import junit.framework.TestCase; public class BinaryCovarionModelTest extends TestCase { final static double EPSILON = 1e-6; /** * test that equilibrium frequencies are * [ p0 * f0, p1, * f0, p0 * f1, p1, * f1 ] */ @Test public void testEquilibriumFrequencies() { Randomizer.setSeed(120); doWithTufflySteel(); for (int i = 0; i < 10; i++) { doWithEqualHFreqs("BEAST"); doWithEqualHFreqs("REVERSIBLE"); } doWithUnEqualHFreqs("REVERSIBLE"); } private void doWithTufflySteel() { Frequencies dummyFreqs = new Frequencies(); dummyFreqs.initByName("frequencies", "0.25 0.25 0.25 0.25", "estimate", false); BinaryCovarion substModel; double d = 0.05+Randomizer.nextDouble()*0.9; RealParameter vfrequencies = new RealParameter(new Double[]{d, 1.0 - d}); RealParameter switchrate = new RealParameter(new Double[]{Randomizer.nextDouble(), Randomizer.nextDouble()}); substModel = new BinaryCovarion(); substModel.initByName("frequencies", dummyFreqs, "vfrequencies", vfrequencies, /* [p0, p1] */ "alpha", "0.01", "switchRate", switchrate, //"eigenSystem", "beast.evolution.substitutionmodel.RobustEigenSystem", "mode", "TUFFLEYSTEEL"); double [] matrix = new double[16]; substModel.getTransitionProbabilities(null, 1000, 0, 1.0, matrix); double h0 = switchrate.getValue(1) / (switchrate.getValue(0) + switchrate.getValue(1)); double h1 = switchrate.getValue(0) / (switchrate.getValue(0) + switchrate.getValue(1)); double [] baseFreqs = new double[] { vfrequencies.getValue(0) * h0, vfrequencies.getValue(1) * h0, vfrequencies.getValue(0) * h1, vfrequencies.getValue(1) * h1 }; System.err.println("Expected: " + Arrays.toString(baseFreqs)); System.err.println("Calculat: " + Arrays.toString(matrix)); for (int j = 0; j < 4; j++) { assertEquals(baseFreqs[j], matrix[j], 1e-3); } } private void doWithEqualHFreqs(String mode) { Frequencies dummyFreqs = new Frequencies(); dummyFreqs.initByName("frequencies", "0.25 0.25 0.25 0.25", "estimate", false); BinaryCovarion substModel; RealParameter hfrequencies = new RealParameter(new Double[]{0.5, 0.5}); double d = Randomizer.nextDouble(); RealParameter vfrequencies = new RealParameter(new Double[]{d, 1.0 - d}); substModel = new BinaryCovarion(); substModel.initByName("frequencies", dummyFreqs, "hfrequencies", hfrequencies, /* [f0, f1] */ "vfrequencies", vfrequencies, /* [p0, p1] */ "alpha", "0.01", "switchRate", "0.1", "mode", mode); double [] matrix = new double[16]; substModel.getTransitionProbabilities(null, 100, 0, 1.0, matrix); double EPSILON = 1e-10; assertEquals(vfrequencies.getValue(0) * hfrequencies.getValue(0), matrix[0], EPSILON); assertEquals(vfrequencies.getValue(1) * hfrequencies.getValue(0), matrix[1], EPSILON); assertEquals(vfrequencies.getValue(0) * hfrequencies.getValue(1), matrix[2], EPSILON); assertEquals(vfrequencies.getValue(1) * hfrequencies.getValue(1), matrix[3], EPSILON); } private void doWithUnEqualHFreqs(String mode) { Frequencies dummyFreqs = new Frequencies(); dummyFreqs.initByName("frequencies", "0.25 0.25 0.25 0.25", "estimate", false); BinaryCovarion substModel; double d = 0.05+Randomizer.nextDouble()*0.9; RealParameter hfrequencies = new RealParameter(new Double[]{d, 1.0 - d}); d = 0.05+Randomizer.nextDouble()*0.9; RealParameter vfrequencies = new RealParameter(new Double[]{d, 1.0 - d}); substModel = new BinaryCovarion(); substModel.initByName("frequencies", dummyFreqs, "hfrequencies", hfrequencies, /* [f0, f1] */ "vfrequencies", vfrequencies, /* [p0, p1] */ "alpha", "0.01", "switchRate", "0.1", //"eigenSystem", "beast.evolution.substitutionmodel.RobustEigenSystem", "mode", mode); double [] matrix = new double[16]; substModel.getTransitionProbabilities(null, 1000, 0, 1.0, matrix); double [] baseFreqs = new double[] { (vfrequencies.getValue(0) * hfrequencies.getValue(0)), (vfrequencies.getValue(1) * hfrequencies.getValue(0)), (vfrequencies.getValue(0) * hfrequencies.getValue(1)), (vfrequencies.getValue(1) * hfrequencies.getValue(1)) }; System.err.println("Expected: " + Arrays.toString(baseFreqs)); System.err.println("Calculat: " + Arrays.toString(matrix)); for (int j = 0; j < 4; j++) { assertEquals(baseFreqs[j], matrix[j], 1e-3); } } }