Source code for bppy.utils.dfs

from bppy.model.b_event import BEvent


[docs]class Node: def __init__(self, prefix, data): self.prefix = prefix self.data = data self.transitions = {} def __key(self): return str(self.data) def __hash__(self): return hash(self.__key()) def __eq__(self, other): return self.__key() == other.__key() def __str__(self): return str(self.prefix) + str(self.data)
[docs]class DFSBThread: def __init__(self, bthread_gen, ess, event_list): self.bthread_gen = bthread_gen self.ess = ess self.event_list = event_list
[docs] def get_state(self, prefix): bt = self.bthread_gen() s = bt.send(None) for e in prefix: if s is None: break if 'block' in s: if isinstance(s.get('block'), BEvent): if e == s.get('block'): return None else: if e in s.get('block'): return None if self.ess.is_satisfied(e, s): s = bt.send(e) if s is None: return {} return s
[docs] def run(self): init_s = Node(tuple(), self.get_state(tuple())) visited = [] stack = [] stack.append(init_s) while len(stack): s = stack.pop() if s not in visited: visited.append(s) for e in self.event_list: new_s = Node(s.prefix + (e,), self.get_state(s.prefix + (e,))) if new_s.data is None: continue s.transitions[e] = new_s if new_s not in visited: stack.append(new_s) visited = [s.data for s in visited] return init_s, visited