class RecGeneral: def __init__(self, n, delta): delta_filter = delta / 2.0 delta_decode = delta / 2.0 self.s = 3 * (1 - int(math.ceil(math.log(delta_filter, 2)))) self.k = (1 + int(math.ceil(math.log(n)))) # print "RecGeneral({0})".format(self.k) self.n = n self.h = HashK(n**3, self.s) self.sketch = [ RecS(self.n, self.s, delta_decode) for i in xrange(self.k) ] def copy(self): result = RecGeneral(self.n, 1.0) result.s = self.s result.k = self.k result.n = self.n result.h = self.h result.sketch = [self.sketch[i].copy() for i in xrange(self.k)] return result def update(self, ind, val): for i in xrange(self.k): if self.h.at(ind) % (2**i) == 0: self.sketch[i].update(ind, val) def sample(self): for i in xrange(self.k): result = self.sketch[self.k - 1 - i].recover() if len(result) > 0: ind = random.choice(result.keys()) return ind, result[ind] return 0, 0 def sum(self, rhs): result = self.copy() result.sketch = [ self.sketch[i].sum(rhs.sketch[i]) for i in xrange(rhs.k) ] return result
class RecGeneral: def __init__(self, n, delta): delta_filter = delta / 2.0 delta_decode = delta / 2.0 self.s = 3 * (1 - int(math.ceil(math.log(delta_filter, 2)))) self.k = (1 + int(math.ceil(math.log(n)))) # print "RecGeneral({0})".format(self.k) self.n = n self.h = HashK(n**3, self.s) self.sketch = [RecS(self.n, self.s, delta_decode) for i in xrange(self.k)] def copy(self): result = RecGeneral(self.n, 1.0) result.s = self.s result.k = self.k result.n = self.n result.h = self.h result.sketch = [self.sketch[i].copy() for i in xrange(self.k)] return result def update(self, ind, val): for i in xrange(self.k): if self.h.at(ind) % (2**i) == 0: self.sketch[i].update(ind, val) def sample(self): for i in xrange(self.k): result = self.sketch[self.k - 1 - i].recover() if len(result) > 0: ind = random.choice(result.keys()) return ind, result[ind] return 0, 0 def sum(self, rhs): result = self.copy() result.sketch = [self.sketch[i].sum(rhs.sketch[i]) for i in xrange(rhs.k)] return result