ps_model.py 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. from DEVS import *
  2. from infinity import INFINITY
  3. class Operator(AtomicDEVS):
  4. def __init__(self, name="Operator"):
  5. AtomicDEVS.__init__(self, name)
  6. self.state = self.initialState()
  7. self.my_ports = {"op_out": self.addOutPort("op_out"), "op_in": self.addInPort("op_in")}
  8. def initialState(self):
  9. return {'name': 'waiting', 'req_queue': [], 'query_queue': [], 'requester': None}
  10. def timeAdvance(self):
  11. if self.state['query_queue']:
  12. return 0
  13. elif self.state['name'] == 'waiting':
  14. return INFINITY
  15. elif self.state['name'] == 'requested':
  16. return 0
  17. elif self.state['name'] == 'allocating':
  18. return 0
  19. elif self.state['name'] == 'allocated':
  20. return INFINITY
  21. def outputFnc(self):
  22. output = {}
  23. if self.state['query_queue']:
  24. output[self.my_ports['op_out']] = []
  25. for it in self.state['query_queue']:
  26. output[self.my_ports['op_out']].append({'type': 'response', 'req_name': it, 'op_name': id(self), 'free': self.state['name'] == 'waiting'})
  27. if self.state['name'] == 'allocating':
  28. if self.my_ports['op_out'] in output:
  29. output[self.my_ports['op_out']].append({'type': 'allocate', 'req_name': self.state['requester'], 'op_name': id(self)})
  30. else:
  31. output[self.my_ports['op_out']] = [({'type': 'allocate', 'req_name': self.state['requester'], 'op_name': id(self)})]
  32. return output
  33. def intTransition(self):
  34. if self.state['name'] == 'requested':
  35. self.state['name'] = 'allocating'
  36. self.state['requester'] = self.state['req_queue'].pop()
  37. elif self.state['name'] == 'allocating':
  38. self.state['name'] = 'allocated'
  39. if self.state['query_queue']:
  40. self.state['query_queue'] = []
  41. return self.state
  42. def extTransition(self, my_inputs):
  43. msgs = my_inputs[self.my_ports['op_in']]
  44. release_msgs = [it for it in msgs if it['type'] == 'release' and it['op_name'] == id(self)]
  45. req_msgs = [it for it in msgs if it['type'] == 'request' and it['op_name'] == id(self)]
  46. query_msgs = [it for it in msgs if it['type'] == 'query']
  47. if release_msgs:
  48. self.state['name'] = 'requested' if self.state['req_queue'] else 'waiting'
  49. for r_m in req_msgs:
  50. self.state['req_queue'].append(r_m['req_name'])
  51. self.state['name'] = 'requested'
  52. for q_m in query_msgs:
  53. self.state['query_queue'].append(q_m['req_name'])
  54. return self.state
  55. def confTransition(self, my_inputs):
  56. return AtomicDEVS.confTransition(self, my_inputs)
  57. class ConveyorBelt(AtomicDEVS):
  58. def __init__(self, name="ConveyorBelt"):
  59. AtomicDEVS.__init__(self, name)
  60. self.state = self.initialState()
  61. self.my_ports = {"conv_out": self.addOutPort("conv_out"), "conv_in": self.addInPort("conv_in")}
  62. def initialState(self):
  63. return {'name': 'waiting', 'product': None}
  64. def timeAdvance(self):
  65. if self.state['name'] == 'waiting':
  66. return INFINITY
  67. elif self.state['name'] == 'transporting':
  68. return 1
  69. def outputFnc(self):
  70. return {self.my_ports['conv_out']: [self.state['product']]}
  71. def intTransition(self):
  72. if self.state['name'] == 'transporting':
  73. self.state['name'] == 'waiting'
  74. return self.state
  75. def extTransition(self, my_inputs):
  76. if self.state['name'] == 'waiting':
  77. self.state['product'] = my_inputs[self.my_ports['conv_in']][0]
  78. self.state['name'] = 'transporting'
  79. return self.state
  80. def confTransition(self, my_inputs):
  81. return AtomicDEVS.confTransition(self, my_inputs)
  82. class WheelsGenerator(AtomicDEVS):
  83. def __init__(self, name="WheelsGenerator"):
  84. AtomicDEVS.__init__(self, name)
  85. self.state = self.initialState()
  86. self.my_ports = {"g_out": self.addOutPort("g_out")}
  87. def initialState(self):
  88. return {'name': 'generating'}
  89. def timeAdvance(self):
  90. if self.state['name'] == 'generating':
  91. return 1
  92. def outputFnc(self):
  93. if self.state['name'] == 'generating':
  94. return {self.my_ports['g_out']: [{'type': 'Wheels', 'broken': False}]}
  95. def intTransition(self):
  96. return AtomicDEVS.intTransition(self)
  97. def extTransition(self, my_inputs):
  98. return AtomicDEVS.extTransition(self, my_inputs)
  99. def confTransition(self, my_inputs):
  100. return AtomicDEVS.confTransition(self, my_inputs)
  101. class TracksGenerator(AtomicDEVS):
  102. def __init__(self, name="TracksGenerator"):
  103. AtomicDEVS.__init__(self, name)
  104. self.state = self.initialState()
  105. self.my_ports = {"g_out": self.addOutPort("g_out")}
  106. def initialState(self):
  107. return {'name': 'generating'}
  108. def timeAdvance(self):
  109. if self.state['name'] == 'generating':
  110. return 1
  111. def outputFnc(self):
  112. if self.state['name'] == 'generating':
  113. return {self.my_ports['g_out']: [{'type': 'Tracks', 'broken': False}]}
  114. def intTransition(self):
  115. return AtomicDEVS.intTransition(self)
  116. def extTransition(self, my_inputs):
  117. return AtomicDEVS.extTransition(self, my_inputs)
  118. def confTransition(self, my_inputs):
  119. return AtomicDEVS.confTransition(self, my_inputs)
  120. class BodyGenerator(AtomicDEVS):
  121. def __init__(self, name="BodyGenerator"):
  122. AtomicDEVS.__init__(self, name)
  123. self.state = self.initialState()
  124. self.my_ports = {"g_out": self.addOutPort("g_out")}
  125. def initialState(self):
  126. return {'name': 'generating'}
  127. def timeAdvance(self):
  128. if self.state['name'] == 'generating':
  129. return 1
  130. def outputFnc(self):
  131. if self.state['name'] == 'generating':
  132. return {self.my_ports['g_out']: [{'type': 'Body', 'broken': False}]}
  133. def intTransition(self):
  134. return AtomicDEVS.intTransition(self)
  135. def extTransition(self, my_inputs):
  136. return AtomicDEVS.extTransition(self, my_inputs)
  137. def confTransition(self, my_inputs):
  138. return AtomicDEVS.confTransition(self, my_inputs)
  139. class MachineGunGenerator(AtomicDEVS):
  140. def __init__(self, name="MachineGunGenerator"):
  141. AtomicDEVS.__init__(self, name)
  142. self.state = self.initialState()
  143. self.my_ports = {"g_out": self.addOutPort("g_out")}
  144. def initialState(self):
  145. return {'name': 'generating'}
  146. def timeAdvance(self):
  147. if self.state['name'] == 'generating':
  148. return 1
  149. def outputFnc(self):
  150. if self.state['name'] == 'generating':
  151. return {self.my_ports['g_out']: [{'type': 'MachineGun', 'broken': False}]}
  152. def intTransition(self):
  153. return AtomicDEVS.intTransition(self)
  154. def extTransition(self, my_inputs):
  155. return AtomicDEVS.extTransition(self, my_inputs)
  156. def confTransition(self, my_inputs):
  157. return AtomicDEVS.confTransition(self, my_inputs)
  158. class WaterCannonGenerator(AtomicDEVS):
  159. def __init__(self, name="WaterCannonGenerator"):
  160. AtomicDEVS.__init__(self, name)
  161. self.state = self.initialState()
  162. self.my_ports = {"g_out": self.addOutPort("g_out")}
  163. def initialState(self):
  164. return {'name': 'generating'}
  165. def timeAdvance(self):
  166. if self.state['name'] == 'generating':
  167. return 1
  168. def outputFnc(self):
  169. if self.state['name'] == 'generating':
  170. return {self.my_ports['g_out']: [{'type': 'WaterCannon', 'broken': False}]}
  171. def intTransition(self):
  172. return AtomicDEVS.intTransition(self)
  173. def extTransition(self, my_inputs):
  174. return AtomicDEVS.extTransition(self, my_inputs)
  175. def confTransition(self, my_inputs):
  176. return AtomicDEVS.confTransition(self, my_inputs)
  177. class collector(AtomicDEVS):
  178. def __init__(self, name="collector"):
  179. AtomicDEVS.__init__(self, name)
  180. self.state = self.initialState()
  181. self.my_ports = {"c_in": self.addInPort("c_in")}
  182. def initialState(self):
  183. return {'name': 'collecting', 'WarAPCs': 0, 'RiotAPCS': 0}
  184. def timeAdvance(self):
  185. if self.state['name'] == 'collecting':
  186. return INFINITY
  187. def outputFnc(self):
  188. return AtomicDEVS.outputFnc(self)
  189. def intTransition(self):
  190. return AtomicDEVS.intTransition(self)
  191. def extTransition(self, my_inputs):
  192. if (my_inputs[self.my_ports['c_in']][0]['type'] == 'WarAPC'):
  193. self.state['WarAPCs'] += 1
  194. elif (my_inputs[self.my_ports['c_in']][0]['type'] == 'RiotAPC'):
  195. self.state['RiotAPCs'] += 1
  196. return self.state
  197. def confTransition(self, my_inputs):
  198. return AtomicDEVS.confTransition(self, my_inputs)
  199. class assembler(AtomicDEVS):
  200. def __init__(self, name="assembler"):
  201. AtomicDEVS.__init__(self, name)
  202. self.state = self.initialState()
  203. self.my_ports = {"ass_op_out": self.addOutPort("ass_op_out"), "ass_out": self.addOutPort("ass_out"), "ass_op_in": self.addInPort("ass_op_in"), "ass_in": self.addInPort("ass_in")}
  204. def initialState(self):
  205. return {'name': 'waiting', 'queue': [], 'finishedProduct': None, 'op_name': None, 'op_to_send': None}
  206. def timeAdvance(self):
  207. if self.state['name'] == 'waiting':
  208. return INFINITY
  209. elif self.state['name'] == 'looking_for_op':
  210. return 0
  211. elif self.state['name'] == 'sending_req_to_op':
  212. return 0
  213. elif self.state['name'] == 'waiting_for_op':
  214. return INFINITY
  215. elif self.state['name'] == 'producing':
  216. return self.wait_time
  217. def outputFnc(self):
  218. if self.state['name'] == 'producing':
  219. return {self.my_ports['ass_out']: [self.state['finishedProduct']], self.my_ports['ass_op_out']: [{'type': 'release', 'op_name': self.state['op_name']}]}
  220. elif self.state['name'] == 'looking_for_op':
  221. return {self.my_ports['ass_op_out']: [{'type': 'query', 'req_name': id(self)}]}
  222. elif self.state['name'] == 'sending_req_to_op':
  223. return {self.my_ports['ass_op_out']: [{'type': 'request', 'req_name': id(self), 'op_name': self.state['op_to_send']}]}
  224. else:
  225. return AtomicDEVS.outputFnc(self)
  226. def intTransition(self):
  227. if self.state['name'] == 'producing':
  228. self.state['name'] = 'waiting'
  229. elif self.state['name'] == 'sending_req_to_op':
  230. self.state['name'] = 'waiting_for_op'
  231. return self.state
  232. def extTransition(self, my_inputs):
  233. if self.state['name'] == 'producing':
  234. self.wait_time -= self.elapsed
  235. import helpers, random
  236. if self.my_ports['ass_in'] in my_inputs:
  237. self.state['queue'].extend(my_inputs[self.my_ports['ass_in']])
  238. if (self.state['name'] == 'waiting' and (helpers.canWarAPC(self.state['queue']) or helpers.canRiotAPC(self.state['queue']))):
  239. self.state['name'] = 'looking_for_op'
  240. if self.state['name'] == 'looking_for_op' and self.my_ports['ass_op_in'] in my_inputs:
  241. msgs = my_inputs[self.my_ports['ass_op_in']]
  242. free = [msg['op_name'] for msg in msgs if msg['req_name'] == id(self) and msg['type'] == 'response' and msg['free']]
  243. notfree = [msg['op_name'] for msg in msgs if msg['req_name'] == id(self) and msg['type'] == 'response' and not msg['free']]
  244. if free:
  245. self.state['op_to_send'] = free[0]
  246. else:
  247. self.state['op_to_send'] = notfree[0]
  248. self.state['name'] = 'sending_req_to_op'
  249. elif self.state['name'] == 'waiting_for_op' and self.my_ports['ass_op_in'] in my_inputs:
  250. forme = [msg for msg in my_inputs[self.my_ports['ass_op_in']] if msg['req_name'] == id(self) and msg['type'] == 'allocate']
  251. if forme:
  252. self.state['op_name'] = my_inputs[self.my_ports['ass_op_in']][0]['op_name']
  253. if helpers.isWarAPC(self.state['queue']):
  254. self.state['finishedProduct'] = {'type': 'WarAPC', 'broken': (random.random() < 0.05)}
  255. elif helpers.isRiotAPC(self.state['queue']):
  256. self.state['finishedProduct'] = {'type': 'RiotAPC', 'broken': (random.random() < 0.05)}
  257. self.state['name'] = 'producing'
  258. self.wait_time = 2
  259. return self.state
  260. def confTransition(self, my_inputs):
  261. return AtomicDEVS.confTransition(self, my_inputs)
  262. class repair(AtomicDEVS):
  263. def __init__(self, name="repair"):
  264. AtomicDEVS.__init__(self, name)
  265. self.state = self.initialState()
  266. self.my_ports = {"rep_op_out": self.addOutPort("rep_op_out"), "rep_out": self.addOutPort("rep_out"), "rep_op_in": self.addInPort("rep_op_in"), "rep_in": self.addInPort("rep_in")}
  267. def initialState(self):
  268. return {'name': 'waiting', 'item': None, 'op_to_send': None, 'op_name': None}
  269. def timeAdvance(self):
  270. if self.state['name'] == 'waiting':
  271. return INFINITY
  272. elif self.state['name'] == 'looking_for_op':
  273. return 0
  274. elif self.state['name'] == 'sending_req_to_op':
  275. return 0
  276. elif self.state['name'] == 'waiting_for_op':
  277. return INFINITY
  278. elif self.state['name'] == 'repairing':
  279. return self.wait_time
  280. def outputFnc(self):
  281. if self.state['name'] == 'repairing':
  282. return {self.my_ports['rep_out']: [self.state['item']], self.my_ports['rep_op_out']: [{'type': 'release', 'op_name': self.state['op_name']}]}
  283. elif self.state['name'] == 'looking_for_op':
  284. return {self.my_ports['rep_op_out']: [{'type': 'query', 'req_name': id(self)}]}
  285. elif self.state['name'] == 'sending_req_to_op':
  286. return {self.my_ports['rep_op_out']: [{'type': 'request', 'req_name': id(self), 'op_name': self.state['op_to_send']}]}
  287. else:
  288. return AtomicDEVS.outputFnc(self)
  289. def intTransition(self):
  290. if self.state['name'] == 'repairing':
  291. self.state['name'] = 'waiting'
  292. elif self.state['name'] == 'sending_req_to_op':
  293. self.state['name'] = 'waiting_for_op'
  294. return self.state
  295. def extTransition(self, my_inputs):
  296. if self.state['name'] == 'repairing':
  297. self.wait_time -= self.elapsed
  298. if self.state['name'] == 'waiting' and self.my_ports['rep_in'] in my_inputs:
  299. self.state['item'] = my_inputs[self.my_ports['rep_in']][0]
  300. self.state['name'] = 'looking_for_op'
  301. elif self.state['name'] == 'looking_for_op' and self.my_ports['rep_op_in'] in my_inputs:
  302. msgs = my_inputs[self.my_ports['rep_op_in']]
  303. free = [msg['op_name'] for msg in msgs if msg['req_name'] == id(self) and msg['type'] == 'response' and msg['free']]
  304. notfree = [msg['op_name'] for msg in msgs if msg['req_name'] == id(self) and msg['type'] == 'response' and not msg['free']]
  305. if free:
  306. self.state['op_to_send'] = free[0]
  307. else:
  308. self.state['op_to_send'] = notfree[0]
  309. self.state['name'] = 'sending_req_to_op'
  310. elif self.state['name'] == 'waiting_for_op' and self.my_ports['rep_op_in'] in my_inputs:
  311. forme = [msg for msg in my_inputs[self.my_ports['rep_op_in']] if msg['req_name'] == id(self) and msg['type'] == 'allocate']
  312. if forme:
  313. self.state['op_name'] = my_inputs[self.my_ports['rep_op_in']][0]['op_name']
  314. self.state['item']['broken'] = False
  315. self.state['name'] = 'repairing'
  316. self.wait_time = 2
  317. return self.state
  318. def confTransition(self, my_inputs):
  319. return AtomicDEVS.confTransition(self, my_inputs)
  320. class qualitycontrol(AtomicDEVS):
  321. def __init__(self, name="qualitycontrol"):
  322. AtomicDEVS.__init__(self, name)
  323. self.state = self.initialState()
  324. self.my_ports = {"qc_op_out": self.addOutPort("qc_op_out"), "qc_out_working": self.addOutPort("qc_out_working"), "qc_out_broken": self.addOutPort("qc_out_broken"), "qc_op_in": self.addInPort("qc_op_in"), "qc_in": self.addInPort("qc_in")}
  325. def initialState(self):
  326. return {'name': 'waiting', 'item': None}
  327. def timeAdvance(self):
  328. if self.state['name'] == 'waiting':
  329. return INFINITY
  330. elif self.state['name'] == 'looking_for_op':
  331. return 0
  332. elif self.state['name'] == 'sending_req_to_op':
  333. return 0
  334. elif self.state['name'] == 'waiting_for_op_query_answer':
  335. return INFINITY
  336. elif self.state['name'] == 'waiting_for_op':
  337. return INFINITY
  338. elif self.state['name'] == 'checking':
  339. return self.wait_time
  340. def outputFnc(self):
  341. if self.state['name'] == 'checking':
  342. if self.state['item']['broken']:
  343. return {self.my_ports['qc_out_broken']: [self.state['item']], self.my_ports['qc_op_out']: [{'type': 'release', 'op_name': self.state['op_name']}]}
  344. else:
  345. return {self.my_ports['qc_out_working']: [self.state['item']], self.my_ports['qc_op_out']: [{'type': 'release', 'op_name': self.state['op_name']}]}
  346. elif self.state['name'] == 'looking_for_op':
  347. return {self.my_ports['qc_op_out']: [{'type': 'query', 'req_name': id(self)}]}
  348. elif self.state['name'] == 'sending_req_to_op':
  349. return {self.my_ports['qc_op_out']: [{'type': 'request', 'req_name': id(self), 'op_name': self.state['op_to_send']}]}
  350. else:
  351. return AtomicDEVS.outputFnc(self)
  352. def intTransition(self):
  353. if self.state['name'] == 'checking':
  354. self.state['name'] = 'waiting'
  355. elif self.state['name'] == 'looking_for_op':
  356. self.state['name'] = 'waiting_for_op_query_answer'
  357. elif self.state['name'] == 'sending_req_to_op':
  358. self.state['name'] = 'waiting_for_op'
  359. return self.state
  360. def extTransition(self, my_inputs):
  361. if self.state['name'] == 'repairing':
  362. self.wait_time -= self.elapsed
  363. if self.state['name'] == 'waiting' and self.my_ports['qc_in'] in my_inputs:
  364. self.state['item'] = my_inputs[self.my_ports['qc_in']][0]
  365. self.state['name'] = 'looking_for_op'
  366. elif self.state['name'] == 'waiting_for_op_query_answer' and self.my_ports['qc_op_in'] in my_inputs:
  367. msgs = my_inputs[self.my_ports['qc_op_in']]
  368. free = [msg['op_name'] for msg in msgs if msg['req_name'] == id(self) and msg['type'] == 'response' and msg['free']]
  369. notfree = [msg['op_name'] for msg in msgs if msg['req_name'] == id(self) and msg['type'] == 'response' and not msg['free']]
  370. if free:
  371. self.state['op_to_send'] = free[0]
  372. else:
  373. self.state['op_to_send'] = notfree[0]
  374. self.state['name'] = 'sending_req_to_op'
  375. elif self.state['name'] == 'waiting_for_op' and self.my_ports['qc_op_in'] in my_inputs:
  376. forme = [msg for msg in my_inputs[self.my_ports['qc_op_in']] if msg['req_name'] == id(self) and msg['type'] == 'allocate']
  377. if forme:
  378. self.state['name'] = 'checking'
  379. return self.state
  380. def confTransition(self, my_inputs):
  381. return AtomicDEVS.confTransition(self, my_inputs)
  382. class Root(CoupledDEVS):
  383. def __init__(self, name="Root"):
  384. CoupledDEVS.__init__(self, name)
  385. self.my_ports = {}
  386. self.submodels = {"WheelsGenerator_i": self.addSubModel(WheelsGenerator(name="WheelsGenerator_i")), "TracksGenerator_i": self.addSubModel(TracksGenerator(name="TracksGenerator_i")), "BodyGenerator_i": self.addSubModel(BodyGenerator(name="BodyGenerator_i")), "MachineGunGenerator_i": self.addSubModel(MachineGunGenerator(name="MachineGunGenerator_i")), "WaterCannonGenerator_i": self.addSubModel(WaterCannonGenerator(name="WaterCannonGenerator_i")), "collector_i": self.addSubModel(collector(name="collector_i")), "assembler_i": self.addSubModel(assembler(name="assembler_i")), "repair_i": self.addSubModel(repair(name="repair_i")), "qualitycontrol_i": self.addSubModel(qualitycontrol(name="qualitycontrol_i")), "op1_i": self.addSubModel(Operator(name="op1_i")), "op2_i": self.addSubModel(Operator(name="op2_i")), "w_g_to_assembler_i1": self.addSubModel(ConveyorBelt(name="w_g_to_assembler_i1")), "t_g_to_assembler_i1": self.addSubModel(ConveyorBelt(name="t_g_to_assembler_i1")), "b_g_to_assembler_i1": self.addSubModel(ConveyorBelt(name="b_g_to_assembler_i1")), "mg_g_to_assembler_i1": self.addSubModel(ConveyorBelt(name="mg_g_to_assembler_i1")), "wc_g_to_assembler_i1": self.addSubModel(ConveyorBelt(name="wc_g_to_assembler_i1")), "assembler_to_qualitycontrol_i1": self.addSubModel(ConveyorBelt(name="assembler_to_qualitycontrol_i1")), "qualitycontrol_broken_to_repair_i1": self.addSubModel(ConveyorBelt(name="qualitycontrol_broken_to_repair_i1")), "qualitycontrol_to_collector_i1": self.addSubModel(ConveyorBelt(name="qualitycontrol_to_collector_i1")), "repair_to_collector_i1": self.addSubModel(ConveyorBelt(name="repair_to_collector_i1")), "w_g_to_assembler_i2": self.addSubModel(ConveyorBelt(name="w_g_to_assembler_i2")), "t_g_to_assembler_i2": self.addSubModel(ConveyorBelt(name="t_g_to_assembler_i2")), "b_g_to_assembler_i2": self.addSubModel(ConveyorBelt(name="b_g_to_assembler_i2")), "mg_g_to_assembler_i2": self.addSubModel(ConveyorBelt(name="mg_g_to_assembler_i2")), "wc_g_to_assembler_i2": self.addSubModel(ConveyorBelt(name="wc_g_to_assembler_i2")), "assembler_to_qualitycontrol_i2": self.addSubModel(ConveyorBelt(name="assembler_to_qualitycontrol_i2")), "qualitycontrol_broken_to_repair_i2": self.addSubModel(ConveyorBelt(name="qualitycontrol_broken_to_repair_i2")), "qualitycontrol_to_collector_i2": self.addSubModel(ConveyorBelt(name="qualitycontrol_to_collector_i2")), "repair_to_collector_i2": self.addSubModel(ConveyorBelt(name="repair_to_collector_i2"))}
  387. self.connectPorts(self.submodels["WheelsGenerator_i"].my_ports["g_out"], self.submodels["w_g_to_assembler_i1"].my_ports["conv_in"])
  388. self.connectPorts(self.submodels["TracksGenerator_i"].my_ports["g_out"], self.submodels["t_g_to_assembler_i1"].my_ports["conv_in"])
  389. self.connectPorts(self.submodels["BodyGenerator_i"].my_ports["g_out"], self.submodels["b_g_to_assembler_i1"].my_ports["conv_in"])
  390. self.connectPorts(self.submodels["MachineGunGenerator_i"].my_ports["g_out"], self.submodels["mg_g_to_assembler_i1"].my_ports["conv_in"])
  391. self.connectPorts(self.submodels["WaterCannonGenerator_i"].my_ports["g_out"], self.submodels["wc_g_to_assembler_i1"].my_ports["conv_in"])
  392. self.connectPorts(self.submodels["assembler_i"].my_ports["ass_op_out"], self.submodels["op1_i"].my_ports["op_in"])
  393. self.connectPorts(self.submodels["assembler_i"].my_ports["ass_op_out"], self.submodels["op2_i"].my_ports["op_in"])
  394. self.connectPorts(self.submodels["assembler_i"].my_ports["ass_out"], self.submodels["assembler_to_qualitycontrol_i1"].my_ports["conv_in"])
  395. self.connectPorts(self.submodels["repair_i"].my_ports["rep_op_out"], self.submodels["op1_i"].my_ports["op_in"])
  396. self.connectPorts(self.submodels["repair_i"].my_ports["rep_op_out"], self.submodels["op2_i"].my_ports["op_in"])
  397. self.connectPorts(self.submodels["repair_i"].my_ports["rep_out"], self.submodels["repair_to_collector_i1"].my_ports["conv_in"])
  398. self.connectPorts(self.submodels["qualitycontrol_i"].my_ports["qc_op_out"], self.submodels["op1_i"].my_ports["op_in"])
  399. self.connectPorts(self.submodels["qualitycontrol_i"].my_ports["qc_op_out"], self.submodels["op2_i"].my_ports["op_in"])
  400. self.connectPorts(self.submodels["qualitycontrol_i"].my_ports["qc_out_working"], self.submodels["qualitycontrol_to_collector_i1"].my_ports["conv_in"])
  401. self.connectPorts(self.submodels["qualitycontrol_i"].my_ports["qc_out_broken"], self.submodels["qualitycontrol_broken_to_repair_i1"].my_ports["conv_in"])
  402. self.connectPorts(self.submodels["op1_i"].my_ports["op_out"], self.submodels["assembler_i"].my_ports["ass_op_in"])
  403. self.connectPorts(self.submodels["op1_i"].my_ports["op_out"], self.submodels["qualitycontrol_i"].my_ports["qc_op_in"])
  404. self.connectPorts(self.submodels["op1_i"].my_ports["op_out"], self.submodels["repair_i"].my_ports["rep_op_in"])
  405. self.connectPorts(self.submodels["op2_i"].my_ports["op_out"], self.submodels["assembler_i"].my_ports["ass_op_in"])
  406. self.connectPorts(self.submodels["op2_i"].my_ports["op_out"], self.submodels["qualitycontrol_i"].my_ports["qc_op_in"])
  407. self.connectPorts(self.submodels["op2_i"].my_ports["op_out"], self.submodels["repair_i"].my_ports["rep_op_in"])
  408. self.connectPorts(self.submodels["w_g_to_assembler_i1"].my_ports["conv_out"], self.submodels["w_g_to_assembler_i2"].my_ports["conv_in"])
  409. self.connectPorts(self.submodels["t_g_to_assembler_i1"].my_ports["conv_out"], self.submodels["t_g_to_assembler_i2"].my_ports["conv_in"])
  410. self.connectPorts(self.submodels["b_g_to_assembler_i1"].my_ports["conv_out"], self.submodels["b_g_to_assembler_i2"].my_ports["conv_in"])
  411. self.connectPorts(self.submodels["mg_g_to_assembler_i1"].my_ports["conv_out"], self.submodels["mg_g_to_assembler_i2"].my_ports["conv_in"])
  412. self.connectPorts(self.submodels["wc_g_to_assembler_i1"].my_ports["conv_out"], self.submodels["wc_g_to_assembler_i2"].my_ports["conv_in"])
  413. self.connectPorts(self.submodels["assembler_to_qualitycontrol_i1"].my_ports["conv_out"], self.submodels["assembler_to_qualitycontrol_i2"].my_ports["conv_in"])
  414. self.connectPorts(self.submodels["qualitycontrol_broken_to_repair_i1"].my_ports["conv_out"], self.submodels["qualitycontrol_broken_to_repair_i2"].my_ports["conv_in"])
  415. self.connectPorts(self.submodels["qualitycontrol_to_collector_i1"].my_ports["conv_out"], self.submodels["qualitycontrol_to_collector_i2"].my_ports["conv_in"])
  416. self.connectPorts(self.submodels["repair_to_collector_i1"].my_ports["conv_out"], self.submodels["repair_to_collector_i2"].my_ports["conv_in"])
  417. self.connectPorts(self.submodels["w_g_to_assembler_i2"].my_ports["conv_out"], self.submodels["assembler_i"].my_ports["ass_in"])
  418. self.connectPorts(self.submodels["t_g_to_assembler_i2"].my_ports["conv_out"], self.submodels["assembler_i"].my_ports["ass_in"])
  419. self.connectPorts(self.submodels["b_g_to_assembler_i2"].my_ports["conv_out"], self.submodels["assembler_i"].my_ports["ass_in"])
  420. self.connectPorts(self.submodels["mg_g_to_assembler_i2"].my_ports["conv_out"], self.submodels["assembler_i"].my_ports["ass_in"])
  421. self.connectPorts(self.submodels["wc_g_to_assembler_i2"].my_ports["conv_out"], self.submodels["assembler_i"].my_ports["ass_in"])
  422. self.connectPorts(self.submodels["assembler_to_qualitycontrol_i2"].my_ports["conv_out"], self.submodels["qualitycontrol_i"].my_ports["qc_in"])
  423. self.connectPorts(self.submodels["qualitycontrol_broken_to_repair_i2"].my_ports["conv_out"], self.submodels["repair_i"].my_ports["rep_in"])
  424. self.connectPorts(self.submodels["qualitycontrol_to_collector_i2"].my_ports["conv_out"], self.submodels["collector_i"].my_ports["c_in"])
  425. self.connectPorts(self.submodels["repair_to_collector_i2"].my_ports["conv_out"], self.submodels["collector_i"].my_ports["c_in"])