def add_car(self, lane: "AbstractLane"): direction = 'upstream' if lane.upstream else 'downstream' if self.queues[direction][lane.index] > 0: self.queues[direction][lane.index] += 1 else: fwd = self.first_car_on_lane(lane) speed = lane.speed_limit if fwd: gap = fwd.s_path if gap < MIN_INSERTION_GAP: self.queues[direction][lane.index] += 1 return else: speed = IDM.calc_max_initial_speed(gap, fwd.speed, lane.speed_limit) car = Car.make_on_lane(road=self, lane=lane, speed=speed) self.cars.add(car) if lane.upstream: self.upstream_cars.add(car) else: self.downstream_cars.add(car)
def inflow(self): for direction, lane_indexes in self.queues.items(): for lane_index, queue_count in lane_indexes.items(): if queue_count > 0: lane = self.network.get_lane(lane_index) fwd = self.first_car_on_lane(lane) speed = lane.speed_limit if fwd is not None: gap = fwd.s_path if gap < MIN_INSERTION_GAP: continue speed = IDM.calc_max_initial_speed( gap, fwd.speed, lane.speed_limit) car = Car.make_on_lane(road=self, lane=lane, speed=speed) self.cars.add(car) if lane.upstream: self.upstream_cars.add(car) else: self.downstream_cars.add(car) self.queues[direction][lane_index] -= 1