from functools import reduce import random
def topologic(graph): ''' { node:[node1, node2, ..., node]
x: [linear], k: [linear], b: [linear], Linear: [sigmoid], sigmoid: [loss], y: [linear], } '''
sorted_node = []
while graph:
all_nodes_have_inputs = reduce(lambda a, b: a + b, list(graph.values()))
all_nodes_have_outputs = list(graph.keys())
all_nodes_only_have_outputs_no_inputs = set( all_nodes_have_outputs) - set(all_nodes_have_inputs)
if all_nodes_only_have_outputs_no_inputs: node = random.choice(list(all_nodes_only_have_outputs_no_inputs)) graph.pop(node) sorted_node.append(node) for _, links in graph.items(): if node in links: links.remove(node) else: raise TypeError( "This Graph has circle, can't adopt topological order") return sorted_node
x, k, b, linear, sigmoid, y, loss = 'x', 'k', 'b', 'linear', 'sigmoid', 'y', 'loss'
test_graph = { x: [linear], k: [linear], b: [linear], linear: [sigmoid], sigmoid: [loss], y: [loss], }
print(topologic(test_graph))
|