CUUD:操作BDD

时间:2019-03-19 17:13:55

标签: binary binary-decision-diagram cudd

我正在使用CUDD C ++接口(https://github.com/ivmai/cudd),但是几乎没有有关此库的信息。我想知道如何根据其值删除一个变量。

例如,我现在将下一个表存储在bdd中:

|-----|-----|-----|
|  x1 |  x2 |  y  |
|-----|-----|-----|
|  0  |  0  |  1  |
|-----|-----|-----|
|  0  |  1  |  1  |
|-----|-----|-----|
|  1  |  0  |  1  |
|-----|-----|-----|
|  1  |  1  |  0  |
|-----|-----|-----|

我想根据x2的值将上一张表分成两个单独的bdd,然后再删除该节点:

如果x2 = 0

|-----|-----|
|  x1 |  y  |
|-----|-----|
|  0  |  1  |
|-----|-----|
|  1  |  1  |
|-----|-----|

如果x2 = 1

|-----|-----|
|  x1 |  y  |
|-----|-----|
|  0  |  1  |
|-----|-----|
|  1  |  0  |
|-----|-----|

有可能吗?

2 个答案:

答案 0 :(得分:1)

CUDD库的C ++接口上几乎没有文档的原因是,它只是C函数的包装,而C函数对此有很多文档。

C ++包装器主要用于摆脱使用C接口代码需要执行的所有Cudd_Ref(...)和Cudd_RecursiveDeref(...)调用。请注意,如果需要,您也可以从C ++代码使用C接口。

要执行您想做的事情,必须将CUDD提供的布尔运算符组合在一起,以便获得具有所需属性的新布尔函数。

第一步是将s限制为x = 0和x = 1的情况:

BDD s0 = s & !x;
BDD s1 = s & x;

您已经注意到,新的BDD尚未(尚未)忽略x变量的值。您希望它们“不在乎” w.r.t到x的值。由于您已经知道x在s0和s1中被限制为一个特定值,因此可以使用存在抽象运算符:

s0 = s0.ExistAbstract(x);
s1 = s1.ExistAbstract(x);

请注意,x在这里用作所谓的 cube (请参见下文)。

这些现在是您想要的BDD。

多维数据集说明:如果您同时从多个变量中提取数据,则应从所有要首先提取的变量中计算出这样的多维数据集。多维数据集主要用于表示一组变量。从数学逻辑上可以知道,如果您普遍存在地抽象多个变量,那么抽象这些变量的顺序就无关紧要。由于CUDD中的递归BDD操作尽可能在BDD对(或三重)上实现,因此CUDD在内部也将一组变量表示为一个多维数据集,因此,存在性抽象操作可以只对(1)BDD起作用。存在抽象将被执行,(2)BDD代表要从中抽象的变量集。多维数据集作为BDD的内部表示形式与仅使用CUDD(而不是扩展CUDD)的开发人员无关,除了表示变量的BDDD也可以用作多维数据集。

答案 1 :(得分:0)

以下是使用Cython绑定到Python软件包dd的CUDD的方法,该方法将常量值替换为变量x2

from dd import cudd as _bdd

bdd = _bdd.BDD()
bdd.declare('x1', 'x2')
# negated conjunction of the variables x1 and x2
u = bdd.add_expr('~ (x1 /\ x2)')

let = dict(x2=False)
v = bdd.let(let, u)
assert v == bdd.true, v

let = dict(x2=True)
w = bdd.let(let, u)
w_ = bdd.add_expr('~ x1')
assert w == w_, (w, w_)

通过将import语句更改为from dd import autoref as _bdd,同一代码可以在纯Python中运行。 dd的纯Python版本可以与pip install dd一起安装。 here描述了dd与模块dd.cudd的安装。