Пример #1
0
        Comparison <int> Comparison(Dictionary <int, int> inverseToOrder)
        {
            return(delegate(int node1, int node2) {
                Debug.Assert(properLayeredGraph.IsVirtualNode(node1) &&
                             properLayeredGraph.IsVirtualNode(node2));

                int succ1 = properLayeredGraph.Succ(node1).ElementAt(0);
                int succ2 = properLayeredGraph.Succ(node2).ElementAt(0);
                int pred1 = properLayeredGraph.Pred(node1).ElementAt(0);
                int pred2 = properLayeredGraph.Pred(node2).ElementAt(0);

                Point succPoint1 = nodePositions[succ1];
                Point succPoint2 = nodePositions[succ2];
                Point predPoint1 = nodePositions[pred1];
                Point predPoint2 = nodePositions[pred2];

                if (succPoint1 != succPoint2)
                {
                    if (predPoint1 != predPoint2)
                    {
                        return predPoint1.CompareTo(predPoint2);
                    }
                    return succPoint1.CompareTo(succPoint2);
                }
                if (properLayeredGraph.IsVirtualNode(succ1))
                {
                    if (predPoint1 != predPoint2)
                    {
                        return predPoint1.CompareTo(predPoint2);
                    }

                    int o1 = inverseToOrder[succ1];
                    int o2 = inverseToOrder[succ2];
                    Debug.Assert(o1 != -1 && o2 != -1);
                    return (o1.CompareTo(o2));
                }
                while (nodePositions[pred1] == nodePositions[pred2] &&
                       properLayeredGraph.IsVirtualNode(pred1))
                {
                    pred1 = properLayeredGraph.Pred(pred1).ElementAt(0);
                    pred2 = properLayeredGraph.Pred(pred2).ElementAt(0);
                }

                if (nodePositions[pred1] == nodePositions[pred2])
                {
                    return node1.CompareTo(node2);
                }
                return nodePositions[pred1].CompareTo(nodePositions[pred2]);
            });
        }
 /// <summary>
 /// Sweep layer from left to right and fill S,P arrays as we go.
 /// The arrays P and S will be sorted according to X. Note that we will not keep them sorted
 /// as we doing adjacent swaps. Initial sorting only needed to calculate initial clr,crl values.
 /// </summary>
 /// <param name="layer"></param>
 void InitPSArraysForLayer(int[] layer)
 {
     foreach (int l in layer)
     {
         foreach (int p in properLayeredGraph.Pred(l))
         {
             Dictionary <int, int> so = SOrder[p];
             if (so.ContainsKey(l))
             {
                 continue;
             }
             int sHasNow = so.Count;
             S[p].Add(l); //l takes the first available slot in S[p]
             so[l] = sHasNow;
         }
         foreach (int s in properLayeredGraph.Succ(l))
         {
             Dictionary <int, int> po = POrder[s];
             if (po.ContainsKey(l))
             {
                 continue;
             }
             int pHasNow = po.Count;
             P[s].Add(l); //l take the first available slot in P[s]
             po[l] = pHasNow;
         }
     }
 }