V1.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. from uuid import UUID
  2. from state.base import State
  3. from services.bottom.V0 import Bottom as BottomV0
  4. class Bottom:
  5. """
  6. Implements services for LTM bottom.
  7. Implemented using V0.Bottom
  8. """
  9. def __init__(self, model: UUID, state: State):
  10. type_model_id = state.read_dict(state.read_root(), "Bottom")
  11. self.type_model = UUID(state.read_value(type_model_id))
  12. self.model = model
  13. self.bottom = BottomV0(state)
  14. def create_node(self, name: str, value=None):
  15. """
  16. Creates a node.
  17. Args:
  18. name: node name in model
  19. value: value to be stored in the node
  20. Returns:
  21. Nothing
  22. """
  23. if value == None:
  24. n = self.bottom.create_node()
  25. else:
  26. n = self.bottom.create_node(value)
  27. self.bottom.create_edge(self.model, n, label=name)
  28. def create_edge(self, name: str, source: str, target: str):
  29. """
  30. Creates an edge.
  31. Args:
  32. name: edge name in model
  33. source: source element of the edge
  34. target: target element of the edge
  35. Returns:
  36. Nothing
  37. """
  38. try:
  39. src, = self.bottom.read_outgoing_elements(self.model, source)
  40. except ValueError:
  41. raise RuntimeError(f"No element named {source}")
  42. try:
  43. tgt, = self.bottom.read_outgoing_elements(self.model, source)
  44. except ValueError:
  45. raise RuntimeError(f"No element named {target}")
  46. e = self.bottom.create_edge(src, tgt)
  47. self.bottom.create_edge(self.model, e, label=name)
  48. def read_value(self, name: str):
  49. """
  50. Reads value stored in a node.
  51. Args:
  52. name: name of the node to read value from
  53. Returns:
  54. Value contained in the node. If no value is found, returns None
  55. """
  56. try:
  57. element, = self.bottom.read_outgoing_elements(self.model, name)
  58. return self.bottom.read_value(element)
  59. except ValueError:
  60. raise RuntimeError(f"No element named {name}")
  61. def read_edge_source(self, name: str):
  62. """
  63. Reads source element of an edge.
  64. Args:
  65. name: name of the edge to read source element of
  66. Returns:
  67. UUID of source element of the edge
  68. """
  69. try:
  70. element, = self.bottom.read_outgoing_elements(self.model, name)
  71. return self.bottom.read_edge_source(element)
  72. except ValueError:
  73. raise RuntimeError(f"No element named {name}")
  74. def read_edge_target(self, name: str):
  75. """
  76. Reads target element of an edge.
  77. Args:
  78. name: name of the edge to read target element of
  79. Returns:
  80. UUID of target element of the edge
  81. """
  82. try:
  83. element, = self.bottom.read_outgoing_elements(self.model, name)
  84. return self.bottom.read_edge_target(element)
  85. except ValueError:
  86. raise RuntimeError(f"No element named {name}")
  87. def delete_element(self, name: str):
  88. """
  89. Delete an element
  90. Args:
  91. element: UUID of the element to be deleted
  92. Returns:
  93. Nothing
  94. """
  95. try:
  96. element, = self.bottom.read_outgoing_elements(self.model, name)
  97. self.bottom.delete_element(element)
  98. except ValueError:
  99. raise RuntimeError(f"No element named {name}")
  100. def list_elements(self):
  101. """
  102. Lists elements in the model.
  103. Returns:
  104. A list of elements in alphabetical order.
  105. """
  106. tm_names = {}
  107. for key in self.bottom.read_keys(self.type_model):
  108. element, = self.bottom.read_outgoing_elements(self.type_model, key)
  109. tm_names[element] = key
  110. unsorted = []
  111. for key in self.bottom.read_keys(self.model):
  112. element, = self.bottom.read_outgoing_elements(self.model, key)
  113. element_types = self.bottom.read_outgoing_elements(element, "Morphism")
  114. type_model_elements = self.bottom.read_outgoing_elements(self.type_model)
  115. element_type_node, = [e for e in element_types if e in type_model_elements]
  116. unsorted.append(f"{key} : {tm_names[element_type_node]}")
  117. return sorted(unsorted)
  118. def to_bottom(self):
  119. pass # already encoded as bottom
  120. def from_bottom(self):
  121. pass # already encoded as bottom