pn.py 7.1 KB

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