From 3f9a0cd033531faefd433c4fbdfd6ce473404a84 Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 4 Nov 2022 12:06:17 +0100 Subject: [PATCH 01/42] add scripts and resources for compelxity measurements --- ci/complexity_measurements/ep_10pct_fer.g192 | 1 + .../genWebpageData_Prom.csh | 191 ++ .../genWebpageData_Ram.csh | 475 +++++ .../genWebpageData_Rom.csh | 153 ++ .../genWebpageData_WMOPS.csh | 469 +++++ .../genWebpageData_WmopPerOperatingpoint.csh | 475 +++++ ci/complexity_measurements/getWmops.sh | 70 + .../index_complexity.html | 1649 +++++++++++++++++ .../mergeNewsletterRam.py | 79 + .../parseNewsletterProm.py | 60 + .../parseNewsletterRam.py | 143 ++ .../parseNewsletterRom.py | 48 + .../parseNewsletterWmops.py | 77 + ci/complexity_measurements/style.css | 220 +++ 14 files changed, 4110 insertions(+) create mode 100755 ci/complexity_measurements/ep_10pct_fer.g192 create mode 100755 ci/complexity_measurements/genWebpageData_Prom.csh create mode 100755 ci/complexity_measurements/genWebpageData_Ram.csh create mode 100755 ci/complexity_measurements/genWebpageData_Rom.csh create mode 100755 ci/complexity_measurements/genWebpageData_WMOPS.csh create mode 100755 ci/complexity_measurements/genWebpageData_WmopPerOperatingpoint.csh create mode 100755 ci/complexity_measurements/getWmops.sh create mode 100755 ci/complexity_measurements/index_complexity.html create mode 100755 ci/complexity_measurements/mergeNewsletterRam.py create mode 100755 ci/complexity_measurements/parseNewsletterProm.py create mode 100755 ci/complexity_measurements/parseNewsletterRam.py create mode 100755 ci/complexity_measurements/parseNewsletterRom.py create mode 100755 ci/complexity_measurements/parseNewsletterWmops.py create mode 100755 ci/complexity_measurements/style.css diff --git a/ci/complexity_measurements/ep_10pct_fer.g192 b/ci/complexity_measurements/ep_10pct_fer.g192 new file mode 100755 index 0000000000..ba6bfc78b3 --- /dev/null +++ b/ci/complexity_measurements/ep_10pct_fer.g192 @@ -0,0 +1 @@ +!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k k k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k k!k k k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k k k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k k!k!k k!k!k!k!k!k!k k k!k!k!k!k!k k!k!k!k!k!k!k!k!k k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k k!k!k!k!k!k k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k k k!k!k k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k k!k!k k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k k!k!k!k k!k!k!k!k!k!k k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k k k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k k k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k k!k k k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k k!k!k k!k!k k k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k k!k!k!k!k!k k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k k k!k!k k k!k!k k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k k!k!k!k k!k!k!k!k k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k k k k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k k!k!k!k!k!k k!k!k!k k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k k k!k!k!k k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k k!k!k!k!k!k!k!k k!k!k k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k k k!k!k!k!k k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k k!k k k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k k!k!k!k!k!k k k!k k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k k!k k!k!k k!k!k!k k k k!k!k!k!k k k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k k!k!k!k!k!k!k!k!k k!k!k!k k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k k!k k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k k!k k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k k!k!k!k!k!k!k!k k!k!k!k k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k k!k!k k!k k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k k k!k!k k!k!k!k!k!k k k!k k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k k k!k!k!k k k!k!k!k k!k!k!k!k!k k!k!k k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k k!k!k!k k k!k!k!k!k k!k k!k!k k!k k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k k!k k k!k!k!k!k!k!k k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k k!k!k!k k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k k!k!k!k!k!k k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k k k k k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k k!k k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k k!k!k!k!k!k!k!k k!k k!k!k!k!k k!k!k!k k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k k!k!k!k!k!k!k!k!k!k k!k k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k k!k k!k!k!k!k!k k k!k k!k!k k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k k k!k!k!k!k k!k k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k k!k k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k k k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k k!k!k k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k k!k!k k k!k!k!k!k!k!k!k!k!k k!k!k!k k!k k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k k!k!k!k k k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k k!k!k!k!k!k k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k k!k!k!k k!k k!k k!k!k!k k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k k!k k k!k!k!k k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k k!k!k k!k k!k k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k k k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k k k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k k k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k k!k k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k k!k k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k k!k!k!k!k k k!k!k!k k!k k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k k!k k!k!k!k k!k k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k k k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k k!k k!k k!k!k k k!k!k!k!k!k!k!k!k!k k k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k k k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k k!k k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k k!k!k!k!k k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k k!k!k k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k k!k k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k k k!k k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k k k!k!k!k!k k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k k!k!k!k!k!k!k k!k k!k!k!k!k!k k k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k k!k!k!k!k!k k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k k!k!k!k!k!k k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k k k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k k!k!k!k k k!k!k!k k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k k!k!k k!k k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k k k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k k!k k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k k!k k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k k!k k!k!k!k!k!k k k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k k!k!k!k!k!k k!k!k!k k!k!k!k!k!k k!k k!k k!k!k!k k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k k k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k k!k!k!k k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k k!k!k!k!k k k!k!k!k k!k!k!k!k!k k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k k!k k k!k!k!k!k!k k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k k!k k!k!k k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k!k!k!k k!k k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k k!k!k!k!k k!k k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k k!k!k!k k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k!k!k!k k!k!k k k!k!k k k!k!k!k!k!k!k!k!k!k!k!k k k!k k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k k!k k!k k k!k!k!k!k!k!k!k k!k!k!k k k!k k k!k!k!k!k!k!k!k k!k k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k k k!k!k!k!k!k!k!k!k!k!k k!k!k k!k!k!k!k!k k!k k!k k!k!k!k!k!k k!k!k!k!k!k k k!k!k!k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k k!k!k k!k k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k!k \ No newline at end of file diff --git a/ci/complexity_measurements/genWebpageData_Prom.csh b/ci/complexity_measurements/genWebpageData_Prom.csh new file mode 100755 index 0000000000..bd9f40efab --- /dev/null +++ b/ci/complexity_measurements/genWebpageData_Prom.csh @@ -0,0 +1,191 @@ +#!/bin/tcsh + +set maxValues = 40 + +if (${#argv} != 3) then + echo usage: $0 \ \ \ + exit +endif + +set srcFile1 = $1 + +set file_final = $2 +set file = ${file_final}_new_$$ + +set graphName = $3 + +set tmpBase = `basename $0` +set tmpFile1 = /tmp/${tmpBase}1_$$ +rm -f ${tmpFile1} +cat ${srcFile1} | tail -n ${maxValues} > ${tmpFile1} +set nLines1 = `cat ${tmpFile1} | wc -l` +set maxNumWordsLine = 7 + +rm -f $file +touch $file + +echo "var $graphName = {" >> $file +echo ' prom_worstcase: {' >> $file +echo ' description: "Worst Case PROM",' >> $file +echo ' direction: -1,' >> $file +echo ' runs: [' >> $file + + +@ i = 0 +foreach line ( "`cat ${tmpFile1}`" ) + @ i++ + set separator = "," + if ( $i == $nLines1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLine ) then + continue + endif + + set revision = $tmp[1] + set shortDate = `echo $tmp[2] | sed -e "s/_/\ /g"` + set fullDate = `echo $tmp[3] | sed -e "s/_/\ /g"` + set logFileFlc = $tmp[5] + set logFileBasop = $tmp[7] + + echo ' {' >> $file + echo ' fullDate: "'${fullDate}'",' >> $file + echo ' shortDate: "'${shortDate}'",' >> $file + echo ' revision: "'${revision}'",' >> $file + echo ' logFileFlc: "'${logFileFlc}'",' >> $file + echo ' logFileBasop: "'${logFileBasop}'",' >> $file + echo ' }'${separator} >> $file + +end +echo ' ],' >> $file + +# begin displays +echo ' displays: [' >> $file + +# requirement PROM +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#000000",' >> $file +echo ' id: "requirementProm",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile1}`" ) + set separator = "," + if ( $i == $nLines1 - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLine ) then + continue + endif + + set score = 54260 + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# requirement ROM + +# measured ops FLC +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#FF8000",' >> $file +echo ' id: "promOpsFlc",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile1}`" ) + set separator = "," + if ( $i == $nLines1 - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLine ) then + continue + endif + + set score = $tmp[4] + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# measured ops FLC + +# measured ops BASOP +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#0080FF",' >> $file +echo ' id: "promOpsBasop",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile1}`" ) + set separator = "," + if ( $i == $nLines1 - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLine ) then + continue + endif + + set score = $tmp[6] + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' }' >> $file + +echo ' ]' >> $file + +echo ' }' >> $file +echo '};' >> $file + +mv -f $file $file_final +rm -f ${tmpFile1} diff --git a/ci/complexity_measurements/genWebpageData_Ram.csh b/ci/complexity_measurements/genWebpageData_Ram.csh new file mode 100755 index 0000000000..dfa6d13ca5 --- /dev/null +++ b/ci/complexity_measurements/genWebpageData_Ram.csh @@ -0,0 +1,475 @@ +#!/bin/tcsh + +set maxValues = 40 + +if (${#argv} != 3) then + echo usage: $0 \ \ \ + exit +endif + +set srcFile = $1 +set file_final = $2 +set file = ${file_final}_new_$$ +set graphName = $3 + + +set tmpBase = `basename $0` +set tmpFile = /tmp/${tmpBase}_$$ +rm -f ${tmpFile} +cat ${srcFile} | tail -n ${maxValues} > ${tmpFile} +set nLines = `cat ${tmpFile} | wc -l` +set maxNumWordsLine = 19 + +rm -f $file +touch $file + +echo "var $graphName = {" >> $file +echo ' ram_worstcase: {' >> $file +echo ' description: "Worst Case RAM",' >> $file +echo ' direction: -1,' >> $file +echo ' runs: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + @ i++ + set separator = "," + if ( $i == $nLines ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLine ) then + continue + endif + + set revision = $tmp[1] + set shortDate = `echo $tmp[2] | sed -e "s/_/\ /g"` + set fullDate = `echo $tmp[3] | sed -e "s/_/\ /g"` + set maxTotalRamEnc = $tmp[5] + set maxTotalRamDec = $tmp[7] + set maxDynamicRamEnc = $tmp[10] + set maxDynamicRamDec = $tmp[12] + set maxStaticRamEnc = $tmp[15] + set maxStaticRamDec = $tmp[17] + set logFile = $tmp[19] + + echo ' {' >> $file + echo ' fullDate: "'${fullDate}'",' >> $file + echo ' shortDate: "'${shortDate}'",' >> $file + echo ' revision: "'${revision}'",' >> $file + echo ' maxTotalRamEnc: "'${maxTotalRamEnc}'",' >> $file + echo ' maxTotalRamDec: "'${maxTotalRamDec}'",' >> $file + echo ' maxDynamicRamEnc: "'${maxDynamicRamEnc}'",' >> $file + echo ' maxDynamicRamDec: "'${maxDynamicRamDec}'",' >> $file + echo ' maxStaticRamEnc: "'${maxStaticRamEnc}'",' >> $file + echo ' maxStaticRamDec: "'${maxStaticRamDec}'",' >> $file + echo ' logFile: "'${logFile}'"' >> $file + echo ' }'${separator} >> $file + +end +echo ' ],' >> $file + +# begin displays +echo ' displays: [' >> $file + +# requirement RAM +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#000000",' >> $file +echo ' id: "requirementRam",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + set separator = "," + if ( $i == $nLines - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLine ) then + continue + endif + + set score = 200000 + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# requirement RAM + +# maxTotalRamCodecScore +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#FF0000",' >> $file +echo ' id: "maxTotalRamCodecScore",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + set separator = "," + if ( $i == $nLines - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLine ) then + continue + endif + + set score = $tmp[4] + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# maxTotalRamCodecScore + +# maxTotalRamEncScore +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#FF8000",' >> $file +echo ' id: "maxTotalRamEncScore",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + set separator = "," + if ( $i == $nLines - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLine ) then + continue + endif + + set score = $tmp[6] + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# maxTotalRamEncScore + +# maxTotalRamDecScore +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#FFFF00",' >> $file +echo ' id: "maxTotalRamDecScore",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + set separator = "," + if ( $i == $nLines - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLine ) then + continue + endif + + set score = $tmp[8] + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# maxTotalRamDecScore + +# maxDynamicRamCodecScore +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#004000",' >> $file +echo ' id: "maxDynamicRamCodecScore",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + set separator = "," + if ( $i == $nLines - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLine ) then + continue + endif + + set score = $tmp[9] + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# maxDynamicRamCodecScore + + +# maxDynamicRamEncScore +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#008000",' >> $file +echo ' id: "maxDynamicRamEncScore",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + set separator = "," + if ( $i == $nLines - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLine ) then + continue + endif + + set score = $tmp[11] + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# maxDynamicRamEncScore + +# maxDynamicRamDecScore +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#00FF00",' >> $file +echo ' id: "maxDynamicRamDecScore",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + set separator = "," + if ( $i == $nLines - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLine ) then + continue + endif + + set score = $tmp[13] + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# maxDynamicRamDecScore + +# maxStaticRamCodecScore +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#800080",' >> $file +echo ' id: "maxStaticRamCodecScore",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + set separator = "," + if ( $i == $nLines - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLine ) then + continue + endif + + set score = $tmp[14] + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# maxStaticRamCodecScore + +# maxStaticRamEncScore +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#0000FF",' >> $file +echo ' id: "maxStaticRamEncScore",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + set separator = "," + if ( $i == $nLines - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLine ) then + continue + endif + + set score = $tmp[16] + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# maxStaticRamEncScore + +# maxStaticRamDecScore +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#0080C0",' >> $file +echo ' id: "maxStaticRamDecScore",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + set separator = "," + if ( $i == $nLines - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLine ) then + continue + endif + + set score = $tmp[18] + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' }' >> $file +# maxStaticRamDecScore + +echo ' ]' >> $file +# end displays + +echo ' }' >> $file +echo '};' >> $file + +mv -f $file $file_final +rm -f $tmpFile diff --git a/ci/complexity_measurements/genWebpageData_Rom.csh b/ci/complexity_measurements/genWebpageData_Rom.csh new file mode 100755 index 0000000000..776e801549 --- /dev/null +++ b/ci/complexity_measurements/genWebpageData_Rom.csh @@ -0,0 +1,153 @@ +#!/bin/tcsh + +set maxValues = 40 + +if (${#argv} != 3) then + echo usage: $0 \ \ \ \ + exit +endif + +set srcFile1 = $1 + +set file_final = $2 +set file = ${file_final}_new_$$ +set graphName = $3 + +set tmpBase = `basename $0` +set tmpFile1 = /tmp/${tmpBase}1_$$ +set tmpFile2 = /tmp/${tmpBase}2_$$ +rm -f ${tmpFile1} ${tmpFile2} +cat ${srcFile1} | tail -n ${maxValues} > ${tmpFile1} +set nLines1 = `cat ${tmpFile1} | wc -l` +set maxNumWordsLine1 = 5 +set maxNumWordsLine2 = 5 + +rm -f $file +touch $file + +echo "var $graphName = {" >> $file +echo ' rom_worstcase: {' >> $file +echo ' description: "Worst Case ROM",' >> $file +echo ' direction: -1,' >> $file +echo ' runs: [' >> $file + + +@ i = 0 +foreach line ( "`cat ${tmpFile1}`" ) + @ i++ + set separator = "," + if ( $i == $nLines1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLine1 ) then + continue + endif + + set revision = $tmp[1] + set shortDate = `echo $tmp[2] | sed -e "s/_/\ /g"` + set fullDate = `echo $tmp[3] | sed -e "s/_/\ /g"` + set logFileFlc = $tmp[5] + + echo ' {' >> $file + echo ' fullDate: "'${fullDate}'",' >> $file + echo ' shortDate: "'${shortDate}'",' >> $file + echo ' revision: "'${revision}'",' >> $file + echo ' logFileFlc: "'${logFileFlc}'",' >> $file +# echo ' logFileBasop: "'${logFileBasop[$i]}'"' >> $file + echo ' }'${separator} >> $file + +end +echo ' ],' >> $file + +# begin displays +echo ' displays: [' >> $file + +# requirement ROM +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#000000",' >> $file +echo ' id: "requirementRom",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile1}`" ) + set separator = "," + if ( $i == $nLines1 - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLine1 ) then + continue + endif + + set score = 200000 + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# requirement ROM + +# maxTablesizeCodecScore FLC +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#FF8000",' >> $file +echo ' id: "maxRomFlc",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile1}`" ) + set separator = "," + if ( $i == $nLines1 - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLine1 ) then + continue + endif + + set score = $tmp[4] + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' }' >> $file +# maxTablesizeCodecScore FLC +echo ' ]' >> $file +# end displays + +echo ' }' >> $file +echo '};' >> $file + +mv -f $file $file_final +rm -f $tmpFile1 diff --git a/ci/complexity_measurements/genWebpageData_WMOPS.csh b/ci/complexity_measurements/genWebpageData_WMOPS.csh new file mode 100755 index 0000000000..c3137640d6 --- /dev/null +++ b/ci/complexity_measurements/genWebpageData_WMOPS.csh @@ -0,0 +1,469 @@ +#!/bin/tcsh + +set maxValues = 40 + +if (${#argv} != 3) then + echo usage: $0 \ \ \ + exit +endif + +set srcFile = $1 +set file_final = $2 +set file = ${file_final}_new_$$ +set graphName = $3 + + +set tmpBase = `basename $0` +set tmpFile = /tmp/${tmpBase}_$$ +rm -f ${tmpFile} +cat ${srcFile} | tail -n ${maxValues} > ${tmpFile} +set nLines = `cat ${tmpFile} | wc -l` +set maxNumWordsLineOld = 12 +set maxNumWordsLineNew = 19 + +rm -f $file +touch $file + +echo "var $graphName = {" >> $file +echo ' wmops_worstcase: {' >> $file +echo ' description: "Worst Case WMOPS",' >> $file +echo ' direction: -1,' >> $file +echo ' runs: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + @ i++ + set separator = "," + if ( $i == $nLines ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLineOld ) then + continue + endif + + set revision = $tmp[1] + set shortDate = `echo $tmp[2] | sed -e "s/_/\ /g"` + set fullDate = `echo $tmp[3] | sed -e "s/_/\ /g"` + set worstCaseEnc = $tmp[5] + set worstCaseDec = $tmp[7] + set worstCaseCodec = $tmp[9] + set fixpointScalingFac = $tmp[11] + if ( $numWords == $maxNumWordsLineOld ) then + set logFile = $tmp[12] + set worstCaseEncRs = "" + set worstCaseDecRs = "" + set worstCaseCodecRs = "" + else if ( $numWords < $maxNumWordsLineNew ) then + set logFile = "" + set worstCaseEncRs = "" + set worstCaseDecRs = "" + set worstCaseCodecRs = "" + else + set logFile = $tmp[19] + set worstCaseEncRs = $tmp[13] + set worstCaseDecRs = $tmp[15] + set worstCaseCodecRs = $tmp[17] + endif + + + echo ' {' >> $file + echo ' fullDate: "'${fullDate}'",' >> $file + echo ' shortDate: "'${shortDate}'",' >> $file + echo ' revision: "'${revision}'",' >> $file + echo ' worstCaseEnc: "'${worstCaseEnc}'",' >> $file + echo ' worstCaseDec: "'${worstCaseDec}'",' >> $file + echo ' worstCaseCodec: "'${worstCaseCodec}'",'>> $file + echo ' worstCaseEncRs: "'${worstCaseEncRs}'",' >> $file + echo ' worstCaseDecRs: "'${worstCaseDecRs}'",' >> $file + echo ' worstCaseCodecRs: "'${worstCaseCodecRs}'",'>> $file + echo ' fixpointScalingFac: "'${fixpointScalingFac}'",'>> $file + echo ' logFile: "'${logFile}'"' >> $file + echo ' }'${separator} >> $file + +end +echo ' ],' >> $file + +# begin displays +echo ' displays: [' >> $file + +# 135 WMOPS boundary +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: false,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#000000",' >> $file +echo ' id: "requirement",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + set separator = "," + if ( $i == $nLines - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLineOld ) then + continue + endif + + echo ' ['"${i}, 135.00"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# 135 WMOPS boundary + +# worst case codec +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#0080FF",' >> $file +echo ' id: "worst case codec",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + set separator = "," + if ( $i == $nLines - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLineOld ) then + continue + endif + + set score = $tmp[10] + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# end worst case codec + +# worst case enc/dec +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#FF8000",' >> $file +echo ' id: "worst case enc/dec",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + set separator = "," + if ( $i == $nLines - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLineOld ) then + continue + endif + + set score = $tmp[4] + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# worst case enc/dec + +# worst case encoder +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#CF4B4B",' >> $file +echo ' id: "worst case enc",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + set separator = "," + if ( $i == $nLines - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLineOld ) then + continue + endif + + set score = $tmp[6] + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# end worst case encoder + +# worst case decoder +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#008040",' >> $file +echo ' id: "worst case dec",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + set separator = "," + if ( $i == $nLines - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLineOld ) then + continue + endif + + set score = $tmp[8] + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# end worst case decoder + +########### rateswitching ############### + +# worst case codec rateswitching +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#40C4FF",' >> $file +echo ' id: "worst case codec rs",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + set separator = "," + if ( $i == $nLines - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLineOld ) then + continue + endif + + if ( $numWords < $maxNumWordsLineNew ) then + set score = 0 + else + set score = $tmp[18] + endif + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# end worst case codec rateswitching + +# worst case enc/dec rateswitching +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#FFC480",' >> $file +echo ' id: "worst case enc/dec rs",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + set separator = "," + if ( $i == $nLines - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLineOld ) then + continue + endif + + if ( $numWords < $maxNumWordsLineNew ) then + set score = 0 + else + set score = $tmp[12] + endif + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# worst case enc/dec rateswitching + +# worst case encoder rateswitching +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#CF8080",' >> $file +echo ' id: "worst case enc rs",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + set separator = "," + if ( $i == $nLines - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLineOld ) then + continue + endif + + if ( $numWords < $maxNumWordsLineNew ) then + set score = 0 + else + set score = $tmp[14] + endif + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' },' >> $file +# end worst case encoder rateswitching + +# worst case decoder rateswitching +echo ' {' >> $file +echo ' lines: { show: true },' >> $file +echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: true,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#00F040",' >> $file +echo ' id: "worst case dec rs",' >> $file +echo ' data: [' >> $file + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + set separator = "," + if ( $i == $nLines - 1 ) then + set separator = "" + endif + + set tmp = ( $line ) + + set numWords = `echo $tmp | wc -w` + if ( $numWords < $maxNumWordsLineOld ) then + continue + endif + + if ( $numWords < $maxNumWordsLineNew ) then + set score = 0 + else + set score = $tmp[16] + endif + + echo ' ['"${i}, ${score}"']'${separator} >> $file + @ i++ + +end + +echo ' ]' >> $file +echo ' }' >> $file +# end worst case decoder rateswitching + +########### end rateswitching ############### + +echo ' ]' >> $file +# end displays + +echo ' }' >> $file +echo '};' >> $file + +mv -f $file $file_final +rm -f $tmpFile diff --git a/ci/complexity_measurements/genWebpageData_WmopPerOperatingpoint.csh b/ci/complexity_measurements/genWebpageData_WmopPerOperatingpoint.csh new file mode 100755 index 0000000000..21d4ab324a --- /dev/null +++ b/ci/complexity_measurements/genWebpageData_WmopPerOperatingpoint.csh @@ -0,0 +1,475 @@ +#!/bin/tcsh + +set srcFile = $1 +set file_final = $2 +set file = ${file_final}.new +set graphName = $3 + +set tmpBase = `basename $0` +set tmpFile = /tmp/${tmpBase}_$$ + +rm -f $file +touch $file + +set worstCaseCodec +set worstCaseEnc +set worstCaseDec +@ numEntries = 0; +@ offsetTicks = 0; + +echo "var $graphName = {" >> $file +echo ' wmops_worstcase_per_op: {' >> $file +echo ' description: "Worst Case WMOPS per OP",' >> $file +echo ' direction: -1,' >> $file +echo ' runs: [' >> $file + +# +# NB modes +# +if (0) then # don't use! +rm -f ${tmpFile} +cat ${srcFile} | grep "[0-9]" | sed -e "s/\ /_/g" | sed -e "s/;/\ /g" | grep "_NB_" > ${tmpFile} +set nLines = `cat ${tmpFile} | wc -l` +@ ticksNB = $offsetTicks + ( $nLines / 2 ) +@ offsetTicks += ($nLines + 1) + +foreach line ( "`cat ${tmpFile}`" ) + + set tmp = `echo $line` + + set operatingPoint = $tmp[1] + set worstCaseCodec = ( $worstCaseCodec $tmp[4] ) + set worstCaseEnc = ( $worstCaseEnc $tmp[2] ) + set worstCaseDec = ( $worstCaseDec $tmp[3] ) + @ numEntries++ + + echo ' {' >> $file + echo ' operatingPoint: "'${operatingPoint}'",' >> $file + echo ' mode: "NB"' >> $file + echo ' },' >> $file + +end + +set worstCaseCodec = ( $worstCaseCodec 0 ) +set worstCaseEnc = ( $worstCaseEnc 0 ) +set worstCaseDec = ( $worstCaseDec 0 ) +@ numEntries++ + +echo ' {' >> $file +echo ' operatingPoint: "",' >> $file +echo ' mode: ""' >> $file +echo ' },' >> $file + +# +# NB modes, rateswitching +# +rm -f ${tmpFile} +cat $srcFile | grep "[0-9]" | sed -e "s/\ /_/g" | sed -e "s/;/\ /g" | grep "_NB_RS" > ${tmpFile} +set nLines = `cat ${tmpFile} | wc -l` +@ ticksNB_RS = $offsetTicks + ( $nLines / 2 ) +@ offsetTicks += ($nLines + 1) + +foreach line ( "`cat ${tmpFile}`" ) + + set tmp = `echo $line` + + set operatingPoint = $tmp[1] + set worstCaseCodec = ( $worstCaseCodec $tmp[4] ) + set worstCaseEnc = ( $worstCaseEnc $tmp[2] ) + set worstCaseDec = ( $worstCaseDec $tmp[3] ) + @ numEntries++ + + echo ' {' >> $file + echo ' operatingPoint: "'${operatingPoint}'",' >> $file + echo ' mode: "NB RS"' >> $file + echo ' },' >> $file + +end + +set worstCaseCodec = ( $worstCaseCodec 0 ) +set worstCaseEnc = ( $worstCaseEnc 0 ) +set worstCaseDec = ( $worstCaseDec 0 ) +@ numEntries++ + +echo ' {' >> $file +echo ' operatingPoint: "",' >> $file +echo ' mode: ""' >> $file +echo ' },' >> $file + +# +# AMR-WB IO modes +# +rm -f ${tmpFile} +cat $srcFile | grep "[0-9]" | sed -e "s/\ /_/g" | sed -e "s/;/\ /g" | grep "_WB_" | grep "AMR" > ${tmpFile} +set nLines = `cat ${tmpFile} | wc -l` +@ ticksWBIO = $offsetTicks + ( $nLines / 2 ) +@ offsetTicks += ($nLines + 1) + +foreach line ( "`cat ${tmpFile}`" ) + + set tmp = `echo $line` + + set operatingPoint = $tmp[1] + set worstCaseCodec = ( $worstCaseCodec $tmp[4] ) + set worstCaseEnc = ( $worstCaseEnc $tmp[2] ) + set worstCaseDec = ( $worstCaseDec $tmp[3] ) + @ numEntries++ + + echo ' {' >> $file + echo ' operatingPoint: "'${operatingPoint}'",' >> $file + echo ' mode: "AMR-WB IO"' >> $file + echo ' },' >> $file + +end + +set worstCaseCodec = ( $worstCaseCodec 0 ) +set worstCaseEnc = ( $worstCaseEnc 0 ) +set worstCaseDec = ( $worstCaseDec 0 ) +@ numEntries++ + +echo ' {' >> $file +echo ' operatingPoint: "",' >> $file +echo ' mode: ""' >> $file +echo ' },' >> $file + +# +# AMR-WB IO modes rateswitching +# +rm -f ${tmpFile} +cat $srcFile | grep "[0-9]" | sed -e "s/\ /_/g" | sed -e "s/;/\ /g" | grep "_WB_RS" | grep "AMR" > ${tmpFile} +set nLines = `cat ${tmpFile} | wc -l` +@ ticksWBIO_RS = $offsetTicks + ( $nLines / 2 ) +@ offsetTicks += ($nLines + 1) + +foreach line ( "`cat ${tmpFile}`" ) + + set tmp = `echo $line` + + set operatingPoint = $tmp[1] + set worstCaseCodec = ( $worstCaseCodec $tmp[4] ) + set worstCaseEnc = ( $worstCaseEnc $tmp[2] ) + set worstCaseDec = ( $worstCaseDec $tmp[3] ) + @ numEntries++ + + echo ' {' >> $file + echo ' operatingPoint: "'${operatingPoint}'",' >> $file + echo ' mode: "AMR-WB IO RS"' >> $file + echo ' },' >> $file + +end + +set worstCaseCodec = ( $worstCaseCodec 0 ) +set worstCaseEnc = ( $worstCaseEnc 0 ) +set worstCaseDec = ( $worstCaseDec 0 ) +@ numEntries++ + +echo ' {' >> $file +echo ' operatingPoint: "",' >> $file +echo ' mode: ""' >> $file +echo ' },' >> $file +endif + +# +# WB modes +# +rm -f ${tmpFile} +cat $srcFile | grep "[0-9]" | sed -e "s/\ /_/g" | sed -e "s/;/\ /g" | grep "_WB_" > ${tmpFile} +set nLines = `cat ${tmpFile} | wc -l` +@ ticksWB = $offsetTicks + ( $nLines / 2 ) +@ offsetTicks += ($nLines + 1) + +foreach line ( "`cat ${tmpFile}`" ) + + set tmp = `echo $line` + + set operatingPoint = $tmp[1] + set worstCaseCodec = ( $worstCaseCodec $tmp[4] ) + set worstCaseEnc = ( $worstCaseEnc $tmp[2] ) + set worstCaseDec = ( $worstCaseDec $tmp[3] ) + @ numEntries++ + + echo ' {' >> $file + echo ' operatingPoint: "'${operatingPoint}'",' >> $file + echo ' mode: "WB"' >> $file + echo ' },' >> $file + +end + +set worstCaseCodec = ( $worstCaseCodec 0 ) +set worstCaseEnc = ( $worstCaseEnc 0 ) +set worstCaseDec = ( $worstCaseDec 0 ) +@ numEntries++ + +echo ' {' >> $file +echo ' operatingPoint: "",' >> $file +echo ' mode: ""' >> $file +echo ' },' >> $file + +# +# WB modes rateswitching +# +rm -f ${tmpFile} +cat $srcFile | grep "[0-9]" | sed -e "s/\ /_/g" | sed -e "s/;/\ /g" | grep "_WB_RS" > ${tmpFile} +set nLines = `cat ${tmpFile} | wc -l` +@ ticksWB_RS = $offsetTicks + ( $nLines / 2 ) +@ offsetTicks += ($nLines + 1) + +foreach line ( "`cat ${tmpFile}`" ) + + set tmp = `echo $line` + + set operatingPoint = $tmp[1] + set worstCaseCodec = ( $worstCaseCodec $tmp[4] ) + set worstCaseEnc = ( $worstCaseEnc $tmp[2] ) + set worstCaseDec = ( $worstCaseDec $tmp[3] ) + @ numEntries++ + + echo ' {' >> $file + echo ' operatingPoint: "'${operatingPoint}'",' >> $file + echo ' mode: "WB RS"' >> $file + echo ' },' >> $file + +end + +set worstCaseCodec = ( $worstCaseCodec 0 ) +set worstCaseEnc = ( $worstCaseEnc 0 ) +set worstCaseDec = ( $worstCaseDec 0 ) +@ numEntries++ + +echo ' {' >> $file +echo ' operatingPoint: "",' >> $file +echo ' mode: ""' >> $file +echo ' },' >> $file + +# +# SWB modes +# +rm -f ${tmpFile} +cat $srcFile | grep "[0-9]" | sed -e "s/\ /_/g" | sed -e "s/;/\ /g" | grep "_SWB_" > ${tmpFile} +set nLines = `cat ${tmpFile} | wc -l` +@ ticksSWB = $offsetTicks + ( $nLines / 2 ) +@ offsetTicks += ($nLines + 1) + +foreach line ( "`cat ${tmpFile}`" ) + + set tmp = `echo $line` + + set operatingPoint = $tmp[1] + set worstCaseCodec = ( $worstCaseCodec $tmp[4] ) + set worstCaseEnc = ( $worstCaseEnc $tmp[2] ) + set worstCaseDec = ( $worstCaseDec $tmp[3] ) + @ numEntries++ + + echo ' {' >> $file + echo ' operatingPoint: "'${operatingPoint}'",' >> $file + echo ' mode: "SWB"' >> $file + echo ' },' >> $file + +end + +set worstCaseCodec = ( $worstCaseCodec 0 ) +set worstCaseEnc = ( $worstCaseEnc 0 ) +set worstCaseDec = ( $worstCaseDec 0 ) +@ numEntries++ + +echo ' {' >> $file +echo ' operatingPoint: "",' >> $file +echo ' mode: ""' >> $file +echo ' },' >> $file + + +# +# SWB modes rateswitching +# +rm -f ${tmpFile} +cat $srcFile | grep "[0-9]" | sed -e "s/\ /_/g" | sed -e "s/;/\ /g" | grep "_SWB_RS" > ${tmpFile} +set nLines = `cat ${tmpFile} | wc -l` +@ ticksSWB_RS = $offsetTicks + ( $nLines / 2 ) +@ offsetTicks += ($nLines + 1) + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + + set tmp = `echo $line` + + set operatingPoint = $tmp[1] + set worstCaseCodec = ( $worstCaseCodec $tmp[4] ) + set worstCaseEnc = ( $worstCaseEnc $tmp[2] ) + set worstCaseDec = ( $worstCaseDec $tmp[3] ) + @ numEntries++ + + echo ' {' >> $file + echo ' operatingPoint: "'${operatingPoint}'",' >> $file + echo ' mode: "SWB RS"' >> $file + echo ' },' >> $file + +end + +# +# FB modes +# +rm -f ${tmpFile} +cat $srcFile | grep "[0-9]" | sed -e "s/\ /_/g" | sed -e "s/;/\ /g" | grep "_FB_" > ${tmpFile} +set nLines = `cat ${tmpFile} | wc -l` +@ ticksFB = $offsetTicks + ( $nLines / 2 ) +@ offsetTicks += ($nLines + 1) + +foreach line ( "`cat ${tmpFile}`" ) + + set tmp = `echo $line` + + set operatingPoint = $tmp[1] + set worstCaseCodec = ( $worstCaseCodec $tmp[4] ) + set worstCaseEnc = ( $worstCaseEnc $tmp[2] ) + set worstCaseDec = ( $worstCaseDec $tmp[3] ) + @ numEntries++ + + echo ' {' >> $file + echo ' operatingPoint: "'${operatingPoint}'",' >> $file + echo ' mode: "FB"' >> $file + echo ' },' >> $file + +end + +set worstCaseCodec = ( $worstCaseCodec 0 ) +set worstCaseEnc = ( $worstCaseEnc 0 ) +set worstCaseDec = ( $worstCaseDec 0 ) +@ numEntries++ + +echo ' {' >> $file +echo ' operatingPoint: "",' >> $file +echo ' mode: ""' >> $file +echo ' },' >> $file + + +# +# FB modes rateswitching +# +rm -f ${tmpFile} +cat $srcFile | grep "[0-9]" | sed -e "s/\ /_/g" | sed -e "s/;/\ /g" | grep "_FB_RS" > ${tmpFile} +set nLines = `cat ${tmpFile} | wc -l` +@ ticksFB_RS = $offsetTicks + ( $nLines / 2 ) +@ offsetTicks += ($nLines + 1) + +@ i = 0 +foreach line ( "`cat ${tmpFile}`" ) + @ i++ + set separator = "," + if ( $i == $nLines ) then + set separator = "" + endif + + set tmp = `echo $line` + + set operatingPoint = $tmp[1] + set worstCaseCodec = ( $worstCaseCodec $tmp[4] ) + set worstCaseEnc = ( $worstCaseEnc $tmp[2] ) + set worstCaseDec = ( $worstCaseDec $tmp[3] ) + @ numEntries++ + + echo ' {' >> $file + echo ' operatingPoint: "'${operatingPoint}'",' >> $file + echo ' mode: "SWB RS"' >> $file + echo ' }'${separator} >> $file + +end + +echo ' ],' >> $file + +# +# ticks +# +echo ' ticks: [' >> $file +if (0) then +echo ' ['$ticksNB', "NB"],' >> $file +echo ' ['$ticksNB_RS', "NB RS"],' >> $file +echo ' ['$ticksWBIO', "AMR-WB IO"],' >> $file +endif +echo ' ['$ticksWB', "WB"],' >> $file +echo ' ['$ticksWB_RS', "WB RS"],' >> $file +echo ' ['$ticksSWB', "SWB"],' >> $file +echo ' ['$ticksSWB_RS', "SWB RS"],' >> $file +echo ' ['$ticksFB', "FB"],' >> $file +echo ' ['$ticksFB_RS', "FB RS"]' >> $file +echo ' ],' >> $file + + +# begin displays +echo ' displays: [' >> $file + +# Start: Worse case encoder +echo ' {' >> $file +echo ' lines: { show: false },' >> $file +echo ' points: { show: false },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: false,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#CF4B4B",' >> $file +echo ' id: "worstCaseEnc",' >> $file +echo ' label: "Encoder",' >> $file +echo ' data: [' >> $file + +@ i = 0 +while($i < $numEntries) + + set separator = "," + if ( $i == $numEntries - 1 ) then + set separator = "" + endif + + @ j = $i + 1 + + echo ' ['"${i}, $worstCaseEnc[$j]"']'${separator} >> $file + + @ i++ +end + +echo ' ]' >> $file +echo ' },' >> $file +# End: Worst case encoder + +# Start: Worse case decoder +echo ' {' >> $file +echo ' lines: { show: false },' >> $file +echo ' points: { show: false },' >> $file +echo ' borderWidth: 1.5,' >> $file +echo ' borderColor: "#BEBEBE",' >> $file +echo ' markingsLineWidth: .75,' >> $file +echo ' hoverable: true,' >> $file +echo ' clickable: false,' >> $file +echo ' shadowSize: 0,' >> $file +echo ' color: "#008040",' >> $file +echo ' id: "worstCaseDec",' >> $file +echo ' label: "Decoder",' >> $file +echo ' data: [' >> $file + +@ i = 0 +while($i < $numEntries) + + set separator = "," + if ( $i == $numEntries - 1 ) then + set separator = "" + endif + + @ j = $i + 1 + + echo ' ['"${i}, $worstCaseDec[$j]"']'${separator} >> $file + + @ i++ +end + +echo ' ]' >> $file +echo ' }' >> $file +# End: Worst case encoder + +echo ' ]' >> $file +# end displays + +echo ' }' >> $file +echo '};' >> $file + +mv -f $file $file_final +rm -f $tmpFile diff --git a/ci/complexity_measurements/getWmops.sh b/ci/complexity_measurements/getWmops.sh new file mode 100755 index 0000000000..268d1eb59f --- /dev/null +++ b/ci/complexity_measurements/getWmops.sh @@ -0,0 +1,70 @@ +#! /bin/bash + +# get format from command line +if [ $# -ne 1 ]; then + echo "Usage: $0 ivas-format" + exit 1 +fi + +ivas_format=$1 + +date=`date +%Y%m%d` # used for log-file file ending +shortDate=`date "+%b %d" | sed -e "s/\ /_/g"` # stored in the log-file +fullDate=`date "+%c" | sed -e "s/\ /_/g"` # stored in the log-file + +commit_sha=`git rev-parse --short HEAD` + +destDir="." +scriptDir="scripts/complexity_measurements" +ep="${scriptDir}/ep_10pct_fer.g192" +numThreads=10 + +config_file="scripts/config/ci_linux.json" + +# get wmops newsletter +wmopsFilenameFlcLast=wmops_newsletter_stereo__${commit_sha}_${date} +wmopsFilenameFlc=${destDir}/wmops/logs/${wmopsFilenameFlcLast} +wmopsFilenameFlc48kHzLast=wmops_newsletter_stereo_48kHz__${commit_sha}_${date} +wmopsFilenameFlc48kHz=${destDir}/wmops/logs/${wmopsFilenameFlc48kHzLast} + +# instrument and build +./scripts/IvasBuildAndRunChecks.py -p $config_file --checks COMPLEXITY --create_complexity_tables ${wmopsFilenameFlc} -C $ivas_format -t ${numThreads} -f ${ep} +./scripts/IvasBuildAndRunChecks.py -p $config_file --checks COMPLEXITY --create_complexity_tables ${wmopsFilenameFlc48kHz} -C $ivas_format -R 48 -S 48 -t ${numThreads} -f ${ep} + +# now get the info on worst case operating point: WMOPS number, enc-operating mode, dec-operating mode +### WMOPS +${scriptDir}/parseNewsletterWmops.py ${wmopsFilenameFlc}_WMOPS.csv ${wmopsFilenameFlcLast}_WMOPS.csv ${commit_sha} ${shortDate} ${fullDate} >> ${destDir}/wmops/log_wmops_all.txt +${scriptDir}/parseNewsletterWmops.py ${wmopsFilenameFlc48kHz}_WMOPS.csv ${wmopsFilenameFlc48kHzLast}_WMOPS.csv ${commit_sha} ${shortDate} ${fullDate} >> ${destDir}/wmops/log_wmops_48kHz_all.txt + +# now update the webpage +tcsh ${scriptDir}/genWebpageData_WMOPS.csh ${destDir}/wmops/log_wmops_all.txt ${destDir}/wmops/graphs_wmops_flc.js Graphs_WMOPS +tcsh ${scriptDir}/genWebpageData_WMOPS.csh ${destDir}/wmops/log_wmops_48kHz_all.txt ${destDir}/wmops/graphs_wmops_flc_48kHz.js Graphs_WMOPS_48kHz + +# per mode graph +tcsh ${scriptDir}/genWebpageData_WmopPerOperatingpoint.csh ${wmopsFilenameFlc}_WMOPS.csv ${destDir}/wmops/graphs_wmops_flc_perOP.js Graphs_WMOPS_perOP +tcsh ${scriptDir}/genWebpageData_WmopPerOperatingpoint.csh ${wmopsFilenameFlc48kHz}_WMOPS.csv ${destDir}/wmops/graphs_wmops_flc_perOP_48kHz.js Graphs_WMOPS_perOP_48kHz + +# get memory info for webpage +### RAM +${scriptDir}/mergeNewsletterRam.py ${wmopsFilenameFlc48kHz}_SRAM.csv ${wmopsFilenameFlc48kHz}_DRAM.csv > ${wmopsFilenameFlc48kHz}_RAM.csv +${scriptDir}/parseNewsletterRam.py ${wmopsFilenameFlc48kHz}_SRAM.csv ${wmopsFilenameFlc48kHz}_DRAM.csv ${wmopsFilenameFlc48kHzLast}_RAM.csv ${commit_sha} ${shortDate} ${fullDate} >> ${destDir}/wmops/log_ram_all.txt + +# generate java script from database +tcsh ${scriptDir}/genWebpageData_Ram.csh ${destDir}/wmops/log_ram_all.txt ${destDir}/wmops/graphs_ram_flc.js Graphs_RAM + +### ROM +${scriptDir}/parseNewsletterRom.py ${wmopsFilenameFlc}_TABLES.csv ${wmopsFilenameFlcLast}_TABLES.csv ${commit_sha} ${shortDate} ${fullDate} >> ${destDir}/wmops/log_rom_all.txt + +# generate java script from database +tcsh ${scriptDir}/genWebpageData_Rom.csh ${destDir}/wmops/log_rom_all.txt ${destDir}/wmops/graphs_rom_flc.js Graphs_ROM + +# now go on with BASOP +promFilenameBasopLast="null" +promScoreBasop=0 + +### PROM +${scriptDir}/parseNewsletterProm.py ${wmopsFilenameFlc}_PROM.csv ${wmopsFilenameFlcLast}_PROM.csv ${commit_sha} ${shortDate} ${fullDate} ${promScoreBasop} ${promFilenameBasopLast} >> ${destDir}/wmops/log_prom_all.txt + +# generate java script from database +tcsh ${scriptDir}/genWebpageData_Prom.csh ${destDir}/wmops/log_prom_all.txt ${destDir}/wmops/graphs_prom_flc.js Graphs_PROM + diff --git a/ci/complexity_measurements/index_complexity.html b/ci/complexity_measurements/index_complexity.html new file mode 100755 index 0000000000..855d4758c8 --- /dev/null +++ b/ci/complexity_measurements/index_complexity.html @@ -0,0 +1,1649 @@ + + + + + + + + IVAS Stereo - Worst Case WMOPS/Memory Performance + + + + + + + + + + + + + + + + + + + + + + + + +
+

IVAS Stereo - Worst Case WMOPS Performance (Float, native SR)

+ +
+
+
+ +
+
    +
  • Complexity requirement: 135 WMOPS (approximately 3.1 x WMOPS complexity of AMR-WB estimated with ITU-T STL2009)
  • +
  • Worst case encoder + decoder performance: Encoder and decoder mode might be different.
  • +
  • Worst case encoder + decoder performance (rateswitching): Encoder and decoder mode might be different.
  • +
  • Worst case codec performance: Encoder and decoder modes are identical.
  • +
  • Worst case codec performance (rateswitching): Encoder and decoder modes are identical.
  • +
  • Worst case encoder performance
  • +
  • Worst case encoder performance (rateswitching)
  • +
  • Worst case decoder performance
  • +
  • Worst case decoder performance (rateswitching)
  • +
+
+ +
+ +

IVAS Stereo - Worst Case WMOPS Performance + per Operating Point (Float, native SR)

+ +
+
+
+ +
+
+
+ +
+ + +

IVAS Stereo - Worst Case WMOPS Performance (Float, 48 kHz)

+ +
+
+
+ +
+
    +
  • Complexity requirement: 135 WMOPS (approximately 3.1 x WMOPS complexity of AMR-WB estimated with ITU-T STL2009)
  • +
  • Worst case encoder + decoder performance: Encoder and decoder mode might be different.
  • +
  • Worst case encoder + decoder performance (rateswitching): Encoder and decoder mode might be different.
  • +
  • Worst case codec performance: Encoder and decoder modes are identical.
  • +
  • Worst case codec performance (rateswitching): Encoder and decoder modes are identical.
  • +
  • Worst case encoder performance
  • +
  • Worst case encoder performance (rateswitching)
  • +
  • Worst case decoder performance
  • +
  • Worst case decoder performance (rateswitching)
  • +
+
+ +
+ +

IVAS Stereo - Worst Case WMOPS Performance + per Operating Point (Float, 48 kHz)

+ +
+
+
+ +
+
+
+ +
+ + + + + +

IVAS Stereo - Worst Case RAM Demand (Float)

+ +
+
+
+ +
+
    +
  • RAM requirement: 200 kWord (≈ 31 x RAM of AMR-WB speech codec: 6.5 kWord)
  • +
  • Max. total RAM Codec: + Dynamic + Static RAM, 32 bit words, Encoder + Decoder
  • +
  • Max. total RAM + Encoder: Dynamic + Static RAM, 32 bit words, Encoder only
  • +
  • Max. total RAM + Decoder: Dynamic + Static RAM, 32 bit words, Decoder only
  • + +
  • Max. static RAM Codec: + Static RAM, 32 bit words, Encoder + Decoder
  • +
  • Max. static RAM + Encoder: Static RAM, 32 bit words,, Encoder only
  • +
  • Max. static RAM + Decoder: Static RAM, 32 bit words, Decoder only
  • + +
  • Max. dynamic RAM + Codec: Dynamic RAM, 32 bit words, Encoder + Decoder
  • +
  • Max. dynamic RAM + Encoder: Dynamic RAM, 32 bit words, Encoder only
  • +
  • Max. dynamic RAM + Decoder: Dynamic RAM, 32 bit words, Decoder only
  • +
+
+ +
+ + + +

IVAS Stereo - Worst Case ROM Demand (Float)

+ +
+
+
+ +
+
    +
  • ROM requirement: 200 kWord (≈ 20 x ROM of AMR-WB speech codec: 9.9 kWord)
  • +
  • Measured ROM table size, 32 + bit words (Float)
  • +
+
+ + + +

IVAS Stereo - Worst Case PROM Demand

+ +
+
+
+ +
+
    +
  • PROM requirement: 54260 Ops (10 x Program ROM of AMR-WB speech codec, estimated with ITU-T STL2009: 5426 Ops)
  • +
  • Measured PROM (Float, + trunk)
  • +
  • Measured PROM (BASOP, branch basop)
  • +
+
+ +
+ +

FAQ

+
+
Q:
What does "native SR" mean? What is the difference between the graphs titled "native SR" and "48 kHz"?
+
A:
The graphs titled "native SR" run encoder/decoder at the native input/output sampling-rate per operating point. This is 16 kHz for WB, 32 kHz for SWB etc. The graphs titled "48 kHz" use 48 kHz input/output sampling rate, independent of the supported bandwidth, which is set by using the "-max_band" commandline switch.
+
Q:
What is the meaning of these funny symbols in the navigation box, in the left upper corner of this page?
+
A:
+ 1) Traffic light , or : The traffic light symbols show, whether the last datapoint matches the requirement (green) or not (red). A yellow traffic light means that the requirement is matched, but the score is very close (within a 3% margin) to the requirement.
+ 2) Arrow , , : The arrow indicates the trend of the last datapoint, compared to the last but one. An upwards arrow means that the score got higher (i.e. worse), downwards arrow arrow means that the score got lower (i.e. better), and a rightwards arrow means that the score was kept constant (within a 1% margin). +
+
Q:
Which input files are used for audio-input? What error pattern is used?
+
A:
The input files can be found here. The error pattern is here. +
+ + +
+

Legal notice

+
+ This webpage uses jQuery and Flot.js libraries for which the following licenses apply: +
+
jQuery:
+
+ Copyright OpenJS Foundation and other contributors, https://openjsf.org/ + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +
+
Flot.js:
+
+ Copyright (c) 2007-2014 IOLA and Ole Laursen + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following + conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. +
+
+
+
+ + + + + diff --git a/ci/complexity_measurements/mergeNewsletterRam.py b/ci/complexity_measurements/mergeNewsletterRam.py new file mode 100755 index 0000000000..5dec63ffad --- /dev/null +++ b/ci/complexity_measurements/mergeNewsletterRam.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 +# coding: utf-8 +# /************************* IVAS control modules ****************************** +# +# (C) Copyright Fraunhofer IIS (2022) +# All Rights Reserved +# +# Initial author: mul +# contents/description: General utility functions for file and directory handling +# +# USAGE: +# +# This software and/or program is protected by copyright law and international +# treaties. Any reproduction or distribution of this software and/or program, +# or any portion of it, may result in severe civil and criminal penalties, and +# will be prosecuted to the maximum extent possible under law. +# +# ******************************************************************************/ + +import csv +import sys +import re + +newsletterFilename = "" +newsletterFilenameLast = "" +revision = "" +shortDate = "" +fullDate = "" + +if __name__ == "__main__": + newsletterFilenameSram = sys.argv[1] + newsletterFilenameDram = sys.argv[2] + +ram_table = {} + +with open(newsletterFilenameSram, "r") as csvfile: + SRAM = csv.reader(csvfile, delimiter=";") + for row in SRAM: + if row[0] == "conf": + continue + key = row[0] + lst = row[1:] + ram_table[key] = lst + +with open(newsletterFilenameDram, "r") as csvfile: + DRAM = csv.reader(csvfile, delimiter=";") + for row in DRAM: + if row[0] == "conf": + continue + key = row[0] + lst = row[1:] + ram_table[key] += lst + +# now we have the following format +# SRAM enc, SRAM dec, SRAM total, DRAM enc, DRAM dec, DRAM max(enc, dec) + +print("conf;sram enc;sram dec;sram total;dram enc;dram dec;dram max;total") + +for key in ram_table: + ram = ram_table[key] + total = int(ram[1]) + int(ram[2]) + int(ram[5]) + print( + key, + ";", + ram[0], + ";", + ram[1], + ";", + ram[2], + ";", + ram[3], + ";", + ram[4], + ";", + ram[5], + ";", + total, + sep="", + ) diff --git a/ci/complexity_measurements/parseNewsletterProm.py b/ci/complexity_measurements/parseNewsletterProm.py new file mode 100755 index 0000000000..8809b92e7b --- /dev/null +++ b/ci/complexity_measurements/parseNewsletterProm.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +# coding: utf-8 +# /************************* IVAS control modules ****************************** +# +# (C) Copyright Fraunhofer IIS (2022) +# All Rights Reserved +# +# Initial author: mul +# contents/description: General utility functions for file and directory handling +# +# USAGE: +# +# This software and/or program is protected by copyright law and international +# treaties. Any reproduction or distribution of this software and/or program, +# or any portion of it, may result in severe civil and criminal penalties, and +# will be prosecuted to the maximum extent possible under law. +# +# ******************************************************************************/ + +import csv +import sys +import re + +newsletterFilename = "" +newsletterFilenameLast = "" +revision = "" +shortDate = "" +fullDate = "" +maxPromOpsBasop = "" +logfileBasop = "" + +if __name__ == "__main__": + newsletterFilename = sys.argv[1] + newsletterFilenameLast = sys.argv[2] + revision = sys.argv[3] + shortDate = sys.argv[4] + fullDate = sys.argv[5] + maxPromOpsBasop = sys.argv[6] + logfileBasop = sys.argv[7] + +max_total = ["", 0] + +with open(newsletterFilename, "r") as csvfile: + prom = csv.reader(csvfile, delimiter=";") + for row in prom: + if row[0] == "conf": + continue + if int(row[4]) > max_total[1]: + max_total[0] = re.sub(" ", "_", row[0]) + max_total[1] = int(row[4]) + +print( + revision, + shortDate, + fullDate, + max_total[1], + newsletterFilenameLast, + maxPromOpsBasop, + logfileBasop, +) diff --git a/ci/complexity_measurements/parseNewsletterRam.py b/ci/complexity_measurements/parseNewsletterRam.py new file mode 100755 index 0000000000..43b34a8544 --- /dev/null +++ b/ci/complexity_measurements/parseNewsletterRam.py @@ -0,0 +1,143 @@ +#!/usr/bin/env python3 +# coding: utf-8 +# /************************* IVAS control modules ****************************** +# +# (C) Copyright Fraunhofer IIS (2022) +# All Rights Reserved +# +# Initial author: mul +# contents/description: General utility functions for file and directory handling +# +# USAGE: +# +# This software and/or program is protected by copyright law and international +# treaties. Any reproduction or distribution of this software and/or program, +# or any portion of it, may result in severe civil and criminal penalties, and +# will be prosecuted to the maximum extent possible under law. +# +# ******************************************************************************/ + +import csv +import sys +import re + +newsletterFilename = "" +newsletterFilenameLast = "" +revision = "" +shortDate = "" +fullDate = "" + +if __name__ == "__main__": + newsletterFilenameSram = sys.argv[1] + newsletterFilenameDram = sys.argv[2] + newsletterFilenameLast = sys.argv[3] + revision = sys.argv[4] + shortDate = sys.argv[5] + fullDate = sys.argv[6] + +max_total_enc = ["", 0] +max_total_dec = ["", 0] +max_total_encdec = ["", 0] + +max_dynamic_enc = ["", 0] +max_dynamic_dec = ["", 0] +max_dynamic_encdec = ["", 0] + +max_static_enc = ["", 0] +max_static_dec = ["", 0] +max_static_encdec = ["", 0] + +ram_table = {} + +with open(newsletterFilenameSram, "r") as csvfile: + SRAM = csv.reader(csvfile, delimiter=";") + for row in SRAM: + if row[0] == "conf": + continue + key = row[0] + lst = row[1:] + ram_table[key] = lst + +with open(newsletterFilenameDram, "r") as csvfile: + DRAM = csv.reader(csvfile, delimiter=";") + for row in DRAM: + if row[0] == "conf": + continue + key = row[0] + lst = row[1:] + ram_table[key] += lst + +# now we have the following format +# SRAM enc, SRAM dec, SRAM total, DRAM enc, DRAM dec, DRAM max(enc, dec) + +for key in ram_table: + ram = ram_table[key] + static_enc = int(ram[0]) + static_dec = int(ram[1]) + static_encdec = static_enc + static_dec + + dynamic_enc = int(ram[3]) + dynamic_dec = int(ram[4]) + dynamic_encdec = int(ram[5]) + + total_enc = static_enc + dynamic_enc + total_dec = static_dec + dynamic_dec + total_encdec = static_encdec + dynamic_encdec + + if static_enc > max_static_enc[1]: + max_static_enc[0] = re.sub(" ", "_", key) + max_static_enc[1] = static_enc + + if static_dec > max_static_dec[1]: + max_static_dec[0] = re.sub(" ", "_", key) + max_static_dec[1] = static_dec + + if static_encdec > max_static_encdec[1]: + max_static_encdec[0] = re.sub(" ", "_", key) + max_static_encdec[1] = static_encdec + + if dynamic_enc > max_dynamic_enc[1]: + max_dynamic_enc[0] = re.sub(" ", "_", key) + max_dynamic_enc[1] = dynamic_enc + + if dynamic_dec > max_dynamic_dec[1]: + max_dynamic_dec[0] = re.sub(" ", "_", key) + max_dynamic_dec[1] = dynamic_dec + + if dynamic_encdec > max_dynamic_encdec[1]: + max_dynamic_encdec[0] = re.sub(" ", "_", key) + max_dynamic_encdec[1] = dynamic_encdec + + if total_enc > max_total_enc[1]: + max_total_enc[0] = re.sub(" ", "_", key) + max_total_enc[1] = total_enc + + if total_dec > max_static_dec[1]: + max_total_dec[0] = re.sub(" ", "_", key) + max_total_dec[1] = total_dec + + if total_encdec > max_static_encdec[1]: + max_total_encdec[0] = re.sub(" ", "_", key) + max_total_encdec[1] = total_encdec + +print( + revision, + shortDate, + fullDate, + max_total_encdec[1], + max_total_enc[0], + max_total_enc[1], + max_total_dec[0], + max_total_dec[1], + max_dynamic_encdec[1], + max_dynamic_encdec[0], + max_dynamic_enc[1], + max_dynamic_dec[0], + max_dynamic_dec[1], + max_static_enc[1] + max_static_dec[1], + max_static_enc[0], + max_static_enc[1], + max_static_dec[0], + max_static_dec[1], + newsletterFilenameLast, +) diff --git a/ci/complexity_measurements/parseNewsletterRom.py b/ci/complexity_measurements/parseNewsletterRom.py new file mode 100755 index 0000000000..9350b8fac6 --- /dev/null +++ b/ci/complexity_measurements/parseNewsletterRom.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 +# coding: utf-8 +# /************************* IVAS control modules ****************************** +# +# (C) Copyright Fraunhofer IIS (2022) +# All Rights Reserved +# +# Initial author: mul +# contents/description: General utility functions for file and directory handling +# +# USAGE: +# +# This software and/or program is protected by copyright law and international +# treaties. Any reproduction or distribution of this software and/or program, +# or any portion of it, may result in severe civil and criminal penalties, and +# will be prosecuted to the maximum extent possible under law. +# +# ******************************************************************************/ + +import csv +import sys +import re + +newsletterFilename = "" +newsletterFilenameLast = "" +revision = "" +shortDate = "" +fullDate = "" + +if __name__ == "__main__": + newsletterFilename = sys.argv[1] + newsletterFilenameLast = sys.argv[2] + revision = sys.argv[3] + shortDate = sys.argv[4] + fullDate = sys.argv[5] + +max_total = ["", 0] + +with open(newsletterFilename, "r") as csvfile: + rom = csv.reader(csvfile, delimiter=";") + for row in rom: + if row[0] == "conf": + continue + if int(row[4]) > max_total[1]: + max_total[0] = re.sub(" ", "_", row[0]) + max_total[1] = int(row[4]) + +print(revision, shortDate, fullDate, max_total[1], newsletterFilenameLast) diff --git a/ci/complexity_measurements/parseNewsletterWmops.py b/ci/complexity_measurements/parseNewsletterWmops.py new file mode 100755 index 0000000000..14ab3b3ef9 --- /dev/null +++ b/ci/complexity_measurements/parseNewsletterWmops.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 +# coding: utf-8 +# /************************* IVAS control modules ****************************** +# +# (C) Copyright Fraunhofer IIS (2022) +# All Rights Reserved +# +# Initial author: mul +# contents/description: General utility functions for file and directory handling +# +# USAGE: +# +# This software and/or program is protected by copyright law and international +# treaties. Any reproduction or distribution of this software and/or program, +# or any portion of it, may result in severe civil and criminal penalties, and +# will be prosecuted to the maximum extent possible under law. +# +# ******************************************************************************/ + +import csv +import sys +import re + +newsletterFilename = "" +newsletterFilenameLast = "" +revision = "" +shortDate = "" +fullDate = "" + +if __name__ == "__main__": + newsletterFilename = sys.argv[1] + newsletterFilenameLast = sys.argv[2] + revision = sys.argv[3] + shortDate = sys.argv[4] + fullDate = sys.argv[5] + +max_enc = ["", 0] +max_dec = ["", 0] +max_total = ["", 0] +fixedpointScalingFac = 1.0 + +with open(newsletterFilename, "r") as csvfile: + wmops = csv.reader(csvfile, delimiter=";") + for row in wmops: + if row[0] == "conf": + continue + if float(row[1]) > max_enc[1]: + max_enc[0] = re.sub(" ", "_", row[0]) + max_enc[1] = float(row[1]) + if float(row[2]) > max_dec[1]: + max_dec[0] = re.sub(" ", "_", row[0]) + max_dec[1] = float(row[2]) + if float(row[3]) > max_total[1]: + max_total[0] = re.sub(" ", "_", row[0]) + max_total[1] = float(row[3]) + +print( + revision, + shortDate, + fullDate, + max_enc[1] + max_dec[1], + max_enc[0], + max_enc[1], + max_dec[0], + max_dec[1], + max_total[0], + max_total[1], + fixedpointScalingFac, + max_enc[1] + max_dec[1], + max_enc[0], + max_enc[1], + max_dec[0], + max_dec[1], + max_total[0], + max_total[1], + newsletterFilenameLast, +) diff --git a/ci/complexity_measurements/style.css b/ci/complexity_measurements/style.css new file mode 100755 index 0000000000..44fb55de46 --- /dev/null +++ b/ci/complexity_measurements/style.css @@ -0,0 +1,220 @@ +body { + background-color:#FFF; + font:.6875em Verdana, Arial, Helvetica, sans-serif; + color:#000; +} +a { + color:#000; + text-decoration:underline; +} +a:hover { + text-decoration:none; +} +h1 { + font-size:2.265em; + font-weight:700; + text-align: center; +} +em { + font-style: normal; + font-weight: bold; +} +hr { + margin-top: 30px; + margin-bottom: 30px; + margin-left: 150px; + margin-right:150px; + height: 0px; + border-top-width: 2px; + border-bottom-width: 0px; + border-left-width: 0px; + border-right-width: 0px; + border-top-style: solid; + color: #606060; +} +.graph { + width: 800px; + height: 350px; +} +.graph-container { + margin: 0 auto; + width:800px; +} +.message-box { + margin-top: 2em; + padding: 1em; + background-color: #FF8000; + border-radius: 20px; +} +#wmops-graph { + height:500px; + width:800px; + float:left; +} +#wmops_per_op-graph { + height:500px; + width:800px; + float:left; +} +#wmops-48kHz-graph { + height:500px; + width:800px; + float:left; +} +#wmops_per_op-48kHz-graph { + height:500px; + width:800px; + float:left; +} +#wmops_basop_per_op-graph { + height:500px; + width:800px; + float:left; +} +#wmops-graph-basop { + height:500px; + width:800px; + float:left; +} +#conversion_factors_basop_flc { + height:500px; + width:800px; + float:left; +} +#ram-graph { + height:500px; + width:800px; + float:left; +} +#ram-graph-basop { + height:500px; + width:800px; + float:left; +} +#rom-graph { + height:500px; + width:800px; + float:left; +} +#rom-graph-basop{ + height:500px; + width:800px; + float:left; +} +#prom-graph { + height:500px; + width:800px; + float:left; +} +#tooltip { + border-radius:.35em; + border-radius:.35em; + background-color:#000; + color:#FFF; + display:none; + opacity:0.8; + padding:.25em; + position:absolute; + box-shadow: 6px 6px 6px #666; +} +#tooltip a:link, #tooltip a:active, #tooltip a:visited { + color:#FFF; + text-decoration: underline; +} +#tooltip a:hover { + color:#FFF; + text-decoration: none; +} +.legend { + display: inline; +} +.legend li { + border-left: 1.2em solid #FFF; + margin-right: 2em; + padding-left: .3em; + margin-bottom: .2em; + list-style-type: none; +} + +#menu { + color: #FFFFFF; +} + +#menu ul { + color: #FFFFFF; + list-style: none; + margin-left: -1em; + position: relative; + margin-top: 1.5em; + margin-bottom: 1.5em; +} + +#menu li { + margin-left: -1em; + margin-bottom: 1.0em; + margin-top: 1.0em; +} + +#menu a { + color: #FFFFFF; +} + +dt { + font-weight: bold; +} + +dd hr { + margin-top: 0.1em; + margin-bottom: 0.1em; + margin-left: 48%; + margin-right: 48%; +} + +#menu { + float: left; + margin-left: 1em; + margin-top: 1em; + width: 22em; + border-radius: 1em; + position: fixed; + background-color: #000000; + opacity: 0.8; + box-shadow: 6px 6px 6px #666; +} + +#content { + margin-left: 17em; +} + +.symbols { + float: right; + font-weight: bolder; + font-size: 2em; + margin-top: -0.4em; +} + +.trafficlight { + margin-right: 0px; + margin-left: 0px; + position: absolute; + right: 2em; + color: #202020; +} + +.trend { + margin-right: 0.5em; + margin-left: 0.2em; +} + +th, td { + padding: 0.5em 2em; + border: 1px solid #606060; +} + +th { + text-align: left; +} + +td#number { + text-align: right; +} -- GitLab From aca6a3d35003a1df16750438cc2b88e72baa290d Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 4 Nov 2022 12:15:42 +0100 Subject: [PATCH 02/42] add test jobs to ci file and use correct config file --- .gitlab-ci.yml | 64 ++++++++++++++++++++++++++ ci/complexity_measurements/getWmops.sh | 2 +- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d639c71ceb..3a68716977 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -20,6 +20,7 @@ workflow: - if: $CI_PIPELINE_SOURCE == 'merge_request_event' # Runs for merge requests - if: $CI_PIPELINE_SOURCE == 'push' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Pushes to main - if: $CI_PIPELINE_SOURCE == 'schedule' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Scheduled in main + - if: $CI_PIPELINE_SOURCE == 'web' # for testing stages: - maintenance @@ -724,6 +725,69 @@ coverage-test-on-main-scheduled: - coverage.info - coverage + +# --------------------------------------------------------------- +# Complexity measurement jobs +# --------------------------------------------------------------- + +.complexity-measurements-setup: &complexity-measurements-setup + # create necessary environment + - mkdir -p wmops/logs + + # get latest artifacts with previously generated javascript files + - api_url=$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/artifacts/$CI_COMMIT_REF_NAME/download?job=$CI_JOB_NAME + - 'curl --output artifacts.zip --header "JOB-TOKEN: $CI_JOB_TOKEN" "$api_url"' + - unzip artifacts.zip || true # this may fail on first run, when there are no artifacts there and the zip file is actually just "404"-html + - ls + - public_dir="$CI_JOB_NAME-public" + - mv $public_dir/* wmops/ + - ls wmops + - rm artifacts.zip + - rm -rf $public_dir + +.complexity-measurements-prepare-artifacts: &complexity-measurements-prepare-artifacts + # prepare artifacts -> move to public directory + - public_dir="$CI_JOB_NAME-public" + - mkdir $public_dir + - mv -f wmops/log_*_all.txt wmops/*.js ${public_dir}/ + - cp ci/complexity_measurements/index_complexity.html ${public_dir}/index.html + # do separately here to avoid overwrite complaints by mv + - mv -f ci/complexity_measurements/style.css ${public_dir}/ + +.measure-complexity-template: + extends: + - .test-job-linux-needs-testv-dir + rules: + - if: $MEASURE_COMPLEXITY_LINUX + tags: + - test-complexity-measurement + stage: test + artifacts: + name: "$CI_JOB_NAME--$CI_COMMIT_REF_NAME--sha-$CI_COMMIT_SHA" + paths: + - $CI_JOB_NAME-public + +measure-complexity-linux-stereo-test: + extends: + - .measure-complexity-template + script: + - *print-common-info + - *update-ltv-repo + - *complexity-measurements-setup + - bash ci/complexity_measurements/getWmops.sh stereo + - *complexity-measurements-prepare-artifacts + +measure-complexity-linux-ism-test: + extends: + - .measure-complexity-template + script: + - *print-common-info + - *update-ltv-repo + - *complexity-measurements-setup + - bash ci/complexity_measurements/getWmops.sh ISM1 #"ISM1 ISM2 ISM3 ISM4" + - *complexity-measurements-prepare-artifacts + + # --------------------------------------------------------------- # Other jobs # --------------------------------------------------------------- diff --git a/ci/complexity_measurements/getWmops.sh b/ci/complexity_measurements/getWmops.sh index 268d1eb59f..a4b963a8a7 100755 --- a/ci/complexity_measurements/getWmops.sh +++ b/ci/complexity_measurements/getWmops.sh @@ -19,7 +19,7 @@ scriptDir="scripts/complexity_measurements" ep="${scriptDir}/ep_10pct_fer.g192" numThreads=10 -config_file="scripts/config/ci_linux.json" +config_file="scripts/config/ci_linux_ltv.json" # get wmops newsletter wmopsFilenameFlcLast=wmops_newsletter_stereo__${commit_sha}_${date} -- GitLab From 0225946165e5b02f607fc66f934fda7b292a9cb2 Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 4 Nov 2022 14:08:51 +0100 Subject: [PATCH 03/42] fix first run of complexity jobs --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3a68716977..11dccd6404 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -740,7 +740,8 @@ coverage-test-on-main-scheduled: - unzip artifacts.zip || true # this may fail on first run, when there are no artifacts there and the zip file is actually just "404"-html - ls - public_dir="$CI_JOB_NAME-public" - - mv $public_dir/* wmops/ + # if is needed to catch case when no artifact is there (first run), similarly as above + - if [[ -d $public_dir ]]; then mv $public_dir/* wmops/; else mkdir wmops; fi - ls wmops - rm artifacts.zip - rm -rf $public_dir -- GitLab From e9ac6a07d2a1ecf2c17f7d92bac0a8e56dea1af8 Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 4 Nov 2022 14:11:52 +0100 Subject: [PATCH 04/42] remove mkdir, directory already exists... --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 11dccd6404..376f1f43a5 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -741,7 +741,7 @@ coverage-test-on-main-scheduled: - ls - public_dir="$CI_JOB_NAME-public" # if is needed to catch case when no artifact is there (first run), similarly as above - - if [[ -d $public_dir ]]; then mv $public_dir/* wmops/; else mkdir wmops; fi + - if [[ -d $public_dir ]]; then mv $public_dir/* wmops/; fi - ls wmops - rm artifacts.zip - rm -rf $public_dir -- GitLab From 2ec0692dd114e68f387410d4fe026722f92767a6 Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 4 Nov 2022 14:16:48 +0100 Subject: [PATCH 05/42] fix path to scripts and resoruces --- ci/complexity_measurements/getWmops.sh | 2 +- ci/complexity_measurements/index_complexity.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/complexity_measurements/getWmops.sh b/ci/complexity_measurements/getWmops.sh index a4b963a8a7..6f776a4d6c 100755 --- a/ci/complexity_measurements/getWmops.sh +++ b/ci/complexity_measurements/getWmops.sh @@ -15,7 +15,7 @@ fullDate=`date "+%c" | sed -e "s/\ /_/g"` # stored in the log-file commit_sha=`git rev-parse --short HEAD` destDir="." -scriptDir="scripts/complexity_measurements" +scriptDir="ci/complexity_measurements" ep="${scriptDir}/ep_10pct_fer.g192" numThreads=10 diff --git a/ci/complexity_measurements/index_complexity.html b/ci/complexity_measurements/index_complexity.html index 855d4758c8..bfba7d02ce 100755 --- a/ci/complexity_measurements/index_complexity.html +++ b/ci/complexity_measurements/index_complexity.html @@ -357,7 +357,7 @@ 2) Arrow , , : The arrow indicates the trend of the last datapoint, compared to the last but one. An upwards arrow means that the score got higher (i.e. worse), downwards arrow arrow means that the score got lower (i.e. better), and a rightwards arrow means that the score was kept constant (within a 1% margin).
Q:
Which input files are used for audio-input? What error pattern is used?
-
A:
The input files can be found here. The error pattern is here. +
A:
The input files can be found here. The error pattern is here. -- GitLab From 0e33c373c648a029edfc36be5a911f14c32fbf94 Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 4 Nov 2022 16:18:36 +0100 Subject: [PATCH 06/42] remove thread limitation and add 10s duration for faster testing --- ci/complexity_measurements/getWmops.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ci/complexity_measurements/getWmops.sh b/ci/complexity_measurements/getWmops.sh index 6f776a4d6c..e640c005f1 100755 --- a/ci/complexity_measurements/getWmops.sh +++ b/ci/complexity_measurements/getWmops.sh @@ -17,7 +17,7 @@ commit_sha=`git rev-parse --short HEAD` destDir="." scriptDir="ci/complexity_measurements" ep="${scriptDir}/ep_10pct_fer.g192" -numThreads=10 +duration="10" config_file="scripts/config/ci_linux_ltv.json" @@ -28,8 +28,8 @@ wmopsFilenameFlc48kHzLast=wmops_newsletter_stereo_48kHz__${commit_sha}_${date} wmopsFilenameFlc48kHz=${destDir}/wmops/logs/${wmopsFilenameFlc48kHzLast} # instrument and build -./scripts/IvasBuildAndRunChecks.py -p $config_file --checks COMPLEXITY --create_complexity_tables ${wmopsFilenameFlc} -C $ivas_format -t ${numThreads} -f ${ep} -./scripts/IvasBuildAndRunChecks.py -p $config_file --checks COMPLEXITY --create_complexity_tables ${wmopsFilenameFlc48kHz} -C $ivas_format -R 48 -S 48 -t ${numThreads} -f ${ep} +./scripts/IvasBuildAndRunChecks.py -p $config_file --checks COMPLEXITY --create_complexity_tables ${wmopsFilenameFlc} -C $ivas_format -U $duration -f ${ep} +./scripts/IvasBuildAndRunChecks.py -p $config_file --checks COMPLEXITY --create_complexity_tables ${wmopsFilenameFlc48kHz} -C $ivas_format -R 48 -S 48 -U $duration -f ${ep} # now get the info on worst case operating point: WMOPS number, enc-operating mode, dec-operating mode ### WMOPS -- GitLab From 1b8aff057c929cf5995780b7c42680c9da660e9b Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 4 Nov 2022 16:44:41 +0100 Subject: [PATCH 07/42] add debugging output --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 376f1f43a5..458c7bfe62 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -736,7 +736,9 @@ coverage-test-on-main-scheduled: # get latest artifacts with previously generated javascript files - api_url=$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/artifacts/$CI_COMMIT_REF_NAME/download?job=$CI_JOB_NAME + - echo $api_url - 'curl --output artifacts.zip --header "JOB-TOKEN: $CI_JOB_TOKEN" "$api_url"' + - cat artifacts.zip - unzip artifacts.zip || true # this may fail on first run, when there are no artifacts there and the zip file is actually just "404"-html - ls - public_dir="$CI_JOB_NAME-public" -- GitLab From e4a6a4709154688c210f02d98752529b3c57b7c5 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 7 Nov 2022 16:49:42 +0100 Subject: [PATCH 08/42] get last job run id to get the latest artifacts --- .gitlab-ci.yml | 7 +++-- ci/get_id_of_last_job_occurence.py | 41 ++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 4 deletions(-) create mode 100755 ci/get_id_of_last_job_occurence.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 458c7bfe62..1b36605848 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -734,10 +734,9 @@ coverage-test-on-main-scheduled: # create necessary environment - mkdir -p wmops/logs - # get latest artifacts with previously generated javascript files - - api_url=$CI_API_V4_URL/projects/$CI_PROJECT_ID/jobs/artifacts/$CI_COMMIT_REF_NAME/download?job=$CI_JOB_NAME - - echo $api_url - - 'curl --output artifacts.zip --header "JOB-TOKEN: $CI_JOB_TOKEN" "$api_url"' + - job_id=$(python3 ci/get_id_of_last_job_occurence.py $CI_COMMIT_REF_NAME $CI_JOB_NAME) + - echo $job_id + - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts.zip - cat artifacts.zip - unzip artifacts.zip || true # this may fail on first run, when there are no artifacts there and the zip file is actually just "404"-html - ls diff --git a/ci/get_id_of_last_job_occurence.py b/ci/get_id_of_last_job_occurence.py new file mode 100755 index 0000000000..4ddbe56032 --- /dev/null +++ b/ci/get_id_of_last_job_occurence.py @@ -0,0 +1,41 @@ +import argparse +import requests + +PER_PAGE_SUFFIX = "?per_page=50" +API_BASE_URL = "https://forge.3gpp.org/rep/api/v4/projects/49" + + +parser = argparse.ArgumentParser() +parser.add_argument("branch_name") +parser.add_argument("job_name") + +args = parser.parse_args() + +branch_name = args.branch_name +job_name = args.job_name + + +job_id = -1 +# check last 500 pipelines max +for page in range(100): + url_pls = API_BASE_URL + "/pipelines" + resp_pls = requests.get(url_pls + PER_PAGE_SUFFIX) + for pl in resp_pls.json(): + if pl["ref"] == branch_name: + url_jobs = url_pls + f"/{pl['id']}/jobs" + resp_jobs = requests.get(url_jobs + PER_PAGE_SUFFIX) + + if job_name not in resp_jobs.text: + continue + + # find actual job by name + for job in resp_jobs.json(): + if job["name"] == job_name: + job_id = job["id"] + break + break + + if job_id >= 0: + break + +print(job_id) -- GitLab From 710fb25b4165617426285b6545fd3c850d85fb13 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 7 Nov 2022 16:59:31 +0100 Subject: [PATCH 09/42] find last succesful (!) job --- ci/get_id_of_last_job_occurence.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ci/get_id_of_last_job_occurence.py b/ci/get_id_of_last_job_occurence.py index 4ddbe56032..8015db1bdf 100755 --- a/ci/get_id_of_last_job_occurence.py +++ b/ci/get_id_of_last_job_occurence.py @@ -30,10 +30,11 @@ for page in range(100): # find actual job by name for job in resp_jobs.json(): - if job["name"] == job_name: + if job["name"] == job_name and job["status"] == "success": job_id = job["id"] break - break + if job_id >= 0 + break if job_id >= 0: break -- GitLab From 1048a4c808253945489d7d271969b24e52862573 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 7 Nov 2022 17:02:47 +0100 Subject: [PATCH 10/42] fix typo --- ci/get_id_of_last_job_occurence.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/get_id_of_last_job_occurence.py b/ci/get_id_of_last_job_occurence.py index 8015db1bdf..461eeb2b56 100755 --- a/ci/get_id_of_last_job_occurence.py +++ b/ci/get_id_of_last_job_occurence.py @@ -33,7 +33,7 @@ for page in range(100): if job["name"] == job_name and job["status"] == "success": job_id = job["id"] break - if job_id >= 0 + if job_id >= 0: break if job_id >= 0: -- GitLab From 53def30f4ed3bfd92a58f10b95892bb3e6efb837 Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 8 Nov 2022 09:35:58 +0100 Subject: [PATCH 11/42] add copyright headers --- ci/build_all_linux.sh | 28 +++++++++++ ci/build_codec_instrumented_linux.sh | 28 +++++++++++ ci/build_codec_sanitizers_linux.sh | 28 +++++++++++ ci/check_for_warnings.py | 29 ++++++++++++ .../genWebpageData_Prom.csh | 28 +++++++++++ .../genWebpageData_Ram.csh | 28 +++++++++++ .../genWebpageData_Rom.csh | 28 +++++++++++ .../genWebpageData_WMOPS.csh | 28 +++++++++++ .../genWebpageData_WmopPerOperatingpoint.csh | 28 +++++++++++ ci/complexity_measurements/getWmops.sh | 28 +++++++++++ .../index_complexity.html | 31 +++++++++++++ .../mergeNewsletterRam.py | 43 ++++++++++------- .../parseNewsletterProm.py | 45 +++++++++++------- .../parseNewsletterRam.py | 45 +++++++++++------- .../parseNewsletterRom.py | 46 ++++++++++++------- .../parseNewsletterWmops.py | 45 +++++++++++------- ci/get_id_of_last_job_occurence.py | 32 +++++++++++++ ci/run_evs_be_test.py | 29 ++++++++++++ ci/run_scheduled_sanitizer_test.py | 29 ++++++++++++ ci/smoke_test.sh | 28 +++++++++++ 20 files changed, 574 insertions(+), 80 deletions(-) diff --git a/ci/build_all_linux.sh b/ci/build_all_linux.sh index 65ea1461fa..c57c9fc941 100755 --- a/ci/build_all_linux.sh +++ b/ci/build_all_linux.sh @@ -1,5 +1,33 @@ #! /usr/bin/bash +# (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository. All Rights Reserved. + +# This software is protected by copyright law and by international treaties. +# The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository retain full ownership rights in their respective contributions in +# the software. This notice grants no license of any kind, including but not limited to patent +# license, nor is any license granted by implication, estoppel or otherwise. + +# Contributors are required to enter into the IVAS codec Public Collaboration agreement before making +# contributions. + +# This software is provided "AS IS", without any express or implied warranties. The software is in the +# development stage. It is intended exclusively for experts who have experience with such software and +# solely for the purpose of inspection. All implied warranties of non-infringement, merchantability +# and fitness for a particular purpose are hereby disclaimed and excluded. + +# Any dispute, controversy or claim arising under or in relation to providing this software shall be +# submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in +# accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and +# the United Nations Convention on Contracts on the International Sales of Goods. + if [ ! -d "lib_com" ]; then echo "not in root directory! - please run in IVAS root" exit 1 diff --git a/ci/build_codec_instrumented_linux.sh b/ci/build_codec_instrumented_linux.sh index e98547c5fa..9f875f28fb 100755 --- a/ci/build_codec_instrumented_linux.sh +++ b/ci/build_codec_instrumented_linux.sh @@ -1,5 +1,33 @@ #! /usr/bin/bash +# (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository. All Rights Reserved. + +# This software is protected by copyright law and by international treaties. +# The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository retain full ownership rights in their respective contributions in +# the software. This notice grants no license of any kind, including but not limited to patent +# license, nor is any license granted by implication, estoppel or otherwise. + +# Contributors are required to enter into the IVAS codec Public Collaboration agreement before making +# contributions. + +# This software is provided "AS IS", without any express or implied warranties. The software is in the +# development stage. It is intended exclusively for experts who have experience with such software and +# solely for the purpose of inspection. All implied warranties of non-infringement, merchantability +# and fitness for a particular purpose are hereby disclaimed and excluded. + +# Any dispute, controversy or claim arising under or in relation to providing this software shall be +# submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in +# accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and +# the United Nations Convention on Contracts on the International Sales of Goods. + if [ ! -d "lib_com" ]; then echo "not in root directory! - please run in IVAS root" exit 1 diff --git a/ci/build_codec_sanitizers_linux.sh b/ci/build_codec_sanitizers_linux.sh index 65c520d25a..d5891e43ad 100755 --- a/ci/build_codec_sanitizers_linux.sh +++ b/ci/build_codec_sanitizers_linux.sh @@ -1,5 +1,33 @@ #! /usr/bin/bash +# (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository. All Rights Reserved. + +# This software is protected by copyright law and by international treaties. +# The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository retain full ownership rights in their respective contributions in +# the software. This notice grants no license of any kind, including but not limited to patent +# license, nor is any license granted by implication, estoppel or otherwise. + +# Contributors are required to enter into the IVAS codec Public Collaboration agreement before making +# contributions. + +# This software is provided "AS IS", without any express or implied warranties. The software is in the +# development stage. It is intended exclusively for experts who have experience with such software and +# solely for the purpose of inspection. All implied warranties of non-infringement, merchantability +# and fitness for a particular purpose are hereby disclaimed and excluded. + +# Any dispute, controversy or claim arising under or in relation to providing this software shall be +# submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in +# accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and +# the United Nations Convention on Contracts on the International Sales of Goods. + if [ ! -d "lib_com" ]; then echo "not in root directory! - please run in IVAS root" exit 1 diff --git a/ci/check_for_warnings.py b/ci/check_for_warnings.py index cc658b3d40..76a0bc917a 100755 --- a/ci/check_for_warnings.py +++ b/ci/check_for_warnings.py @@ -1,4 +1,33 @@ #!/usr/bin/env python3 +""" + (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. +""" import argparse import sys diff --git a/ci/complexity_measurements/genWebpageData_Prom.csh b/ci/complexity_measurements/genWebpageData_Prom.csh index bd9f40efab..d605abb1af 100755 --- a/ci/complexity_measurements/genWebpageData_Prom.csh +++ b/ci/complexity_measurements/genWebpageData_Prom.csh @@ -1,5 +1,33 @@ #!/bin/tcsh +# (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository. All Rights Reserved. + +# This software is protected by copyright law and by international treaties. +# The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository retain full ownership rights in their respective contributions in +# the software. This notice grants no license of any kind, including but not limited to patent +# license, nor is any license granted by implication, estoppel or otherwise. + +# Contributors are required to enter into the IVAS codec Public Collaboration agreement before making +# contributions. + +# This software is provided "AS IS", without any express or implied warranties. The software is in the +# development stage. It is intended exclusively for experts who have experience with such software and +# solely for the purpose of inspection. All implied warranties of non-infringement, merchantability +# and fitness for a particular purpose are hereby disclaimed and excluded. + +# Any dispute, controversy or claim arising under or in relation to providing this software shall be +# submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in +# accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and +# the United Nations Convention on Contracts on the International Sales of Goods. + set maxValues = 40 if (${#argv} != 3) then diff --git a/ci/complexity_measurements/genWebpageData_Ram.csh b/ci/complexity_measurements/genWebpageData_Ram.csh index dfa6d13ca5..19fac84e0a 100755 --- a/ci/complexity_measurements/genWebpageData_Ram.csh +++ b/ci/complexity_measurements/genWebpageData_Ram.csh @@ -1,5 +1,33 @@ #!/bin/tcsh +# (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository. All Rights Reserved. + +# This software is protected by copyright law and by international treaties. +# The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository retain full ownership rights in their respective contributions in +# the software. This notice grants no license of any kind, including but not limited to patent +# license, nor is any license granted by implication, estoppel or otherwise. + +# Contributors are required to enter into the IVAS codec Public Collaboration agreement before making +# contributions. + +# This software is provided "AS IS", without any express or implied warranties. The software is in the +# development stage. It is intended exclusively for experts who have experience with such software and +# solely for the purpose of inspection. All implied warranties of non-infringement, merchantability +# and fitness for a particular purpose are hereby disclaimed and excluded. + +# Any dispute, controversy or claim arising under or in relation to providing this software shall be +# submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in +# accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and +# the United Nations Convention on Contracts on the International Sales of Goods. + set maxValues = 40 if (${#argv} != 3) then diff --git a/ci/complexity_measurements/genWebpageData_Rom.csh b/ci/complexity_measurements/genWebpageData_Rom.csh index 776e801549..d99d5928bd 100755 --- a/ci/complexity_measurements/genWebpageData_Rom.csh +++ b/ci/complexity_measurements/genWebpageData_Rom.csh @@ -1,5 +1,33 @@ #!/bin/tcsh +# (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository. All Rights Reserved. + +# This software is protected by copyright law and by international treaties. +# The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository retain full ownership rights in their respective contributions in +# the software. This notice grants no license of any kind, including but not limited to patent +# license, nor is any license granted by implication, estoppel or otherwise. + +# Contributors are required to enter into the IVAS codec Public Collaboration agreement before making +# contributions. + +# This software is provided "AS IS", without any express or implied warranties. The software is in the +# development stage. It is intended exclusively for experts who have experience with such software and +# solely for the purpose of inspection. All implied warranties of non-infringement, merchantability +# and fitness for a particular purpose are hereby disclaimed and excluded. + +# Any dispute, controversy or claim arising under or in relation to providing this software shall be +# submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in +# accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and +# the United Nations Convention on Contracts on the International Sales of Goods. + set maxValues = 40 if (${#argv} != 3) then diff --git a/ci/complexity_measurements/genWebpageData_WMOPS.csh b/ci/complexity_measurements/genWebpageData_WMOPS.csh index c3137640d6..5551978054 100755 --- a/ci/complexity_measurements/genWebpageData_WMOPS.csh +++ b/ci/complexity_measurements/genWebpageData_WMOPS.csh @@ -1,5 +1,33 @@ #!/bin/tcsh +# (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository. All Rights Reserved. + +# This software is protected by copyright law and by international treaties. +# The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository retain full ownership rights in their respective contributions in +# the software. This notice grants no license of any kind, including but not limited to patent +# license, nor is any license granted by implication, estoppel or otherwise. + +# Contributors are required to enter into the IVAS codec Public Collaboration agreement before making +# contributions. + +# This software is provided "AS IS", without any express or implied warranties. The software is in the +# development stage. It is intended exclusively for experts who have experience with such software and +# solely for the purpose of inspection. All implied warranties of non-infringement, merchantability +# and fitness for a particular purpose are hereby disclaimed and excluded. + +# Any dispute, controversy or claim arising under or in relation to providing this software shall be +# submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in +# accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and +# the United Nations Convention on Contracts on the International Sales of Goods. + set maxValues = 40 if (${#argv} != 3) then diff --git a/ci/complexity_measurements/genWebpageData_WmopPerOperatingpoint.csh b/ci/complexity_measurements/genWebpageData_WmopPerOperatingpoint.csh index 21d4ab324a..cac8183bda 100755 --- a/ci/complexity_measurements/genWebpageData_WmopPerOperatingpoint.csh +++ b/ci/complexity_measurements/genWebpageData_WmopPerOperatingpoint.csh @@ -1,5 +1,33 @@ #!/bin/tcsh +# (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository. All Rights Reserved. + +# This software is protected by copyright law and by international treaties. +# The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository retain full ownership rights in their respective contributions in +# the software. This notice grants no license of any kind, including but not limited to patent +# license, nor is any license granted by implication, estoppel or otherwise. + +# Contributors are required to enter into the IVAS codec Public Collaboration agreement before making +# contributions. + +# This software is provided "AS IS", without any express or implied warranties. The software is in the +# development stage. It is intended exclusively for experts who have experience with such software and +# solely for the purpose of inspection. All implied warranties of non-infringement, merchantability +# and fitness for a particular purpose are hereby disclaimed and excluded. + +# Any dispute, controversy or claim arising under or in relation to providing this software shall be +# submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in +# accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and +# the United Nations Convention on Contracts on the International Sales of Goods. + set srcFile = $1 set file_final = $2 set file = ${file_final}.new diff --git a/ci/complexity_measurements/getWmops.sh b/ci/complexity_measurements/getWmops.sh index e640c005f1..07096e05cd 100755 --- a/ci/complexity_measurements/getWmops.sh +++ b/ci/complexity_measurements/getWmops.sh @@ -1,5 +1,33 @@ #! /bin/bash +# (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository. All Rights Reserved. + +# This software is protected by copyright law and by international treaties. +# The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository retain full ownership rights in their respective contributions in +# the software. This notice grants no license of any kind, including but not limited to patent +# license, nor is any license granted by implication, estoppel or otherwise. + +# Contributors are required to enter into the IVAS codec Public Collaboration agreement before making +# contributions. + +# This software is provided "AS IS", without any express or implied warranties. The software is in the +# development stage. It is intended exclusively for experts who have experience with such software and +# solely for the purpose of inspection. All implied warranties of non-infringement, merchantability +# and fitness for a particular purpose are hereby disclaimed and excluded. + +# Any dispute, controversy or claim arising under or in relation to providing this software shall be +# submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in +# accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and +# the United Nations Convention on Contracts on the International Sales of Goods. + # get format from command line if [ $# -ne 1 ]; then echo "Usage: $0 ivas-format" diff --git a/ci/complexity_measurements/index_complexity.html b/ci/complexity_measurements/index_complexity.html index bfba7d02ce..321177b1df 100755 --- a/ci/complexity_measurements/index_complexity.html +++ b/ci/complexity_measurements/index_complexity.html @@ -1,4 +1,35 @@ + + + diff --git a/ci/complexity_measurements/mergeNewsletterRam.py b/ci/complexity_measurements/mergeNewsletterRam.py index 5dec63ffad..c5e61a9854 100755 --- a/ci/complexity_measurements/mergeNewsletterRam.py +++ b/ci/complexity_measurements/mergeNewsletterRam.py @@ -1,22 +1,33 @@ #!/usr/bin/env python3 # coding: utf-8 -# /************************* IVAS control modules ****************************** -# -# (C) Copyright Fraunhofer IIS (2022) -# All Rights Reserved -# -# Initial author: mul -# contents/description: General utility functions for file and directory handling -# -# USAGE: -# -# This software and/or program is protected by copyright law and international -# treaties. Any reproduction or distribution of this software and/or program, -# or any portion of it, may result in severe civil and criminal penalties, and -# will be prosecuted to the maximum extent possible under law. -# -# ******************************************************************************/ +# (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository. All Rights Reserved. + +# This software is protected by copyright law and by international treaties. +# The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository retain full ownership rights in their respective contributions in +# the software. This notice grants no license of any kind, including but not limited to patent +# license, nor is any license granted by implication, estoppel or otherwise. + +# Contributors are required to enter into the IVAS codec Public Collaboration agreement before making +# contributions. + +# This software is provided "AS IS", without any express or implied warranties. The software is in the +# development stage. It is intended exclusively for experts who have experience with such software and +# solely for the purpose of inspection. All implied warranties of non-infringement, merchantability +# and fitness for a particular purpose are hereby disclaimed and excluded. + +# Any dispute, controversy or claim arising under or in relation to providing this software shall be +# submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in +# accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and +# the United Nations Convention on Contracts on the International Sales of Goods. import csv import sys import re diff --git a/ci/complexity_measurements/parseNewsletterProm.py b/ci/complexity_measurements/parseNewsletterProm.py index 8809b92e7b..072cb03c21 100755 --- a/ci/complexity_measurements/parseNewsletterProm.py +++ b/ci/complexity_measurements/parseNewsletterProm.py @@ -1,21 +1,34 @@ #!/usr/bin/env python3 # coding: utf-8 -# /************************* IVAS control modules ****************************** -# -# (C) Copyright Fraunhofer IIS (2022) -# All Rights Reserved -# -# Initial author: mul -# contents/description: General utility functions for file and directory handling -# -# USAGE: -# -# This software and/or program is protected by copyright law and international -# treaties. Any reproduction or distribution of this software and/or program, -# or any portion of it, may result in severe civil and criminal penalties, and -# will be prosecuted to the maximum extent possible under law. -# -# ******************************************************************************/ +""" + (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. +""" import csv import sys diff --git a/ci/complexity_measurements/parseNewsletterRam.py b/ci/complexity_measurements/parseNewsletterRam.py index 43b34a8544..b099fb450f 100755 --- a/ci/complexity_measurements/parseNewsletterRam.py +++ b/ci/complexity_measurements/parseNewsletterRam.py @@ -1,21 +1,34 @@ #!/usr/bin/env python3 # coding: utf-8 -# /************************* IVAS control modules ****************************** -# -# (C) Copyright Fraunhofer IIS (2022) -# All Rights Reserved -# -# Initial author: mul -# contents/description: General utility functions for file and directory handling -# -# USAGE: -# -# This software and/or program is protected by copyright law and international -# treaties. Any reproduction or distribution of this software and/or program, -# or any portion of it, may result in severe civil and criminal penalties, and -# will be prosecuted to the maximum extent possible under law. -# -# ******************************************************************************/ +""" + (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. +""" import csv import sys diff --git a/ci/complexity_measurements/parseNewsletterRom.py b/ci/complexity_measurements/parseNewsletterRom.py index 9350b8fac6..aeb7ee2650 100755 --- a/ci/complexity_measurements/parseNewsletterRom.py +++ b/ci/complexity_measurements/parseNewsletterRom.py @@ -1,21 +1,35 @@ #!/usr/bin/env python3 # coding: utf-8 -# /************************* IVAS control modules ****************************** -# -# (C) Copyright Fraunhofer IIS (2022) -# All Rights Reserved -# -# Initial author: mul -# contents/description: General utility functions for file and directory handling -# -# USAGE: -# -# This software and/or program is protected by copyright law and international -# treaties. Any reproduction or distribution of this software and/or program, -# or any portion of it, may result in severe civil and criminal penalties, and -# will be prosecuted to the maximum extent possible under law. -# -# ******************************************************************************/ + +""" + (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. +""" import csv import sys diff --git a/ci/complexity_measurements/parseNewsletterWmops.py b/ci/complexity_measurements/parseNewsletterWmops.py index 14ab3b3ef9..06943726a0 100755 --- a/ci/complexity_measurements/parseNewsletterWmops.py +++ b/ci/complexity_measurements/parseNewsletterWmops.py @@ -1,21 +1,34 @@ #!/usr/bin/env python3 # coding: utf-8 -# /************************* IVAS control modules ****************************** -# -# (C) Copyright Fraunhofer IIS (2022) -# All Rights Reserved -# -# Initial author: mul -# contents/description: General utility functions for file and directory handling -# -# USAGE: -# -# This software and/or program is protected by copyright law and international -# treaties. Any reproduction or distribution of this software and/or program, -# or any portion of it, may result in severe civil and criminal penalties, and -# will be prosecuted to the maximum extent possible under law. -# -# ******************************************************************************/ +""" + (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. +""" import csv import sys diff --git a/ci/get_id_of_last_job_occurence.py b/ci/get_id_of_last_job_occurence.py index 461eeb2b56..3d77cf7d7d 100755 --- a/ci/get_id_of_last_job_occurence.py +++ b/ci/get_id_of_last_job_occurence.py @@ -1,3 +1,35 @@ +#!/usr/bin/env python3 + +""" + (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. +""" + import argparse import requests diff --git a/ci/run_evs_be_test.py b/ci/run_evs_be_test.py index 9fa64877f2..e3c6c750bb 100755 --- a/ci/run_evs_be_test.py +++ b/ci/run_evs_be_test.py @@ -1,4 +1,33 @@ #!/usr/bin/env python3 +""" + (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. +""" import subprocess import pathlib import sys diff --git a/ci/run_scheduled_sanitizer_test.py b/ci/run_scheduled_sanitizer_test.py index 6696e184c2..2ccbe12fff 100644 --- a/ci/run_scheduled_sanitizer_test.py +++ b/ci/run_scheduled_sanitizer_test.py @@ -1,4 +1,33 @@ #!/usr/bin/env python3 +""" + (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. +""" import argparse import sys diff --git a/ci/smoke_test.sh b/ci/smoke_test.sh index e3caac3533..3d7b85fdba 100755 --- a/ci/smoke_test.sh +++ b/ci/smoke_test.sh @@ -1,5 +1,33 @@ #! /usr/bin/bash +# (C) 2022 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository. All Rights Reserved. + +# This software is protected by copyright law and by international treaties. +# The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, +# Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., +# Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, +# Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other +# contributors to this repository retain full ownership rights in their respective contributions in +# the software. This notice grants no license of any kind, including but not limited to patent +# license, nor is any license granted by implication, estoppel or otherwise. + +# Contributors are required to enter into the IVAS codec Public Collaboration agreement before making +# contributions. + +# This software is provided "AS IS", without any express or implied warranties. The software is in the +# development stage. It is intended exclusively for experts who have experience with such software and +# solely for the purpose of inspection. All implied warranties of non-infringement, merchantability +# and fitness for a particular purpose are hereby disclaimed and excluded. + +# Any dispute, controversy or claim arising under or in relation to providing this software shall be +# submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in +# accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and +# the United Nations Convention on Contracts on the International Sales of Goods. + if [ ! -d "lib_com" ]; then echo "not in root directory! - please run in IVAS root" exit 1 -- GitLab From 036bfdadb9311518432a1eb68d00a7bbe1768ca6 Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 8 Nov 2022 13:30:26 +0100 Subject: [PATCH 12/42] add jobs for more modes and lower duration --- .gitlab-ci.yml | 41 +++++++++++++++++++++++++- ci/complexity_measurements/getWmops.sh | 2 +- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1b36605848..38127f8da4 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -786,9 +786,48 @@ measure-complexity-linux-ism-test: - *print-common-info - *update-ltv-repo - *complexity-measurements-setup - - bash ci/complexity_measurements/getWmops.sh ISM1 #"ISM1 ISM2 ISM3 ISM4" + - bash ci/complexity_measurements/getWmops.sh "ISM1 ISM2 ISM3 ISM4" - *complexity-measurements-prepare-artifacts +measure-complexity-linux-sba-test: + extends: + - .measure-complexity-template + script: + - *print-common-info + - *update-ltv-repo + - *complexity-measurements-setup + - bash ci/complexity_measurements/getWmops.sh "SBA PlanarSBA" + - *complexity-measurements-prepare-artifacts + +measure-complexity-linux-mc-test: + extends: + - .measure-complexity-template + script: + - *print-common-info + - *update-ltv-repo + - *complexity-measurements-setup + - bash ci/complexity_measurements/getWmops.sh "MC" + - *complexity-measurements-prepare-artifacts + +measure-complexity-linux-masa-test: + extends: + - .measure-complexity-template + script: + - *print-common-info + - *update-ltv-repo + - *complexity-measurements-setup + - bash ci/complexity_measurements/getWmops.sh "MASA" + - *complexity-measurements-prepare-artifacts + +measure-complexity-linux-StereoDmxEVS-test: + extends: + - .measure-complexity-template + script: + - *print-common-info + - *update-ltv-repo + - *complexity-measurements-setup + - bash ci/complexity_measurements/getWmops.sh "StereoDmxEVS" + - *complexity-measurements-prepare-artifacts # --------------------------------------------------------------- # Other jobs diff --git a/ci/complexity_measurements/getWmops.sh b/ci/complexity_measurements/getWmops.sh index 07096e05cd..6fbcd371e9 100755 --- a/ci/complexity_measurements/getWmops.sh +++ b/ci/complexity_measurements/getWmops.sh @@ -45,7 +45,7 @@ commit_sha=`git rev-parse --short HEAD` destDir="." scriptDir="ci/complexity_measurements" ep="${scriptDir}/ep_10pct_fer.g192" -duration="10" +duration="2" config_file="scripts/config/ci_linux_ltv.json" -- GitLab From 91e3976d25b5cfb67f02a6236dcec8067e8851f7 Mon Sep 17 00:00:00 2001 From: knj Date: Tue, 8 Nov 2022 15:13:46 +0100 Subject: [PATCH 13/42] change passed modes --- .gitlab-ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 38127f8da4..f6f7f2b58d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -796,7 +796,7 @@ measure-complexity-linux-sba-test: - *print-common-info - *update-ltv-repo - *complexity-measurements-setup - - bash ci/complexity_measurements/getWmops.sh "SBA PlanarSBA" + - bash ci/complexity_measurements/getWmops.sh SBA - *complexity-measurements-prepare-artifacts measure-complexity-linux-mc-test: @@ -806,7 +806,7 @@ measure-complexity-linux-mc-test: - *print-common-info - *update-ltv-repo - *complexity-measurements-setup - - bash ci/complexity_measurements/getWmops.sh "MC" + - bash ci/complexity_measurements/getWmops.sh MC - *complexity-measurements-prepare-artifacts measure-complexity-linux-masa-test: @@ -816,7 +816,7 @@ measure-complexity-linux-masa-test: - *print-common-info - *update-ltv-repo - *complexity-measurements-setup - - bash ci/complexity_measurements/getWmops.sh "MASA" + - bash ci/complexity_measurements/getWmops.sh MASA - *complexity-measurements-prepare-artifacts measure-complexity-linux-StereoDmxEVS-test: @@ -826,7 +826,7 @@ measure-complexity-linux-StereoDmxEVS-test: - *print-common-info - *update-ltv-repo - *complexity-measurements-setup - - bash ci/complexity_measurements/getWmops.sh "StereoDmxEVS" + - bash ci/complexity_measurements/getWmops.sh StereoDmxEVS - *complexity-measurements-prepare-artifacts # --------------------------------------------------------------- -- GitLab From 067c99ef674eb1e50470551adaa14f41a59058b4 Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 9 Nov 2022 15:43:32 +0100 Subject: [PATCH 14/42] make y-axis max value adaptive to maximum value in the data --- .../index_complexity.html | 222 ++++-------------- 1 file changed, 50 insertions(+), 172 deletions(-) diff --git a/ci/complexity_measurements/index_complexity.html b/ci/complexity_measurements/index_complexity.html index 321177b1df..a663e37cbf 100755 --- a/ci/complexity_measurements/index_complexity.html +++ b/ci/complexity_measurements/index_complexity.html @@ -486,15 +486,35 @@ } } + function get_max_y_val_for_plotting(displays, round_to) { + var max = 0; + for ( var i = 0; i < displays.length; i++ ) + { + var data = displays[i].data; + for ( var j = 0; j < data.length; j++ ) + { + var val = data[j][1]; + if ( val > max ) + { + max = val; + } + } + } + + max = Math.ceil( max / round_to ) * round_to; + + return max; + } + function WMOPS() { var previousPoint = null; - function drawGraph(elt, graph) { + function drawGraph(elt, graph, max_val) { var options = { yaxis: { min: 0, - max: 220, + max: max_val, tickFormatter: function (v, axis) { if (graph.direction == -1) return v + " WMOPS"; @@ -608,7 +628,8 @@ } $(document).ready(function () { - drawGraph($("#wmops-graph"), Graphs_WMOPS.wmops_worstcase); + var max = get_max_y_val_for_plotting(Graphs_WMOPS.wmops_worstcase.displays, 50); + drawGraph($("#wmops-graph"), Graphs_WMOPS.wmops_worstcase, max); }); var refData = Graphs_WMOPS.wmops_worstcase.displays[0]; @@ -647,11 +668,11 @@ function WMOPS_perOP() { var previousPoint = null; - function drawGraph(elt, graph) { + function drawGraph(elt, graph, max_val) { var options = { yaxis: { min: 0, - max: 220, + max: max_val, tickFormatter: function (v, axis) { if (graph.direction == -1) return v + " WMOPS"; @@ -740,7 +761,9 @@ function WMOPS_perOP() { $(document).ready(function () { - drawGraph($("#wmops_per_op-graph"), Graphs_WMOPS_perOP.wmops_worstcase_per_op); + // need to get worst case of enc + dec combined, because values are stacked in the graph + var max = get_max_y_val_for_plotting(Graphs_WMOPS.wmops_worstcase.displays, 50); + drawGraph($("#wmops_per_op-graph"), Graphs_WMOPS_perOP.wmops_worstcase_per_op, max); }); var nEntriesWmopsGraph = Graphs_WMOPS.wmops_worstcase.runs.length - 1; @@ -761,11 +784,11 @@ function WMOPS_perOP() { var previousPoint = null; - function drawGraph(elt, graph) { + function drawGraph(elt, graph, max_val) { var options = { yaxis: { min: 0, - max: 270, + max: max_val, tickFormatter: function (v, axis) { if (graph.direction == -1) return v + " WMOPS"; @@ -879,7 +902,8 @@ function WMOPS_perOP() { } $(document).ready(function () { - drawGraph($("#wmops-48kHz-graph"), Graphs_WMOPS_48kHz.wmops_worstcase); + var max = get_max_y_val_for_plotting(Graphs_WMOPS_48kHz.wmops_worstcase.displays, 50); + drawGraph($("#wmops-48kHz-graph"), Graphs_WMOPS_48kHz.wmops_worstcase, max); }); var refData = Graphs_WMOPS_48kHz.wmops_worstcase.displays[0]; @@ -918,11 +942,11 @@ function WMOPS_perOP_48kHz() { var previousPoint = null; - function drawGraph(elt, graph) { + function drawGraph(elt, graph, max_val) { var options = { yaxis: { min: 0, - max: 270, + max: max_val, tickFormatter: function (v, axis) { if (graph.direction == -1) return v + " WMOPS"; @@ -1011,7 +1035,9 @@ function WMOPS_perOP_48kHz() { $(document).ready(function () { - drawGraph($("#wmops_per_op-48kHz-graph"), Graphs_WMOPS_perOP_48kHz.wmops_worstcase_per_op); + // need to get worst case of enc + dec combined, because values are stacked in the graph + var max = get_max_y_val_for_plotting(Graphs_WMOPS_48kHz.wmops_worstcase.displays, 50); + drawGraph($("#wmops_per_op-48kHz-graph"), Graphs_WMOPS_perOP_48kHz.wmops_worstcase_per_op, max); }); var nEntriesWmopsGraph = Graphs_WMOPS_48kHz.wmops_worstcase.runs.length - 1; @@ -1031,11 +1057,11 @@ function RAM() { var previousPoint = null; - function drawGraph(elt, graph) { + function drawGraph(elt, graph, max_val) { var options = { yaxis: { min: 0, - max: 280000, + max: max_val, tickFormatter: function (v, axis) { if (graph.direction == -1) return v + " Word"; @@ -1153,7 +1179,8 @@ function RAM() { } $(document).ready(function () { - drawGraph($("#ram-graph"), Graphs_RAM.ram_worstcase); + var max = get_max_y_val_for_plotting(Graphs_RAM.ram_worstcase.displays, 50000); + drawGraph($("#ram-graph"), Graphs_RAM.ram_worstcase, max); }); var testData = Graphs_RAM.ram_worstcase.displays[1]; @@ -1188,11 +1215,11 @@ function ROM() { var previousPoint = null; - function drawGraph(elt, graph) { + function drawGraph(elt, graph, max_val) { var options = { yaxis: { min: 0, - max: 250000, + max: max_val, tickFormatter: function (v, axis) { if (graph.direction == -1) return v + " Word"; @@ -1287,7 +1314,8 @@ function ROM() { } $(document).ready(function () { - drawGraph($("#rom-graph"), Graphs_ROM.rom_worstcase); + var max = get_max_y_val_for_plotting(Graphs_ROM.rom_worstcase.displays, 50000); + drawGraph($("#rom-graph"), Graphs_ROM.rom_worstcase, max); }); @@ -1353,11 +1381,11 @@ function PROM() { var previousPoint = null; - function drawGraph(elt, graph) { + function drawGraph(elt, graph, max_val) { var options = { yaxis: { min: 0, - max: 250000, + max: max_val, tickFormatter: function (v, axis) { if (graph.direction == -1) return v + " Ops"; @@ -1453,7 +1481,8 @@ function PROM() { } $(document).ready(function () { - drawGraph($("#prom-graph"), Graphs_PROM.prom_worstcase); + var max = get_max_y_val_for_plotting(Graphs_PROM.prom_worstcase.displays, 50000); + drawGraph($("#prom-graph"), Graphs_PROM.prom_worstcase, max); }); @@ -1510,157 +1539,6 @@ function PROM() { } } -} - - -function CONVERSION_FACTORS_perOP(){ - - /* deep copy of one of the WMOPS-per-OP objects */ - var Graphs_CONVERSION_FACTORS = jQuery.extend(true, {}, Graphs_WMOPS_BASOP_perOP); - - /* now calculate conversion factors and set the graph-properties - correctly */ - - /* show the points */ - Graphs_CONVERSION_FACTORS.wmops_worstcase_per_op.displays[0].points = - {show: true}; - Graphs_CONVERSION_FACTORS.wmops_worstcase_per_op.displays[1].points = - {show: true}; - - - /* calc conversion factors for encoder */ - for(var i = 0; i
"; - - text += 'Conversion Factor: ' + Math.round(y * 100) / 100; - if( item.series.id == "worstCaseEnc" ){ - text += " (enc)"; - } - if( item.series.id == "worstCaseDec" ){ - text += " (dec)"; - } - text += "

"; - - text += "Worst case enc BASOP: " + scoreEncBasop + " WMOPS
"; - text += "Worst case dec BASOP: " + scoreDecBasop + " WMOPS
"; - text += "Worst case codec BASOP: " + scoreCodecBasop + " WMOPS

"; - - text += "Worst case enc Float: " + scoreEncFlc + " WMOPS
"; - text += "Worst case dec Float: " + scoreDecFlc + " WMOPS
"; - text += "Worst case codec Float: " + scoreCodecFlc + " WMOPS

"; - - showToolTip(item.pageX, item.pageY, text); - - }); - - } - - - $(document).ready(function () { - drawGraph($("#conversion_factors_basop_flc"), Graphs_CONVERSION_FACTORS.wmops_worstcase_per_op); - }); - - var nEntriesWmopsGraph = Graphs_WMOPS_BASOP.wmops_worstcase.runs.length - 1; - var legend = "

Numbers derived from revision " + - Graphs_WMOPS_BASOP.wmops_worstcase.runs[nEntriesWmopsGraph].revision + - ", " + - Graphs_WMOPS_BASOP.wmops_worstcase.runs[nEntriesWmopsGraph].fullDate + - "

"; - - document.getElementById("conversion_factors_basop_flc-legend").innerHTML = legend; - - } -- GitLab From c28ce8decae189d58651041581fbfd666e5b534e Mon Sep 17 00:00:00 2001 From: knj Date: Wed, 9 Nov 2022 17:03:54 +0100 Subject: [PATCH 15/42] actually look in other pageswhen searching for last job id --- ci/get_id_of_last_job_occurence.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ci/get_id_of_last_job_occurence.py b/ci/get_id_of_last_job_occurence.py index 3d77cf7d7d..1e642c8ef4 100755 --- a/ci/get_id_of_last_job_occurence.py +++ b/ci/get_id_of_last_job_occurence.py @@ -34,6 +34,7 @@ import argparse import requests PER_PAGE_SUFFIX = "?per_page=50" +PAGE_SUFFIX = "&page={}" API_BASE_URL = "https://forge.3gpp.org/rep/api/v4/projects/49" @@ -51,11 +52,12 @@ job_id = -1 # check last 500 pipelines max for page in range(100): url_pls = API_BASE_URL + "/pipelines" - resp_pls = requests.get(url_pls + PER_PAGE_SUFFIX) + suffix = PER_PAGE_SUFFIX + PAGE_SUFFIX.format(page) + resp_pls = requests.get(url_pls + suffix) for pl in resp_pls.json(): if pl["ref"] == branch_name: url_jobs = url_pls + f"/{pl['id']}/jobs" - resp_jobs = requests.get(url_jobs + PER_PAGE_SUFFIX) + resp_jobs = requests.get(url_jobs + suffix) if job_name not in resp_jobs.text: continue -- GitLab From 0e745b05119be02fecf4644781b0eb0831f7dddf Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 10 Nov 2022 10:39:20 +0100 Subject: [PATCH 16/42] add job for gitlab pages publication --- .gitlab-ci.yml | 48 +++++++++++++++++++++++++++++++++++++++++++++ ci/index-pages.html | 19 ++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 ci/index-pages.html diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f6f7f2b58d..00c41c3ac3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -28,6 +28,7 @@ stages: - test - compare - validate + - deploy # --------------------------------------------------------------- # Generic script anchors @@ -833,6 +834,53 @@ measure-complexity-linux-StereoDmxEVS-test: # Other jobs # --------------------------------------------------------------- +pages: + stage: deploy + rules: + # only run for pipelines that affect the data for the page + - if: $MEASURE_COMPLEXITY_LINUX + # TODO: add coverage job + script: + + - API_URL_BASE=https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs + + - mkdir public + # get artifacts for complexity jobs + - id_comp_stereo=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH measure-complexity-linux-stereo-test) + - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_stereo.zip + - unzip artifacts_comp_stereo.zip + - mv measure-complexity-linux-stereo-test-public ./public/ + + - id_comp_ism=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH measure-complexity-linux-ism-test) + - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_ism.zip + - unzip artifacts_comp_ism.zip + - mv measure-complexity-linux-ism-test-public ./public/ + + - id_comp_sba=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH measure-complexity-linux-sba-test) + - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_sba.zip + - unzip artifacts_comp_sba.zip + - mv measure-complexity-linux-sba-test-public ./public/ + + - id_comp_mc=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH measure-complexity-linux-mc-test) + - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_mc.zip + - unzip artifacts_comp_mc.zip + - mv measure-complexity-linux-mc-test-public ./public/ + + - id_comp_masa=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH measure-complexity-linux-masa-test) + - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_masa.zip + - unzip artifacts_comp_masa.zip + - mv measure-complexity-linux-masa-test-public ./public/ + + - id_comp_StereoDmxEVS=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH measure-complexity-linux-StereoDmxEVS-test) + - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_StereoDmxEVS.zip + - unzip artifacts_comp_StereoDmxEVS.zip + - mv measure-complexity-linux-StereoDmxEVS-test-public ./public/ + + - cp ci/index-pages.html public/index.html + artifacts: + paths: + - public + # Pull state of a branch on 3GPP repo, push to a mirror repo. pull-from-3gpp-forge: stage: maintenance diff --git a/ci/index-pages.html b/ci/index-pages.html new file mode 100644 index 0000000000..f8b0709b03 --- /dev/null +++ b/ci/index-pages.html @@ -0,0 +1,19 @@ + + + + + +

Ivas Codec Development

+ +

Complexity Reports

+ + + + -- GitLab From dfea2ed72ccc26bad74fbf82f6ffef65592ceb2d Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 10 Nov 2022 10:39:49 +0100 Subject: [PATCH 17/42] fix bug in api url suffix when getting jobs for pipelines --- ci/get_id_of_last_job_occurence.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ci/get_id_of_last_job_occurence.py b/ci/get_id_of_last_job_occurence.py index 1e642c8ef4..f6223d9980 100755 --- a/ci/get_id_of_last_job_occurence.py +++ b/ci/get_id_of_last_job_occurence.py @@ -52,12 +52,17 @@ job_id = -1 # check last 500 pipelines max for page in range(100): url_pls = API_BASE_URL + "/pipelines" + + # need both suffixes here to descend through the pages and get also older pipelines suffix = PER_PAGE_SUFFIX + PAGE_SUFFIX.format(page) resp_pls = requests.get(url_pls + suffix) for pl in resp_pls.json(): if pl["ref"] == branch_name: url_jobs = url_pls + f"/{pl['id']}/jobs" - resp_jobs = requests.get(url_jobs + suffix) + + # only one of the suffixes here - this assumes only max of 50 jobs per pipeline + # so only one page needed + resp_jobs = requests.get(url_jobs + PER_PAGE_SUFFIX) if job_name not in resp_jobs.text: continue -- GitLab From bc6d33a4eb187b3eda7d1e59b0037f06cc46e1b0 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 10 Nov 2022 11:08:51 +0100 Subject: [PATCH 18/42] add tag to pages job --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 00c41c3ac3..9dbf86aebe 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -836,6 +836,8 @@ measure-complexity-linux-StereoDmxEVS-test: pages: stage: deploy + tags: + - test-complexity-measurement rules: # only run for pipelines that affect the data for the page - if: $MEASURE_COMPLEXITY_LINUX -- GitLab From f1193c22bfef7946004b4e83d39775a8e7f0bd01 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 10 Nov 2022 11:38:58 +0100 Subject: [PATCH 19/42] skip actual jobs for faster testing --- .gitlab-ci.yml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9dbf86aebe..3b9f5d7700 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -770,7 +770,7 @@ coverage-test-on-main-scheduled: paths: - $CI_JOB_NAME-public -measure-complexity-linux-stereo-test: +.measure-complexity-linux-stereo-test: extends: - .measure-complexity-template script: @@ -780,7 +780,7 @@ measure-complexity-linux-stereo-test: - bash ci/complexity_measurements/getWmops.sh stereo - *complexity-measurements-prepare-artifacts -measure-complexity-linux-ism-test: +.measure-complexity-linux-ism-test: extends: - .measure-complexity-template script: @@ -790,7 +790,7 @@ measure-complexity-linux-ism-test: - bash ci/complexity_measurements/getWmops.sh "ISM1 ISM2 ISM3 ISM4" - *complexity-measurements-prepare-artifacts -measure-complexity-linux-sba-test: +.measure-complexity-linux-sba-test: extends: - .measure-complexity-template script: @@ -800,7 +800,7 @@ measure-complexity-linux-sba-test: - bash ci/complexity_measurements/getWmops.sh SBA - *complexity-measurements-prepare-artifacts -measure-complexity-linux-mc-test: +.measure-complexity-linux-mc-test: extends: - .measure-complexity-template script: @@ -810,7 +810,7 @@ measure-complexity-linux-mc-test: - bash ci/complexity_measurements/getWmops.sh MC - *complexity-measurements-prepare-artifacts -measure-complexity-linux-masa-test: +.measure-complexity-linux-masa-test: extends: - .measure-complexity-template script: @@ -820,7 +820,7 @@ measure-complexity-linux-masa-test: - bash ci/complexity_measurements/getWmops.sh MASA - *complexity-measurements-prepare-artifacts -measure-complexity-linux-StereoDmxEVS-test: +.measure-complexity-linux-StereoDmxEVS-test: extends: - .measure-complexity-template script: @@ -849,7 +849,10 @@ pages: - mkdir public # get artifacts for complexity jobs - id_comp_stereo=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH measure-complexity-linux-stereo-test) + - echo $id_comp_stereo + - echo "$API_URL_BASE/$job_id/artifacts" - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_stereo.zip + - cat artifacts_comp_stereo.zip - unzip artifacts_comp_stereo.zip - mv measure-complexity-linux-stereo-test-public ./public/ -- GitLab From d052c2d0fd91887be311a84a0a708f86ddd48c40 Mon Sep 17 00:00:00 2001 From: kiene Date: Thu, 10 Nov 2022 11:54:35 +0100 Subject: [PATCH 20/42] use current branch name in pages job --- .gitlab-ci.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3b9f5d7700..fd39b3bd38 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -845,10 +845,11 @@ pages: script: - API_URL_BASE=https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs + - branch=$CI_COMMIT_REF_NAME - mkdir public # get artifacts for complexity jobs - - id_comp_stereo=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH measure-complexity-linux-stereo-test) + - id_comp_stereo=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-stereo-test) - echo $id_comp_stereo - echo "$API_URL_BASE/$job_id/artifacts" - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_stereo.zip @@ -856,27 +857,27 @@ pages: - unzip artifacts_comp_stereo.zip - mv measure-complexity-linux-stereo-test-public ./public/ - - id_comp_ism=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH measure-complexity-linux-ism-test) + - id_comp_ism=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-ism-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_ism.zip - unzip artifacts_comp_ism.zip - mv measure-complexity-linux-ism-test-public ./public/ - - id_comp_sba=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH measure-complexity-linux-sba-test) + - id_comp_sba=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-sba-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_sba.zip - unzip artifacts_comp_sba.zip - mv measure-complexity-linux-sba-test-public ./public/ - - id_comp_mc=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH measure-complexity-linux-mc-test) + - id_comp_mc=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-mc-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_mc.zip - unzip artifacts_comp_mc.zip - mv measure-complexity-linux-mc-test-public ./public/ - - id_comp_masa=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH measure-complexity-linux-masa-test) + - id_comp_masa=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-masa-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_masa.zip - unzip artifacts_comp_masa.zip - mv measure-complexity-linux-masa-test-public ./public/ - - id_comp_StereoDmxEVS=$(python3 ci/get_id_of_last_job_occurence.py $CI_DEFAULT_BRANCH measure-complexity-linux-StereoDmxEVS-test) + - id_comp_StereoDmxEVS=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-StereoDmxEVS-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_StereoDmxEVS.zip - unzip artifacts_comp_StereoDmxEVS.zip - mv measure-complexity-linux-StereoDmxEVS-test-public ./public/ -- GitLab From 04790a85a156e4eb748f9cba187209fdbae69963 Mon Sep 17 00:00:00 2001 From: kiene Date: Thu, 10 Nov 2022 12:02:33 +0100 Subject: [PATCH 21/42] use correct job id in url --- .gitlab-ci.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fd39b3bd38..023960b1f9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -849,35 +849,35 @@ pages: - mkdir public # get artifacts for complexity jobs - - id_comp_stereo=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-stereo-test) - - echo $id_comp_stereo + - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-stereo-test) + - echo $job_id - echo "$API_URL_BASE/$job_id/artifacts" - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_stereo.zip - cat artifacts_comp_stereo.zip - unzip artifacts_comp_stereo.zip - mv measure-complexity-linux-stereo-test-public ./public/ - - id_comp_ism=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-ism-test) + - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-ism-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_ism.zip - unzip artifacts_comp_ism.zip - mv measure-complexity-linux-ism-test-public ./public/ - - id_comp_sba=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-sba-test) + - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-sba-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_sba.zip - unzip artifacts_comp_sba.zip - mv measure-complexity-linux-sba-test-public ./public/ - - id_comp_mc=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-mc-test) + - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-mc-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_mc.zip - unzip artifacts_comp_mc.zip - mv measure-complexity-linux-mc-test-public ./public/ - - id_comp_masa=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-masa-test) + - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-masa-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_masa.zip - unzip artifacts_comp_masa.zip - mv measure-complexity-linux-masa-test-public ./public/ - - id_comp_StereoDmxEVS=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-StereoDmxEVS-test) + - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-StereoDmxEVS-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_StereoDmxEVS.zip - unzip artifacts_comp_StereoDmxEVS.zip - mv measure-complexity-linux-StereoDmxEVS-test-public ./public/ -- GitLab From 7e364a447452ecd298fbef15e5706d9314c848e0 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 10 Nov 2022 14:41:12 +0100 Subject: [PATCH 22/42] remove requirements as there are none yet --- ci/complexity_measurements/genWebpageData_Prom.csh | 11 ++++++----- ci/complexity_measurements/genWebpageData_Ram.csh | 7 ++++--- ci/complexity_measurements/genWebpageData_Rom.csh | 7 ++++--- ci/complexity_measurements/genWebpageData_WMOPS.csh | 9 ++++++--- ci/complexity_measurements/index_complexity.html | 10 +--------- 5 files changed, 21 insertions(+), 23 deletions(-) diff --git a/ci/complexity_measurements/genWebpageData_Prom.csh b/ci/complexity_measurements/genWebpageData_Prom.csh index d605abb1af..d6e716f0c5 100755 --- a/ci/complexity_measurements/genWebpageData_Prom.csh +++ b/ci/complexity_measurements/genWebpageData_Prom.csh @@ -96,8 +96,8 @@ echo ' displays: [' >> $file # requirement PROM echo ' {' >> $file -echo ' lines: { show: true },' >> $file -echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' lines: { show: false },' >> $file +echo ' points: { show: false, fillColor: "#ffffff" },' >> $file echo ' borderWidth: 1.5,' >> $file echo ' borderColor: "#BEBEBE",' >> $file echo ' markingsLineWidth: .75,' >> $file @@ -122,7 +122,8 @@ foreach line ( "`cat ${tmpFile1}`" ) continue endif - set score = 54260 + # TODO: add real requirement once decided on + set score = 0 echo ' ['"${i}, ${score}"']'${separator} >> $file @ i++ @@ -174,8 +175,8 @@ echo ' },' >> $file # measured ops BASOP echo ' {' >> $file -echo ' lines: { show: true },' >> $file -echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' lines: { show: false },' >> $file +echo ' points: { show: false, fillColor: "#ffffff" },' >> $file echo ' borderWidth: 1.5,' >> $file echo ' borderColor: "#BEBEBE",' >> $file echo ' markingsLineWidth: .75,' >> $file diff --git a/ci/complexity_measurements/genWebpageData_Ram.csh b/ci/complexity_measurements/genWebpageData_Ram.csh index 19fac84e0a..a8dbc0e2f9 100755 --- a/ci/complexity_measurements/genWebpageData_Ram.csh +++ b/ci/complexity_measurements/genWebpageData_Ram.csh @@ -104,8 +104,8 @@ echo ' displays: [' >> $file # requirement RAM echo ' {' >> $file -echo ' lines: { show: true },' >> $file -echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' lines: { show: false },' >> $file +echo ' points: { show: false, fillColor: "#ffffff" },' >> $file echo ' borderWidth: 1.5,' >> $file echo ' borderColor: "#BEBEBE",' >> $file echo ' markingsLineWidth: .75,' >> $file @@ -130,7 +130,8 @@ foreach line ( "`cat ${tmpFile}`" ) continue endif - set score = 200000 + # TODO: add real requirement once decided on + set score = 0 echo ' ['"${i}, ${score}"']'${separator} >> $file @ i++ diff --git a/ci/complexity_measurements/genWebpageData_Rom.csh b/ci/complexity_measurements/genWebpageData_Rom.csh index d99d5928bd..d2ef2daf15 100755 --- a/ci/complexity_measurements/genWebpageData_Rom.csh +++ b/ci/complexity_measurements/genWebpageData_Rom.csh @@ -96,8 +96,8 @@ echo ' displays: [' >> $file # requirement ROM echo ' {' >> $file -echo ' lines: { show: true },' >> $file -echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' lines: { show: false },' >> $file +echo ' points: { show: false, fillColor: "#ffffff" },' >> $file echo ' borderWidth: 1.5,' >> $file echo ' borderColor: "#BEBEBE",' >> $file echo ' markingsLineWidth: .75,' >> $file @@ -122,7 +122,8 @@ foreach line ( "`cat ${tmpFile1}`" ) continue endif - set score = 200000 + # TODO: add real requirement once decided on + set score = 0 echo ' ['"${i}, ${score}"']'${separator} >> $file @ i++ diff --git a/ci/complexity_measurements/genWebpageData_WMOPS.csh b/ci/complexity_measurements/genWebpageData_WMOPS.csh index 5551978054..c030f4afac 100755 --- a/ci/complexity_measurements/genWebpageData_WMOPS.csh +++ b/ci/complexity_measurements/genWebpageData_WMOPS.csh @@ -120,8 +120,8 @@ echo ' displays: [' >> $file # 135 WMOPS boundary echo ' {' >> $file -echo ' lines: { show: true },' >> $file -echo ' points: { show: true, fillColor: "#ffffff" },' >> $file +echo ' lines: { show: false },' >> $file +echo ' points: { show: false, fillColor: "#ffffff" },' >> $file echo ' borderWidth: 1.5,' >> $file echo ' borderColor: "#BEBEBE",' >> $file echo ' markingsLineWidth: .75,' >> $file @@ -146,7 +146,10 @@ foreach line ( "`cat ${tmpFile}`" ) continue endif - echo ' ['"${i}, 135.00"']'${separator} >> $file + # TODO: add real requirement once decided on + set score = 0 + + echo ' ['"${i}, ${score}"']'${separator} >> $file @ i++ end diff --git a/ci/complexity_measurements/index_complexity.html b/ci/complexity_measurements/index_complexity.html index a663e37cbf..43e69db218 100755 --- a/ci/complexity_measurements/index_complexity.html +++ b/ci/complexity_measurements/index_complexity.html @@ -150,7 +150,6 @@
    -
  • Complexity requirement: 135 WMOPS (approximately 3.1 x WMOPS complexity of AMR-WB estimated with ITU-T STL2009)
  • Worst case encoder + decoder performance: Encoder and decoder mode might be different.
  • Worst case encoder + decoder performance (rateswitching): Encoder and decoder mode might be different.
  • Worst case codec performance: Encoder and decoder modes are identical.
  • @@ -186,7 +185,6 @@
      -
    • Complexity requirement: 135 WMOPS (approximately 3.1 x WMOPS complexity of AMR-WB estimated with ITU-T STL2009)
    • Worst case encoder + decoder performance: Encoder and decoder mode might be different.
    • Worst case encoder + decoder performance (rateswitching): Encoder and decoder mode might be different.
    • Worst case codec performance: Encoder and decoder modes are identical.
    • @@ -224,7 +222,6 @@
        -
      • Complexity requirement: 135 WMOPS (approximately 3.1 x WMOPS complexity of AMR-WB estimated with ITU-T STL2009)
      • Worst case encoder + decoder performance: Encoder and decoder mode might be different.
      • Worst case encoder + decoder performance (rateswitching): Encoder and decoder mode might be different.
      • Worst case codec performance: Encoder and decoder modes are identical.
      • @@ -274,7 +271,6 @@
          -
        • RAM requirement: 200 kWord (≈ 31 x RAM of AMR-WB speech codec: 6.5 kWord)
        • Max. total RAM Codec: Dynamic + Static RAM, 32 bit words, Encoder + Decoder
        • Max. total RAM @@ -309,7 +305,6 @@
            -
          • RAM requirement: 200 kWord (≈ 31 x RAM of AMR-WB speech codec: 6.5 kWord)
          • Max. total RAM Codec: Dynamic + Static RAM, Encoder + Decoder
          • Max. total RAM Encoder: Dynamic + Static RAM, Encoder only
          • Max. total RAM Decoder: Dynamic + Static RAM, Decoder only
          • @@ -335,7 +330,6 @@
              -
            • ROM requirement: 200 kWord (≈ 20 x ROM of AMR-WB speech codec: 9.9 kWord)
            • Measured ROM table size, 32 bit words (Float)
            @@ -352,7 +346,6 @@
              -
            • ROM requirement: 200 kWord (≈ 20 x ROM of AMR-WB speech codec: 9.9 kWord)
            • Measured ROM table size, 16 bit words (BASOP)
            @@ -369,10 +362,9 @@
              -
            • PROM requirement: 54260 Ops (10 x Program ROM of AMR-WB speech codec, estimated with ITU-T STL2009: 5426 Ops)
            • Measured PROM (Float, trunk)
            • -
            • Measured PROM (BASOP, branch basop)
            • +
            -- GitLab From eea072f7db6ef94e2eab25dce51c77547b6f2b90 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 10 Nov 2022 14:47:56 +0100 Subject: [PATCH 23/42] add jobs back --- .gitlab-ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 023960b1f9..173260be90 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -770,7 +770,7 @@ coverage-test-on-main-scheduled: paths: - $CI_JOB_NAME-public -.measure-complexity-linux-stereo-test: +measure-complexity-linux-stereo-test: extends: - .measure-complexity-template script: @@ -780,7 +780,7 @@ coverage-test-on-main-scheduled: - bash ci/complexity_measurements/getWmops.sh stereo - *complexity-measurements-prepare-artifacts -.measure-complexity-linux-ism-test: +measure-complexity-linux-ism-test: extends: - .measure-complexity-template script: @@ -790,7 +790,7 @@ coverage-test-on-main-scheduled: - bash ci/complexity_measurements/getWmops.sh "ISM1 ISM2 ISM3 ISM4" - *complexity-measurements-prepare-artifacts -.measure-complexity-linux-sba-test: +measure-complexity-linux-sba-test: extends: - .measure-complexity-template script: @@ -800,7 +800,7 @@ coverage-test-on-main-scheduled: - bash ci/complexity_measurements/getWmops.sh SBA - *complexity-measurements-prepare-artifacts -.measure-complexity-linux-mc-test: +measure-complexity-linux-mc-test: extends: - .measure-complexity-template script: @@ -810,7 +810,7 @@ coverage-test-on-main-scheduled: - bash ci/complexity_measurements/getWmops.sh MC - *complexity-measurements-prepare-artifacts -.measure-complexity-linux-masa-test: +measure-complexity-linux-masa-test: extends: - .measure-complexity-template script: @@ -820,7 +820,7 @@ coverage-test-on-main-scheduled: - bash ci/complexity_measurements/getWmops.sh MASA - *complexity-measurements-prepare-artifacts -.measure-complexity-linux-StereoDmxEVS-test: +measure-complexity-linux-StereoDmxEVS-test: extends: - .measure-complexity-template script: -- GitLab From 03ee799d8928b52ec18aeb2a9f0f637528ffc29a Mon Sep 17 00:00:00 2001 From: kiene Date: Thu, 10 Nov 2022 15:31:21 +0100 Subject: [PATCH 24/42] overwrite while unpacking to avoid problems with automatic artifacts --- .gitlab-ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 173260be90..d81f46c404 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -854,32 +854,32 @@ pages: - echo "$API_URL_BASE/$job_id/artifacts" - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_stereo.zip - cat artifacts_comp_stereo.zip - - unzip artifacts_comp_stereo.zip + - unzip artifacts_comp_stereo.zip -o - mv measure-complexity-linux-stereo-test-public ./public/ - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-ism-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_ism.zip - - unzip artifacts_comp_ism.zip + - unzip artifacts_comp_ism.zip -o - mv measure-complexity-linux-ism-test-public ./public/ - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-sba-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_sba.zip - - unzip artifacts_comp_sba.zip + - unzip artifacts_comp_sba.zip -o - mv measure-complexity-linux-sba-test-public ./public/ - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-mc-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_mc.zip - - unzip artifacts_comp_mc.zip + - unzip artifacts_comp_mc.zip -o - mv measure-complexity-linux-mc-test-public ./public/ - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-masa-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_masa.zip - - unzip artifacts_comp_masa.zip + - unzip artifacts_comp_masa.zip -o - mv measure-complexity-linux-masa-test-public ./public/ - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-StereoDmxEVS-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_StereoDmxEVS.zip - - unzip artifacts_comp_StereoDmxEVS.zip + - unzip artifacts_comp_StereoDmxEVS.zip -o - mv measure-complexity-linux-StereoDmxEVS-test-public ./public/ - cp ci/index-pages.html public/index.html -- GitLab From c1093821d6ff1b94c124797ec185f8ff47b58da9 Mon Sep 17 00:00:00 2001 From: knj Date: Thu, 10 Nov 2022 21:34:51 +0100 Subject: [PATCH 25/42] correct unzip command --- .gitlab-ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d81f46c404..387067040d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -854,32 +854,32 @@ pages: - echo "$API_URL_BASE/$job_id/artifacts" - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_stereo.zip - cat artifacts_comp_stereo.zip - - unzip artifacts_comp_stereo.zip -o + - unzip -o artifacts_comp_stereo.zip - mv measure-complexity-linux-stereo-test-public ./public/ - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-ism-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_ism.zip - - unzip artifacts_comp_ism.zip -o + - unzip -o artifacts_comp_ism.zip - mv measure-complexity-linux-ism-test-public ./public/ - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-sba-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_sba.zip - - unzip artifacts_comp_sba.zip -o + - unzip -o artifacts_comp_sba.zip - mv measure-complexity-linux-sba-test-public ./public/ - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-mc-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_mc.zip - - unzip artifacts_comp_mc.zip -o + - unzip -o artifacts_comp_mc.zip - mv measure-complexity-linux-mc-test-public ./public/ - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-masa-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_masa.zip - - unzip artifacts_comp_masa.zip -o + - unzip -o artifacts_comp_masa.zip - mv measure-complexity-linux-masa-test-public ./public/ - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-StereoDmxEVS-test) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_StereoDmxEVS.zip - - unzip artifacts_comp_StereoDmxEVS.zip -o + - unzip -o artifacts_comp_StereoDmxEVS.zip - mv measure-complexity-linux-StereoDmxEVS-test-public ./public/ - cp ci/index-pages.html public/index.html -- GitLab From e44ed6df19c8e3e2443a31abadf635ccbf61cf4f Mon Sep 17 00:00:00 2001 From: knj Date: Fri, 11 Nov 2022 10:51:56 +0100 Subject: [PATCH 26/42] add note about missing requirements to FAQ section --- ci/complexity_measurements/index_complexity.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/complexity_measurements/index_complexity.html b/ci/complexity_measurements/index_complexity.html index 43e69db218..1e72b86e9a 100755 --- a/ci/complexity_measurements/index_complexity.html +++ b/ci/complexity_measurements/index_complexity.html @@ -376,7 +376,7 @@
            A:
            The graphs titled "native SR" run encoder/decoder at the native input/output sampling-rate per operating point. This is 16 kHz for WB, 32 kHz for SWB etc. The graphs titled "48 kHz" use 48 kHz input/output sampling rate, independent of the supported bandwidth, which is set by using the "-max_band" commandline switch.
            Q:
            What is the meaning of these funny symbols in the navigation box, in the left upper corner of this page?
            A:
            - 1) Traffic light , or : The traffic light symbols show, whether the last datapoint matches the requirement (green) or not (red). A yellow traffic light means that the requirement is matched, but the score is very close (within a 3% margin) to the requirement.
            + 1) Traffic light , or : !!!CURRENTLY NOT WORKING CORRECTLY AS NO REQUIREMENTS DEFINED YET!!! The traffic light symbols show, whether the last datapoint matches the requirement (green) or not (red). A yellow traffic light means that the requirement is matched, but the score is very close (within a 3% margin) to the requirement.
            2) Arrow , , : The arrow indicates the trend of the last datapoint, compared to the last but one. An upwards arrow means that the score got higher (i.e. worse), downwards arrow arrow means that the score got lower (i.e. better), and a rightwards arrow means that the score was kept constant (within a 1% margin).
            Q:
            Which input files are used for audio-input? What error pattern is used?
            -- GitLab From 81d655e7bbc51de5a1c71dae784d6b1f272858b6 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 14 Nov 2022 14:39:32 +0100 Subject: [PATCH 27/42] make logfile link clickable by moving tooltip under cursor --- .../index_complexity.html | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/ci/complexity_measurements/index_complexity.html b/ci/complexity_measurements/index_complexity.html index 43e69db218..00f356e056 100755 --- a/ci/complexity_measurements/index_complexity.html +++ b/ci/complexity_measurements/index_complexity.html @@ -450,8 +450,8 @@ function showToolTip(x, y, contents) { var tipWidth = 165; var tipHeight = 75; - var xOffset = 5; - var yOffset = 5; + var xOffset = -15; + var yOffset = -15; var ie = document.all && !window.opera; var iebody = (document.compatMode == "CSS1Com[at") ? document.documentElement @@ -533,7 +533,10 @@ elt.bind("plothover", function (event, pos, item) { if (!item) { - $("#tooltip").remove(); + // only remove if not in tooltip anymore + if ($('#tooltip:hover').length == 0) { + $("#tooltip").remove(); + } previousPoint = null; return; } @@ -1080,7 +1083,10 @@ function RAM() { elt.bind("plothover", function (event, pos, item) { if (!item) { - $("#tooltip").remove(); + // only remove if not in tooltip anymore + if ($('#tooltip:hover').length == 0) { + $("#tooltip").remove(); + } previousPoint = null; return; } @@ -1238,7 +1244,10 @@ function ROM() { elt.bind("plothover", function (event, pos, item) { if (!item) { - $("#tooltip").remove(); + // only remove if not in tooltip anymore + if ($('#tooltip:hover').length == 0) { + $("#tooltip").remove(); + } previousPoint = null; return; } @@ -1404,7 +1413,10 @@ function PROM() { elt.bind("plothover", function (event, pos, item) { if (!item) { - $("#tooltip").remove(); + // only remove if not in tooltip anymore + if ($('#tooltip:hover').length == 0) { + $("#tooltip").remove(); + } previousPoint = null; return; } -- GitLab From 3b3de345b1b5418548ddef13a1671e7cd0e525d3 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 14 Nov 2022 14:56:00 +0100 Subject: [PATCH 28/42] change format in title dynamically --- .gitlab-ci.yml | 18 +++++++++++++----- .../index_complexity.html | 2 +- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a4d4f2140d..d2d2ef69eb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -948,6 +948,8 @@ coverage-test-on-main-scheduled: - mkdir $public_dir - mv -f wmops/log_*_all.txt wmops/*.js ${public_dir}/ - cp ci/complexity_measurements/index_complexity.html ${public_dir}/index.html + # patch the format in the title + - sed -i "s/IVAS FORMAT/<title>IVAS $format/g" ${public_dir}/index.html # do separately here to avoid overwrite complaints by mv - mv -f ci/complexity_measurements/style.css ${public_dir}/ @@ -971,7 +973,8 @@ measure-complexity-linux-stereo-test: - *print-common-info - *update-ltv-repo - *complexity-measurements-setup - - bash ci/complexity_measurements/getWmops.sh stereo + - format=stereo + - bash ci/complexity_measurements/getWmops.sh $stereo - *complexity-measurements-prepare-artifacts measure-complexity-linux-ism-test: @@ -981,6 +984,7 @@ measure-complexity-linux-ism-test: - *print-common-info - *update-ltv-repo - *complexity-measurements-setup + - format=ISM - bash ci/complexity_measurements/getWmops.sh "ISM1 ISM2 ISM3 ISM4" - *complexity-measurements-prepare-artifacts @@ -991,7 +995,8 @@ measure-complexity-linux-sba-test: - *print-common-info - *update-ltv-repo - *complexity-measurements-setup - - bash ci/complexity_measurements/getWmops.sh SBA + - format=SBA + - bash ci/complexity_measurements/getWmops.sh $format - *complexity-measurements-prepare-artifacts measure-complexity-linux-mc-test: @@ -1001,7 +1006,8 @@ measure-complexity-linux-mc-test: - *print-common-info - *update-ltv-repo - *complexity-measurements-setup - - bash ci/complexity_measurements/getWmops.sh MC + - format=MC + - bash ci/complexity_measurements/getWmops.sh $format - *complexity-measurements-prepare-artifacts measure-complexity-linux-masa-test: @@ -1011,7 +1017,8 @@ measure-complexity-linux-masa-test: - *print-common-info - *update-ltv-repo - *complexity-measurements-setup - - bash ci/complexity_measurements/getWmops.sh MASA + - format=MASA + - bash ci/complexity_measurements/getWmops.sh $format - *complexity-measurements-prepare-artifacts measure-complexity-linux-StereoDmxEVS-test: @@ -1021,7 +1028,8 @@ measure-complexity-linux-StereoDmxEVS-test: - *print-common-info - *update-ltv-repo - *complexity-measurements-setup - - bash ci/complexity_measurements/getWmops.sh StereoDmxEVS + - format=StereoDmxEVS + - bash ci/complexity_measurements/getWmops.sh $format - *complexity-measurements-prepare-artifacts # --------------------------------------------------------------- diff --git a/ci/complexity_measurements/index_complexity.html b/ci/complexity_measurements/index_complexity.html index 00f356e056..ad061c58af 100755 --- a/ci/complexity_measurements/index_complexity.html +++ b/ci/complexity_measurements/index_complexity.html @@ -36,7 +36,7 @@ <meta http-equiv="content-language" content="en"> <meta http-equiv="refresh" content="300"> - <title>IVAS Stereo - Worst Case WMOPS/Memory Performance + IVAS FORMAT - Worst Case WMOPS/Memory Performance -- GitLab From 52bfbc99d424cd1c59f824aee5a2a083ae83b8b5 Mon Sep 17 00:00:00 2001 From: knj Date: Mon, 14 Nov 2022 15:35:46 +0100 Subject: [PATCH 29/42] specify output format as well in complexity jobs --- .gitlab-ci.yml | 32 +++++++++++++++----------- ci/complexity_measurements/getWmops.sh | 9 ++++---- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d2d2ef69eb..7d0d4268ab 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -949,7 +949,7 @@ coverage-test-on-main-scheduled: - mv -f wmops/log_*_all.txt wmops/*.js ${public_dir}/ - cp ci/complexity_measurements/index_complexity.html ${public_dir}/index.html # patch the format in the title - - sed -i "s/IVAS FORMAT/<title>IVAS $format/g" ${public_dir}/index.html + - sed -i "s/<title>IVAS FORMAT/<title>IVAS $in_format to $out_format/g" ${public_dir}/index.html # do separately here to avoid overwrite complaints by mv - mv -f ci/complexity_measurements/style.css ${public_dir}/ @@ -973,8 +973,9 @@ measure-complexity-linux-stereo-test: - *print-common-info - *update-ltv-repo - *complexity-measurements-setup - - format=stereo - - bash ci/complexity_measurements/getWmops.sh $stereo + - in_format=stereo + - out_format=stereo + - bash ci/complexity_measurements/getWmops.sh $in_format $out_format - *complexity-measurements-prepare-artifacts measure-complexity-linux-ism-test: @@ -984,8 +985,9 @@ measure-complexity-linux-ism-test: - *print-common-info - *update-ltv-repo - *complexity-measurements-setup - - format=ISM - - bash ci/complexity_measurements/getWmops.sh "ISM1 ISM2 ISM3 ISM4" + - in_format=ISM + - out_format=EXT + - bash ci/complexity_measurements/getWmops.sh "ISM1 ISM2 ISM3 ISM4" $out_format - *complexity-measurements-prepare-artifacts measure-complexity-linux-sba-test: @@ -995,8 +997,9 @@ measure-complexity-linux-sba-test: - *print-common-info - *update-ltv-repo - *complexity-measurements-setup - - format=SBA - - bash ci/complexity_measurements/getWmops.sh $format + - in_format=SBA + - out_format=HOA3 + - bash ci/complexity_measurements/getWmops.sh $in_format $out_format - *complexity-measurements-prepare-artifacts measure-complexity-linux-mc-test: @@ -1006,8 +1009,9 @@ measure-complexity-linux-mc-test: - *print-common-info - *update-ltv-repo - *complexity-measurements-setup - - format=MC - - bash ci/complexity_measurements/getWmops.sh $format + - in_format=MC + - out_format=7_1_4 + - bash ci/complexity_measurements/getWmops.sh $in_format $out_format - *complexity-measurements-prepare-artifacts measure-complexity-linux-masa-test: @@ -1017,8 +1021,9 @@ measure-complexity-linux-masa-test: - *print-common-info - *update-ltv-repo - *complexity-measurements-setup - - format=MASA - - bash ci/complexity_measurements/getWmops.sh $format + - in_format=MASA + - out_format=EXT + - bash ci/complexity_measurements/getWmops.sh $in_format $out_format - *complexity-measurements-prepare-artifacts measure-complexity-linux-StereoDmxEVS-test: @@ -1028,8 +1033,9 @@ measure-complexity-linux-StereoDmxEVS-test: - *print-common-info - *update-ltv-repo - *complexity-measurements-setup - - format=StereoDmxEVS - - bash ci/complexity_measurements/getWmops.sh $format + - in_format=StereoDmxEVS + - out_format=mono + - bash ci/complexity_measurements/getWmops.sh $format $out_format - *complexity-measurements-prepare-artifacts # --------------------------------------------------------------- diff --git a/ci/complexity_measurements/getWmops.sh b/ci/complexity_measurements/getWmops.sh index 6fbcd371e9..3eb018dda9 100755 --- a/ci/complexity_measurements/getWmops.sh +++ b/ci/complexity_measurements/getWmops.sh @@ -29,12 +29,13 @@ # the United Nations Convention on Contracts on the International Sales of Goods. # get format from command line -if [ $# -ne 1 ]; then - echo "Usage: $0 ivas-format" +if [ $# -ne 2 ]; then + echo "Usage: $0 \"ivas-format(s)\" \"output-format(s)\"" exit 1 fi ivas_format=$1 +output_format=$2 date=`date +%Y%m%d` # used for log-file file ending shortDate=`date "+%b %d" | sed -e "s/\ /_/g"` # stored in the log-file @@ -56,8 +57,8 @@ wmopsFilenameFlc48kHzLast=wmops_newsletter_stereo_48kHz__${commit_sha}_${date} wmopsFilenameFlc48kHz=${destDir}/wmops/logs/${wmopsFilenameFlc48kHzLast} # instrument and build -./scripts/IvasBuildAndRunChecks.py -p $config_file --checks COMPLEXITY --create_complexity_tables ${wmopsFilenameFlc} -C $ivas_format -U $duration -f ${ep} -./scripts/IvasBuildAndRunChecks.py -p $config_file --checks COMPLEXITY --create_complexity_tables ${wmopsFilenameFlc48kHz} -C $ivas_format -R 48 -S 48 -U $duration -f ${ep} +./scripts/IvasBuildAndRunChecks.py -p $config_file --checks COMPLEXITY --create_complexity_tables ${wmopsFilenameFlc} -C $ivas_format -U $duration -f ${ep} --oc $output_format +./scripts/IvasBuildAndRunChecks.py -p $config_file --checks COMPLEXITY --create_complexity_tables ${wmopsFilenameFlc48kHz} -C $ivas_format -R 48 -S 48 -U $duration -f ${ep} --oc $output_format # now get the info on worst case operating point: WMOPS number, enc-operating mode, dec-operating mode ### WMOPS -- GitLab From 5f232ae3004777bd2a4459ecb935ccd29a5b601d Mon Sep 17 00:00:00 2001 From: knj <jan.kiene@iis.fraunhofer.de> Date: Mon, 14 Nov 2022 15:44:02 +0100 Subject: [PATCH 30/42] fix other forgotten tooltip parts --- ci/complexity_measurements/index_complexity.html | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/ci/complexity_measurements/index_complexity.html b/ci/complexity_measurements/index_complexity.html index ad061c58af..e8b8b48b42 100755 --- a/ci/complexity_measurements/index_complexity.html +++ b/ci/complexity_measurements/index_complexity.html @@ -702,7 +702,10 @@ function WMOPS_perOP() { elt.bind("plothover", function (event, pos, item) { if (!item) { - $("#tooltip").remove(); + // only remove if not in tooltip anymore + if ($('#tooltip:hover').length == 0) { + $("#tooltip").remove(); + } previousPoint = null; return; } @@ -810,7 +813,10 @@ function WMOPS_perOP() { elt.bind("plothover", function (event, pos, item) { if (!item) { - $("#tooltip").remove(); + // only remove if not in tooltip anymore + if ($('#tooltip:hover').length == 0) { + $("#tooltip").remove(); + } previousPoint = null; return; } @@ -976,7 +982,10 @@ function WMOPS_perOP_48kHz() { elt.bind("plothover", function (event, pos, item) { if (!item) { - $("#tooltip").remove(); + // only remove if not in tooltip anymore + if ($('#tooltip:hover').length == 0) { + $("#tooltip").remove(); + } previousPoint = null; return; } -- GitLab From e97c323d48f9c9f7063bbe59fd870fe2d3e2098f Mon Sep 17 00:00:00 2001 From: knj <jan.kiene@iis.fraunhofer.de> Date: Mon, 14 Nov 2022 15:52:17 +0100 Subject: [PATCH 31/42] archive newsletter logs so they can be linked to on the page --- .gitlab-ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7d0d4268ab..c415012143 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -939,6 +939,7 @@ coverage-test-on-main-scheduled: # if is needed to catch case when no artifact is there (first run), similarly as above - if [[ -d $public_dir ]]; then mv $public_dir/* wmops/; fi - ls wmops + - rm -rf wmops/logs/* - rm artifacts.zip - rm -rf $public_dir @@ -947,6 +948,9 @@ coverage-test-on-main-scheduled: - public_dir="$CI_JOB_NAME-public" - mkdir $public_dir - mv -f wmops/log_*_all.txt wmops/*.js ${public_dir}/ + # move logfiles for links + - mkdir $public_dir/logs + - mv wmops/logs/wmops_newsletter_* $public_dir/logs/ - cp ci/complexity_measurements/index_complexity.html ${public_dir}/index.html # patch the format in the title - sed -i "s/<title>IVAS FORMAT/<title>IVAS $in_format to $out_format/g" ${public_dir}/index.html -- GitLab From 2ddea5708eac6d725eba71e369db9c5e275a8654 Mon Sep 17 00:00:00 2001 From: knj <jan.kiene@iis.fraunhofer.de> Date: Mon, 14 Nov 2022 16:26:48 +0100 Subject: [PATCH 32/42] also archive log files --- .gitlab-ci.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c415012143..e8907b6776 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -939,7 +939,6 @@ coverage-test-on-main-scheduled: # if is needed to catch case when no artifact is there (first run), similarly as above - if [[ -d $public_dir ]]; then mv $public_dir/* wmops/; fi - ls wmops - - rm -rf wmops/logs/* - rm artifacts.zip - rm -rf $public_dir @@ -949,8 +948,11 @@ coverage-test-on-main-scheduled: - mkdir $public_dir - mv -f wmops/log_*_all.txt wmops/*.js ${public_dir}/ # move logfiles for links + - log_files=$(cat graphs_wmops_flc.js | grep logFile | sed "s/.*\(wmops_newsletter_.*\.csv\).*/\1/g") + - echo $log_files - mkdir $public_dir/logs - - mv wmops/logs/wmops_newsletter_* $public_dir/logs/ + - for f in $log_files; do mv wmops/logs/$f $public_dir/logs/$f; done + # copy index page blueprint - cp ci/complexity_measurements/index_complexity.html ${public_dir}/index.html # patch the format in the title - sed -i "s/<title>IVAS FORMAT/<title>IVAS $in_format to $out_format/g" ${public_dir}/index.html -- GitLab From dbe7c8c57b5c81ce397c4dfde420fb0200531e52 Mon Sep 17 00:00:00 2001 From: knj <jan.kiene@iis.fraunhofer.de> Date: Mon, 14 Nov 2022 16:52:55 +0100 Subject: [PATCH 33/42] copy logs from correct dir and also copy logs for 48kHz --- .gitlab-ci.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e8907b6776..c629071e26 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -948,10 +948,14 @@ coverage-test-on-main-scheduled: - mkdir $public_dir - mv -f wmops/log_*_all.txt wmops/*.js ${public_dir}/ # move logfiles for links - - log_files=$(cat graphs_wmops_flc.js | grep logFile | sed "s/.*\(wmops_newsletter_.*\.csv\).*/\1/g") - - echo $log_files - mkdir $public_dir/logs + # first move logs for "native" sampling rate + - log_files=$(cat wmops/graphs_wmops_flc.js | grep logFile | sed "s/.*\(wmops_newsletter_.*\.csv\).*/\1/g") + - echo $log_files - for f in $log_files; do mv wmops/logs/$f $public_dir/logs/$f; done + - log_files_48=$(cat wmops/graphs_wmops_flc_48kHz.js | grep logFile | sed "s/.*\(wmops_newsletter_.*\.csv\).*/\1/g") + - echo $log_files_48 + - for f in $log_files_48; do mv wmops/logs/$f $public_dir/logs/$f; done # copy index page blueprint - cp ci/complexity_measurements/index_complexity.html ${public_dir}/index.html # patch the format in the title -- GitLab From ad992978c898baa4f3aa0f8f42c6dc4354b804ec Mon Sep 17 00:00:00 2001 From: knj <jan.kiene@iis.fraunhofer.de> Date: Mon, 14 Nov 2022 17:01:59 +0100 Subject: [PATCH 34/42] fixes in job --- .gitlab-ci.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c629071e26..7a623bf245 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -950,10 +950,10 @@ coverage-test-on-main-scheduled: # move logfiles for links - mkdir $public_dir/logs # first move logs for "native" sampling rate - - log_files=$(cat wmops/graphs_wmops_flc.js | grep logFile | sed "s/.*\(wmops_newsletter_.*\.csv\).*/\1/g") + - log_files=$(cat $public_dir/graphs_wmops_flc.js | grep logFile | sed "s/.*\(wmops_newsletter_.*\.csv\).*/\1/g") - echo $log_files - for f in $log_files; do mv wmops/logs/$f $public_dir/logs/$f; done - - log_files_48=$(cat wmops/graphs_wmops_flc_48kHz.js | grep logFile | sed "s/.*\(wmops_newsletter_.*\.csv\).*/\1/g") + - log_files_48=$(cat $public_dir/graphs_wmops_flc_48kHz.js | grep logFile | sed "s/.*\(wmops_newsletter_.*\.csv\).*/\1/g") - echo $log_files_48 - for f in $log_files_48; do mv wmops/logs/$f $public_dir/logs/$f; done # copy index page blueprint @@ -985,7 +985,7 @@ measure-complexity-linux-stereo-test: - *complexity-measurements-setup - in_format=stereo - out_format=stereo - - bash ci/complexity_measurements/getWmops.sh $in_format $out_format + - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" - *complexity-measurements-prepare-artifacts measure-complexity-linux-ism-test: @@ -997,7 +997,7 @@ measure-complexity-linux-ism-test: - *complexity-measurements-setup - in_format=ISM - out_format=EXT - - bash ci/complexity_measurements/getWmops.sh "ISM1 ISM2 ISM3 ISM4" $out_format + - bash ci/complexity_measurements/getWmops.sh "ISM1 ISM2 ISM3 ISM4" "$out_format" - *complexity-measurements-prepare-artifacts measure-complexity-linux-sba-test: @@ -1009,7 +1009,7 @@ measure-complexity-linux-sba-test: - *complexity-measurements-setup - in_format=SBA - out_format=HOA3 - - bash ci/complexity_measurements/getWmops.sh $in_format $out_format + - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" - *complexity-measurements-prepare-artifacts measure-complexity-linux-mc-test: @@ -1021,7 +1021,7 @@ measure-complexity-linux-mc-test: - *complexity-measurements-setup - in_format=MC - out_format=7_1_4 - - bash ci/complexity_measurements/getWmops.sh $in_format $out_format + - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" - *complexity-measurements-prepare-artifacts measure-complexity-linux-masa-test: @@ -1033,7 +1033,7 @@ measure-complexity-linux-masa-test: - *complexity-measurements-setup - in_format=MASA - out_format=EXT - - bash ci/complexity_measurements/getWmops.sh $in_format $out_format + - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" - *complexity-measurements-prepare-artifacts measure-complexity-linux-StereoDmxEVS-test: @@ -1045,7 +1045,7 @@ measure-complexity-linux-StereoDmxEVS-test: - *complexity-measurements-setup - in_format=StereoDmxEVS - out_format=mono - - bash ci/complexity_measurements/getWmops.sh $format $out_format + - bash ci/complexity_measurements/getWmops.sh "$format" "$out_format" - *complexity-measurements-prepare-artifacts # --------------------------------------------------------------- -- GitLab From 6baa1d5d36f8a75ca0b57830bc8396643ebf926a Mon Sep 17 00:00:00 2001 From: knj <jan.kiene@iis.fraunhofer.de> Date: Mon, 14 Nov 2022 17:11:30 +0100 Subject: [PATCH 35/42] mv only if file exists --- .gitlab-ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7a623bf245..545ac683d3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -952,10 +952,11 @@ coverage-test-on-main-scheduled: # first move logs for "native" sampling rate - log_files=$(cat $public_dir/graphs_wmops_flc.js | grep logFile | sed "s/.*\(wmops_newsletter_.*\.csv\).*/\1/g") - echo $log_files - - for f in $log_files; do mv wmops/logs/$f $public_dir/logs/$f; done + - ls wmops/logs + - for f in $log_files; do [ -f wmops/logs/$f ] && mv wmops/logs/$f $public_dir/logs/$f; done - log_files_48=$(cat $public_dir/graphs_wmops_flc_48kHz.js | grep logFile | sed "s/.*\(wmops_newsletter_.*\.csv\).*/\1/g") - echo $log_files_48 - - for f in $log_files_48; do mv wmops/logs/$f $public_dir/logs/$f; done + - for f in $log_files_48; do [ -f wmops/logs/$f ] && mv wmops/logs/$f $public_dir/logs/$f; done # copy index page blueprint - cp ci/complexity_measurements/index_complexity.html ${public_dir}/index.html # patch the format in the title -- GitLab From 2fd36347f19102dd4183d865f67f7e8ef132c496 Mon Sep 17 00:00:00 2001 From: knj <jan.kiene@iis.fraunhofer.de> Date: Mon, 14 Nov 2022 18:47:10 +0100 Subject: [PATCH 36/42] put format in headings as well --- .gitlab-ci.yml | 2 +- .../index_complexity.html | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 545ac683d3..6be21fe25e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -960,7 +960,7 @@ coverage-test-on-main-scheduled: # copy index page blueprint - cp ci/complexity_measurements/index_complexity.html ${public_dir}/index.html # patch the format in the title - - sed -i "s/<title>IVAS FORMAT/<title>IVAS $in_format to $out_format/g" ${public_dir}/index.html + - sed -i "s/IVAS FORMAT/IVAS $in_format to $out_format/g" ${public_dir}/index.html # do separately here to avoid overwrite complaints by mv - mv -f ci/complexity_measurements/style.css ${public_dir}/ diff --git a/ci/complexity_measurements/index_complexity.html b/ci/complexity_measurements/index_complexity.html index e8b8b48b42..26ba82c546 100755 --- a/ci/complexity_measurements/index_complexity.html +++ b/ci/complexity_measurements/index_complexity.html @@ -142,7 +142,7 @@ </div> <div id="content"> - <h1 id="sec:graph-wmops">IVAS Stereo - Worst Case WMOPS Performance (Float, native SR)</h1> + <h1 id="sec:graph-wmops">IVAS FORMAT - Worst Case WMOPS Performance (Float, native SR)</h1> <div class="graph-container"> <div id="wmops-graph"></div> @@ -163,7 +163,7 @@ <hr /> - <h1 id="sec:graph-wmops_per_op">IVAS Stereo - Worst Case WMOPS Performance + <h1 id="sec:graph-wmops_per_op">IVAS FORMAT - Worst Case WMOPS Performance per Operating Point (Float, native SR)</h1> <div class="graph-container"> @@ -177,7 +177,7 @@ <hr /> - <h1 id="sec:graph-wmops_48kHz">IVAS Stereo - Worst Case WMOPS Performance (Float, 48 kHz)</h1> + <h1 id="sec:graph-wmops_48kHz">IVAS FORMAT - Worst Case WMOPS Performance (Float, 48 kHz)</h1> <div class="graph-container"> <div id="wmops-48kHz-graph"></div> @@ -198,7 +198,7 @@ <hr /> - <h1 id="sec:graph-wmops_per_op_48kHz">IVAS Stereo - Worst Case WMOPS Performance + <h1 id="sec:graph-wmops_per_op_48kHz">IVAS FORMAT - Worst Case WMOPS Performance per Operating Point (Float, 48 kHz)</h1> <div class="graph-container"> @@ -214,7 +214,7 @@ <!-- - <h1 id="sec:graph-wmops-basop">IVAS Stereo - Worst Case WMOPS Performance (BASOP)</h1> + <h1 id="sec:graph-wmops-basop">IVAS FORMAT - Worst Case WMOPS Performance (BASOP)</h1> <div class="graph-container"> <div id="wmops-graph-basop"></div> @@ -235,7 +235,7 @@ <hr /> - <h1 id="sec:graph-wmops_basop_per_op">IVAS Stereo - Worst Case WMOPS Performance + <h1 id="sec:graph-wmops_basop_per_op">IVAS FORMAT - Worst Case WMOPS Performance per Operating Point (BASOP)</h1> <div class="graph-container"> @@ -248,7 +248,7 @@ <hr /> - <h1 id="sec:graph-conversion_factors_basop_flc">IVAS Stereo - Measured WMOPS + <h1 id="sec:graph-conversion_factors_basop_flc">IVAS FORMAT - Measured WMOPS Conversion Factors BASOP / Float</h1> @@ -263,7 +263,7 @@ <hr /> --> - <h1 id="sec:graph-ram">IVAS Stereo - Worst Case RAM Demand (Float)</h1> + <h1 id="sec:graph-ram">IVAS FORMAT - Worst Case RAM Demand (Float)</h1> <div class="graph-container"> <div id="ram-graph"></div> @@ -297,7 +297,7 @@ <hr /> <!-- - <h1 id="sec:graph-ram-basop">IVAS Stereo - Worst Case RAM Demand (BASOP)</h1> + <h1 id="sec:graph-ram-basop">IVAS FORMAT - Worst Case RAM Demand (BASOP)</h1> <div class="graph-container"> <div id="ram-graph-basop"></div> @@ -322,7 +322,7 @@ <hr /> --> - <h1 id="sec:graph-rom">IVAS Stereo - Worst Case ROM Demand (Float)</h1> + <h1 id="sec:graph-rom">IVAS FORMAT - Worst Case ROM Demand (Float)</h1> <div class="graph-container"> <div id="rom-graph"></div> @@ -338,7 +338,7 @@ <!-- <hr /> - <h1 id="sec:graph-rom-basop">IVAS Stereo - Worst Case ROM Demand (BASOP)</h1> + <h1 id="sec:graph-rom-basop">IVAS FORMAT - Worst Case ROM Demand (BASOP)</h1> <div class="graph-container"> <div id="rom-graph-basop"></div> @@ -354,7 +354,7 @@ <hr /> --> - <h1 id="sec:graph-prom">IVAS Stereo - Worst Case PROM Demand</h1> + <h1 id="sec:graph-prom">IVAS FORMAT - Worst Case PROM Demand</h1> <div class="graph-container"> <div id="prom-graph"></div> -- GitLab From c6f981822c20a6461dbbafe0a842e0d2b9ce34b5 Mon Sep 17 00:00:00 2001 From: knj <jan.kiene@iis.fraunhofer.de> Date: Tue, 15 Nov 2022 09:39:32 +0100 Subject: [PATCH 37/42] fix variable usage --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c638cfc35e..35e1ab5d7f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1046,7 +1046,7 @@ measure-complexity-linux-StereoDmxEVS-test: - *complexity-measurements-setup - in_format=StereoDmxEVS - out_format=mono - - bash ci/complexity_measurements/getWmops.sh "$format" "$out_format" + - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" - *complexity-measurements-prepare-artifacts # --------------------------------------------------------------- -- GitLab From fb03edbbb7e8bc28911b609c260278cbbf5d3ce4 Mon Sep 17 00:00:00 2001 From: knj <jan.kiene@iis.fraunhofer.de> Date: Tue, 15 Nov 2022 14:37:31 +0100 Subject: [PATCH 38/42] change output formats --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 35e1ab5d7f..76026b4de9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -997,7 +997,7 @@ measure-complexity-linux-ism-test: - *update-ltv-repo - *complexity-measurements-setup - in_format=ISM - - out_format=EXT + - out_format=BINAURAL - bash ci/complexity_measurements/getWmops.sh "ISM1 ISM2 ISM3 ISM4" "$out_format" - *complexity-measurements-prepare-artifacts @@ -1033,7 +1033,7 @@ measure-complexity-linux-masa-test: - *update-ltv-repo - *complexity-measurements-setup - in_format=MASA - - out_format=EXT + - out_format=7_1_4 - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" - *complexity-measurements-prepare-artifacts -- GitLab From 41ac732eb15f4448901b577cc6c28c3f8b5e9db8 Mon Sep 17 00:00:00 2001 From: knj <jan.kiene@iis.fraunhofer.de> Date: Thu, 17 Nov 2022 09:59:01 +0100 Subject: [PATCH 39/42] change tag to test on second runner --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bee2835af6..0c1b747093 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -970,7 +970,7 @@ coverage-test-on-main-scheduled: rules: - if: $MEASURE_COMPLEXITY_LINUX tags: - - test-complexity-measurement + - test-fhg-linux-runner2 stage: test artifacts: name: "$CI_JOB_NAME--$CI_COMMIT_REF_NAME--sha-$CI_COMMIT_SHA" -- GitLab From a721f7dfb6de5c4b739522b6406742ad874f8361 Mon Sep 17 00:00:00 2001 From: knj <jan.kiene@iis.fraunhofer.de> Date: Thu, 17 Nov 2022 10:24:11 +0100 Subject: [PATCH 40/42] change tag to test other runner --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0c1b747093..b332fe7d93 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -970,7 +970,7 @@ coverage-test-on-main-scheduled: rules: - if: $MEASURE_COMPLEXITY_LINUX tags: - - test-fhg-linux-runner2 + - test-nokia-linux-runner stage: test artifacts: name: "$CI_JOB_NAME--$CI_COMMIT_REF_NAME--sha-$CI_COMMIT_SHA" -- GitLab From 1fe554949c33eafd3e2019c321b48eee2e822d54 Mon Sep 17 00:00:00 2001 From: knj <jan.kiene@iis.fraunhofer.de> Date: Thu, 17 Nov 2022 11:20:48 +0100 Subject: [PATCH 41/42] make necessary changes for merging to main - remove duration limitation from getWmops.sh - setup complexity jobs to run in scheduled pipeline as for sanitizers --- .gitlab-ci.yml | 78 +++++++++++++++++--------- ci/complexity_measurements/getWmops.sh | 5 +- 2 files changed, 52 insertions(+), 31 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b332fe7d93..7edd3b867f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -964,22 +964,24 @@ coverage-test-on-main-scheduled: # do separately here to avoid overwrite complaints by mv - mv -f ci/complexity_measurements/style.css ${public_dir}/ -.measure-complexity-template: +.complexity-template: extends: + # still needed as long as no long MASA testvectors are there - .test-job-linux-needs-testv-dir - rules: - - if: $MEASURE_COMPLEXITY_LINUX tags: - - test-nokia-linux-runner + - test-complexity-measurement + timeout: 3 hours stage: test artifacts: name: "$CI_JOB_NAME--$CI_COMMIT_REF_NAME--sha-$CI_COMMIT_SHA" paths: - $CI_JOB_NAME-public -measure-complexity-linux-stereo-test: +complexity-stereo-in-stereo-out: extends: - - .measure-complexity-template + - .complexity-template + rules: + - if: $MEASURE_COMPLEXITY_LINUX script: - *print-common-info - *update-ltv-repo @@ -989,9 +991,13 @@ measure-complexity-linux-stereo-test: - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" - *complexity-measurements-prepare-artifacts -measure-complexity-linux-ism-test: +complexity-ism-in-binaural-out: extends: - - .measure-complexity-template + - .complexity-template + rules: + - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 1 hour script: - *print-common-info - *update-ltv-repo @@ -1001,9 +1007,13 @@ measure-complexity-linux-ism-test: - bash ci/complexity_measurements/getWmops.sh "ISM1 ISM2 ISM3 ISM4" "$out_format" - *complexity-measurements-prepare-artifacts -measure-complexity-linux-sba-test: +complexity-sba-hoa3-in-hoa3-out: extends: - - .measure-complexity-template + - .complexity-template + rules: + - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 3 hours script: - *print-common-info - *update-ltv-repo @@ -1013,9 +1023,13 @@ measure-complexity-linux-sba-test: - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" - *complexity-measurements-prepare-artifacts -measure-complexity-linux-mc-test: +complexity-mc-in-7_1_4-out: extends: - - .measure-complexity-template + - .complexity-template + rules: + - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 6 hours script: - *print-common-info - *update-ltv-repo @@ -1025,9 +1039,13 @@ measure-complexity-linux-mc-test: - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" - *complexity-measurements-prepare-artifacts -measure-complexity-linux-masa-test: +complexity-masa-in-7_1_4-out: extends: - - .measure-complexity-template + - .complexity-template + rules: + - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 9 hours script: - *print-common-info - *update-ltv-repo @@ -1037,9 +1055,13 @@ measure-complexity-linux-masa-test: - bash ci/complexity_measurements/getWmops.sh "$in_format" "$out_format" - *complexity-measurements-prepare-artifacts -measure-complexity-linux-StereoDmxEVS-test: +complexity-StereoDmxEVS-stereo-in-mono-out: extends: - - .measure-complexity-template + - .complexity-template + rules: + - if: $MEASURE_COMPLEXITY_LINUX + when: delayed + start_in: 10 hours script: - *print-common-info - *update-ltv-repo @@ -1068,38 +1090,38 @@ pages: - mkdir public # get artifacts for complexity jobs - - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-stereo-test) + - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch complexity-stereo-in-stereo-out) - echo $job_id - echo "$API_URL_BASE/$job_id/artifacts" - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_stereo.zip - cat artifacts_comp_stereo.zip - unzip -o artifacts_comp_stereo.zip - - mv measure-complexity-linux-stereo-test-public ./public/ + - mv complexity-stereo-in-stereo-out-public ./public/ - - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-ism-test) + - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch complexity-ism-in-binaural-out) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_ism.zip - unzip -o artifacts_comp_ism.zip - - mv measure-complexity-linux-ism-test-public ./public/ + - mv complexity-ism-in-binaural-out-public ./public/ - - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-sba-test) + - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch complexity-sba-hoa3-in-hoa3-out) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_sba.zip - unzip -o artifacts_comp_sba.zip - - mv measure-complexity-linux-sba-test-public ./public/ + - mv complexity-sba-hoa3-in-hoa3-out-public ./public/ - - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-mc-test) + - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch complexity-mc-in-7_1_4-out) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_mc.zip - unzip -o artifacts_comp_mc.zip - - mv measure-complexity-linux-mc-test-public ./public/ + - mv complexity-mc-in-7_1_4-out-public ./public/ - - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-masa-test) + - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch complexity-masa-in-7_1_4-out) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_masa.zip - unzip -o artifacts_comp_masa.zip - - mv measure-complexity-linux-masa-test-public ./public/ + - mv complexity-masa-in-7_1_4-out-public ./public/ - - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch measure-complexity-linux-StereoDmxEVS-test) + - job_id=$(python3 ci/get_id_of_last_job_occurence.py $branch complexity-StereoDmxEVS-stereo-in-mono-out) - curl --request GET "$API_URL_BASE/$job_id/artifacts" --output artifacts_comp_StereoDmxEVS.zip - unzip -o artifacts_comp_StereoDmxEVS.zip - - mv measure-complexity-linux-StereoDmxEVS-test-public ./public/ + - mv complexity-StereoDmxEVS-stereo-in-mono-out-public ./public/ - cp ci/index-pages.html public/index.html artifacts: diff --git a/ci/complexity_measurements/getWmops.sh b/ci/complexity_measurements/getWmops.sh index 3eb018dda9..40b5837017 100755 --- a/ci/complexity_measurements/getWmops.sh +++ b/ci/complexity_measurements/getWmops.sh @@ -46,7 +46,6 @@ commit_sha=`git rev-parse --short HEAD` destDir="." scriptDir="ci/complexity_measurements" ep="${scriptDir}/ep_10pct_fer.g192" -duration="2" config_file="scripts/config/ci_linux_ltv.json" @@ -57,8 +56,8 @@ wmopsFilenameFlc48kHzLast=wmops_newsletter_stereo_48kHz__${commit_sha}_${date} wmopsFilenameFlc48kHz=${destDir}/wmops/logs/${wmopsFilenameFlc48kHzLast} # instrument and build -./scripts/IvasBuildAndRunChecks.py -p $config_file --checks COMPLEXITY --create_complexity_tables ${wmopsFilenameFlc} -C $ivas_format -U $duration -f ${ep} --oc $output_format -./scripts/IvasBuildAndRunChecks.py -p $config_file --checks COMPLEXITY --create_complexity_tables ${wmopsFilenameFlc48kHz} -C $ivas_format -R 48 -S 48 -U $duration -f ${ep} --oc $output_format +./scripts/IvasBuildAndRunChecks.py -p $config_file --checks COMPLEXITY --create_complexity_tables ${wmopsFilenameFlc} -C $ivas_format -f ${ep} --oc $output_format +./scripts/IvasBuildAndRunChecks.py -p $config_file --checks COMPLEXITY --create_complexity_tables ${wmopsFilenameFlc48kHz} -C $ivas_format -R 48 -S 48 -f ${ep} --oc $output_format # now get the info on worst case operating point: WMOPS number, enc-operating mode, dec-operating mode ### WMOPS -- GitLab From d711419acef7cc14779b6c75d0a51af3d6427a6e Mon Sep 17 00:00:00 2001 From: knj <jan.kiene@iis.fraunhofer.de> Date: Thu, 17 Nov 2022 11:23:47 +0100 Subject: [PATCH 42/42] remove unnecessary debug output --- .gitlab-ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7edd3b867f..49ff0c6df1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -932,7 +932,6 @@ coverage-test-on-main-scheduled: - job_id=$(python3 ci/get_id_of_last_job_occurence.py $CI_COMMIT_REF_NAME $CI_JOB_NAME) - echo $job_id - curl --request GET "https://forge.3gpp.org/rep/api/v4/projects/$CI_PROJECT_ID/jobs/$job_id/artifacts" --output artifacts.zip - - cat artifacts.zip - unzip artifacts.zip || true # this may fail on first run, when there are no artifacts there and the zip file is actually just "404"-html - ls - public_dir="$CI_JOB_NAME-public" -- GitLab