public BDDNode CreateVars(int n)//переделать для robdd { if (nodeTable.ContainsKey(Tuple.Create(n, zero.GetId(), one.GetId()))) { return(nodeTable[Tuple.Create(n, zero.GetId(), one.GetId())]); } BDDNode newNode = ConstructOneVarTree(n, id++); InsertNode(newNode); return(newNode); }
BDDNode MakeNode(int varId, BDDNode low, BDDNode high) { if (low == high) { return(low); } return(GetNode(varId, low.GetId(), high.GetId())); //найти в таблице с нодами; }
private BDDNode ITE(BDDNode f, BDDNode g, BDDNode h) { //Один из следующих терминальных //ite(F; 1; 0) = ite(1; F; G) = ite(0; G; F ) = ite(G; F; F ) = F; if (g.GetId() == one.GetId() && h.GetId() == zero.GetId()) { return(f); } if (f.GetId() == one.GetId()) { return(g); //one } if (f.GetId() == zero.GetId()) { return(h); //zero } if (g.GetVarId() == h.GetVarId()) { return(g); } //Normalize //ite(F; F; G) =) ite(F; 1; G) //ite(F; G; F ) =) ite(F; G; 0) if (BDDNode.Eq(f, g)) { h = g; g = one; } if (BDDNode.Eq(f, h)) { h = zero; } //где-то здесь ошибка if (cache.ContainsKey(Tuple.Create(f.GetId(), h.GetId(), g.GetId())))// HASH_LOOKUP_COMPUTED_TABLE { return(cache[Tuple.Create(f.GetId(), h.GetId(), g.GetId())]); } int v = TopVar(f, g, h); // top variable from f,g,h // recursive calls BDDNode fn = ITE(Contraction(v, f, true), //сужение по high Contraction(v, g, true), Contraction(v, h, true)); BDDNode gn = ITE(Contraction(v, f, false),//сужение по low Contraction(v, g, false), Contraction(v, h, false)); if (BDDNode.Eq(fn, gn)) { return(gn); } BDDNode node = MakeNode(v, gn, fn);// HASH_LOOKUP_UNIQUE_TABLE if (node == null) { node = new BDDNode(v, id++, gn, fn); InsertNode(node); // insert into UNIQUE_TABLE } if (!cache.ContainsKey(Tuple.Create(v, gn.GetId(), fn.GetId()))) { cache.Add(Tuple.Create(v, gn.GetId(), fn.GetId()), node);//INSERT_COMPUTED_TABLE } return(node); }