simulator.py 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. """
  2. Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
  3. Model author: Simon Van Mierlo
  4. Model name: NetLogo debugging-enhanced simulator
  5. Model description:
  6. A NetLogo simulator (enhanced with debugging support).
  7. """
  8. from sccd.runtime.statecharts_core import *
  9. import pyNetLogo
  10. import pprint, time
  11. class Breakpoint(object):
  12. def __init__(self, breakpoint_id, function, enabled, disable_on_trigger):
  13. self.id = breakpoint_id
  14. self.function = function
  15. self.enabled = enabled
  16. self.disable_on_trigger = disable_on_trigger
  17. # package "NetLogo debugging-enhanced simulator"
  18. class NetLogoSimulator(RuntimeClassBase):
  19. def __init__(self, controller, model):
  20. RuntimeClassBase.__init__(self, controller)
  21. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  22. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  23. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  24. self.semantics.priority = StatechartSemantics.SourceParent
  25. self.semantics.concurrency = StatechartSemantics.Single
  26. # build Statechart structure
  27. self.build_statechart_structure()
  28. # call user defined constructor
  29. NetLogoSimulator.user_defined_constructor(self, model)
  30. def user_defined_constructor(self, model):
  31. self.link = pyNetLogo.NetLogoLink(gui=True,
  32. netlogo_home="C:\\Program Files\\NetLogo 6.0.3",
  33. netlogo_version="6")
  34. self.link.load_model(model)
  35. self.attr_names = self.link.report('last last reflection:breeds')
  36. self.link.command("setup")
  37. self.ignored_attributes = set(["WHO", "HEADING", "SHAPE", "LABEL", "LABEL-COLOR", "BREED", "HIDDEN?", "PEN-SIZE", "PEN-MODE"])
  38. self.breakpoints = []
  39. self.realtime_scale = 1.0
  40. self.simulation_time = 0
  41. self.time_next = 1
  42. self.turtles = {}
  43. # Values to be set during simulation
  44. self.realtime_starttime = None
  45. def user_defined_destructor(self):
  46. pass
  47. # user defined method
  48. def turtles_created(self, new_turtles):
  49. return set(new_turtles.keys()) - set(self.turtles.keys())
  50. # user defined method
  51. def turtles_deleted(self, new_turtles):
  52. return set(self.turtles.keys()) - set(new_turtles.keys())
  53. # user defined method
  54. def get_all_turtles(self):
  55. try:
  56. all_turtle_attributes = self.link.report("reflection:turtles")
  57. except:
  58. all_turtle_attributes = {}
  59. turtles = {}
  60. for turtle_attributes in all_turtle_attributes:
  61. the_turtle = dict(zip(self.attr_names, turtle_attributes.getResultAsObject()))
  62. turtles[int(float(the_turtle["WHO"]))] = the_turtle
  63. turtles = {k: {ak: av for ak, av in turtles[k].iteritems() if ak not in self.ignored_attributes} for k in turtles.keys()}
  64. return turtles
  65. # user defined method
  66. def breakpoint_triggers(self):
  67. breakpoint_id = -1
  68. for bp in self.breakpoints:
  69. if not bp.enabled:
  70. continue
  71. # Include the function in the scope
  72. exec(bp.function)
  73. # And execute it, note that the breakpoint thus has to start with "def breakpoint("
  74. if breakpoint(self.link.report("ticks"), self.turtles):
  75. # Triggered!
  76. breakpoint_id = bp.id
  77. else:
  78. # Not triggered, so continue
  79. continue
  80. return breakpoint_id
  81. # user defined method
  82. def process_breakpoints(self):
  83. breakpoint_id = self.breakpoint_triggers()
  84. if (breakpoint_id != -1):
  85. for breakpoint in self.breakpoints:
  86. if breakpoint.id == breakpoint_id:
  87. if breakpoint.disable_on_trigger:
  88. breakpoint.enabled = False
  89. return breakpoint_id
  90. # user defined method
  91. def calculate_after(self):
  92. try:
  93. # Process in parts of 100 milliseconds to repeatedly check the termination condition
  94. nexttime = (self.time_next - (time.time() - self.realtime_starttime) / self.realtime_scale) * self.realtime_scale
  95. x = min(0.1, nexttime)
  96. return x
  97. except (TypeError, AttributeError) as e:
  98. # We are probably not simulating in realtime...
  99. return float('inf')
  100. # user defined method
  101. def parse_options(self, configuration):
  102. self.realtime_scale = 1.0 if "realtime_scale" not in configuration else 1.0/configuration["realtime_scale"]
  103. # Subtract the current simulation time to allow for pausing
  104. self.realtime_starttime = (time.time() - self.simulation_time * self.realtime_scale)
  105. # Reset the time used in the waiting, as it might not get recomputed
  106. self.the_time = 0.00001
  107. # builds Statechart structure
  108. def build_statechart_structure(self):
  109. # state <root>
  110. self.states[""] = State(0, "", self)
  111. # state /main
  112. self.states["/main"] = ParallelState(1, "/main", self)
  113. # state /main/simulation_flow
  114. self.states["/main/simulation_flow"] = State(2, "/main/simulation_flow", self)
  115. # state /main/simulation_flow/initialize
  116. self.states["/main/simulation_flow/initialize"] = State(3, "/main/simulation_flow/initialize", self)
  117. # state /main/simulation_flow/check_termination
  118. self.states["/main/simulation_flow/check_termination"] = State(4, "/main/simulation_flow/check_termination", self)
  119. self.states["/main/simulation_flow/check_termination"].setExit(self._main_simulation_flow_check_termination_exit)
  120. # state /main/simulation_flow/check_termination/workaround
  121. self.states["/main/simulation_flow/check_termination/workaround"] = State(5, "/main/simulation_flow/check_termination/workaround", self)
  122. self.states["/main/simulation_flow/check_termination/workaround"].setEnter(self._main_simulation_flow_check_termination_workaround_enter)
  123. self.states["/main/simulation_flow/check_termination/workaround"].setExit(self._main_simulation_flow_check_termination_workaround_exit)
  124. # state /main/simulation_flow/check_termination/wait
  125. self.states["/main/simulation_flow/check_termination/wait"] = State(6, "/main/simulation_flow/check_termination/wait", self)
  126. self.states["/main/simulation_flow/check_termination/wait"].setEnter(self._main_simulation_flow_check_termination_wait_enter)
  127. self.states["/main/simulation_flow/check_termination/wait"].setExit(self._main_simulation_flow_check_termination_wait_exit)
  128. # state /main/simulation_flow/check_termination/check_termination
  129. self.states["/main/simulation_flow/check_termination/check_termination"] = State(7, "/main/simulation_flow/check_termination/check_termination", self)
  130. self.states["/main/simulation_flow/check_termination/check_termination"].setEnter(self._main_simulation_flow_check_termination_check_termination_enter)
  131. # state /main/simulation_flow/execute_step
  132. self.states["/main/simulation_flow/execute_step"] = State(8, "/main/simulation_flow/execute_step", self)
  133. self.states["/main/simulation_flow/execute_step"].setEnter(self._main_simulation_flow_execute_step_enter)
  134. # state /main/simulation_flow/execute_step/executing_step
  135. self.states["/main/simulation_flow/execute_step/executing_step"] = State(9, "/main/simulation_flow/execute_step/executing_step", self)
  136. # state /main/simulation_state
  137. self.states["/main/simulation_state"] = State(10, "/main/simulation_state", self)
  138. # state /main/simulation_state/paused
  139. self.states["/main/simulation_state/paused"] = State(11, "/main/simulation_state/paused", self)
  140. # state /main/simulation_state/continuous
  141. self.states["/main/simulation_state/continuous"] = State(12, "/main/simulation_state/continuous", self)
  142. # state /main/simulation_state/realtime
  143. self.states["/main/simulation_state/realtime"] = State(13, "/main/simulation_state/realtime", self)
  144. # state /main/reset_manager
  145. self.states["/main/reset_manager"] = State(14, "/main/reset_manager", self)
  146. # state /main/reset_manager/listening
  147. self.states["/main/reset_manager/listening"] = State(15, "/main/reset_manager/listening", self)
  148. # state /main/breakpoint_manager
  149. self.states["/main/breakpoint_manager"] = State(16, "/main/breakpoint_manager", self)
  150. # state /main/breakpoint_manager/breakpoint_manage
  151. self.states["/main/breakpoint_manager/breakpoint_manage"] = State(17, "/main/breakpoint_manager/breakpoint_manage", self)
  152. # add children
  153. self.states[""].addChild(self.states["/main"])
  154. self.states["/main"].addChild(self.states["/main/simulation_flow"])
  155. self.states["/main"].addChild(self.states["/main/simulation_state"])
  156. self.states["/main"].addChild(self.states["/main/reset_manager"])
  157. self.states["/main"].addChild(self.states["/main/breakpoint_manager"])
  158. self.states["/main/simulation_flow"].addChild(self.states["/main/simulation_flow/initialize"])
  159. self.states["/main/simulation_flow"].addChild(self.states["/main/simulation_flow/check_termination"])
  160. self.states["/main/simulation_flow"].addChild(self.states["/main/simulation_flow/execute_step"])
  161. self.states["/main/simulation_flow/check_termination"].addChild(self.states["/main/simulation_flow/check_termination/workaround"])
  162. self.states["/main/simulation_flow/check_termination"].addChild(self.states["/main/simulation_flow/check_termination/wait"])
  163. self.states["/main/simulation_flow/check_termination"].addChild(self.states["/main/simulation_flow/check_termination/check_termination"])
  164. self.states["/main/simulation_flow/execute_step"].addChild(self.states["/main/simulation_flow/execute_step/executing_step"])
  165. self.states["/main/simulation_state"].addChild(self.states["/main/simulation_state/paused"])
  166. self.states["/main/simulation_state"].addChild(self.states["/main/simulation_state/continuous"])
  167. self.states["/main/simulation_state"].addChild(self.states["/main/simulation_state/realtime"])
  168. self.states["/main/reset_manager"].addChild(self.states["/main/reset_manager/listening"])
  169. self.states["/main/breakpoint_manager"].addChild(self.states["/main/breakpoint_manager/breakpoint_manage"])
  170. self.states[""].fixTree()
  171. self.states[""].default_state = self.states["/main"]
  172. self.states["/main/simulation_flow"].default_state = self.states["/main/simulation_flow/initialize"]
  173. self.states["/main/simulation_flow/check_termination"].default_state = self.states["/main/simulation_flow/check_termination/workaround"]
  174. self.states["/main/simulation_flow/execute_step"].default_state = self.states["/main/simulation_flow/execute_step/executing_step"]
  175. self.states["/main/simulation_state"].default_state = self.states["/main/simulation_state/paused"]
  176. self.states["/main/reset_manager"].default_state = self.states["/main/reset_manager/listening"]
  177. self.states["/main/breakpoint_manager"].default_state = self.states["/main/breakpoint_manager/breakpoint_manage"]
  178. # transition /main/simulation_flow/initialize
  179. _main_simulation_flow_initialize_0 = Transition(self, self.states["/main/simulation_flow/initialize"], [self.states["/main/simulation_flow/check_termination"]])
  180. _main_simulation_flow_initialize_0.setAction(self._main_simulation_flow_initialize_0_exec)
  181. _main_simulation_flow_initialize_0.setTrigger(None)
  182. self.states["/main/simulation_flow/initialize"].addTransition(_main_simulation_flow_initialize_0)
  183. # transition /main/simulation_flow/check_termination/workaround
  184. _main_simulation_flow_check_termination_workaround_0 = Transition(self, self.states["/main/simulation_flow/check_termination/workaround"], [self.states["/main/simulation_flow/check_termination/check_termination"]])
  185. _main_simulation_flow_check_termination_workaround_0.setTrigger(Event("_0after"))
  186. self.states["/main/simulation_flow/check_termination/workaround"].addTransition(_main_simulation_flow_check_termination_workaround_0)
  187. # transition /main/simulation_flow/check_termination/wait
  188. _main_simulation_flow_check_termination_wait_0 = Transition(self, self.states["/main/simulation_flow/check_termination/wait"], [self.states["/main/simulation_flow/check_termination/check_termination"]])
  189. _main_simulation_flow_check_termination_wait_0.setTrigger(Event("_1after"))
  190. self.states["/main/simulation_flow/check_termination/wait"].addTransition(_main_simulation_flow_check_termination_wait_0)
  191. _main_simulation_flow_check_termination_wait_1 = Transition(self, self.states["/main/simulation_flow/check_termination/wait"], [self.states["/main/simulation_flow/check_termination/check_termination"]])
  192. _main_simulation_flow_check_termination_wait_1.setTrigger(None)
  193. _main_simulation_flow_check_termination_wait_1.setGuard(self._main_simulation_flow_check_termination_wait_1_guard)
  194. self.states["/main/simulation_flow/check_termination/wait"].addTransition(_main_simulation_flow_check_termination_wait_1)
  195. # transition /main/simulation_flow/check_termination/check_termination
  196. _main_simulation_flow_check_termination_check_termination_0 = Transition(self, self.states["/main/simulation_flow/check_termination/check_termination"], [self.states["/main/simulation_flow/check_termination/workaround"]])
  197. _main_simulation_flow_check_termination_check_termination_0.setAction(self._main_simulation_flow_check_termination_check_termination_0_exec)
  198. _main_simulation_flow_check_termination_check_termination_0.setTrigger(None)
  199. _main_simulation_flow_check_termination_check_termination_0.setGuard(self._main_simulation_flow_check_termination_check_termination_0_guard)
  200. self.states["/main/simulation_flow/check_termination/check_termination"].addTransition(_main_simulation_flow_check_termination_check_termination_0)
  201. _main_simulation_flow_check_termination_check_termination_1 = Transition(self, self.states["/main/simulation_flow/check_termination/check_termination"], [self.states["/main/simulation_flow/execute_step"]])
  202. _main_simulation_flow_check_termination_check_termination_1.setTrigger(None)
  203. _main_simulation_flow_check_termination_check_termination_1.setGuard(self._main_simulation_flow_check_termination_check_termination_1_guard)
  204. self.states["/main/simulation_flow/check_termination/check_termination"].addTransition(_main_simulation_flow_check_termination_check_termination_1)
  205. _main_simulation_flow_check_termination_check_termination_2 = Transition(self, self.states["/main/simulation_flow/check_termination/check_termination"], [self.states["/main/simulation_flow/execute_step"]])
  206. _main_simulation_flow_check_termination_check_termination_2.setTrigger(Event("step", "request"))
  207. self.states["/main/simulation_flow/check_termination/check_termination"].addTransition(_main_simulation_flow_check_termination_check_termination_2)
  208. _main_simulation_flow_check_termination_check_termination_3 = Transition(self, self.states["/main/simulation_flow/check_termination/check_termination"], [self.states["/main/simulation_flow/check_termination/wait"]])
  209. _main_simulation_flow_check_termination_check_termination_3.setTrigger(None)
  210. _main_simulation_flow_check_termination_check_termination_3.setGuard(self._main_simulation_flow_check_termination_check_termination_3_guard)
  211. self.states["/main/simulation_flow/check_termination/check_termination"].addTransition(_main_simulation_flow_check_termination_check_termination_3)
  212. _main_simulation_flow_check_termination_check_termination_4 = Transition(self, self.states["/main/simulation_flow/check_termination/check_termination"], [self.states["/main/simulation_flow/execute_step"]])
  213. _main_simulation_flow_check_termination_check_termination_4.setTrigger(None)
  214. _main_simulation_flow_check_termination_check_termination_4.setGuard(self._main_simulation_flow_check_termination_check_termination_4_guard)
  215. self.states["/main/simulation_flow/check_termination/check_termination"].addTransition(_main_simulation_flow_check_termination_check_termination_4)
  216. _main_simulation_flow_check_termination_check_termination_5 = Transition(self, self.states["/main/simulation_flow/check_termination/check_termination"], [self.states["/main/simulation_flow/check_termination/workaround"]])
  217. _main_simulation_flow_check_termination_check_termination_5.setAction(self._main_simulation_flow_check_termination_check_termination_5_exec)
  218. _main_simulation_flow_check_termination_check_termination_5.setTrigger(Event("god_event", "request"))
  219. _main_simulation_flow_check_termination_check_termination_5.setGuard(self._main_simulation_flow_check_termination_check_termination_5_guard)
  220. self.states["/main/simulation_flow/check_termination/check_termination"].addTransition(_main_simulation_flow_check_termination_check_termination_5)
  221. # transition /main/simulation_flow/execute_step/executing_step
  222. _main_simulation_flow_execute_step_executing_step_0 = Transition(self, self.states["/main/simulation_flow/execute_step/executing_step"], [self.states["/main/simulation_flow/check_termination"]])
  223. _main_simulation_flow_execute_step_executing_step_0.setAction(self._main_simulation_flow_execute_step_executing_step_0_exec)
  224. _main_simulation_flow_execute_step_executing_step_0.setTrigger(None)
  225. _main_simulation_flow_execute_step_executing_step_0.setGuard(self._main_simulation_flow_execute_step_executing_step_0_guard)
  226. self.states["/main/simulation_flow/execute_step/executing_step"].addTransition(_main_simulation_flow_execute_step_executing_step_0)
  227. _main_simulation_flow_execute_step_executing_step_1 = Transition(self, self.states["/main/simulation_flow/execute_step/executing_step"], [self.states["/main/simulation_flow/check_termination"]])
  228. _main_simulation_flow_execute_step_executing_step_1.setAction(self._main_simulation_flow_execute_step_executing_step_1_exec)
  229. _main_simulation_flow_execute_step_executing_step_1.setTrigger(None)
  230. _main_simulation_flow_execute_step_executing_step_1.setGuard(self._main_simulation_flow_execute_step_executing_step_1_guard)
  231. self.states["/main/simulation_flow/execute_step/executing_step"].addTransition(_main_simulation_flow_execute_step_executing_step_1)
  232. # transition /main/simulation_state/paused
  233. _main_simulation_state_paused_0 = Transition(self, self.states["/main/simulation_state/paused"], [self.states["/main/simulation_state/continuous"]])
  234. _main_simulation_state_paused_0.setTrigger(Event("continuous", "request"))
  235. self.states["/main/simulation_state/paused"].addTransition(_main_simulation_state_paused_0)
  236. _main_simulation_state_paused_1 = Transition(self, self.states["/main/simulation_state/paused"], [self.states["/main/simulation_state/realtime"]])
  237. _main_simulation_state_paused_1.setAction(self._main_simulation_state_paused_1_exec)
  238. _main_simulation_state_paused_1.setTrigger(Event("realtime", "request"))
  239. self.states["/main/simulation_state/paused"].addTransition(_main_simulation_state_paused_1)
  240. # transition /main/simulation_state/continuous
  241. _main_simulation_state_continuous_0 = Transition(self, self.states["/main/simulation_state/continuous"], [self.states["/main/simulation_state/paused"]])
  242. _main_simulation_state_continuous_0.setAction(self._main_simulation_state_continuous_0_exec)
  243. _main_simulation_state_continuous_0.setTrigger(Event("pause", None))
  244. self.states["/main/simulation_state/continuous"].addTransition(_main_simulation_state_continuous_0)
  245. _main_simulation_state_continuous_1 = Transition(self, self.states["/main/simulation_state/continuous"], [self.states["/main/simulation_state/paused"]])
  246. _main_simulation_state_continuous_1.setAction(self._main_simulation_state_continuous_1_exec)
  247. _main_simulation_state_continuous_1.setTrigger(Event("termination_condition", None))
  248. self.states["/main/simulation_state/continuous"].addTransition(_main_simulation_state_continuous_1)
  249. # transition /main/simulation_state/realtime
  250. _main_simulation_state_realtime_0 = Transition(self, self.states["/main/simulation_state/realtime"], [self.states["/main/simulation_state/paused"]])
  251. _main_simulation_state_realtime_0.setAction(self._main_simulation_state_realtime_0_exec)
  252. _main_simulation_state_realtime_0.setTrigger(Event("pause", None))
  253. self.states["/main/simulation_state/realtime"].addTransition(_main_simulation_state_realtime_0)
  254. _main_simulation_state_realtime_1 = Transition(self, self.states["/main/simulation_state/realtime"], [self.states["/main/simulation_state/paused"]])
  255. _main_simulation_state_realtime_1.setAction(self._main_simulation_state_realtime_1_exec)
  256. _main_simulation_state_realtime_1.setTrigger(Event("termination_condition", None))
  257. self.states["/main/simulation_state/realtime"].addTransition(_main_simulation_state_realtime_1)
  258. # transition /main/reset_manager/listening
  259. _main_reset_manager_listening_0 = Transition(self, self.states["/main/reset_manager/listening"], [self.states["/main/reset_manager/listening"]])
  260. _main_reset_manager_listening_0.setAction(self._main_reset_manager_listening_0_exec)
  261. _main_reset_manager_listening_0.setTrigger(Event("reset", "request"))
  262. _main_reset_manager_listening_0.setGuard(self._main_reset_manager_listening_0_guard)
  263. self.states["/main/reset_manager/listening"].addTransition(_main_reset_manager_listening_0)
  264. # transition /main/breakpoint_manager/breakpoint_manage
  265. _main_breakpoint_manager_breakpoint_manage_0 = Transition(self, self.states["/main/breakpoint_manager/breakpoint_manage"], [self.states["/main/breakpoint_manager/breakpoint_manage"]])
  266. _main_breakpoint_manager_breakpoint_manage_0.setAction(self._main_breakpoint_manager_breakpoint_manage_0_exec)
  267. _main_breakpoint_manager_breakpoint_manage_0.setTrigger(Event("add_breakpoint", "request"))
  268. self.states["/main/breakpoint_manager/breakpoint_manage"].addTransition(_main_breakpoint_manager_breakpoint_manage_0)
  269. _main_breakpoint_manager_breakpoint_manage_1 = Transition(self, self.states["/main/breakpoint_manager/breakpoint_manage"], [self.states["/main/breakpoint_manager/breakpoint_manage"]])
  270. _main_breakpoint_manager_breakpoint_manage_1.setAction(self._main_breakpoint_manager_breakpoint_manage_1_exec)
  271. _main_breakpoint_manager_breakpoint_manage_1.setTrigger(Event("del_breakpoint", "request"))
  272. self.states["/main/breakpoint_manager/breakpoint_manage"].addTransition(_main_breakpoint_manager_breakpoint_manage_1)
  273. _main_breakpoint_manager_breakpoint_manage_2 = Transition(self, self.states["/main/breakpoint_manager/breakpoint_manage"], [self.states["/main/breakpoint_manager/breakpoint_manage"]])
  274. _main_breakpoint_manager_breakpoint_manage_2.setAction(self._main_breakpoint_manager_breakpoint_manage_2_exec)
  275. _main_breakpoint_manager_breakpoint_manage_2.setTrigger(Event("toggle_breakpoint", "request"))
  276. self.states["/main/breakpoint_manager/breakpoint_manage"].addTransition(_main_breakpoint_manager_breakpoint_manage_2)
  277. def _main_simulation_flow_check_termination_exit(self):
  278. self.simulation_time = self.time_next
  279. def _main_simulation_flow_execute_step_enter(self):
  280. self.link.command("go")
  281. self.new_turtles = self.get_all_turtles()
  282. def _main_simulation_flow_check_termination_workaround_enter(self):
  283. self.addTimer(0, self.sccd_yield())
  284. def _main_simulation_flow_check_termination_workaround_exit(self):
  285. self.removeTimer(0)
  286. def _main_simulation_flow_check_termination_wait_enter(self):
  287. self.addTimer(1, self.calculate_after())
  288. def _main_simulation_flow_check_termination_wait_exit(self):
  289. self.removeTimer(1)
  290. diff = time.time() - self.realtime_starttime
  291. self.simulation_time = diff / self.realtime_scale
  292. def _main_simulation_flow_check_termination_check_termination_enter(self):
  293. self.the_time = self.calculate_after()
  294. def _main_simulation_flow_initialize_0_exec(self, parameters):
  295. self.new_turtles = self.get_all_turtles()
  296. self.big_step.outputEvent(Event("all_states", "reply", [self.simulation_time, self.new_turtles, {'CREATED_TURTLES': self.turtles_created(self.new_turtles), 'DELETED_TURTLES': self.turtles_deleted(self.new_turtles)}]))
  297. self.turtles = self.new_turtles
  298. def _main_simulation_flow_check_termination_wait_1_guard(self, parameters):
  299. return self.inState(["/main/simulation_state/paused"])
  300. def _main_simulation_flow_check_termination_check_termination_0_exec(self, parameters):
  301. breakpoint_id = self.process_breakpoints()
  302. self.big_step.outputEvent(Event("breakpoint_triggered", "reply", [breakpoint_id]))
  303. self.raiseInternalEvent(Event("termination_condition", None, []))
  304. def _main_simulation_flow_check_termination_check_termination_0_guard(self, parameters):
  305. return (not self.inState(["/main/simulation_state/paused"])) and (self.breakpoint_triggers() > -1)
  306. def _main_simulation_flow_check_termination_check_termination_1_guard(self, parameters):
  307. return self.inState(["/main/simulation_state/continuous"])
  308. def _main_simulation_flow_check_termination_check_termination_3_guard(self, parameters):
  309. return self.inState(["/main/simulation_state/realtime"]) and (self.the_time > 0.0)
  310. def _main_simulation_flow_check_termination_check_termination_4_guard(self, parameters):
  311. return self.inState(["/main/simulation_state/realtime"]) and (self.the_time <= 0.0)
  312. def _main_simulation_flow_check_termination_check_termination_5_exec(self, parameters):
  313. configuration = parameters[0]
  314. turtle_id = configuration["turtle"]
  315. state_attribute = configuration["attribute"]
  316. new_value = configuration["value"]
  317. askstring = "ask turtle %i [set %s %s]" % (int(turtle_id), state_attribute, new_value)
  318. self.link.command(askstring)
  319. self.new_turtles = self.get_all_turtles()
  320. self.big_step.outputEvent(Event("god_event_ok", "reply", []))
  321. self.big_step.outputEvent(Event("all_states", "reply", [self.simulation_time, self.new_turtles, {'CREATED_TURTLES': self.turtles_created(self.new_turtles), 'DELETED_TURTLES': self.turtles_deleted(self.new_turtles)}]))
  322. self.turtles = self.new_turtles
  323. def _main_simulation_flow_check_termination_check_termination_5_guard(self, parameters):
  324. configuration = parameters[0]
  325. return self.inState(["/main/simulation_state/paused"])
  326. def _main_simulation_flow_execute_step_executing_step_0_exec(self, parameters):
  327. self.time_next = self.time_next + 1
  328. def _main_simulation_flow_execute_step_executing_step_0_guard(self, parameters):
  329. return self.inState(["/main/simulation_state/continuous"])
  330. def _main_simulation_flow_execute_step_executing_step_1_exec(self, parameters):
  331. self.big_step.outputEvent(Event("all_states", "reply", [self.simulation_time, self.new_turtles, {'CREATED_TURTLES': self.turtles_created(self.new_turtles), 'DELETED_TURTLES': self.turtles_deleted(self.new_turtles)}]))
  332. self.time_next = self.time_next + 1
  333. self.turtles = self.new_turtles
  334. def _main_simulation_flow_execute_step_executing_step_1_guard(self, parameters):
  335. return "ELSE_GUARD"
  336. def _main_simulation_state_paused_1_exec(self, parameters):
  337. configuration = parameters[0]
  338. self.parse_options(configuration)
  339. def _main_simulation_state_continuous_0_exec(self, parameters):
  340. self.big_step.outputEvent(Event("all_states", "reply", [self.simulation_time, self.new_turtles, {'CREATED_TURTLES': self.turtles_created(self.new_turtles), 'DELETED_TURTLES': self.turtles_deleted(self.new_turtles)}]))
  341. self.turtles = self.new_turtles
  342. def _main_simulation_state_continuous_1_exec(self, parameters):
  343. self.big_step.outputEvent(Event("terminate", "reply", [self.simulation_time]))
  344. def _main_simulation_state_realtime_0_exec(self, parameters):
  345. diff = time.time() - self.realtime_starttime
  346. self.simulation_time = diff / self.realtime_scale
  347. self.new_turtles = self.get_all_turtles()
  348. self.big_step.outputEvent(Event("all_states", "reply", [self.simulation_time, self.new_turtles, {'CREATED_TURTLES': self.turtles_created(self.new_turtles), 'DELETED_TURTLES': self.turtles_deleted(self.new_turtles)}]))
  349. self.turtles = self.new_turtles
  350. def _main_simulation_state_realtime_1_exec(self, parameters):
  351. self.big_step.outputEvent(Event("terminate", "reply", [self.simulation_time]))
  352. def _main_reset_manager_listening_0_exec(self, parameters):
  353. self.link.command("setup")
  354. self.new_turtles = self.get_all_turtles()
  355. self.simulation_time = 0
  356. self.realtime_scale = 1.0
  357. self.realtime_starttime = None
  358. self.time_next = 1
  359. self.big_step.outputEvent(Event("all_states", "reply", [self.simulation_time, self.new_turtles, {'CREATED_TURTLES': self.turtles_created(self.new_turtles), 'DELETED_TURTLES': self.turtles_deleted(self.new_turtles)}]))
  360. self.turtles = self.new_turtles
  361. def _main_reset_manager_listening_0_guard(self, parameters):
  362. return self.inState(["/main/simulation_state/paused"])
  363. def _main_breakpoint_manager_breakpoint_manage_0_exec(self, parameters):
  364. breakpoint_id = parameters[0]
  365. function = parameters[1]
  366. enabled = parameters[2]
  367. disable_on_trigger = parameters[3]
  368. self.breakpoints.append(Breakpoint(breakpoint_id, function, enabled, disable_on_trigger))
  369. def _main_breakpoint_manager_breakpoint_manage_1_exec(self, parameters):
  370. del_breakpoint_id = parameters[0]
  371. self.breakpoints = [breakpoint for breakpoint in self.breakpoints if breakpoint.id != del_breakpoint_id]
  372. def _main_breakpoint_manager_breakpoint_manage_2_exec(self, parameters):
  373. breakpoint_id = parameters[0]
  374. enabled = parameters[1]
  375. for breakpoint in self.breakpoints:
  376. if breakpoint.id == breakpoint_id:
  377. breakpoint.enabled = enabled
  378. break
  379. def initializeStatechart(self):
  380. # enter default state
  381. self.default_targets = self.states["/main"].getEffectiveTargetStates()
  382. RuntimeClassBase.initializeStatechart(self)
  383. class ObjectManager(ObjectManagerBase):
  384. def __init__(self, controller):
  385. ObjectManagerBase.__init__(self, controller)
  386. def instantiate(self, class_name, construct_params):
  387. if class_name == "NetLogoSimulator":
  388. instance = NetLogoSimulator(self.controller, construct_params[0])
  389. instance.associations = {}
  390. else:
  391. raise Exception("Cannot instantiate class " + class_name)
  392. return instance
  393. class Controller(ThreadsControllerBase):
  394. def __init__(self, model, keep_running = None, behind_schedule_callback = None):
  395. if keep_running == None: keep_running = True
  396. if behind_schedule_callback == None: behind_schedule_callback = None
  397. ThreadsControllerBase.__init__(self, ObjectManager(self), keep_running, behind_schedule_callback)
  398. self.addInputPort("request")
  399. self.addOutputPort("reply")
  400. self.object_manager.createInstance("NetLogoSimulator", [model])