exp_scd.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. # Simple Class Diagram experiment
  2. from state.devstate import DevState
  3. from bootstrap.scd import bootstrap_scd
  4. from uuid import UUID
  5. from services.scd import SCD
  6. from framework.conformance import Conformance
  7. from services.od import OD
  8. from transformation.ramify import ramify
  9. from services.bottom.V0 import Bottom
  10. from services.primitives.integer_type import Integer
  11. from pattern_matching import mvs_adapter
  12. from pattern_matching.matcher import MatcherVF2
  13. import sys
  14. def create_integer_node(state, i: int):
  15. node = state.create_node()
  16. integer_t = Integer(node, state)
  17. integer_t.create(i)
  18. return node
  19. def main():
  20. state = DevState()
  21. root = state.read_root() # id: 0
  22. scd_node = bootstrap_scd(state)
  23. scd_node2 = state.read_dict(root, "SCD")
  24. # print(root, scd_node, scd_node2)
  25. def print_tree(root, max_depth, depth=0):
  26. print(" "*depth, "root=", root, "value=", state.read_value(root))
  27. src,tgt = state.read_edge(root)
  28. if src != None:
  29. print(" "*depth, "src...")
  30. print_tree(src, max_depth, depth+1)
  31. if tgt != None:
  32. print(" "*depth, "tgt...")
  33. print_tree(tgt, max_depth, depth+1)
  34. for edge in state.read_outgoing(root):
  35. for edge_label in state.read_outgoing(edge):
  36. [_,tgt] = state.read_edge(edge_label)
  37. label = state.read_value(tgt)
  38. print(" "*depth, " key:", label)
  39. [_, tgt] = state.read_edge(edge)
  40. value = state.read_value(tgt)
  41. if value != None:
  42. print(" "*depth, " ->", tgt, " (value:", value, ")")
  43. else:
  44. print(" "*depth, " ->", tgt)
  45. if depth < max_depth:
  46. if isinstance(value, str) and len(value) == 36:
  47. i = None
  48. try:
  49. i = UUID(value)
  50. except ValueError as e:
  51. # print("invalid UUID:", value)
  52. pass
  53. if i != None:
  54. print_tree(i, max_depth, depth+1)
  55. print_tree(tgt, max_depth, depth+1)
  56. print("explore...")
  57. # print_tree(root, 2)
  58. int_type_id = state.read_dict(state.read_root(), "Integer")
  59. int_type = UUID(state.read_value(int_type_id))
  60. string_type_id = state.read_dict(state.read_root(), "String")
  61. string_type = UUID(state.read_value(string_type_id))
  62. # scd2 = SCD(scd_node, state)
  63. # for el in scd2.list_elements():
  64. # print(el)
  65. model_id = state.create_node()
  66. scd = SCD(model_id, state)
  67. scd.create_class("Abstract", abstract=True)
  68. scd.create_class("A", min_c=1, max_c=2)
  69. scd.create_inheritance("A", "Abstract")
  70. scd.create_model_ref("Integer", int_type)
  71. scd.create_attribute_link("A", "Integer", "size", False)
  72. scd.create_class("B")
  73. scd.create_association("A2B", "A", "B",
  74. src_min_c=1,
  75. src_max_c=1,
  76. tgt_min_c=1,
  77. tgt_max_c=2,
  78. )
  79. # print_tree(model_id, 3)
  80. conf = Conformance(state, model_id, scd_node)
  81. print("Check nominal conformance...")
  82. print(conf.check_nominal(log=True))
  83. # print("Check structural conformance...")
  84. # print(conf.check_structural(log=True))
  85. # print("Check nominal conformance (again)...")
  86. # print(conf.check_nominal(log=True))
  87. inst_id = state.create_node()
  88. od = OD(model_id, inst_id, state)
  89. od.create_object("a", "A")
  90. od.create_object("a2", "A")
  91. od.create_object("b", "B")
  92. od.create_link("A2B", "a", "b")
  93. od.create_link("A2B", "a2", "b")
  94. od.create_slot("size", "a", od.create_integer_value("a.size", 42))
  95. print("checking conformance....")
  96. conf2 = Conformance(state, inst_id, model_id)
  97. print("conforms?", conf2.check_nominal(log=True))
  98. ramified_MM_id = ramify(state, model_id)
  99. pattern_id = state.create_node()
  100. pattern = OD(ramified_MM_id, pattern_id, state)
  101. pattern.create_object("a1", "A")
  102. pattern.create_slot("size", "a1", pattern.create_string_value("a1.size", 'v < 100'))
  103. # pattern.create_object("a2", "A")
  104. # pattern.create_slot("size", "a2", pattern.create_string_value("a2.size", '99'))
  105. pattern.create_object("b1", "B")
  106. # pattern.create_link("A2B", "a1", "b1")
  107. conf3 = Conformance(state, pattern_id, ramified_MM_id)
  108. print("conforms?", conf3.check_nominal(log=True))
  109. host = mvs_adapter.model_to_graph(state, inst_id)
  110. guest = mvs_adapter.model_to_graph(state, pattern_id)
  111. print(host.vtxs)
  112. print(host.edges)
  113. print("matching...")
  114. matcher = MatcherVF2(host, guest, mvs_adapter.RAMCompare(Bottom(state)))
  115. prev = None
  116. for m in matcher.match():
  117. print("\nMATCH:\n", m)
  118. input()
  119. print("DONE")
  120. if __name__ == "__main__":
  121. main()