class SmoothingLimiter(OriginalLimiter): def __init__(self, priority, limit_rate_model, proxy_model): OriginalLimiter.__init__(self, priority, limit_rate_model, proxy_model) self.smooth_released = Smoother(2) self.smooth_rate_limit = Smoother(2) self.rate_set = False def update_rate(self, params): OriginalLimiter.update_rate(self, params) if not self.rate_set: self.rate_set = True self.smooth_rate_limit.reset(self.rate) else: self.smooth_rate_limit.set_total(params.time, self.rate) def update_limit(self, params): self.limit = 2.0 * (self.smooth_rate_limit.smooth_total(params.time) - self.smooth_released.smooth_rate(params.time)) def can_start(self, params): return params.num_started + params.count <= self.limit def update_budget(self, params): self.smooth_released.add_delta(params.time, params.num_started)