run.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. from sccd.statechart.parser.xml import *
  2. from sccd.statechart.dynamic.statechart_instance import *
  3. if __name__ == "__main__":
  4. # Load model
  5. globals = Globals()
  6. rules = statechart_parser_rules(globals, path=".")
  7. statechart_model = parse_f("statechart_semantics.xml", [("statechart", rules)])
  8. globals.init_durations()
  9. # Generate semantic variants, and filter invalid ones
  10. variants = statechart_model.generate_semantic_variants()
  11. def is_valid(semantics):
  12. if semantics.combo_step_maximality > semantics.big_step_maximality:
  13. return False
  14. if semantics.assignment_memory_protocol != semantics.enabledness_memory_protocol:
  15. return False
  16. must_have_combo_steps = (semantics.input_event_lifeline == InputEventLifeline.FIRST_COMBO_STEP or
  17. semantics.internal_event_lifeline == InternalEventLifeline.NEXT_COMBO_STEP or
  18. semantics.enabledness_memory_protocol == MemoryProtocol.COMBO_STEP)
  19. if not must_have_combo_steps and semantics.combo_step_maximality > Maximality.TAKE_ONE:
  20. return False
  21. if semantics.big_step_maximality == Maximality.TAKE_ONE and must_have_combo_steps:
  22. return False
  23. return True
  24. valid_variants = [v for v in variants if is_valid(v.semantics)]
  25. print("Total variants:", len(variants))
  26. print("Valid variants:", len(valid_variants))
  27. # We'll need these mappings to translate the statechart's post-big-step configuration to a semantic configuration
  28. state_name_to_semantics = {
  29. "/P/BigStepMaximality/TakeOne": ("big_step_maximality", Maximality.TAKE_ONE),
  30. "/P/BigStepMaximality/Syntactic": ("big_step_maximality", Maximality.SYNTACTIC),
  31. "/P/BigStepMaximality/TakeMany": ("big_step_maximality", Maximality.TAKE_MANY),
  32. "/P/ComboStepMaximality/ComboStepMaximality/TakeOne": ("combo_step_maximality", Maximality.TAKE_ONE),
  33. "/P/ComboStepMaximality/ComboStepMaximality/Syntactic": ("combo_step_maximality", Maximality.SYNTACTIC),
  34. "/P/ComboStepMaximality/ComboStepMaximality/TakeMany": ("combo_step_maximality", Maximality.TAKE_MANY),
  35. "/P/InputEventLifeline/FirstSmallStep": ("input_event_lifeline", InputEventLifeline.FIRST_SMALL_STEP),
  36. "/P/InputEventLifeline/FirstComboStep": ("input_event_lifeline", InputEventLifeline.FIRST_COMBO_STEP),
  37. "/P/InputEventLifeline/Whole": ("input_event_lifeline", InputEventLifeline.WHOLE),
  38. "/P/InternalEventLifeline/InternalEventLifeline/NextSmallStep": ("internal_event_lifeline", InternalEventLifeline.NEXT_SMALL_STEP),
  39. "/P/InternalEventLifeline/InternalEventLifeline/NextComboStep": ("internal_event_lifeline", InternalEventLifeline.NEXT_COMBO_STEP),
  40. "/P/InternalEventLifeline/InternalEventLifeline/Remainder": ("internal_event_lifeline", InternalEventLifeline.REMAINDER),
  41. "/P/InternalEventLifeline/InternalEventLifeline/Queue": ("internal_event_lifeline", InternalEventLifeline.QUEUE),
  42. "/P/MemoryProtocol/MemoryProtocol/BigStep": ("enabledness_memory_protocol", MemoryProtocol.BIG_STEP),
  43. "/P/MemoryProtocol/MemoryProtocol/ComboStep": ("enabledness_memory_protocol", MemoryProtocol.COMBO_STEP),
  44. "/P/MemoryProtocol/MemoryProtocol/SmallStep": ("enabledness_memory_protocol", MemoryProtocol.SMALL_STEP),
  45. "/P/Priority/SourceParent": ("priority", Priority.SOURCE_PARENT),
  46. "/P/Priority/SourceChild": ("priority", Priority.SOURCE_CHILD),
  47. }
  48. state_id_to_semantics = {
  49. statechart_model.tree.state_dict[state_name].opt.state_id: tup
  50. for state_name, tup in state_name_to_semantics.items()
  51. }
  52. # Some mock callbacks that we have pass to the StatechartInstance
  53. def on_output(e: OutputEvent):
  54. pass
  55. def schedule(after, event, targets):
  56. return 0
  57. def cancel(id):
  58. pass
  59. # List of input events for the big-step is always the same, so declare it outside the loop
  60. input0_id = globals.events.get_id("input0")
  61. input_events = [InternalEvent(id=input0_id, name="", params=[])]
  62. # Here we will accumulate our wrongly-inferred semantic configurations
  63. incorrect = []
  64. for v in valid_variants:
  65. instance = StatechartInstance(
  66. statechart=v,
  67. object_manager=None,
  68. output_callback=on_output,
  69. schedule_callback=schedule,
  70. cancel_callback=cancel)
  71. instance.initialize()
  72. instance.big_step(input_events)
  73. inferred_semantics = SemanticConfiguration()
  74. for state_id in bm_items(instance.execution.configuration):
  75. if state_id in state_id_to_semantics:
  76. aspect_name, aspect_val = state_id_to_semantics[state_id]
  77. setattr(inferred_semantics, aspect_name, aspect_val)
  78. inferred_semantics.assignment_memory_protocol = inferred_semantics.enabledness_memory_protocol
  79. # print("\nActual semantics:")
  80. # print(v.semantics)
  81. # print("\nInferred semantics:")
  82. # print(inferred_semantics)
  83. if v.semantics != inferred_semantics:
  84. incorrect.append((v.semantics, inferred_semantics))
  85. if len(incorrect) > 0:
  86. for actual, inferred in incorrect:
  87. print("Actual semantics:")
  88. print(actual)
  89. print("Inferred semantics:")
  90. print(inferred)
  91. print("Did not correctly infer semantics for %d variants." % len(incorrect))
  92. else:
  93. print("Correctly inferred semantics for all semantic configurations!")