cbd_semantics.alc 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. include "primitives.alh"
  2. include "modelling.alh"
  3. include "object_operations.alh"
  4. include "library.alh"
  5. include "conformance_scd.alh"
  6. Void function main():
  7. Element model
  8. String verify_result
  9. while (True):
  10. output("Which model do you want to execute with CBD semantics?")
  11. model = import_node(input())
  12. if (element_eq(model, read_root())):
  13. output("Could not find model; aborting")
  14. elif (element_neq(model["metamodel"], import_node("models/CausalBlockDiagrams_Design"))):
  15. output("Not a CBD design model; aborting")
  16. else:
  17. verify_result = conformance_scd(model)
  18. if (verify_result == "OK"):
  19. output("Model OK!")
  20. execute_cbd(model)
  21. else:
  22. output("Non-conforming model: " + verify_result)
  23. Void function translate_to_runtime(design_model : Element):
  24. Element runtime_model
  25. Element all_blocks
  26. Element all_links
  27. String mm_type_name
  28. String element_name
  29. String attr_name
  30. String attr_value
  31. String attribute
  32. String src
  33. String dst
  34. output("Translating to runtime model!")
  35. output("Creating empty runtime model")
  36. runtime_model = instantiate_model("models/CausalBlockDiagrams_Runtime")
  37. output("Converting blocks")
  38. all_blocks = allInstances(design_model, "Block")
  39. while (list_len(all_blocks) > 0):
  40. element_name = set_pop(all_blocks)
  41. mm_type_name = reverseKeyLookup(design_model["metamodel"]["model"], dict_read_node(model["type_mapping"], model["model"][element_name]))
  42. instantiate_node(runtime_model, mm_type_name, element_name)
  43. all_attributes = getAttributeList(design_model, element_name)
  44. while (set_len(all_attributes) > 0):
  45. attr_name = set_pop(all_attributes)
  46. if (bool_not(set_in(runtime_model["model"], read_attribute(design_model, element_name, attr_name)))):
  47. instantiate_attribute(runtime_model, element_name, attr_name, read_attribute(design_model, element_name, attr_name))
  48. output(" Converted block " + element_name)
  49. // Don't merge this together with the block conversion, as the destination block might not exist yet!
  50. output("Relinking blocks")
  51. all_links = allInstances(design_model, "Link")
  52. while (set_len(all_links) > 0):
  53. element_name = set_pop(all_links)
  54. src = reverseKeyLookup(design_model["model"], read_edge_src(model["model"][element_name]))
  55. dst = reverseKeyLookup(design_model["model"], read_edge_dst(model["model"][element_name]))
  56. instantiate_link(runtime_model, "Link", element_name, src, dst)
  57. output(((" Relinked blocks " + src) + " and ") + dst)
  58. output("Resetting initial conditions")
  59. all_links = allInstances(design_model, "InitialCondition")
  60. while (set_len(all_links) > 0):
  61. element_name = set_pop(all_links)
  62. src = reverseKeyLookup(design_model["model"], read_edge_src(model["model"][element_name]))
  63. dst = reverseKeyLookup(design_model["model"], read_edge_dst(model["model"][element_name]))
  64. instantiate_link(runtime_model, "InitialCondition", element_name, src, dst)
  65. output(" Reset IC of " + dst)
  66. output("Creating schedule at time = 0")
  67. create_schedule(runtime_model, True)
  68. output("Creating schedule at time > 0")
  69. create_schedule(runtime_model, False)
  70. output("Solving loops (TODO)")
  71. output("DONE!")
  72. return !
  73. Void function create_schedule(model : Element, is_time_zero : Boolean):
  74. all_blocks = allInstances(model, "Block")
  75. visited = create_node()
  76. to_visit = create_node()
  77. if (is_time_zero):
  78. schedule = instantiate_node(model, "Schedule", "schedule_init")
  79. else:
  80. schedule = instantiate_node(model, "Schedule", "schedule_running")
  81. while (set_len(all_blocks) > 0):
  82. element_name = set_pop(all_blocks)
  83. if (bool_not(set_in(visited, element_name))):
  84. list_append(to_visit, element_name)
  85. while (list_len(to_visit) > 0):
  86. element_name = list_read(to_visit, list_len(to_visit) - 1)
  87. if (reverseKeyLookup(model["metamodel"]["model"], dict_read_node(model["type_mapping"], model["model"][element_name])) == "DelayBlock"):
  88. if (is_time_zero):
  89. incoming_links = allIncomingAssociationInstances(model, element_name, "InitialCondition")
  90. else:
  91. incoming_links = create_node()
  92. else:
  93. incoming_links = allIncomingAssociationInstances(model, element_name, "Link")
  94. ready = True
  95. while (list_len(incoming_links) > 0):
  96. link = set_pop(incoming_links)
  97. source = readAssociationSource(model, link)
  98. if (bool_not(set_in(visited, source))):
  99. list_append(to_visit, source)
  100. ready = False
  101. if (ready):
  102. new_schedule = instantiate_node(model, "Schedule", "")
  103. instantiate_attribute(model, reverseKeyLookup(model["model"], schedule), "block", model["model"][element_name])
  104. instantiate_attribute(model, reverseKeyLookup(model["model"], schedule), "next", model["model"][new_schedule])
  105. schedule = new_schedule
  106. return !
  107. Void function execute_cbd(model : Element):
  108. translate_to_runtime(model)
  109. String cmd
  110. while (True):
  111. output("Which operation do you want to execute?")
  112. cmd = input()
  113. if (cmd == "help"):
  114. output("Supported operations:")
  115. output(" start -- start simulation")
  116. output(" pause -- pause simulation")
  117. output(" modify -- live modelling: modify model structure")
  118. output(" list -- list blocks and connections")
  119. output(" help -- this information")
  120. output(" exit -- select another model")
  121. elif (cmd == "exit"):
  122. return!
  123. else:
  124. output("Did not understand command!")
  125. output("Use 'help' for a list of available options")