From 4f763f85e9f572b56e3465ccd47641c71cdb8bbf Mon Sep 17 00:00:00 2001
From: Daniel Friesel <daniel.friesel@uos.de>
Date: Mon, 8 Mar 2021 14:20:42 +0100
Subject: add dataref export

---
 lib/loader.py     | 10 ++++++++++
 lib/model.py      | 42 ++++++++++++++++++++++++++++++++++++++++++
 lib/parameters.py |  4 ++++
 3 files changed, 56 insertions(+)

(limited to 'lib')

diff --git a/lib/loader.py b/lib/loader.py
index c0aa105..f5c6306 100644
--- a/lib/loader.py
+++ b/lib/loader.py
@@ -372,6 +372,16 @@ class RawData:
             }
             json.dump(cache_data, f)
 
+    def to_dref(self) -> dict:
+        return {
+            "raw measurements/valid": self.preprocessing_stats["num_valid"],
+            "raw measurements/total": self.preprocessing_stats["num_runs"],
+            "static state duration/mean": (
+                np.mean(list(map(lambda x: x["state_duration"], self.setup_by_fileno))),
+                r"\milli\second",
+            ),
+        }
+
     def _state_is_too_short(self, online, offline, state_duration, next_transition):
         # We cannot control when an interrupt causes a state to be left
         if next_transition["plan"]["level"] == "epilogue":
diff --git a/lib/model.py b/lib/model.py
index 527a19e..85cda71 100644
--- a/lib/model.py
+++ b/lib/model.py
@@ -311,6 +311,48 @@ class AnalyticModel:
 
         return {"by_name": detailed_results}
 
+    def to_dref(self, static_quality, lut_quality, model_quality) -> dict:
+        ret = dict()
+        for name in self.names:
+            for attr_name, attr in self.attr_by_name[name].items():
+                e_static = static_quality["by_name"][name][attr_name]
+                e_lut = lut_quality["by_name"][name][attr_name]
+                e_model = model_quality["by_name"][name][attr_name]
+                unit = None
+                if "power" in attr.attr:
+                    unit = r"\micro\watt"
+                elif "energy" in attr.attr:
+                    unit = r"\pico\joule"
+                elif attr.attr == "duration":
+                    unit = r"\micro\second"
+                for k, v in attr.to_dref(unit).items():
+                    ret[f"data/{name}/{attr_name}/{k}"] = v
+                ret[f"error/static/{name}/{attr_name}/mae"] = (e_static["mae"], unit)
+                ret[f"error/lut/{name}/{attr_name}/mae"] = (e_lut["mae"], unit)
+                ret[f"error/model/{name}/{attr_name}/mae"] = (e_model["mae"], unit)
+                ret[f"error/static/{name}/{attr_name}/smape"] = (
+                    e_static["smape"],
+                    r"\percent",
+                )
+                ret[f"error/lut/{name}/{attr_name}/smape"] = (
+                    e_lut["smape"],
+                    r"\percent",
+                )
+                ret[f"error/model/{name}/{attr_name}/smape"] = (
+                    e_model["smape"],
+                    r"\percent",
+                )
+                ret[f"error/static/{name}/{attr_name}/mape"] = (
+                    e_static["mape"],
+                    r"\percent",
+                )
+                ret[f"error/lut/{name}/{attr_name}/mape"] = (e_lut["mape"], r"\percent")
+                ret[f"error/model/{name}/{attr_name}/mape"] = (
+                    e_model["mape"],
+                    r"\percent",
+                )
+        return ret
+
     def to_json(self) -> dict:
         """
         Return JSON encoding of this AnalyticModel.
diff --git a/lib/parameters.py b/lib/parameters.py
index 5fd44c3..ac67c2a 100644
--- a/lib/parameters.py
+++ b/lib/parameters.py
@@ -616,6 +616,10 @@ class ModelAttribute:
         }
         return ret
 
+    def to_dref(self, unit=None):
+        ret = {"mean": (self.mean, unit), "median": (self.median, unit)}
+        return ret
+
     @staticmethod
     def from_json(cls, name, attr, data):
         param_names = data["paramNames"]
-- 
cgit v1.2.3