1 # Written by Pawel Garbacki, George Milescu
2 # see LICENSE.txt for license information
5 from BaseLib.Core.BitTornado.clock import clock
11 def __init__(self, raw_server, rate_measure, max_rate, probing_period = 2):
12 self.raw_server = raw_server
13 self.rate_measure = rate_measure
15 self.max_rate = 2147483647
17 self.max_rate = max_rate
18 self.probing_period = probing_period # in seconds
20 class ExpSmoothRatePredictor(RatePredictor):
21 def __init__(self, raw_server, rate_measure, max_rate, alpha = 0.5, max_period = 30, probing_period = 2):
22 RatePredictor.__init__(self, raw_server, rate_measure, max_rate, probing_period)
23 if DEBUG: print >>sys.stderr, "RatePredictor:__init__"
25 self.max_period = max_period
30 if DEBUG: print >>sys.stderr, "RatePredictor:update"
31 self.raw_server.add_task(self.update, self.probing_period)
32 current_value = self.rate_measure.get_rate() / 1000.
33 current_time = clock()
34 if self.value is None or current_time - self.timestamp > self.max_period:
35 self.value = current_value
37 self.value = self.alpha * current_value + (1 - self.alpha) * self.value
38 if self.max_rate > 0 and self.value > self.max_rate:
39 self.value = self.max_rate
40 self.timestamp = current_time
42 # exponential smoothing prediction
44 if DEBUG: print >>sys.stderr, "RatePredictor:predict"
46 if self.value is None:
50 def has_capacity(self):
51 if DEBUG: print >>sys.stderr, "RatePredictor:has_capacity"
55 if self.value is None:
58 result = (1. - float(self.value) / self.max_rate) > MIN_CAPACITY