package com.juliasoft.beedeedee.factories; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.BufferedWriter; import java.io.IOException; import java.io.StringWriter; import net.sf.javabdd.BDD; import net.sf.javabdd.BDDFactory; import net.sf.javabdd.BDDPairing; import net.sf.javabdd.JFactory; import org.junit.Before; import org.junit.Test; public class JavaBDDAdapterFactoryTest { /** wrapper factory */ private BDDFactory factory; /** original JavaBDD java factory */ private BDDFactory jfactory; @Before public void setUp() { factory = JavaBDDAdapterFactory.init(100, 10); factory.setVarNum(10); jfactory = JFactory.init(100, 10); jfactory.setVarNum(10); } @Test public void test() { BDD x0 = factory.ithVar(0); BDD x1 = factory.ithVar(1); BDD and = x0.and(x1); and.satOne().printSet(); BDD xor = x0.xor(x1); xor.printSet(); } @Test public void testNodeCount() { BDD x0 = jfactory.ithVar(0); BDD x1 = jfactory.ithVar(1); BDD myX0 = factory.ithVar(0); BDD myX1 = factory.ithVar(1); BDD and = x0.and(x1); BDD myAnd = myX0.and(myX1); assertEquals(and.nodeCount(), myAnd.nodeCount()); BDD xor = x0.xor(x1); BDD myXor = myX0.xor(myX1); assertEquals(xor.nodeCount(), myXor.nodeCount()); assertEquals(0, factory.zero().nodeCount()); assertEquals(0, factory.one().nodeCount()); } //@Test private void testReplace() { BDD x0 = jfactory.ithVar(0); BDD x1 = jfactory.ithVar(1); BDD myX0 = factory.ithVar(0); BDD myX1 = factory.ithVar(1); // adapter BDD myAnd = myX0.and(myX1); BDDPairing pair = factory.makePair(); pair.set(0, 2); pair.set(1, 4); myAnd.replaceWith(pair); // JFactory BDD and = x0.and(x1); pair = jfactory.makePair(); pair.set(0, 2); pair.set(1, 4); and.replaceWith(pair); assertBDDEquals(myAnd, and); } /** * Asserts that two bdds are the same. * @param myBdd an adapter's bdd * @param bdd a JFactory bdd */ public void assertBDDEquals(BDD myBdd, BDD bdd) { StringWriter sw = new StringWriter(), mySw = new StringWriter(); try (BufferedWriter myOut = new BufferedWriter(mySw)) { factory.save(myOut, myBdd); } catch (IOException e) { e.printStackTrace(); return; } try (BufferedWriter out = new BufferedWriter(sw)) { jfactory.save(out, bdd); } catch (IOException e) { e.printStackTrace(); return; } // System.out.println(mySw); // System.out.println(sw); assertEquals(mySw.toString(), sw.toString()); } @Test public void testEquals() { BDD x0 = jfactory.ithVar(0); BDD x1 = jfactory.ithVar(1); BDD myX0 = factory.ithVar(0); BDD myX1 = factory.ithVar(1); BDD and = x0.and(x1); BDD invAnd = x1.and(x0); assertTrue(and.equals(invAnd)); BDD myAnd = myX0.and(myX1); BDD myInvAnd = myX1.and(myX0); assertTrue(myAnd.equals(myInvAnd)); } @Test public void testExist() { BDD x0 = jfactory.ithVar(0); BDD x1 = jfactory.ithVar(1); BDD x2 = jfactory.ithVar(2); BDD bdd = x0.and(x1).or(x2); // System.out.println(bdd); BDD var = x1.and(x2); // System.out.println(bdd.exist(var)); } @Test public void testIte() { BDD x0 = jfactory.ithVar(0); BDD x1 = jfactory.ithVar(1); BDD x2 = jfactory.ithVar(2); BDD mx0 = factory.ithVar(0); BDD mx1 = factory.ithVar(1); BDD mx2 = factory.ithVar(2); BDD ite = x0.ite(x1, x2); assertEquals(ite, x0.and(x1).or(x0.not().and(x2))); BDD myIte = mx0.ite(mx1, mx2); assertEquals(myIte, mx0.and(mx1).or(mx0.not().and(mx2))); } @Test public void testRelprod() { BDD x0 = jfactory.ithVar(0); BDD x1 = jfactory.ithVar(1); BDD mx0 = factory.ithVar(0); BDD mx1 = factory.ithVar(1); BDD rp = x0.relprod(x1, x0); assertEquals(rp, x0.and(x1).exist(x0)); BDD mrp = mx0.relprod(mx1, mx0); assertEquals(mrp, mx0.and(mx1).exist(mx0)); } }