In [1]:
from IPython.display import IFrame
IFrame("./projection_onto_bistochastic_matrices.pdf", width=800, height=500)
Out[1]:
In [2]:
IFrame("./wip/bounding_erdos_renyi/main.pdf", width=800, height=500)
Out[2]:
In [3]:
import numpy as np
import igraph as ig
import matplotlib.pyplot as plt
%matplotlib inline
In [135]:
def get_graph(n, m):
num_edges = int(round(n*m))
g = ig.Graph.Erdos_Renyi(n, m=num_edges)
p = ig.RainbowPalette(num_edges)
g.es['color'] = [p.get(idx) for idx in xrange(num_edges)]
return g
def get_ones_graph(n):
J = np.ones((n,n))
return ig.Graph.Adjacency(J.tolist(), mode=ig.ADJ_UNDIRECTED)
def adj_mat(g):
return np.matrix(g.get_adjacency().data)
def get_kronecker_graph(g1, g2, graph_first=True):
# setup
graph = g1 if graph_first else g2
ones = g2 if graph_first else g1
p = len(g2.vs)
# map colors to idx
eid_color_map = {}
for e, col in zip(graph.es, graph.es['color']):
eid_color_map[(e.source, e.target)] = eid_color_map[(e.target, e.source)] = col
# kron
ak = np.kron(adj_mat(g1), adj_mat(g2))
gk = ig.Graph.Adjacency(ak.tolist(), mode=ig.ADJ_UNDIRECTED)
# map kron edge to color
for edge in gk.es:
i, j = edge.source, edge.target
if graph_first: gi, gj = (i)//p, (j)//p
else: gi, gj = i % p, j % p
edge['color'] = eid_color_map[(gi, gj)]
return gk
def plot_graph(graph, **kw2):
kw = dict(bbox=(150,150), vertex_size=7, vertex_color='gray', edge_width=1)
if 'color' in graph.es.attributes(): kw['edge_color'] =graph.es['color']
kw.update(kw2)
return ig.plot(graph, **kw)
In [136]:
G2 = get_graph(2,.5)
G3 = get_graph(3,1)
J2 = get_ones_graph(2)
J3 = get_ones_graph(3)
J = lambda p: get_ones_graph(p)
In [137]:
plot_graph(G2)
Out[137]:
In [138]:
# G2 kron J2
gk = get_kronecker_graph(G2, J2)
print (adj_mat(gk))
plot_graph(gk)
Out[138]:
In [139]:
# G2 kron J3
gk = get_kronecker_graph(G2, J(3))
print (adj_mat(gk))
plot_graph(gk)
Out[139]:
In [140]:
# J2 kron G2
plot_graph(get_kronecker_graph(J2, G2, graph_first=False))
Out[140]:
In [141]:
plot_graph(G3)
Out[141]:
In [142]:
# G3 kron J2
G3J2 = get_kronecker_graph(G3, J(2))
plot_graph(G3J2)
Out[142]:
In [143]:
# J2 kron G3
J2G3 = get_kronecker_graph(J2, G3, graph_first=False)
plot_graph(J2G3)
Out[143]:
In [ ]: