BlockScience / rideshare-model

0 stars 0 forks source link

Event Queue Handler #39

Open SeanMcOwen opened 3 days ago

SeanMcOwen commented 3 days ago

This should be done after some of the other wirings are first complete, but eventually we need a controller wiring that does the routing of an event to the wiring that it should take on. When we get here I can help out a bunch because there are a LOT of design considerations to work through first

SeanMcOwen commented 3 days ago

Relevant Code:

def initialize_event_queue(ride_requests) -> List[Event]:

  initial_events = []
  start_time_counter = Counter()

  for ride_id in ride_requests:
      start_time = random.randint(1, len(ride_requests))
      start_time_counter[start_time] += 1
      initial_events.append(Event(t=start_time, action="Request Ride", spaces={"ride_id": ride_id}))
  for _, count in list(start_time_counter.items()):
      if count > 10:
          start_time_counter[start_time] = 10

  heapq.heapify(initial_events)

  return initial_events

def process_events(event_queue, simulation): current_time = 0 retry_queue = deque()

  while event_queue or retry_queue:
      while event_queue and event_queue[0].t == current_time:
          current_event = heapq.heappop(event_queue)
          handle_event(current_event, event_queue, simulation, retry_queue, current_time)
      while retry_queue and retry_queue[0].t <= current_time:
          current_event = retry_queue.popleft()
          handle_event(current_event, event_queue, simulation, retry_queue, current_time)

      # Record the state at each time step
      simulation.record_state(current_time)
      print("State recorded")
      current_time += 1
      simulation.grid.update_priorities()

  print(f"The event queue is now empty. Simulation complete! Time: {current_time}")
  simulation.state_map.print_state_map()

def handle_event(event, event_queue, simulation, retry_queue, current_time): print(f"Processing event: {event} at time {current_time}")

  if event.action == "Request Ride":
      simulation.handle_ride_request_event(event, event_queue, current_time, retry_queue)
  elif event.action == "Driver Assigned":
      simulation.handle_driver_assigned_event(event, event_queue, current_time)
  elif event.action == "Complete Ride":
      simulation.handle_complete_ride_event(event, event_queue, current_time)
  else:
      print(f"Unknown event action: {event.action}")