import mleNode as mn import numpy as np from numpy.linalg import norm import numpy.random as nr from scipy.optimize import minimize import matplotlib.pyplot as plt import seaborn from random import random, randint from six.moves import range seaborn.set_style("white") def create_random_graph(n_nodes, p=.5): graph = .5 * np.random.binomial(2, p=.5, size=(n_nodes, n_nodes)) for k in range(len(graph)): graph[k, k] = 0 return np.log(1. / (1 - p * graph)) def create_star(n_nodes, p=.5): graph = np.zeros((n_nodes, n_nodes)) graph[0] = np.ones((n_nodes,)) graph[0, 0] = 0 for index, row in enumerate(graph[1:-1]): row[index + 1] = 1 graph[-1, 1] = 1 return np.log(1. / (1 - p * graph)) def simulate_cascade(x, graph): """ Simulate an IC cascade given a graph and initial state. For each time step we yield: - susc: the nodes susceptible at the beginning of this time step - x: the subset of susc who became infected """ yield x, np.zeros(graph.shape[0], dtype=bool) susc = np.ones(graph.shape[0], dtype=bool) while np.any(x): susc = susc ^ x # nodes infected at previous step are now inactive if not np.any(susc): break x = 1 - np.exp(-np.dot(graph.T, x)) y = nr.random(x.shape[0]) x = (x >= y) & susc yield x, susc def uniform_source(graph, *args, **kwargs): x0 = np.zeros(graph.shape[0], dtype=bool) x0[nr.randint(0, graph.shape[0])] = True return x0 def var_source(graph, t, node_p=None, *args, **kwargs): if node_p is None: node_p = np.ones(len(graph)) / len(graph) x0 = np.zeros(graph.shape[0], dtype=bool) x0[nr.choice(a=len(graph), p=node_p)] = True return x0 def simulate_cascades(n, graph, source=uniform_source): for t in range(n): x0 = source(graph, t) yield simulate_cascade(x0, graph) def build_cascade_list(cascades, collapse=False): x, s = [], [] for cascade in cascades: xlist, slist = zip(*cascade) x.append(np.vstack(xlist)) s.append(np.vstack(slist)) if not collapse: return x, s else: return np.vstack(x), np.vstack(s) if __name__ == "__main__": #g = np.array([[0, 0, 1], [0, 0, 0.5], [0, 0, 0]]) #p = 0.5 #g = np.log(1. / (1 - p * g)) g = create_random_graph(n_nodes=3) print(g) sizes = [10**3] for si in sizes: cascades = simulate_cascades(si, g) cascade, y_obs = mn.build_matrix(cascades, 2) print(mn.infer(cascade, y_obs)) #conf = mn.bootstrap(cascade, y_obs, n_iter=100) #estimand = np.linalg.norm(np.delete(conf - g[0], 0, axis=1), axis=1) #plt.hist(estimand, bins=40) #plt.show() #error.append(mn.confidence_interval(*np.histogram(estimand, bins=50))) #plt.plot(sizes, error) #plt.show()