示例#1
0
        protected override void RunInternal()
        {
#if DEBUGORDERING
            if (graph.NumberOfVertices != layering.Length)
            {
                throw new System.Exception("the layering does not correspond to the graph");
            }
            foreach (IntEdge e in graph.Edges)
            {
                if (layering[e.Source] - layering[e.Target] != 1)
                {
                    throw new System.Exception("the edge in the graph does not span exactly one layer:" + e);
                }
            }
#endif

#if PPC // Parallel -- susanlwo
            LayerArrays secondLayers      = null;
            Ordering    revOrdering       = null;
            System.Threading.Tasks.Task t = null;

            if (/*orderingMeasure.x>0 &&*/ tryReverse)
            {
                secondLayers = layerArrays.ReversedClone();

                revOrdering = new Ordering(properLayeredGraph.ReversedClone(), false, secondLayers, startOfVirtNodes, balanceVirtAndOrigNodes, this.hasCrossWeights, settings);

                // note: below we need to pass the CancelToken from this thread into the new thread, to make sure a previous thread from the ThreadPool's
                // thread static token (that may be in a cancelled state) is picked up.
                t = System.Threading.Tasks.Task.Factory.StartNew(() => revOrdering.Run(this.CancelToken));
            }

            Calculate();

            if (/*orderingMeasure.x>0 &&*/ tryReverse)
            {
                t.Wait();

                if (revOrdering.measure < measure)
                {
                    for (int j = 0; j < nOfLayers; j++)
                    {
                        secondLayers.Layers[j].CopyTo(layerArrays.Layers[nOfLayers - 1 - j], 0);
                    }

                    layerArrays.UpdateXFromLayers();
                }
            }
#else
            Calculate();

            if (/*orderingMeasure.x>0 &&*/ tryReverse)
            {
                LayerArrays secondLayers = layerArrays.ReversedClone();

                var revOrdering = new Ordering(properLayeredGraph.ReversedClone(), false, secondLayers, startOfVirtNodes, balanceVirtAndOrigNodes,
                                               hasCrossWeights, settings);

                revOrdering.Run();

                if (revOrdering.measure < measure)
                {
                    for (int j = 0; j < nOfLayers; j++)
                    {
                        secondLayers.Layers[j].CopyTo(layerArrays.Layers[nOfLayers - 1 - j], 0);
                    }

                    layerArrays.UpdateXFromLayers();
                }
            }
#endif
        }