====== Wave front ====== {{notes:net:pics:testacy.png?300}} from Nets import Network def TestAcy(): N = Network() N.addNode('A'); N.addNode('B'); N.addNode('C') N.addNode('D'); N.addNode('E'); N.addNode('F') N.addArc('A','C',{'w':2}); N.addArc('A','D',{'w':3}) N.addArc('B','C',{'w':3}); N.addArc('B','F',{'w':5}) N.addArc('C','D',{'w':2}); N.addArc('C','E',{'w':3}) N.addArc('D','E',{'w':1}); N.addArc('E','F',{'w':1}) N.setNode('A','T',0); N.setNode('B','T',0) N.onCircle() print(N) N.draw(800,800,"Cornsilk") N.savePajek('testAcy.net') return N N = TestAcy() >>> def CPM(N,v): return max([ N.getNode(N.initNode(a),'T')+N.getLink(a,'w')\ for a in N.inStar(v) ] + [0]) >>> CPM(N,'C') 3 >>> CPM(N,'A') 0 >>> CPM(N,'B') 0 >>> N.setNode('C','T',CPM(N,'C')) >>> N._nodes['C'] [{}, {'A': [1], 'B': [3]}, {'D': [5], 'E': [6]}, {'x': 0.8897114, 'y': 0.275, 'T': 3}] >>> N._nodes['D'] [{}, {'A': [2], 'C': [5]}, {'E': [7]}, {'x': 0.5, 'y': 0.05}] >>> N.setNode('D','T',CPM(N,'D')) >>> N._nodes['D'] [{}, {'A': [2], 'C': [5]}, {'E': [7]}, {'x': 0.5, 'y': 0.05, 'T': 5}] >>> N.topologicalOrder() ['B', 'A', 'C', 'D', 'E', 'F'] >>> for v in N.topologicalOrder(): N.setNode(v,'T',CPM(N,v)) >>> for v in N.nodes(): print(v,N.getNode(v,'T')) A 0 B 0 C 3 D 5 E 6 F 7 >>> Or, even better: CPM is a subprogram - more than one quantity can be changed in a node v def CPM(N,v): T = max([ N.getNode(N.initNode(a),'T')+N.getLink(a,'w')\ for a in N.inStar(v) ] + [0]) N.setNode(v,'T',T) N = TestAcy() for v in N.topologicalOrder(): CPM(N,v) for v in N.nodes(): print(v,N.getNode(v,'T')) And to count the number of paths into a vertex >>> def CNT(N,v): L = [ N.getNode(N.initNode(a),'C') for a in N.inStar(v) ] C = sum(L if len(L)>0 else [1]) N.setNode(v,'C',C) >>> for v in N.topologicalOrder(): CNT(N,v) >>> for v in N.nodes(): print(v,N.getNode(v,'C')) A 1 B 1 C 2 D 3 E 5 F 6 >>>