-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMeasurementsHelper.py
More file actions
158 lines (105 loc) · 5.55 KB
/
MeasurementsHelper.py
File metadata and controls
158 lines (105 loc) · 5.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import pandas as pd
from enum import Enum
from UtilityHelper import *
class PerfMetric(Enum):
THROUGHPUT = 'throughput (Mbps)'
LOSS_RATIO = 'loss rate (%)'
RETRANSMISSION_RATIO = 'retransmission (%)'
NB_SENT_PACKETS = '# sent packets'
DELAY = 'delay (msec)'
ELSE = 'else'
########################################### Per Trace Performance ##########################################
class Performance:
def __init__(self, pkts_df, start_t, end_t, perf_func, state_func):
self.pkts_df = pkts_df
self.start_t = start_t
self.end_t = end_t
self.perf_func = perf_func
self.perf_cache = {}
self.state_func = state_func
def clear_cache(self):
self.perf_cache = {}
def compute_perfs(self, interval_size):
if interval_size not in self.perf_cache:
intervals, perfs = create_intervals_list(self.start_t, self.end_t, interval_size), []
for interval in intervals:
perfs.append((interval[0], self.perf_func(self.pkts_df, interval)))
self.perf_cache[interval_size] = pd.DataFrame(perfs, columns=['time', 'perf'])
return self.perf_cache[interval_size]
def compute_total_perf(self):
return self.perf_func(self.pkts_df, [self.start_t, self.end_t])
def get_good_state(self, perf, threshold):
return self.state_func(perf, threshold)
def compute_good_prob(self, interval_size, threshold):
perfs = self.compute_perfs(interval_size)
perfs = perfs[perfs.perf != -1]
good_states = perfs['perf'].apply(lambda val: self.get_good_state(val, threshold))*1
return to_pct(np.average(good_states))
class RetransmissionPerf(Performance):
def __init__(self, pkts_df, start_t, end_t):
self.metric = PerfMetric.RETRANSMISSION_RATIO
super().__init__(pkts_df, start_t, end_t, RetransmissionPerf.compute_retransmission_ratio, RetransmissionPerf.is_state_good)
def compute_retransmission_ratio(pkts_df, interval):
temp_df = pkts_df[pkts_df['time'].between(interval[0], interval[1])]
if temp_df.shape[0] == 0: return -1
return to_pct(temp_df[temp_df['is_retransmitted'] == 1]['size'].sum() / temp_df['size'].sum())
def is_state_good(perf, threshold):
return perf < threshold
class LossPerf(Performance):
def __init__(self, pkts_df, start_t, end_t):
self.metric = PerfMetric.LOSS_RATIO
super().__init__(pkts_df, start_t, end_t, LossPerf.compute_loss_ratio, LossPerf.is_state_good)
def compute_loss_ratio(pkts_df, interval):
temp_df = pkts_df[pkts_df['time'].between(interval[0], interval[1])]
if temp_df.shape[0] == 0: return -1
return to_pct(temp_df[temp_df['is_lost'] == 1]['size'].sum() / temp_df['size'].sum())
def is_state_good(perf, threshold):
return perf < threshold
class ThroughputPerf(Performance):
def __init__(self, pkts_df, start_t, end_t):
self.metric = PerfMetric.THROUGHPUT
super().__init__(pkts_df, start_t, end_t, ThroughputPerf.compute_xput, ThroughputPerf.is_state_good)
def compute_xput(pkts_df, interval):
temp_df = pkts_df[pkts_df['time'].between(interval[0], interval[1])]
if temp_df.shape[0] == 0: return -1
return round(B_to_Mb(temp_df['size'].sum()) / (interval[1]-interval[0]), 3)
def is_state_good(perf, threshold):
return perf >= threshold
class NbSentPacketsPerf(Performance):
def __init__(self, pkts_df, start_t, end_t):
self.metric = PerfMetric.NB_SENT_PACKETS
super().__init__(pkts_df, start_t, end_t, NbSentPacketsPerf.compute_nb_sent_packets, (lambda perf, threshold: True))
def compute_nb_sent_packets(pkts_df, interval):
temp_df = pkts_df[pkts_df['time'].between(interval[0], interval[1])]
return temp_df.shape[0]
class DelayPerf(Performance):
def __init__(self, pkts_df, start_t, end_t):
self.metric = PerfMetric.DELAY
super().__init__(pkts_df, start_t, end_t, DelayPerf.compute_avg_delay, DelayPerf.is_state_good)
def compute_avg_delay(pkts_df, interval):
temp_df = pkts_df[pkts_df['time'].between(interval[0], interval[1])]
return temp_df['delay'].sum() / temp_df.shape[0]
def is_state_good(perf, threshold):
return perf < threshold
########################################### Path-Pair Performance ##########################################
class PathPairPerf:
def __init__(self, paths_perf):
self.paths_perf = paths_perf
def compute_perfs(self, interval_size):
perfs = [perf.compute_perfs(interval_size) for perf in self.paths_perf]
perfs = [df[df.perf != -1] for df in perfs]
return pd.merge(perfs[0], perfs[1], how='inner', on=['time'], suffixes=('_p1', '_p2'))
class SelectivePathPairPerf(PathPairPerf):
def __init__(self, paths_perf, filter_f=(lambda x:x)):
super().__init__(paths_perf)
self.filter_f = filter_f
def compute_perfs(self, interval_size):
return self.filter_f(super().compute_perfs(interval_size))
class SelectivePathPairPerfList():
def __init__(self, paths_perf_list):
self.paths_perf_list = paths_perf_list
def compute_perfs(self, interval_size):
result = pd.concat([
paths_perf.compute_perfs(interval_size) for paths_perf in self.paths_perf_list
])
return result