bottom.py 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. from state.base import State, INTEGER, FLOAT, STRING, BOOLEAN, TYPE, NODE, EDGE
  2. from core.element import Element, String
  3. class Bottom:
  4. def __init__(self, state: State) -> None:
  5. self.state = state
  6. def create_model(self, name: String) -> Element:
  7. bottom = self.state.create_nodevalue(name.value)
  8. self.state.create_dict(bottom, "Model", self.state.create_node())
  9. return Element(id=bottom)
  10. def add_node(self, model: Element, name: String):
  11. model_root = self.state.read_dict(model.id, "Model")
  12. # create model element
  13. element = self.state.create_node()
  14. # connect to model root
  15. element_edge = self.state.create_edge(model_root, element)
  16. # label edge with provided name
  17. element_label = self.state.create_nodevalue(name.value)
  18. if element_label is None:
  19. print(f"Warning: Invalid name {name.value}, element not created.")
  20. return
  21. self.state.create_edge(element_edge, element_label)
  22. # add ltm-bottom typing
  23. element_type = self.state.create_nodevalue(NODE)
  24. self.state.create_dict(element_label, TYPE, element_type)
  25. def add_value(self, model: Element, name: String, value: Element):
  26. type_map = {
  27. int: INTEGER,
  28. float: FLOAT,
  29. bool: BOOLEAN,
  30. str: STRING
  31. }
  32. model_root = self.state.read_dict(model.id, "Model")
  33. # create model element
  34. element = self.state.create_nodevalue(value.value)
  35. if element is None:
  36. print("Warning: Invalid value, value node not created.")
  37. return
  38. # connect to model root
  39. element_edge = self.state.create_edge(model_root, element)
  40. # label edge with provided name
  41. element_label = self.state.create_nodevalue(name.value)
  42. if element_label is None:
  43. print(f"Warning: Invalid name {name.value}, element not created.")
  44. return
  45. self.state.create_edge(element_edge, element_label)
  46. # add ltm-bottom typing
  47. element_type = self.state.create_nodevalue(type_map[type(value.value)])
  48. self.state.create_dict(element_label, TYPE, element_type)
  49. def add_edge(self, model: Element, name: String, source: String, target: String):
  50. model_root = self.state.read_dict(model.id, "Model")
  51. source_element = self.state.read_dict(model_root, source.value)
  52. if source_element is None:
  53. print(f"Warning: Unknown source element {source.value}, edge not created.")
  54. return
  55. target_element = self.state.read_dict(model_root, target.value)
  56. if target_element is None:
  57. print(f"Warning: Unknown target element {target.value}, edge not created.")
  58. return
  59. # create model element
  60. element = self.state.create_edge(source_element, target_element)
  61. # connect to model root
  62. element_edge = self.state.create_edge(model_root, element)
  63. # label edge with provided name
  64. element_label = self.state.create_nodevalue(name.value)
  65. if element_label is None:
  66. print(f"Warning: Invalid name {name.value}, element not created.")
  67. return
  68. self.state.create_edge(element_edge, element_label)
  69. # add ltm-bottom typing
  70. element_type = self.state.create_nodevalue(EDGE)
  71. self.state.create_dict(element_label, TYPE, element_type)
  72. def get_element(self, model: Element, name: String) -> Element:
  73. model_root = self.state.read_dict(model.id, "Model")
  74. element = self.state.read_dict(model_root, name.value)
  75. if element is None:
  76. print(f"Warning: Unknown element {name.value}.")
  77. return Element()
  78. else:
  79. return Element(id=element, value=self.state.read_value(element))
  80. def delete_element(self, model: Element, name: String):
  81. model_root = self.state.read_dict(model.id, "Model")
  82. element = self.state.read_dict(model_root, name.value)
  83. # could be both a node or an edge
  84. self.state.delete_node(element)
  85. self.state.delete_edge(element)