model.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import sys
  2. sys.path.append("../../src/")
  3. from infinity import INFINITY
  4. from simulator import Simulator
  5. from DEVS import *
  6. import random
  7. class Event:
  8. def __init__(self, eventSize):
  9. self.eventSize = eventSize
  10. def copy(self):
  11. return Event(self.eventSize)
  12. class ProcessorState:
  13. def __init__(self):
  14. self.event1_counter = INFINITY
  15. self.event1 = None
  16. self.queue = []
  17. class Processor(AtomicDEVS):
  18. def __init__(self, name, randomta):
  19. AtomicDEVS.__init__(self, name)
  20. self.recv_event1 = self.addInPort("in_event1")
  21. self.send_event1 = self.addOutPort("out_event1")
  22. self.state = ProcessorState()
  23. self.randomta = randomta
  24. def timeAdvance(self):
  25. return self.state.event1_counter
  26. def intTransition(self):
  27. self.state.event1_counter -= self.timeAdvance()
  28. if self.state.event1_counter == 0 and self.state.queue == []:
  29. self.state.event1_counter = INFINITY
  30. self.state.event1 = None
  31. else:
  32. self.state.event1 = self.state.queue.pop()
  33. self.state.event1_counter = round(random.uniform(0.75, 1.25), 4) if self.randomta else 1.0
  34. return self.state
  35. def extTransition(self, inputs):
  36. self.state.event1_counter -= self.elapsed
  37. #Only one element, so exploit this
  38. ev1 = inputs[self.recv_event1][0]
  39. if self.state.event1 is not None:
  40. self.state.queue.append(ev1)
  41. else:
  42. self.state.event1 = ev1
  43. self.state.event1_counter = round(random.uniform(0.75, 1.25), 4) if self.randomta else 1.0
  44. return self.state
  45. def outputFnc(self):
  46. return {self.send_event1: [self.state.event1]}
  47. class Generator(AtomicDEVS):
  48. def __init__(self):
  49. AtomicDEVS.__init__(self, "Generator")
  50. self.state = "gen_event1"
  51. self.send_event1 = self.addOutPort("out_event1")
  52. def timeAdvance(self):
  53. return 1
  54. def intTransition(self):
  55. return self.state
  56. def outputFnc(self):
  57. return {self.send_event1: [Event(1)]}
  58. class CoupledRecursion(CoupledDEVS):
  59. def __init__(self, width, depth, randomta):
  60. CoupledDEVS.__init__(self, "Coupled" + str(depth))
  61. self.recv_event1 = self.addInPort("in_event1")
  62. self.send_event1 = self.addOutPort("out_event1")
  63. if depth > 1:
  64. self.recurse = self.addSubModel(CoupledRecursion(width, depth-1, randomta))
  65. self.connectPorts(self.recv_event1, self.recurse.recv_event1)
  66. for i in range(width):
  67. processor = self.addSubModel(Processor("Processor%s_%s" % (depth, i), randomta))
  68. if i == 0:
  69. if depth > 1:
  70. self.connectPorts(self.recurse.send_event1, processor.recv_event1)
  71. else:
  72. self.connectPorts(self.recv_event1, processor.recv_event1)
  73. else:
  74. self.connectPorts(prev.send_event1, processor.recv_event1)
  75. prev = processor
  76. self.connectPorts(prev.send_event1, self.send_event1)
  77. class DEVStone(CoupledDEVS):
  78. def __init__(self, width, depth, randomta):
  79. random.seed(1)
  80. CoupledDEVS.__init__(self, "DEVStone")
  81. self.generator = self.addSubModel(Generator())
  82. self.recurse = self.addSubModel(CoupledRecursion(width, depth, randomta))
  83. self.connectPorts(self.generator.send_event1, self.recurse.recv_event1)