summaryrefslogtreecommitdiffstats
path: root/hawkes
diff options
context:
space:
mode:
Diffstat (limited to 'hawkes')
-rw-r--r--hawkes/cause.py93
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)