From a0eab2f7b957d05a5654eb05aedd7d0403686575 Mon Sep 17 00:00:00 2001 From: dmt <> Date: Fri, 18 Oct 2019 23:09:32 +0200 Subject: [PATCH] Log the construction result. --- cml/domain/construction.py | 56 +++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 16 deletions(-) diff --git a/cml/domain/construction.py b/cml/domain/construction.py index b223f01..cddc6d0 100644 --- a/cml/domain/construction.py +++ b/cml/domain/construction.py @@ -1,11 +1,32 @@ from functools import partial +from cml.shared.parameter import PROTOCOL_LEVEL + __all__ = ( "Constructor", ) +def log_construction(func): + def wrapper(self, learnblock): + for complete_learnblock in func(self, learnblock): + if self.logger and self.logger.level == PROTOCOL_LEVEL: + self.logger.protocol( + "\t".join([ + "", + str(complete_learnblock.length), + str(complete_learnblock.min_timestamp), + str(complete_learnblock.max_timestamp), + str(complete_learnblock.relatives), + str(complete_learnblock.n_cluster), + str(complete_learnblock.feature_count) + ])) + + yield complete_learnblock + return wrapper + + def update_construction(func): def wrapper(self, value): func(self, value) @@ -16,11 +37,13 @@ def update_construction(func): class Constructor: def __init__(self, ml_models, settings): + self.logger = None self.settings = settings self.ml_models = ml_models + self._logging_dir = None self._construction = None - self._construction_type = "conceptual" + @log_construction def construct(self, learnblock): for block in self._construction(learnblock): yield block @@ -63,20 +86,18 @@ class Constructor: @property def construction_type(self): - return self._construction_type + return self.settings.construct_type @construction_type.setter def construction_type(self, construct_type): - if construct_type == "conceptual": - self._construction_type = construct_type + if self.settings.construct_type == "conceptual": self._construction = partial( self._construct_conceptual_knowledge, categorial_complexity=self.settings.max_categories, min_category_size=self.settings.min_category_size, ) - elif construct_type == "procedural": - self._construction_type = construct_type + elif self.settings.construct_type == "procedural": self._construction = partial( self._construct_procedural_knowledge, procedural_complexity=self.settings.max_model_targets, @@ -92,26 +113,29 @@ class Constructor: categorial_complexity=None, min_category_size=None): for ml_model in self.ml_models: - for cluster_number in range(2, categorial_complexity): + for cluster_number in range(2, categorial_complexity+1): ml_model.cluster = cluster_number trained_model = ml_model.train(learnblock) for cluster, size in trained_model.cluster_sizes.items(): - print(cluster, size) if size < min_category_size: continue labels = trained_model.get_labels() - labeld_learnblock = learnblock.set_labels(labels) - yield labeld_learnblock + labeled_learnblock = learnblock.set_labels(labels) + labeled_learnblock.n_cluster = cluster_number + yield labeled_learnblock def _construct_procedural_knowledge(self, learnblock, procedural_complexity=None, max_target_error=None): for ml_model in self.ml_models: - for target_number in range(2, procedural_complexity): - ml_model.target_number = target_number - trained_model = ml_model.train(learnblock) + for target_number in range(2, procedural_complexity+1): + model = ml_model() + model.io_shape = learnblock.learn_rows + model.target_number = target_number + trained_model = model.train(learnblock.as_numpy_array()) if trained_model.target_error < max_target_error: - labeld_learnblock = learnblock.set_labels(trained_model) - yield labeld_learnblock - + for labels in trained_model.targets: + labeled_learnblock = learnblock.set_labels(list(labels)) + labeled_learnblock.n_cluster = target_number + yield labeled_learnblock -- GitLab