def test_boolfunc(): # __invert__, __or__, __and__, __xor__ f = ~a | b & c ^ d assert expr2bdd(expr("~a | b & c ^ d")) is f # support, usupport, inputs assert f.support == {a, b, c, d} assert f.usupport == {a.uniqid, b.uniqid, c.uniqid, d.uniqid} # restrict assert f.restrict({}) is f assert f.restrict({a: 0}) is one assert f.restrict({a: 1, b: 1}) is c ^ d assert f.restrict({a: 1, b: 1, c: 0}) is d assert f.restrict({a: 1, b: 1, c: 0, d: 0}) is zero # compose assert f.compose({a: w}) is ~w | b & c ^ d assert f.compose({ a: w, b: x & y, c: y | z, d: x ^ z }) is ~w | x ^ z ^ x & y & (y | z) # satisfy_one, satisfy_all assert zero.satisfy_one() is None assert one.satisfy_one() == {} g = a & b | a & c | b & c assert list(g.satisfy_all()) == [{ a: 0, b: 1, c: 1 }, { a: 1, b: 0, c: 1 }, { a: 1, b: 1 }] assert g.satisfy_count() == 3 assert g.satisfy_one() == {a: 0, b: 1, c: 1} # is_zero, is_one assert zero.is_zero() assert one.is_one() # box, unbox assert BinaryDecisionDiagram.box('0') is zero assert BinaryDecisionDiagram.box('1') is one assert BinaryDecisionDiagram.box("") is zero assert BinaryDecisionDiagram.box("foo") is one
def test_boolfunc(): # __invert__, __or__, __and__, __xor__ f = ~a | b & c ^ d assert expr2bdd(expr("~a | b & c ^ d")) is f # support, usupport, inputs assert f.support == {a, b, c, d} assert f.usupport == {a.uniqid, b.uniqid, c.uniqid, d.uniqid} # restrict assert f.restrict({}) is f assert f.restrict({a: 0}) is one assert f.restrict({a: 1, b: 1}) is c ^ d assert f.restrict({a: 1, b: 1, c: 0}) is d assert f.restrict({a: 1, b: 1, c: 0, d: 0}) is zero # compose assert f.compose({a: w}) is ~w | b & c ^ d assert f.compose({a: w, b: x&y, c: y|z, d: x^z}) is ~w | x ^ z ^ x & y & (y | z) # satisfy_one, satisfy_all assert zero.satisfy_one() is None assert one.satisfy_one() == {} g = a & b | a & c | b & c assert list(g.satisfy_all()) == [ {a: 0, b: 1, c: 1}, {a: 1, b: 0, c: 1}, {a: 1, b: 1} ] assert g.satisfy_count() == 3 assert g.satisfy_one() == {a: 0, b: 1, c: 1} # is_zero, is_one assert zero.is_zero() assert one.is_one() # box, unbox assert BinaryDecisionDiagram.box('0') is zero assert BinaryDecisionDiagram.box('1') is one assert BinaryDecisionDiagram.box("") is zero assert BinaryDecisionDiagram.box("foo") is one
Test binary decision diagrams """ from pyeda.boolalg.bdd import ( bddvar, expr2bdd, bdd2expr, upoint2bddpoint, ite, BinaryDecisionDiagram, BDDNODEZERO, BDDNODEONE, ) from pyeda.boolalg.expr import expr, OrOp, AndOp zero = BinaryDecisionDiagram.box(0) one = BinaryDecisionDiagram.box(1) a, b, c, d, w, x, y, z = map(bddvar, 'abcdwxyz') def test_expr2bdd(): assert expr2bdd(expr("a ^ b ^ c")) is a ^ b ^ c assert expr2bdd(expr("~a & ~b | a & ~b | ~a & b | a & b")) is one assert expr2bdd(expr("~(~a & ~b | a & ~b | ~a & b | a & b)")) is zero f = expr2bdd(expr("~a & ~b & c | ~a & b & ~c | a & ~b & ~c | a & b & c")) g = expr2bdd(expr("a ^ b ^ c")) assert f is g
""" Test binary decision diagrams """ from pyeda.boolalg.bdd import ( bddvar, expr2bdd, bdd2expr, upoint2bddpoint, ite, BinaryDecisionDiagram, BDDNODEZERO, BDDNODEONE, ) from pyeda.boolalg.expr import expr, OrOp, AndOp zero = BinaryDecisionDiagram.box(0) one = BinaryDecisionDiagram.box(1) a, b, c, d, w, x, y, z = map(bddvar, 'abcdwxyz') def test_expr2bdd(): assert expr2bdd(expr("a ^ b ^ c")) is a ^ b ^ c assert expr2bdd(expr("~a & ~b | a & ~b | ~a & b | a & b")) is one assert expr2bdd(expr("~(~a & ~b | a & ~b | ~a & b | a & b)")) is zero f = expr2bdd(expr("~a & ~b & c | ~a & b & ~c | a & ~b & ~c | a & b & c")) g = expr2bdd(expr("a ^ b ^ c")) assert f is g assert f.node.root == a.uniqid assert f.node.lo.root == b.uniqid assert f.node.hi.root == b.uniqid