experiment.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. #! /bin/env python
  2. #import stacktracer
  3. #stacktracer.trace_start("trace.html",interval=1,auto=True) # Set auto flag to always update file!
  4. try:
  5. from mpi4py import MPI
  6. except ImportError:
  7. pass
  8. import models
  9. import sys
  10. from pypdevs.simulator import Simulator, loadCheckpoint
  11. mn = sys.argv[1]
  12. args = {}
  13. args["setTerminationTime"] = [40]
  14. args["setVerbose"] = ["output/" + mn.partition("_local")[0]]
  15. run = True
  16. def counter(t, m):
  17. return m.processor2.coupled[0].state.counter != float('inf')
  18. def counter_pull(t, m):
  19. s = m.processor1.coupled[0].getState(t)
  20. print(s.counter)
  21. return s.counter != float('inf')
  22. if mn == "confluent":
  23. model = models.Chain(1.00)
  24. elif mn == "confluent_local":
  25. model = models.Chain_local(1.00)
  26. elif mn == "rollback":
  27. args["setTerminationTime"] = [20000]
  28. model = models.Chain_bad()
  29. elif mn == "normal_long":
  30. args["setTerminationTime"] = [20000]
  31. #args["setVerbose"] = [False]
  32. model = models.Chain(0.66)
  33. elif mn == "normal_long_local":
  34. args["setTerminationTime"] = [20000]
  35. #args["setVerbose"] = [False]
  36. model = models.Chain_local(0.66)
  37. elif mn == "dualdepth":
  38. model = models.DualDepth(0.66)
  39. elif mn == "dualdepth_local":
  40. model = models.DualDepth_local(0.66)
  41. elif mn == "dual":
  42. model = models.DualChain(0.66)
  43. elif mn == "dual_local":
  44. model = models.DualChain_local(0.66)
  45. elif mn == "dual_mp":
  46. model = models.DualChainMP(0.66)
  47. elif mn == "dual_mp_local":
  48. model = models.DualChainMP_local(0.66)
  49. elif mn == "local":
  50. model = models.Local()
  51. elif mn == "local_local":
  52. model = models.Local()
  53. elif mn == "longtime":
  54. model = models.Chain(0.66)
  55. args["setTerminationTime"] = [200]
  56. elif mn == "longtime_local":
  57. model = models.Chain_local(0.66)
  58. args["setTerminationTime"] = [200]
  59. elif mn == "atomic_local":
  60. model = models.Generator()
  61. elif mn == "multi":
  62. model = models.Chain(0.50)
  63. elif mn == "multi_local":
  64. model = models.Chain_local(0.50)
  65. elif mn == "multinested":
  66. model = models.MultiNested()
  67. args["setTerminationTime"] = [10]
  68. elif mn == "nested_local":
  69. model = models.Nested_local()
  70. args["setTerminationTime"] = [20]
  71. elif mn == "nested_realtime_local":
  72. model = models.Nested_local()
  73. args["setTerminationTime"] = [20]
  74. args["setRealTime"] = [True]
  75. args["setRealTimePorts"] = [{}]
  76. args["setRealTimePlatformThreads"] = []
  77. elif mn == "remotedc":
  78. model = models.RemoteDC()
  79. elif mn == "remotedc_long":
  80. args["setTerminationTime"] = [200]
  81. model = models.RemoteDC()
  82. elif mn == "normal":
  83. model = models.Chain(0.66)
  84. elif mn == "allocate":
  85. args["setTerminationTime"] = [10000]
  86. args["setGreedyAllocator"] = []
  87. #args["setDrawModel"] = [True, "model.dot", False]
  88. model = models.Chain(0.66)
  89. elif mn == "normal_local":
  90. model = models.Chain_local(0.66)
  91. elif mn == "zeroLookahead":
  92. model = models.Chain(0.00)
  93. elif mn == "zeroLookahead_local":
  94. model = models.Chain_local(0.00)
  95. elif mn == "stateStop":
  96. model = models.Chain(0.66)
  97. args["setTerminationModel"] = [model.processor2.coupled[0]]
  98. args["setTerminationCondition"] = [counter]
  99. del args["setTerminationTime"]
  100. elif mn == "stateStop_local":
  101. model = models.Chain_local(0.66)
  102. args["setTerminationModel"] = [model.processor2.coupled[0]]
  103. args["setTerminationCondition"] = [counter]
  104. del args["setTerminationTime"]
  105. elif mn == "checkpoint":
  106. model = models.Chain(0.66)
  107. args["setTerminationTime"] = [2000]
  108. args["setCheckpointing"] = ["testing", 1]
  109. if loadCheckpoint("testing") is not None:
  110. run = False
  111. elif mn == "checkpoint_long":
  112. model = models.Chain(0.66)
  113. args["setTerminationTime"] = [20000]
  114. args["setCheckpointing"] = ["testing", 1]
  115. if loadCheckpoint("testing") is not None:
  116. run = False
  117. elif mn == "checkpoint_long_local":
  118. model = models.Chain_local(0.66)
  119. args["setTerminationTime"] = [20000]
  120. args["setCheckpointing"] = ["testing", 1]
  121. if loadCheckpoint("testing") is not None:
  122. run = False
  123. elif mn == "autodist":
  124. model = models.AutoDistChain(3, totalAtomics=500, iterations=1)
  125. elif mn == "autodist_original":
  126. from mpi4py import MPI
  127. model = models.AutoDistChain(MPI.COMM_WORLD.Get_size(), totalAtomics=500, iterations=1)
  128. elif mn == "autodist_checkpoint":
  129. from mpi4py import MPI
  130. model = models.AutoDistChain(MPI.COMM_WORLD.Get_size(), totalAtomics=500, iterations=1)
  131. args["setTerminationTime"] = [200]
  132. args["setShowProgress"] = []
  133. args["setCheckpointing"] = ["testing", 1]
  134. if loadCheckpoint("testing") is not None:
  135. run = False
  136. elif mn == "relocation":
  137. model = models.Chain(0.66)
  138. args["setTerminationTime"] = [2000]
  139. args["setRelocationDirectives"] = [[[500, model.processor1.coupled[0], 0], [1000, model.processor1.coupled[0], 2]]]
  140. args["setGVTInterval"] = [1]
  141. elif mn == "relocation_activity":
  142. model = models.Chain(0.66)
  143. args["setTerminationTime"] = [20000]
  144. args["setActivityRelocatorBasicBoundary"] = [1.2]
  145. del args["setVerbose"]
  146. args["setGVTInterval"] = [2]
  147. elif mn == "relocation_noactivity":
  148. model = models.Chain(0.66)
  149. args["setTerminationTime"] = [20000]
  150. del args["setVerbose"]
  151. args["setGVTInterval"] = [2]
  152. elif mn == "boundary":
  153. model = models.Boundary()
  154. args["setTerminationTime"] = [2000]
  155. args["setRelocationDirectives"] = [[[100, 2, 0]]]
  156. args["setGVTInterval"] = [1]
  157. elif mn == "relocation_faster":
  158. model = models.Chain(0.66)
  159. del args["setVerbose"]
  160. args["setTerminationTime"] = [20000]
  161. args["setRelocationDirectives"] = [[[0, model.processor1.coupled[0], 1], [0, model.processor2.coupled[0], 2], [0, model.processor2.coupled[1], 2]]]
  162. elif mn.startswith("realtime"):
  163. from trafficLightModel import *
  164. model = TrafficSystem(name="trafficSystem")
  165. refs = {"INTERRUPT": model.trafficLight.INTERRUPT}
  166. args["setVerbose"] = ["output/realtime"]
  167. args["setTerminationTime"] = [35]
  168. if "0.5" in mn:
  169. scale = 0.5
  170. elif "2.0" in mn:
  171. scale = 2.0
  172. else:
  173. scale = 1.0
  174. args["setRealTime"] = [True, scale]
  175. args["setRealTimeInputFile"] = ["testmodels/input"]
  176. args["setRealTimePorts"] = [refs]
  177. if mn.startswith("realtime_thread"):
  178. args["setRealTimePlatformThreads"] = []
  179. elif mn.startswith("realtime_loop"):
  180. args["setRealTimePlatformGameLoop"] = []
  181. elif mn.startswith("realtime_tk"):
  182. try:
  183. from Tkinter import *
  184. except ImportError:
  185. from tkinter import *
  186. myTk = Tk()
  187. args["setRealTimePlatformTk"] = [myTk]
  188. else:
  189. print("Unknown subsystem requested")
  190. sys.exit(1)
  191. elif mn == "progress":
  192. model = models.Chain(0.66)
  193. args["setShowProgress"] = []
  194. args["setTerminationTime"] = [2000]
  195. elif mn == "progress_local":
  196. model = models.Chain_local(0.66)
  197. args["setShowProgress"] = []
  198. args["setTerminationTime"] = [2000]
  199. elif mn == "trace":
  200. model = models.Binary()
  201. args["setVCD"] = ["devstrace.vcd"]
  202. args["setXML"] = ["devstrace.xml"]
  203. elif mn == "trace_local":
  204. model = models.Binary_local()
  205. args["setVCD"] = ["devstrace.vcd"]
  206. args["setXML"] = ["devstrace.xml"]
  207. elif mn == "fetch":
  208. model = models.Chain(0.66)
  209. args["setFetchAllAfterSimulation"] = []
  210. elif mn == "draw":
  211. model = models.Chain(0.66)
  212. args["setDrawModel"] = [True]
  213. elif mn == "draw_local":
  214. model = models.Chain_local(0.66)
  215. args["setDrawModel"] = [True]
  216. elif mn == "auto_allocate":
  217. # Take the local variant, as this does not contain location info
  218. model = models.Chain_local(0.66)
  219. args["setDrawModel"] = [True]
  220. args["setAutoAllocator"] = []
  221. elif mn == "multiinputs":
  222. model = models.MultipleInputs()
  223. elif mn == "multiinputs_local":
  224. model = models.MultipleInputs_local()
  225. elif mn == "doublelayer_local":
  226. model = models.DoubleLayerRoot()
  227. elif mn == "dynamicstructure_local":
  228. model = models.DSDEVSRoot()
  229. args["setDSDEVS"] = [True]
  230. elif mn == "dynamicstructure_realtime_local":
  231. model = models.DSDEVSRoot()
  232. args["setRealTime"] = [True]
  233. args["setRealTimePorts"] = [{}]
  234. args["setRealTimePlatformThreads"] = []
  235. args["setDSDEVS"] = [True]
  236. elif mn == "classicDEVS_local":
  237. model = models.ClassicCoupled()
  238. args["setClassicDEVS"] = [True]
  239. elif mn == "classicDEVSconnect_local":
  240. model = models.AllConnectClassic()
  241. args["setClassicDEVS"] = [True]
  242. elif mn == "random":
  243. model = models.RandomCoupled()
  244. elif mn == "random_local":
  245. model = models.RandomCoupled_local()
  246. elif mn == "stateStop_pull":
  247. model = models.Chain(0.66)
  248. args["setTerminationCondition"] = [counter_pull]
  249. del args["setTerminationTime"]
  250. elif mn.startswith("reinit"):
  251. model = models.AutoDistChain(3, totalAtomics=500, iterations=1)
  252. if "local" in mn:
  253. model.forceSequential()
  254. sim = Simulator(model)
  255. sim.setAllowLocalReinit(True)
  256. sim.setTerminationTime(40)
  257. sim.setVerbose("output/reinit1")
  258. sim.simulate()
  259. sim.reinit()
  260. sim.setVerbose("output/reinit2")
  261. sim.setModelStateAttr(model.generator.generator, "value", 2)
  262. sim.simulate()
  263. sim.reinit()
  264. sim.setVerbose("output/reinit3")
  265. sim.setModelStateAttr(model.generator.generator, "value", 3)
  266. sim.simulate()
  267. run = False
  268. elif mn.startswith("multisim"):
  269. if "local" in mn:
  270. sim = Simulator(models.Chain_local(0.66))
  271. else:
  272. sim = Simulator(models.Chain(0.66))
  273. sim.setVerbose("output/normal")
  274. sim.setTerminationTime(40)
  275. sim.simulate()
  276. if "local" in mn:
  277. sim2 = Simulator(models.DualDepth_local(0.66))
  278. else:
  279. sim2 = Simulator(models.DualDepth(0.66))
  280. sim2.setVerbose("output/dualdepth")
  281. sim2.setTerminationTime(40)
  282. sim2.simulate()
  283. run = False
  284. elif mn.startswith("continue"):
  285. if "local" in mn:
  286. sim = Simulator(models.Chain_local(0.66))
  287. else:
  288. sim = Simulator(models.Chain(0.66))
  289. sim.setVerbose("output/run1")
  290. sim.setTerminationTime(100.0)
  291. sim.simulate()
  292. sim.setModelStateAttr(sim.model.generator.generator, "value", 2)
  293. sim.setVerbose("output/run2")
  294. sim.setTerminationTime(200.0)
  295. sim.simulate()
  296. run = False
  297. elif mn.startswith("z"):
  298. if "local" in mn:
  299. model = models.ZChain_local()
  300. else:
  301. model = models.ZChain()
  302. if run:
  303. sim = Simulator(model)
  304. for arg in args.keys():
  305. function = getattr(sim, arg)
  306. function(*args[arg])
  307. sim.simulate()
  308. if mn.startswith("realtime_loop"):
  309. # Start a game loop ourselves
  310. import time
  311. start_time = time.time()
  312. while time.time() < start_time + 35.5 * scale:
  313. before = time.time()
  314. sim.realtime_loop_call()
  315. time.sleep(0.001 - (before - time.time()))
  316. elif mn.startswith("realtime_tk"):
  317. myTk.after(int(35000 * scale), myTk.quit)
  318. myTk.mainloop()
  319. elif mn.startswith("realtime_thread"):
  320. import time
  321. time.sleep((35+0.2) * scale)
  322. elif "realtime" in mn:
  323. import time
  324. time.sleep(args["setTerminationTime"][0])
  325. elif mn == "fetch":
  326. f = open(args["setVerbose"][0], 'w')
  327. f.write("Generator: " + str(model.generator.generator.state) + "\n")
  328. f.write("Processor1.Processor1: " + str(model.processor1.coupled[0].state) + "\n")
  329. f.write("Processor1.Processor2: " + str(model.processor1.coupled[1].state) + "\n")
  330. f.write("Processor2.Processor1: " + str(model.processor2.coupled[0].state) + "\n")
  331. f.write("Processor2.Processor2: " + str(model.processor2.coupled[1].state) + "\n")
  332. f.write("Processor2.Processor3: " + str(model.processor2.coupled[2].state) + "\n")
  333. f.close()