package test.dr.evomodel.substmodel; import test.dr.math.MathTestCase; import dr.evomodel.substmodel.nucleotide.HKY; import dr.evomodel.substmodel.FrequencyModel; import dr.evomodel.substmodel.MarkovJumpsSubstitutionModel; import dr.evolution.datatype.Nucleotides; import dr.inference.markovjumps.MarkovJumpsType; import dr.inference.markovjumps.MarkovJumpsCore; import dr.math.matrixAlgebra.Vector; /** * @author Marc A. Suchard */ public class MarkovJumpsSubstitutionModelTest extends MathTestCase { public void testMarkovJumpsCounts() { HKY substModel = new HKY(2.0, new FrequencyModel(Nucleotides.INSTANCE, new double[]{0.3, 0.2, 0.25, 0.25})); // A,C,G,T int states = substModel.getDataType().getStateCount(); MarkovJumpsSubstitutionModel markovjumps = new MarkovJumpsSubstitutionModel(substModel, MarkovJumpsType.COUNTS); double[] r = new double[states * states]; double[] q = new double[states * states]; double[] j = new double[states * states]; double[] c = new double[states * states]; double[] p = new double[states * states]; double time = 1.0; int from = 0; // A int to = 1; // C MarkovJumpsCore.fillRegistrationMatrix(r, from, to, states, 1.0); markovjumps.setRegistration(r); substModel.getInfinitesimalMatrix(q); substModel.getTransitionProbabilities(time, p); markovjumps.computeJointStatMarkovJumps(time, j); markovjumps.computeCondStatMarkovJumps(time, c); MarkovJumpsCore.makeComparableToRPackage(q); System.out.println("Q = " + new Vector(q)); MarkovJumpsCore.makeComparableToRPackage(p); System.out.println("P = " + new Vector(p)); System.out.println("Counts:"); MarkovJumpsCore.makeComparableToRPackage(r); System.out.println("R = " + new Vector(r)); MarkovJumpsCore.makeComparableToRPackage(j); System.out.println("J = " + new Vector(j)); assertEquals(rMarkovJumpsJ, j, tolerance); MarkovJumpsCore.makeComparableToRPackage(c); System.err.println("C = " + new Vector(c)); assertEquals(rMarkovJumpsC, c, tolerance); } public void testMarkovJumpsReward() { HKY substModel = new HKY(2.0, new FrequencyModel(Nucleotides.INSTANCE, new double[]{0.3, 0.2, 0.25, 0.25})); // A,C,G,T int states = substModel.getDataType().getStateCount(); double[] j = new double[states * states]; double[] c = new double[states * states]; double time = 1.0; MarkovJumpsSubstitutionModel markovjumps = new MarkovJumpsSubstitutionModel(substModel, MarkovJumpsType.REWARDS); double[] rewards = {1.0, 1.0, 1.0, 1.0}; markovjumps.setRegistration(rewards); markovjumps.computeJointStatMarkovJumps(time, j); markovjumps.computeCondStatMarkovJumps(time, c); System.out.println("Rewards:"); MarkovJumpsCore.makeComparableToRPackage(rewards); System.out.println("R = " + new Vector(rewards)); MarkovJumpsCore.makeComparableToRPackage(j); System.out.println("J = " + new Vector(j)); assertEquals(rMarkovRewardsJ, j, tolerance); MarkovJumpsCore.makeComparableToRPackage(c); System.out.println("C = " + new Vector(c)); assertEquals(rMarkovRewardsC, c, tolerance); } public void testMarginalRates() { HKY substModel = new HKY(2.0, new FrequencyModel(Nucleotides.INSTANCE, new double[]{0.3, 0.2, 0.25, 0.25})); // A,C,G,T int states = substModel.getDataType().getStateCount(); MarkovJumpsSubstitutionModel markovjumps = new MarkovJumpsSubstitutionModel(substModel, MarkovJumpsType.COUNTS); double[] r = new double[states * states]; int from = 0; // A int to = 1; // C MarkovJumpsCore.fillRegistrationMatrix(r, from, to, states, 1.0); markovjumps.setRegistration(r); double marginalRate = markovjumps.getMarginalRate(); System.out.println("Marginal rate = " + marginalRate); assertEquals(rMarkovMarginalRate, marginalRate, tolerance); MarkovJumpsCore.fillRegistrationMatrix(r, states); markovjumps.setRegistration(r); marginalRate = markovjumps.getMarginalRate(); System.out.println("Marginal rate = " + marginalRate); assertEquals(1.0, marginalRate, tolerance); } private static double tolerance = 1E-6; private static double[] rMarkovJumpsJ = { 0.016780099, 0.013983416, 0.08448885, 0.022470093, 0.003179188, 0.002649323, 0.02556076, 0.004475270, 0.001889475, 0.001574562, 0.01612631, 0.002673292, 0.001889475, 0.001574562, 0.01612631, 0.002673292 }; private static double[] rMarkovJumpsC = { 0.034557323, 0.061024826, 0.66635307, 0.141775072, 0.011561873, 0.006024690, 0.20159458, 0.028236719, 0.009934702, 0.009934702, 0.03850175, 0.011499342, 0.009934702, 0.009934702, 0.08671048, 0.005744804 }; private static double[] rMarkovRewardsJ = { 0.4855729, 0.2291431, 0.1267929, 0.1584911, 0.2749717, 0.4397443, 0.1267929, 0.1584911, 0.1901894, 0.1584911, 0.4188461, 0.2324734, 0.1901894, 0.1584911, 0.1859787, 0.4653407 }; private static double[] rMarkovRewardsC = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; private static double rMarkovMarginalRate = 0.2010050 * 0.3; } /* # R script to compare main to original package: subst.model.eigen = as.eigen.hky(c(2,1), c(0.3,0.25,0.2,0.25),scale=T) time = 1.0 from = 0 # A to = 2 # C R = matrix(0,nrow=4,ncol=4) R[from + to*4 + 1] = 1.0 P = matexp.eigen(subst.model.eigen,time) J = joint.mean.markov.jumps(subst.model.eigen,R,time) C = cond.mean.markov.jumps(subst.model.eigen,R,time) rR = c(1,1,1,1) rJ = joint.mean.markov.rewards(subst.model.eigen,rR,time) */