#!/usr/bin/env python # coding: utf-8 # In[1]: import os, sys, inspect, io cmd_folder = os.path.realpath( os.path.dirname( os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0]))) if cmd_folder not in sys.path: sys.path.insert(0, cmd_folder) from transitions.extensions.states import Timeout, Tags, add_state_features from transitions.extensions.factory import HierarchicalGraphMachine as Machine from IPython.display import Image, display, display_png @add_state_features(Timeout, Tags) class CustomStateMachine(Machine): pass class Matter(object): def do_x(self): pass def do_y(self): pass def do_z(self): pass def is_hot(self): return True def is_too_hot(self): return False def show_graph(self, **kwargs): stream = io.BytesIO() self.get_graph(**kwargs).draw(stream, prog='dot', format='png') display(Image(stream.getvalue())) extra_args = dict(auto_transitions=False, initial='standing', title='Mood Matrix', show_conditions=True, show_state_attributes=True) # In[2]: states = [{'name': 'caffeinated', 'on_enter': 'do_x', 'children':['dithering', 'running'], 'transitions': [['drink', 'dithering', '=']]}, {'name': 'standing', 'on_enter': ['do_x', 'do_y'], 'on_exit': 'do_z'}, {'name': 'walking', 'tags': ['accepted', 'pending'], 'timeout': 5, 'on_timeout': 'do_z'}, ] transitions = [ ['walk', 'standing', 'walking'], ['go', 'standing', 'walking'], ['stop', 'walking', 'standing'], {'trigger': 'drink', 'source': '*', 'dest': 'caffeinated_dithering', 'conditions':'is_hot', 'unless': 'is_too_hot'}, ['walk', 'caffeinated_dithering', 'caffeinated_running'], ['relax', 'caffeinated', 'standing'], ['sip', 'standing', 'caffeinated'] ] model = Matter() machine = CustomStateMachine(model=model, states=states, transitions=transitions, **extra_args) model.show_graph() # In[3]: model.walk() model.show_graph() # In[4]: model.drink() model.show_graph() # In[5]: model.walk() model.show_graph() # In[6]: model.relax() model.show_graph() # In[7]: model.show_graph(show_roi=True) # In[9]: # multimodel test model1 = Matter() model2 = Matter() machine = CustomStateMachine(model=[model1, model2], states=states, transitions=transitions, **extra_args) model1.drink() model1.drink() model2.walk() model1.show_graph() # In[ ]: