diff options
-rwxr-xr-x | bin/analyze-archive.py | 18 | ||||
-rwxr-xr-x | bin/analyze-kconfig.py | 18 | ||||
-rw-r--r-- | lib/functions.py | 7 | ||||
-rw-r--r-- | lib/model.py | 18 | ||||
-rw-r--r-- | lib/parameters.py | 3 | ||||
-rw-r--r-- | lib/validation.py | 2 |
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) |