package aima.test.core.unit.probability.util;
import java.util.LinkedHashMap;
import java.util.Map;
import org.junit.Assert;
import org.junit.Test;
import aima.core.probability.RandomVariable;
import aima.core.probability.domain.ArbitraryTokenDomain;
import aima.core.probability.domain.BooleanDomain;
import aima.core.probability.util.ProbUtil;
import aima.core.probability.util.RandVar;
public class ProbUtilTest {
@Test
public void test_indexOf() {
RandVar X = new RandVar("X", new BooleanDomain());
RandVar Y = new RandVar("Y", new ArbitraryTokenDomain("A", "B", "C"));
RandVar Z = new RandVar("Z", new BooleanDomain());
// An ordered X,Y,Z enumeration of values should look like:
// 00: true, A, true
// 01: true, A, false
// 02: true, B, true
// 03: true, B, false
// 04: true, C, true
// 05: true, C, false
// 06: false, A, true
// 07: false, A, false
// 08: false, B, true
// 09: false, B, false
// 10: false, C, true
// 11: false, C, false
RandomVariable[] vars = new RandomVariable[] { X, Y, Z };
Map<RandomVariable, Object> event = new LinkedHashMap<RandomVariable, Object>();
event.put(X, Boolean.TRUE);
event.put(Y, "A");
event.put(Z, Boolean.TRUE);
Assert.assertEquals(0, ProbUtil.indexOf(vars, event));
event.put(Z, Boolean.FALSE);
Assert.assertEquals(1, ProbUtil.indexOf(vars, event));
event.put(Y, "B");
event.put(Z, Boolean.TRUE);
Assert.assertEquals(2, ProbUtil.indexOf(vars, event));
event.put(Z, Boolean.FALSE);
Assert.assertEquals(3, ProbUtil.indexOf(vars, event));
event.put(Y, "C");
event.put(Z, Boolean.TRUE);
Assert.assertEquals(4, ProbUtil.indexOf(vars, event));
event.put(Z, Boolean.FALSE);
Assert.assertEquals(5, ProbUtil.indexOf(vars, event));
//
event.put(X, Boolean.FALSE);
event.put(Y, "A");
event.put(Z, Boolean.TRUE);
Assert.assertEquals(6, ProbUtil.indexOf(vars, event));
event.put(Z, Boolean.FALSE);
Assert.assertEquals(7, ProbUtil.indexOf(vars, event));
event.put(Y, "B");
event.put(Z, Boolean.TRUE);
Assert.assertEquals(8, ProbUtil.indexOf(vars, event));
event.put(Z, Boolean.FALSE);
Assert.assertEquals(9, ProbUtil.indexOf(vars, event));
event.put(Y, "C");
event.put(Z, Boolean.TRUE);
Assert.assertEquals(10, ProbUtil.indexOf(vars, event));
event.put(Z, Boolean.FALSE);
Assert.assertEquals(11, ProbUtil.indexOf(vars, event));
}
@Test
public void test_indexesOfValue() {
RandVar X = new RandVar("X", new BooleanDomain());
RandVar Y = new RandVar("Y", new ArbitraryTokenDomain("A", "B", "C"));
RandVar Z = new RandVar("Z", new BooleanDomain());
// An ordered X,Y,Z enumeration of values should look like:
// 00: true, A, true
// 01: true, A, false
// 02: true, B, true
// 03: true, B, false
// 04: true, C, true
// 05: true, C, false
// 06: false, A, true
// 07: false, A, false
// 08: false, B, true
// 09: false, B, false
// 10: false, C, true
// 11: false, C, false
RandomVariable[] vars = new RandomVariable[] { X, Y, Z };
Map<RandomVariable, Object> event = new LinkedHashMap<RandomVariable, Object>();
event.put(X, Boolean.TRUE);
Assert.assertArrayEquals(new int[] { 0, 1, 2, 3, 4, 5 },
ProbUtil.indexesOfValue(vars, 0, event));
event.put(X, Boolean.FALSE);
Assert.assertArrayEquals(new int[] { 6, 7, 8, 9, 10, 11 },
ProbUtil.indexesOfValue(vars, 0, event));
event.put(Y, "A");
Assert.assertArrayEquals(new int[] { 0, 1, 6, 7 },
ProbUtil.indexesOfValue(vars, 1, event));
event.put(Y, "B");
Assert.assertArrayEquals(new int[] { 2, 3, 8, 9 },
ProbUtil.indexesOfValue(vars, 1, event));
event.put(Y, "C");
Assert.assertArrayEquals(new int[] { 4, 5, 10, 11 },
ProbUtil.indexesOfValue(vars, 1, event));
event.put(Z, Boolean.TRUE);
Assert.assertArrayEquals(new int[] { 0, 2, 4, 6, 8, 10 },
ProbUtil.indexesOfValue(vars, 2, event));
event.put(Z, Boolean.FALSE);
Assert.assertArrayEquals(new int[] { 1, 3, 5, 7, 9, 11 },
ProbUtil.indexesOfValue(vars, 2, event));
}
}