From e675d6165081654f5553d324d80757cbd8253d52 Mon Sep 17 00:00:00 2001 From: Patrick Rathje Date: Wed, 3 Aug 2022 13:50:39 +0200 Subject: [PATCH] Update eval script --- out/current_per_functionality.pdf | Bin 0 -> 15076 bytes out/export_usage_seconds_per_day.pdf | Bin 0 -> 15415 bytes out/tek_check.pdf | Bin 0 -> 15530 bytes out/weighted_consumption.pdf | Bin 0 -> 14841 bytes scripts/eval.py | 135 ++++++++++++++++----------- 5 files changed, 81 insertions(+), 54 deletions(-) create mode 100644 out/current_per_functionality.pdf create mode 100644 out/export_usage_seconds_per_day.pdf create mode 100644 out/tek_check.pdf create mode 100644 out/weighted_consumption.pdf diff --git a/out/current_per_functionality.pdf b/out/current_per_functionality.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0adedb47d8179558f5f4a7d9ecc25076eb70b781 GIT binary patch literal 15076 zcmb_@2{@Er^gkg?sI190_7rBHF`wNBqXESnj<7uBONJw~oN3NpKJIWeH5i%V3RP74tAS1+ZKnmznMQ_V z7aQsNP-t+>V%gN0Mk7-xa2)g#hA^f2kSxeFxIGw0TNm_C4y3^m`rcqn&0o3JuUsGQ z2uE0WIJ{e;biq zJ)Jdu0s#+D4Kz|o5rapead0#mrAWXMK*

>P!WVev84J?C0Z8B>}lW6aOO@NK}6b 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 N355_9)!40x_&@H@&9ndj literal 0 HcmV?d00001 diff --git a/out/weighted_consumption.pdf b/out/weighted_consumption.pdf new file mode 100644 index 0000000000000000000000000000000000000000..10d144f7081deabcf3ce1e737d4a27d19481ac8f GIT binary patch literal 14841 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 literal 0 HcmV?d00001 diff --git a/scripts/eval.py b/scripts/eval.py index 646a94b..ef30a5e 100644 --- a/scripts/eval.py +++ b/scripts/eval.py @@ -134,17 +134,17 @@ adv_max_consumption = [ # measured_duration # duration # repetitions -adv_consumption = sum(list(per_adv_consumption.values())) / len(per_adv_consumption.values()) +adv_consumption = sum(list(adv_consumptions)) / len(adv_consumptions) add_consumption('adv', adv_consumption, 0.004, (24*3600)/0.25) # SCANNING scan_consumption = 6.01 scan_consumption_max = 8.71 -add_consumption('scan', scan_consumption, 2.015, 24*60) +add_consumption('scan', scan_consumption, 2.015, 24*12) -crypt_duration = 0.01 +crypt_duration = 0.22 crypt_consumption_avg = 3.2 crypt_consumption_max = 5.96 @@ -175,42 +175,16 @@ tek_check_consumption_max = 4.49 # measure consumption # extrapolate numbers for more keys! -# We then get keys to check -# 1000, 10000, 100000 - - -def export_adv_consumption(): - - xs = [per_adv_consumption[0], per_adv_consumption[-4], per_adv_consumption[-8], per_adv_consumption[-16], per_adv_consumption[-20], per_adv_consumption[-40]] - ys = ['0', '-4', '-8', '-16', '-20', '-40'] - - width = 0.6 # the width of the bars: can also be len(x) sequence - - fig, ax = plt.subplots() - - ax.set_ylabel('Avg. Advertising Current [µA]') - ax.set_xlabel('TX Power [dBm]') - - bars = ax.bar(ys,xs) - ax.bar_label(bars, padding=5, fmt='%.2f') - - #ax.set_title('') - #ax.legend() # (loc='upper center', bbox_to_anchor=(0.5, -0.5), ncol=2) - - # Adapt the figure size as needed - fig.set_size_inches(3.5, 3.2) - plt.tight_layout() - plt.savefig("../out/adv_consumption.pdf", format="pdf", bbox_inches='tight') - plt.close() - def export_consumption_per_day(): cpd = calculate_consumption_per_day([ - IDLE_LABEL, 'adv', 'scan', 'generate_tek', 'derive_tek', 'derive_rpi', 'encrypt_aem' + IDLE_LABEL, 'adv', 'scan', 'daily_crypto' ]) + print("export_consumption_per_day") + print(cpd) print(sum(cpd.values())) ys = ['Idle', 'Adv.', 'Scan', 'Crypto\n(Daily)'] - xs = [cpd[IDLE_LABEL], cpd['adv'], cpd['scan'], cpd['generate_tek']+cpd['derive_tek']+cpd['derive_rpi']+ cpd['encrypt_aem']] + xs = [cpd[IDLE_LABEL], cpd['adv'], cpd['scan'], cpd['daily_crypto']] fig, ax = plt.subplots() @@ -218,10 +192,14 @@ def export_consumption_per_day(): ax.set_xlabel('Functionality') bars = ax.bar(ys,xs) - ax.bar_label(bars, padding=5, fmt='%.2f') + + xs_labels = ["{:.2f}".format(x) if x >= 0.01 else "<0.01" for x in xs] + ax.bar_label(bars, padding=3, labels=xs_labels) # Adapt the figure size as needed - fig.set_size_inches(3.5, 3.2) + + fig.set_size_inches(3.0, 3.2) + ax.set_ylim([0, 2]) plt.tight_layout() plt.savefig("../out/weighted_consumption.pdf", format="pdf", bbox_inches='tight') plt.close() @@ -229,12 +207,14 @@ def export_consumption_per_day(): def export_usage_seconds_per_day(): cpd = calculate_usage_seconds_per_day([ - IDLE_LABEL, 'adv', 'scan', 'generate_tek', 'derive_tek', 'derive_rpi', 'encrypt_aem' + IDLE_LABEL, 'adv', 'scan', 'daily_crypto' ]) + print("export_usage_seconds_per_day") print(sum(cpd.values())) + print(cpd) ys = ['Idle', 'Adv.', 'Scan', 'Crypto\n(Daily)'] - xs = [cpd[IDLE_LABEL], cpd['adv'], cpd['scan'], cpd['generate_tek']+cpd['derive_tek']+cpd['derive_rpi']+ cpd['encrypt_aem']] - xs = [x/(24*3600) for x in xs] + xs = [cpd[IDLE_LABEL], cpd['adv'], cpd['scan'], cpd['daily_crypto']] + xs = [100*x/(24*3600) for x in xs] fig, ax = plt.subplots() @@ -242,18 +222,27 @@ def export_usage_seconds_per_day(): ax.set_xlabel('Functionality') bars = ax.bar(ys,xs) - ax.bar_label(bars, padding=5, fmt='%.2f') + + xs_labels = ["{:.2f}%".format(x) if x >= 0.01 else "<0.01%" for x in xs] + ax.bar_label(bars, padding=3, labels=xs_labels) + + ax = plt.gca() + #ax.set_xlim([xmin, xmax]) + ax.set_ylim([0, 109]) # Adapt the figure size as needed - fig.set_size_inches(3.5, 3.2) + fig.set_size_inches(3.0, 3.2) plt.tight_layout() plt.savefig("../out/export_usage_seconds_per_day.pdf", format="pdf", bbox_inches='tight') plt.close() def export_current_per_functionality(): - ys = ['Idle', 'Adv.', 'Scan', 'Daily\nSecret', 'TEK', 'RPI', 'AEM'] - xs = [consumptions[IDLE_LABEL], consumptions['adv'], consumptions['scan'], consumptions['generate_tek'], consumptions['derive_tek'], consumptions['derive_rpi'], consumptions['encrypt_aem']] + ys = ['Idle', 'Adv.', 'Scan', 'Crypto\n(Daily)'] + xs = [consumptions[IDLE_LABEL], consumptions['adv'], consumptions['scan'], consumptions['daily_crypto']] + + print("export_current_per_functionality") + print(consumptions) fig, ax = plt.subplots() @@ -261,38 +250,76 @@ def export_current_per_functionality(): ax.set_xlabel('Functionality') bars = ax.bar(ys,xs) - ax.bar_label(bars, padding=5, fmt='%.2f') + + xs_labels = ["{:.2f}".format(x) if x >= 0.01 else "<0.01" for x in xs] + ax.bar_label(bars, padding=3, fmt='%.2f', labels=xs_labels) # Adapt the figure size as needed - fig.set_size_inches(4.5, 3.2) + fig.set_size_inches(3.0, 3.2) + ax.set_ylim([0, 8]) plt.tight_layout() plt.savefig("../out/current_per_functionality.pdf", format="pdf", bbox_inches='tight') plt.close() def export_tek_check(): - tek_check_duration = 0.020 - xs = [1000, 10000, 1000000] - ys = [x*tek_check_duration for x in xs] + xs = [0, 1250000, 2500000, 5000000] - xs = [str(x) for x in xs] + means = {} + + for l in ['GAEN', 'TEK Transport', 'TEK Check']: + means[l] = [] + + for tpd in xs: + add_consumption('tek_check_' + str(tpd), tek_check_consumption, tek_check_duration, tpd, repetitions=tek_check_amount) + add_consumption('tek_transport_' + str(tpd), 8, 1.0, tpd, repetitions=3125) + + print(tpd) + + #upd = calculate_usage_seconds_per_day([ + # IDLE_LABEL, 'adv', 'scan', 'daily_crypto', 'tek_check_' + str(tpd), 'tek_transport_' + str(tpd) + #]) + #print(upd) + cpd = calculate_consumption_per_day([ + IDLE_LABEL, 'adv', 'scan', 'daily_crypto', 'tek_check_' + str(tpd), 'tek_transport_' + str(tpd) + ]) + print(cpd) + + means['GAEN'].append(cpd[IDLE_LABEL]+ cpd['adv']+cpd['scan']+ cpd['daily_crypto']) + means['TEK Transport'].append(cpd['tek_transport_' + str(tpd)]) + means['TEK Check'].append(cpd['tek_check_' + str(tpd)]) + + + labels = ['GAEN', 'TEK Transport', 'TEK Check'] + + width = 0.4 # the width of the bars: can also be len(x) sequence fig, ax = plt.subplots() - ax.set_ylabel('Extrapolated Time [s]') - ax.set_xlabel('Number of TEKs') - bars = ax.bar(xs,ys) - ax.bar_label(bars, padding=5, fmt='%d') + #xs = [str(x) for x in xs] + xs = ['0', '1,250,000', '2,500,000', '5,000,000'] + ax.bar(xs, means['GAEN'], width, label='GAEN') + ax.bar(xs, means['TEK Transport'], width, label='TEK Transport', bottom=means['GAEN']) + bars = ax.bar(xs, means['TEK Check'], width, label='TEK Check', bottom=[means['GAEN'][i]+means['TEK Transport'][i] for (i,x) in enumerate(xs)]) + + bar_labels = [means['GAEN'][i]+means['TEK Transport'][i]+means['TEK Check'][i] for (i,x) in enumerate(xs)] + bar_labels = ['{:.2f}'.format(l) for l in bar_labels] + print(bar_labels) + ax.bar_label(bars, padding=3, labels=bar_labels) + + ax.set_ylabel('Estimated Consumption per Day [mAh]') + ax.set_xlabel('Number of TEKs per Day') + ax.legend() # Adapt the figure size as needed - fig.set_size_inches(4.5, 3.2) + fig.set_size_inches(4.2, 3.5) + ax.set_ylim([0, 100]) plt.tight_layout() plt.savefig("../out/tek_check.pdf", format="pdf", bbox_inches='tight') plt.close() -export_adv_consumption() export_usage_seconds_per_day() export_consumption_per_day() export_current_per_functionality()