From 2bc656f54ab789cacfcf84ba6b9915ed4943f426 Mon Sep 17 00:00:00 2001
From: dmt <>
Date: Sun, 3 Nov 2019 20:42:45 +0100
Subject: [PATCH] Assign an id starting from 1 on every tier.

---
 cml/domain/deconstruction.py | 26 ++++++++++++++++++--------
 cml/domain/reconstruction.py | 17 ++++++++---------
 2 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/cml/domain/deconstruction.py b/cml/domain/deconstruction.py
index 9d283ec..b4f3b74 100644
--- a/cml/domain/deconstruction.py
+++ b/cml/domain/deconstruction.py
@@ -111,9 +111,10 @@ class KnowledgeDatabase(ABC):
 
     def serialize(self): pass
 
-    def generate_free_ids(self):
-        for i in count(1):
-            yield i
+    def model_counter(self):
+        def counts(tier):
+            return self.database[tier].biggest_id + 1
+        return counts
 
     def remove_dependent_models(self,
                                 relative_model: PragmaticMachineLearningModel):
@@ -139,12 +140,14 @@ class KnowledgeDomain:
     def __init__(self, tier: int):
         self.tier = tier
         self.knowledge = {}
+        self.biggest_id = 0
 
     def get(self, uid: str):
         return self.knowledge[uid]
 
     def insert(self, model: PragmaticMachineLearningModel):
         self.knowledge[model] = model
+        self.update_biggest_id(model.counter)
 
     def remove(self, model: PragmaticMachineLearningModel):
         del self.knowledge[model]
@@ -154,6 +157,10 @@ class KnowledgeDomain:
                 replacer: PragmaticMachineLearningModel):
         del self.knowledge[replaced]
         self.knowledge[replacer] = replacer
+        self.update_biggest_id(replacer.counter)
+
+    def update_biggest_id(self, new_id):
+        self.biggest_id = max(self.biggest_id, new_id)
 
 
 class RelativeFinder:
@@ -251,6 +258,7 @@ class Deconstructor:
     TIME_COLUMN = "T"
     SUBJECT_COLUMN = "Sigma"
     PURPOSE_COLUMN = "Z"
+    NEXT_MODEL_COUNTER = None
 
     def __init__(self,
                  knowledge_database: KnowledgeDatabase,
@@ -377,8 +385,8 @@ class Deconstructor:
             if over_block.rows >= self.settings.learn_block_minimum:
 
                 # Create new metadata for a pragmatic model
-                new_model = prag_model.fusion(relative_model,
-                                              next(self.free_id))
+                new_model = prag_model.fusion(
+                    relative_model, self.NEXT_MODEL_COUNTER(tier))
 
                 # Which models should be used for the reconstruction
                 which_ml_models = new_model.sigma
@@ -422,7 +430,8 @@ class Deconstructor:
             if overlapping_block.rows >= 2:
 
                 # Model fusion
-                new_model = p_model.fusion(r_model, next(self.free_id))
+                new_model = p_model.fusion(
+                    r_model, self.NEXT_MODEL_COUNTER(tier))
                 which_ml_models = new_model.sigma
 
                 # Get learnblock
@@ -502,7 +511,8 @@ class Deconstructor:
         try:
             # Check feature intersection constraint
             if r_model and self._feature_intersection(p_model, r_model) >= 2:
-                new_model = p_model.fusion(r_model, next(self.free_id))
+                new_model = p_model.fusion(
+                    r_model, self.NEXT_MODEL_COUNTER(tier))
 
             # Check time contraint
             elif r_model and self.time_constraint(p_model, r_model, "complete"):
@@ -514,7 +524,7 @@ class Deconstructor:
                 which_ml_models = p_model.subject + r_model.subject
                 self.reconstructor.reconstruct(
                     tier, ts_relatives, which_ml_models)
-                new_model = p_model.fusion(r_model, next(self.free_id))
+                new_model = p_model.fusion(r_model, self.NEXT_MODEL_COUNTER(tier))
             else: return
 
             # Create learnblock
diff --git a/cml/domain/reconstruction.py b/cml/domain/reconstruction.py
index b7bffcc..2042128 100644
--- a/cml/domain/reconstruction.py
+++ b/cml/domain/reconstruction.py
@@ -123,6 +123,10 @@ class PragmaticMachineLearningModel:
                          str(self.meta.knowledge_tier),
                          str(self.meta.identifier)])
 
+    @property
+    def counter(self):
+        return self.meta.identifier
+
     def fusion(self,
                model: 'PragmaticMachineLearningModel',
                new_identifier: int) -> Metadata:
@@ -159,6 +163,9 @@ def log(func):
 
 
 class Reconstructor:
+    CONCEPTUAL_KNOWLEDGE_ABBREVIATION = "C"
+    NEXT_MODEL_COUNTER = None
+
     def __init__(self,
                  settings: ReconstructionSettings,
                  ml_models: List,
@@ -168,7 +175,7 @@ class Reconstructor:
         self.knowledge_domain = knowlege_domain
         self.logger = None
         self._category = None
-        self._free_id = None
+        self.free_id = None
         self.__reconstruction = None
 
     @property
@@ -186,14 +193,6 @@ class Reconstructor:
         else: raise ValueError()
         self._category = value
 
-    @property
-    def free_id(self) -> Generator[int, None, None]:
-        return self._free_id
-
-    @free_id.setter
-    def free_id(self, value: Generator[int, None, None]) -> None:
-        self._free_id = iter(value)
-
     @log
     def reconstruct(self,
                     tier: int,
-- 
GitLab