205 lines
6.2 KiB
Python
Executable file
205 lines
6.2 KiB
Python
Executable file
#!/usr/bin/env python
|
|
|
|
import argparse
|
|
import rpl.data as p
|
|
import os
|
|
import pandas as pd
|
|
import numpy as np
|
|
import matplotlib.pyplot as plt
|
|
import seaborn as sns
|
|
|
|
from sys import exit
|
|
from os.path import dirname, basename
|
|
|
|
|
|
tubspalette = ['#be1e3c', '#ffc82a', '#e16d00', '#711c2f', '#acc13a', '#6d8300', '#00534a', '#66b4d3', '#007a9b', '#003f57', '#8a307f', '#511246', '#4c1830']
|
|
phase_names = ['N', 'R', 'H', 'HR', 'HS', 'HSR']
|
|
versions = ['Contiki', 'Hardened', 'Hardened with UIDs']
|
|
|
|
|
|
def plot_consumption(db, args):
|
|
data = db.execute(
|
|
'''
|
|
SELECT c.phase, SUM(consumption), SUM(dios), SUM(daos), SUM(dis)
|
|
FROM overhead AS o
|
|
JOIN consumption AS c ON c.expid = o.expid AND c.phase = o.phase AND c.host = o.source
|
|
GROUP BY o.expid, o.phase
|
|
''')
|
|
|
|
data = pd.DataFrame(data.fetchall(), columns=['phase', 'consumption', 'dios', 'daos', 'dis'])
|
|
data['phase'] = data['phase'].map({1: 'N', 2: 'R', 3: 'H', 4: 'HR', 5: 'HS', 6: 'HSR'})
|
|
|
|
sns.pairplot(data, hue='phase', x_vars=['dios', 'daos', 'dis'], y_vars=['consumption'], kind='reg', markers='.')
|
|
|
|
|
|
def plot_overhead(db, args):
|
|
overheads = db.execute(
|
|
'''
|
|
SELECT phase, SUM(dios), SUM(daos), SUM(dis), (phase - 1) % 2 == 1
|
|
FROM overhead
|
|
WHERE source != 'm3-200'
|
|
GROUP BY expid, phase
|
|
''')
|
|
|
|
data = pd.DataFrame(overheads.fetchall(), columns=['phase', 'dios', 'daos', 'dis', 'reset'])
|
|
|
|
dios = data[['phase', 'reset', 'dios']]
|
|
dios['message type'] = 'dio'
|
|
dios = dios.rename(index=str, columns={'dios': 'count'})
|
|
|
|
daos = data[['phase', 'reset', 'daos']]
|
|
daos['message type'] = 'dao'
|
|
daos = daos.rename(index=str, columns={'daos': 'count'})
|
|
|
|
dis= data[['phase', 'reset', 'dis']]
|
|
dis['message type'] = 'dis'
|
|
dis = dis.rename(index=str, columns={'dis': 'count'})
|
|
|
|
frame = [dios, daos, dis]
|
|
data = pd.concat(frame)
|
|
data['phase'] = data['phase'].map({1: 'N', 2: 'R', 3: 'H', 4: 'HR', 5: 'HS', 6: 'HSR'})
|
|
print(data)
|
|
|
|
sns.barplot(data=data, hue='phase', y='message type', x='count')
|
|
|
|
|
|
def plot_packet_loss(db, args):
|
|
|
|
changes_vs_delay = db.execute('''
|
|
WITH s AS (
|
|
SELECT expid, phase, source, COUNT(nexthop) AS stab
|
|
FROM default_route_changes
|
|
GROUP BY expid, phase, source)
|
|
SELECT e.phase, s.stab / (tstop - tstart), loss, (e.phase - 1) / 2
|
|
FROM end_to_end AS e
|
|
JOIN s ON s.expid = e.expid AND e.phase = s.phase AND s.source = e.source
|
|
JOIN phases AS p ON p.expid = e.expid AND p.phase = e.phase
|
|
''')
|
|
|
|
data = pd.DataFrame(changes_vs_delay.fetchall(), columns=['phase', 'changes', 'loss', 'firmware'])
|
|
data = data.replace([np.inf, -np.inf], np.nan).dropna()
|
|
g = sns.pairplot(data, diag_kind='kde', kind='reg', hue='phase', vars=['changes', 'loss'])
|
|
|
|
|
|
def plot_rank_loss(db, args):
|
|
|
|
rank_vs_loss = db.execute(
|
|
'''
|
|
SELECT de.phase, loss, avg_metric, avg_rank
|
|
FROM dag_edges AS de
|
|
JOIN end_to_end AS e2e ON e2e.expid = de.expid AND e2e.phase = de.phase AND e2e.source = de.source
|
|
GROUP BY de.expid, de.phase
|
|
''')
|
|
|
|
data = pd.DataFrame(rank_vs_loss.fetchall(), columns=['phase', 'loss', 'metric', 'rank'])
|
|
data = data.replace([np.inf, -np.inf], np.nan).dropna()
|
|
g = sns.pairplot(data, diag_kind='hist', kind='reg', hue='phase', vars=['loss', 'metric', 'rank'])
|
|
|
|
|
|
def plot_delay(db, args):
|
|
|
|
data = db.execute(
|
|
'''
|
|
SELECT phase, delay
|
|
FROM end_to_end
|
|
WHERE source != 'm3-200'
|
|
GROUP BY expid, phase
|
|
''')
|
|
|
|
data = pd.DataFrame(data.fetchall(), columns=['phase', 'delay'])
|
|
data = data.replace([np.inf, -np.inf], np.nan).dropna()
|
|
|
|
for phase in range(1,7):
|
|
pdata = data[data['phase'] == phase]
|
|
ax = sns.distplot(pdata[['delay']], hist=False, label=phase_names[phase-1])
|
|
|
|
ax.set_xlabel('delay')
|
|
ax.legend()
|
|
|
|
|
|
def plot_jitter(db, args):
|
|
|
|
data = db.execute(
|
|
'''
|
|
SELECT phase, jitter
|
|
FROM end_to_end
|
|
WHERE source != 'm3-200'
|
|
GROUP BY expid, phase
|
|
''')
|
|
|
|
data = pd.DataFrame(data.fetchall(), columns=['phase', 'jitter'])
|
|
data = data.replace([np.inf, -np.inf], np.nan).dropna()
|
|
|
|
for phase in range(1,7):
|
|
pdata = data[data['phase'] == phase]
|
|
ax = sns.distplot(pdata[['jitter']], hist=False, label=phase_names[phase-1])
|
|
|
|
ax.set_xlabel('jitter')
|
|
ax.legend()
|
|
|
|
|
|
def plot_loss(db, args):
|
|
|
|
data = db.execute(
|
|
'''
|
|
SELECT phase, loss
|
|
FROM end_to_end
|
|
WHERE source != 'm3-200'
|
|
GROUP BY expid, phase
|
|
''')
|
|
|
|
data = pd.DataFrame(data.fetchall(), columns=['phase', 'loss'])
|
|
data = data.replace([np.inf, -np.inf], np.nan).dropna()
|
|
|
|
for phase in range(1,7):
|
|
pdata = data[data['phase'] == phase]
|
|
ax = sns.distplot(pdata[['loss']], hist=False, label=phase_names[phase-1])
|
|
|
|
ax.set_xlabel('loss')
|
|
ax.legend()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
parser = argparse.ArgumentParser(description='Process file names.')
|
|
|
|
subp = parser.add_subparsers(help='command')
|
|
|
|
# overhead (dio,dao,dis) vs. phase
|
|
overhead = subp.add_parser('overhead')
|
|
overhead.set_defaults(func=plot_overhead)
|
|
overhead.add_argument('--database', '-d', nargs=1)
|
|
overhead.add_argument('--output' , '-o', nargs=1)
|
|
|
|
consumption = subp.add_parser('consumption')
|
|
consumption.set_defaults(func=plot_consumption)
|
|
consumption.add_argument('--database', '-d', nargs=1)
|
|
consumption.add_argument('--output' , '-o', nargs=1)
|
|
|
|
loss = subp.add_parser('loss')
|
|
loss.set_defaults(func=plot_loss)
|
|
loss.add_argument('--database', '-d', nargs=1)
|
|
loss.add_argument('--output', '-o', nargs=1)
|
|
|
|
delay = subp.add_parser('delay')
|
|
delay.set_defaults(func=plot_delay)
|
|
delay.add_argument('--database', '-d', nargs=1)
|
|
delay.add_argument('--output', '-o', nargs=1)
|
|
|
|
jitter = subp.add_parser('jitter')
|
|
jitter.set_defaults(func=plot_jitter)
|
|
jitter.add_argument('--database', '-d', nargs=1)
|
|
jitter.add_argument('--output', '-o', nargs=1)
|
|
|
|
args = parser.parse_args()
|
|
db = p.init_db(args.database[0])
|
|
|
|
plt.figure()
|
|
|
|
sns.set()
|
|
sns.set(font='NexusSerifPro')
|
|
sns.set_palette(tubspalette)
|
|
|
|
args.func(db, args)
|
|
|
|
plt.savefig(args.output[0])
|