generator.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. from pypdevs.DEVS import AtomicDEVS
  2. from job import Job
  3. import random
  4. # Define the state of the generator as a structured object
  5. class GeneratorState:
  6. def __init__(self, gen_num, seed=0):
  7. # Current simulation time (statistics)
  8. self.current_time = 0.0
  9. # Remaining time until generation of new event
  10. self.remaining = 0.0
  11. # Counter on how many events to generate still
  12. self.to_generate = gen_num
  13. # State of our random number generator
  14. self.random = random.Random(seed)
  15. class Generator(AtomicDEVS):
  16. def __init__(self, gen_param, size_param, gen_num):
  17. AtomicDEVS.__init__(self, "Generator")
  18. # Output port for the event
  19. self.out_event = self.addOutPort("out_event")
  20. # Define the state
  21. self.state = GeneratorState(gen_num)
  22. # Parameters defining the generator's behaviour
  23. self.gen_param = gen_param
  24. self.size_param = size_param
  25. def intTransition(self):
  26. # Update simulation time
  27. self.state.current_time += self.timeAdvance()
  28. # Update number of generated events
  29. self.state.to_generate -= 1
  30. if self.state.to_generate == 0:
  31. # Already generated enough events, so stop
  32. self.state.remaining = float('inf')
  33. else:
  34. # Still have to generate events, so sample for new duration
  35. self.state.remaining = self.state.random.expovariate(self.gen_param)
  36. return self.state
  37. def timeAdvance(self):
  38. # Return remaining time; infinity when generated enough
  39. return self.state.remaining
  40. def outputFnc(self):
  41. # Determine size of the event to generate
  42. size = max(1, int(self.state.random.gauss(self.size_param, 5)))
  43. # Calculate current time (note the addition!)
  44. creation = self.state.current_time + self.state.remaining
  45. # Output the new event on the output port
  46. return {self.out_event: Job(size, creation)}