diff options
Diffstat (limited to 'hawkes')
| -rw-r--r-- | hawkes/cause.py | 93 |
1 files changed, 43 insertions, 50 deletions
diff --git a/hawkes/cause.py b/hawkes/cause.py index fddbfa9..17ec884 100644 --- a/hawkes/cause.py +++ b/hawkes/cause.py @@ -1,74 +1,65 @@ from cPickle import load from math import exp, sin -from csv import reader +from collections import Counter +from csv import reader, writer from data2 import parse import sys import networkx as nx import matplotlib.pyplot as plt +import numpy as np -def fatal(): +def get_fatals(): with open(sys.argv[1]) as fh: fh.readline() r = reader(fh) d = {i + 1: parse(row[7]) for (i, row) in enumerate(r)} d = {k: v for k, v in d.iteritems() if v} - return d + return d.items() -def main(lamb, alpha, mu): +def cause(lamb, alpha, mu): G = nx.DiGraph() - r, dr, i = 0, 0, 0 - drf, iff, rf = 0, 0, 0 - dnf, rnf, inf = 0, 0, 0 - si = 0 - f = fatal().items() - l = [] + roots, droots, infections = 0, 0, 0 + fatal_droots, fatal_infections, fatal_roots = 0, 0, 0 + fatals = get_fatals() for ((n1, t1), s) in event_edges.iteritems(): G.add_node((n1, t1)) if not s: - dr += 1 - if (n1, t1) in f: - drf += 1 - else: - dnf += 1 + droots += 1 + if (n1, t1) in fatals: + fatal_droots += 1 continue - br = lamb * (1 + 0.43 * sin(0.0172 * t1 + 4.36)) - prl = sorted([(n2, t2, alpha / d * mu * exp(-mu * (t1 - t2))) - for (n2, t2, d) in s], reverse=True) - pr = sum(e[2] for e in prl) - #if sum(e[2] for e in prl[:1]) > br: + background_rate = lamb * (1 + 0.43 * sin(0.0172 * t1 + 4.36)) + neighbors = sorted([(n2, t2, alpha / d * mu * exp(-mu * (t1 - t2))) + for (n2, t2, d) in s], reverse=True) + neighbor_rate = sum(e[2] for e in neighbors) + # if sum(e[2] for e in prl[:1]) > br: # G.add_edge((n1, t1), tuple(prl[0][:2])) - if br > pr: - r += 1 - if (n1, t1) in f: - rf += 1 - else: - rnf += 1 + if background_rate > neighbor_rate: + roots += 1 + if (n1, t1) in fatals: + fatal_roots += 1 else: - G.add_edge((n1, t1), tuple(prl[0][:2])) - l.append(prl[0][2] / br) - i += 1 - if (n1, t1) in f: - iff += 1 - else: - inf += 1 - print "nedges:", G.number_of_edges() - cs = {} - for c in nx.weakly_connected_components(G): - cs[len(c)] = cs.get(len(c), 0) + 1 - cs = sorted(cs.iteritems(), key=lambda x: x[0]) - x, y = zip(*cs) - print cs - plt.loglog(x, y, "-") - plt.xlabel("Cascade size") - plt.ylabel("Number of cascades") - plt.savefig("dist.pdf") - l.sort(reverse=True) - plt.plot(l) - plt.show() - return (lamb, alpha, mu, dr, r, i, drf, rf, iff, - dnf, rnf, inf, si, len(event_edges)) + G.add_edge((n1, t1), tuple(neighbors[0][:2])) + # l.append(prl[0][2] / br) + infections += 1 + if (n1, t1) in fatals: + fatal_infections += 1 + # l.sort(reverse=True) + # plt.plot(l) + # plt.show() + return (droots, roots, infections, fatal_droots, + fatal_roots, fatal_infections, G) + + +def analyze_graph(G): + counts = Counter(len(c) for c in nx.weakly_connected_components(G)) + w = writer(open("components_dist.csv", "w")) + w.writerows(counts.most_common()) + edges = ((n1, t1, n2, t2) for ((n1, t1), (n2, t2)) in G.edges_iter()) + e = writer(open("edges.csv", "w")) + e.writerows(edges) if __name__ == "__main__": @@ -76,4 +67,6 @@ if __name__ == "__main__": lamb, alpha, mu = 1.1847510744e-05, 0.00316718040144, 0.00393069204339 # print len(event_edges), sum(len(e) for e in events.itervalues()) # print len(fatal()) - print main(lamb, alpha, mu) + (doors, roots, infections, fatal_droots, + fatal_roots, fatal_infections, G) = cause(lamb, alpha, mu) + analyze_graph(G) |
