summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bin/Proof_Of_Concept_PELT.py137
1 files changed, 124 insertions, 13 deletions
diff --git a/bin/Proof_Of_Concept_PELT.py b/bin/Proof_Of_Concept_PELT.py
index 643a368..2ed7675 100644
--- a/bin/Proof_Of_Concept_PELT.py
+++ b/bin/Proof_Of_Concept_PELT.py
@@ -151,6 +151,89 @@ def calc_PELT(signal, model='l1', jump=5, min_dist=2, range_min=1, range_max=50,
print('With the current thresh-hold S=' + str(S) + ' it is not possible to select a penalty value.')
+# very short benchmark yielded approx. 1/3 of speed compared to solution with sorting
+def needs_refinement_no_sort(signal, mean, thresh):
+ # linear search for the top 10%/ bottom 10%
+ # should be sufficient
+ length_of_signal = len(signal)
+ percentile_size = int()
+ percentile_size = length_of_signal // 100
+ upper_percentile = [None] * percentile_size
+ lower_percentile = [None] * percentile_size
+ fill_index_upper = percentile_size - 1
+ fill_index_lower = percentile_size - 1
+ index_smallest_val = fill_index_upper
+ index_largest_val = fill_index_lower
+
+ for x in signal:
+ if x > mean:
+ # will be in upper percentile
+ if fill_index_upper >= 0:
+ upper_percentile[fill_index_upper] = x
+ if x < upper_percentile[index_smallest_val]:
+ index_smallest_val = fill_index_upper
+ fill_index_upper = fill_index_upper - 1
+ continue
+
+ if x > upper_percentile[index_smallest_val]:
+ # replace smallest val. Find next smallest val
+ upper_percentile[index_smallest_val] = x
+ index_smallest_val = 0
+ i = 0
+ for y in upper_percentile:
+ if upper_percentile[i] < upper_percentile[index_smallest_val]:
+ index_smallest_val = i
+ i = i + 1
+
+ else:
+ if fill_index_lower >= 0:
+ lower_percentile[fill_index_lower] = x
+ if x > lower_percentile[index_largest_val]:
+ index_largest_val = fill_index_upper
+ fill_index_lower = fill_index_lower - 1
+ continue
+ if x < lower_percentile[index_largest_val]:
+ # replace smallest val. Find next smallest val
+ lower_percentile[index_largest_val] = x
+ index_largest_val = 0
+ i = 0
+ for y in lower_percentile:
+ if lower_percentile[i] > lower_percentile[index_largest_val]:
+ index_largest_val = i
+ i = i + 1
+
+ # should have the percentiles
+ lower_percentile_mean = np.mean(lower_percentile)
+ upper_percentile_mean = np.mean(upper_percentile)
+ dist = mean - lower_percentile_mean
+ if dist > thresh:
+ return True
+ dist = upper_percentile_mean - mean
+ if dist > thresh:
+ return True
+ return False
+
+
+# Very short benchmark yielded approx. 3 times the speed of solution not using sort
+def needs_refinement_sort(signal, thresh):
+ sorted_signal = sorted(signal)
+ length_of_signal = len(signal)
+ percentile_size = int()
+ percentile_size = length_of_signal // 100
+ lower_percentile = sorted_signal[0:percentile_size]
+ upper_percentile = sorted_signal[length_of_signal - percentile_size : length_of_signal]
+ lower_percentile_mean = np.mean(lower_percentile)
+ upper_percentile_mean = np.mean(upper_percentile)
+ median = np.median(sorted_signal)
+ dist = median - lower_percentile_mean
+ if dist > thresh:
+ return True
+ dist = upper_percentile_mean - median
+ if dist > thresh:
+ return True
+ return False
+
+
if __name__ == '__main__':
import numpy as np
import json
@@ -160,6 +243,7 @@ if __name__ == '__main__':
import getopt
import re
from dfatool.dfatool import RawData
+ # OPTION RECOGNITION
opt = dict()
optspec = (
@@ -176,6 +260,7 @@ if __name__ == '__main__':
"S= "
"pen_override= "
"plotting= "
+ "refinement_thresh= "
)
opt_filename = None
opt_verbose = False
@@ -190,6 +275,7 @@ if __name__ == '__main__':
opt_S = None
opt_pen_override = None
opt_plotting = False
+ opt_refinement_thresh = None
try:
raw_opts, args = getopt.getopt(sys.argv[1:], "", optspec.split(" "))
@@ -261,14 +347,38 @@ if __name__ == '__main__':
except ValueError as verr:
print(verr, file=sys.stderr)
sys.exit(2)
+ if 'refinement_thresh' in opt:
+ try:
+ opt_refinement_thresh = int(opt['refinement_thresh'])
+ except ValueError as verr:
+ print(verr, file=sys.stderr)
+ sys.exit(2)
except getopt.GetoptError as err:
print(err, file=sys.stderr)
sys.exit(2)
+ #OPENING DATA
+ import time
if ".json" in opt_filename:
# open file with trace data from json
- with open(opt['filename'], 'r') as f:
- tx_data = json.load(f)
+ print("[INFO] Will only refine the state which is present in " + opt_filename + " if necessary.")
+ with open(opt_filename, 'r') as f:
+ states = json.load(f)
+ # loop through all traces check if refinement is necessary
+ print("Checking if refinement is necessary...")
+ res = False
+ for measurements_by_state in states:
+ # loop through all occurrences of the looked at state
+ print("Looking at state '" + measurements_by_state['name'] + "'")
+ for measurement in measurements_by_state['offline']:
+ # loop through measurements of particular state
+ # an check if state needs refinement
+ signal = measurement['uW']
+ # mean = measurement['uW_mean']
+ # TODO: Decide if median is really the better baseline than mean
+ if needs_refinement_sort(signal, opt_refinement_thresh):
+ print("Refinement is necessary!")
+ break
elif ".tar" in opt_filename:
# open with dfatool
raw_data_args = list()
@@ -280,18 +390,19 @@ if __name__ == '__main__':
preprocessed_data = raw_data.get_preprocessed_data()
print("File fully preprocessed")
+ # TODO: Mal schauen, wie ich das mache. Erstmal nur mit json
else:
print("Unknown dataformat", file=sys.stderr)
sys.exit(2)
- print(tx_data[1]['parameter'])
- # parse json to array for PELT
- signal = np.array(tx_data[1]['offline'][0]['uW'])
-
- for i in range(0, len(signal)):
- signal[i] = signal[i]/1000
- bkps = calc_PELT(signal, model=opt_model, range_max=opt_range_max, num_processes=opt_num_processes, jump=opt_jump, S=opt_S)
- fig, ax = rpt.display(signal, bkps)
- plt.xlabel('Time [us]')
- plt.ylabel('Power [mW]')
- plt.show()
+ # print(tx_data[1]['parameter'])
+ # # parse json to array for PELT
+ # signal = np.array(tx_data[1]['offline'][0]['uW'])
+ #
+ # for i in range(0, len(signal)):
+ # signal[i] = signal[i]/1000
+ # bkps = calc_PELT(signal, model=opt_model, range_max=opt_range_max, num_processes=opt_num_processes, jump=opt_jump, S=opt_S)
+ # fig, ax = rpt.display(signal, bkps)
+ # plt.xlabel('Time [us]')
+ # plt.ylabel('Power [mW]')
+ # plt.show()