Я работаю с CUDD C ++ интерфейсом.
Я не нахожу много информации об этой библиотеке.
Как я могу получить двух детей от BDD?
Например:
Cudd mgr;
BDD x = mgr.bddVar();
BDD y = mgr.bddVar();
BDD f = x * y;
Теперь, с е, я хочу получить своего тогдашнего ребенка и еще ребенка.
Документация говорит, что у DdNode есть эти дети, но я не знаю, как получить к ним доступ.
Спасибо.
Вы можете получить доступ к потомкам 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()));
}
Других решений пока нет …