In [1]:
from __future__ import print_function
import pygraphviz as pgv
import pandas as pd
import numpy as np

from genome import Genome

from IPython.display import Image

In [2]:
X = np.array([[0,0],[0,1],[1,0],[1,1]], dtype=np.float16)
Y = np.array([[0],[1],[1],[0]], dtype=np.float16) 
data = X,Y

In [3]:
class Visualize(object):
    '''
    Mutate Visualization: Using PyGraphViz and Dot Syntax
    '''

    def __init__(self, GENOME):
        self.nodes, self.connections = GENOME

    def create(self):
        '''
        Create a directed graph from a Genome (Genotype)
        '''
        
        # Capture a List of Lists for in/out connections
        connectionList = self.connections[['in','out']].values.tolist()

        # Cluster nodes by type
        sensorNodes = self.nodes.loc[self.nodes.type == ("sensor"),("node")].values.tolist()
        hiddenNodes = self.nodes.loc[self.nodes.type == ("hidden"),("node")].values.tolist()
        outputNodes = self.nodes.loc[self.nodes.type == ("output"),("node")].values.tolist()

        # Create the dot syntax map
        graphString = ("digraph {")
        for ix,ele in enumerate(connectionList):
            graphString += (str(ele[0]) + "->" + str(ele[1]) + ";")
        graphString += ("}")

        # Create the Graph
        G = pgv.AGraph(graphString, strict=True, directed=True, rankdir='LR')
        G.node_attr['shape']='circle'
        #G.add_subgraph(sensorNodes, name='cluster_sensors', label="Sensor Nodes", rank="same")
        #G.add_subgraph(hiddenNodes, name='cluster_hidden', label="Hidden Nodes")
        #G.add_subgraph(outputNodes, name='cluster_output', label="Output Nodes", rank="same")

        # Create a list of all the layers in the nodes DataFrame
        layerList = sorted(self.nodes.layer.unique().tolist())
        # Use the list to create a subgraph for each cluster of nodes in each layer
        for ix,ele in enumerate(layerList):
            # Select the nodes in layer ele as a list
            layerN = self.nodes.loc[self.nodes.layer == ele,("node")].values.tolist()
            # Create a name for a new subgraph
            aName = ("cluster_" + str(ele))
            # Create a label for a new subgraph
            aLabel = ("layer " + str(ele))
            # Add the subgraph to the Graph
            if layerList[-1] == ix:
                G.add_subgraph(layerN, name=aName, label=("output"), rank="same")
            elif layerList[0] == ix:
                G.add_subgraph(layerN, name=aName, label=("sensor"), rank="same")
            else:
                G.add_subgraph(layerN, name=aName, label=aLabel, rank="same")
        
        G.graph_attr.update(dpi="90")
        
        imageResult = G.draw(format='png', prog='dot')

        return imageResult

In [4]:
g = Genome(data)
GENOME = g.create()

In [5]:
for _ in range(100):
    GENOME = g.mutate(GENOME)

In [6]:
v = Visualize(GENOME)
Image(v.create())


Out[6]: