Example #1
0
class FSM(object):
	def __init__(self):
		self.name = "go"
		self.actionset = []
		self.startstates = []
		self.edgeset = []
		self.cases = []
		self.g = None

	def generateEdgeByState(self, state):
		untracked = [state]
		tracked = []
		edgset = [] 
		while(len(untracked) > 0):
			midstates = []
			state = untracked.pop()
			tracked.append(state)
			for action in self.actionset:
				#get new status
				newsta = action.transfer(copy.deepcopy(state))
				#get new edge
				edge = Edge(state,newsta, 0, action)

				#add to edge set if it's new
				
				if not edge in edgset:
					edgset.append(edge)

				#add to midstatus set if it's a new state
				if not newsta in tracked and not newsta in midstates:
					midstates.append(newsta)
			untracked = midstates
		return edgset
	
	def generateEdge(self):
		#generate all edges
		for start in self.startstates:
			self.edgeset += self.generateEdgeByState(start)
		self.edgeset = list(set(self.edgeset))

	def explore(self):
		self.g = Graph()

		#generate all edges
		self.generateEdge()
		#add all edges in graph
		self.g.addEdge(self.edgeset)
		#set start states 
		self.g.setVexPtype(self.startstates, 1)

		self.g.eulerize()
		edges = self.g.getEurlerCircuit()
		'''
		print "===========Eu=========="
		self.g.outputpath(edges)
		print "===========End========="
		'''
		self.cases = self.g.getPathSet(edges)
	def execute_one(self, case):
		for edge in case:
			print "executing " + edge.action.name + " ... ..."
			if not edge.action.execute():
				return False
		return True
	def execute(self):
		for case in self.cases:
			print "=============Execution================"
			result = self.execute_one(case)
			print("================%s=================" % str(result) )
		
	def dumpcase(self):
		i = 0
		for case in self.cases:
			print("Case " + str(i) + ": " ),
			self.g.outputpath(case)
			i+=1
	def savesvg(self):
		self.g.savesvg()