From 2deae7a43dfa8fdbeea5dae63967425e06acd6f4 Mon Sep 17 00:00:00 2001
From: dmt <>
Date: Thu, 10 Oct 2019 17:43:06 +0200
Subject: [PATCH] Add settings for construction.

---
 cml/shared/parameter.py | 48 ++++++++++++++++++++++++++++++++++++-----
 cml/shared/settings.py  | 21 +++++++++++++++++-
 cml/static/settings.ini |  6 ++++++
 3 files changed, 69 insertions(+), 6 deletions(-)

diff --git a/cml/shared/parameter.py b/cml/shared/parameter.py
index d5a4dd9..b75e4dd 100644
--- a/cml/shared/parameter.py
+++ b/cml/shared/parameter.py
@@ -11,7 +11,18 @@ class SetFeatures:
         return self.set_features
 
     def __set__(self, instance, value):
-        self.set_features = [int(i) for i in value.split(",")]
+        if isinstance(value, list):
+            try:
+                self.set_features = [int(i) for i in value]
+            except ValueError:
+                # TODO (dmt): Provide proper exception handling
+                raise Exception("Fehler")
+
+        elif isinstance(value, str):
+            self.set_features = [int(i) for i in value.split(",")]
+
+        else:
+            raise Exception("Fehler")
 
 
 class CutTimeStamp:
@@ -143,7 +154,14 @@ class LearnblockMinimum:
         return self.learnblock_minimum
 
     def __set__(self, instance, value):
-        self.learnblock_minimum = value
+        if isinstance(value, int):
+            self.learnblock_minimum = value
+
+        elif isinstance(value, str):
+            try:
+                self.learnblock_minimu = int(value)
+            except Exception as error:
+                print(error)
 
 
 class MaxCategories:
@@ -154,7 +172,14 @@ class MaxCategories:
         return self.max_categories
 
     def __set__(self, instance, value):
-        self.max_categories = value
+        if isinstance(value, int):
+            self.max_categories = value
+
+        elif isinstance(value, str):
+            try:
+                self.max_categories = int(value)
+            except Exception as error:
+                print(error)
 
 
 class SigmaZetaCutoff:
@@ -165,7 +190,13 @@ class SigmaZetaCutoff:
         return self.sigma_zeta_cutoff
 
     def __set__(self, instance, value):
-        self.sigma_zeta_cutoff = value
+        if isinstance(value, float):
+            self.sigma_zeta_cutoff = value
+        elif isinstance(value, str):
+            try:
+                self.sigma_zeta_cutoff = float(value)
+            except Exception as error:
+                print(error)
 
 
 class MinCategorySize:
@@ -176,7 +207,14 @@ class MinCategorySize:
         return self.min_category_size
 
     def __set__(self, instance, value):
-        self.min_category_size = value
+        if isinstance(value, int):
+            self.min_category_size = value
+
+        elif isinstance(value, str):
+            try:
+                self.min_category_size = int(value)
+            except Exception as error:
+                print(error)
 
 
 class MaxModelTargets:
diff --git a/cml/shared/settings.py b/cml/shared/settings.py
index bad5ac4..3b72d41 100644
--- a/cml/shared/settings.py
+++ b/cml/shared/settings.py
@@ -78,6 +78,14 @@ class BlockProcessingSettings:
     sigma_zeta_cutoff: float = SigmaZetaCutoff()
 
 
+@dataclass
+class ConstructionSettings:
+    max_categories: int = MaxCategories()
+    min_category_size: int = MinCategorySize()
+    max_model_targets: int = MaxModelTargets()
+    max_target_error: float = MaxTargetError()
+
+
 @dataclass
 class DeconstructionSettings:
     pass
@@ -101,6 +109,11 @@ def specific_settings_factory(settings_type: str):
                                        Settings.STACK_ITERATIONS,
                                        Settings.LEARN_BLOCK_MINIMUM,
                                        Settings.SIGMA_ZETA_CUTOFF)]),
+        "construction": starmap(
+            ConstructionSettings, [(Settings.MAX_CATEGORIES,
+                                    Settings.MIN_CATEGORY_SIZE,
+                                    Settings.MAX_MODEL_TARGETS,
+                                    Settings.MAX_TARGET_ERROR)]),
         "deconstruction": starmap(
             DeconstructionSettings, [()]
         )
@@ -116,7 +129,7 @@ def read_settings(path: str):
         configure_main_settings_class(config)
     except AttributeError as e:
         # TODO (dmt): Implement proper error handling.
-        pass
+        raise Exception("Fehler")
 
 
 def configure_main_settings_class(config):
@@ -140,3 +153,9 @@ def configure_main_settings_class(config):
     Settings.STACK_ITERATIONS = block_processing["stack_iterations"]
     Settings.LEARN_BLOCK_MINIMUM = block_processing["learn_block_minimum"]
     Settings.SIGMA_ZETA_CUTOFF = block_processing["sigma_zeta_cutoff"]
+
+    construction = config["CONSTRUCTION"]
+    Settings.MAX_TARGET_ERROR = construction["max_target_error"]
+    Settings.MAX_MODEL_TARGETS = construction["max_model_targets"]
+    Settings.MAX_CATEGORIES = construction["max_categories"]
+    Settings.MIN_CATEGORY_SIZE = construction["min_category_size"]
diff --git a/cml/static/settings.ini b/cml/static/settings.ini
index c5c42cd..a4e8fce 100644
--- a/cml/static/settings.ini
+++ b/cml/static/settings.ini
@@ -17,3 +17,9 @@ max_blocks = 100
 stack_iterations = 100
 learn_block_minimum = 1
 sigma_zeta_cutoff = 0.8
+
+[CONSTRUCTION]
+max_categories = 10
+min_category_size = 10
+max_model_targets = 10
+max_target_error = 0.2
-- 
GitLab