/******************************************************************************* * 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 java.math.BigDecimal; import java.util.HashSet; import java.util.List; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import br.usp.poli.takiyama.acfove.AggParfactor.AggParfactorBuilder; import br.usp.poli.takiyama.cfove.StdParfactor.StdParfactorBuilder; import br.usp.poli.takiyama.common.Constraint; import br.usp.poli.takiyama.common.Marginal; import br.usp.poli.takiyama.common.Parfactor; import br.usp.poli.takiyama.common.StdMarginal.StdMarginalBuilder; import br.usp.poli.takiyama.prv.And; import br.usp.poli.takiyama.prv.Constant; 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.RandomVariableSet; import br.usp.poli.takiyama.prv.StdLogicalVariable; import br.usp.poli.takiyama.prv.StdPrv; import br.usp.poli.takiyama.utils.TestUtils; public class Temp { @Ignore @Test public void testInferenceOnExistsNode_AggregationSumOut() { int n = 2; LogicalVariable y = StdLogicalVariable.getInstance("Y", "x", n); Constant x1 = Constant.getInstance("x1"); Constant x2 = Constant.getInstance("x2"); Prv a_x1 = StdPrv.getBooleanInstance("a", x1); Prv b_x1 = StdPrv.getBooleanInstance("b", x1); Prv b_x2 = StdPrv.getBooleanInstance("b", x2); Prv e_x1 = StdPrv.getBooleanInstance("e", x1); Prv e_x2 = StdPrv.getBooleanInstance("e", x2); Prv r1_x1_y = StdPrv.getBooleanInstance("r1", x1, y); Prv r1_x2_y = StdPrv.getBooleanInstance("r1", x2, y); List<BigDecimal> fb = TestUtils.toBigDecimalList(0.1, 0.9); List<BigDecimal> fbr = TestUtils.toBigDecimalList(1.0, 0, 0.2, 0.8); List<BigDecimal> fea = TestUtils.toBigDecimalList(1.0, 0.0, 0.0, 1.0); Parfactor ga1 = new StdParfactorBuilder().variables(a_x1).build(); Parfactor ge2 = new StdParfactorBuilder().variables(e_x2).build(); Parfactor gb1 = new StdParfactorBuilder().variables(b_x1).values(fb).build(); Parfactor gb2 = new StdParfactorBuilder().variables(b_x2).values(fb).build(); Parfactor gbr1 = new StdParfactorBuilder().variables(b_x1, r1_x1_y).values(fbr).build(); Parfactor gbr2 = new StdParfactorBuilder().variables(b_x2, r1_x2_y).values(fbr).build(); Parfactor gea = new StdParfactorBuilder().variables(e_x1, a_x1).values(fea).build(); Parfactor gre1 = new AggParfactorBuilder(r1_x1_y, e_x1, Or.OR).context(b_x1).build(); Parfactor gre2 = new AggParfactorBuilder(r1_x2_y, e_x2, Or.OR).context(b_x2).build(); RandomVariableSet query = RandomVariableSet.getInstance(a_x1, new HashSet<Constraint>(0)); Marginal input = new StdMarginalBuilder().parfactors(ga1, ge2, gb1, gb2, gbr1, gbr2, gea, gre1, gre2).preservable(query).build(); ACFOVE acfove = new ACFOVE(input); Parfactor result = acfove.run(); System.out.print(result); } @Ignore @Test public void testInferenceOnExistsNode_AnotherAggregationSumOut() { int n = 2; LogicalVariable y = StdLogicalVariable.getInstance("Y", "x", n); Constant x1 = Constant.getInstance("x1"); Constant x2 = Constant.getInstance("x2"); Prv a_x1 = StdPrv.getBooleanInstance("a", x1); Prv b_x2 = StdPrv.getBooleanInstance("b", x2); Prv e_x2 = StdPrv.getBooleanInstance("e", x2); Prv r1_x2_y = StdPrv.getBooleanInstance("r1", x2, y); List<BigDecimal> fa = TestUtils.toBigDecimalList(0.1360, 0.8640); List<BigDecimal> fb = TestUtils.toBigDecimalList(0.1, 0.9); List<BigDecimal> fbr = TestUtils.toBigDecimalList(1.0, 0, 0.2, 0.8); Parfactor ga1 = new StdParfactorBuilder().variables(a_x1).build(); Parfactor ga12 = new StdParfactorBuilder().variables(a_x1).values(fa).build(); Parfactor ge2 = new StdParfactorBuilder().variables(e_x2).build(); Parfactor gb2 = new StdParfactorBuilder().variables(b_x2).values(fb).build(); Parfactor gbr2 = new StdParfactorBuilder().variables(b_x2, r1_x2_y).values(fbr).build(); Parfactor gre2 = new AggParfactorBuilder(r1_x2_y, e_x2, Or.OR).context(b_x2).build(); RandomVariableSet query = RandomVariableSet.getInstance(a_x1, new HashSet<Constraint>(0)); Marginal input = new StdMarginalBuilder().parfactors(ga1, ga12, ge2, gb2, gbr2, gre2).preservable(query).build(); ACFOVE acfove = new ACFOVE(input); Parfactor result = acfove.run(); System.out.print(result); } @Ignore @Test public void testInferenceOnExistsNode() { int n = 2; LogicalVariable x = StdLogicalVariable.getInstance("X", "x", n); LogicalVariable y = StdLogicalVariable.getInstance("Y", "x", n); Constant x1 = Constant.getInstance("x1"); Prv a = StdPrv.getBooleanInstance("a", x); Prv a1 = StdPrv.getBooleanInstance("a", x1); Prv b = StdPrv.getBooleanInstance("b", y); Prv e = StdPrv.getBooleanInstance("e", x); Prv r = StdPrv.getBooleanInstance("r", x, y); Prv r1 = StdPrv.getBooleanInstance("r1", x, y); List<BigDecimal> fb = TestUtils.toBigDecimalList(0.1, 0.9); List<BigDecimal> fr = TestUtils.toBigDecimalList(0.2, 0.8); List<BigDecimal> fr1 = TestUtils.toBigDecimalList(1, 0, 1, 0, 1, 0, 0, 1); List<BigDecimal> fa = TestUtils.toBigDecimalList(1, 0, 0, 1); Parfactor gb = new StdParfactorBuilder().variables(b).values(fb).build(); Parfactor gr = new StdParfactorBuilder().variables(r).values(fr).build(); Parfactor gr1 = new StdParfactorBuilder().variables(b, r, r1).values(fr1).build(); //Parfactor ge = new AggParfactorBuilder(r1, e, Or.OR).context(b).build(); Parfactor ge = new AggParfactorBuilder(r1, e, Or.OR).build(); Parfactor ga = new StdParfactorBuilder().variables(e, a).values(fa).build(); RandomVariableSet query = RandomVariableSet.getInstance(a1, new HashSet<Constraint>(0)); Marginal input = new StdMarginalBuilder().parfactors(gb, gr, gr1, ge, ga).preservable(query).build(); ACFOVE acfove = new ACFOVE(input); Parfactor result = acfove.run(); System.out.print(result); } @Ignore @Test public void testInferenceOnWellBehavedTerminology() { } @Ignore("Generates a very large parfactor, causing out of memory error") @Test public void testInferenceOnTestTerminology() { int n = 3; LogicalVariable x = StdLogicalVariable.getInstance("X", "x", n); LogicalVariable y = StdLogicalVariable.getInstance("Y", "x", n); Constant x1 = Constant.getInstance("x1"); Prv a = StdPrv.getBooleanInstance("a", x); Prv b = StdPrv.getBooleanInstance("b", x); Prv c = StdPrv.getBooleanInstance("c", x); Prv d = StdPrv.getBooleanInstance("d", x); Prv e = StdPrv.getBooleanInstance("e", x); Prv f = StdPrv.getBooleanInstance("f", x); Prv r = StdPrv.getBooleanInstance("r", x, y); Prv r1 = StdPrv.getBooleanInstance("r1", x, y); Prv r2 = StdPrv.getBooleanInstance("r2", x, y); Prv c1 = StdPrv.getBooleanInstance("c", x1); List<BigDecimal> f1 = TestUtils.toBigDecimalList(0.1, 0.9); List<BigDecimal> f2 = TestUtils.toBigDecimalList(1.0, 0.0, 0.55, 0.45); List<BigDecimal> f3 = TestUtils.toBigDecimalList(1, 0, 0, 1, 0, 1, 0, 1); List<BigDecimal> f5 = TestUtils.toBigDecimalList(1, 0, 0, 1); List<BigDecimal> f7 = TestUtils.toBigDecimalList(0, 1, 1, 0, 0, 1, 0, 1); List<BigDecimal> f8 = TestUtils.toBigDecimalList(0.7, 0.3); List<BigDecimal> f9 = TestUtils.toBigDecimalList(1, 0, 1, 0, 1, 0, 0, 1); Parfactor g1 = new StdParfactorBuilder().variables(a).values(f1).build(); Parfactor g2 = new StdParfactorBuilder().variables(a, b).values(f2).build(); Parfactor g3 = new StdParfactorBuilder().variables(b, e, c).values(f3).build(); // Parfactor g4 = new AggParfactorBuilder(r1, f, And.AND).context(a).build(); Parfactor g4 = new AggParfactorBuilder(r1, f, And.AND).build(); Parfactor g5 = new StdParfactorBuilder().variables(f, d).values(f5).build(); // Parfactor g6 = new AggParfactorBuilder(r2, e, Or.OR).context(d).build(); Parfactor g6 = new AggParfactorBuilder(r2, e, Or.OR).build(); Parfactor g7 = new StdParfactorBuilder().variables(a, r, r1).values(f7).build(); Parfactor g8 = new StdParfactorBuilder().variables(r).values(f8).build(); Parfactor g9 = new StdParfactorBuilder().variables(d, r, r2).values(f9).build(); // Fix this later: shatter against query should work for c(x1) // Set<Constraint> constraints = new HashSet<Constraint>(n - 1); // for (int i = 1; i < n; i++) { // Term individual = x.population().individualAt(i); // Constraint constraint = InequalityConstraint.getInstance(x, individual); // constraints.add(constraint); // } RandomVariableSet query = RandomVariableSet.getInstance(c1, new HashSet<Constraint>(0)); Marginal input = new StdMarginalBuilder().parfactors(g1, g2, g3, g4, g5, g6, g7, g8, g9).preservable(query).build(); ACFOVE acfove = new ACFOVE(input); Parfactor result = acfove.run(); System.out.print(result); // try { // ACFOVE acfove = new LoggedACFOVE(input); // Parfactor result = acfove.run(); // } catch (IOException exception) { // exception.printStackTrace(); // System.exit(-1); // } } @Ignore @Test public void testInferenceOnExistsNodeSimplified() { int n = 3; LogicalVariable x = StdLogicalVariable.getInstance("X", "x", n); LogicalVariable y = StdLogicalVariable.getInstance("Y", "x", n); Prv b = StdPrv.getBooleanInstance("b", y); Prv e = StdPrv.getBooleanInstance("e", x); Prv r = StdPrv.getBooleanInstance("r", x, y); Prv r1 = StdPrv.getBooleanInstance("r'", x, y); List<BigDecimal> fb = TestUtils.toBigDecimalList(0.1, 0.9); List<BigDecimal> fr = TestUtils.toBigDecimalList(0.2, 0.8); List<BigDecimal> fr1 = TestUtils.toBigDecimalList(1, 0, 1, 0, 1, 0, 0, 1); Parfactor gb = new StdParfactorBuilder().variables(b).values(fb).build(); Parfactor gr = new StdParfactorBuilder().variables(r).values(fr).build(); Parfactor gr1 = new StdParfactorBuilder().variables(b, r, r1).values(fr1).build(); Parfactor ge = new AggParfactorBuilder(r1, e, Or.OR).build(); RandomVariableSet query = RandomVariableSet.getInstance(e, new HashSet<Constraint>(0)); Marginal input = new StdMarginalBuilder().parfactors(gb, gr, gr1, ge).preservable(query).build(); ACFOVE acfove = new ACFOVE(input); Parfactor result = acfove.run(); System.out.print(result); } @Test @Ignore public void testSumOut1() { int n = 2; LogicalVariable x = StdLogicalVariable.getInstance("X", "x", n); LogicalVariable y = StdLogicalVariable.getInstance("Y", "x", n); Prv b = StdPrv.getBooleanInstance("b", y); Prv e = StdPrv.getBooleanInstance("e", x); Prv r1 = StdPrv.getBooleanInstance("r'", x, y); List<BigDecimal> fb = TestUtils.toBigDecimalList(0.2, 0.8); Parfactor gb = new StdParfactorBuilder().variables(b).values(fb).build(); double pr = 0; List<BigDecimal> f = TestUtils.toBigDecimalList(1.0, pr, 0.0, 1 - pr); Parfactor ge = new AggParfactorBuilder(r1, e, Or.OR).context(b).values(f).build(); Parfactor result = ge.sumOut(r1); result = result.multiply(gb); System.out.print(result); } @Test @Ignore public void testIncrement() { for (int i = 1; i < 10001; i = i + inc2(i)) { System.out.println(i); } } private int inc(int i) { int e = (int) Math.log10(i); int r = (int) Math.pow(10.0, (double) e); return r; } private int inc2(int i) { int r = (int) Math.pow(10.0, (int) Math.log10(i)); return r; } @Test public void smallMath() { System.out.println(500*1073741824); //System.out.println( ((int) Math.pow(2, 30))); } }