Esempio n. 1
0
        BDDNode Generate(int height, int max, int m2, BDDManager manager, Random r)
        {
            if (height > max)
            {
                var id = manager.CreateVariable();
                var v  = manager.Create(id, manager.Zero, manager.One);
                //Console.WriteLine(manager.ToDot(v, (x) => "["+x.Id+"] x" + x.Index + " (" + x.RefCount.ToString() + ")"));
                return(v);
            }
            else
            {
                var acc = GetAndOr(height, max, m2, manager, r);
                //Console.WriteLine(manager.ToDot(acc, (x) => "["+x.Id+"] x" + x.Index + " (" + x.RefCount.ToString() + ")"));
                for (int i = 0; i < m2; i++)
                {
                    //if (r.NextDouble() > .5)
                    //    acc = manager.Or(acc, Generate(height + 1, max, m2));
                    //else
                    acc = manager.And(acc, Generate(height + 1, max, m2, manager, r));

                    //Console.WriteLine(manager.ToDot(acc, (x) => "["+x.Id+"] x" + x.Index + " (" + x.RefCount.ToString() + ")"));
                }
                //Console.WriteLine(manager.ToDot(acc, (x) => "["+x.Id+"] x" + x.Index + " (" + x.RefCount.ToString() + ")"));
                //acc.RefCount++;
                //manager.GarbageCollect();
                //acc.RefCount--;
                //Console.WriteLine(manager.ToDot(acc, (x) => "["+x.Id+"] x" + x.Index + " (" + x.RefCount.ToString() + ")"));
                //int v = manager.GetSize(acc);
                //acc = manager.Sifting(acc);
                //throw new Exception();
                //Console.WriteLine ("  Number of nodes: " + v + " -> " + manager.GetSize(acc));
                return(acc);
            }
        }
        public BDDNode GetObstructionSet(Obstacle obstacle)
        {
            if (obstacleCache.ContainsKey(obstacle))
            {
                return(obstacleCache[obstacle]);
            }

            BDDNode acc2 = null;

            foreach (var r in obstacle.Refinements())
            {
                BDDNode acc = null;
                foreach (var c in r.SubObstacles())
                {
                    if (acc == null)
                    {
                        acc = GetObstructionSet(c);
                    }
                    else
                    {
                        var bDDNode = GetObstructionSet(c);
                        acc = _manager.And(acc, bDDNode);
                    }
                }
                foreach (var c in r.DomainHypotheses())
                {
                    if (acc == null)
                    {
                        acc = GetObstructionSet(c);
                    }
                    else
                    {
                        var bDDNode = GetObstructionSet(c);
                        acc = _manager.And(acc, bDDNode);
                    }
                }
                foreach (var c in r.DomainProperties())
                {
                    if (acc == null)
                    {
                        acc = GetObstructionSet(c);
                    }
                    else
                    {
                        var bDDNode = GetObstructionSet(c);
                        acc = _manager.And(acc, bDDNode);
                    }
                }
                if (acc2 == null)
                {
                    acc2 = acc;
                }
                else
                {
                    acc2 = _manager.Or(acc2, acc);
                }
            }

            // Leaf obstacle
            if (acc2 == null)
            {
                int idx;
                if (_mapping.ContainsKey(obstacle))
                {
                    idx = _mapping[obstacle];
                }
                else
                {
                    idx = _manager.CreateVariable();
                    _mapping.Add(obstacle, idx);
                    _rmapping.Add(idx, obstacle);
                }
                acc2 = _manager.Create(idx, _manager.One, _manager.Zero);
            }

            obstacleCache.Add(obstacle, acc2);
            return(acc2);
        }