import os, sys, inspect
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 import MachineFactory
from IPython.display import Image, display, display_png
class Matter(object):
def is_hot(self):
return True
def is_too_hot(self):
return False
def show_graph(self, **kwargs):
#print(self.get_graph(**kwargs).string())
self.get_graph(**kwargs).draw('state.png', prog='dot')
display(Image('state.png'))
GraphMachine = MachineFactory.get_predefined(graph=True, nested=True)
states = ['standing', 'walking', {'name': 'caffeinated', 'children':['dithering', 'running']}]
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 = GraphMachine(model=model,
states=states,
transitions=transitions,
auto_transitions=False,
initial='standing',
title="Mood Matrix",
show_conditions=True)
model.show_graph()
model.walk()
model.show_graph()
model.drink()
model.show_graph()
model.walk()
model.show_graph()
model.relax()
model.show_graph()
model.show_graph(show_roi=True)
# multimodel test
model1 = Matter()
model2 = Matter()
machine = GraphMachine(model=[model1, model2],
states=states,
transitions=transitions,
auto_transitions=False,
initial='standing',
title="Mood Matrix",
show_conditions=True)
model1.drink()
model1.drink()
model2.walk()
model1.show_graph()
model2.show_graph()