runner.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. # Artificial model transformation thingy to measure performance
  2. # Model transformation experiment
  3. from state.devstate import DevState
  4. from bootstrap.scd import bootstrap_scd
  5. from uuid import UUID
  6. from services.scd import SCD
  7. from framework.conformance import Conformance
  8. from services.od import OD
  9. from transformation.matcher import match_od
  10. from transformation.ramify import ramify
  11. from transformation.cloner import clone_od
  12. from transformation import rewriter
  13. from services.bottom.V0 import Bottom
  14. from services.primitives.integer_type import Integer
  15. from concrete_syntax.plantuml import renderer as plantuml
  16. from concrete_syntax.plantuml.make_url import make_url as make_plantuml_url
  17. from concrete_syntax.textual_od import parser, renderer
  18. from util.timer import Timer
  19. if __name__ == "__main__":
  20. state = DevState()
  21. root = state.read_root() # id: 0
  22. # Meta-meta-model: a class diagram that describes the language of class diagrams
  23. scd_mmm_id = bootstrap_scd(state)
  24. int_mm_id = UUID(state.read_value(state.read_dict(state.read_root(), "Integer")))
  25. string_mm_id = UUID(state.read_value(state.read_dict(state.read_root(), "String")))
  26. dsl_mm_cs = """
  27. Rare:Class
  28. Many:Class
  29. ManyB:Class
  30. Other:Class
  31. ass:Association(Many->ManyB)
  32. ass2:Association(Rare->Many)
  33. """
  34. dsl_mm_id = parser.parse_od(state, dsl_mm_cs, mm=scd_mmm_id)
  35. dsl_m_cs = """
  36. rare:Rare
  37. many0:Many
  38. many0B:Many
  39. many1:Many
  40. many1B:Many
  41. many2:Many
  42. many2B:Many
  43. many3:Many
  44. many3B:Many
  45. many4:Many
  46. many4B:Many
  47. many5:ManyB
  48. many6:ManyB
  49. many7:ManyB
  50. many8:ManyB
  51. many50:ManyB
  52. many60:ManyB
  53. many70:ManyB
  54. many80:ManyB
  55. many51:ManyB
  56. many61:ManyB
  57. many71:ManyB
  58. many81:ManyB
  59. many501:ManyB
  60. many601:ManyB
  61. many701:ManyB
  62. many801:ManyB
  63. many5Z:ManyB
  64. many6Z:ManyB
  65. many7Z:ManyB
  66. many8Z:ManyB
  67. many50Z:ManyB
  68. many60Z:ManyB
  69. many70Z:ManyB
  70. many80Z:ManyB
  71. many51Z:ManyB
  72. many61Z:ManyB
  73. many71Z:ManyB
  74. many81Z:ManyB
  75. many501Z:ManyB
  76. many601Z:ManyB
  77. many701Z:ManyB
  78. many801Z:ManyB
  79. Other0:Other
  80. Other1:Other
  81. Other2:Other
  82. Other3:Other
  83. Other0B:Other
  84. Other1B:Other
  85. Other2B:Other
  86. Other3B:Other
  87. Other0C:Other
  88. Other1C:Other
  89. Other2C:Other
  90. Other3C:Other
  91. :ass (many2->many6)
  92. :ass (many3->many8)
  93. :ass2 (rare -> many0)
  94. :ass2 (rare -> many1)
  95. :ass2 (rare -> many2)
  96. """
  97. dsl_m_id = parser.parse_od(state, dsl_m_cs, mm=dsl_mm_id)
  98. # RAMify MM
  99. prefix = "RAM_" # all ramified types can be prefixed to distinguish them a bit more
  100. ramified_mm_id = ramify(state, dsl_mm_id, prefix)
  101. ramified_int_mm_id = ramify(state, int_mm_id, prefix)
  102. # LHS - pattern to match
  103. # TODO: enable more powerful constraints
  104. pattern_cs = f"""
  105. # object to match
  106. rare:RAM_Rare {{
  107. }}
  108. many:RAM_Many
  109. manyB:RAM_ManyB
  110. manyB2:RAM_ManyB
  111. :RAM_ass (many -> manyB)
  112. :RAM_ass (many -> manyB2)
  113. :RAM_ass2 (rare -> many)
  114. """
  115. pattern_id = parser.parse_od(state, pattern_cs, mm=ramified_mm_id)
  116. with Timer("find all matches"):
  117. for i in range(100):
  118. matches = list(match_od(state, dsl_m_id, dsl_mm_id, pattern_id, ramified_mm_id))
  119. for match in matches:
  120. print("\nMATCH:\n", match)
  121. print(len(matches), 'matches')