runner_exec_pn.py 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. from state.devstate import DevState
  2. from bootstrap.scd import bootstrap_scd
  3. from concrete_syntax.textual_od import parser, renderer
  4. from concrete_syntax.plantuml.renderer import render_object_diagram, render_class_diagram
  5. from concrete_syntax.plantuml.make_url import make_url
  6. from api.od import ODAPI
  7. from transformation.ramify import ramify
  8. from transformation.topify.topify import Topifier
  9. from transformation.merger import merge_models
  10. from transformation.ramify import ramify
  11. from transformation.rule import RuleMatcherRewriter, ActionGenerator
  12. from util import loader
  13. from examples.semantics.operational.simulator import Simulator, RandomDecisionMaker, InteractiveDecisionMaker
  14. from examples.semantics.operational.port import models
  15. from examples.semantics.operational.port.helpers import design_to_state, state_to_design, get_time
  16. from examples.semantics.operational.port.renderer import render_port_textual, render_port_graphviz
  17. from examples.petrinet.renderer import render_petri_net
  18. from examples.semantics.operational import simulator
  19. import os
  20. import sys
  21. THIS_DIR = os.path.dirname(__file__)
  22. # get file contents as string
  23. def read_file(filename):
  24. with open(THIS_DIR+'/'+filename) as file:
  25. return file.read()
  26. if __name__ == "__main__":
  27. if len(sys.argv) != 2:
  28. print("Usage:")
  29. print(f" python {__file__} model.od")
  30. print("where `model.od` is a valid instance of Port+Petri-Net.")
  31. sys.exit(1)
  32. model_to_open = sys.argv[1]
  33. state = DevState()
  34. scd_mmm = bootstrap_scd(state)
  35. print('loading merged MM...')
  36. merged_mm = loader.parse_and_check(state, read_file("merged_mm.od"), scd_mmm, "merged_mm.od",
  37. check_conformance=False, # no need to check conformance every time
  38. )
  39. print('ramifying...')
  40. ramified_merged_mm = ramify(state, merged_mm)
  41. print('loading petri net rules...')
  42. rules = loader.load_rules(state,
  43. lambda rule_name, kind: f"{THIS_DIR}/../../petrinet/operational_semantics/r_{rule_name}_{kind}.od",
  44. ramified_merged_mm,
  45. ["fire_transition"])
  46. print('loading model...')
  47. filename = f"{THIS_DIR}/{model_to_open}"
  48. with open(filename, "r") as file:
  49. model = loader.parse_and_check(state, file.read(), merged_mm, "model",
  50. check_conformance=False, # no need to check conformance every time
  51. )
  52. print('loaded', filename)
  53. print('ready!')
  54. matcher_rewriter = RuleMatcherRewriter(state, merged_mm, ramified_merged_mm)
  55. action_generator = ActionGenerator(matcher_rewriter, rules)
  56. sim = simulator.Simulator(
  57. action_generator=action_generator,
  58. decision_maker=simulator.InteractiveDecisionMaker(auto_proceed=False),
  59. # decision_maker=simulator.RandomDecisionMaker(seed=0),
  60. renderer=lambda od: render_petri_net(od) + renderer.render_od(state, od.m, od.mm),
  61. # renderer=lambda od: render_od(state, od.m, od.mm),
  62. )
  63. sim.run(ODAPI(state, model, merged_mm))