====== 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
>>>