In [1]:
%pylab inline
In [3]:
from collections import namedtuple
import scipy.misc
import os
import pydot
import re
def find_between(s, pre, post=''):
result = re.search(pre+'(.*)'+post, s)
return result.group(1)
State = namedtuple('State', 'action DD CD DC CC')
In [4]:
def parse_string_to_automata(string):
"""
Given a string representation of an aumata, returns a list of states
"""
list_of_states = []
no_rubish = find_between(string, '\[', '\]')
for i in no_rubish.split(','):
state_strings = find_between(i, '/').split(' ')
list_of_states.append(State(i.strip()[0], int(state_strings[0]), int(state_strings[1]), int(state_strings[2]), int(state_strings[3])))
return list_of_states
In [11]:
def paint_automata(list_of_states, title='', size=5):
graph = pydot.Dot(graph_type='digraph')
list_of_nodes = []
#ad nodes
for i, state in enumerate(list_of_states):
if state.action == 'C':
color = 'blue'
if state.action == 'D':
color = 'red'
list_of_nodes.append(pydot.Node(str(i), style="filled", fillcolor=color))
for i in list_of_nodes:
graph.add_node(i)
#add transitions
for i, state in enumerate(list_of_states):
if (state.DD==state.DC==state.CD==state.CC):
graph.add_edge(pydot.Edge(i, state.DD, fontsize="10.0", label='*'))
elif (state.DD==state.DC!=state.CD!=state.CC):
graph.add_edge(pydot.Edge(i, state.DD, fontsize="10.0", label='D*'))
graph.add_edge(pydot.Edge(i, state.CD, fontsize="10.0", label='CD'))
graph.add_edge(pydot.Edge(i, state.CC, fontsize="10.0", label='CC'))
elif (state.DD!=state.DC!=state.CD==state.CC):
graph.add_edge(pydot.Edge(i, state.DD, fontsize="10.0", label='DD'))
graph.add_edge(pydot.Edge(i, state.CD, fontsize="10.0", label='C*'))
graph.add_edge(pydot.Edge(i, state.DC, fontsize="10.0", label='DC'))
else:
graph.add_edge(pydot.Edge(i, state.DD, fontsize="10.0", label='DD'))
graph.add_edge(pydot.Edge(i, state.DC, fontsize="10.0", label='DC'))
graph.add_edge(pydot.Edge(i, state.CD, fontsize="10.0", label='CD'))
graph.add_edge(pydot.Edge(i, state.CC, fontsize="10.0", label='CC'))
graph.write_png('ex.png')
plt.figure(figsize=(size, size))
plt.xticks([],[])
plt.yticks([],[])
plt.imshow(scipy.misc.imread('ex.png'))
plt.title(title)
os.remove('ex.png')
In [8]:
parse_string_to_automata('[D/0 0 1 0, C/1 0 0 1]')
Out[8]:
In [9]:
paint_automata(_)
In [12]:
parse_string_to_automata('[D/0 0 1 0, C/1 0 0 1]')
Out[12]:
In [13]:
paint_automata(_)
In [ ]: