fibonacci_runner.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from state.devstate import DevState
  2. from bootstrap.scd import bootstrap_scd
  3. from api.od import ODAPI
  4. from concrete_syntax.common import indent
  5. from concrete_syntax.textual_od import renderer as od_renderer
  6. from concrete_syntax.plantuml import renderer as plantuml
  7. from concrete_syntax.plantuml.make_url import make_url as make_plantuml_url
  8. from concrete_syntax.graphviz.make_url import make_url as make_graphviz_url
  9. from concrete_syntax.graphviz import renderer as graphviz
  10. from transformation.ramify import ramify
  11. from transformation.rule import RuleMatcherRewriter, ActionGenerator
  12. from examples.semantics.operational import simulator
  13. from util import loader
  14. import models
  15. state = DevState()
  16. scd_mmm = bootstrap_scd(state)
  17. print("Parsing models...")
  18. mm, mm_rt, m, m_rt_initial = models.load_fibonacci(state, scd_mmm)
  19. mm_rt_ramified = ramify(state, mm_rt)
  20. # print("RT-MM")
  21. # print(make_plantuml_url(plantuml.render_class_diagram(state, mm_rt)))
  22. # print("RAMIFIED RT-MM")
  23. # print(make_plantuml_url(plantuml.render_class_diagram(state, mm_rt_ramified)))
  24. high_priority_rules, low_priority_rules = models.load_rules(state, mm_rt_ramified)
  25. matcher_rewriter = RuleMatcherRewriter(state, mm_rt, mm_rt_ramified)
  26. high_priority_actions = ActionGenerator(matcher_rewriter, high_priority_rules)
  27. low_priority_actions = ActionGenerator(matcher_rewriter, low_priority_rules)
  28. # yields the currently enabled actions
  29. def generate_actions(od):
  30. at_least_one_match = yield from high_priority_actions(od)
  31. if not at_least_one_match:
  32. # Only if no other action is possible, can time advance:
  33. yield from low_priority_actions(od)
  34. sim = simulator.Simulator(
  35. action_generator=generate_actions,
  36. # decision_maker=simulator.InteractiveDecisionMaker(auto_proceed=False),
  37. decision_maker=simulator.RandomDecisionMaker(seed=0),
  38. termination_condition=lambda od: "Time is up" if od.get_slot_value(od.get_all_instances("Clock")[0][1], "time") >= 10 else None,
  39. check_conformance=True,
  40. verbose=True,
  41. renderer=lambda od: od_renderer.render_od(state, od.m, od.mm, hide_names=False),
  42. )
  43. sim.run(ODAPI(state, m_rt_initial, mm_rt))