CUDD包:传递特定变量顺序的方法?

时间:2014-02-24 17:25:34

标签: binary-decision-diagram cudd

我正在使用CUDD包进行BDD操作。我想知道是否有人知道在构建BDD时传递特定变量顺序以指示程序使用此顺序的方法。我正在使用具有相对较少变量的布尔函数。

事实上,即使有一种方法可以将一个特定的输入变量传递给程序来生成BDD,这也符合我的目的。如果有人知道如何做到这一点,那么我真的很感激帮助。我浏览了文档,但没有找到任何有效的方法。也许我错过了什么。

2 个答案:

答案 0 :(得分:1)

您可以将重新排序算法设置为CUDD_REORDER_NONE

Cudd_ReduceHeap(manager, CUDD_REORDER_NONE, 0);

通过这种方式,变量的顺序由你引入的顺序给出。

答案 1 :(得分:0)

CUDD中有两个功能可以解决问题:

通过在声明任何变量之前调用Cudd_AutodynDisable,变量级别将被初始化并保持变量声明的顺序。

要解决在某个以后任意时间获取某些所需变量顺序的更一般情况,请先调用Cudd_AutodynDisable,然后将所需的变量顺序传递给Cudd_ShuffleHeap

调用这些函数的示例可以在方法dd.cudd.BDD.configuredd.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被指定为重新排序方法,则调用可能不会启动重新排序。