예제 #1
0
파일: sylvan_test.py 프로젝트: swipswaps/dd
def test_add_expr():
    bdd = sylvan.BDD()
    for var in ['x', 'y']:
        bdd.add_var(var)
    # ((0 \/ 1) /\ x) \equiv x
    s = '(TRUE \/ FALSE) /\ x'
    u = bdd.add_expr(s)
    x = bdd.var('x')
    assert u == x, (u, x)
    # ((x \/ ~ y) /\ x) \equiv x
    s = '(x \/ ~ y) /\ x'
    u = bdd.add_expr(s)
    assert u == x, (u, x)
    # x /\ y /\ z
    bdd.add_var('z')
    z = bdd.var('z')
    u = bdd.add_expr('x /\ y /\ z')
    u_ = bdd.cube(dict(x=True, y=True, z=True))
    assert u == u_, (u, u_)
    # x /\ ~ y /\ z
    u = bdd.add_expr('x /\ ~ y /\ z')
    u_ = bdd.cube(dict(x=True, y=False, z=True))
    assert u == u_, (u, u_)
    # (\E x:  x /\ y) \equiv y
    y = bdd.var('y')
    u = bdd.add_expr('\E x:  x /\ y')
    assert u == y, (str(u), str(y))
    # (\A x:  x \/ ~ x) \equiv TRUE
    u = bdd.add_expr('\A x:  ~ x \/ x')
    assert u == bdd.true, u
    del x, y, z, u, u_
예제 #2
0
파일: sylvan_test.py 프로젝트: ahumay/dd
def test_add_expr():
    bdd = sylvan.BDD()
    for var in ['x', 'y']:
        bdd.add_var(var)
    # (0 | 1) & x = x
    s = '(True | False) & x'
    u = bdd.add_expr(s)
    x = bdd.var('x')
    assert u == x, (u, x)
    # (x | !y) & x = x
    s = '(x | !y) & x'
    u = bdd.add_expr(s)
    assert u == x, (u, x)
    # x & y & z
    bdd.add_var('z')
    z = bdd.var('z')
    u = bdd.add_expr('x & y & z')
    u_ = bdd.cube(dict(x=True, y=True, z=True))
    assert u == u_, (u, u_)
    # x & !y & z
    u = bdd.add_expr('x & !y & z')
    u_ = bdd.cube(dict(x=True, y=False, z=True))
    assert u == u_, (u, u_)
    # ? x. x & y = y
    y = bdd.var('y')
    u = bdd.add_expr('\E x: x & y')
    assert u == y, (str(u), str(y))
    # ! x. x | !x = 1
    u = bdd.add_expr('\A x: !x | x')
    assert u == bdd.true, u
    del x, y, z, u, u_
예제 #3
0
파일: sylvan_test.py 프로젝트: swipswaps/dd
def test_true_false():
    b = sylvan.BDD()
    false = b.false
    true = b.true
    assert false != true
    assert false == ~true
    assert false == false & true
    assert true == true | false
    del true, false
예제 #4
0
파일: sylvan_test.py 프로젝트: swipswaps/dd
def test_compose():
    bdd = sylvan.BDD()
    bdd.add_var('x')
    bdd.add_var('y')
    x = bdd.var('x')
    y = bdd.var('y')
    var_sub = dict(x=y)
    y_ = bdd.let(var_sub, x)
    assert y == y_, bdd.to_expr(y_)
    del x, y, y_, var_sub
예제 #5
0
파일: sylvan_test.py 프로젝트: swipswaps/dd
def test_insert_var():
    bdd = sylvan.BDD()
    level = 0
    j = bdd.add_var('x', index=level)
    assert j == 0, j  # initially indices = levels
    x = bdd.var_at_level(level)
    assert x == 'x', x
    level = 101
    bdd.add_var('y', index=level)
    y = bdd.var_at_level(level)
    assert y == 'y', y
예제 #6
0
파일: sylvan_test.py 프로젝트: swipswaps/dd
def test_pick_iter():
    b = sylvan.BDD()
    b.add_var('x')
    b.add_var('y')
    # FALSE
    u = b.false
    m = list(b.pick_iter(u))
    assert not m, m
    # TRUE, no care vars
    u = b.true
    m = list(b.pick_iter(u))
    assert m == [{}], m
    # x
    u = b.add_expr('x')
    m = list(b.pick_iter(u))
    m_ = [dict(x=True)]
    assert m == m_, (m, m_)
    # ~ x /\ y
    s = '~ x /\ y'
    u = b.add_expr(s)
    g = b.pick_iter(u, care_vars=set())
    m = list(g)
    m_ = [dict(x=False, y=True)]
    assert m == m_, (m, m_)
    u = b.add_expr(s)
    g = b.pick_iter(u)
    m = list(g)
    assert m == m_, (m, m_)
    # x /\ y
    u = b.add_expr('x /\ y')
    m = list(b.pick_iter(u))
    m_ = [dict(x=True, y=True)]
    assert m == m_, m
    # x
    s = '~ y'
    u = b.add_expr(s)
    # partial
    g = b.pick_iter(u)
    m = list(g)
    m_ = [dict(y=False)]
    equal_list_contents(m, m_)
    # partial
    g = b.pick_iter(u, care_vars=['x', 'y'])
    m = list(g)
    m_ = [dict(x=True, y=False), dict(x=False, y=False)]
    equal_list_contents(m, m_)
    # care bits x, y
    b.add_var('z')
    s = 'x \/ y'
    u = b.add_expr(s)
    g = b.pick_iter(u, care_vars=['x', 'y'])
    m = list(g)
    m_ = [dict(x=True, y=False), dict(x=False, y=True), dict(x=True, y=True)]
    equal_list_contents(m, m_)
예제 #7
0
파일: sylvan_test.py 프로젝트: swipswaps/dd
def test_support():
    bdd = sylvan.BDD()
    bdd.add_var('x')
    bdd.add_var('y')
    u = bdd.var('x')
    supp = bdd.support(u)
    assert supp == {'x'}, supp
    u = bdd.var('y')
    supp = bdd.support(u)
    assert supp == {'y'}, supp
    u = bdd.add_expr('x /\ y')
    supp = bdd.support(u)
    assert supp == {'x', 'y'}, supp
    del u
예제 #8
0
파일: sylvan_test.py 프로젝트: swipswaps/dd
def test_len():
    b = sylvan.BDD()
    # constant
    assert len(b) == 0, len(b)
    u = b.false
    assert len(b) == 0, len(b)
    del u
    assert len(b) == 0, len(b)
    # var node
    b.add_var('x')
    u = b.var('x')
    assert len(b) == 1, len(b)
    del u
    assert len(b) == 0, len(b)
예제 #9
0
파일: sylvan_test.py 프로젝트: swipswaps/dd
def test_cofactor():
    bdd = sylvan.BDD()
    bdd.add_var('x')
    x = bdd.var('x')
    # u = bdd.let(dict(x=True), x)
    # assert u == bdd.true, u
    # u = bdd.let(dict(x=False), x)
    # u = bdd.true
    # u_ = bdd.false
    # assert u == ~u_
    assert x == bdd.add_expr('x')
    u = bdd.let(dict(x=bdd.false), x)
    u_ = bdd.false
    assert u == u_, (u, u_)
    del x, u, u_
예제 #10
0
파일: sylvan_test.py 프로젝트: swipswaps/dd
def test_add_var():
    bdd = sylvan.BDD()
    bdd.add_var('x')
    bdd.add_var('y')
    jx = bdd._index_of_var['x']
    jy = bdd._index_of_var['y']
    assert jx == 0, jx
    assert jy == 1, jy
    x = bdd._var_with_index[0]
    y = bdd._var_with_index[1]
    assert x == 'x', x
    assert y == 'y', y
    assert bdd.vars == {'x', 'y'}, bdd.vars
    x = bdd.var('x')
    y = bdd.var('y')
    assert x != y, (x, y)
    del x, y
예제 #11
0
파일: sylvan_test.py 프로젝트: swipswaps/dd
def test_rename():
    bdd = sylvan.BDD()
    # single variable
    bdd.add_var('x')
    bdd.add_var('y')
    x = bdd.var('x')
    y = bdd.var('y')
    rename = dict(x='y')
    y_ = bdd.let(rename, x)
    assert y == y_, bdd.to_expr(y_)
    # multiple variables
    bdd.add_var('z')
    bdd.add_var('w')
    s = '(x /\ ~ y) \/ w'
    u = bdd.add_expr(s)
    rename = dict(x='w', y='z', w='y')
    v = bdd.let(rename, u)
    s = '(w /\ ~ z) \/ y'
    v_ = bdd.add_expr(s)
    assert v == v_, bdd.to_expr(v)
    del x, y, y_, u, v, v_