package test.dr.evomodel.operators; import dr.inference.model.Bounds; import dr.inference.model.Parameter; import dr.inference.model.Variable; import dr.inference.operators.UniformIntegerOperator; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * @author Walter Xie */ public class UniformIntegerOperatorTest extends TestCase { private final int dimension = 3; private int[][] count; public static Test suite() { return new TestSuite(UniformIntegerOperatorTest.class); } public void testParameterBound() { count = new int[dimension][4]; // 4 vaules {0, 1, 2, 3} Parameter parameter = new Parameter.Default(new double[]{1.0, 0.0, 3.0}); parameter.addBounds(new Parameter.DefaultBounds(new double[]{3.0, 3.0, 3.0}, new double[dimension])); UniformIntegerOperator uniformIntegerOperator = new UniformIntegerOperator(parameter, 0, 3, 10, 1); for (int i = 0; i < 300; i++) { uniformIntegerOperator.doOperation(); countParaValueFrequency(uniformIntegerOperator.getVariable()); } printCount("Parameter (Double) lower = 0, upper = 3"); assertTrue("Expected count[0][0-3] > 0", count[0][0] > 0 && count[0][1] > 0 && count[0][2] > 0 && count[0][3] > 0); assertTrue("Expected count[1][0-3] > 0", count[1][0] > 0 && count[1][1] > 0 && count[1][2] > 0 && count[1][3] > 0); assertTrue("Expected count[2][0-3] > 0", count[2][0] > 0 && count[2][1] > 0 && count[2][2] > 0 && count[2][3] > 0); } public void testIntegerParameterStaircaseBound() { count = new int[dimension][3]; // 3 vaules Variable<Integer> parameterInt = new Variable.I(new int[dimension-1]); // dimension = 3 parameterInt.addBounds(new Bounds.Staircase(parameterInt)); // integer index parameter size = real size - 1 UniformIntegerOperator uniformIntegerOperator = new UniformIntegerOperator(parameterInt, 10, 1); for (int i = 0; i < 300; i++) { uniformIntegerOperator.doOperation(); countParaValueFrequency(uniformIntegerOperator.getVariable()); } printCount("Integer Parameter using Staircase Bound"); // assertTrue("Expected count[0][0] > 0", count[0][0] > 0); assertTrue("Expected count[1][0] && [1][1] > 0", count[1][0] > 0 && count[1][1] > 0); assertTrue("Expected count[2][0] && [2][1] && [2][2] > 0", count[2][0] > 0 && count[2][1] > 0 && count[2][2] > 0); } private void countParaValueFrequency(Variable para) { for (int i = 0; i < para.getSize(); i++) { int j; if (para.getValue(i) instanceof Double) { j = (int) (double) (Double) para.getValue(i); count[i][j] += 1; } else { j = (Integer) para.getValue(i); count[i+1][j] += 1; // integer index parameter size = real size - 1 } } } private void printCount(String m) { System.out.println("\n-----------------------\n"); System.out.println(m); int i = 0; for (int[] row : count) { System.out.print(i + " : "); i++; for (int col : row) { System.out.printf("\t%10d", col); } System.out.print("\n"); } } }