package test.dr.evomodel.substmodel; import test.dr.math.MathTestCase; import dr.evomodel.substmodel.FrequencyModel; import dr.evomodel.substmodel.ProductChainFrequencyModel; import dr.evolution.datatype.Nucleotides; import dr.math.matrixAlgebra.Vector; import java.util.List; import java.util.ArrayList; /** * @author Marc A. Suchard */ public class ProductChainFrequencyModelTest extends MathTestCase { public void testFrequencyModel() { FrequencyModel firstPosition = new FrequencyModel(Nucleotides.INSTANCE, freq1); FrequencyModel secondPosition = new FrequencyModel(Nucleotides.INSTANCE, freq2); FrequencyModel thirdPosition = new FrequencyModel(Nucleotides.INSTANCE, freq3); List<FrequencyModel> freqModels = new ArrayList<FrequencyModel>(3); freqModels.add(firstPosition); freqModels.add(secondPosition); freqModels.add(thirdPosition); ProductChainFrequencyModel pcFreqModel = new ProductChainFrequencyModel("freq", freqModels); double[] freqs = pcFreqModel.getFrequencies(); System.out.println("Freq.length = " + freqs.length); int pos1 = 2; int pos2 = 1; int pos3 = 3; int index = computeIndex(pos1, pos2, pos3); System.out.println("Entry: " + new Vector(pcFreqModel.decomposeEntry(index))); System.out.println("Freq = " + freqs[index]); System.out.println("Freq = " + computeFreq(pos1, pos2, pos3)); assertEquals(computeFreq(pos1, pos2, pos3), freqs[index]); } private int computeIndex(int i, int j, int k) { return i * 16 + j * 4 + k; } private double computeFreq(int i, int j, int k) { return freq1[i] * freq2[j] * freq3[k]; } private static double[] freq1 = {0.3, 0.25, 0.20, 0.25}; // A,C,G,T private static double[] freq2 = {0.1, 0.4, 0.25, 0.25}; // A,C,G,T private static double[] freq3 = {0.3, 0.15, 0.25, 0.30}; // A,C,G,T }