Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
49
Task/Topological-sort/E/topological-sort-1.e
Normal file
49
Task/Topological-sort/E/topological-sort-1.e
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
def makeQueue := <elib:vat.makeQueue>
|
||||
|
||||
def topoSort(data :Map[any, Set[any]]) {
|
||||
# Tables of nodes and edges
|
||||
def forwardEdges := [].asMap().diverge()
|
||||
def reverseCount := [].asMap().diverge()
|
||||
|
||||
def init(node) {
|
||||
reverseCount[node] := 0
|
||||
forwardEdges[node] := [].asSet().diverge()
|
||||
}
|
||||
for node => deps in data {
|
||||
init(node)
|
||||
for dep in deps { init(dep) }
|
||||
}
|
||||
|
||||
# 'data' holds the dependencies. Compute the other direction.
|
||||
for node => deps in data {
|
||||
for dep ? (dep != node) in deps {
|
||||
forwardEdges[dep].addElement(node)
|
||||
reverseCount[node] += 1
|
||||
}
|
||||
}
|
||||
|
||||
# Queue containing all elements that have no (initial or remaining) incoming edges
|
||||
def ready := makeQueue()
|
||||
for node => ==0 in reverseCount {
|
||||
ready.enqueue(node)
|
||||
}
|
||||
|
||||
var result := []
|
||||
|
||||
while (ready.optDequeue() =~ node :notNull) {
|
||||
result with= node
|
||||
for next in forwardEdges[node] {
|
||||
# Decrease count of incoming edges and enqueue if none
|
||||
if ((reverseCount[next] -= 1).isZero()) {
|
||||
ready.enqueue(next)
|
||||
}
|
||||
}
|
||||
forwardEdges.removeKey(node)
|
||||
}
|
||||
|
||||
if (forwardEdges.size().aboveZero()) {
|
||||
throw(`Topological sort failed: $forwardEdges remains`)
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
21
Task/Topological-sort/E/topological-sort-2.e
Normal file
21
Task/Topological-sort/E/topological-sort-2.e
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
pragma.enable("accumulator")
|
||||
|
||||
def dataText := "\
|
||||
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\
|
||||
"
|
||||
|
||||
def data := accum [].asMap() for rx`(@item.{17})(@deps.*)` in dataText.split("\n") { _.with(item.trim(), deps.split(" ").asSet()) }
|
||||
|
||||
println(topoSort(data))
|
||||
Loading…
Add table
Add a link
Reference in a new issue