예제 #1
0
 /**
  *
  * sort returns the graph's nodes, sorted by topological order. 
  * 
  * The result is an array with 
  * as many entries as topological levels. Each entry in this array is an array of nodes within
  * the given topological level.
  *
  * @return	array	 The graph's nodes, sorted by topological order.
  * @access	public
  */
 function sort(&$graph)
 {
     // We only sort graphs
     if (!is_a($graph, 'Structures_Graph')) {
         return Pear::raiseError('Structures_Graph_Manipulator_TopologicalSorter::sort received an object that is not a Structures_Graph', STRUCTURES_GRAPH_ERROR_GENERIC);
     }
     if (!Structures_Graph_Manipulator_AcyclicTest::isAcyclic($graph)) {
         return Pear::raiseError('Structures_Graph_Manipulator_TopologicalSorter::sort received an graph that has cycles', STRUCTURES_GRAPH_ERROR_GENERIC);
     }
     Structures_Graph_Manipulator_TopologicalSorter::_sort($graph);
     $result = array();
     // Fill out result array
     $nodes =& $graph->getNodes();
     $nodeKeys = array_keys($nodes);
     foreach ($nodeKeys as $key) {
         if (!array_key_exists($nodes[$key]->getMetadata('topological-sort-level'), $result)) {
             $result[$nodes[$key]->getMetadata('topological-sort-level')] = array();
         }
         $result[$nodes[$key]->getMetadata('topological-sort-level')][] =& $nodes[$key];
         $nodes[$key]->unsetMetadata('topological-sort-level');
     }
     return $result;
 }