Bearsampp 2026.9.23
Loading...
Searching...
No Matches
Structures_Graph_Manipulator_TopologicalSorter Class Reference

Static Public Member Functions

static sort (&$graph)

Static Protected Member Functions

static _nonVisitedInDegree (&$node)
static _sort (&$graph)

Detailed Description

Definition at line 50 of file TopologicalSorter.php.

Member Function Documentation

◆ _nonVisitedInDegree()

_nonVisitedInDegree ( & $node)
staticprotected

This is a variant of Structures_Graph::inDegree which does not count nodes marked as visited.

Parameters
object$nodeNode to check
Returns
integer Number of non-visited nodes that link to this one

Definition at line 60 of file TopologicalSorter.php.

61 {
62 $result = 0;
63 $graphNodes =& $node->_graph->getNodes();
64 foreach (array_keys($graphNodes) as $key) {
65 if ((!$graphNodes[$key]->getMetadata('topological-sort-visited'))
66 && $graphNodes[$key]->connectsTo($node)
67 ) {
68 $result++;
69 }
70 }
71 return $result;
72
73 }
$result

References $result.

◆ _sort()

_sort ( & $graph)
staticprotected

Sort implementation

Parameters
object$graphGraph to sort
Returns
void

Definition at line 82 of file TopologicalSorter.php.

83 {
84 // Mark every node as not visited
85 $nodes =& $graph->getNodes();
86 $nodeKeys = array_keys($nodes);
87 $refGenerator = array();
88 foreach ($nodeKeys as $key) {
89 $refGenerator[] = false;
90 $nodes[$key]->setMetadata(
91 'topological-sort-visited',
92 $refGenerator[sizeof($refGenerator) - 1]
93 );
94 }
95
96 // Iteratively peel off leaf nodes
97 $topologicalLevel = 0;
98 do {
99 // Find out which nodes are leafs (excluding visited nodes)
100 $leafNodes = array();
101 foreach ($nodeKeys as $key) {
102 if ((!$nodes[$key]->getMetadata('topological-sort-visited'))
103 && static::_nonVisitedInDegree($nodes[$key]) == 0
104 ) {
105 $leafNodes[] =& $nodes[$key];
106 }
107 }
108 // Mark leafs as visited
109 $refGenerator[] = $topologicalLevel;
110 for ($i = sizeof($leafNodes) - 1; $i>=0; $i--) {
111 $visited =& $leafNodes[$i]->getMetadata('topological-sort-visited');
112 $visited = true;
113 $leafNodes[$i]->setMetadata('topological-sort-visited', $visited);
114 $leafNodes[$i]->setMetadata(
115 'topological-sort-level',
116 $refGenerator[sizeof($refGenerator) - 1]
117 );
118 }
119 $topologicalLevel++;
120 } while (sizeof($leafNodes) > 0);
121
122 // Cleanup visited marks
123 foreach ($nodeKeys as $key) {
124 $nodes[$key]->unsetMetadata('topological-sort-visited');
125 }
126 }

Referenced by sort().

Here is the caller graph for this function:

◆ sort()

sort ( & $graph)
static

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.

Parameters
object$graphGraph to sort
Returns
array The graph's nodes, sorted by topological order.

Definition at line 139 of file TopologicalSorter.php.

140 {
141 // We only sort graphs
142 if (!is_a($graph, 'Structures_Graph')) {
143 return Pear::raiseError(
144 'Structures_Graph_Manipulator_TopologicalSorter::sort received'
145 . ' an object that is not a Structures_Graph',
147 );
148 }
150 return Pear::raiseError(
151 'Structures_Graph_Manipulator_TopologicalSorter::sort'
152 . ' received an graph that has cycles',
154 );
155 }
156
158 $result = array();
159
160 // Fill out result array
161 $nodes =& $graph->getNodes();
162 $nodeKeys = array_keys($nodes);
163 foreach ($nodeKeys as $key) {
164 if (!array_key_exists($nodes[$key]->getMetadata('topological-sort-level'), $result)) {
165 $result[$nodes[$key]->getMetadata('topological-sort-level')]
166 = array();
167 }
168 $result[$nodes[$key]->getMetadata('topological-sort-level')][]
169 =& $nodes[$key];
170 $nodes[$key]->unsetMetadata('topological-sort-level');
171 }
172
173 return $result;
174 }
const STRUCTURES_GRAPH_ERROR_GENERIC
Definition Graph.php:37

References $result, _sort(), Structures_Graph_Manipulator_AcyclicTest\isAcyclic(), and STRUCTURES_GRAPH_ERROR_GENERIC.

Referenced by PEAR_Downloader\sortPackagesForInstall(), and TopologicalSorterTest\testSort().

Here is the call graph for this function:
Here is the caller graph for this function:

The documentation for this class was generated from the following file:
  • E:/Bearsampp-development/sandbox/core/libs/php/pear/pear/Structures/Graph/Manipulator/TopologicalSorter.php