main.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import argparse
  2. import sys
  3. import time
  4. from functools import partial
  5. from pypdevs.DEVS import CoupledDEVS
  6. from pypdevs.simulator import Simulator
  7. from devstone import LI, HI, HO, HOmod, LI2HI, HI2LI, dLI, dHI
  8. from generator import Generator
  9. sys.setrecursionlimit(10000)
  10. def terminate(clock, model, timeLimit):
  11. # print(clock[0])
  12. if clock[0] > timeLimit:
  13. return True
  14. return False
  15. class DEVStoneEnvironment(CoupledDEVS):
  16. def __init__(self, name, devstone_model, num_gen_outputs=1, gen_period=None):
  17. super(DEVStoneEnvironment, self).__init__(name=name)
  18. generator = Generator("generator", num_gen_outputs, gen_period)
  19. self.addSubModel(generator)
  20. self.addSubModel(devstone_model)
  21. self.connectPorts(generator.o_out, devstone_model.i_in)
  22. if isinstance(devstone_model, HO) or isinstance(devstone_model, HOmod):
  23. self.connectPorts(generator.o_out, devstone_model.i_in2)
  24. MODEL_TYPES = ("LI", "HI", "HO", "HOmod", "LI2HI", "HI2LI", "dLI", "dHI")
  25. GEN_METHODS = ("start", "uniform", "end")
  26. def parse_args():
  27. parser = argparse.ArgumentParser(description='Script to compare DEVStone implementations with different engines')
  28. parser.add_argument('-m', '--model-type', required=True, help='DEVStone model type (LI, HI, HO, HOmod, LI2HI, HI2LI)')
  29. parser.add_argument('-d', '--depth', type=int, required=True, help='Number of recursive levels of the model.')
  30. parser.add_argument('-w', '--width', type=int, required=True, help='Width of each coupled model.')
  31. parser.add_argument('-i', '--int-cycles', type=int, default=0, help='Dhrystone cycles executed in internal transitions')
  32. parser.add_argument('-e', '--ext-cycles', type=int, default=0, help='Dhrystone cycles executed in external transitions')
  33. parser.add_argument('-f', '--flatten', action="store_true", help='Activate flattening on model')
  34. parser.add_argument('-c', '--chained', action="store_true", help='Use chained coordinator')
  35. parser.add_argument('-C', '--classic', action="store_true", default=False, help='Use classic DEVS simulator')
  36. parser.add_argument('-D', '--dynamic', action="store_true", default=False, help='Enables Dynamic Structure DEVS')
  37. parser.add_argument('-n', '--number', required=False, default=1, type=int, help='Number of models to be generated within a cycle in a single coupled model')
  38. parser.add_argument("-g", "--gen-mode", choices=GEN_METHODS, help="Determines the spread of model creation.")
  39. args = parser.parse_args()
  40. if args.model_type not in MODEL_TYPES:
  41. raise RuntimeError("Unrecognized model type.")
  42. return args
  43. if __name__ == '__main__':
  44. args = parse_args()
  45. devstone_model = None
  46. start_time = time.time()
  47. if args.model_type == "LI":
  48. devstone_model = LI("LI_root", args.depth, args.width, args.int_cycles, args.ext_cycles, 1)
  49. elif args.model_type == "HI":
  50. devstone_model = HI("HI_root", args.depth, args.width, args.int_cycles, args.ext_cycles, 1)
  51. elif args.model_type == "HO":
  52. devstone_model = HO("HO_root", args.depth, args.width, args.int_cycles, args.ext_cycles, 1)
  53. elif args.model_type == "HOmod":
  54. devstone_model = HOmod("HOmod_root", args.depth, args.width, args.int_cycles, args.ext_cycles, 1)
  55. elif args.model_type == "LI2HI":
  56. devstone_model = LI2HI("LI2HI_root", args.depth, args.width, args.int_cycles, args.ext_cycles, 1)
  57. elif args.model_type == "HI2LI":
  58. devstone_model = HI2LI("HI2LI_root", args.depth, args.width, args.int_cycles, args.ext_cycles, 1)
  59. elif args.model_type == "dLI":
  60. devstone_model = dLI("dLI_root", args.depth, args.width, args.int_cycles, args.ext_cycles, 1, number=args.number, gen_mode=args.gen_mode)
  61. elif args.model_type == "dHI":
  62. devstone_model = dHI("dHI_root", args.depth, args.width, args.int_cycles, args.ext_cycles, 1, number=args.number, gen_mode=args.gen_mode)
  63. env = DEVStoneEnvironment("DEVStoneEnvironment", devstone_model)
  64. model_created_time = time.time()
  65. # devstone_model.dot(f"{args.model_type}-before")
  66. import cProfile
  67. import pstats
  68. import io
  69. sim = Simulator(env)
  70. if args.classic:
  71. sim.setClassicDEVS(True)
  72. term = partial(terminate, timeLimit=1.5)
  73. if args.dynamic:
  74. sim.setDSDEVS(True)
  75. term = partial(terminate, timeLimit=args.width + 0.5)
  76. # adds massive overhead
  77. # sim.setTerminationCondition(term)
  78. # sim.setVerbose(None)
  79. # sim.setTerminationTime(10.0)
  80. # sim.setStateSaving("custom")
  81. engine_setup_time = time.time()
  82. # pr = cProfile.Profile()
  83. # pr.enable()
  84. sim.simulate()
  85. # pr.disable()
  86. sim_time = time.time()
  87. # s = io.StringIO()
  88. # sortby = pstats.SortKey.CUMULATIVE
  89. # ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
  90. # ps.print_stats()
  91. # print(s.getvalue())
  92. # devstone_model.dot(f"{args.model_type}-after")
  93. print("Model creation time: {}".format(model_created_time - start_time))
  94. print("Engine setup time: {}".format(engine_setup_time - model_created_time))
  95. print("Simulation time: {}".format(sim_time - engine_setup_time))