CUDD: доступ к детям BDD

Я работаю с CUDD C ++ интерфейсом.

Я не нахожу много информации об этой библиотеке.

Как я могу получить двух детей от BDD?

Например:

Cudd mgr;
BDD x = mgr.bddVar();
BDD y = mgr.bddVar();
BDD f = x * y;

Теперь, с е, я хочу получить своего тогдашнего ребенка и еще ребенка.
Документация говорит, что у DdNode есть эти дети, но я не знаю, как получить к ним доступ.

Спасибо.

1

Решение

Вы можете получить доступ к потомкам then и else узла Cudd BDD следующим образом:

DdNode *t = Cudd_T(f.getNode());
DdNode *e = Cudd_E(f.getNode());

Это дает указатель DdNode, который представляет собой структуру данных, используемую для ссылки на BDD при использовании простого интерфейса C. Вы можете получить объекты C ++ снова:

BDD tb = BDD(mgr,t);

Обратите внимание, что приведенное выше работает только в том случае, если f не является дополненным узлом. В противном случае вам нужно запустить результат вызова функции getNode через функцию Cudd_Regular. Обратите внимание, что это инвертирует значение BDD.

Вы также можете рассматривать BDD, как если бы CuDD не использовал инвертированные узлы. В этом случае вы получите преемников потом и еще следующим образом:

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()));
}
1

Другие решения

Других решений пока нет …