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