-function DAG:addEdge(nnma, nnmb)
- self.sorted = nil
- self:createNode(nnma)
- self:createNode(nnmb)
- table.insert(self.node[nnmb].pred, nnma)
- table.insert(self.node[nnma].succ, nnmb)
+function DAG:putInOrder()
+ if self.sorted then
+ return
+ end
+
+ local distance = {}
+ self:nestedApply(function(m) distance[m] = 1 end, self.inputModules)
+
+ local nc
+ repeat
+ nc = 0
+ for nnma, node in pairs(self.node) do
+ for _, nnmb in pairs(node.succ) do
+ if distance[nnma] and (not distance[nnmb] or distance[nnmb] < distance[nnma] + 1) then
+ distance[nnmb] = distance[nnma] + 1
+ nc = nc + 1
+ end
+ end
+ end
+ until nc == 0
+
+ self.sorted = { }
+ for m, d in pairs(distance) do
+ table.insert(self.sorted, { distance = d, nnm = m })
+ end
+
+ table.sort(self.sorted, function(a, b) return a.distance < b.distance end)
+
+ for i, a in ipairs(self.sorted) do self.sorted[i] = a.nnm end