From bef24bd47c44243c5e436638b0f571cd1383980d Mon Sep 17 00:00:00 2001
From: dmt <>
Date: Sun, 20 Oct 2019 23:08:36 +0200
Subject: [PATCH] Construct only unlabeled learnblocks.

---
 cml/domain/construction.py | 57 ++++++++++++++++++++++----------------
 1 file changed, 33 insertions(+), 24 deletions(-)

diff --git a/cml/domain/construction.py b/cml/domain/construction.py
index cddc6d0..0317d64 100644
--- a/cml/domain/construction.py
+++ b/cml/domain/construction.py
@@ -42,6 +42,7 @@ class Constructor:
         self.ml_models = ml_models
         self._logging_dir = None
         self._construction = None
+        self._category = None
 
     @log_construction
     def construct(self, learnblock):
@@ -86,10 +87,10 @@ class Constructor:
 
     @property
     def construction_type(self):
-        return self.settings.construct_type
+        return self._category
 
     @construction_type.setter
-    def construction_type(self, construct_type):
+    def construction_type(self, construction_type):
         if self.settings.construct_type == "conceptual":
             self._construction = partial(
                 self._construct_conceptual_knowledge,
@@ -108,34 +109,42 @@ class Constructor:
             # TODO (dmt): Provide proper exception handling.
             raise Exception("Provide valid construction type.")
 
+        self._category = construction_type
+
     def _construct_conceptual_knowledge(self,
                                         learnblock,
                                         categorial_complexity=None,
                                         min_category_size=None):
-        for ml_model in self.ml_models:
-            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():
-                    if size < min_category_size:
-                        continue
-                    labels = trained_model.get_labels()
-                    labeled_learnblock = learnblock.set_labels(labels)
-                    labeled_learnblock.n_cluster = cluster_number
-                    yield labeled_learnblock
+        if learnblock.labeled:
+            yield learnblock
+        else:
+            for ml_model in self.ml_models:
+                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():
+                        if size < min_category_size:
+                            continue
+                        labels = trained_model.get_labels()
+                        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+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:
-                    for labels in trained_model.targets:
-                        labeled_learnblock = learnblock.set_labels(list(labels))
-                        labeled_learnblock.n_cluster = target_number
-                        yield labeled_learnblock
+        if learnblock.labeled:
+            yield learnblock
+        else:
+            for ml_model in self.ml_models:
+                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:
+                        for labels in trained_model.targets:
+                            labeled_learnblock = learnblock.set_labels(list(labels))
+                            labeled_learnblock.n_cluster = target_number
+                            yield labeled_learnblock
-- 
GitLab