In [1]:
%pylab inline


Welcome to pylab, a matplotlib-based Python environment [backend: module://IPython.zmq.pylab.backend_inline].
For more information, type 'help(pylab)'.

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]:
[State(action='D', DD=0, CD=0, DC=1, CC=0),
 State(action='C', DD=1, CD=0, DC=0, CC=1)]

In [9]:
paint_automata(_)



In [12]:
parse_string_to_automata('[D/0 0 1 0, C/1 0 0 1]')


Out[12]:
[State(action='D', DD=0, CD=0, DC=1, CC=0),
 State(action='C', DD=1, CD=0, DC=0, CC=1)]

In [13]:
paint_automata(_)



In [ ]: