class Peer(visualizer.Peer): def __init__(self, *args): visualizer.Peer.__init__(self, *args) self.departure_position = None self.smoothed_branching_position = Smoother() self.segments = {} hue = random.uniform(0, 1) self.color = Vector3d(*(colorsys.hsv_to_rgb(hue, 0.35, 1))) def add_segment(self, segment): if self.departure_position is None: self.departure_position = segment.departure_position segment.peer = self segment.gathered = False self.segments[segment.id] = segment def update(self): for segment in self.segments.values(): if not segment.gathered and not segment.is_playing(): segment.f.gatherer.add(segment) segment.gathered = True outdated = filter(lambda segment_id: self.segments[segment_id].outdated(), self.segments) for segment_id in outdated: segment = self.segments[segment_id] del self.segments[segment_id] self.update_branching_position() def update_branching_position(self): if len(self.segments) == 0: self.smoothed_branching_position.reset() else: average_target_position = \ sum([segment.target_position() for segment in self.segments.values()]) / \ len(self.segments) new_branching_position = self.departure_position*0.4 + average_target_position*0.6 self.smoothed_branching_position.smooth( new_branching_position, self.visualizer.time_increment) def draw(self): if len(self.segments) > 0: for segment in self.segments.values(): segment.draw_playing() for segment in self.segments.values(): self.set_color(0) segment.draw_curve() def set_color(self, relative_age): if GREYSCALE: glColor3f(1 - CURVE_OPACITY, 1 - CURVE_OPACITY, 1 - CURVE_OPACITY) else: self.visualizer.set_color(self.color)
class Peer(visualizer.Peer): def __init__(self, *args): visualizer.Peer.__init__(self, *args) self.departure_position = None self.smoothed_branching_position = Smoother() self.segments = {} self.rightward = random.choice([True, False]) if self.rightward: x = 0 else: x = self.visualizer.width self.position = Vector2d( x, CURVE_MARGIN_Y * self.visualizer.height + \ random.uniform(0, (1-CURVE_MARGIN_Y*2) * self.visualizer.height)) def add_segment(self, segment): if self.departure_position is None: self.departure_position = segment.departure_position segment.peer = self segment.gathered = False self.segments[segment.id] = segment def update(self): for segment in self.segments.values(): if not segment.gathered and not segment.is_playing(): self.visualizer.gather(segment) segment.gathered = True outdated = filter(lambda segment_id: self.segments[segment_id].outdated(), self.segments) for segment_id in outdated: segment = self.segments[segment_id] del self.segments[segment_id] self.update_branching_position() def update_branching_position(self): if len(self.segments) == 0: self.smoothed_branching_position.reset() else: average_target_position = \ sum([segment.target_position() for segment in self.segments.values()]) / \ len(self.segments) new_branching_position = self.departure_position * RELATIVE_BRANCHING_POSITION \ + average_target_position * (1-RELATIVE_BRANCHING_POSITION) self.smoothed_branching_position.smooth( new_branching_position, self.visualizer.time_increment) def draw(self): if len(self.segments) > 0: for segment in self.segments.values(): segment.draw_playing()
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)