Пример #1
0
 private void EnableMoves(List <Node> nodes)
 {
     foreach (Node n in nodes)
     {
         foreach (Move m in NodeMoves(n))
         {
             if (ActiveMoves.Contains(m))
             {
                 ActiveMoves.Remove(m);
                 WorklistMoves.Add(m);
             }
         }
     }
 }
Пример #2
0
            private void Coalesce()
            {
                Move m = WorklistMoves[0];

                WorklistMoves.RemoveAt(0);
                Node x = GetAlias(GetNodeByTemp(m.Dst));
                Node y = GetAlias(GetNodeByTemp(m.Src));
                Node u, v;

                if (Precolored.Contains(y))
                {
                    u = y;
                    v = x;
                }
                else
                {
                    u = x;
                    v = y;
                }
                List <Node> nodes = new List <Node>(Adjacent(u));

                nodes.AddRange(Adjacent(v));
                if (u == v)
                {
                    CoalescedMoves.Add(m);
                    AddWorkList(u);
                }
                else if (Precolored.Contains(v) || AdjSet.Contains(new Edge(u, v)))
                {
                    ConstrainedMoves.Add(m);
                    AddWorkList(u);
                    AddWorkList(v);
                }
                else if (Precolored.Contains(u) && CheckOK(u, v) || !Precolored.Contains(u) && Conservative(nodes))
                {
                    CoalescedMoves.Add(m);
                    Combine(u, v);
                    AddWorkList(u);
                }
                else
                {
                    ActiveMoves.Add(m);
                }
            }
Пример #3
0
 private void FreezeMoves(Node u)
 {
     foreach (Move m in NodeMoves(u))
     {
         Node x = GetNodeByTemp(m.Dst);
         Node y = GetNodeByTemp(m.Src);
         Node v;
         if (GetAlias(y) == GetAlias(u))
         {
             v = GetAlias(x);
         }
         else
         {
             v = GetAlias(y);
         }
         ActiveMoves.Remove(m);
         FrozenMoves.Add(m);
         if (NodeMoves(v).Count == 0 && v.Degree < K)
         {
             FreezeWorklist.Remove(v);
             SimplifyWorklist.Add(v);
         }
     }
 }