/**
*
*/
package test.beast.evolution.operator;
import org.junit.Test;
import beast.core.State;
import beast.core.parameter.IntegerParameter;
import beast.core.parameter.RealParameter;
import beast.evolution.operators.DeltaExchangeOperator;
/**
* @author gereon
*
*/
public class DeltaExchangeOperatorTest extends TestOperator {
@Test
public void testKeepsSum() {
DeltaExchangeOperator operator = new DeltaExchangeOperator();
RealParameter parameter = new RealParameter(new Double[] {1., 1., 1., 1.});
register(operator,
"parameter", parameter);
for (int i=0; i<100; ++i) {
operator.proposal();
}
double i = 0;
for (Double p : parameter.getValues()) {
i += p;
}
assertEquals("The DeltaExchangeOperator should not change the sum of a parameter", i, 4, 0.00001);
}
@Test
public void testKeepsWeightedSum() {
RealParameter parameter = new RealParameter(new Double[] {1., 1., 1., 1.});
register(new DeltaExchangeOperator(),
"weightvector", new IntegerParameter(new Integer[] {0, 1, 2, 1}),
"parameter", parameter);
Double[] p = parameter.getValues();
assertEquals("The DeltaExchangeOperator should not change the sum of a parameter",
0*p[1]+1*p[1]+2*p[2]+1*p[3], 4, 0.00001);
}
@Test
public void testCanOperate() {
// Test whether a validly initialised operator may make proposals
State state = new State();
RealParameter parameter = new RealParameter(new Double[] { 1., 1., 1., 1. });
state.initByName("stateNode", parameter);
state.initialise();
DeltaExchangeOperator d = new DeltaExchangeOperator();
// An invalid operator should either fail in initByName or make valid
// proposals
try {
d.initByName("parameter", parameter);
} catch (RuntimeException e) {
return;
}
d.proposal();
}
}