我正在使用CUDD包进行BDD操作。我想知道是否有人知道在构建BDD时传递特定变量顺序以指示程序使用此顺序的方法。我正在使用具有相对较少变量的布尔函数。
事实上,即使有一种方法可以将一个特定的输入变量传递给程序来生成BDD,这也符合我的目的。如果有人知道如何做到这一点,那么我真的很感激帮助。我浏览了文档,但没有找到任何有效的方法。也许我错过了什么。
答案 0 :(得分:1)
您可以将重新排序算法设置为CUDD_REORDER_NONE
Cudd_ReduceHeap(manager, CUDD_REORDER_NONE, 0);
通过这种方式,变量的顺序由你引入的顺序给出。
答案 1 :(得分:0)
CUDD中有两个功能可以解决问题:
Cudd_AutodynDisable(manager)
:"禁用自动动态重新排序。" Cudd_ShuffleHeap(manager, permutation)
:"根据给定的排列重新排序变量。" 通过在声明任何变量之前调用Cudd_AutodynDisable
,变量级别将被初始化并保持变量声明的顺序。
要解决在某个以后任意时间获取某些所需变量顺序的更一般情况,请先调用Cudd_AutodynDisable
,然后将所需的变量顺序传递给Cudd_ShuffleHeap
。
调用这些函数的示例可以在方法dd.cudd.BDD.configure
和dd.cudd.reorder
的函数Python package dd
中找到,特别是在与CUDD的Cython绑定中。
可以使用dd.cudd
更改变量顺序并禁用重新排序,如下所示:
from dd import cudd
bdd = cudd.BDD()
vrs = ['x', 'y', 'z']
bdd.declare(*vrs)
levels = {var: bdd.level_of_var(var) for var in vrs}
>>> levels
{'x': 0, 'y': 1, 'z': 2}
# change the levels
desired_levels = dict(x=2, y=0, z=1)
cudd.reorder(bdd, desired_levels)
# confirm that variables are now where desired
new_levels = {var: bdd.level_of_var(var) for var in vrs}
>>> new_levels
{'x': 2, 'y': 0, 'z': 1}
# dynamic reordering is initially turned on
>>> bdd.configure()
{'garbage_collection': True,
'loose_up_to': 6710886,
'max_cache_hard': 4294967295,
'max_cache_soft': 4096,
'max_growth': 1.2,
'max_memory': 18446744073709551615,
'max_swaps': 2000000,
'max_vars': 1000,
'min_hit': 30,
'reordering': True}
# turn off dynamic reordering
bdd.configure(reordering=False)
# confirm dynamic reordering is now off
>>> bdd.configure()
{'garbage_collection': True,
...
'reordering': False} # here it is
Cudd_ReduceHeap
调用重新排序,但选择CUDD_REORDER_NONE
的特殊情况除外。
来自Cudd_ReadReorderings
's documentation:
但是,不计算甚至不启动重新排序的呼叫也不计算在内。如果管理器中的活动节点数少于minsize,或者
CUDD_REORDER_NONE
被指定为重新排序方法,则调用可能不会启动重新排序。