synchgraph.py 4.3 KB

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