Topological sort: Difference between revisions

→‎{{header|Python}}: Works with Python 2.6.1 aand 3.1 (tested)
(→‎{{header|Python}}: Works with Python 2.6.1 aand 3.1 (tested))
Line 31:
=={{header|Python}}==
 
<lang python>from copy import deepcopytry:
from functools import reduce
except:
pass
from pprint import pprint as pp
from copy import deepcopy
 
class CyclicDependencyError(Exception): pass
 
'''
des_system_lib std synopsys std_cell_lib des_system_lib dw02 dw01 ramlib ieee
dw01 ieee dw01 dware gtech
dw02 ieee dw02 dware
dw03 std synopsys dware dw03 dw02 dw01 ieee gtech
dw04 dw04 ieee dw01 dware gtech
dw05 dw05 ieee dware
dw06 dw06 ieee dware
dw07 ieee dware
dware ieee dware
gtech ieee gtech
ramlib std ieee
std_cell_lib ieee std_cell_lib
synopsys
'''
 
 
 
data = {
Line 52 ⟶ 75:
 
def toposort(dependencies):
givenchildren = set(dependencies.iterkeyskeys())
givenparents = reduce(set.union, dependencies.itervalues())
( set(p for p in parents)
for child, parents in dependencies.items() )
)
data = deepcopy(dependencies)
# Every parent is also a child, sometimes of nothing.
Line 60 ⟶ 86:
data[child] = set() # No parents
# Self dependencies are no dependencies
for child, parents in data.iteritemsitems():
parents.discard(child)
 
order = []list()
 
while data:
nocurrentdependencies = [child
for child, parents in data.iteritemsitems()
if not parents]
if not nocurrentdependencies and data:
#raise CyclicDependencyError, "Does not involve items: %s" % order
raise CyclicDependencyError("Involving items from: %s" % data.keys())
order += sorted(nocurrentdependencies)
nocurrentdependencies = set(nocurrentdependencies)
for child, parents in data.itervaluesitems():
parents -= .difference_update(nocurrentdependencies)
for child in nocurrentdependencies:
del data[child]
Line 80 ⟶ 107:
return order
 
print (', '.join( toposort(data) ))</lang>
</lang>
 
Ordered output:
Line 88 ⟶ 116:
<pre>
Traceback (most recent call last):
File "C:\Documents and Settings\All Users\Documents\Paddys\topological_sort.py", line 7377, in <module>
print (', '.join( toposort(data) ))
File "C:\Documents and Settings\All Users\Documents\Paddys\topological_sort.py", line 6367, in toposort
raise CyclicDependencyError, ("DoesInvolving notitems involve itemsfrom: %s" % orderdata.keys())
CyclicDependencyError: DoesInvolving notitems involve itemsfrom: ['ieee', 'std', 'synopsys', 'dware', 'gtech', 'ramlib', 'std_cell_lib', 'dw02des_system_lib', 'dw05dw04', 'dw06dw03', 'dw07dw01']</pre>
 
=={{header|Ruby}}==
Anonymous user