/******************************************************************************* * Copyright 2014 Felipe Takiyama * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package br.usp.poli.takiyama.acfove; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.IsEqual.equalTo; import static org.hamcrest.core.IsInstanceOf.instanceOf; import static org.hamcrest.core.IsNot.not; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assume.assumeThat; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Set; import org.junit.Test; import org.junit.experimental.runners.Enclosed; import org.junit.experimental.theories.DataPoints; import org.junit.experimental.theories.Theories; import org.junit.experimental.theories.Theory; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import br.usp.poli.takiyama.acfove.AggParfactor.AggParfactorBuilder; import br.usp.poli.takiyama.cfove.StdParfactor.StdParfactorBuilder; import br.usp.poli.takiyama.common.AggregationParfactor; import br.usp.poli.takiyama.common.Constraint; import br.usp.poli.takiyama.common.Distribution; import br.usp.poli.takiyama.common.Factor; import br.usp.poli.takiyama.common.InequalityConstraint; import br.usp.poli.takiyama.common.InputOutput; import br.usp.poli.takiyama.common.Parfactor; import br.usp.poli.takiyama.common.SplitResult; import br.usp.poli.takiyama.common.StdDistribution; import br.usp.poli.takiyama.common.StdFactor; import br.usp.poli.takiyama.prv.Binding; import br.usp.poli.takiyama.prv.Constant; import br.usp.poli.takiyama.prv.CountingFormula; import br.usp.poli.takiyama.prv.LogicalVariable; import br.usp.poli.takiyama.prv.Or; import br.usp.poli.takiyama.prv.Prv; import br.usp.poli.takiyama.prv.StdLogicalVariable; import br.usp.poli.takiyama.prv.StdPrv; import br.usp.poli.takiyama.prv.Substitution; import br.usp.poli.takiyama.prv.Term; import br.usp.poli.takiyama.utils.Lists; import br.usp.poli.takiyama.utils.MathUtils; import br.usp.poli.takiyama.utils.Sets; @RunWith(Enclosed.class) public class AggParfactorTest { @RunWith(Theories.class) public static class SplitTestUsingTheory { private static LogicalVariable a = StdLogicalVariable.getInstance("A", "x", 10); private static LogicalVariable b = StdLogicalVariable.getInstance("B", "x", 10); private static Prv p = StdPrv.getBooleanInstance("p", a, b); private static Prv c = StdPrv.getBooleanInstance("c", b); private static Prv cPrime = c.rename("c'"); private static Prv v = StdPrv.getBooleanInstance("v", a); private static Prv u = StdPrv.getBooleanInstance("u", b); @DataPoints public static Parfactor[] data() { Constant x2 = Constant.getInstance("x2"); Constraint a_x2 = InequalityConstraint.getInstance(a, x2); Constraint b_x2 = InequalityConstraint.getInstance(b, x2); return new Parfactor[] { new AggParfactorBuilder(p, c, Or.OR).build(), new AggParfactorBuilder(p, c, Or.OR).constraints(a_x2, b_x2).build(), new AggParfactorBuilder(p, c, Or.OR).context(v, u).build(), new AggParfactorBuilder(p, c, Or.OR).context(v, u).constraints(a_x2, b_x2).build() }; } @DataPoints public static Substitution[] substitutions() { Constant x1 = Constant.getInstance("x1"); return new Substitution[] { Substitution.getInstance(Binding.getInstance(b, x1)), Substitution.getInstance(Binding.getInstance(a, x1)), Substitution.getInstance(Binding.getInstance(a, b)), Substitution.getInstance(Binding.getInstance(b, a)) }; } @Theory public void testSplitNotOnExtra(Parfactor parfactor, Substitution s) { assumeThat(parfactor, instanceOf(AggregationParfactor.class)); Term extraVar = ((AggregationParfactor) parfactor).extraVariable(); assumeThat(s.has(extraVar), is(false)); Parfactor result = parfactor.apply(s); Constraint c = s.first().toInequalityConstraint(); Parfactor residue = new AggParfactorBuilder((AggregationParfactor) parfactor).constraint(c).build(); SplitResult splitResult = SplitResult.getInstance(result, residue); assertThat(parfactor.splitOn(s), equalTo(splitResult)); } @Theory public void testSplitInvolvingExtra(Parfactor parfactor, Substitution s) { assumeThat(parfactor, instanceOf(AggregationParfactor.class)); AggregationParfactor ag = (AggregationParfactor) parfactor; Term extraVar = ag.extraVariable(); assumeThat(s.has(extraVar), is(true)); Prv newP = p.apply(s); Set<Constraint> constraints = Sets.apply(s, parfactor.constraints()); List<Prv> prvs = Lists.listOf(ag.context()); prvs.add(0, newP); prvs.add(cPrime); prvs.add(c); // not quite right to put in a Theory double [] vals = new double[getSize(prvs)]; if (ag.context().isEmpty()) { vals[0] = 1.0; vals[1] = 0.0; vals[2] = 0.0; vals[3] = 1.0; vals[4] = 0.0; vals[5] = 1.0; vals[6] = 0.0; vals[7] = 1.0; } else { vals[0] = 1.0; vals[1] = 0.0; vals[2] = 0.0; vals[3] = 1.0; vals[4] = 1.0; vals[5] = 0.0; vals[6] = 0.0; vals[7] = 1.0; vals[8] = 1.0; vals[9] = 0.0; vals[10] = 0.0; vals[11] = 1.0; vals[12] = 1.0; vals[13] = 0.0; vals[14] = 0.0; vals[15] = 1.0; vals[16] = 0.0; vals[17] = 1.0; vals[18] = 0.0; vals[19] = 1.0; vals[20] = 0.0; vals[21] = 1.0; vals[22] = 0.0; vals[23] = 1.0; vals[24] = 0.0; vals[25] = 1.0; vals[26] = 0.0; vals[27] = 1.0; vals[28] = 0.0; vals[29] = 1.0; vals[30] = 0.0; vals[31] = 1.0; } Parfactor result = new StdParfactorBuilder().constraints(constraints) .variables(prvs).values(vals).build(); Constraint c = s.first().toInequalityConstraint(); Parfactor residue = new AggParfactorBuilder(ag).constraint(c).child(cPrime).build(); SplitResult splitResult = SplitResult.getInstance(result, residue); assertThat(parfactor.splitOn(s), equalTo(splitResult)); } private int getSize(List<Prv> prvs) { int size = 1; for (Prv var : prvs) { size = size * var.range().size(); } return size; } } public static class MultiplicationTest { private static LogicalVariable a = StdLogicalVariable.getInstance("A", "x", 100); private static LogicalVariable b = StdLogicalVariable.getInstance("B", "x", 100); private static LogicalVariable person = StdLogicalVariable.getInstance("Person", "p", 100); private static Prv played = StdPrv.getBooleanInstance("played", person); private static Prv matched6 = StdPrv.getBooleanInstance("matched_6", person); private static Prv jackpotWon = StdPrv.getBooleanInstance("jackpot_won"); private static Prv bigJackpot = StdPrv.getBooleanInstance("big_jackpot"); private static Prv p = StdPrv.getBooleanInstance("p", a, b); private static Prv c = StdPrv.getBooleanInstance("c", b); private static Prv v = StdPrv.getBooleanInstance("v", a); private static Prv u = StdPrv.getBooleanInstance("u", b); private static Constant x1 = Constant.getInstance("x1"); private static Constant x2 = Constant.getInstance("x2"); private static Constant x3 = Constant.getInstance("x3"); private static Constraint a_x1 = InequalityConstraint.getInstance(a, x1); private static Constraint a_x2 = InequalityConstraint.getInstance(a, x2); private static Constraint a_b = InequalityConstraint.getInstance(a, b); private static Constraint b_x1 = InequalityConstraint.getInstance(b, x1); private static Constraint b_x3 = InequalityConstraint.getInstance(b, x3); private static double [] f1 = {0.1234, 0.9876}; private static Parfactor g1 = new StdParfactorBuilder() .constraints(a_x1, a_x2, a_b, b_x3).variables(p).values(f1).build(); private static double [] f2 = {0.5425, 0.6832}; private static Parfactor g2 = new AggParfactorBuilder(p, c, Or.OR) .constraints(a_x1, a_x2, a_b, b_x3).values(f2).build(); /** * Multiplies * <p> * g1 = ⟨ {A≠x1,A≠x2,A≠B,B≠x3}, {p(A,B)}, F1 ⟩ * </p> * with * <p> * g2 = ⟨ {B≠x3}, p(A,B), c(B), F2, OR, {A≠x1,A≠x2,A≠B} ⟩ * </p> * <p> * The result is * g3 = ⟨ {B≠x3}, p(A,B), c(B), F1⊙F2, OR, {A≠x1,A≠x2,A≠B} ⟩ * </p> */ @Test public void testMultiplication() { Parfactor result = g2.multiply(g1); List<BigDecimal> f3 = new ArrayList<BigDecimal>(2); f3.add(BigDecimal.valueOf(f1[0]).multiply(BigDecimal.valueOf(f2[0]), MathUtils.CONTEXT)); f3.add(BigDecimal.valueOf(f1[1]).multiply(BigDecimal.valueOf(f2[1]), MathUtils.CONTEXT)); Parfactor answer = new AggParfactorBuilder(p, c, Or.OR) .constraints(a_x1, a_x2, a_b, b_x3).values(f3).build(); assertEquals(result, answer); } /** * Example 3.12 from Kisynski (2010). * <p> * Given the set of parfactors * </p> * <p> * Φ = {<br> * ⟨ ∅, {played(Person)}, Fplayed ⟩,<br> * ⟨ ∅, {played(Person), matched_6(Person}, Fmatched_6 ⟩,<br> * ⟨ ∅, matched_6(Person), jackpot_won(Person), 1, OR, ∅ ⟩ }, * </p> * <p> * we want to calculate J<sub>ground(jackpot_won())</sub>(Φ). * </p> * <p> * The partial result in the calculation is parfactor * ⟨ ∅, matched_6(Person), jackpot_won(Person), F, OR, ∅ ⟩, * where * F = 1 ⊙ ∑<sub>played(Person)</sub>(Fplayed ⊙ Fmatched_6). * </p> */ @Test public void testTrivialMultiplication() { double [] fPlayed = {0.95, 0.05}; Parfactor g1 = new StdParfactorBuilder().variables(played) .values(fPlayed).build(); double [] fMatched = {1.0, 0.0, 0.99999993, 0.00000007}; Parfactor g2 = new StdParfactorBuilder() .variables(played, matched6).values(fMatched).build(); Parfactor g3 = new AggParfactorBuilder(matched6, jackpotWon, Or.OR) .build(); Parfactor result = g1.multiply(g2).sumOut(played).multiply(g3); double [] fSum = {0.9999999965, 0.0000000035}; Parfactor expected = new AggParfactorBuilder(matched6, jackpotWon, Or.OR) .values(fSum).build(); assertEquals(result, expected); } /** * Performs g1 * g2 and g2 * g1 and check if the results are the same. * To pass the test we must have g1 * g2 = g2 * g1 */ @Test public void testMultiplicationCommutativity() { Parfactor direct = g2.multiply(g1); Parfactor inverse = g1.multiply(g2); assertEquals(direct, inverse); } // TODO I can use Theory here @Test public void testMultiplicationCheck() { assertTrue(g1.isMultipliable(g1) && g1.isMultipliable(g2) && g2.isMultipliable(g1) && !g2.isMultipliable(g2)); } @Test public void testGeneralizedMultiplication() { Parfactor g4 = new AggParfactorBuilder(matched6, jackpotWon, Or.OR).context(bigJackpot).build(); double [] fMatched6 = { 0.9999999965, 0.999999989, 0.0000000035, 0.000000011 }; Parfactor g5 = new StdParfactorBuilder().variables(matched6, bigJackpot).values(fMatched6).build(); Parfactor product = g4.multiply(g5); Parfactor expected = new AggParfactorBuilder(matched6, jackpotWon, Or.OR).context(bigJackpot).values(fMatched6).build(); assertEquals(expected, product); } @Test public void testAnotherGeneralizedMultiplication() { // using BigDecimal due to precision problems with double int size = 8; List<BigDecimal> fpv = new ArrayList<BigDecimal>(size); List<BigDecimal> fr = new ArrayList<BigDecimal>(size); for (int i = 0; i < size; i++) { fpv.add(BigDecimal.valueOf(i / 10.0)); fr.add(fpv.get(i).multiply(fpv.get(i), MathUtils.CONTEXT)); } Parfactor g1 = new StdParfactorBuilder().constraints(a_x2, b_x1).variables(p, v, u).values(fpv).build(); Parfactor ga = new AggParfactorBuilder(p, c, Or.OR).constraints(a_x2, b_x1).context(v, u).values(fpv).build(); Parfactor product = g1.multiply(ga); Parfactor expected = new AggParfactorBuilder(p, c, Or.OR).constraints(a_x2, b_x1).context(v, u).values(fr).build(); assertEquals(expected, product); } } public static class SumOutTest { // TODO use theory private final static LogicalVariable person = StdLogicalVariable.getInstance("Person", "p", 5); private final static Prv matched6 = StdPrv.getBooleanInstance("matched_6", person); private final static Prv jackpotWon = StdPrv.getBooleanInstance("jackpot_won"); private final static Prv bigJackpot = StdPrv.getBooleanInstance("big_jackpot"); private final static double [] fSum = {0.9999999965, 0.0000000035}; private final static Parfactor g1 = new AggParfactorBuilder(matched6, jackpotWon, Or.OR).values(fSum).build(); @Test public void testSimpleSumOut() { // not elegant, but more readable BigDecimal [] f0 = new BigDecimal[2]; BigDecimal [] f1 = new BigDecimal[2]; BigDecimal [] f2 = new BigDecimal[2]; f0[0] = BigDecimal.valueOf(fSum[0]); f0[1] = BigDecimal.valueOf(fSum[1]); f1[0] = f0[0].multiply(f0[0], MathUtils.CONTEXT); f1[1] = f0[0].multiply(f0[1], MathUtils.CONTEXT).add(f0[1].multiply(f0[0], MathUtils.CONTEXT), MathUtils.CONTEXT).add(f0[1].multiply(f0[1], MathUtils.CONTEXT), MathUtils.CONTEXT); f2[0] = BigDecimal.valueOf(fSum[0]).multiply(f1[0], MathUtils.CONTEXT).multiply(f1[0], MathUtils.CONTEXT); f2[1] = BigDecimal.valueOf(fSum[0]).multiply(f1[0], MathUtils.CONTEXT).multiply(f1[1], MathUtils.CONTEXT) .add(BigDecimal.valueOf(fSum[0]).multiply(f1[1], MathUtils.CONTEXT).multiply(f1[0], MathUtils.CONTEXT), MathUtils.CONTEXT) .add(BigDecimal.valueOf(fSum[0]).multiply(f1[1], MathUtils.CONTEXT).multiply(f1[1], MathUtils.CONTEXT), MathUtils.CONTEXT) .add(BigDecimal.valueOf(fSum[1]).multiply(f1[0], MathUtils.CONTEXT).multiply(f1[0], MathUtils.CONTEXT), MathUtils.CONTEXT) .add(BigDecimal.valueOf(fSum[1]).multiply(f1[0], MathUtils.CONTEXT).multiply(f1[1], MathUtils.CONTEXT), MathUtils.CONTEXT) .add(BigDecimal.valueOf(fSum[1]).multiply(f1[1], MathUtils.CONTEXT).multiply(f1[0], MathUtils.CONTEXT), MathUtils.CONTEXT) .add(BigDecimal.valueOf(fSum[1]).multiply(f1[1], MathUtils.CONTEXT).multiply(f1[1], MathUtils.CONTEXT), MathUtils.CONTEXT); Parfactor expected = new StdParfactorBuilder().variables(jackpotWon).values(f2).build(); Parfactor result = g1.sumOut(matched6); assertEquals(expected, result); } @Test public void testGeneralizedSumOut() { double [] fMatched6 = { 0.9999999965, 0.999999989, 0.0000000035, 0.000000011 }; Parfactor g6 = new AggParfactorBuilder(matched6, jackpotWon, Or.OR).context(bigJackpot).values(fMatched6).build(); Parfactor result = round(g6.sumOut(matched6), 10); // Im here!!!!! this list is not accurate double [] fJackpotWon = { 0.9999999825, 0.9999999450, 0.0000000175, 0.0000000550 }; Parfactor expected = new StdParfactorBuilder().variables(jackpotWon, bigJackpot).values(fJackpotWon).build(); assertEquals(expected, result); } /** * Returns the specified parfactor with values rounded to the specified * scale. */ private Parfactor round(Parfactor parfactor, int scale) { List<BigDecimal> rounded = new ArrayList<BigDecimal>(parfactor.factor().values()); for (BigDecimal number : rounded) { int index = rounded.indexOf(number); rounded.set(index, number.setScale(scale, BigDecimal.ROUND_HALF_EVEN)); } Factor roundedFactor = StdFactor.getInstance("", parfactor.prvs(), rounded); return new StdParfactorBuilder().constraints(parfactor.constraints()).factor(roundedFactor).build(); } } @RunWith(Theories.class) public static class ConversionTest { // Using Integer because JUnit seems to have a bug when using int[] @DataPoints public static final Integer[] populationSize() { Integer[] sizes = new Integer[20]; for (int i = 0; i < sizes.length; i++) { sizes[i] = i; } return sizes; } @Theory public void testSimpleConversion(Integer popSize) { // Ugly, but I could not use int directly int populationSize = popSize.intValue(); assumeThat(populationSize, not(0)); LogicalVariable person = StdLogicalVariable.getInstance("Person", "p", populationSize); Prv matched6 = StdPrv.getBooleanInstance("matched_6", person); Prv jackpotWon = StdPrv.getBooleanInstance("jackpot_won"); Prv matched6counted = CountingFormula.getInstance(person, matched6); AggregationParfactor input = new AggParfactorBuilder(matched6, jackpotWon, Or.OR).build(); double [] f = new double[2 * (populationSize + 1)]; f[0] = 1.0; f[1] = 0.0; for (int i = 2; i < f.length; i++) { f[i] = (double)(i % 2); } Parfactor answer1 = new StdParfactorBuilder().variables(matched6counted, jackpotWon).values(f).build(); Parfactor answer2 = new StdParfactorBuilder().variables(matched6).build(); Distribution answer = StdDistribution.of(answer1, answer2); Distribution result = input.toStdParfactors(); assertThat(result, equalTo(answer)); } @Theory public void testSimpleGeneralizedConversion(Integer popSize) { int populationSize = popSize.intValue(); assumeThat(populationSize, not(0)); assumeThat(populationSize, not(1)); LogicalVariable lva = StdLogicalVariable.getInstance("A", "x", populationSize); LogicalVariable lvb = StdLogicalVariable.getInstance("B", "x", populationSize); LogicalVariable lvc = StdLogicalVariable.getInstance("C", "x", populationSize); LogicalVariable lvd = StdLogicalVariable.getInstance("D", "x", populationSize); LogicalVariable lve = StdLogicalVariable.getInstance("E", "x", populationSize); Constant x1 = Constant.getInstance("x1"); Constant x2 = Constant.getInstance("x2"); Constraint a_x2 = InequalityConstraint.getInstance(lva, x2); Constraint b_x1 = InequalityConstraint.getInstance(lvb, x1); Prv p = StdPrv.getBooleanInstance("p", lva, lvb); Prv c = StdPrv.getBooleanInstance("c", lvb); Prv v = StdPrv.getBooleanInstance("v", lvc); Prv u = StdPrv.getBooleanInstance("u", lvd, lve); Prv cf = CountingFormula.getInstance(lva, p, a_x2); List<BigDecimal> fpv = new ArrayList<BigDecimal>(8); for (int i = 0; i < 8; i++) { fpv.add(BigDecimal.valueOf(i / 10.0)); } List<BigDecimal> fr = new ArrayList<BigDecimal>(8 * populationSize); Lists.fill(fr, BigDecimal.ONE, 4); Lists.fill(fr, BigDecimal.ZERO, 4); for (int i = 1; i < populationSize; i++) { Lists.fill(fr, BigDecimal.ZERO, 4); Lists.fill(fr, BigDecimal.ONE, 4); } AggregationParfactor input = new AggParfactorBuilder(p, c, Or.OR).constraints(b_x1, a_x2).context(v, u).values(fpv).build(); Parfactor ans1 = new StdParfactorBuilder().constraints(a_x2, b_x1).variables(p, v, u).values(fpv).build(); Parfactor ans2 = new StdParfactorBuilder().constraints(b_x1).variables(cf, c, v, u).values(fr).build(); Distribution answer = StdDistribution.of(ans1, ans2); Distribution result = input.toStdParfactors(); assertThat(result, equalTo(answer)); } } @RunWith(Parameterized.class) public static class SimplificationTest { private static int populationSize = 3; private static LogicalVariable a = StdLogicalVariable.getInstance("A", "x", populationSize); private static LogicalVariable b = StdLogicalVariable.getInstance("B", "x", populationSize); private static LogicalVariable e = StdLogicalVariable.getInstance("E", "x", populationSize); private static Constant x1 = Constant.getInstance("x1"); private static Constant x2 = Constant.getInstance("x2"); private static Constant x3 = Constant.getInstance("x3"); private static Prv p = StdPrv.getBooleanInstance("p", a, b); private static Prv p_a_x3 = StdPrv.getBooleanInstance("p", a, x3); private static Prv p_x2_x3 = StdPrv.getBooleanInstance("p", x2, x3); private static Prv c = StdPrv.getBooleanInstance("c", b); private static Prv c_x3 = StdPrv.getBooleanInstance("c", x3); private static Prv c_b_e = StdPrv.getBooleanInstance("c", b, e); private static Prv c_x3_e = StdPrv.getBooleanInstance("c", x3, e); private static Prv h = StdPrv.getBooleanInstance("h", b); private static Prv h_x3 = StdPrv.getBooleanInstance("h", x3); private static Constraint a_x1 = InequalityConstraint.getInstance(a, x1); private static Constraint a_b = InequalityConstraint.getInstance(a, b); private static Constraint b_x1 = InequalityConstraint.getInstance(b, x1); private static Constraint b_x2 = InequalityConstraint.getInstance(b, x2); private static Constraint e_x1 = InequalityConstraint.getInstance(e, x1); private static List<BigDecimal> vals = new ArrayList<BigDecimal>(); @Parameters public static Collection<Object[]> data() { InputOutput<Parfactor, Parfactor> inOut = InputOutput.getInstance(); // test 1 Parfactor in = new AggParfactorBuilder(p, c, Or.OR).constraints(b_x1, b_x2).build(); Parfactor out = new AggParfactorBuilder(p_a_x3, c_x3, Or.OR).build(); inOut.add(in, out); // test 2 vals = Lists.listOf( BigDecimal.valueOf(0.2), BigDecimal.valueOf(0.3)); in = new AggParfactorBuilder(p, c, Or.OR).constraints(b_x1, b_x2, a_b, a_x1).values(vals).build(); vals = Lists.listOf( BigDecimal.valueOf(0.2), BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.valueOf(0.3)); out = new StdParfactorBuilder().variables(p_x2_x3, c_x3).values(vals).build(); inOut.add(in, out); // test 3 vals = Lists.listOf( BigDecimal.valueOf(0.2), BigDecimal.valueOf(0.3)); in = new AggParfactorBuilder(p, c_b_e, Or.OR).constraints(b_x1, b_x2, a_b, a_x1, e_x1).values(vals).build(); vals = Lists.listOf( MathUtils.pow(BigDecimal.valueOf(0.2), 1, 2), BigDecimal.ZERO, BigDecimal.ZERO, MathUtils.pow(BigDecimal.valueOf(0.3), 1, 2)); out = new StdParfactorBuilder().constraints(e_x1).variables(p_x2_x3, c_x3_e).values(vals).build(); inOut.add(in, out); // test 4 vals = Lists.listOf( BigDecimal.valueOf(0.2), BigDecimal.valueOf(0.3), BigDecimal.valueOf(0.5), BigDecimal.valueOf(0.7)); in = new AggParfactorBuilder(p, c, Or.OR).constraints(b_x1, b_x2).context(h).values(vals).build(); out = new AggParfactorBuilder(p_a_x3, c_x3, Or.OR).context(h_x3).values(vals).build(); inOut.add(in, out); return inOut.toCollection(); } private Parfactor input; private Parfactor expected; public SimplificationTest(Parfactor input, Parfactor expected) { this.input = input; this.expected = expected; } @Test public void testSimplicationOfLogicalVariables() { Parfactor result = input.simplifyLogicalVariables(); assertEquals(expected, result); } } }