import ujson as json
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import plotly.plotly as py
import networkx as nx
import collections
from moztelemetry import get_pings, get_pings_properties, get_one_ping_per_client
%pylab inline
Populating the interactive namespace from numpy and matplotlib
# parallelism=48 on a 3 node cluster
sc.defaultParallelism
48
pings = get_pings(sc, app="Firefox",
channel="nightly",
submission_date=("20150507","20150514"),
fraction=1,
schema="v4")
p = pings.first()
# p["payload"]["info"]
p.keys()
# p.get("payload",{}).get("info",{}).get("subsessionId",False)
# {k:p[k] for k in p.keys() if k!="main"}
[u'clientId', u'id', u'environment', u'application', u'version', 'meta', u'creationDate', u'type', u'payload']
info = get_pings_properties(pings, ["clientId",
"type",
"payload/info",
"environment/build/buildId"])
subsess = info.filter(
lambda p: ((p["payload/info"].get("reason", "idle-daily") != "idle-daily") and
(p["type"] == "main") and
(p["environment/build/buildId"]>"20150507000000")) )
subsess.cache()
numPings = subsess.count()
--------------------------------------------------------------------------- Py4JJavaError Traceback (most recent call last) <ipython-input-8-fdcdf90a8222> in <module>() 1 subsess.cache() ----> 2 numPings = subsess.count() /home/hadoop/spark/python/pyspark/rdd.pyc in count(self) 827 3 828 """ --> 829 return self.mapPartitions(lambda i: [sum(1 for _ in i)]).sum() 830 831 def stats(self): /home/hadoop/spark/python/pyspark/rdd.pyc in sum(self) 818 6.0 819 """ --> 820 return self.mapPartitions(lambda x: [sum(x)]).reduce(operator.add) 821 822 def count(self): /home/hadoop/spark/python/pyspark/rdd.pyc in reduce(self, f) 723 yield reduce(f, iterator, initial) 724 --> 725 vals = self.mapPartitions(func).collect() 726 if vals: 727 return reduce(f, vals) /home/hadoop/spark/python/pyspark/rdd.pyc in collect(self) 684 """ 685 with SCCallSiteSync(self.context) as css: --> 686 bytesInJava = self._jrdd.collect().iterator() 687 return list(self._collect_iterator_through_file(bytesInJava)) 688 /home/hadoop/anaconda/lib/python2.7/site-packages/py4j/java_gateway.pyc in __call__(self, *args) 536 answer = self.gateway_client.send_command(command) 537 return_value = get_return_value(answer, self.gateway_client, --> 538 self.target_id, self.name) 539 540 for temp_arg in temp_args: /home/hadoop/anaconda/lib/python2.7/site-packages/py4j/protocol.pyc in get_return_value(answer, gateway_client, target_id, name) 298 raise Py4JJavaError( 299 'An error occurred while calling {0}{1}{2}.\n'. --> 300 format(target_id, '.', name), value) 301 else: 302 raise Py4JError( Py4JJavaError: An error occurred while calling o70.collect. : org.apache.spark.SparkException: Job aborted due to stage failure: Task 186 in stage 2.0 failed 4 times, most recent failure: Lost task 186.3 in stage 2.0 (TID 237, ip-10-37-146-226.us-west-2.compute.internal): ExecutorLostFailure (executor 6 lost) Driver stacktrace: at org.apache.spark.scheduler.DAGScheduler.org$apache$spark$scheduler$DAGScheduler$$failJobAndIndependentStages(DAGScheduler.scala:1214) at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1203) at org.apache.spark.scheduler.DAGScheduler$$anonfun$abortStage$1.apply(DAGScheduler.scala:1202) at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59) at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47) at org.apache.spark.scheduler.DAGScheduler.abortStage(DAGScheduler.scala:1202) at org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:696) at org.apache.spark.scheduler.DAGScheduler$$anonfun$handleTaskSetFailed$1.apply(DAGScheduler.scala:696) at scala.Option.foreach(Option.scala:236) at org.apache.spark.scheduler.DAGScheduler.handleTaskSetFailed(DAGScheduler.scala:696) at org.apache.spark.scheduler.DAGSchedulerEventProcessActor$$anonfun$receive$2.applyOrElse(DAGScheduler.scala:1420) at akka.actor.Actor$class.aroundReceive(Actor.scala:465) at org.apache.spark.scheduler.DAGSchedulerEventProcessActor.aroundReceive(DAGScheduler.scala:1375) at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516) at akka.actor.ActorCell.invoke(ActorCell.scala:487) at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238) at akka.dispatch.Mailbox.run(Mailbox.scala:220) at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:393) at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
numPings
Get the "payload/info" section recent pings from builds newer than 20150507000000, and which are not idle-daily pings, and group by clientId
clients = subsess.map(lambda p: (p.get("clientId","noId"),
[p["payload/info"]]) ) \
.reduceByKey(lambda l1,l2: l1+l2)
clients.cache()
PythonRDD[10] at RDD at PythonRDD.scala:43
numClients = clients.count()
numClients
67807
Once we've grouped by clientId, we can use the subSessionIds and previousSubsessionId pointer to construct a graph of the session, and then look at the degree of each node in the graph to see whether the graph looks the way we expect. Ideally, we should have a graph that has zero nodes with degree greater than 1 (no subsession should be pointed at by two or more sessions) and only one node with degree zero (the first subsession in the chain won't point to any prior subsession). Additionally, any given value of 'profileSubsessionCounter' should appear only once.
def sessGraphFromList(sessInfoList):
g = nx.DiGraph()
for s in sessInfoList:
# each s is a separate subsession submission "info" section
# have to clear these vars to prevent spillover from previous iter
subsessId = None
prevSubSess = None
try:
subsessId = s['subsessionId']
except KeyError:
continue
N = s.get("profileSubsessionCounter","NA")
g.add_node(subsessId,subSessNum=N)
prevSubSess = s.get('previousSubsessionId',None)
if prevSubSess:
g.add_node(prevSubSess)
g.add_edge(subsessId,prevSubSess)
return g
def degreeDistrib(g):
return collections.Counter(g.out_degree().values())
def subsessSummary(sessInfoList):
g = sessGraphFromList(sessInfoList)
d = degreeDistrib(g)
subSessCounterMult = collections.Counter(map(lambda x:x["profileSubsessionCounter"], sessInfoList))
return {"info":sorted(sessInfoList, key=lambda x:x["profileSubsessionCounter"]),
"graph":g,
"degDist":d,
"subSessCounterMult":subSessCounterMult}
subsessSummaries = clients.map(lambda c: (c[0],subsessSummary(c[1])))
subsessSummaries.cache()
PythonRDD[12] at RDD at PythonRDD.scala:43
# subsessSummaries.take(1)
badGraphSummaries = subsessSummaries.filter(
lambda id_summary: any([k>1 for k in id_summary[1]["degDist"].keys()]) \
or any([v>1 for k,v in id_summary[1]["degDist"].iteritems() if k!=1]) \
or any([v>1 for v in id_summary[1]["subSessCounterMult"].values()]) )
badGraphSummaries.cache()
numBadGraphs = badGraphSummaries.count()
numBadGraphs
5780
numBadGraphs/float(numClients)
0.08524193667320483
bg = badGraphSummaries.take(100)
def plotSessGraphsAndInfo(sessGraphInfo):
cId = sessGraphInfo[0]
g = sessGraphInfo[1]["graph"]
dg = sessGraphInfo[1]["degDist"]
sscc = [(sessCounter,mult) for sessCounter,mult in sessGraphInfo[1]["subSessCounterMult"].iteritems() if mult>1]
# print cId
print "node degrees (degree, number of nodes with degree)--",list(dg.iteritems())
if sscc:
print "repeated subsession counters (counter, multiplicty)--",sscc
pos = nx.spectral_layout(g)
labels = [(n,d['subSessNum']) for n,d in g.nodes(data=True) if d]
G = nx.draw_spectral(g,node_size=10, node_color="w")
for sessId,label in labels:
x,y = pos[sessId]
plt.text(x+.02,y+.02,s=label
,horizontalalignment='center')
plt.show()
map(plotSessGraphsAndInfo,bg)
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 2)] repeated subsession counters (counter, multiplicty)-- [(5, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 4)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 8)] repeated subsession counters (counter, multiplicty)-- [(1, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 27)] repeated subsession counters (counter, multiplicty)-- [(27, 2), (32, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 4)] repeated subsession counters (counter, multiplicty)-- [(1, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 10)] repeated subsession counters (counter, multiplicty)-- [(8, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 49)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 21)] repeated subsession counters (counter, multiplicty)-- [(10, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 27)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 9)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 39)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 22)] repeated subsession counters (counter, multiplicty)-- [(1, 25), (2, 20), (3, 18), (4, 18), (5, 18), (6, 18), (7, 4), (8, 3), (9, 3), (10, 3), (11, 3), (12, 3), (13, 3), (14, 3), (15, 3), (16, 3), (17, 3), (18, 3), (19, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 8)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 18)] repeated subsession counters (counter, multiplicty)-- [(11, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 4)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 22)] repeated subsession counters (counter, multiplicty)-- [(11, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 18)]
node degrees (degree, number of nodes with degree)-- [(0, 2)] repeated subsession counters (counter, multiplicty)-- [(1, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 34)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 12)] repeated subsession counters (counter, multiplicty)-- [(1, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 16)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 19)]
node degrees (degree, number of nodes with degree)-- [(0, 6), (1, 8)] repeated subsession counters (counter, multiplicty)-- [(1, 4), (2, 3), (3, 2), (4, 3)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 23)] repeated subsession counters (counter, multiplicty)-- [(10, 2), (11, 2), (12, 2), (13, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 11)]
node degrees (degree, number of nodes with degree)-- [(0, 4), (1, 3)] repeated subsession counters (counter, multiplicty)-- [(1, 4), (2, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 41)] repeated subsession counters (counter, multiplicty)-- [(29, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 4), (1, 5)] repeated subsession counters (counter, multiplicty)-- [(1, 2), (3, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 11)] repeated subsession counters (counter, multiplicty)-- [(11, 2), (12, 2), (13, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 27)] repeated subsession counters (counter, multiplicty)-- [(22, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 33)] repeated subsession counters (counter, multiplicty)-- [(4, 2), (5, 2), (6, 2), (7, 2), (8, 2), (9, 2), (10, 2), (11, 2), (12, 2), (13, 2), (14, 2), (15, 2), (16, 2), (17, 2), (18, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 14)] repeated subsession counters (counter, multiplicty)-- [(11, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 8)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 129)] repeated subsession counters (counter, multiplicty)-- [(34, 2), (48, 2), (61, 2), (86, 2), (93, 2), (98, 2), (102, 2), (116, 2), (129, 2), (136, 2), (148, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 85)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 66)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 1)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 25)] repeated subsession counters (counter, multiplicty)-- [(20, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 7)] repeated subsession counters (counter, multiplicty)-- [(6, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 15)] repeated subsession counters (counter, multiplicty)-- [(8, 2), (9, 2), (10, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 3)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 3)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 76)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 13)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 22)] repeated subsession counters (counter, multiplicty)-- [(17, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 11)]
node degrees (degree, number of nodes with degree)-- [(0, 3), (1, 101)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 25)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 24)] repeated subsession counters (counter, multiplicty)-- [(3, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 60)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 26)] repeated subsession counters (counter, multiplicty)-- [(16, 2), (22, 2), (27, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 4)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 33)] repeated subsession counters (counter, multiplicty)-- [(44, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 32)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 4)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 9)]
node degrees (degree, number of nodes with degree)-- [(0, 3), (1, 41)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 63)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 6)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 29)] repeated subsession counters (counter, multiplicty)-- [(7, 2), (8, 2), (9, 2), (10, 2), (11, 2), (12, 2), (13, 2), (14, 2), (15, 2), (16, 2), (17, 2), (18, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 71)]
node degrees (degree, number of nodes with degree)-- [(0, 7), (1, 67)] repeated subsession counters (counter, multiplicty)-- [(87, 2), (98, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 19)] repeated subsession counters (counter, multiplicty)-- [(19, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 26)] repeated subsession counters (counter, multiplicty)-- [(31, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 2)] repeated subsession counters (counter, multiplicty)-- [(2, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 9)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 17)] repeated subsession counters (counter, multiplicty)-- [(14, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 39)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 13)] repeated subsession counters (counter, multiplicty)-- [(7, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 25)] repeated subsession counters (counter, multiplicty)-- [(4, 2), (10, 2), (11, 2), (12, 2), (13, 3), (14, 2), (15, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 71)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 41)] repeated subsession counters (counter, multiplicty)-- [(11, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 3), (1, 37)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 98)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 5)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 19)] repeated subsession counters (counter, multiplicty)-- [(7, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 9)]
node degrees (degree, number of nodes with degree)-- [(0, 3), (1, 135)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 44)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 11)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 31)] repeated subsession counters (counter, multiplicty)-- [(11, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 19)] repeated subsession counters (counter, multiplicty)-- [(20, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 21)] repeated subsession counters (counter, multiplicty)-- [(19, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 28)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 1)] repeated subsession counters (counter, multiplicty)-- [(1, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 18)] repeated subsession counters (counter, multiplicty)-- [(5, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 16)] repeated subsession counters (counter, multiplicty)-- [(1, 2), (13, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 56)] repeated subsession counters (counter, multiplicty)-- [(41, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 13)] repeated subsession counters (counter, multiplicty)-- [(17, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 11)] repeated subsession counters (counter, multiplicty)-- [(5, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 51)] repeated subsession counters (counter, multiplicty)-- [(20, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 4)] repeated subsession counters (counter, multiplicty)-- [(6, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 27)] repeated subsession counters (counter, multiplicty)-- [(5, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 1), (1, 16)] repeated subsession counters (counter, multiplicty)-- [(25, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 3), (1, 64)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 10)] repeated subsession counters (counter, multiplicty)-- [(4, 2), (5, 2), (6, 2), (7, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 5)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 1)]
node degrees (degree, number of nodes with degree)-- [(0, 3), (1, 2)] repeated subsession counters (counter, multiplicty)-- [(1, 2)]
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 33)]
[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]
clientOfInterest = bg[3]
def getDictFields(d,fields):
return {field:d.get(field,None) for field in fields}
plotSessGraphsAndInfo(clientOfInterest)
dd=map(lambda d: getDictFields(d,["previousSubsessionId",
"subsessionId",
"profileSubsessionCounter"]),
clientOfInterest[1]["info"])
# bg[3][1]["info"][0]
dd.sort(key=lambda d:d["profileSubsessionCounter"])
dd
# getDictFields(bg[3][1]["info"][0],["previousSubsessionId",
# "subsessionId",
# "subsessionCounter"])
clientOfInterest[1]["graph"].edges()
node degrees (degree, number of nodes with degree)-- [(0, 3), (1, 11)] repeated subsession counters (counter, multiplicty)-- [(1, 3), (2, 2), (3, 2), (4, 2)]
[(u'0cd6e454-5ada-4969-9137-a05a8646c1d7', u'8bc8efca-1e7c-4c01-afbe-e406a663438b'), (u'f338373f-1ac4-4526-80a2-767b7889837f', u'a9e3f6c5-706c-4892-91da-ceb182105d54'), (u'5f4d6fdf-b9a9-4d80-a2c2-2d6bbc06910e', u'f338373f-1ac4-4526-80a2-767b7889837f'), (u'8bc8efca-1e7c-4c01-afbe-e406a663438b', u'5f4d6fdf-b9a9-4d80-a2c2-2d6bbc06910e'), (u'939d9244-0b1f-4bb4-b09d-d1fb2299988a', u'0cd6e454-5ada-4969-9137-a05a8646c1d7'), (u'0a4c7f83-fb40-4f25-8133-234b1854340d', u'1a3e0c10-4357-4e88-b726-7a5f55b45722'), (u'79fe1306-ee60-4fe9-a53d-ed696e1967f8', u'083158ce-5e32-4b35-9250-728b70dcd4c3'), (u'd71a7318-fed6-4e6d-8888-6be9cdb27db3', u'79f7a373-a981-4df9-8d40-242bd48a0b5e'), (u'598fc94d-35f7-45b9-b5ab-195799cfd7b9', u'939d9244-0b1f-4bb4-b09d-d1fb2299988a'), (u'79f7a373-a981-4df9-8d40-242bd48a0b5e', u'598fc94d-35f7-45b9-b5ab-195799cfd7b9'), (u'083158ce-5e32-4b35-9250-728b70dcd4c3', u'0a4c7f83-fb40-4f25-8133-234b1854340d')]
def plotSessGraphsAndInfo2(sessGraphInfo):
cId = sessGraphInfo[0]
g = sessGraphInfo[1]["graph"]
dg = sessGraphInfo[1]["degDist"]
sscc = [(sessCounter,mult) for sessCounter,mult in sessGraphInfo[1]["subSessCounterMult"].iteritems() if mult>1]
info = [
# print cId
print "node degrees (degree, number of nodes with degree)--",list(dg.iteritems())
if sscc:
print "repeated subsession counters (counter, multiplicty)--",sscc
nodeNums = [d['subSessNum'] for n,d in g.nodes(data=True) if d]
minNode = min(nodeNums)
pos = {n:([d['subSessNum'],0] if d else [minNode-3,0+rand()])
for n,d in g.nodes(data=True)}
# pos = nx.spectral_layout(g)
labels = [(n,d['subSessNum']) for n,d in g.nodes(data=True) if d]
fig, ax = plt.subplots(1,figsize=(18,3), dpi=100)
G = nx.draw(g,pos=pos,ax=ax,node_size=10, node_color="w")
for sessId,label in labels:
x,y = pos[sessId]
plt.text(x+.02,y+.02,s=label
,horizontalalignment='center')
plt.show()
plotSessGraphsAndInfo2(bg[10])
node degrees (degree, number of nodes with degree)-- [(0, 2), (1, 39)]
bg[10][1]["info"]
[{u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1', u'asyncPluginInit': False, u'previousBuildId': u'20150506030206', u'previousSubsessionId': u'2624123a-38fa-42d5-a9ac-583314cd283f', u'profileSubsessionCounter': 12, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/617dbce26726', u'sessionId': u'a25f3c06-60d8-4bce-8888-09c21ea3c89d', u'sessionStartDate': u'2015-05-07T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'cf15dafc-88ed-4ea0-8d98-0b8a7cca04a5', u'subsessionLength': 71, u'subsessionStartDate': u'2015-05-07T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'cf15dafc-88ed-4ea0-8d98-0b8a7cca04a5', u'profileSubsessionCounter': 13, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/617dbce26726', u'sessionId': u'469a3f90-7e1f-4228-a4e8-749dd26ce086', u'sessionStartDate': u'2015-05-07T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'5d48b45c-ba84-48ef-bee0-0b93f47002b8', u'subsessionLength': 70, u'subsessionStartDate': u'2015-05-07T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'5d48b45c-ba84-48ef-bee0-0b93f47002b8', u'profileSubsessionCounter': 14, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/617dbce26726', u'sessionId': u'01990ab7-f1d3-4688-a139-eeff8bc9deac', u'sessionStartDate': u'2015-05-07T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'defedbf8-3d81-48a7-9718-c1e0ae07c3c7', u'subsessionLength': 725, u'subsessionStartDate': u'2015-05-07T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'defedbf8-3d81-48a7-9718-c1e0ae07c3c7', u'profileSubsessionCounter': 15, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/617dbce26726', u'sessionId': u'f084a1e5-9894-448e-a211-45c2f05da0f9', u'sessionStartDate': u'2015-05-07T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'9c838bde-512b-4f68-80aa-c92b7142c3e8', u'subsessionLength': 16717, u'subsessionStartDate': u'2015-05-07T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'9c838bde-512b-4f68-80aa-c92b7142c3e8', u'profileSubsessionCounter': 16, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/617dbce26726', u'sessionId': u'eaabe4b0-0401-4f7c-9e1b-398d9d058fb7', u'sessionStartDate': u'2015-05-07T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'5a8b54cc-0a24-4605-906d-0b2a4fdd523d', u'subsessionLength': 62, u'subsessionStartDate': u'2015-05-07T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'7dccf1ab-8386-4356-8476-e37b06949832', u'profileSubsessionCounter': 19, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/d8420a541d1c', u'sessionId': u'038f1720-04f6-409e-8e35-e3bc2706a7dc', u'sessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'1cf88bbf-d750-4648-a8f3-4c0cd92a2cde', u'subsessionLength': 27, u'subsessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'1cf88bbf-d750-4648-a8f3-4c0cd92a2cde', u'profileSubsessionCounter': 20, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/d8420a541d1c', u'sessionId': u'1e2f5adf-9f6f-427f-a094-b31cb5ba13ee', u'sessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'bc32885b-38ff-421a-91ba-d22dd40c63e0', u'subsessionLength': 371, u'subsessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'bc32885b-38ff-421a-91ba-d22dd40c63e0', u'profileSubsessionCounter': 21, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/d8420a541d1c', u'sessionId': u'5f579f35-4a9f-49f5-9f98-737f708df497', u'sessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'c7544c05-6db6-46f0-8a58-3ebfa15cd905', u'subsessionLength': 418, u'subsessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'c7544c05-6db6-46f0-8a58-3ebfa15cd905', u'profileSubsessionCounter': 22, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/d8420a541d1c', u'sessionId': u'8f5e7cf2-a655-4ff5-b5f3-763bd40409fa', u'sessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'567988ed-f8ab-48dd-8965-cccde7b5651d', u'subsessionLength': 151, u'subsessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'567988ed-f8ab-48dd-8965-cccde7b5651d', u'profileSubsessionCounter': 23, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/d8420a541d1c', u'sessionId': u'3695a45a-db63-4675-9bdc-a19b495f843d', u'sessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'6602be14-05bb-46cd-9a39-6f3a567344ff', u'subsessionLength': 20, u'subsessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'6602be14-05bb-46cd-9a39-6f3a567344ff', u'profileSubsessionCounter': 24, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/d8420a541d1c', u'sessionId': u'3512c8e7-1be9-4c69-911f-a9f37d6e48d9', u'sessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'2c6e66b9-2cde-4039-bfd1-a122d14caf9b', u'subsessionLength': 977, u'subsessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'2c6e66b9-2cde-4039-bfd1-a122d14caf9b', u'profileSubsessionCounter': 25, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/d8420a541d1c', u'sessionId': u'd8f14294-9329-4857-b9d2-0277bf22f22e', u'sessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'fd0a1488-daa1-473c-aef1-b285573c6864', u'subsessionLength': 62, u'subsessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'fd0a1488-daa1-473c-aef1-b285573c6864', u'profileSubsessionCounter': 26, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/d8420a541d1c', u'sessionId': u'680d93b8-70ef-4983-b378-32687776e488', u'sessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'6a55556d-6e2e-43f0-86b0-62e13e11d252', u'subsessionLength': 259, u'subsessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'6a55556d-6e2e-43f0-86b0-62e13e11d252', u'profileSubsessionCounter': 27, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/d8420a541d1c', u'sessionId': u'0744c17a-a06c-48d8-9695-919021a7acbe', u'sessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'3f3e569a-9617-4a00-b6dd-09b0d206af9e', u'subsessionLength': 30, u'subsessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'3f3e569a-9617-4a00-b6dd-09b0d206af9e', u'profileSubsessionCounter': 28, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/d8420a541d1c', u'sessionId': u'514ab9b8-4bbe-4d99-b2ff-c74aa88e188f', u'sessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'53502682-fd47-4944-8349-f5284184e139', u'subsessionLength': 339, u'subsessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'53502682-fd47-4944-8349-f5284184e139', u'profileSubsessionCounter': 29, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/d8420a541d1c', u'sessionId': u'bb53f2ab-7a6b-4906-974e-2d000abd2756', u'sessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'981cfcc1-4f5c-4451-9037-da7b8c730e6f', u'subsessionLength': 679, u'subsessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'981cfcc1-4f5c-4451-9037-da7b8c730e6f', u'profileSubsessionCounter': 30, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/d8420a541d1c', u'sessionId': u'102b5a02-ca7d-4291-ba23-37d4526013f4', u'sessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'e95794ee-73f0-46a0-9bd0-2200d980a0de', u'subsessionLength': 97, u'subsessionStartDate': u'2015-05-11T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'e95794ee-73f0-46a0-9bd0-2200d980a0de', u'profileSubsessionCounter': 31, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/d8420a541d1c', u'sessionId': u'718c48ec-967e-445d-8843-a9b47f8efd39', u'sessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'88ac2122-301e-4ad1-913a-28f49f658a56', u'subsessionLength': 20, u'subsessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'88ac2122-301e-4ad1-913a-28f49f658a56', u'profileSubsessionCounter': 32, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/d8420a541d1c', u'sessionId': u'df34ed9d-e36c-42ad-84ee-d97644f66a15', u'sessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'3a448b39-73c8-44af-a188-41739eed987d', u'subsessionLength': 560, u'subsessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousBuildId': u'20150511030203', u'previousSubsessionId': u'3a448b39-73c8-44af-a188-41739eed987d', u'profileSubsessionCounter': 33, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'e2ce5d9a-a5bf-4cfb-8912-7cb596e0c6fb', u'sessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'9b2c2da2-0902-4209-9bd3-c06b8ef2ea44', u'subsessionLength': 9, u'subsessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'9b2c2da2-0902-4209-9bd3-c06b8ef2ea44', u'profileSubsessionCounter': 34, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'941cc9d9-5c47-4526-bb92-7e1c7cbced27', u'sessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'c0ec502d-b421-4683-8509-37da44919202', u'subsessionLength': 1292, u'subsessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'c0ec502d-b421-4683-8509-37da44919202', u'profileSubsessionCounter': 35, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'9cfafd7f-4ac3-4eb5-9538-d26f27a910d9', u'sessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'193d405f-74dc-43ad-be9d-c302a3d93a91', u'subsessionLength': 40, u'subsessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'193d405f-74dc-43ad-be9d-c302a3d93a91', u'profileSubsessionCounter': 36, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'498826db-7c8e-4fa9-8b3e-73b27bf7f017', u'sessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'5862e30f-c19a-42ef-9a6b-dd70987d9396', u'subsessionLength': 159, u'subsessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'5862e30f-c19a-42ef-9a6b-dd70987d9396', u'profileSubsessionCounter': 37, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'07415d9c-14a3-49bf-bda6-68c4acc19c0f', u'sessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'97bcb17e-0d9a-411c-a53f-d739b05085f2', u'subsessionLength': 95, u'subsessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'97bcb17e-0d9a-411c-a53f-d739b05085f2', u'profileSubsessionCounter': 38, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'bf8d2786-d88b-4bf6-b98c-8870ba2aa893', u'sessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'3010cd5c-a0a9-4afc-b2d0-d6dcf184b837', u'subsessionLength': 971, u'subsessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'3010cd5c-a0a9-4afc-b2d0-d6dcf184b837', u'profileSubsessionCounter': 39, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'94364e5c-9424-461f-9add-2438c6c146dc', u'sessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'471da76b-a301-43af-8f3c-a5352827909d', u'subsessionLength': 783, u'subsessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'471da76b-a301-43af-8f3c-a5352827909d', u'profileSubsessionCounter': 40, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'c062f240-06f1-4b0a-87db-b5cab2172f44', u'sessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'760a19f7-5dab-41df-852f-3a4e3e2e7a53', u'subsessionLength': 41, u'subsessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'760a19f7-5dab-41df-852f-3a4e3e2e7a53', u'profileSubsessionCounter': 41, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'10eee8b4-1124-4fa6-b2ab-2fb8cc7b16bd', u'sessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'3e10ddc1-4f47-4519-9348-880f2de2658a', u'subsessionLength': 172, u'subsessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'3e10ddc1-4f47-4519-9348-880f2de2658a', u'profileSubsessionCounter': 42, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'e27617d1-8fa6-4063-93f0-2c71a3c1e34f', u'sessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'abfce0a9-47a2-4312-8892-ff26bbb9aad7', u'subsessionLength': 67, u'subsessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'abfce0a9-47a2-4312-8892-ff26bbb9aad7', u'profileSubsessionCounter': 43, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'908e9208-f551-4c75-8050-774272be811d', u'sessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'1429aae6-b87c-4ad3-bc05-64e24e0ed0ce', u'subsessionLength': 312, u'subsessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'1429aae6-b87c-4ad3-bc05-64e24e0ed0ce', u'profileSubsessionCounter': 44, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'93c2b564-5a62-4a20-a666-6f571a33ae3c', u'sessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'b19dfbf6-b573-454a-b17b-b8b7589f75e6', u'subsessionLength': 3133, u'subsessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'b19dfbf6-b573-454a-b17b-b8b7589f75e6', u'profileSubsessionCounter': 45, u'reason': u'daily', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'd91b521c-2629-42ef-8f12-a29132618d06', u'sessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'c0fb14e9-42ee-4ef5-be9a-5bd1f6e45831', u'subsessionLength': 25295, u'subsessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'c0fb14e9-42ee-4ef5-be9a-5bd1f6e45831', u'profileSubsessionCounter': 46, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'd91b521c-2629-42ef-8f12-a29132618d06', u'sessionStartDate': u'2015-05-12T00:00:00.0-07:00', u'subsessionCounter': 2, u'subsessionId': u'0d0b2664-ea29-40b6-bb86-cc1555242bf0', u'subsessionLength': 28722, u'subsessionStartDate': u'2015-05-13T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'0d0b2664-ea29-40b6-bb86-cc1555242bf0', u'profileSubsessionCounter': 47, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'007c66ef-abe0-4767-91c5-3a65c9c839fa', u'sessionStartDate': u'2015-05-13T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'e9f8e6b4-595f-4208-ae1f-fafef206961a', u'subsessionLength': 4939, u'subsessionStartDate': u'2015-05-13T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'e9f8e6b4-595f-4208-ae1f-fafef206961a', u'profileSubsessionCounter': 48, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'1b5f20d3-bc00-4797-bd13-57c701be0fa7', u'sessionStartDate': u'2015-05-13T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'fe9210db-73c0-45e5-ae0e-6e4de8a4820a', u'subsessionLength': 197, u'subsessionStartDate': u'2015-05-13T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'fe9210db-73c0-45e5-ae0e-6e4de8a4820a', u'profileSubsessionCounter': 49, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'5dbe61e5-9ea6-4821-9773-72fa25a9774a', u'sessionStartDate': u'2015-05-13T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'5b4fad72-bf0a-4942-8ab0-fc9c6cef3185', u'subsessionLength': 1617, u'subsessionStartDate': u'2015-05-13T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'5b4fad72-bf0a-4942-8ab0-fc9c6cef3185', u'profileSubsessionCounter': 50, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'90d61e78-a15d-4edb-b92f-d52f770ee8e3', u'sessionStartDate': u'2015-05-13T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'bdd40ea3-6c56-4da2-819e-d63c56c07be6', u'subsessionLength': 66, u'subsessionStartDate': u'2015-05-13T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'bdd40ea3-6c56-4da2-819e-d63c56c07be6', u'profileSubsessionCounter': 51, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'689c3477-b12e-426b-8988-da5cc050e1d0', u'sessionStartDate': u'2015-05-13T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'1f3b6e9c-8bdc-4a96-9f81-4a438a3eb081', u'subsessionLength': 1289, u'subsessionStartDate': u'2015-05-13T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:41.0a1', u'asyncPluginInit': False, u'previousSubsessionId': u'1f3b6e9c-8bdc-4a96-9f81-4a438a3eb081', u'profileSubsessionCounter': 52, u'reason': u'daily', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/8b64c75b0b86', u'sessionId': u'3294fb44-4bc2-4047-bba1-d66ec984f15d', u'sessionStartDate': u'2015-05-13T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'e662ee3b-bd53-4c04-bafb-d75106ea4361', u'subsessionLength': 25280, u'subsessionStartDate': u'2015-05-13T00:00:00.0-07:00', u'timezoneOffset': -420}]
knownPos = {I["subsessionId"]: (I["profileSubsessionCounter"],I["subsessionCounter"])
for I in bg[10][1]["info"]}
knownPos = {I["subsessionId"]: (I["profileSubsessionCounter"],I["subsessionCounter"])
for I in bg[10][1]["info"]}
len(knownPos), len(bg[10][1]["graph"]), len(set(I["sessionId"] for I in bg[10][1]["info"]))
(39, 41, 38)
gg=bg[10][1]["graph"]
#look up
gg.nodes(data=True)
[(u'bc32885b-38ff-421a-91ba-d22dd40c63e0', {'subSessNum': 20}), (u'2c6e66b9-2cde-4039-bfd1-a122d14caf9b', {'subSessNum': 24}), (u'e9f8e6b4-595f-4208-ae1f-fafef206961a', {'subSessNum': 47}), (u'3010cd5c-a0a9-4afc-b2d0-d6dcf184b837', {'subSessNum': 38}), (u'5a8b54cc-0a24-4605-906d-0b2a4fdd523d', {'subSessNum': 16}), (u'471da76b-a301-43af-8f3c-a5352827909d', {'subSessNum': 39}), (u'3f3e569a-9617-4a00-b6dd-09b0d206af9e', {'subSessNum': 27}), (u'6602be14-05bb-46cd-9a39-6f3a567344ff', {'subSessNum': 23}), (u'5b4fad72-bf0a-4942-8ab0-fc9c6cef3185', {'subSessNum': 49}), (u'3a448b39-73c8-44af-a188-41739eed987d', {'subSessNum': 32}), (u'88ac2122-301e-4ad1-913a-28f49f658a56', {'subSessNum': 31}), (u'1f3b6e9c-8bdc-4a96-9f81-4a438a3eb081', {'subSessNum': 51}), (u'567988ed-f8ab-48dd-8965-cccde7b5651d', {'subSessNum': 22}), (u'e662ee3b-bd53-4c04-bafb-d75106ea4361', {'subSessNum': 52}), (u'97bcb17e-0d9a-411c-a53f-d739b05085f2', {'subSessNum': 37}), (u'0d0b2664-ea29-40b6-bb86-cc1555242bf0', {'subSessNum': 46}), (u'9c838bde-512b-4f68-80aa-c92b7142c3e8', {'subSessNum': 15}), (u'5862e30f-c19a-42ef-9a6b-dd70987d9396', {'subSessNum': 36}), (u'c7544c05-6db6-46f0-8a58-3ebfa15cd905', {'subSessNum': 21}), (u'cf15dafc-88ed-4ea0-8d98-0b8a7cca04a5', {'subSessNum': 12}), (u'1429aae6-b87c-4ad3-bc05-64e24e0ed0ce', {'subSessNum': 43}), (u'6a55556d-6e2e-43f0-86b0-62e13e11d252', {'subSessNum': 26}), (u'c0ec502d-b421-4683-8509-37da44919202', {'subSessNum': 34}), (u'defedbf8-3d81-48a7-9718-c1e0ae07c3c7', {'subSessNum': 14}), (u'2624123a-38fa-42d5-a9ac-583314cd283f', {}), (u'fd0a1488-daa1-473c-aef1-b285573c6864', {'subSessNum': 25}), (u'9b2c2da2-0902-4209-9bd3-c06b8ef2ea44', {'subSessNum': 33}), (u'193d405f-74dc-43ad-be9d-c302a3d93a91', {'subSessNum': 35}), (u'5d48b45c-ba84-48ef-bee0-0b93f47002b8', {'subSessNum': 13}), (u'e95794ee-73f0-46a0-9bd0-2200d980a0de', {'subSessNum': 30}), (u'981cfcc1-4f5c-4451-9037-da7b8c730e6f', {'subSessNum': 29}), (u'fe9210db-73c0-45e5-ae0e-6e4de8a4820a', {'subSessNum': 48}), (u'53502682-fd47-4944-8349-f5284184e139', {'subSessNum': 28}), (u'b19dfbf6-b573-454a-b17b-b8b7589f75e6', {'subSessNum': 44}), (u'3e10ddc1-4f47-4519-9348-880f2de2658a', {'subSessNum': 41}), (u'bdd40ea3-6c56-4da2-819e-d63c56c07be6', {'subSessNum': 50}), (u'c0fb14e9-42ee-4ef5-be9a-5bd1f6e45831', {'subSessNum': 45}), (u'abfce0a9-47a2-4312-8892-ff26bbb9aad7', {'subSessNum': 42}), (u'7dccf1ab-8386-4356-8476-e37b06949832', {}), (u'760a19f7-5dab-41df-852f-3a4e3e2e7a53', {'subSessNum': 40}), (u'1cf88bbf-d750-4648-a8f3-4c0cd92a2cde', {'subSessNum': 19})]
def sessGraphFromList2(sessInfoList):
g = nx.DiGraph()
subSessIds = [s['subsessionId'] for s in sessInfoList]
numInferred = 0
for s in sessInfoList:
# each s is a separate subsession submission "info" section
# have to clear these vars to prevent spillover from previous iter
subsessId = None
prevSubSess = None
try:
subsessId = s['subsessionId']
except KeyError:
continue
N = s.get("profileSubsessionCounter",-1)
subSessCounter = s.get("subsessionCounter",-1)
g.add_node(subsessId,subSessNum=N,x=N,y=subSessCounter)
prevSubSess = s.get('previousSubsessionId',None)
if prevSubSess:
#NB: adding these nodes allows us to infer the existence
#of some sessions that have not actually been submitted.
# Nodes added this way will not have any data attached to them.
g.add_node(prevSubSess)
g.add_edge(subsessId,prevSubSess)
#add placement details for inferred nodes
for nodeId,nodeData in (tup for tup in g.nodes(data=True) if not tup[1]):
pred = g.predecessors(nodeId)[0]
nodeData["x"] = g.node[pred]["x"]-random.random()/3 +.1/.6
nodeData["y"] = g.node[pred]["y"]-1-random.random()
return g
def plotSessGraph(g):
pos = {n:[d['x'],d["y"]] for n,d in g.nodes(data=True)}
fig, ax = plt.subplots(1,figsize=(18,3), dpi=100)
G = nx.draw(g,pos=pos,ax=ax,node_size=10, node_color="w")
for sessId,nodeData in [(n,d) for n,d in g.nodes(data=True) if d]:
x,y = nodeData["x"],nodeData["y"]
subSessNum = nodeData.get("subSessNum","NA")
plt.text(x+.02,y+.15,s=subSessNum
,horizontalalignment='center')
plt.show()
gg = sessGraphFromList2(bg[10][1]["info"])
plotSessGraph(gg)
def plotSessGraphAndInfo(i_x):
i,x = i_x
sessInfoList = x[1]["info"]
g = sessGraphFromList2(sessInfoList)
dg = degreeDistrib(g)
print i
if any([k>1 for k in dg.keys()]) \
or any([v>1 for k,v in dg.iteritems() if k!=1]):
print "bad degree distribution: ",dg
subSessCounterMult = collections.Counter(map(lambda x:x["profileSubsessionCounter"], sessInfoList))
if any([v>1 for v in subSessCounterMult.values()]):
print "repeated profileSubsessionCounter(s): ", {c:m for c,m in subSessCounterMult.iteritems() if m>1}
# print
# print collections.Counter(map(lambda x:x["profileSubsessionCounter"], sessInfoList))
plotSessGraph(g)
plotSessGraphAndInfo((5,bg[0]))
bg[0][1]["info"]
5 repeated profileSubsessionCounter(s): {5: 2}
[{u'addons': u'%7Bbee6eb20-01e0-ebd1-da83-080329fb9a3a%7D:1.70,YoutubeDownloader%40PeterOlayev.com:2.4.0,4zffxtbr%40www.videodownloadconverter.com:7.13.6.45087,%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1,%7Bf3bd3dd2-2888-44c5-91a2-2caeb33fb898%7D:37.0,%7Bb9db16a4-6edc-47ec-a1f4-b86292ed211d%7D:5.2.0,jid1-o2qEVrZ4t5FJWu%40jetpack:0.1.0', u'asyncPluginInit': False, u'flashVersion': u'11.7.700.224', u'previousBuildId': u'20150506030206', u'previousSubsessionId': u'63168dfe-df9a-4023-829c-d32d33f1b651', u'profileSubsessionCounter': 4, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/86203ac87a08', u'sessionId': u'd817120a-04cf-4d66-89e2-024866b5d39a', u'sessionStartDate': u'2015-05-09T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'db55bc8c-fffd-4aac-85a3-d12bc68fcacb', u'subsessionLength': 462, u'subsessionStartDate': u'2015-05-09T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7Bbee6eb20-01e0-ebd1-da83-080329fb9a3a%7D:1.70,YoutubeDownloader%40PeterOlayev.com:2.4.0,4zffxtbr%40www.videodownloadconverter.com:7.13.6.45087,%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1,%7Bf3bd3dd2-2888-44c5-91a2-2caeb33fb898%7D:37.0,%7Bb9db16a4-6edc-47ec-a1f4-b86292ed211d%7D:5.2.0,jid1-o2qEVrZ4t5FJWu%40jetpack:0.1.0', u'asyncPluginInit': False, u'flashVersion': u'11.7.700.224', u'previousSubsessionId': u'db55bc8c-fffd-4aac-85a3-d12bc68fcacb', u'profileSubsessionCounter': 5, u'reason': u'shutdown', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/86203ac87a08', u'sessionId': u'2ed95f35-0f04-43af-b513-34b1511085df', u'sessionStartDate': u'2015-05-09T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'f0f9d21d-00fe-4895-903c-fe41184a1d0d', u'subsessionLength': 3653, u'subsessionStartDate': u'2015-05-09T00:00:00.0-07:00', u'timezoneOffset': -420}, {u'addons': u'%7Bbee6eb20-01e0-ebd1-da83-080329fb9a3a%7D:1.70,YoutubeDownloader%40PeterOlayev.com:2.4.0,4zffxtbr%40www.videodownloadconverter.com:7.13.6.45087,%7B972ce4c6-7e08-4474-a285-3208198ce6fd%7D:40.0a1,%7Bf3bd3dd2-2888-44c5-91a2-2caeb33fb898%7D:37.0,%7Bb9db16a4-6edc-47ec-a1f4-b86292ed211d%7D:5.2.0,jid1-o2qEVrZ4t5FJWu%40jetpack:0.1.0', u'asyncPluginInit': False, u'flashVersion': u'11.7.700.224', u'previousSubsessionId': u'db55bc8c-fffd-4aac-85a3-d12bc68fcacb', u'profileSubsessionCounter': 5, u'reason': u'aborted-session', u'revision': u'https://hg.mozilla.org/mozilla-central/rev/86203ac87a08', u'sessionId': u'2ed95f35-0f04-43af-b513-34b1511085df', u'sessionStartDate': u'2015-05-09T00:00:00.0-07:00', u'subsessionCounter': 1, u'subsessionId': u'f0f9d21d-00fe-4895-903c-fe41184a1d0d', u'subsessionLength': 3429, u'subsessionStartDate': u'2015-05-09T00:00:00.0-07:00', u'timezoneOffset': -420}]
map(lambda i_x: plotSessGraphAndInfo(i_x),enumerate(bg))
0 Counter({1: 2, 0: 1}) Counter({5: 2, 4: 1})
1 Counter({1: 4, 0: 2}) Counter({8: 1, 4: 1, 5: 1, 7: 1})
2 Counter({1: 8, 0: 2}) Counter({1: 2, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1})
3 Counter({1: 27, 0: 1}) Counter({27: 2, 32: 2, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 28: 1, 29: 1, 30: 1, 31: 1, 33: 1, 34: 1, 35: 1})
4 Counter({1: 4, 0: 1}) Counter({1: 2, 2: 1, 3: 1, 4: 1, 5: 1})
5 Counter({1: 10, 0: 2}) Counter({8: 2, 5: 1, 6: 1, 7: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1})
6 Counter({1: 49, 0: 2}) Counter({15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1, 43: 1, 44: 1, 45: 1, 46: 1, 47: 1, 48: 1, 49: 1, 50: 1, 51: 1, 52: 1, 53: 1, 54: 1, 55: 1, 56: 1, 57: 1, 58: 1, 59: 1, 60: 1, 61: 1, 62: 1, 63: 1, 64: 1, 65: 1, 66: 1, 67: 1, 68: 1})
7 Counter({1: 21, 0: 1}) Counter({10: 2, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1})
8 Counter({1: 27, 0: 2}) Counter({1: 1, 2: 1, 3: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1, 38: 1, 39: 1})
9 Counter({1: 9, 0: 2}) Counter({8: 1, 9: 1, 10: 1, 11: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1})
10 Counter({1: 39, 0: 2}) Counter({12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1, 38: 1, 39: 1, 40: 1, 41: 1, 42: 1, 43: 1, 44: 1, 45: 1, 46: 1, 47: 1, 48: 1, 49: 1, 50: 1, 51: 1, 52: 1})
11 Counter({1: 22, 0: 1}) Counter({1: 25, 2: 20, 3: 18, 4: 18, 5: 18, 6: 18, 7: 4, 8: 3, 9: 3, 10: 3, 11: 3, 12: 3, 13: 3, 14: 3, 15: 3, 16: 3, 17: 3, 18: 3, 19: 2})
12 Counter({1: 18, 0: 2}) Counter({11: 2, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1})
13 Counter({1: 8, 0: 2}) Counter({8: 1, 9: 1, 10: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1})
14 Counter({1: 4, 0: 2}) Counter({8: 1, 10: 1, 6: 1, 7: 1})
15 Counter({1: 22, 0: 2}) Counter({11: 2, 8: 1, 9: 1, 10: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1})
16 Counter({1: 18, 0: 2}) Counter({32: 1, 33: 1, 34: 1, 35: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 29: 1, 30: 1, 31: 1})
17 Counter({0: 2}) Counter({1: 2})
18 Counter({1: 34, 0: 2}) Counter({7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1, 38: 1, 39: 1, 40: 1, 41: 1, 42: 1})
19 Counter({1: 12, 0: 2}) Counter({1: 2, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1})
20 Counter({1: 16, 0: 2}) Counter({12: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1})
21 Counter({1: 19, 0: 2}) Counter({11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1})
22 Counter({1: 8, 0: 6}) Counter({1: 4, 2: 3, 4: 3, 3: 2, 5: 1})
23 Counter({1: 23, 0: 2}) Counter({10: 2, 11: 2, 12: 2, 13: 2, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1})
24 Counter({1: 11, 0: 2}) Counter({1: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1})
25 Counter({0: 4, 1: 3}) Counter({1: 4, 2: 2, 3: 1})
26 Counter({1: 41, 0: 1}) Counter({29: 2, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1, 38: 1, 39: 1, 40: 1, 41: 1, 42: 1, 43: 1, 44: 1, 45: 1, 46: 1, 47: 1, 48: 1, 49: 1, 50: 1})
27 Counter({1: 5, 0: 4}) Counter({1: 2, 3: 2, 2: 1, 6: 1, 7: 1})
28 Counter({1: 11, 0: 1}) Counter({11: 2, 12: 2, 13: 2, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 14: 1, 15: 1})
29 Counter({1: 27, 0: 1}) Counter({22: 2, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1})
30 Counter({1: 33, 0: 2}) Counter({4: 2, 5: 2, 6: 2, 7: 2, 8: 2, 9: 2, 10: 2, 11: 2, 12: 2, 13: 2, 14: 2, 15: 2, 16: 2, 17: 2, 18: 2, 1: 1, 2: 1, 3: 1, 19: 1})
31 Counter({1: 14, 0: 1}) Counter({11: 2, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 12: 1, 13: 1, 14: 1, 15: 1})
32 Counter({1: 8, 0: 2}) Counter({8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 17: 1, 18: 1, 19: 1})
33 Counter({1: 129, 0: 1}) Counter({34: 2, 48: 2, 61: 2, 86: 2, 93: 2, 98: 2, 102: 2, 116: 2, 129: 2, 136: 2, 148: 2, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 35: 1, 36: 1, 37: 1, 38: 1, 39: 1, 40: 1, 41: 1, 42: 1, 43: 1, 44: 1, 45: 1, 46: 1, 47: 1, 49: 1, 50: 1, 51: 1, 52: 1, 53: 1, 54: 1, 55: 1, 56: 1, 57: 1, 58: 1, 59: 1, 60: 1, 62: 1, 63: 1, 64: 1, 65: 1, 66: 1, 67: 1, 68: 1, 69: 1, 70: 1, 71: 1, 72: 1, 73: 1, 74: 1, 75: 1, 76: 1, 77: 1, 78: 1, 79: 1, 80: 1, 81: 1, 82: 1, 83: 1, 84: 1, 85: 1, 87: 1, 88: 1, 89: 1, 90: 1, 91: 1, 92: 1, 94: 1, 95: 1, 96: 1, 97: 1, 99: 1, 100: 1, 101: 1, 103: 1, 104: 1, 105: 1, 106: 1, 107: 1, 108: 1, 109: 1, 110: 1, 111: 1, 112: 1, 113: 1, 114: 1, 115: 1, 117: 1, 118: 1, 119: 1, 120: 1, 121: 1, 122: 1, 123: 1, 124: 1, 125: 1, 126: 1, 127: 1, 128: 1, 130: 1, 131: 1, 132: 1, 133: 1, 134: 1, 135: 1, 137: 1, 138: 1, 139: 1, 140: 1, 141: 1, 142: 1, 143: 1, 144: 1, 145: 1, 146: 1, 147: 1, 149: 1, 150: 1})
34 Counter({1: 85, 0: 2}) Counter({128: 1, 129: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 52: 1, 53: 1, 54: 1, 55: 1, 56: 1, 57: 1, 58: 1, 59: 1, 60: 1, 61: 1, 62: 1, 63: 1, 64: 1, 65: 1, 66: 1, 67: 1, 68: 1, 69: 1, 70: 1, 71: 1, 72: 1, 73: 1, 74: 1, 75: 1, 76: 1, 77: 1, 78: 1, 79: 1, 80: 1, 81: 1, 82: 1, 83: 1, 84: 1, 85: 1, 86: 1, 87: 1, 88: 1, 89: 1, 90: 1, 91: 1, 92: 1, 93: 1, 94: 1, 95: 1, 96: 1, 97: 1, 98: 1, 99: 1, 100: 1, 101: 1, 102: 1, 103: 1, 104: 1, 105: 1, 106: 1, 107: 1, 108: 1, 109: 1, 110: 1, 111: 1, 112: 1, 113: 1, 114: 1, 115: 1, 116: 1, 117: 1, 118: 1, 119: 1, 120: 1, 121: 1, 122: 1, 123: 1, 124: 1, 125: 1, 126: 1, 127: 1})
35 Counter({1: 66, 0: 2}) Counter({12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1, 38: 1, 39: 1, 40: 1, 41: 1, 42: 1, 43: 1, 44: 1, 45: 1, 46: 1, 47: 1, 48: 1, 49: 1, 50: 1, 51: 1, 52: 1, 53: 1, 54: 1, 55: 1, 56: 1, 57: 1, 58: 1, 59: 1, 60: 1, 61: 1, 62: 1, 63: 1, 64: 1, 65: 1, 66: 1, 67: 1, 68: 1, 69: 1, 70: 1, 71: 1, 72: 1, 73: 1, 74: 1, 75: 1, 76: 1, 77: 1, 78: 1, 79: 1})
36 Counter({0: 2, 1: 1}) Counter({1: 1, 3: 1})
37 Counter({1: 25, 0: 2}) Counter({20: 2, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 21: 1, 22: 1, 23: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1})
38 Counter({1: 7, 0: 2}) Counter({6: 2, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 7: 1, 8: 1})
39 Counter({1: 15, 0: 2}) Counter({8: 2, 9: 2, 10: 2, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 11: 1, 12: 1, 13: 1})
40 Counter({1: 3, 0: 2}) Counter({1: 1, 2: 1, 4: 1, 5: 1})
41 Counter({1: 3, 0: 2}) Counter({1: 1, 2: 1, 3: 1, 5: 1})
42 Counter({1: 76, 0: 2}) Counter({21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1, 38: 1, 39: 1, 40: 1, 41: 1, 42: 1, 43: 1, 44: 1, 45: 1, 46: 1, 47: 1, 48: 1, 51: 1, 52: 1, 53: 1, 54: 1, 55: 1, 56: 1, 57: 1, 58: 1, 59: 1, 60: 1, 61: 1, 62: 1, 63: 1, 64: 1, 65: 1, 66: 1, 67: 1, 68: 1, 69: 1, 70: 1, 71: 1, 72: 1, 73: 1, 74: 1, 75: 1, 76: 1, 77: 1, 78: 1, 79: 1, 80: 1, 81: 1, 82: 1, 83: 1, 84: 1, 85: 1, 86: 1, 87: 1, 88: 1, 89: 1, 90: 1, 91: 1, 92: 1, 93: 1, 94: 1, 95: 1, 96: 1, 97: 1, 98: 1})
43 Counter({1: 13, 0: 2}) Counter({1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1})
44 Counter({1: 22, 0: 1}) Counter({17: 2, 13: 1, 14: 1, 15: 1, 16: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1})
45 Counter({1: 11, 0: 2}) Counter({7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 17: 1, 18: 1})
46 Counter({1: 101, 0: 3}) Counter({26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1, 38: 1, 39: 1, 40: 1, 41: 1, 42: 1, 43: 1, 44: 1, 45: 1, 46: 1, 47: 1, 48: 1, 49: 1, 50: 1, 60: 1, 61: 1, 62: 1, 63: 1, 64: 1, 65: 1, 66: 1, 67: 1, 68: 1, 69: 1, 70: 1, 71: 1, 72: 1, 73: 1, 74: 1, 75: 1, 76: 1, 77: 1, 78: 1, 79: 1, 80: 1, 81: 1, 82: 1, 83: 1, 84: 1, 85: 1, 86: 1, 87: 1, 88: 1, 89: 1, 90: 1, 91: 1, 92: 1, 93: 1, 94: 1, 95: 1, 96: 1, 97: 1, 98: 1, 99: 1, 126: 1, 127: 1, 128: 1, 129: 1, 130: 1, 131: 1, 132: 1, 133: 1, 134: 1, 135: 1, 136: 1, 137: 1, 138: 1, 139: 1, 140: 1, 141: 1, 142: 1, 143: 1, 144: 1, 145: 1, 146: 1, 147: 1, 148: 1, 149: 1, 150: 1, 151: 1, 152: 1, 153: 1, 154: 1, 155: 1, 156: 1, 157: 1, 158: 1, 159: 1, 160: 1, 161: 1})
47 Counter({1: 25, 0: 2}) Counter({11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1})
48 Counter({1: 24, 0: 2}) Counter({3: 2, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1})
49 Counter({1: 60, 0: 2}) Counter({34: 1, 35: 1, 36: 1, 37: 1, 38: 1, 39: 1, 40: 1, 41: 1, 42: 1, 43: 1, 44: 1, 45: 1, 46: 1, 47: 1, 48: 1, 49: 1, 50: 1, 51: 1, 52: 1, 68: 1, 69: 1, 70: 1, 71: 1, 72: 1, 73: 1, 74: 1, 75: 1, 76: 1, 77: 1, 78: 1, 79: 1, 80: 1, 81: 1, 82: 1, 83: 1, 84: 1, 85: 1, 86: 1, 87: 1, 88: 1, 89: 1, 90: 1, 91: 1, 92: 1, 93: 1, 94: 1, 95: 1, 96: 1, 97: 1, 98: 1, 99: 1, 100: 1, 101: 1, 102: 1, 103: 1, 104: 1, 105: 1, 106: 1, 107: 1, 108: 1})
50 Counter({1: 26, 0: 2}) Counter({16: 2, 22: 2, 27: 2, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 24: 1, 25: 1, 26: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1})
51 Counter({1: 4, 0: 2}) Counter({1: 1, 2: 1, 3: 1, 5: 1, 6: 1})
52 Counter({1: 33, 0: 1}) Counter({44: 2, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1, 38: 1, 39: 1, 40: 1, 41: 1, 42: 1, 43: 1, 45: 1, 46: 1, 47: 1, 48: 1, 49: 1})
53 Counter({1: 32, 0: 2}) Counter({5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1})
54 Counter({1: 4, 0: 2}) Counter({13: 1, 5: 1, 6: 1, 7: 1})
55 Counter({1: 9, 0: 2}) Counter({5: 1, 6: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1})
56 Counter({1: 41, 0: 3}) Counter({9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 21: 1, 22: 1, 23: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1, 38: 1, 39: 1, 40: 1, 41: 1, 42: 1, 43: 1, 44: 1, 45: 1, 46: 1, 47: 1, 48: 1, 49: 1, 50: 1, 51: 1})
57 Counter({1: 63, 0: 2}) Counter({41: 1, 42: 1, 43: 1, 44: 1, 45: 1, 46: 1, 47: 1, 48: 1, 49: 1, 50: 1, 51: 1, 52: 1, 53: 1, 54: 1, 55: 1, 56: 1, 57: 1, 58: 1, 59: 1, 60: 1, 61: 1, 62: 1, 63: 1, 64: 1, 65: 1, 66: 1, 67: 1, 68: 1, 69: 1, 70: 1, 71: 1, 72: 1, 73: 1, 74: 1, 75: 1, 76: 1, 77: 1, 78: 1, 90: 1, 91: 1, 92: 1, 93: 1, 94: 1, 95: 1, 96: 1, 97: 1, 98: 1, 99: 1, 100: 1, 101: 1, 102: 1, 103: 1, 104: 1, 105: 1, 106: 1, 107: 1, 108: 1, 109: 1, 110: 1, 111: 1, 112: 1, 113: 1, 114: 1})
58 Counter({1: 6, 0: 2}) Counter({1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 7: 1, 8: 1})
59 Counter({1: 29, 0: 2}) Counter({7: 2, 8: 2, 9: 2, 10: 2, 11: 2, 12: 2, 13: 2, 14: 2, 15: 2, 16: 2, 17: 2, 18: 2, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1})
60 Counter({1: 71, 0: 2}) Counter({9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1, 38: 1, 41: 1, 42: 1, 43: 1, 44: 1, 45: 1, 46: 1, 47: 1, 48: 1, 49: 1, 50: 1, 51: 1, 52: 1, 53: 1, 54: 1, 55: 1, 56: 1, 57: 1, 58: 1, 59: 1, 60: 1, 61: 1, 62: 1, 63: 1, 64: 1, 65: 1, 66: 1, 67: 1, 68: 1, 69: 1, 70: 1, 71: 1, 72: 1, 73: 1, 74: 1, 75: 1, 76: 1, 77: 1, 78: 1, 79: 1, 80: 1, 81: 1})
61 Counter({1: 67, 0: 7}) Counter({87: 2, 98: 2, 130: 1, 134: 1, 135: 1, 136: 1, 137: 1, 138: 1, 139: 1, 140: 1, 141: 1, 142: 1, 143: 1, 144: 1, 150: 1, 151: 1, 162: 1, 60: 1, 72: 1, 73: 1, 74: 1, 75: 1, 76: 1, 77: 1, 78: 1, 80: 1, 81: 1, 82: 1, 83: 1, 84: 1, 85: 1, 86: 1, 88: 1, 89: 1, 90: 1, 91: 1, 92: 1, 93: 1, 94: 1, 95: 1, 96: 1, 97: 1, 99: 1, 100: 1, 101: 1, 102: 1, 103: 1, 104: 1, 105: 1, 106: 1, 107: 1, 108: 1, 109: 1, 110: 1, 111: 1, 112: 1, 113: 1, 114: 1, 115: 1, 116: 1, 117: 1, 118: 1, 119: 1, 120: 1, 121: 1, 122: 1, 123: 1})
62 Counter({1: 19, 0: 1}) Counter({19: 2, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 20: 1, 21: 1, 22: 1, 23: 1})
63 Counter({1: 26, 0: 1}) Counter({31: 2, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 32: 1, 33: 1, 34: 1})
64 Counter({0: 2, 1: 2}) Counter({2: 2, 1: 1, 4: 1})
65 Counter({1: 9, 0: 2}) Counter({1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1})
66 Counter({1: 17, 0: 1}) Counter({14: 2, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1})
67 Counter({1: 39, 0: 2}) Counter({6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1, 38: 1, 39: 1, 40: 1, 41: 1, 42: 1, 43: 1, 44: 1, 45: 1, 46: 1, 47: 1, 48: 1, 49: 1, 50: 1, 51: 1, 52: 1, 53: 1, 54: 1, 55: 1, 56: 1, 57: 1, 58: 1, 59: 1, 60: 1, 61: 1})
68 Counter({1: 13, 0: 1}) Counter({7: 2, 4: 1, 5: 1, 6: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1})
69 Counter({1: 25, 0: 2}) Counter({13: 3, 4: 2, 10: 2, 11: 2, 12: 2, 14: 2, 15: 2, 1: 1, 2: 1, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1})
70 Counter({1: 71, 0: 2}) Counter({24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1, 38: 1, 39: 1, 40: 1, 41: 1, 42: 1, 43: 1, 44: 1, 45: 1, 46: 1, 47: 1, 52: 1, 53: 1, 54: 1, 55: 1, 56: 1, 57: 1, 58: 1, 59: 1, 60: 1, 61: 1, 62: 1, 63: 1, 64: 1, 65: 1, 66: 1, 67: 1, 68: 1, 69: 1, 70: 1, 71: 1, 72: 1, 73: 1, 74: 1, 75: 1, 76: 1, 77: 1, 78: 1, 79: 1, 80: 1, 81: 1, 82: 1, 83: 1, 84: 1, 85: 1, 86: 1, 87: 1, 88: 1, 89: 1, 90: 1, 91: 1, 92: 1, 93: 1, 94: 1, 95: 1, 96: 1, 97: 1, 98: 1})
71 Counter({1: 41, 0: 2}) Counter({11: 2, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1, 38: 1, 39: 1, 40: 1, 41: 1, 42: 1, 43: 1, 44: 1, 45: 1, 46: 1})
72 Counter({1: 37, 0: 3}) Counter({10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1, 38: 1, 41: 1, 42: 1, 43: 1, 44: 1, 45: 1, 46: 1, 47: 1, 57: 1})
73 Counter({1: 98, 0: 2}) Counter({42: 1, 43: 1, 44: 1, 45: 1, 46: 1, 47: 1, 48: 1, 49: 1, 50: 1, 51: 1, 52: 1, 53: 1, 54: 1, 55: 1, 56: 1, 57: 1, 58: 1, 59: 1, 60: 1, 61: 1, 62: 1, 63: 1, 64: 1, 65: 1, 66: 1, 67: 1, 68: 1, 69: 1, 70: 1, 71: 1, 72: 1, 73: 1, 74: 1, 75: 1, 76: 1, 77: 1, 78: 1, 79: 1, 80: 1, 81: 1, 82: 1, 83: 1, 84: 1, 85: 1, 86: 1, 87: 1, 88: 1, 89: 1, 90: 1, 91: 1, 92: 1, 93: 1, 94: 1, 95: 1, 96: 1, 97: 1, 98: 1, 99: 1, 100: 1, 101: 1, 102: 1, 103: 1, 104: 1, 105: 1, 106: 1, 107: 1, 108: 1, 109: 1, 110: 1, 111: 1, 112: 1, 116: 1, 117: 1, 118: 1, 119: 1, 120: 1, 121: 1, 122: 1, 123: 1, 124: 1, 125: 1, 126: 1, 127: 1, 128: 1, 129: 1, 130: 1, 131: 1, 132: 1, 133: 1, 134: 1, 135: 1, 136: 1, 137: 1, 138: 1, 139: 1, 140: 1, 141: 1, 142: 1})
74 Counter({1: 5, 0: 2}) Counter({1: 1, 2: 1, 3: 1, 12: 1, 13: 1, 14: 1})
75 Counter({1: 19, 0: 1}) Counter({7: 2, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1})
76 Counter({1: 9, 0: 2}) Counter({1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 10: 1, 11: 1})
77 Counter({1: 135, 0: 3}) Counter({41: 1, 42: 1, 43: 1, 44: 1, 45: 1, 46: 1, 47: 1, 48: 1, 49: 1, 50: 1, 51: 1, 52: 1, 53: 1, 54: 1, 55: 1, 56: 1, 57: 1, 58: 1, 59: 1, 60: 1, 61: 1, 62: 1, 63: 1, 64: 1, 65: 1, 66: 1, 67: 1, 68: 1, 69: 1, 70: 1, 71: 1, 72: 1, 73: 1, 74: 1, 75: 1, 76: 1, 77: 1, 78: 1, 79: 1, 80: 1, 81: 1, 82: 1, 83: 1, 84: 1, 85: 1, 86: 1, 87: 1, 88: 1, 89: 1, 90: 1, 91: 1, 92: 1, 93: 1, 94: 1, 95: 1, 96: 1, 97: 1, 98: 1, 99: 1, 100: 1, 101: 1, 102: 1, 103: 1, 104: 1, 105: 1, 106: 1, 107: 1, 108: 1, 109: 1, 110: 1, 111: 1, 112: 1, 113: 1, 114: 1, 115: 1, 116: 1, 117: 1, 118: 1, 119: 1, 120: 1, 121: 1, 122: 1, 123: 1, 124: 1, 125: 1, 131: 1, 132: 1, 133: 1, 134: 1, 135: 1, 136: 1, 137: 1, 138: 1, 139: 1, 140: 1, 141: 1, 142: 1, 143: 1, 144: 1, 145: 1, 146: 1, 147: 1, 148: 1, 149: 1, 150: 1, 151: 1, 152: 1, 153: 1, 154: 1, 155: 1, 158: 1, 159: 1, 160: 1, 161: 1, 162: 1, 163: 1, 164: 1, 165: 1, 166: 1, 167: 1, 168: 1, 169: 1, 170: 1, 171: 1, 172: 1, 173: 1, 174: 1, 175: 1, 176: 1, 177: 1, 178: 1, 179: 1, 180: 1, 181: 1, 182: 1})
78 Counter({1: 44, 0: 2}) Counter({23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 51: 1, 52: 1, 53: 1, 54: 1, 55: 1, 56: 1, 57: 1, 58: 1, 59: 1, 60: 1, 61: 1, 62: 1, 63: 1, 64: 1, 65: 1, 66: 1, 67: 1, 68: 1, 69: 1, 70: 1, 71: 1, 72: 1, 73: 1, 74: 1, 75: 1, 76: 1, 77: 1, 78: 1, 79: 1, 80: 1, 81: 1, 82: 1, 83: 1, 84: 1, 85: 1, 86: 1, 87: 1, 88: 1, 89: 1})
79 Counter({1: 11, 0: 2}) Counter({1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 13: 1})
80 Counter({1: 31, 0: 1}) Counter({11: 2, 7: 1, 8: 1, 9: 1, 10: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1})
81 Counter({1: 19, 0: 1}) Counter({20: 2, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1})
82 Counter({1: 21, 0: 2}) Counter({19: 2, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1})
83 Counter({1: 28, 0: 2}) Counter({1: 1, 2: 1, 3: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1})
84 Counter({0: 2, 1: 1}) Counter({1: 2, 2: 1})
85 Counter({1: 18, 0: 2}) Counter({5: 2, 1: 1, 2: 1, 3: 1, 4: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1})
86 Counter({1: 16, 0: 2}) Counter({1: 2, 13: 2, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1})
87 Counter({1: 56, 0: 1}) Counter({41: 2, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1, 38: 1, 39: 1, 40: 1, 42: 1, 43: 1, 44: 1, 45: 1, 46: 1, 47: 1, 48: 1, 49: 1, 50: 1, 51: 1, 52: 1, 53: 1, 54: 1, 55: 1, 56: 1, 57: 1, 58: 1, 59: 1, 60: 1, 61: 1, 62: 1, 63: 1, 64: 1, 65: 1, 66: 1, 67: 1, 68: 1, 69: 1, 70: 1, 71: 1, 72: 1})
88 Counter({1: 13, 0: 1}) Counter({17: 2, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 18: 1})
89 Counter({1: 11, 0: 1}) Counter({5: 2, 3: 1, 4: 1, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1})
90 Counter({1: 51, 0: 1}) Counter({20: 2, 17: 1, 18: 1, 19: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1, 38: 1, 39: 1, 40: 1, 41: 1, 42: 1, 43: 1, 44: 1, 45: 1, 46: 1, 47: 1, 48: 1, 49: 1, 50: 1, 51: 1, 52: 1, 53: 1, 54: 1, 55: 1, 56: 1, 57: 1, 58: 1, 59: 1, 60: 1, 61: 1, 62: 1, 63: 1, 64: 1, 65: 1, 66: 1, 67: 1})
91 Counter({1: 4, 0: 1}) Counter({6: 2, 4: 1, 5: 1, 7: 1})
92 Counter({1: 27, 0: 1}) Counter({5: 2, 6: 1, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 28: 1, 29: 1, 30: 1, 31: 1})
93 Counter({1: 16, 0: 1}) Counter({25: 2, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1})
94 Counter({1: 64, 0: 3}) Counter({30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1, 38: 1, 39: 1, 40: 1, 41: 1, 42: 1, 43: 1, 49: 1, 50: 1, 51: 1, 52: 1, 53: 1, 54: 1, 55: 1, 56: 1, 57: 1, 58: 1, 59: 1, 60: 1, 61: 1, 62: 1, 63: 1, 64: 1, 65: 1, 66: 1, 67: 1, 68: 1, 69: 1, 70: 1, 71: 1, 72: 1, 73: 1, 87: 1, 88: 1, 89: 1, 90: 1, 91: 1, 92: 1, 93: 1, 94: 1, 95: 1, 96: 1, 97: 1, 98: 1, 99: 1, 100: 1, 101: 1, 102: 1, 103: 1, 104: 1, 105: 1, 106: 1, 107: 1, 108: 1, 109: 1, 110: 1, 111: 1})
95 Counter({1: 10, 0: 2}) Counter({4: 2, 5: 2, 6: 2, 7: 2, 1: 1, 2: 1, 3: 1})
96 Counter({1: 5, 0: 2}) Counter({8: 1, 9: 1, 10: 1, 16: 1, 7: 1})
97 Counter({0: 2, 1: 1}) Counter({1: 1, 3: 1})
98 Counter({0: 3, 1: 2}) Counter({1: 2, 5: 1, 7: 1})
99 Counter({1: 33, 0: 2}) Counter({8: 1, 9: 1, 10: 1, 11: 1, 12: 1, 13: 1, 14: 1, 15: 1, 16: 1, 17: 1, 18: 1, 19: 1, 20: 1, 21: 1, 22: 1, 23: 1, 24: 1, 25: 1, 26: 1, 27: 1, 29: 1, 30: 1, 31: 1, 32: 1, 33: 1, 34: 1, 35: 1, 36: 1, 37: 1, 38: 1, 39: 1, 40: 1, 41: 1})
[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]