From 323a99b6bdabce8a157c9d0768bdfcf52b265f04 Mon Sep 17 00:00:00 2001
From: Daniel Friesel <daniel.friesel@uos.de>
Date: Thu, 18 Nov 2021 12:35:58 +0100
Subject: add model generation time to dataref export

---
 bin/analyze-archive.py |  7 +++++++
 bin/analyze-kconfig.py | 23 ++++++++++++++++-------
 2 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/bin/analyze-archive.py b/bin/analyze-archive.py
index 0835c90..c66570e 100755
--- a/bin/analyze-archive.py
+++ b/bin/analyze-archive.py
@@ -42,6 +42,7 @@ import logging
 import random
 import re
 import sys
+import time
 import dfatool.cli
 from dfatool import plotter
 from dfatool.loader import RawData, pta_trace_to_aggregate
@@ -640,6 +641,7 @@ if __name__ == "__main__":
         by_name, z_limit=args.z_score, remove_outliers=args.remove_outliers
     )
 
+    constructor_start = time.time()
     model = PTAModel(
         by_name,
         parameters,
@@ -649,6 +651,7 @@ if __name__ == "__main__":
         pta=pta,
         pelt=args.with_substates,
     )
+    constructor_duration = time.time() - constructor_start
 
     if xv_method:
         xv = CrossValidator(PTAModel, by_name, parameters, arg_count)
@@ -829,9 +832,11 @@ if __name__ == "__main__":
         print("--- param model ---")
 
     # get_fitted_sub -> with sub-state detection and modeling
+    fit_start_time = time.time()
     param_model, param_info = model.get_fitted(
         safe_functions_enabled=safe_functions_enabled
     )
+    fit_duration = time.time() - fit_start_time
 
     if "paramdetection" in show_models or "all" in show_models:
         for name in model.names:
@@ -1058,6 +1063,8 @@ if __name__ == "__main__":
     if args.export_dref:
         dref = raw_data.to_dref()
         dref.update(model.to_dref(static_quality, lut_quality, analytic_quality))
+        dref["constructor duration"] = (constructor_duration, r"\second")
+        dref["regression duration"] = (fit_duration, r"\second")
         with open(args.export_dref, "w") as f:
             for k, v in dref.items():
                 if type(v) is not tuple:
diff --git a/bin/analyze-kconfig.py b/bin/analyze-kconfig.py
index be52752..55bf53b 100755
--- a/bin/analyze-kconfig.py
+++ b/bin/analyze-kconfig.py
@@ -12,6 +12,7 @@ import json
 import kconfiglib
 import logging
 import os
+import time
 
 import numpy as np
 
@@ -146,13 +147,6 @@ def main():
         if args.show_nop_symbols:
             show_nop_symbols(attributes)
 
-        if args.sample_size:
-            shuffled_data_indices = np.random.permutation(
-                np.arange(len(attributes.data))
-            )
-            sample_indices = shuffled_data_indices[: args.sample_size]
-            raise RuntimeError("Not Implemented")
-
         observations = list()
 
         for param, attr in attributes.data:
@@ -165,6 +159,14 @@ def main():
                     }
                 )
 
+        if args.sample_size:
+            shuffled_data_indices = np.random.permutation(np.arange(len(observations)))
+            sample_indices = shuffled_data_indices[: args.sample_size]
+            new_observations = list()
+            for sample_index in sample_indices:
+                new_observations.append(observations[sample_index])
+            observations = new_observations
+
         if args.export_observations:
             import lzma
 
@@ -205,6 +207,7 @@ def main():
     else:
         max_std = None
 
+    constructor_start = time.time()
     model = AnalyticModel(
         by_name,
         parameter_names,
@@ -212,6 +215,7 @@ def main():
         force_tree=args.force_tree,
         max_std=max_std,
     )
+    constructor_duration = time.time() - constructor_start
 
     if args.cross_validate:
         xv_method, xv_count = args.cross_validate.split(":")
@@ -237,7 +241,10 @@ def main():
         else:
             logging.warning(f"Skipping LUT model: {e}")
         lut_model = None
+
+    fit_start_time = time.time()
     param_model, param_info = model.get_fitted()
+    fit_duration = time.time() - fit_start_time
 
     if xv_method == "montecarlo":
         static_quality = xv.montecarlo(lambda m: m.get_static(), xv_count)
@@ -326,6 +333,8 @@ def main():
 
     if args.export_dref:
         dref.update(model.to_dref(static_quality, lut_quality, analytic_quality))
+        dref["constructor duration"] = (constructor_duration, r"\second")
+        dref["regression duration"] = (fit_duration, r"\second")
         with open(args.export_dref, "w") as f:
             for k, v in dref.items():
                 if type(v) is not tuple:
-- 
cgit v1.2.3