| 30 | |
| 31 | |
| 32 | class Log2Bucket: |
| 33 | def __init__(self, start): |
| 34 | self.start = int(log(start, 2)) - 1 |
| 35 | |
| 36 | def value_to_bucket(self, value): |
| 37 | index = int(log(value, 2)) |
| 38 | index -= self.start |
| 39 | if index < 0: |
| 40 | index = 0 |
| 41 | return index |
| 42 | |
| 43 | def bucket_to_range(self, bucket): |
| 44 | if bucket == 0: |
| 45 | return (0, 2 ** (self.start + 1)) |
| 46 | bucket += self.start |
| 47 | return (2 ** bucket, 2 ** (bucket + 1)) |
| 48 | |
| 49 | |
| 50 | class Histogram: |