package test.beast.evolution.operator;
import java.util.Arrays;
import org.junit.Test;
import beast.core.State;
import beast.core.parameter.IntegerParameter;
import beast.evolution.operators.IntRandomWalkOperator;
import junit.framework.TestCase;
public class IntRandomWalkOperatorTest extends TestCase {
@Test
public void testIntRandomWalkDistribution3x10() {
instantiate(3, 10, 1,new Integer[]{1,2,3,6,10});
}
@Test
public void testIntRandomWalkDistribution3x6() {
instantiate(3, 6, 1,new Integer[]{1,2,3,6});
}
@Test
public void testIntRandomWalkDistribution6x10() {
instantiate(6, 10, 1,new Integer[]{1,2,3,6,10});
}
public void instantiate(int dimension, int upper, int runs, Integer[]windowSizes) {
for (int r = 0; r < runs; r++) {
for (Integer windowSize : windowSizes) {
try {
int[][] count = new int[dimension][upper + 1];
Integer [] init = new Integer[dimension];
Arrays.fill(init, 0);
IntegerParameter parameter = new IntegerParameter(init);
parameter.setLower(0);
parameter.setUpper(upper);
State state = new State();
state.initByName("stateNode", parameter);
state.initialise();
IntRandomWalkOperator operator = new IntRandomWalkOperator();
operator.initByName("parameter", parameter, "windowSize", windowSize, "weight", 1.0);
for (int i = 0; i < 1000000 * (upper + 1); i++) {
operator.proposal();
Integer [] values = parameter.getValues();
for (int k = 0; k < values.length; k++) {
int j = values[k];
count[k][j] += 1;
}
}
System.out.print("Distribution lower = 0, upper = " + upper +" windowSize = " + windowSize);
for (int j = 0; j < count.length; j++) {
//System.out.println("x[" +j + "] = " + Arrays.toString(count[j]));
}
int sum = 0;
for (int i = 0; i < dimension; i++) {
for (int k = 0; k < count[i].length; k++) {
sum += Math.abs(count[i][k] - 1000000);
}
}
System.out.println(" Average deviation: " + sum/(dimension * (upper + 1)));
assertTrue("average deviation (" + sum/(dimension * (upper + 1)) + ") exceeds 10000", sum/(dimension * (upper + 1)) < 10000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}