summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbin/analyze-archive.py18
-rwxr-xr-xbin/analyze-kconfig.py18
-rw-r--r--lib/functions.py7
-rw-r--r--lib/model.py18
-rw-r--r--lib/parameters.py3
-rw-r--r--lib/validation.py2
6 files changed, 57 insertions, 9 deletions
diff --git a/bin/analyze-archive.py b/bin/analyze-archive.py
index 0a2845c..5f6be9a 100755
--- a/bin/analyze-archive.py
+++ b/bin/analyze-archive.py
@@ -935,11 +935,16 @@ if __name__ == "__main__":
)
if xv_method == "montecarlo":
- analytic_quality, _ = xv.montecarlo(lambda m: m.get_fitted()[0], xv_count)
+ analytic_quality, xv_analytic_models = xv.montecarlo(
+ lambda m: m.get_fitted()[0], xv_count
+ )
elif xv_method == "kfold":
- analytic_quality, _ = xv.kfold(lambda m: m.get_fitted()[0], xv_count)
+ analytic_quality, xv_analytic_models = xv.kfold(
+ lambda m: m.get_fitted()[0], xv_count
+ )
else:
analytic_quality = model.assess(param_model)
+ xv_analytic_models = None
if "tex" in show_models or "tex" in show_quality:
print_text_model_data(
@@ -1053,7 +1058,14 @@ if __name__ == "__main__":
if args.export_dref:
dref = raw_data.to_dref()
- dref.update(model.to_dref(static_quality, lut_quality, analytic_quality))
+ dref.update(
+ model.to_dref(
+ static_quality,
+ lut_quality,
+ analytic_quality,
+ xv_models=xv_analytic_models,
+ )
+ )
dref["constructor duration"] = (constructor_duration, r"\second")
dref["regression duration"] = (fit_duration, r"\second")
with open(args.export_dref, "w") as f:
diff --git a/bin/analyze-kconfig.py b/bin/analyze-kconfig.py
index 048c8c9..684d6b3 100755
--- a/bin/analyze-kconfig.py
+++ b/bin/analyze-kconfig.py
@@ -238,7 +238,9 @@ def main():
if xv_method == "montecarlo":
static_quality, _ = xv.montecarlo(lambda m: m.get_static(), xv_count)
- analytic_quality, _ = xv.montecarlo(lambda m: m.get_fitted()[0], xv_count)
+ analytic_quality, xv_analytic_models = xv.montecarlo(
+ lambda m: m.get_fitted()[0], xv_count
+ )
if lut_model:
lut_quality, _ = xv.montecarlo(
lambda m: m.get_param_lut(fallback=True), xv_count
@@ -247,7 +249,9 @@ def main():
lut_quality = None
elif xv_method == "kfold":
static_quality, _ = xv.kfold(lambda m: m.get_static(), xv_count)
- analytic_quality, _ = xv.kfold(lambda m: m.get_fitted()[0], xv_count)
+ analytic_quality, xv_analytic_models = xv.kfold(
+ lambda m: m.get_fitted()[0], xv_count
+ )
if lut_model:
lut_quality, _ = xv.kfold(
lambda m: m.get_param_lut(fallback=True), xv_count
@@ -257,6 +261,7 @@ def main():
else:
static_quality = model.assess(static_model)
analytic_quality = model.assess(param_model)
+ xv_analytic_models = none
if lut_model:
lut_quality = model.assess(lut_model)
else:
@@ -324,7 +329,14 @@ def main():
static_quality = model.assess(static_model)
if args.export_dref:
- dref.update(model.to_dref(static_quality, lut_quality, analytic_quality))
+ dref.update(
+ model.to_dref(
+ static_quality,
+ lut_quality,
+ analytic_quality,
+ xv_models=xv_analytic_models,
+ )
+ )
dref["constructor duration"] = (constructor_duration, r"\second")
dref["regression duration"] = (fit_duration, r"\second")
with open(args.export_dref, "w") as f:
diff --git a/lib/functions.py b/lib/functions.py
index 320e8ed..5358d8e 100644
--- a/lib/functions.py
+++ b/lib/functions.py
@@ -339,6 +339,13 @@ class SplitFunction(ModelFunction):
ret += 1
return ret
+ def get_max_depth(self):
+ ret = [0]
+ for v in self.child.values():
+ if type(v) is SplitFunction:
+ ret.append(v.get_max_depth())
+ return 1 + max(ret)
+
@classmethod
def from_json(cls, data):
assert data["type"] == "split"
diff --git a/lib/model.py b/lib/model.py
index 4f5f60f..5a44c7b 100644
--- a/lib/model.py
+++ b/lib/model.py
@@ -449,7 +449,9 @@ class AnalyticModel:
threshold=threshold,
)
- def to_dref(self, static_quality, lut_quality, model_quality) -> dict:
+ def to_dref(
+ self, static_quality, lut_quality, model_quality, xv_models=None
+ ) -> dict:
ret = dict()
for name in self.names:
param_data = {
@@ -546,6 +548,20 @@ class AnalyticModel:
)
except KeyError:
logger.warning(f"{name} {attr_name} param model has no MAPE")
+
+ if xv_models is not None:
+ keys = ("decision tree/nodes", "decision tree/max depth")
+ entry = dict()
+ for k in keys:
+ entry[k] = list()
+ for xv_model in xv_models:
+ dref = xv_model.attr_by_name[name][attr_name].to_dref()
+ for k in keys:
+ if k in dref:
+ entry[k].append(dref[k])
+ for k in keys:
+ if len(entry[k]):
+ ret[k] = np.mean(entry[k])
return ret
def to_json(self, **kwargs) -> dict:
diff --git a/lib/parameters.py b/lib/parameters.py
index 9cfe145..38e36b2 100644
--- a/lib/parameters.py
+++ b/lib/parameters.py
@@ -652,7 +652,8 @@ class ModelAttribute:
ret = {"mean": (self.mean, unit), "median": (self.median, unit)}
if type(self.model_function) is df.SplitFunction:
- ret["decision tree nodes"] = self.model_function.get_number_of_nodes()
+ ret["decision tree/nodes"] = self.model_function.get_number_of_nodes()
+ ret["decision tree/max depth"] = self.model_function.get_max_depth()
return ret
diff --git a/lib/validation.py b/lib/validation.py
index 5c65fe3..89bc67c 100644
--- a/lib/validation.py
+++ b/lib/validation.py
@@ -280,4 +280,4 @@ class CrossValidator:
validation, self.parameters, *self.args, **self.kwargs
)
- return training_model, validation_data.assess(training_model)
+ return training_data, validation_data.assess(training_model)