exported_model.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. from DEVS import *
  2. from infinity import INFINITY
  3. class Generator(AtomicDEVS):
  4. def __init__(self, name="Generator"):
  5. AtomicDEVS.__init__(self, name)
  6. self.state = {'name': "generating"}
  7. self.my_ports = {"g_out": self.addOutPort("g_out")}
  8. def timeAdvance(self):
  9. if self.state['name'] == 'generating':
  10. return 1
  11. def outputFnc(self):
  12. if self.state['name'] == 'generating':
  13. return {self.my_ports['g_out']: [{'type': 'Job', 'repr': {'duration': 0.3}}]}
  14. def intTransition(self):
  15. if self.state['name'] == 'generating':
  16. new_state = {}
  17. new_state['name'] = 'generating'
  18. return new_state
  19. def extTransition(self, my_inputs):
  20. inputs = {k.getPortName(): v for k, v in my_inputs.iteritems()}
  21. return AtomicDEVS.extTransition(self, my_inputs)
  22. def confTransition(self, my_inputs):
  23. inputs = {k.getPortName(): v for k, v in my_inputs.iteritems()}
  24. return AtomicDEVS.confTransition(self, my_inputs)
  25. class Processor(AtomicDEVS):
  26. def __init__(self, name="Processor"):
  27. AtomicDEVS.__init__(self, name)
  28. self.state = {'name': "idle"}
  29. self.my_ports = {"p_in": self.addInPort("p_in"), "p_out": self.addOutPort("p_out")}
  30. def timeAdvance(self):
  31. if self.state['name'] == 'processing':
  32. return self.state['job']['duration']
  33. if self.state['name'] == 'idle':
  34. return INFINITY
  35. def outputFnc(self):
  36. if self.state['name'] == 'processing':
  37. return {self.my_ports['p_out']: [{'type': 'Job', 'repr': self.state['job']}]}
  38. if self.state['name'] == 'idle':
  39. return {}
  40. def intTransition(self):
  41. if self.state['name'] == 'processing':
  42. new_state = {}
  43. new_state['name'] = 'idle'
  44. return new_state
  45. def extTransition(self, my_inputs):
  46. inputs = {k.getPortName(): v for k, v in my_inputs.iteritems()}
  47. if self.state['name'] == 'idle':
  48. new_state = {}
  49. new_state['name'] = 'processing'
  50. new_state['job'] = inputs['p_in'][0]['repr']
  51. return new_state
  52. else:
  53. return AtomicDEVS.extTransition(self, my_inputs)
  54. def confTransition(self, my_inputs):
  55. inputs = {k.getPortName(): v for k, v in my_inputs.iteritems()}
  56. return AtomicDEVS.confTransition(self, my_inputs)
  57. class Collector(AtomicDEVS):
  58. def __init__(self, name="Collector"):
  59. AtomicDEVS.__init__(self, name)
  60. self.state = {'name': "waiting"}
  61. self.my_ports = {"c_in": self.addInPort("c_in")}
  62. def timeAdvance(self):
  63. if self.state['name'] == 'waiting':
  64. return INFINITY
  65. def outputFnc(self):
  66. if self.state['name'] == 'waiting':
  67. return {}
  68. def intTransition(self):
  69. return AtomicDEVS.intTransition(self, my_inputs)
  70. def extTransition(self, my_inputs):
  71. inputs = {k.getPortName(): v for k, v in my_inputs.iteritems()}
  72. if self.state['name'] == 'waiting':
  73. new_state = {}
  74. new_state['name'] = 'waiting'
  75. new_state['nr_of_jobs'] = self.state['nr_of_jobs'] + 1
  76. return new_state
  77. else:
  78. return AtomicDEVS.extTransition(self, my_inputs)
  79. def confTransition(self, my_inputs):
  80. inputs = {k.getPortName(): v for k, v in my_inputs.iteritems()}
  81. return AtomicDEVS.confTransition(self, my_inputs)
  82. class CoupledProcessor(CoupledDEVS):
  83. def __init__(self, name="CoupledProcessor"):
  84. CoupledDEVS.__init__(self, name)
  85. self.my_ports = {"cp_out": self.addOutPort("cp_out"), "cp_in": self.addInPort("cp_in")}
  86. self.submodels = {"p1": self.addSubModel(Processor(name="p1")), "p2": self.addSubModel(Processor(name="p2"))}
  87. self.connectPorts(self.my_ports["cp_in"], self.submodels["p1"].my_ports["p_in"])
  88. self.connectPorts(self.submodels["p1"].my_ports["p_out"], self.submodels["p2"].my_ports["p_in"])
  89. self.connectPorts(self.submodels["p2"].my_ports["p_out"], self.my_ports["cp_out"])
  90. class Root(CoupledDEVS):
  91. def __init__(self, name="Root"):
  92. CoupledDEVS.__init__(self, name)
  93. self.my_ports = {}
  94. self.submodels = {"generator": self.addSubModel(Generator(name="generator")), "coupledprocessor": self.addSubModel(CoupledProcessor(name="coupledprocessor")), "processor": self.addSubModel(Processor(name="processor")), "collector": self.addSubModel(Collector(name="collector"))}
  95. self.connectPorts(self.submodels["coupledprocessor"].my_ports["cp_out"], self.submodels["processor"].my_ports["p_in"])
  96. self.connectPorts(self.submodels["generator"].my_ports["g_out"], self.submodels["coupledprocessor"].my_ports["cp_in"])
  97. self.connectPorts(self.submodels["processor"].my_ports["p_out"], self.submodels["collector"].my_ports["c_in"])