experiment.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  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. from Tkinter import *
  183. myTk = Tk()
  184. args["setRealTimePlatformTk"] = [myTk]
  185. else:
  186. print("Unknown subsystem requested")
  187. sys.exit(1)
  188. elif mn == "progress":
  189. model = models.Chain(0.66)
  190. args["setShowProgress"] = []
  191. args["setTerminationTime"] = [2000]
  192. elif mn == "progress_local":
  193. model = models.Chain_local(0.66)
  194. args["setShowProgress"] = []
  195. args["setTerminationTime"] = [2000]
  196. elif mn == "trace":
  197. model = models.Binary()
  198. args["setVCD"] = ["devstrace.vcd"]
  199. args["setXML"] = ["devstrace.xml"]
  200. elif mn == "trace_local":
  201. model = models.Binary_local()
  202. args["setVCD"] = ["devstrace.vcd"]
  203. args["setXML"] = ["devstrace.xml"]
  204. elif mn == "fetch":
  205. model = models.Chain(0.66)
  206. args["setFetchAllAfterSimulation"] = []
  207. elif mn == "draw":
  208. model = models.Chain(0.66)
  209. args["setDrawModel"] = [True]
  210. elif mn == "draw_local":
  211. model = models.Chain_local(0.66)
  212. args["setDrawModel"] = [True]
  213. elif mn == "auto_allocate":
  214. # Take the local variant, as this does not contain location info
  215. model = models.Chain_local(0.66)
  216. args["setDrawModel"] = [True]
  217. args["setAutoAllocator"] = []
  218. elif mn == "multiinputs":
  219. model = models.MultipleInputs()
  220. elif mn == "multiinputs_local":
  221. model = models.MultipleInputs_local()
  222. elif mn == "doublelayer_local":
  223. model = models.DoubleLayerRoot()
  224. elif mn == "dynamicstructure_local":
  225. model = models.DSDEVSRoot()
  226. args["setDSDEVS"] = [True]
  227. elif mn == "dynamicstructure_realtime_local":
  228. model = models.DSDEVSRoot()
  229. args["setRealTime"] = [True]
  230. args["setRealTimePorts"] = [{}]
  231. args["setRealTimePlatformThreads"] = []
  232. args["setDSDEVS"] = [True]
  233. elif mn == "classicDEVS_local":
  234. model = models.ClassicCoupled()
  235. args["setClassicDEVS"] = [True]
  236. elif mn == "classicDEVSconnect_local":
  237. model = models.AllConnectClassic()
  238. args["setClassicDEVS"] = [True]
  239. elif mn == "random":
  240. model = models.RandomCoupled()
  241. elif mn == "random_local":
  242. model = models.RandomCoupled_local()
  243. elif mn == "stateStop_pull":
  244. model = models.Chain(0.66)
  245. args["setTerminationCondition"] = [counter_pull]
  246. del args["setTerminationTime"]
  247. elif mn.startswith("reinit"):
  248. model = models.AutoDistChain(3, totalAtomics=500, iterations=1)
  249. if "local" in mn:
  250. model.forceSequential()
  251. sim = Simulator(model)
  252. sim.setAllowLocalReinit(True)
  253. sim.setTerminationTime(40)
  254. sim.setVerbose("output/reinit1")
  255. sim.simulate()
  256. sim.reinit()
  257. sim.setVerbose("output/reinit2")
  258. sim.setModelStateAttr(model.generator.generator, "value", 2)
  259. sim.simulate()
  260. sim.reinit()
  261. sim.setVerbose("output/reinit3")
  262. sim.setModelStateAttr(model.generator.generator, "value", 3)
  263. sim.simulate()
  264. run = False
  265. elif mn.startswith("multisim"):
  266. if "local" in mn:
  267. sim = Simulator(models.Chain_local(0.66))
  268. else:
  269. sim = Simulator(models.Chain(0.66))
  270. sim.setVerbose("output/normal")
  271. sim.setTerminationTime(40)
  272. sim.simulate()
  273. if "local" in mn:
  274. sim2 = Simulator(models.DualDepth_local(0.66))
  275. else:
  276. sim2 = Simulator(models.DualDepth(0.66))
  277. sim2.setVerbose("output/dualdepth")
  278. sim2.setTerminationTime(40)
  279. sim2.simulate()
  280. run = False
  281. elif mn.startswith("continue"):
  282. if "local" in mn:
  283. sim = Simulator(models.Chain_local(0.66))
  284. else:
  285. sim = Simulator(models.Chain(0.66))
  286. sim.setVerbose("output/run1")
  287. sim.setTerminationTime(100.0)
  288. sim.simulate()
  289. sim.setModelStateAttr(sim.model.generator.generator, "value", 2)
  290. sim.setVerbose("output/run2")
  291. sim.setTerminationTime(200.0)
  292. sim.simulate()
  293. run = False
  294. elif mn.startswith("z"):
  295. if "local" in mn:
  296. model = models.ZChain_local()
  297. else:
  298. model = models.ZChain()
  299. if run:
  300. sim = Simulator(model)
  301. for arg in args.keys():
  302. function = getattr(sim, arg)
  303. function(*args[arg])
  304. sim.simulate()
  305. if mn.startswith("realtime_loop"):
  306. # Start a game loop ourselves
  307. import time
  308. start_time = time.time()
  309. while time.time() < start_time + 35.5 * scale:
  310. before = time.time()
  311. sim.realtime_loop_call()
  312. time.sleep(0.001 - (before - time.time()))
  313. elif mn.startswith("realtime_tk"):
  314. myTk.after(int(35000 * scale), myTk.quit)
  315. myTk.mainloop()
  316. elif mn.startswith("realtime_thread"):
  317. import time
  318. time.sleep((35+0.2) * scale)
  319. elif "realtime" in mn:
  320. import time
  321. time.sleep(args["setTerminationTime"][0])
  322. elif mn == "fetch":
  323. f = open(args["setVerbose"][0], 'w')
  324. f.write("Generator: " + str(model.generator.generator.state) + "\n")
  325. f.write("Processor1.Processor1: " + str(model.processor1.coupled[0].state) + "\n")
  326. f.write("Processor1.Processor2: " + str(model.processor1.coupled[1].state) + "\n")
  327. f.write("Processor2.Processor1: " + str(model.processor2.coupled[0].state) + "\n")
  328. f.write("Processor2.Processor2: " + str(model.processor2.coupled[1].state) + "\n")
  329. f.write("Processor2.Processor3: " + str(model.processor2.coupled[2].state) + "\n")
  330. f.close()