C++ CUDD:访问BDD儿童

C++ CUDD:访问BDD儿童,c++,binary-decision-diagram,cudd,C++,Binary Decision Diagram,Cudd,我发现关于这个图书馆的信息不多 我怎样才能得到BDD的两个孩子 例如: Cudd mgr; BDD x = mgr.bddVar(); BDD y = mgr.bddVar(); BDD f = x * y; 现在,有了f,我想得到它的then-child和else-child。 文档中说DdNode有这个子节点,但我不知道如何访问它们 谢谢。您可以访问Cudd BDD节点的then和else子节点,如下所示: DdNode *t = Cudd_T(f.getNode()); DdNode *

我发现关于这个图书馆的信息不多

我怎样才能得到BDD的两个孩子

例如:

Cudd mgr;
BDD x = mgr.bddVar();
BDD y = mgr.bddVar();
BDD f = x * y;
现在,有了f,我想得到它的then-child和else-child。 文档中说DdNode有这个子节点,但我不知道如何访问它们


谢谢。

您可以访问Cudd BDD节点的then和else子节点,如下所示:

DdNode *t = Cudd_T(f.getNode());
DdNode *e = Cudd_E(f.getNode());
BDD t;
BDD e;
if (Cudd_IsComplement(f.getNode())) {
    t = !BDD(manager,Cudd_Regular(Cudd_T(f.getNode())));
    e = !BDD(manager,Cudd_Regular(Cudd_E(f.getNode())));
} else {
    t = BDD(manager,Cudd_T(f.getNode()));
    e = BDD(manager,Cudd_E(f.getNode()));
}
这将提供DdNode指针,这是使用普通C接口时用于引用BDD的数据结构。您可以通过:

再次获得C++对象
BDD tb = BDD(mgr,t);
请注意,上述方法仅在f不是补充节点时有效。否则,您必须通过Cudd_正则函数运行调用“getNode”函数的结果。请注意,这颠倒了BDD的含义

您还可以将BDD视为CuDD没有使用反向节点。在这种情况下,您将获得如下所示的then-else继任者:

DdNode *t = Cudd_T(f.getNode());
DdNode *e = Cudd_E(f.getNode());
BDD t;
BDD e;
if (Cudd_IsComplement(f.getNode())) {
    t = !BDD(manager,Cudd_Regular(Cudd_T(f.getNode())));
    e = !BDD(manager,Cudd_Regular(Cudd_E(f.getNode())));
} else {
    t = BDD(manager,Cudd_T(f.getNode()));
    e = BDD(manager,Cudd_E(f.getNode()));
}

还可以使用Python包中与CUDD的Cython绑定来访问BDD节点的后续节点

从dd导入cudd作为_bdd
bdd=_bdd.bdd()
bdd.declare('x','y')
u=bdd.add_expr('x/\y')
#节点'u'的“else”后继者`
v=u.low
#节点`u的“then”后继节点`
w=u.高
添加表达式('(~x/\{v})\/(x/\{w})'.format(v=v,w=w))
断言u==u(u,u)

<>安装<代码> DD/<代码>模块<代码> d.cUDD >描述

@ McCBuffi]如果损坏,请考虑接受这个答案。