Browse Source

initial bottom implementation

Andrei Bondarenko 2 years ago
parent
commit
f6747c6929
2 changed files with 93 additions and 0 deletions
  1. 0 0
      core/__init__.py
  2. 93 0
      core/bottom.py

+ 0 - 0
core/__init__.py


+ 93 - 0
core/bottom.py

@@ -0,0 +1,93 @@
+from state.base import State, INTEGER, FLOAT, STRING, BOOLEAN, TYPE, NODE, EDGE
+from core.element import Element, String
+
+
+class Bottom:
+    def __init__(self, state: State) -> None:
+        self.state = state
+
+    def create_model(self, name: String) -> Element:
+        bottom = self.state.create_nodevalue(name.value)
+        self.state.create_dict(bottom, "Model", self.state.create_node())
+        return Element(id=bottom)
+
+    def add_node(self, model: Element, name: String):
+        model_root = self.state.read_dict(model.id, "Model")
+        # create model element
+        element = self.state.create_node()
+        # connect to model root
+        element_edge = self.state.create_edge(model_root, element)
+        # label edge with provided name
+        element_label = self.state.create_nodevalue(name.value)
+        if element_label is None:
+            print(f"Warning: Invalid name {name.value}, element not created.")
+            return
+        self.state.create_edge(element_edge, element_label)
+        # add ltm-bottom typing
+        element_type = self.state.create_nodevalue(NODE)
+        self.state.create_dict(element_label, TYPE, element_type)
+
+    def add_value(self, model: Element, name: String, value: Element):
+        type_map = {
+            int: INTEGER,
+            float: FLOAT,
+            bool: BOOLEAN,
+            str: STRING
+        }
+        model_root = self.state.read_dict(model.id, "Model")
+        # create model element
+        element = self.state.create_nodevalue(value.value)
+        if element is None:
+            print("Warning: Invalid value, value node not created.")
+            return
+        # connect to model root
+        element_edge = self.state.create_edge(model_root, element)
+        # label edge with provided name
+        element_label = self.state.create_nodevalue(name.value)
+        if element_label is None:
+            print(f"Warning: Invalid name {name.value}, element not created.")
+            return
+        self.state.create_edge(element_edge, element_label)
+        # add ltm-bottom typing
+        element_type = self.state.create_nodevalue(type_map[type(value.value)])
+        self.state.create_dict(element_label, TYPE, element_type)
+
+    def add_edge(self, model: Element, name: String, source: String, target: String):
+        model_root = self.state.read_dict(model.id, "Model")
+        source_element = self.state.read_dict(model_root, source.value)
+        if source_element is None:
+            print(f"Warning: Unknown source element {source.value}, edge not created.")
+            return
+        target_element = self.state.read_dict(model_root, target.value)
+        if target_element is None:
+            print(f"Warning: Unknown target element {target.value}, edge not created.")
+            return
+        # create model element
+        element = self.state.create_edge(source_element, target_element)
+        # connect to model root
+        element_edge = self.state.create_edge(model_root, element)
+        # label edge with provided name
+        element_label = self.state.create_nodevalue(name.value)
+        if element_label is None:
+            print(f"Warning: Invalid name {name.value}, element not created.")
+            return
+        self.state.create_edge(element_edge, element_label)
+        # add ltm-bottom typing
+        element_type = self.state.create_nodevalue(EDGE)
+        self.state.create_dict(element_label, TYPE, element_type)
+
+    def get_element(self, model: Element, name: String) -> Element:
+        model_root = self.state.read_dict(model.id, "Model")
+        element = self.state.read_dict(model_root, name.value)
+        if element is None:
+            print(f"Warning: Unknown element {name.value}.")
+            return Element()
+        else:
+            return Element(id=element, value=self.state.read_value(element))
+
+    def delete_element(self, model: Element, name: String):
+        model_root = self.state.read_dict(model.id, "Model")
+        element = self.state.read_dict(model_root, name.value)
+        # could be both a node or an edge
+        self.state.delete_node(element)
+        self.state.delete_edge(element)