# Code:networkx

### From Predictive Chemistry

The networkx library is a great tool for quick graph operations in python put together by the wonderful folks at Los Alamos National Labs. It uses a representation based on dictionaries of dictionaries.

A dictionary of sets is simpler, so I'll show that too. For both representations, each node is a dictionary key, and the value stores the names of its child nodes. So, a graph with nodes 1,2,3 connected in a triangle would look like:

G = {1: {2,3}, 2: {1,3}, 3: {1,2} } # dict-of-sets G = {1: {2:1,3:1}, 2: {1:1,3:1}, 3: {1:1,2:1} } # dict-of-dicts

The **{1, 2, 3}** notation means create a set, while **{1:1, 2:2, 3:3}** means create a dictionary.

To test whether a node, **u** is parent to a node **v**, we can just write,

def is_child(G, u, v): return v in G[u] # both formats

To add a node to a tree, I would need to create a new key in the dictionary -- like so:

def add_node(G, u): assert u not in G G[u] = set() # dict-of-sets def add_node(G, u): assert u not in G G[u] = {} # dict-of-dicts

To put in parent-child edges, I have to add members to the right set,

def add_children(G, u, kids): G[u] += kids # dict-of-set def add_children(G, u, kids): k,v in kids.iteritems(): # dict-of-dict G[u][k] = v # e.g. add_node(G, 4) add_children(G, 4, {1,2})

This version of **add_children** makes a directed graph, since child to parent edges were not added.

Amongst other things, networkx can visualize graphs:

import matplotlib.pyplot as plt import networkx as nx nG=nx.from_dict_of_lists(G) # maybe works for dict-of-set nG=nx.from_dict_of_dicts(G) # for dict-of-dict nx.draw(nG) plt.show()