models.py 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940
  1. import sys
  2. import os.path
  3. from pypdevs.infinity import *
  4. from pypdevs.DEVS import AtomicDEVS, CoupledDEVS
  5. class Event(object):
  6. def __init__(self, eventSize):
  7. self.eventSize = eventSize
  8. def __str__(self):
  9. return "Eventsize = " + str(self.eventSize)
  10. class ModelState(object):
  11. def __init__(self):
  12. self.counter = INFINITY
  13. self.event = None
  14. def __str__(self):
  15. return str(self.counter)
  16. def toXML(self):
  17. return "<counter>" + str(self.counter) + "</counter>"
  18. class ProcessorNPP(AtomicDEVS):
  19. def __init__(self, name = "Processor", t_event1 = 1):
  20. AtomicDEVS.__init__(self, name)
  21. self.t_event1 = t_event1
  22. self.inport = self.addInPort("inport")
  23. self.outport = self.addOutPort("outport")
  24. self.state = ModelState()
  25. def timeAdvance(self):
  26. return self.state.counter
  27. def intTransition(self):
  28. self.state.counter -= self.timeAdvance()
  29. if self.state.counter == 0:
  30. self.state.counter = INFINITY
  31. self.state.event = None
  32. return self.state
  33. def extTransition(self, inputs):
  34. self.state.counter -= self.elapsed
  35. ev1 = inputs[self.inport][0]
  36. if ev1 != None:
  37. self.state.event = ev1
  38. self.state.counter = self.t_event1
  39. return self.state
  40. def outputFnc(self):
  41. output = {}
  42. mini = self.state.counter
  43. if self.state.counter == mini:
  44. output[self.outport] = [self.state.event]
  45. return output
  46. class RemoteDCProcessor(CoupledDEVS):
  47. def __init__(self):
  48. CoupledDEVS.__init__(self, "RemoteDCProcessor")
  49. mod = self.addSubModel(CoupledProcessor(1, 1), 2)
  50. self.inport = self.addInPort("inport")
  51. self.outport = self.addOutPort("outport")
  52. self.connectPorts(self.inport, mod.inport)
  53. self.connectPorts(mod.outport, self.outport)
  54. class Processor(AtomicDEVS):
  55. def __init__(self, name = "Processor", t_event1 = 1):
  56. AtomicDEVS.__init__(self, name)
  57. self.t_event1 = t_event1
  58. self.inport = self.addInPort("inport")
  59. self.outport = self.addOutPort("outport")
  60. self.state = ModelState()
  61. def timeAdvance(self):
  62. return self.state.counter
  63. def intTransition(self):
  64. self.state.counter -= self.timeAdvance()
  65. if self.state.counter == 0:
  66. self.state.counter = INFINITY
  67. self.state.event = None
  68. return self.state
  69. def extTransition(self, inputs):
  70. self.state.counter -= self.elapsed
  71. ev1 = inputs[self.inport][0]
  72. if ev1 != None:
  73. self.state.event = ev1
  74. self.state.counter = self.t_event1
  75. return self.state
  76. def outputFnc(self):
  77. mini = self.state.counter
  78. if self.state.counter == mini:
  79. return {self.outport: [self.state.event]}
  80. else:
  81. return {}
  82. class HeavyProcessor(AtomicDEVS):
  83. def __init__(self, name = "Processor", t_event1 = 1, iterations = 0):
  84. AtomicDEVS.__init__(self, name)
  85. self.t_event1 = t_event1
  86. self.inport = self.addInPort("inport")
  87. self.outport = self.addOutPort("outport")
  88. self.state = ModelState()
  89. self.iterations = iterations
  90. def timeAdvance(self):
  91. return self.state.counter
  92. def intTransition(self):
  93. self.state.counter -= self.timeAdvance()
  94. # Do lots of work now
  95. stupidcounter = 0
  96. for _ in xrange(self.iterations):
  97. pass
  98. if self.state.counter == 0:
  99. self.state.counter = INFINITY
  100. self.state.event = None
  101. return self.state
  102. def extTransition(self, inputs):
  103. self.state.counter -= self.elapsed
  104. ev1 = inputs[self.inport][0]
  105. stupidcounter = 0
  106. for _ in xrange(self.iterations):
  107. pass
  108. if ev1 != None:
  109. self.state.event = ev1
  110. self.state.counter = self.t_event1
  111. return self.state
  112. def outputFnc(self):
  113. mini = self.state.counter
  114. stupidcounter = 0
  115. for _ in xrange(self.iterations):
  116. pass
  117. if self.state.counter == mini:
  118. return {self.outport: [self.state.event]}
  119. class NestedProcessor(Processor):
  120. def __init__(self, name = "NestedProcessor"):
  121. Processor.__init__(self, name)
  122. self.state.processed = 0
  123. self.state.event = Event(5)
  124. def extTransition(self, inputs):
  125. self.state = Processor.extTransition(self, inputs)
  126. self.state.processed += 1
  127. return self.state
  128. def timeAdvance(self):
  129. from pypdevs.simulator import Simulator
  130. model = CoupledGenerator()
  131. sim = Simulator(model)
  132. sim.setTerminationTime(self.state.processed)
  133. #sim.setVerbose(True)
  134. sim.simulate()
  135. result = max(sim.model.generator.state.generated, 1)
  136. return result
  137. class Generator(AtomicDEVS):
  138. def __init__(self, name = "Generator", t_gen_event1 = 1.0, binary = False):
  139. AtomicDEVS.__init__(self, name)
  140. self.state = ModelState()
  141. # Add an extra variable
  142. self.state.generated = 0
  143. self.state.counter = t_gen_event1
  144. self.state.value = 1
  145. self.t_gen_event1 = t_gen_event1
  146. self.outport = self.addOutPort("outport")
  147. self.inport = self.addInPort("inport")
  148. self.binary = binary
  149. def timeAdvance(self):
  150. return self.state.counter
  151. def intTransition(self):
  152. self.state.generated += 1
  153. return self.state
  154. def extTransition(self, inputs):
  155. self.state.counter -= self.elapsed
  156. return self.state
  157. def outputFnc(self):
  158. if self.binary:
  159. return {self.outport: ["b1"]}
  160. else:
  161. return {self.outport: [Event(self.state.value)]}
  162. class GeneratorNPP(AtomicDEVS):
  163. def __init__(self, name = "Generator", t_gen_event1 = 1.0):
  164. AtomicDEVS.__init__(self, name)
  165. self.state = ModelState()
  166. # Add an extra variable
  167. self.state.generated = 0
  168. self.state.counter = t_gen_event1
  169. self.t_gen_event1 = t_gen_event1
  170. self.outport = self.addOutPort("outport")
  171. self.inport = self.addInPort("inport")
  172. def timeAdvance(self):
  173. return self.state.counter
  174. def intTransition(self):
  175. self.state.generated += 1
  176. return self.state
  177. def extTransition(self, inputs):
  178. self.state.counter -= self.elapsed
  179. return self.state
  180. def outputFnc(self):
  181. return {self.outport: [Event(1)]}
  182. class CoupledGenerator(CoupledDEVS):
  183. def __init__(self, t_gen_event1 = 1, binary = False):
  184. CoupledDEVS.__init__(self, "CoupledGenerator")
  185. self.generator = self.addSubModel(Generator("Generator", t_gen_event1, binary))
  186. self.inport = self.addInPort("inport")
  187. self.outport = self.addOutPort("outport")
  188. self.connectPorts(self.inport, self.generator.inport)
  189. self.connectPorts(self.generator.outport, self.outport)
  190. class CoupledGeneratorNPP(CoupledDEVS):
  191. def __init__(self, t_gen_event1 = 1):
  192. CoupledDEVS.__init__(self, "CoupledGenerator")
  193. self.generator = self.addSubModel(GeneratorNPP("Generator", t_gen_event1))
  194. self.inport = self.addInPort("inport")
  195. self.outport = self.addOutPort("outport")
  196. self.connectPorts(self.inport, self.generator.inport)
  197. self.connectPorts(self.generator.outport, self.outport)
  198. class CoupledHeavyProcessor(CoupledDEVS):
  199. def __init__(self, t_event1_P1, levels, iterations, name = None):
  200. if name == None:
  201. name = "CoupledHeavyProcessor_" + str(levels)
  202. CoupledDEVS.__init__(self, name)
  203. self.inport = self.addInPort("inport")
  204. self.outport = self.addOutPort("outport")
  205. self.coupled = []
  206. for i in range(levels):
  207. self.coupled.append(self.addSubModel(HeavyProcessor("Processor" + str(i), t_event1_P1, iterations)))
  208. for i in range(levels-1):
  209. self.connectPorts(self.coupled[i].outport, self.coupled[i+1].inport)
  210. self.connectPorts(self.inport, self.coupled[0].inport)
  211. self.connectPorts(self.coupled[-1].outport, self.outport)
  212. class CoupledProcessorNPP(CoupledDEVS):
  213. def __init__(self, t_event1_P1, levels):
  214. CoupledDEVS.__init__(self, "CoupledProcessor_" + str(levels))
  215. self.inport = self.addInPort("inport")
  216. self.outport = self.addOutPort("outport")
  217. self.coupled = []
  218. for i in range(levels):
  219. self.coupled.append(self.addSubModel(ProcessorNPP("Processor" + str(i), t_event1_P1)))
  220. for i in range(levels-1):
  221. self.connectPorts(self.coupled[i].outport, self.coupled[i+1].inport)
  222. self.connectPorts(self.inport, self.coupled[0].inport)
  223. self.connectPorts(self.coupled[-1].outport, self.outport)
  224. class CoupledProcessor(CoupledDEVS):
  225. def __init__(self, t_event1_P1, levels):
  226. CoupledDEVS.__init__(self, "CoupledProcessor_" + str(levels))
  227. self.inport = self.addInPort("inport")
  228. self.outport = self.addOutPort("outport")
  229. self.coupled = []
  230. for i in range(levels):
  231. self.coupled.append(self.addSubModel(Processor("Processor" + str(i), t_event1_P1)))
  232. for i in range(levels-1):
  233. self.connectPorts(self.coupled[i].outport, self.coupled[i+1].inport)
  234. self.connectPorts(self.inport, self.coupled[0].inport)
  235. self.connectPorts(self.coupled[-1].outport, self.outport)
  236. class CoupledProcessorMP(CoupledDEVS):
  237. def __init__(self, t_event1_P1):
  238. CoupledDEVS.__init__(self, "CoupledProcessorMP")
  239. self.inport = self.addInPort("inport")
  240. p1 = self.addSubModel(Processor("Processor1", t_event1_P1))
  241. p2 = self.addSubModel(Processor("Processor2", t_event1_P1))
  242. p3 = self.addSubModel(Processor("Processor3", t_event1_P1))
  243. p4 = self.addSubModel(Processor("Processor4", t_event1_P1))
  244. self.connectPorts(self.inport, p1.inport)
  245. self.connectPorts(self.inport, p3.inport)
  246. self.connectPorts(p1.outport, p2.inport)
  247. self.connectPorts(p3.outport, p4.inport)
  248. class Binary(CoupledDEVS):
  249. def __init__(self):
  250. CoupledDEVS.__init__(self, "Binary")
  251. self.generator = self.addSubModel(CoupledGenerator(1.0, True))
  252. self.processor1 = self.addSubModel(CoupledProcessor(0.6, 2), 2)
  253. self.processor2 = self.addSubModel(CoupledProcessor(0.30, 3), 1)
  254. self.connectPorts(self.generator.outport, self.processor1.inport)
  255. self.connectPorts(self.processor1.outport, self.processor2.inport)
  256. class Binary_local(CoupledDEVS):
  257. def __init__(self):
  258. CoupledDEVS.__init__(self, "Binary")
  259. self.generator = self.addSubModel(CoupledGenerator(1.0, True))
  260. self.processor1 = self.addSubModel(CoupledProcessor(0.6, 2))
  261. self.processor2 = self.addSubModel(CoupledProcessor(0.30, 3))
  262. self.connectPorts(self.generator.outport, self.processor1.inport)
  263. self.connectPorts(self.processor1.outport, self.processor2.inport)
  264. class Chain_local(CoupledDEVS):
  265. def __init__(self, ta):
  266. CoupledDEVS.__init__(self, "Chain")
  267. self.generator = self.addSubModel(CoupledGenerator(1.0))
  268. self.processor1 = self.addSubModel(CoupledProcessor(ta, 2))
  269. self.processor2 = self.addSubModel(CoupledProcessor(0.30, 3))
  270. self.connectPorts(self.generator.outport, self.processor1.inport)
  271. self.connectPorts(self.processor1.outport, self.processor2.inport)
  272. class Chain(CoupledDEVS):
  273. def __init__(self, ta):
  274. CoupledDEVS.__init__(self, "Chain")
  275. self.generator = self.addSubModel(CoupledGenerator(1.0), 1)
  276. self.processor1 = self.addSubModel(CoupledProcessor(ta, 2), 2)
  277. self.processor2 = self.addSubModel(CoupledProcessor(0.30, 3))
  278. self.connectPorts(self.generator.outport, self.processor1.inport)
  279. self.connectPorts(self.processor1.outport, self.processor2.inport)
  280. class Boundary(CoupledDEVS):
  281. def __init__(self):
  282. CoupledDEVS.__init__(self, "Boundary")
  283. self.generator = self.addSubModel(CoupledGenerator(1.0), 1)
  284. self.processor1 = self.addSubModel(CoupledProcessor(0.60, 2), 2)
  285. self.processor2 = self.addSubModel(CoupledProcessor(0.30, 4), 3)
  286. self.processor3 = self.addSubModel(CoupledProcessor(0.30, 3))
  287. self.connectPorts(self.generator.outport, self.processor1.inport)
  288. self.connectPorts(self.processor1.outport, self.processor2.inport)
  289. self.connectPorts(self.processor1.outport, self.processor3.inport)
  290. self.connectPorts(self.processor2.outport, self.processor3.inport)
  291. class Two(CoupledDEVS):
  292. def __init__(self):
  293. CoupledDEVS.__init__(self, "Two")
  294. self.generator = self.addSubModel(CoupledGenerator(1.0), 1)
  295. self.processor1 = self.addSubModel(CoupledProcessor(0.30, 3))
  296. self.connectPorts(self.generator.outport, self.processor1.inport)
  297. class DualChain_local(CoupledDEVS):
  298. def __init__(self, ta):
  299. CoupledDEVS.__init__(self, "DualChain")
  300. self.generator = self.addSubModel(CoupledGenerator(1.0))
  301. self.processor1 = self.addSubModel(CoupledProcessor(ta, 2))
  302. self.processor2 = self.addSubModel(CoupledProcessor(0.30, 3))
  303. self.connectPorts(self.generator.outport, self.processor1.inport)
  304. self.connectPorts(self.generator.outport, self.processor2.inport)
  305. class DualChain(CoupledDEVS):
  306. def __init__(self, ta):
  307. CoupledDEVS.__init__(self, "DualChain")
  308. self.generator = self.addSubModel(CoupledGenerator(1.0), 1)
  309. self.processor1 = self.addSubModel(CoupledProcessor(ta, 2), 2)
  310. self.processor2 = self.addSubModel(CoupledProcessor(0.30, 3))
  311. self.connectPorts(self.generator.outport, self.processor1.inport)
  312. self.connectPorts(self.generator.outport, self.processor2.inport)
  313. class DualChainMP_local(CoupledDEVS):
  314. def __init__(self, ta):
  315. CoupledDEVS.__init__(self, "DualChainMP")
  316. self.generator = self.addSubModel(CoupledGenerator(1.0))
  317. self.processor1 = self.addSubModel(CoupledProcessorMP(0.66))
  318. self.connectPorts(self.generator.outport, self.processor1.inport)
  319. class DualChainMP(CoupledDEVS):
  320. def __init__(self, ta):
  321. CoupledDEVS.__init__(self, "DualChainMP")
  322. self.generator = self.addSubModel(CoupledGenerator(1.0), 1)
  323. self.processor1 = self.addSubModel(CoupledProcessorMP(0.66), 2)
  324. self.connectPorts(self.generator.outport, self.processor1.inport)
  325. class DualDepthProcessor_local(CoupledDEVS):
  326. def __init__(self, ta):
  327. CoupledDEVS.__init__(self, "DualDepthProcessor")
  328. self.inport = self.addInPort("inport")
  329. self.outport = self.addOutPort("outport")
  330. self.processor1 = self.addSubModel(CoupledProcessor(ta, 1))
  331. self.processor2 = self.addSubModel(CoupledProcessor(ta, 2))
  332. self.connectPorts(self.inport, self.processor1.inport)
  333. self.connectPorts(self.processor1.outport, self.processor2.inport)
  334. self.connectPorts(self.processor2.outport, self.outport)
  335. class DualDepthProcessor(CoupledDEVS):
  336. def __init__(self, ta):
  337. CoupledDEVS.__init__(self, "DualDepthProcessor")
  338. self.inport = self.addInPort("inport")
  339. self.outport = self.addOutPort("outport")
  340. self.processor1 = self.addSubModel(CoupledProcessor(ta, 1), 2)
  341. self.processor2 = self.addSubModel(CoupledProcessor(ta, 2))
  342. self.connectPorts(self.inport, self.processor1.inport)
  343. self.connectPorts(self.processor1.outport, self.processor2.inport)
  344. self.connectPorts(self.processor2.outport, self.outport)
  345. class DualDepth_local(CoupledDEVS):
  346. def __init__(self, ta):
  347. CoupledDEVS.__init__(self, "DualDepth")
  348. self.generator = self.addSubModel(Generator("Generator", 1.0))
  349. self.processor = self.addSubModel(DualDepthProcessor_local(ta))
  350. self.connectPorts(self.generator.outport, self.processor.inport)
  351. class DualDepth(CoupledDEVS):
  352. def __init__(self, ta):
  353. CoupledDEVS.__init__(self, "DualDepth")
  354. self.generator = self.addSubModel(Generator("Generator", 1.0))
  355. self.processor = self.addSubModel(DualDepthProcessor(ta), 1)
  356. self.connectPorts(self.generator.outport, self.processor.inport)
  357. class Nested_local(CoupledDEVS):
  358. def __init__(self):
  359. CoupledDEVS.__init__(self, "Nested")
  360. self.generator = self.addSubModel(Generator("Generator", 1))
  361. self.processor = self.addSubModel(NestedProcessor("NProcessor"))
  362. self.connectPorts(self.generator.outport, self.processor.inport)
  363. class MultiNested(CoupledDEVS):
  364. def __init__(self):
  365. CoupledDEVS.__init__(self, "MultiNested")
  366. self.generator = self.addSubModel(Generator("Generator", 1))
  367. self.processor1 = self.addSubModel(NestedProcessor("NProcessor1"), 1)
  368. self.processor2 = self.addSubModel(NestedProcessor("NProcessor2"), 2)
  369. self.connectPorts(self.generator.outport, self.processor1.inport)
  370. self.connectPorts(self.processor1.outport, self.processor2.inport)
  371. class Local(CoupledDEVS):
  372. def __init__(self):
  373. CoupledDEVS.__init__(self, "Local")
  374. self.generator = self.addSubModel(Generator("Generator", 1))
  375. self.processor1 = self.addSubModel(CoupledProcessor(1, 2))
  376. self.processor2 = self.addSubModel(CoupledProcessor(1, 3))
  377. self.connectPorts(self.generator.outport, self.processor1.inport)
  378. self.connectPorts(self.processor1.outport, self.processor2.inport)
  379. class OptimizableChain(CoupledDEVS):
  380. def __init__(self):
  381. CoupledDEVS.__init__(self, "OptimizableChain")
  382. self.generator = self.addSubModel(CoupledGenerator(1.0))
  383. self.processor1 = self.addSubModel(CoupledProcessor(0.66, 2), 1)
  384. self.processor2 = self.addSubModel(CoupledProcessor(0.30, 3), 2)
  385. self.connectPorts(self.generator.outport, self.processor1.inport)
  386. self.connectPorts(self.processor1.outport, self.processor2.inport)
  387. class HugeOptimizableChain(CoupledDEVS):
  388. def __init__(self, iterations):
  389. CoupledDEVS.__init__(self, "HugeOptimizableChain")
  390. self.generator = self.addSubModel(CoupledGenerator(1.0))
  391. self.processor0 = self.addSubModel(CoupledHeavyProcessor(0.77, 10, iterations))
  392. self.processor1 = self.addSubModel(CoupledHeavyProcessor(0.66, 10, iterations), 1)
  393. self.processor2 = self.addSubModel(CoupledHeavyProcessor(0.30, 10, iterations), 2)
  394. self.connectPorts(self.generator.outport, self.processor0.inport)
  395. self.connectPorts(self.processor0.outport, self.processor1.inport)
  396. self.connectPorts(self.processor0.outport, self.processor2.inport)
  397. class HugeOptimizableLocalChain(CoupledDEVS):
  398. def __init__(self, iterations):
  399. CoupledDEVS.__init__(self, "HugeOptimizableChain")
  400. self.generator = self.addSubModel(CoupledGenerator(1.0))
  401. self.processor0 = self.addSubModel(CoupledHeavyProcessor(0.77, 10, iterations))
  402. self.processor1 = self.addSubModel(CoupledHeavyProcessor(0.66, 10, iterations))
  403. self.processor2 = self.addSubModel(CoupledHeavyProcessor(0.30, 10, iterations))
  404. self.connectPorts(self.generator.outport, self.processor0.inport)
  405. self.connectPorts(self.processor0.outport, self.processor1.inport)
  406. self.connectPorts(self.processor0.outport, self.processor2.inport)
  407. class LocalLong(CoupledDEVS):
  408. def __init__(self, name):
  409. CoupledDEVS.__init__(self, name)
  410. self.generator = self.addSubModel(Generator("Generator", 1))
  411. self.processor1 = self.addSubModel(CoupledProcessor(0.66, 20))
  412. self.connectPorts(self.generator.outport, self.processor1.inport)
  413. class ParallelChain(CoupledDEVS):
  414. def __init__(self):
  415. CoupledDEVS.__init__(self, "ParallelChain")
  416. self.processor1 = self.addSubModel(LocalLong('Local1'), 1)
  417. self.processor2 = self.addSubModel(LocalLong('Local2'), 2)
  418. class ParallelLocalChain(CoupledDEVS):
  419. def __init__(self):
  420. CoupledDEVS.__init__(self, "ParallelLocalChain")
  421. self.processor1 = self.addSubModel(LocalLong('Local1'))
  422. self.processor2 = self.addSubModel(LocalLong('Local2'))
  423. class ChainNoPeekPoke(CoupledDEVS):
  424. def __init__(self):
  425. CoupledDEVS.__init__(self, "ChainNoPeekPoke")
  426. self.generator = self.addSubModel(CoupledGeneratorNPP(1.0))
  427. self.processor1 = self.addSubModel(CoupledProcessorNPP(0.66, 2))
  428. self.processor2 = self.addSubModel(CoupledProcessorNPP(0.30, 3))
  429. self.connectPorts(self.generator.outport, self.processor1.inport)
  430. self.connectPorts(self.processor1.outport, self.processor2.inport)
  431. class ChainPeekPoke(CoupledDEVS):
  432. def __init__(self):
  433. CoupledDEVS.__init__(self, "ChainPeekPoke")
  434. self.generator = self.addSubModel(CoupledGenerator(1.0))
  435. self.processor1 = self.addSubModel(CoupledProcessor(0.66, 2))
  436. self.processor2 = self.addSubModel(CoupledProcessor(0.30, 3))
  437. self.connectPorts(self.generator.outport, self.processor1.inport)
  438. self.connectPorts(self.processor1.outport, self.processor2.inport)
  439. class AutoDistChain(CoupledDEVS):
  440. def __init__(self, nodes, totalAtomics, iterations):
  441. CoupledDEVS.__init__(self, "AutoDistChain")
  442. self.generator = self.addSubModel(CoupledGenerator(1.0))
  443. self.processors = []
  444. have = 0
  445. ta = 0.66
  446. for i in range(nodes):
  447. shouldhave = (float(i+1) / nodes) * totalAtomics
  448. num = int(shouldhave - have)
  449. have += num
  450. if i == 0:
  451. self.processors.append(self.addSubModel(CoupledHeavyProcessor(ta, num, iterations, "HeavyProcessor_" + str(i))))
  452. else:
  453. self.processors.append(self.addSubModel(CoupledHeavyProcessor(ta, num, iterations, "HeavyProcessor_" + str(i)), i))
  454. self.connectPorts(self.generator.outport, self.processors[0].inport)
  455. for i in range(len(self.processors)-1):
  456. self.connectPorts(self.processors[i].outport, self.processors[i+1].inport)
  457. class RemoteDC(CoupledDEVS):
  458. def __init__(self):
  459. CoupledDEVS.__init__(self, "Root")
  460. self.generator = self.addSubModel(CoupledGenerator(1.0))
  461. self.processor1 = self.addSubModel(RemoteDCProcessor(), 1)
  462. self.processor2 = self.addSubModel(CoupledProcessor(0.30, 3))
  463. self.connectPorts(self.generator.outport, self.processor1.inport)
  464. self.connectPorts(self.processor1.outport, self.processor2.inport)
  465. class MultipleInputs(CoupledDEVS):
  466. def __init__(self):
  467. CoupledDEVS.__init__(self, "MultipleInputs")
  468. self.generator = self.addSubModel(Generator(1.0))
  469. self.processors1 = []
  470. for i in xrange(5):
  471. self.processors1.append(self.addSubModel(Processor("1-" + str(i), 0.3), 1))
  472. self.connectPorts(self.generator.outport, self.processors1[-1].inport)
  473. self.processors2 = []
  474. for i in xrange(2):
  475. self.processors2.append(self.addSubModel(Processor("2-" + str(i), 0.3), 2))
  476. for s in self.processors1:
  477. self.connectPorts(s.outport, self.processors2[-1].inport)
  478. class MultipleInputs_local(CoupledDEVS):
  479. def __init__(self):
  480. CoupledDEVS.__init__(self, "MultipleInputs")
  481. self.generator = self.addSubModel(Generator(1.0))
  482. self.processors1 = []
  483. for i in xrange(5):
  484. self.processors1.append(self.addSubModel(Processor("1-" + str(i), 0.3)))
  485. self.connectPorts(self.generator.outport, self.processors1[-1].inport)
  486. self.processors2 = []
  487. for i in xrange(2):
  488. self.processors2.append(self.addSubModel(Processor("2-" + str(i), 0.3)))
  489. for s in self.processors1:
  490. self.connectPorts(s.outport, self.processors2[-1].inport)
  491. class DoubleLayer1(CoupledDEVS):
  492. def __init__(self):
  493. CoupledDEVS.__init__(self, "Layer1")
  494. self.inport = self.addInPort("inport")
  495. self.processor = self.addSubModel(Processor("Processor", 0.3))
  496. self.connectPorts(self.inport, self.processor.inport)
  497. class DoubleLayer2(CoupledDEVS):
  498. def __init__(self):
  499. CoupledDEVS.__init__(self, "Layer2")
  500. self.lower = self.addSubModel(DoubleLayer1())
  501. self.inport1 = self.addInPort("inport1")
  502. self.inport2 = self.addInPort("inport2")
  503. self.connectPorts(self.inport1, self.lower.inport)
  504. self.connectPorts(self.inport2, self.lower.inport)
  505. class DoubleLayerRoot(CoupledDEVS):
  506. def __init__(self):
  507. CoupledDEVS.__init__(self, "Root")
  508. self.lower = self.addSubModel(DoubleLayer2())
  509. self.generator = self.addSubModel(Generator("Generator", 1))
  510. self.connectPorts(self.generator.outport, self.lower.inport1)
  511. self.connectPorts(self.generator.outport, self.lower.inport2)
  512. class DSDEVSRoot(CoupledDEVS):
  513. def __init__(self):
  514. CoupledDEVS.__init__(self, "Root")
  515. self.submodel = self.addSubModel(GeneratorDS())
  516. self.submodel2 = self.addSubModel(Processor())
  517. self.submodel3 = self.addSubModel(Processor())
  518. self.connectPorts(self.submodel.outport, self.submodel2.inport)
  519. self.connectPorts(self.submodel2.outport, self.submodel3.inport)
  520. self.connectPorts(self.submodel.outport, self.submodel3.inport)
  521. def modelTransition(self, state):
  522. self.removeSubModel(self.submodel2)
  523. self.submodel2 = self.addSubModel(Processor())
  524. self.connectPorts(self.submodel2.outport, self.submodel3.inport)
  525. self.submodel4 = self.addSubModel(CoupledProcessor(0.2, 3))
  526. self.connectPorts(self.submodel3.outport, self.submodel4.inport)
  527. self.submodelX = self.addSubModel(ElapsedNothing())
  528. return False
  529. class ElapsedNothing(AtomicDEVS):
  530. def __init__(self):
  531. AtomicDEVS.__init__(self, "ElapsedNothing")
  532. self.elapsed = 0.3
  533. self.state = 1
  534. def intTransition(self):
  535. return 0
  536. def timeAdvance(self):
  537. return self.state if self.state > 0 else float('inf')
  538. class GeneratorDS(Generator):
  539. def __init__(self):
  540. Generator.__init__(self, "GEN")
  541. self.elapsed = 0.5
  542. def outputFnc(self):
  543. if self.state.generated < 1:
  544. return Generator.outputFnc(self)
  545. else:
  546. return {}
  547. def modelTransition(self, state):
  548. if self.state.generated == 1:
  549. self.removePort(self.outport)
  550. del self.outport
  551. return self.state.generated == 1
  552. class ClassicGenerator(AtomicDEVS):
  553. def __init__(self):
  554. AtomicDEVS.__init__(self, "Generator")
  555. self.state = None
  556. self.outport = self.addOutPort("outport")
  557. def intTransition(self):
  558. return None
  559. def outputFnc(self):
  560. return {self.outport: 1}
  561. def timeAdvance(self):
  562. return 1
  563. class ClassicProcessor(AtomicDEVS):
  564. def __init__(self, name):
  565. AtomicDEVS.__init__(self, "Processor_%s" % name)
  566. self.state = None
  567. self.inport = self.addInPort("inport")
  568. self.outport = self.addOutPort("outport")
  569. def intTransition(self):
  570. return None
  571. def outputFnc(self):
  572. return {self.outport: self.state}
  573. def extTransition(self, inputs):
  574. self.state = inputs[self.inport]
  575. return self.state
  576. def timeAdvance(self):
  577. return (1.0 if self.state is not None else INFINITY)
  578. class ClassicCoupledProcessor(CoupledDEVS):
  579. def __init__(self, it, namecounter):
  580. CoupledDEVS.__init__(self, "CoupledProcessor_%s_%s" % (it, namecounter))
  581. self.inport = self.addInPort("inport")
  582. self.outport = self.addOutPort("outport")
  583. if it != 0:
  584. self.subproc = self.addSubModel(ClassicCoupledProcessor(it-1, 0))
  585. else:
  586. self.subproc = self.addSubModel(ClassicProcessor(0))
  587. self.subproc2 = self.addSubModel(ClassicProcessor(1))
  588. if it != 0:
  589. self.subproc3 = self.addSubModel(ClassicCoupledProcessor(it-1, 2))
  590. else:
  591. self.subproc3 = self.addSubModel(ClassicProcessor(2))
  592. self.connectPorts(self.inport, self.subproc.inport)
  593. self.connectPorts(self.subproc.outport, self.subproc2.inport)
  594. self.connectPorts(self.subproc2.outport, self.subproc3.inport)
  595. self.connectPorts(self.subproc3.outport, self.outport)
  596. def select(self, immChildren):
  597. if self.subproc3 in immChildren:
  598. return self.subproc3
  599. elif self.subproc2 in immChildren:
  600. return self.subproc2
  601. elif self.subproc in immChildren:
  602. return self.subproc
  603. else:
  604. return immChildren[0]
  605. class ClassicCoupled(CoupledDEVS):
  606. def __init__(self):
  607. CoupledDEVS.__init__(self, "Coupled")
  608. self.generator = self.addSubModel(ClassicGenerator())
  609. self.processor = self.addSubModel(ClassicCoupledProcessor(3, 0))
  610. self.connectPorts(self.generator.outport, self.processor.inport)
  611. def select(self, immChildren):
  612. if self.processor in immChildren:
  613. return self.processor
  614. else:
  615. return immChildren[0]
  616. class RandomProcessorState(object):
  617. def __init__(self, seed):
  618. from pypdevs.randomGenerator import RandomGenerator
  619. self.randomGenerator = RandomGenerator(seed)
  620. self.queue = []
  621. self.proctime = self.randomGenerator.uniform(0.3, 3.0)
  622. def __str__(self):
  623. return "Random Processor State -- " + str(self.proctime)
  624. class RandomProcessor(AtomicDEVS):
  625. def __init__(self, seed):
  626. AtomicDEVS.__init__(self, "RandomProcessor_" + str(seed))
  627. self.inport = self.addInPort("inport")
  628. self.outport = self.addOutPort("outport")
  629. self.state = RandomProcessorState(seed)
  630. def intTransition(self):
  631. self.state.queue = self.state.queue[1:]
  632. self.state.proctime = self.state.randomGenerator.uniform(0.3, 3.0)
  633. return self.state
  634. def extTransition(self, inputs):
  635. if self.state.queue:
  636. self.state.proctime -= self.elapsed
  637. self.state.queue.extend(inputs[self.inport])
  638. return self.state
  639. def outputFnc(self):
  640. return {self.outport: [self.state.queue[0]]}
  641. def timeAdvance(self):
  642. if self.state.queue:
  643. return self.state.proctime
  644. else:
  645. return INFINITY
  646. class RandomCoupled(CoupledDEVS):
  647. def __init__(self):
  648. CoupledDEVS.__init__(self, "Coupled")
  649. self.generator = self.addSubModel(Generator())
  650. self.processor1 = self.addSubModel(RandomProcessor(1), 1)
  651. self.processor2 = self.addSubModel(RandomProcessor(2), 2)
  652. self.processor3 = self.addSubModel(RandomProcessor(3))
  653. self.connectPorts(self.generator.outport, self.processor1.inport)
  654. self.connectPorts(self.processor1.outport, self.processor2.inport)
  655. self.connectPorts(self.processor2.outport, self.processor3.inport)
  656. class RandomCoupled_local(CoupledDEVS):
  657. def __init__(self):
  658. CoupledDEVS.__init__(self, "Coupled")
  659. self.generator = self.addSubModel(Generator())
  660. self.processor1 = self.addSubModel(RandomProcessor(1))
  661. self.processor2 = self.addSubModel(RandomProcessor(2))
  662. self.processor3 = self.addSubModel(RandomProcessor(3))
  663. self.connectPorts(self.generator.outport, self.processor1.inport)
  664. self.connectPorts(self.processor1.outport, self.processor2.inport)
  665. self.connectPorts(self.processor2.outport, self.processor3.inport)
  666. class Chain_bad(CoupledDEVS):
  667. def __init__(self):
  668. CoupledDEVS.__init__(self, "Chain")
  669. self.generator = self.addSubModel(CoupledGenerator(1.0), 0)
  670. self.processor1 = self.addSubModel(CoupledProcessor(0.66, 2), 1)
  671. self.processor2 = self.addSubModel(CoupledProcessor(0.66, 3), 2)
  672. self.processor3 = self.addSubModel(CoupledProcessor(0.66, 4), 1)
  673. self.processor4 = self.addSubModel(CoupledProcessor(0.66, 5), 0)
  674. self.processor5 = self.addSubModel(CoupledProcessor(0.30, 6), 2)
  675. self.connectPorts(self.generator.outport, self.processor1.inport)
  676. self.connectPorts(self.processor1.outport, self.processor2.inport)
  677. self.connectPorts(self.processor2.outport, self.processor3.inport)
  678. self.connectPorts(self.processor3.outport, self.processor4.inport)
  679. self.connectPorts(self.processor4.outport, self.processor5.inport)
  680. class GeneratorClassic(AtomicDEVS):
  681. def __init__(self):
  682. AtomicDEVS.__init__(self, "Gen")
  683. self.outport = self.addOutPort("outport")
  684. self.state = True
  685. def intTransition(self):
  686. return False
  687. def outputFnc(self):
  688. return {self.outport: 3}
  689. def timeAdvance(self):
  690. return 1.0 if self.state else INFINITY
  691. class ProcessorClassic1(AtomicDEVS):
  692. def __init__(self):
  693. AtomicDEVS.__init__(self, "P1")
  694. self.inport = self.addInPort("inport")
  695. self.outport = self.addOutPort("outport")
  696. self.state = None
  697. def intTransition(self):
  698. return None
  699. def extTransition(self, inputs):
  700. return inputs[self.inport]
  701. def outputFnc(self):
  702. return {self.outport: self.state}
  703. def timeAdvance(self):
  704. return 1.0 if self.state is not None else INFINITY
  705. class ProcessorClassic2(AtomicDEVS):
  706. def __init__(self):
  707. AtomicDEVS.__init__(self, "P2")
  708. self.inport1 = self.addInPort("inport1")
  709. self.inport2 = self.addInPort("inport2")
  710. self.outport = self.addOutPort("outport")
  711. self.state = (None, None)
  712. def intTransition(self):
  713. return (None, None)
  714. def extTransition(self, inputs):
  715. inp1 = inputs.get(self.inport1, None)
  716. inp2 = inputs.get(self.inport2, None)
  717. return (inp1, inp2)
  718. def outputFnc(self):
  719. return {self.outport: self.state}
  720. def timeAdvance(self):
  721. return 1.0 if self.state[0] is not None or self.state[1] is not None else INFINITY
  722. class ProcessorClassicO2(AtomicDEVS):
  723. def __init__(self):
  724. AtomicDEVS.__init__(self, "PO2")
  725. self.inport = self.addInPort("inport")
  726. self.outport1 = self.addOutPort("outport1")
  727. self.outport2 = self.addOutPort("outport2")
  728. self.state = None
  729. def intTransition(self):
  730. return None
  731. def extTransition(self, inputs):
  732. return inputs[self.inport]
  733. def outputFnc(self):
  734. return {self.outport1: self.state, self.outport2: self.state}
  735. def timeAdvance(self):
  736. return 1.0 if self.state is not None else INFINITY
  737. class ProcessorCoupledClassic(CoupledDEVS):
  738. def __init__(self):
  739. CoupledDEVS.__init__(self, "Coupled")
  740. self.inport1 = self.addInPort("inport1")
  741. self.inport2 = self.addInPort("inport2")
  742. self.outport = self.addOutPort("outport")
  743. self.proc1 = self.addSubModel(ProcessorClassic1())
  744. self.proc2 = self.addSubModel(ProcessorClassic1())
  745. self.connectPorts(self.inport1, self.proc1.inport)
  746. self.connectPorts(self.inport2, self.proc2.inport)
  747. self.connectPorts(self.proc1.outport, self.outport)
  748. self.connectPorts(self.proc2.outport, self.outport)
  749. class AllConnectClassic(CoupledDEVS):
  750. def __init__(self):
  751. CoupledDEVS.__init__(self, "Root")
  752. self.model1 = self.addSubModel(GeneratorClassic())
  753. self.model2 = self.addSubModel(ProcessorCoupledClassic())
  754. self.model3 = self.addSubModel(ProcessorClassic2())
  755. self.model4 = self.addSubModel(ProcessorClassic1())
  756. self.model5 = self.addSubModel(ProcessorClassicO2())
  757. self.connectPorts(self.model1.outport, self.model2.inport1)
  758. self.connectPorts(self.model1.outport, self.model2.inport2)
  759. self.connectPorts(self.model2.outport, self.model3.inport1)
  760. self.connectPorts(self.model2.outport, self.model3.inport2)
  761. self.connectPorts(self.model3.outport, self.model5.inport)
  762. self.connectPorts(self.model2.outport, self.model4.inport)
  763. self.connectPorts(self.model4.outport, self.model5.inport)
  764. def trans1(inp):
  765. inp.eventSize += 1
  766. return inp
  767. def trans2(inp):
  768. inp.eventSize = 0
  769. return inp
  770. class ZCoupledProcessor(CoupledDEVS):
  771. def __init__(self, num):
  772. CoupledDEVS.__init__(self, "CoupledProcessor_" + str(num))
  773. self.inport = self.addInPort("inport")
  774. self.outport = self.addOutPort("outport")
  775. self.coupled = []
  776. levels = 4
  777. for i in range(levels):
  778. self.coupled.append(self.addSubModel(Processor("Processor" + str(i), 1.0)))
  779. for i in range(levels-1):
  780. self.connectPorts(self.coupled[i].outport, self.coupled[i+1].inport, trans1)
  781. self.connectPorts(self.inport, self.coupled[0].inport)
  782. self.connectPorts(self.coupled[-1].outport, self.outport)
  783. class ZChain_local(CoupledDEVS):
  784. def __init__(self):
  785. CoupledDEVS.__init__(self, "ROOT")
  786. self.gen = self.addSubModel(Generator())
  787. self.proc1 = self.addSubModel(ZCoupledProcessor(1))
  788. self.proc2 = self.addSubModel(ZCoupledProcessor(2))
  789. self.connectPorts(self.gen.outport, self.proc1.inport)
  790. self.connectPorts(self.gen.outport, self.proc2.inport, trans2)
  791. class ZChain(CoupledDEVS):
  792. def __init__(self):
  793. CoupledDEVS.__init__(self, "ROOT")
  794. self.gen = self.addSubModel(Generator())
  795. self.proc1 = self.addSubModel(ZCoupledProcessor(1), 1)
  796. self.proc2 = self.addSubModel(ZCoupledProcessor(2), 2)
  797. self.connectPorts(self.gen.outport, self.proc1.inport)
  798. self.connectPorts(self.gen.outport, self.proc2.inport, trans2)