def comparing_two_variable_orders(): n = 6 # declare variables vrs = ['x{i}'.format(i=i) for i in range(2 * n)] bdd = _bdd.BDD() bdd.declare(*vrs) # equality constraints cause difficulties with BDD size expr_1 = r' /\ '.join( " x{i} <=> x{j} ".format(i=i, j=(i + n + 1) % (2*n)) for i in range(n)) u = bdd.add_expr(expr_1) expr_2 = r' /\ '.join( " x{i} <=> x{j} ".format(i=2 * i, j=(2 * i + 1)) for i in range(n)) v = bdd.add_expr(expr_2) bdd.collect_garbage() # an order that yields a small BDD for `expr` good_order = ['x{i}'.format(i=i - 1) for i in [1, 7, 3, 9, 5, 11, 2, 8, 4, 10, 6, 12]] # an order that yields a large BDD for `expr` bad_order = list(vrs) # plot _bdd.reorder(bdd, list_to_dict(good_order)) bdd.dump('good.pdf') _bdd.reorder(bdd, list_to_dict(bad_order)) bdd.dump('bad.pdf')
def dump_bdd_using_autoref(u, fname): # copy from `dd.cudd` to `dd.autoref` b = autoref.BDD() cudd_bdd = u.bdd _bdd.copy_vars(cudd_bdd, b) r = _bdd.copy_bdd(u, cudd_bdd, b) autoref.reorder(b) b.dump(fname, [r]) print('dumped BDD to file "{f}"'.format(f=fname))
def demo_static_reordering(): """How to invoke reordering explicitly.""" print( '\n' + (50 * '-') + '\ndemo of static reordering\n' + (50 * '-')) bdd = _bdd.BDD() bdd.declare('z1', 'z2', 'z3', 'y1', 'y2', 'y3') expr = '(z1 /\ y1) \/ (z2 /\ y2) \/ (z3 /\ y3)' u = bdd.add_expr(expr) print_manager_size(bdd) # invoke sifting _bdd.reorder(bdd) print_manager_size(bdd)
def demo_specific_var_order(): """How to permute the variables to a desired order.""" print( '\n' + (50 * '-') + '\ndemo of user-defined variable permutation\n' + (50 * '-')) bdd = _bdd.BDD() bdd.declare('a', 'b', 'c') u = bdd.add_expr('(a \/ b) /\ ~ c') print_var_levels(bdd) # reorder desired_order = dict(a=2, b=0, c=1) _bdd.reorder(bdd, desired_order) # confirm print_var_levels(bdd)
def bdd_img_special_order(exp, order): bdd = _bdd.BDD() bdd.configure(reordering = True) order_dict = dict((k.strip(), int(v.strip())) for k,v in (item.split(':') for item in order.split(','))) for key, value in order_dict.items(): bdd.add_var(key) u = bdd.add_expr(exp) # print(order_dict) # print(bdd.vars) _bdd.reorder(bdd, order_dict) # print(bdd.vars) bdd.collect_garbage() rand = str(randrange(0, 100)) bdd.dump('../images/bdd_reorder_special' + rand + '.png') global filename_reorder_special filename_reorder_special = '../images/bdd_reorder_special' + rand + '.png'
def test_reorder_2(): bdd = _bdd.BDD() vrs = [ 'x', 'y', 'z', 'a', 'b', 'c', 'e', 'z1', 'z2', 'z3', 'y1', 'y2', 'y3' ] bdd = _bdd.BDD() bdd.declare(*vrs) expr_1 = '(~ z \/ (c /\ b)) /\ e /\ (a /\ (~ x \/ y))' # Figs. 6.24, 6.25 Baier 2008 expr_2 = '(z1 /\ y1) \/ (z2 /\ y2) \/ (z3 /\ y3)' u = bdd.add_expr(expr_1) v = bdd.add_expr(expr_2) bdd.collect_garbage() n = len(bdd) assert n == 23, n _bdd.reorder(bdd) n_ = len(bdd) assert n > n_, (n, n_) bdd.assert_consistent()
def test_function_properties(): bdd = _bdd.BDD() bdd.declare('x', 'y') order = dict(x=0, y=1) _bdd.reorder(bdd, order) u = bdd.add_expr('x \/ y') y = bdd.add_expr('y') # Assigned first because in presence of a bug # different property calls could yield # different values. level = u.level assert level == 0, level var = u.var assert var == 'x', var low = u.low assert low == y, low high = u.high assert high == bdd.true, high ref = u.ref assert ref == 1, ref assert not u.negated support = u.support assert support == {'x', 'y'}, support
def comparing_two_variable_orders(): n = 6 # declare variables vrs = ['x{i}'.format(i=i) for i in range(n)] primed_vars = [prime(var) for var in vrs] bdd = _bdd.BDD() bdd.declare(*(vrs + primed_vars)) # equality constraints cause difficulties with BDD size expr = r' /\ '.join( " {var} <=> {var}' ".format(var=var) for var in vrs) u = bdd.add_expr(expr) bdd.collect_garbage() # an order that yields a small BDD for `expr` good_order = list() for var in vrs: good_order.extend([var, prime(var)]) # an order that yields a large BDD for `expr` bad_order = list(vrs) bad_order.extend(prime(var) for var in vrs) # plot _bdd.reorder(bdd, list_to_dict(good_order)) bdd.dump('good.pdf') _bdd.reorder(bdd, list_to_dict(bad_order)) bdd.dump('bad.pdf')
def test_reorder(): bdd = _bdd.BDD() bdd.declare('x', 'y', 'z') u = bdd.add_expr('(x /\ y) \/ z') _bdd.reorder(bdd) assert u in bdd