Пример #1
0
        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);
        }
Пример #2
0
 BDDNode MakeNode(int varId, BDDNode low, BDDNode high)
 {
     if (low == high)
     {
         return(low);
     }
     return(GetNode(varId, low.GetId(), high.GetId())); //найти в таблице с нодами;
 }
Пример #3
0
        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);
        }