pn.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. from uuid import UUID
  2. from state.base import State
  3. from services.bottom.V0 import Bottom
  4. from services.primitives.integer_type import Integer
  5. from services.primitives.string_type import String
  6. import re
  7. class PN:
  8. def __init__(self, model: UUID, state: State):
  9. ltm_pn_id = state.read_dict(state.read_root(), "PN")
  10. self.ltm_pn = UUID(state.read_value(ltm_pn_id))
  11. self.model = model
  12. self.bottom = Bottom(state)
  13. def create_place(self, name: str, tokens: int):
  14. # instantiate Place class
  15. place_node = self.bottom.create_node() # create place node
  16. self.bottom.create_edge(self.model, place_node, name) # attach to model
  17. morph_node, = self.bottom.read_outgoing_elements(self.ltm_pn, "P") # retrieve type
  18. self.bottom.create_edge(place_node, morph_node, "Morphism") # create morphism link
  19. # instantiate name attribute
  20. name_model = self.bottom.create_node()
  21. String(name_model, self.bottom.state).create(name)
  22. name_node = self.bottom.create_node(str(name_model))
  23. self.bottom.create_edge(self.model, name_node, f"{name}.n")
  24. name_link = self.bottom.create_edge(place_node, name_node)
  25. self.bottom.create_edge(self.model, name_link, f"{name}.n_link")
  26. ltm_pn_node, = self.bottom.read_outgoing_elements(self.ltm_pn, "String")
  27. ltm_pn_link, = self.bottom.read_outgoing_elements(self.ltm_pn, "P_n")
  28. self.bottom.create_edge(name_node, ltm_pn_node, "Morphism")
  29. self.bottom.create_edge(name_link, ltm_pn_link, "Morphism")
  30. # instantiate tokens attribute
  31. tokens_model = self.bottom.create_node()
  32. Integer(tokens_model, self.bottom.state).create(tokens)
  33. tokens_node = self.bottom.create_node(str(tokens_model))
  34. self.bottom.create_edge(self.model, tokens_node, f"{name}.t")
  35. tokens_link = self.bottom.create_edge(place_node, tokens_node)
  36. self.bottom.create_edge(self.model, tokens_link, f"{name}.t_link")
  37. ltm_pn_node, = self.bottom.read_outgoing_elements(self.ltm_pn, "Integer")
  38. ltm_pn_link, = self.bottom.read_outgoing_elements(self.ltm_pn, "P_t")
  39. self.bottom.create_edge(tokens_node, ltm_pn_node, "Morphism")
  40. self.bottom.create_edge(tokens_link, ltm_pn_link, "Morphism")
  41. def create_transition(self, name: str):
  42. # instantiate Transition class
  43. transition_node = self.bottom.create_node() # create transition node
  44. self.bottom.create_edge(self.model, transition_node, name) # attach to model
  45. morph_node, = self.bottom.read_outgoing_elements(self.ltm_pn, "T") # retrieve type
  46. self.bottom.create_edge(transition_node, morph_node, "Morphism") # create morphism link
  47. # instantiate name attribute
  48. name_model = self.bottom.create_node()
  49. String(name_model, self.bottom.state).create(name)
  50. name_node = self.bottom.create_node(str(name_model))
  51. self.bottom.create_edge(self.model, name_node, f"{name}.name")
  52. name_link = self.bottom.create_edge(transition_node, name_node)
  53. self.bottom.create_edge(self.model, name_link, f"{name}.name_link")
  54. ltm_pn_node, = self.bottom.read_outgoing_elements(self.ltm_pn, "String")
  55. ltm_pn_link, = self.bottom.read_outgoing_elements(self.ltm_pn, "T_name")
  56. self.bottom.create_edge(name_node, ltm_pn_node, "Morphism")
  57. self.bottom.create_edge(name_link, ltm_pn_link, "Morphism")
  58. def create_p2t(self, place: str, transition: str, weight: int):
  59. # create p2t link + morphism links
  60. edge = self.bottom.create_edge(
  61. *self.bottom.read_outgoing_elements(self.model, place),
  62. *self.bottom.read_outgoing_elements(self.model, transition),
  63. )
  64. self.bottom.create_edge(self.model, edge, f"{place}_to_{transition}") # attach to model
  65. morph_node, = self.bottom.read_outgoing_elements(self.ltm_pn, "P2T") # retrieve type
  66. self.bottom.create_edge(edge, morph_node, "Morphism") # create morphism link
  67. # weight attribute
  68. weight_model = self.bottom.create_node()
  69. Integer(weight_model, self.bottom.state).create(weight)
  70. weight_node = self.bottom.create_node(str(weight_model))
  71. self.bottom.create_edge(self.model, weight_node, f"{place}_to_{transition}.weight")
  72. weight_link = self.bottom.create_edge(edge, weight_node)
  73. self.bottom.create_edge(self.model, weight_link, f"{place}_to_{transition}.weight_link")
  74. scd_node, = self.bottom.read_outgoing_elements(self.ltm_pn, "Integer")
  75. scd_link, = self.bottom.read_outgoing_elements(self.ltm_pn, "P2T_weight")
  76. self.bottom.create_edge(weight_node, scd_node, "Morphism")
  77. self.bottom.create_edge(weight_link, scd_link, "Morphism")
  78. def create_t2p(self, transition: str, place: str, weight: int):
  79. # create t2p link + morphism links
  80. edge = self.bottom.create_edge(
  81. *self.bottom.read_outgoing_elements(self.model, transition),
  82. *self.bottom.read_outgoing_elements(self.model, place),
  83. )
  84. self.bottom.create_edge(self.model, edge, f"{transition}_to_{place}") # attach to model
  85. morph_node, = self.bottom.read_outgoing_elements(self.ltm_pn, "T2P") # retrieve type
  86. self.bottom.create_edge(edge, morph_node, "Morphism") # create morphism link
  87. # weight attribute
  88. weight_model = self.bottom.create_node()
  89. Integer(weight_model, self.bottom.state).create(weight)
  90. weight_node = self.bottom.create_node(str(weight_model))
  91. self.bottom.create_edge(self.model, weight_node, f"{transition}_to_{place}.weight")
  92. weight_link = self.bottom.create_edge(edge, weight_node)
  93. self.bottom.create_edge(self.model, weight_link, f"{transition}_to_{place}.weight_link")
  94. scd_node, = self.bottom.read_outgoing_elements(self.ltm_pn, "Integer")
  95. scd_link, = self.bottom.read_outgoing_elements(self.ltm_pn, "T2P_weight")
  96. self.bottom.create_edge(weight_node, scd_node, "Morphism")
  97. self.bottom.create_edge(weight_link, scd_link, "Morphism")
  98. def list_elements(self):
  99. pn_names = {}
  100. for key in self.bottom.read_keys(self.ltm_pn):
  101. element, = self.bottom.read_outgoing_elements(self.ltm_pn, key)
  102. pn_names[element] = key
  103. unsorted = []
  104. for key in self.bottom.read_keys(self.model):
  105. element, = self.bottom.read_outgoing_elements(self.model, key)
  106. element_types = self.bottom.read_outgoing_elements(element, "Morphism")
  107. type_model_elements = self.bottom.read_outgoing_elements(self.ltm_pn)
  108. element_type_node, = [e for e in element_types if e in type_model_elements]
  109. unsorted.append((key, pn_names[element_type_node]))
  110. for elem in sorted(unsorted, key=lambda e: e[0]):
  111. print("{} : {}".format(*elem))
  112. def delete_element(self, name: str):
  113. keys = self.bottom.read_keys(self.model)
  114. r = re.compile(r"{}\..*".format(name))
  115. to_delete = list(filter(r.match, keys))
  116. for key in to_delete:
  117. # TODO: find way to solve memory leak, primitive models are not deleted this way
  118. node, = self.bottom.read_outgoing_elements(self.model, label=key)
  119. self.bottom.delete_element(node)