package com.juliasoft.beedeedee.factories;
import static org.junit.Assert.*;
import java.util.BitSet;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import com.juliasoft.beedeedee.bdd.Assignment;
import com.juliasoft.beedeedee.bdd.BDD;
import com.juliasoft.beedeedee.bdd.ReplacementWithExistingVarException;
import com.juliasoft.beedeedee.factories.EquivalenceRelation;
import com.juliasoft.beedeedee.factories.Factory;
import com.juliasoft.beedeedee.factories.Pair;
import com.juliasoft.beedeedee.factories.ERFactory.BDDER;
public class BDDERTest {
private Factory factory;
private Factory erFactory;
private BDD bddX1biX2;
private BDD bddX3;
private BDDER erBddX1biX2;
private BDDER erBddX3;
@Before
public void setUp() {
factory = Factory.mk(10, 10, 0);
// x1 <-> x2
bddX1biX2 = factory.makeVar(1);
bddX1biX2.biimpWith(factory.makeVar(2));
// x3
bddX3 = factory.makeVar(3);
// here factory.bddCount() is 2
erFactory = Factory.mkER(10, 10);
// x1 <-> x2
erBddX1biX2 = (BDDER) erFactory.makeVar(1);
erBddX1biX2.biimpWith(erFactory.makeVar(2));
// x3
erBddX3 = (BDDER) erFactory.makeVar(3);
}
@Test
public void testBasicMethods() {
BDD bdd = erFactory.makeVar(2);
assertEquals(2, bdd.var());
assertTrue(bdd.low().isZero());
assertTrue(bdd.high().isOne());
}
@Test
public void testZero() {
BDD bdd = erFactory.makeZero();
assertTrue(bdd.isZero());
// TODO can l be non-empty?
}
@Test
public void testOne1() {
BDD bdd = erFactory.makeOne();
assertTrue(bdd.isOne());
}
@Test
public void testOne2() {
// the normalized BDD is ONE, but not the original one
assertFalse(erBddX1biX2.isOne());
}
private boolean equivalentBDDs(BDD bdd1, BDD bdd2) {
if (bdd1.isOne()) {
return bdd2.isOne();
}
if (bdd1.isZero()) {
return bdd2.isZero();
}
return bdd1.var() == bdd2.var() && equivalentBDDs(bdd1.low(), bdd2.low())
&& equivalentBDDs(bdd1.high(), bdd2.high());
}
@Test
public void testOr1() {
BDDER or = (BDDER) erBddX1biX2.or(erBddX3);
BDD originalOr = bddX1biX2.or(bddX3);
assertTrue(or.isNormalized());
assertTrue(equivalentBDDs(or, originalOr));
}
@Test
public void testOr2() {
// testcase from the Julia analyzer
BDD bdd1 = or2mkBdd1(factory);
BDD bdd2 = or2mkBdd2(factory);
BDD bddGer1 = or2mkBdd1(erFactory);
BDD bddGer2 = or2mkBdd2(erFactory);
BDDER or = (BDDER) bddGer1.or(bddGer2);
BDD originalOr = bdd1.or(bdd2);
assertTrue(or.isNormalized());
assertTrue(equivalentBDDs(or, originalOr));
}
private BDD or2mkBdd1(Factory factory) {
BDD bdd1 = factory.makeVar(0);
bdd1.orWith(factory.makeVar(4));
bdd1.orWith(factory.makeVar(6));
bdd1.orWith(factory.makeVar(7));
bdd1.notWith();
return bdd1;
}
private BDD or2mkBdd2(Factory factory) {
BDD bdd2 = factory.makeNotVar(0);
BDD b2 = factory.makeNotVar(4);
b2.andWith(factory.makeVar(6));
BDD b1 = factory.makeVar(1);
b1.andWith(b2);
BDD temp = factory.makeNotVar(1);
BDD b3 = factory.makeNotVar(4);
BDD b5 = factory.makeVar(6);
b5.andWith(factory.makeNotVar(7));
b3.andWith(b5);
temp.andWith(b3);
b1.orWith(temp);
bdd2.andWith(b1);
return bdd2;
}
@Test
public void testOr3() {
BDD bdd1 = or3mkBdd1(factory);
BDD bdd2 = or3mkBdd2(factory);
BDD bddGer1 = or3mkBdd1(erFactory);
BDD bddGer2 = or3mkBdd2(erFactory);
BDDER or = (BDDER) bddGer1.or(bddGer2);
BDD originalOr = bdd1.or(bdd2);
assertTrue(or.isNormalized());
assertTrue(equivalentBDDs(or, originalOr));
}
private BDD or3mkBdd1(Factory factory) {
BDD bdd1 = factory.makeVar(0);
bdd1.orWith(factory.makeVar(4));
bdd1.orWith(factory.makeVar(6));
bdd1.notWith();
return bdd1;
}
private BDD or3mkBdd2(Factory factory) {
BDD bdd2 = factory.makeNotVar(0);
BDD b2 = factory.makeNotVar(4);
b2.andWith(factory.makeVar(6));
BDD b1 = factory.makeVar(1);
b1.andWith(b2);
bdd2.andWith(b1);
return bdd2;
}
@Test
public void testOr4() {
BDD f = erFactory.makeZero();
BDDER or = (BDDER) erBddX1biX2.or(f);
assertTrue(or.isNormalized());
assertTrue(equivalentBDDs(or, erBddX1biX2));
}
@Test
public void testOr5() {
BDD f = erFactory.makeZero();
BDDER or = (BDDER) f.or(erBddX1biX2);
assertTrue(or.isNormalized());
assertTrue(equivalentBDDs(or, erBddX1biX2));
}
@Test
public void testAnd1() {
BDD and = erBddX1biX2.and(erBddX3);
BDD originalAnd = bddX1biX2.and(bddX3);
assertTrue(equivalentBDDs(and, originalAnd));
}
@Test
public void testAnd2() {
BDD bdd1 = factory.makeVar(0);
bdd1.orWith(factory.makeVar(2));
bdd1.notWith();
BDD bdd2 = factory.makeVar(2);
BDD bddEr1 = erFactory.makeVar(0);
bddEr1.orWith(erFactory.makeVar(2));
bddEr1.notWith();
BDD bddEr2 = erFactory.makeVar(2);
BDD and = bddEr1.and(bddEr2);
BDD originalAnd = bdd1.and(bdd2);
assertTrue(equivalentBDDs(and, originalAnd));
}
@Test
public void testAnd3() {
BDD f = erFactory.makeZero();
BDDER and = (BDDER) erBddX1biX2.and(f);
assertTrue(and.isNormalized());
assertTrue(equivalentBDDs(and, f));
}
@Test
public void testAnd4() {
BDD f = erFactory.makeZero();
BDDER and = (BDDER) f.and(erBddX1biX2);
assertTrue(and.isNormalized());
assertTrue(equivalentBDDs(and, f));
}
@Test
public void testXor() {
BDD xor = erBddX1biX2.xor(erBddX3);
BDD originalXor = bddX1biX2.xor(bddX3);
assertTrue(equivalentBDDs(xor, originalXor));
}
@Test
public void testNand() {
BDD nand = erBddX1biX2.nand(erBddX3);
BDD originalNand = bddX1biX2.nand(bddX3);
assertTrue(equivalentBDDs(nand, originalNand));
}
@Test
public void testNot1() {
// (x1 <-> x2) | x3
BDD bdd = bddX1biX2.or(bddX3);
BDD bddEr = erBddX1biX2.or(erBddX3);
BDD not = bddEr.not();
BDD originalNot = bdd.not();
assertTrue(equivalentBDDs(not, originalNot));
}
@Test
public void testNot2() {
BDD bddEr = erFactory.makeZero();
BDD not = bddEr.not();
assertTrue(equivalentBDDs(not, erFactory.makeOne()));
}
@Test
public void testNodeCount1() {
// (x1 <-> x2) & x3
BDD bddEr = erBddX1biX2.and(erBddX3);
assertEquals(1, bddEr.nodeCount());
}
@Test
public void testNodeCount2() {
// (x1 <-> x2) | x3
BDD bdd = bddX1biX2.or(bddX3);
BDD bddEr = erBddX1biX2.or(erBddX3);
// the bdd is already normalized, same node count
assertEquals(bdd.nodeCount(), bddEr.nodeCount());
}
@Test
public void testAnySat1() {
// (x1 <-> x2) & x3
BDD bddEr = erBddX1biX2.and(erBddX3);
Assignment anySat = bddEr.anySat();
assertTrue(anySat.holds(bddX3));
assertEquals(anySat.holds(factory.makeVar(1)), anySat.holds(factory.makeVar(2)));
}
@Test
public void testAnySat2() {
// (x1 <-> x2) & (x3 <-> x4)
BDD biimp = erBddX3.biimp(erFactory.makeVar(4));
BDD bddEr = erBddX1biX2.andWith(biimp);
Assignment anySat = bddEr.anySat();
assertEquals(anySat.holds(factory.makeVar(1)), anySat.holds(factory.makeVar(2)));
assertEquals(anySat.holds(factory.makeVar(3)), anySat.holds(factory.makeVar(4)));
}
@Test
public void testAnySat3() {
// (x1 <-> x2) & (x1 & x3)
BDD and = erBddX3.and(erFactory.makeVar(1));
// {1, 2, 3}, x1
BDD bddEr = erBddX1biX2.andWith(and);
Assignment anySat = bddEr.anySat();
assertTrue(anySat.holds(bddX3));
assertEquals(anySat.holds(factory.makeVar(1)), anySat.holds(factory.makeVar(2)));
assertEquals(anySat.holds(factory.makeVar(1)), anySat.holds(factory.makeVar(3)));
}
@Test
public void testExist1() {
// (x1 <-> x2)
BDD bdd = factory.makeVar(1);
bdd.biimpWith(factory.makeVar(2));
// {1, 2}, 1
BDD bddEr = erFactory.makeVar(1);
bddEr.biimpWith(erFactory.makeVar(2));
BDD exist = bddEr.exist(1);
BDD originalExist = bdd.exist(1);
assertTrue(equivalentBDDs(exist, originalExist));
}
@Test
public void testExist2() {
// (x1 <-> x2) & (x3 <-> x4)
BDD biimp = bddX3.biimp(factory.makeVar(4));
BDD bdd = bddX1biX2.andWith(biimp);
// [{1,2},{3,4}], 1
BDD biimpEr = erBddX3.biimp(erFactory.makeVar(4));
BDD bddEr = erBddX1biX2.andWith(biimpEr);
BDD exist = bddEr.exist(1);
BDD originalExist = bdd.exist(1);
assertTrue(equivalentBDDs(exist, originalExist));
}
@Test
public void testExist3() {
// (x1 <-> x2) & (x2 <-> x3)
BDD biimp = bddX3.biimp(factory.makeVar(2));
BDD bdd = bddX1biX2.andWith(biimp);
// [{1,2,3}], 1
BDD biimpEr = erBddX3.biimp(erFactory.makeVar(2));
BDD bddEr = erBddX1biX2.andWith(biimpEr);
BDD exist = bddEr.exist(1);
BDD originalExist = bdd.exist(1);
assertTrue(equivalentBDDs(exist, originalExist));
}
@Test
public void testExist4() {
// (x1 <-> x2) & (x2 <-> x3) & x1
BDD biimp = bddX3.biimp(factory.makeVar(2));
BDD bdd = bddX1biX2.andWith(biimp);
bdd.andWith(factory.makeVar(1));
// [{1,2,3}], x1
BDD biimpEr = erBddX3.biimp(erFactory.makeVar(2));
BDD bddEr = erBddX1biX2.andWith(biimpEr);
bddEr.andWith(erFactory.makeVar(1));
// [{2,3}], x2
BDD exist = bddEr.exist(1);
BDD originalExist = bdd.exist(1);
assertTrue(equivalentBDDs(exist, originalExist));
}
@Test
public void testExist5() {
// (x1 <-> x2) & (x2 <-> x3) & (x1 OR x4)
BDD biimp = bddX3.biimp(factory.makeVar(2));
BDD bdd = bddX1biX2.andWith(biimp);
BDD temp = factory.makeVar(1);
temp.orWith(factory.makeVar(4));
bdd.andWith(temp);
// [{1,2,3}], x1 OR x4
BDD biimpEr = erBddX3.biimp(erFactory.makeVar(2));
BDD bddEr = erBddX1biX2.andWith(biimpEr);
BDD tempEr = erFactory.makeVar(1);
tempEr.orWith(erFactory.makeVar(4));
bddEr.andWith(tempEr);
// [{2,3}], x2 OR x4
BDD exist = bddEr.exist(1);
BDD originalExist = bdd.exist(1);
assertTrue(equivalentBDDs(exist, originalExist));
}
@Test
public void testExist6() {
// (x1 <-> x2) & (x1 OR x4)
BDD temp = factory.makeVar(1);
temp.orWith(factory.makeVar(4));
BDD bdd = bddX1biX2.andWith(temp);
// [{1,2}], x1 OR x4
BDD tempEr = erFactory.makeVar(1);
tempEr.orWith(erFactory.makeVar(4));
BDD bddEr = erBddX1biX2.andWith(tempEr);
// x2 OR x4
BDD exist = bddEr.exist(1);
BDD originalExist = bdd.exist(1);
assertTrue(equivalentBDDs(exist, originalExist));
}
@Test
public void testExist7() {
// (x2 <-> x3) & (x1 OR x4)
BDD temp = factory.makeVar(1);
temp.orWith(factory.makeVar(4));
BDD bdd = bddX3.biimp(factory.makeVar(2));
bdd.andWith(temp);
// [{2,3}], x1 OR x4
BDD tempEr = erFactory.makeVar(1);
tempEr.orWith(erFactory.makeVar(4));
BDD bddEr = erBddX3.biimp(erFactory.makeVar(2));
bddEr.andWith(tempEr);
// [{2,3}]
BDD exist = bddEr.exist(1);
BDD originalExist = bdd.exist(1);
assertTrue(equivalentBDDs(exist, originalExist));
}
@Test
public void testExistMulti1() {
// (x1 <-> x2) & (x3 <-> x4)
BDD biimp = bddX3.biimp(factory.makeVar(4));
BDD bdd = bddX1biX2.andWith(biimp);
// [{1,2},{3,4}], 1
BDD biimpEr = erBddX3.biimp(erFactory.makeVar(4));
BDD bddEr = erBddX1biX2.andWith(biimpEr);
BDD minterm = factory.makeVar(1).andWith(factory.makeVar(3));
BDD exist = bddEr.exist(minterm);
BDD originalExist = bdd.exist(minterm);
assertTrue(equivalentBDDs(exist, originalExist));
}
@Test
public void testExistMulti2() {
// (x1 <-> x2) & (x2 <-> x3)
BDD biimp = bddX3.biimp(factory.makeVar(2));
BDD bdd = bddX1biX2.andWith(biimp);
// [{1,2,3}], 1
BDD biimpEr = erBddX3.biimp(erFactory.makeVar(2));
BDD bddEr = erBddX1biX2.andWith(biimpEr);
BDD minterm = factory.makeVar(1).andWith(factory.makeVar(2)).andWith(factory.makeVar(3));
BDD exist = bddEr.exist(minterm);
BDD originalExist = bdd.exist(minterm);
assertTrue(equivalentBDDs(exist, originalExist));
}
@Test
public void testExistMulti3() {
// (x1 <-> x2) & (x2 <-> x3) & (x1 OR x4)
BDD biimp = bddX3.biimp(factory.makeVar(2));
BDD bdd = bddX1biX2.andWith(biimp);
BDD temp = factory.makeVar(1);
temp.orWith(factory.makeVar(4));
bdd.andWith(temp);
// [{1,2,3}], x1 OR x4
BDD biimpEr = erBddX3.biimp(erFactory.makeVar(2));
BDD bddEr = erBddX1biX2.andWith(biimpEr);
BDD tempEr = erFactory.makeVar(1);
tempEr.orWith(erFactory.makeVar(4));
bddEr.andWith(tempEr);
// [], x3 OR x4
BDD minterm = factory.makeVar(1).andWith(factory.makeVar(2));
BDD exist = bddEr.exist(minterm);
BDD originalExist = bdd.exist(minterm);
assertTrue(equivalentBDDs(exist, originalExist));
}
/*
* low level tests
*
@Test
public void testSqueezeAll() {
// bdd for x1 <-> x2
BDD bdd = factory.makeVar(1);
bdd.biimpWith(factory.makeVar(2));
EquivalenceRelation e = new EquivalenceRelation(new int[][] {{1, 2}});
BDDER er = new BDDER(bdd, e);
BDD n = er.getSqueezedBDD();
BDD expected = factory.makeOne();
assertTrue(n.isEquivalentTo(expected));
// assertEquals(3, factory.bddCount()); FIXME uncomment all
}
/*
@Test
public void testSqueezeEquiv() {
// bdd for (x1 <-> x2) & x3
BDD bdd = factory.makeVar(1);
bdd.biimpWith(factory.makeVar(2));
bdd.andWith(factory.makeVar(3));
EquivalenceRelation e = new EquivalenceRelation(new int[][] {{1, 2}});
BDDER er = new BDDER(bdd, e);
BDD n = er.getSqueezedBDD();
BDD expected = factory.makeVar(3);
assertTrue(n.isEquivalentTo(expected));
// assertEquals(3, factory.bddCount());
}
@Test
public void testAnd1b() {
// bdd for x1 <-> x2
BDD bdd1 = factory.makeVar(1);
bdd1.biimpWith(factory.makeVar(2));
// bdd for (x1 <-> x3) & x4
BDD bdd2 = factory.makeVar(1);
bdd2.biimpWith(factory.makeVar(3));
bdd2.andWith(factory.makeVar(4));
BDDER er1 = factory.new BDDER(bdd1);
BDDER er2 = new BDDER(bdd2);
BDDER and = er1.and_(er2);
BDD expectedN = factory.makeVar(4);
assertTrue(and.getN().isEquivalentTo(expectedN));
EquivalenceRelation equiv = and.getEquiv();
// {{1, 2, 3}}
assertEquals(1, equiv.size());
BitSet next = equiv.iterator().next();
BitSet expected = new BitSet();
expected.set(1, 4);
assertEquals(expected, next);
// assertEquals(4, factory.bddCount());
}
@Test
public void testAnd2b() {
// bdd for x1 <-> x4
BDD bdd1 = factory.makeVar(1);
bdd1.biimpWith(factory.makeVar(4));
// bdd for (x1 <-> x2) & (x2 <-> x3)
BDD bdd2 = factory.makeVar(1);
bdd2.biimpWith(factory.makeVar(2));
BDD temp = factory.makeVar(2);
temp.biimpWith(factory.makeVar(3));
bdd2.andWith(temp);
BDDER er1 = new BDDER(bdd1);
BDDER er2 = new BDDER(bdd2);
BDDER and = er1.and_(er2);
EquivalenceRelation equiv = and.getEquiv();
// {{1, 2, 3, 4}}
assertEquals(1, equiv.size());
BitSet next = equiv.iterator().next();
BitSet expected = new BitSet();
expected.set(1, 5);
assertEquals(expected, next);
BDD n = and.getN();
BDD expectedN = factory.makeOne();
assertTrue(n.isEquivalentTo(expectedN));
// assertEquals(4, factory.bddCount());
}
@Test
public void testAnd3b() {
// bdd for (x1 <-> x2) & x8
BDD bdd1 = factory.makeVar(1);
bdd1.biimpWith(factory.makeVar(2));
bdd1.andWith(factory.makeVar(8));
// bdd for (x6 <-> x7) & (x2 <-> x3)
BDD bdd2 = factory.makeVar(6);
bdd2.biimpWith(factory.makeVar(7));
BDD temp = factory.makeVar(2);
temp.biimpWith(factory.makeVar(3));
bdd2.andWith(temp);
EquivalenceRelation e1 = new EquivalenceRelation(new int[][] {{1, 2}});
BDDER er1 = new BDDER(bdd1, e1);
EquivalenceRelation e2 = new EquivalenceRelation(new int[][] {{1, 2, 3}});
BDDER er2 = new BDDER(bdd2, e2);
BDDER and = er1.and_(er2);
EquivalenceRelation equiv = and.getEquiv();
// {{1, 2, 3}, {6, 7}}
assertEquals(2, equiv.size());
Iterator<BitSet> it = equiv.iterator();
BitSet class1 = it.next();
BitSet class2 = it.next();
BitSet expected1 = new BitSet();
BitSet expected2 = new BitSet();
expected1.set(1, 4);
expected2.set(6, 8);
assertTrue((expected1.equals(class1) && expected2.equals(class2))
|| (expected1.equals(class2) && expected2.equals(class1)));
BDD n = and.getN();
BDD expectedN = factory.makeVar(8);
assertTrue(n.isEquivalentTo(expectedN));
// assertEquals(4, factory.bddCount());
}
@Test
public void testOr1b() {
// bdd for x1 <-> x2
BDD bdd1 = factory.makeVar(1);
bdd1.biimpWith(factory.makeVar(2));
// bdd for (x1 <-> x3) & x4
BDD bdd2 = factory.makeVar(1);
bdd2.biimpWith(factory.makeVar(3));
bdd2.andWith(factory.makeVar(4));
EquivalenceRelation e1 = new EquivalenceRelation(new int[][] {{1, 2}});
BDDER er1 = new BDDER(bdd1, e1);
EquivalenceRelation e2 = new EquivalenceRelation(new int[][] {{1, 3}});
BDDER er2 = new BDDER(bdd2, e2);
BDDER or = er1.or_(er2);
BDD n = or.getN();
BDD expectedN = bdd1.or(bdd2);
assertTrue(n.isEquivalentTo(expectedN));
EquivalenceRelation equiv = or.getEquiv();
assertTrue(equiv.isEmpty());
// assertEquals(4, factory.bddCount());
}
@Test
public void testOr2b() {
// bdd for x1 <-> x2
BDD bdd1 = factory.makeVar(1);
bdd1.biimpWith(factory.makeVar(2));
// bdd for (x1 <-> x2) & (x2 <-> x3)
BDD bdd2 = factory.makeVar(1);
bdd2.biimpWith(factory.makeVar(2));
BDD temp = factory.makeVar(2);
temp.biimpWith(factory.makeVar(3));
bdd2.andWith(temp);
EquivalenceRelation e1 = new EquivalenceRelation(new int[][] {{1, 2}});
BDDER er1 = new BDDER(bdd1, e1);
EquivalenceRelation e2 = new EquivalenceRelation(new int[][] {{1, 2, 3}});
BDDER er2 = new BDDER(bdd2, e2);
BDDER or = er1.or_(er2);
EquivalenceRelation equiv = or.getEquiv();
// (1, 2)
assertEquals(1, equiv.size());
BitSet next = equiv.iterator().next();
BitSet expected = new BitSet();
expected.set(1, 3);
assertEquals(expected, next);
BDD n = or.getN();
// we expect (1 or (1 & (x2 <-> x3) & (x1 <-> x3))), that is the
// constant 1
BDD expectedN = factory.makeOne();
assertTrue(n.isEquivalentTo(expectedN));
// assertEquals(4, factory.bddCount());
}
@Test
public void testOr3b() {
// bdd for (x1 <-> x2) & x8
BDD bdd1 = factory.makeVar(1);
bdd1.biimpWith(factory.makeVar(2));
bdd1.andWith(factory.makeVar(8));
// bdd for (x1 <-> x2) & (x2 <-> x3)
BDD bdd2 = factory.makeVar(1);
bdd2.biimpWith(factory.makeVar(2));
BDD temp = factory.makeVar(2);
temp.biimpWith(factory.makeVar(3));
bdd2.andWith(temp);
EquivalenceRelation e1 = new EquivalenceRelation(new int[][] {{1, 2}});
BDDER er1 = new BDDER(bdd1, e1);
EquivalenceRelation e2 = new EquivalenceRelation(new int[][] {{1, 2, 3}});
BDDER er2 = new BDDER(bdd2, e2);
BDDER or = er1.or_(er2);
EquivalenceRelation equiv = or.getEquiv();
// (1, 2)
assertEquals(1, equiv.size());
BitSet next = equiv.iterator().next();
BitSet expected = new BitSet();
expected.set(1, 3);
assertEquals(expected, next);
BDD n = or.getN();
// we expect (x8 or (1 & (x1 <-> x3)))
BDD expectedN = factory.makeVar(1);
expectedN.biimpWith(factory.makeVar(3));
expectedN.orWith(factory.makeVar(8));
assertTrue(n.isEquivalentTo(expectedN));
// assertEquals(4, factory.bddCount());
}
@Test
public void testXorb() {
// bdd for x1 <-> x2
BDD bdd1 = factory.makeVar(1);
bdd1.biimpWith(factory.makeVar(2));
// bdd for (x1 <-> x3) & x4
BDD bdd2 = factory.makeVar(1);
bdd2.biimpWith(factory.makeVar(3));
bdd2.andWith(factory.makeVar(4));
EquivalenceRelation e1 = new EquivalenceRelation(new int[][] {{1, 2}});
BDDER er1 = new BDDER(bdd1, e1);
EquivalenceRelation e2 = new EquivalenceRelation(new int[][] {{1, 3}});
BDDER er2 = new BDDER(bdd2, e2);
BDDER xor = er1.xor_(er2);
BDD n = xor.getN();
BDD expectedN = bdd1.xor(bdd2);
assertTrue(n.isEquivalentTo(expectedN));
EquivalenceRelation equiv = xor.getEquiv();
assertTrue(equiv.isEmpty());
// assertEquals(4, factory.bddCount());
}
@Test
public void testNotb() {
// bdd for (x1 <-> x2) & x8
BDD bdd = factory.makeVar(1);
bdd.biimpWith(factory.makeVar(2));
bdd.andWith(factory.makeVar(8));
BDD expected = bdd.not();
BDDER er = new BDDER(bdd);
BDDER notGer = er.not_();
BDD full = notGer.getFullBDD();
assertTrue(expected.isEquivalentTo(full));
// assertEquals(5, factory.bddCount());
}
@Test
public void testMaxVar1() {
// bdd for (x1 <-> x2) & x3
BDD bdd = factory.makeVar(1);
bdd.biimpWith(factory.makeVar(2));
bdd.andWith(factory.makeVar(3));
BDDER er = new BDDER(bdd);
assertEquals(3, er.maxVar());
}
@Test
public void testMaxVar2() {
// bdd for (x1 <-> x6) & x3
BDD bdd = factory.makeVar(1);
bdd.biimpWith(factory.makeVar(6));
bdd.andWith(factory.makeVar(3));
BDDER er = new BDDER(bdd);
assertEquals(6, er.maxVar());
}
@Test
public void testEquivVars1() {
BDD one = factory.makeOne();
Set<Pair> equivVars = one.equivVars();
assertTrue(equivVars.isEmpty());
// assertEquals(1, factory.bddCount());
}
@Test
public void testEquivVars2() {
BDD zero = factory.makeZero();
Set<Pair> equivVars = zero.equivVars();
assertTrue(equivVars.isEmpty());
// assertEquals(1, factory.bddCount());
}
@Test
public void testEquivVars3() {
// bdd for (x1 <-> x2) & x8
BDD bdd = factory.makeVar(1);
bdd.biimpWith(factory.makeVar(2));
bdd.andWith(factory.makeVar(8));
Set<Pair> equivVars = bdd.equivVars();
assertEquals(1, equivVars.size());
assertTrue(equivVars.contains(new Pair(1, 2)));
// assertEquals(1, factory.bddCount());
}
@Test
public void testEquivVars4() {
// bdd for (x1 <-> x2) & (x2 <-> x3)
BDD bdd = factory.makeVar(1);
bdd.biimpWith(factory.makeVar(2));
BDD temp = factory.makeVar(2);
temp.biimpWith(factory.makeVar(3));
bdd.andWith(temp);
Set<Pair> equivVars = bdd.equivVars();
assertEquals(2, equivVars.size());
Pair p1 = new Pair(1, 2);
Pair p2 = new Pair(1, 3);
Pair p3 = new Pair(2, 3);
assertTrue(equivVars.contains(p1) && equivVars.contains(p2) || equivVars.contains(p2) && equivVars.contains(p3)
|| equivVars.contains(p1) && equivVars.contains(p3));
// assertEquals(1, factory.bddCount());
}
@Test
public void testNormalize1() {
// bdd for x1 <-> x2
BDD bdd = factory.makeVar(1);
bdd.biimpWith(factory.makeVar(2));
BDDER er = new BDDER(bdd, new EquivalenceRelation()); // non-normalizing constructor
BDDER normalized = er.normalize();
List<Pair> pairs = normalized.getEquiv().pairs();
assertEquals(1, pairs.size());
assertEquals(new Pair(1, 2), pairs.get(0));
BDD n = normalized.getN();
BDD expected = factory.makeOne();
assertTrue(n.isEquivalentTo(expected));
// assertEquals(3, factory.bddCount());
}
@Test
public void testNormalize2() {
// bdd for (x1 <-> x2) & x3
BDD bdd = factory.makeVar(1);
bdd.biimpWith(factory.makeVar(2));
bdd.andWith(factory.makeVar(3));
BDDER er = new BDDER(bdd, new EquivalenceRelation()); // non-normalizing constructor
BDDER normalized = er.normalize();
List<Pair> pairs = normalized.getEquiv().pairs();
assertEquals(1, pairs.size());
assertEquals(new Pair(1, 2), pairs.get(0));
BDD n = normalized.getN();
BDD expected = factory.makeVar(3);
assertTrue(n.isEquivalentTo(expected));
// assertEquals(3, factory.bddCount());
}
@Test
public void testRenameWithLeader1() {
// bdd for x2 & x3
BDD bdd = factory.makeVar(2);
bdd.andWith(factory.makeVar(3));
EquivalenceRelation l = new EquivalenceRelation(new int[][] {{1, 2}});
BDD n = bdd.renameWithLeader(l);
BDD expected = factory.makeVar(1);
expected.andWith(factory.makeVar(3));
assertTrue(n.isEquivalentTo(expected));
// assertEquals(3, factory.bddCount());
}
@Test
public void testRenameWithLeader2() {
BDD bdd = factory.makeVar(2);
EquivalenceRelation l = new EquivalenceRelation(new int[][] {{1, 2}});
BDD n = bdd.renameWithLeader(l);
BDD expected = factory.makeVar(1);
assertTrue(n.isEquivalentTo(expected));
// assertEquals(3, factory.bddCount());
}
@Test
public void testRenameWithLeader3() {
BDD bdd = factory.makeVar(1);
EquivalenceRelation l = new EquivalenceRelation(new int[][] {{2, 3}});
BDD n = bdd.renameWithLeader(l);
BDD expected = factory.makeVar(1);
assertTrue(n.isEquivalentTo(expected));
// assertEquals(3, factory.bddCount());
}
@Test
public void testRenameWithLeader4() {
BDD bdd = factory.makeVar(1);
EquivalenceRelation l = new EquivalenceRelation(new int[][] {{2, 3}});
BDD n = bdd.renameWithLeader(l);
BDD expected = factory.makeVar(1);
assertTrue(n.isEquivalentTo(expected));
// assertEquals(3, factory.bddCount());
}
@Test
public void testRenameWithLeader5() {
// bdd for (x6 <-> x7) & (x2 <-> x3)
BDD bdd = factory.makeVar(6);
bdd.biimpWith(factory.makeVar(7));
BDD temp = factory.makeVar(2);
temp.biimpWith(factory.makeVar(3));
bdd.andWith(temp);
EquivalenceRelation l = new EquivalenceRelation(new int[][] {{1, 2}, {6, 7}});
BDD n = bdd.renameWithLeader(l);
BDD expected = factory.makeVar(1);
expected.biimpWith(factory.makeVar(3));
assertTrue(n.isEquivalentTo(expected));
// assertEquals(3, factory.bddCount());
}
@Test
public void testFullBDD() {
// bdd for (x1 <-> x2) & x8
BDD bdd = factory.makeVar(1);
bdd.biimpWith(factory.makeVar(2));
bdd.andWith(factory.makeVar(8));
BDDER er = new BDDER(bdd.copy());
BDD full = er.getFullBDD();
assertTrue(er.equivalentBDDs(full, bdd));
// assertEquals(3, factory.bddCount());
}
@Test
public void testSatCount1() {
// x1 XOR x2 - satCount = 2
BDD bdd = factory.makeVar(0).xorWith(factory.makeVar(1));
EquivalenceRelation l = new EquivalenceRelation(new int[][] {{1, 2}});
// 1 value - bound to leader's value in bdd (var 1)
BDDER er = new BDDER(bdd, l);
assertEquals(2, er.satCount());
}
@Test
public void testSatCount2() {
// x1 XOR x2 - satCount = 2
BDD bdd = factory.makeVar(0).xorWith(factory.makeVar(1));
EquivalenceRelation l = new EquivalenceRelation(new int[][] {{1, 2}, {3, 4}});
// 2 values for this - no constraints
BDDER er = new BDDER(bdd, l);
assertEquals(4, er.satCount());
}
@Test
public void testSatCount3() {
// x1 XOR x2 - satCount = 2
BDD bdd = factory.makeVar(0).xorWith(factory.makeVar(1));
EquivalenceRelation l = new EquivalenceRelation(new int[][] {{2, 3}, {4, 5, 6, 7}});
// 2 values for this...
// times 2 values for this
BDDER er = new BDDER(bdd, l);
assertEquals(8, er.satCount());
}
@Test
public void testVars() {
// bdd for (x1 <-> x2) & x8
BDD bdd = factory.makeVar(1);
bdd.biimpWith(factory.makeVar(2));
bdd.andWith(factory.makeVar(8));
BDDER er = new BDDER(bdd);
BitSet vars = er.vars();
assertEquals(3, vars.cardinality());
assertTrue(vars.get(1));
assertTrue(vars.get(2));
assertTrue(vars.get(8));
}
@Test
public void testBiimp() {
BDD x1 = factory.makeVar(1);
BDD x2 = factory.makeVar(2);
BDDER er1 = new BDDER(x1);
BDDER er2 = new BDDER(x2);
BDDER biimp = er1.biimp_(er2);
BDD n = biimp.getN();
EquivalenceRelation equiv = biimp.getEquiv();
assertTrue(n.isEquivalentTo(factory.makeOne()));
EquivalenceRelation expectedEquiv = new EquivalenceRelation(new int[][] {{1, 2}});
assertEquals(expectedEquiv, equiv);
// assertEquals(4, factory.bddCount());
}
@Test
public void testImp() {
BDD x1 = factory.makeVar(1);
BDD x2 = factory.makeVar(2);
BDDER er1 = new BDDER(x1.copy());
BDDER er2 = new BDDER(x2.copy());
BDDER imp = er1.imp_(er2);
BDD fullBDD = imp.getFullBDD();
BDD expected = x1.imp(x2);
assertTrue(imp.equivalentBDDs(expected, fullBDD));
// assertEquals(4, factory.bddCount());
}
@Test
public void testReplace1() {
BDD x1 = factory.makeVar(1);
BDD x2 = factory.makeVar(2);
BDDER er = new BDDER(x1);
BDDER expected = new BDDER(x2);
Map<Integer, Integer> renaming = new HashMap<>();
renaming.put(1, 2);
BDDER replace = er.replace_(renaming);
assertTrue(replace.equivalentBDDs(expected, replace));
}
@Test(expected = ReplacementWithExistingVarException.class)
public void testReplace2() {
EquivalenceRelation l = new EquivalenceRelation(new int[][] {{1, 2}});
BDD n = factory.makeVar(3);
BDDER er = new BDDER(n, l);
Map<Integer, Integer> renaming = new HashMap<>();
renaming.put(1, 2);
er.replace(renaming);
}
@Test
public void testReplace3() {
EquivalenceRelation l = new EquivalenceRelation(new int[][] {{1, 2}});
BDD n = factory.makeVar(3);
BDDER er = new BDDER(n, l);
EquivalenceRelation l2 = new EquivalenceRelation(new int[][] {{2, 4}});
BDDER expected = new BDDER(n.copy(), l2);
Map<Integer, Integer> renaming = new HashMap<>();
renaming.put(1, 4);
BDDER replace = er.replace_(renaming);
assertTrue(replace.equivalentBDDs(expected, replace));
}
@Test
public void testReplace4() {
EquivalenceRelation l = new EquivalenceRelation(new int[][] {{1, 2, 3}});
BDD n = factory.makeVar(1);
BDDER er = new BDDER(n, l);
EquivalenceRelation l2 = new EquivalenceRelation(new int[][] {{2, 3, 4}});
BDDER expected = new BDDER(factory.makeVar(2), l2);
Map<Integer, Integer> renaming = new HashMap<>();
renaming.put(1, 4);
BDDER replace = er.replace_(renaming);
assertTrue(replace.equivalentBDDs(expected, replace));
}
@Test
public void testReplace5() {
EquivalenceRelation l = new EquivalenceRelation(new int[][] {{6, 9}});
BDD n = factory.makeVar(8);
BDDER er = new BDDER(n, l);
EquivalenceRelation l2 = new EquivalenceRelation(new int[][] {{3, 9}});
BDDER expected = new BDDER(factory.makeVar(8), l2);
Map<Integer, Integer> renaming = new HashMap<>();
renaming.put(9, 3); // this should be performed first
renaming.put(6, 9);
BDDER replace = er.replace_(renaming);
assertTrue(replace.equivalentBDDs(expected, replace));
}
*/
}