123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- from petrinet import *
- from threading import *
- import igraph as ig
- import Queue as q
- from random import choice
- class synchgraph:
- id = 0
- def __init__(self,modnum,M0):
- self.modnum = modnum
- self.sg = ig.Graph(0,directed=True)
- self.M0 = M0
- self.sg.add_vertices(1)
- self.sg.vs[0]['M'] = M0
- self.last = M0
-
- def summary(self):
- ig.summary(self.sg)
-
- def statePresent(self, M):
- for v in self.sg.vs:
- #for key,value in v['M']:
- if all(v['M'] == M):
- #print 'marking present in synchgraph'
- return v.index
- return -1
-
- def statePresentReach(self, M):
- for v in self.sg.vs:
- #for key,value in v['M']:
- if all(v['SM'] == M):
- #print 'marking present in synchgraph'
- return v.index
- return -1
-
- def addMarkingBatch(self,T,from_prod,to_prod):
- new = None
- for i in range(len(from_prod[0])):
- new = self.addMarking(from_prod[0][i],to_prod[0][i],T,self.last)
- self.last = new
- #self.graph(synchgraph.id);
- #synchgraph.id+=1
-
- def addMarking(self,Ms,Mnew,Arc,last):
- fr = self.statePresent(last)
- to = self.statePresent(Mnew)
-
- #self.last = Mnew
- if not to == -1:
- self.sg.add_edges([(fr,to)])
- self.sg.es[self.sg.get_eid(fr, to)]['T'] = '%s,%s'%(Ms,Arc)
- else:
- self.sg.add_vertices(1)
- to = self.sg.vcount()-1
- self.sg.vs[to]['M'] = Mnew
- self.sg.add_edges([(fr,to)])
- self.sg.es[self.sg.get_eid(fr, to)]['T'] = '%s,%s'%(Ms,Arc)
- return Mnew
-
- def markSCC(self, modules):
- for v in self.sg.vs:
- newval = []
- for value in v['M']:
- ls = value.split('-')
- new = '%s-%d'%(ls[0],modules[ls[0]].getSCCvid(ls[1]))
- newval.append(new)
- v['SM'] = newval
-
-
- def graph(self,id=None):
- key = choice(range(20))
- vattr=''
- eattr = ''
- nodes = {}
- graph = pydot.Dot(key, graph_type='digraph')
- dateTag = datetime.datetime.now().strftime("%Y-%b-%d_%H-%M-%S")
- for v in self.sg.vs:
- #sort(v['M'])
- # vattr +='('
- # i = len(v['M'])
- # leng = i
- # j=0
- if 'SM' in self.sg.vs.attribute_names():
- vattr+='ssc\n';
- for value in v['SM']:
- # if leng == 1:
- # if 'SCC' in self.sg.vs.attribute_names():
- # vattr +='SCC-%s\n'%v['SCC']
- # vattr = 'fstate%d'%choice(range(100))
- # else:
- #if int(value) > 0:
- # if 'SCC' in self.sg.vs.attribute_names():
- # vattr +='SCC-%s\n'%v['SCC']
- vattr += '%s'%(value.capitalize())
- else:
- for value in v['M']:
- # if leng == 1:
- # if 'SCC' in self.sg.vs.attribute_names():
- # vattr +='SCC-%s\n'%v['SCC']
- # vattr = 'fstate%d'%choice(range(100))
- # else:
- #if int(value) > 0:
- # if 'SCC' in self.sg.vs.attribute_names():
- # vattr +='SCC-%s\n'%v['SCC']
- vattr += '%s'%(value.capitalize())
- # if not i-1 == 0:
- # pass#vattr+=','
- # i -=1
- #j+=1
- #vattr +=')'
- nodes[v.index] = pydot.Node(vattr)
- graph.add_node(nodes[v.index])
- vattr = ''
- for e in self.sg.es:
- #pass
- #need to have later
- graph.add_edge(pydot.Edge(nodes[e.source],nodes[e.target],label=e['T']))
- #graph.write_svg('graphs/STATE%s%d%s.svg'%(self.key,choice(range(100)),dateTag))
- if id == None:
- graph.write_svg('../graphs/SYNCH%s%d%s.svg'%(key,choice(range(100)),dateTag))
- else:
- graph.write_svg('../graphs/SYNCH%d.svg'%(id))
-
- # def process(self,packet):
- # if packet.ismarking():
- # self.marking[packet.key()] = packet.payload()
- # else:
- #
- # if len(self.marking) == self.modnum and not self.wait:
- # self.createNode()
- #
- # def run(self):
- # #get initial states from the queue
- # while not self.done:
- # packet = self.queue.get(block=True, timeout=None)
- # self.process(packet)
|