model_processor.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. import sys
  2. sys.path.append("../../pypdevs/src/")
  3. from DEVS import *
  4. from infinity import INFINITY
  5. class GeneratorState:
  6. def __init__(self, name=""):
  7. self.name = name
  8. class ProcessorState:
  9. def __init__(self, name="", job=None):
  10. self.name = name
  11. self.job = job
  12. class CollectorState:
  13. def __init__(self, name="", nr_of_jobs=None):
  14. self.name = name
  15. self.nr_of_jobs = nr_of_jobs
  16. class Job:
  17. def __init__(self, jobSize=None):
  18. self.jobSize = jobSize
  19. def __str__(self):
  20. return "Job(" + str(self.jobSize) + ")"
  21. class Generator(AtomicDEVS):
  22. def __init__(self, name="Generator"):
  23. AtomicDEVS.__init__(self, name)
  24. self.state = GeneratorState(name="generating")
  25. self.my_ports = {"p_out": self.addOutPort("p_out")}
  26. def timeAdvance(self):
  27. if self.state.name == "generating":
  28. return 1
  29. def outputFnc(self):
  30. if self.state.name == "generating":
  31. return {self.my_ports[k]: v for k, v in {'p_out': [Job(0.3)]}.iteritems()}
  32. def intTransition(self):
  33. def cond_int_generating_to_generating():
  34. return True
  35. def action_int_generating_to_generating():
  36. return {}
  37. if self.state.name == "generating" and cond_int_generating_to_generating():
  38. return GeneratorState(name="generating", **action_int_generating_to_generating())
  39. else:
  40. return AtomicDEVS.intTransition(self)
  41. def extTransition(self, my_inputs):
  42. inputs = {k.getPortName(): v for k, v in my_inputs.iteritems()}
  43. return AtomicDEVS.extTransition(self, my_inputs)
  44. def confTransition(self, my_inputs):
  45. inputs = {k.getPortName(): v for k, v in my_inputs.iteritems()}
  46. return AtomicDEVS.confTransition(self, my_inputs)
  47. class Processor(AtomicDEVS):
  48. def __init__(self, name="Processor"):
  49. AtomicDEVS.__init__(self, name)
  50. self.state = ProcessorState(name="idle")
  51. self.my_ports = {"p_in": self.addInPort("p_in"), "p_out": self.addOutPort("p_out")}
  52. def timeAdvance(self):
  53. if self.state.name == "idle":
  54. return INFINITY
  55. if self.state.name == "processing":
  56. return self.state.job.jobSize
  57. def outputFnc(self):
  58. if self.state.name == "idle":
  59. return {}
  60. if self.state.name == "processing":
  61. return {self.my_ports[k]: v for k, v in {'p_out': [self.state.job]}.iteritems()}
  62. def intTransition(self):
  63. def cond_int_processing_to_idle():
  64. return True
  65. def action_int_processing_to_idle():
  66. return {}
  67. if self.state.name == "processing" and cond_int_processing_to_idle():
  68. return ProcessorState(name="idle", **action_int_processing_to_idle())
  69. else:
  70. return AtomicDEVS.intTransition(self)
  71. def extTransition(self, my_inputs):
  72. inputs = {k.getPortName(): v for k, v in my_inputs.iteritems()}
  73. def cond_ext_idle_to_processing():
  74. return True
  75. def action_ext_idle_to_processing():
  76. return {"job": inputs['p_in'][0]}
  77. if self.state.name == "idle" and cond_ext_idle_to_processing():
  78. return ProcessorState(name="processing", **action_ext_idle_to_processing())
  79. else:
  80. return AtomicDEVS.extTransition(self, my_inputs)
  81. def confTransition(self, my_inputs):
  82. inputs = {k.getPortName(): v for k, v in my_inputs.iteritems()}
  83. return AtomicDEVS.confTransition(self, my_inputs)
  84. class Collector(AtomicDEVS):
  85. def __init__(self, name="Collector"):
  86. AtomicDEVS.__init__(self, name)
  87. self.state = CollectorState(name="waiting", nr_of_jobs=0)
  88. self.my_ports = {"p_in": self.addInPort("p_in")}
  89. def timeAdvance(self):
  90. if self.state.name == "waiting":
  91. return INFINITY
  92. def outputFnc(self):
  93. if self.state.name == "waiting":
  94. return {}
  95. def intTransition(self):
  96. return AtomicDEVS.intTransition(self)
  97. def extTransition(self, my_inputs):
  98. inputs = {k.getPortName(): v for k, v in my_inputs.iteritems()}
  99. def cond_ext_waiting_to_waiting():
  100. return True
  101. def action_ext_waiting_to_waiting():
  102. return {"nr_of_jobs": self.state.nr_of_jobs + 1}
  103. if self.state.name == "waiting" and cond_ext_waiting_to_waiting():
  104. return CollectorState(name="waiting", **action_ext_waiting_to_waiting())
  105. else:
  106. return AtomicDEVS.extTransition(self, my_inputs)
  107. def confTransition(self, my_inputs):
  108. inputs = {k.getPortName(): v for k, v in my_inputs.iteritems()}
  109. return AtomicDEVS.confTransition(self, my_inputs)
  110. class CoupledProcessor(CoupledDEVS):
  111. def __init__(self, name="CoupledProcessor"):
  112. CoupledDEVS.__init__(self, name)
  113. self.my_ports = {"p_in": self.addInPort("p_in"), "p_out": self.addOutPort("p_out")}
  114. self.submodels = {}
  115. self.submodels["p1"] = self.addSubModel(Processor(name="p1"))
  116. self.submodels["p2"] = self.addSubModel(Processor(name="p2"))
  117. self.connectPorts(self.my_ports["p_in"], self.submodels["p1"].my_ports["p_in"])
  118. self.connectPorts(self.submodels["p1"].my_ports["p_out"], self.submodels["p2"].my_ports["p_in"])
  119. self.connectPorts(self.submodels["p2"].my_ports["p_out"], self.my_ports["p_out"])
  120. class Root(CoupledDEVS):
  121. def __init__(self, name="Root"):
  122. CoupledDEVS.__init__(self, name)
  123. self.my_ports = {}
  124. self.submodels = {}
  125. self.submodels["g"] = self.addSubModel(Generator(name="g"))
  126. self.submodels["cp"] = self.addSubModel(CoupledProcessor(name="cp"))
  127. self.submodels["p"] = self.addSubModel(Processor(name="p"))
  128. self.submodels["c"] = self.addSubModel(Collector(name="c"))
  129. self.connectPorts(self.submodels["g"].my_ports["p_out"], self.submodels["cp"].my_ports["p_in"])
  130. self.connectPorts(self.submodels["cp"].my_ports["p_out"], self.submodels["p"].my_ports["p_in"])
  131. self.connectPorts(self.submodels["p"].my_ports["p_out"], self.submodels["c"].my_ports["p_in"])