synchgraph.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. from petrinet import *
  2. from threading import *
  3. import igraph as ig
  4. import Queue as q
  5. from random import choice
  6. class synchgraph:
  7. id = 0
  8. def __init__(self,modnum,M0):
  9. self.modnum = modnum
  10. self.sg = ig.Graph(0,directed=True)
  11. self.M0 = M0
  12. self.sg.add_vertices(1)
  13. self.sg.vs[0]['M'] = M0
  14. self.last = M0
  15. def summary(self):
  16. ig.summary(self.sg)
  17. def statePresent(self, M):
  18. for v in self.sg.vs:
  19. #for key,value in v['M']:
  20. if all(v['M'] == M):
  21. #print 'marking present in synchgraph'
  22. return v.index
  23. return -1
  24. def statePresentReach(self, M):
  25. for v in self.sg.vs:
  26. #for key,value in v['M']:
  27. if all(v['SM'] == M):
  28. #print 'marking present in synchgraph'
  29. return v.index
  30. return -1
  31. def addMarkingBatch(self,T,from_prod,to_prod):
  32. new = None
  33. for i in range(len(from_prod[0])):
  34. new = self.addMarking(from_prod[0][i],to_prod[0][i],T,self.last)
  35. self.last = new
  36. #self.graph(synchgraph.id);
  37. #synchgraph.id+=1
  38. def addMarking(self,Ms,Mnew,Arc,last):
  39. fr = self.statePresent(last)
  40. to = self.statePresent(Mnew)
  41. #self.last = Mnew
  42. if not to == -1:
  43. self.sg.add_edges([(fr,to)])
  44. self.sg.es[self.sg.get_eid(fr, to)]['T'] = '%s,%s'%(Ms,Arc)
  45. else:
  46. self.sg.add_vertices(1)
  47. to = self.sg.vcount()-1
  48. self.sg.vs[to]['M'] = Mnew
  49. self.sg.add_edges([(fr,to)])
  50. self.sg.es[self.sg.get_eid(fr, to)]['T'] = '%s,%s'%(Ms,Arc)
  51. return Mnew
  52. def markSCC(self, modules):
  53. for v in self.sg.vs:
  54. newval = []
  55. for value in v['M']:
  56. ls = value.split('-')
  57. new = '%s-%d'%(ls[0],modules[ls[0]].getSCCvid(ls[1]))
  58. newval.append(new)
  59. v['SM'] = newval
  60. def graph(self,id=None):
  61. key = choice(range(20))
  62. vattr=''
  63. eattr = ''
  64. nodes = {}
  65. graph = pydot.Dot(key, graph_type='digraph')
  66. dateTag = datetime.datetime.now().strftime("%Y-%b-%d_%H-%M-%S")
  67. for v in self.sg.vs:
  68. #sort(v['M'])
  69. # vattr +='('
  70. # i = len(v['M'])
  71. # leng = i
  72. # j=0
  73. if 'SM' in self.sg.vs.attribute_names():
  74. vattr+='ssc\n';
  75. for value in v['SM']:
  76. # if leng == 1:
  77. # if 'SCC' in self.sg.vs.attribute_names():
  78. # vattr +='SCC-%s\n'%v['SCC']
  79. # vattr = 'fstate%d'%choice(range(100))
  80. # else:
  81. #if int(value) > 0:
  82. # if 'SCC' in self.sg.vs.attribute_names():
  83. # vattr +='SCC-%s\n'%v['SCC']
  84. vattr += '%s'%(value.capitalize())
  85. else:
  86. for value in v['M']:
  87. # if leng == 1:
  88. # if 'SCC' in self.sg.vs.attribute_names():
  89. # vattr +='SCC-%s\n'%v['SCC']
  90. # vattr = 'fstate%d'%choice(range(100))
  91. # else:
  92. #if int(value) > 0:
  93. # if 'SCC' in self.sg.vs.attribute_names():
  94. # vattr +='SCC-%s\n'%v['SCC']
  95. vattr += '%s'%(value.capitalize())
  96. # if not i-1 == 0:
  97. # pass#vattr+=','
  98. # i -=1
  99. #j+=1
  100. #vattr +=')'
  101. nodes[v.index] = pydot.Node(vattr)
  102. graph.add_node(nodes[v.index])
  103. vattr = ''
  104. for e in self.sg.es:
  105. #pass
  106. #need to have later
  107. graph.add_edge(pydot.Edge(nodes[e.source],nodes[e.target],label=e['T']))
  108. #graph.write_svg('graphs/STATE%s%d%s.svg'%(self.key,choice(range(100)),dateTag))
  109. if id == None:
  110. graph.write_svg('../graphs/SYNCH%s%d%s.svg'%(key,choice(range(100)),dateTag))
  111. else:
  112. graph.write_svg('../graphs/SYNCH%d.svg'%(id))
  113. # def process(self,packet):
  114. # if packet.ismarking():
  115. # self.marking[packet.key()] = packet.payload()
  116. # else:
  117. #
  118. # if len(self.marking) == self.modnum and not self.wait:
  119. # self.createNode()
  120. #
  121. # def run(self):
  122. # #get initial states from the queue
  123. # while not self.done:
  124. # packet = self.queue.get(block=True, timeout=None)
  125. # self.process(packet)