-from p2pool.util import math, expiring_dict, memoize
+from p2pool.util import math, memoize
-class Base(object):
- def finalize(self, sol):
- return sol
-
-class SkipList(Base):
- P = .5
+class SkipList(object):
+ def __init__(self, p=0.5):
+ self.p = p
+
+ self.skips = {}
- def __init__(self):
- self.skips = expiring_dict.ExpiringDict(600)
+ def forget_item(self, item):
+ self.skips.pop(item, None)
- @memoize.memoize_with_backing(expiring_dict.ExpiringDict(5))
- def __call__(self, start, *args, **kwargs):
+ @memoize.memoize_with_backing(memoize.LRUDict(5))
+ def __call__(self, start, *args):
updates = {}
pos = start
sol = self.initial_solution(start, args)
if self.judge(sol, args) == 0:
- return self.finalize(sol)
+ return self.finalize(sol, args)
while True:
if pos not in self.skips:
- self.skips[pos] = math.geometric(self.P), [(self.previous(pos), self.get_delta(pos))]
+ self.skips[pos] = math.geometric(self.p), [(self.previous(pos), self.get_delta(pos))]
skip_length, skip = self.skips[pos]
# fill previous updates
decision = self.judge(sol_if, args)
#print pos, sol, jump, delta, sol_if, decision
if decision == 0:
- return self.finalize(sol_if)
+ return self.finalize(sol_if, args)
elif decision < 0:
sol = sol_if
break
# XXX could be better by combining updates
for x in updates:
updates[x] = updates[x][0], self.combine_deltas(updates[x][1], delta) if updates[x][1] is not None else delta
-
-
- return item_hash
-
-class NotSkipList(Base):
- def __call__(self, start, *args):
- pos = start
- sol = self.initial_solution(start, args)
- while True:
- decision = self.judge(sol, args)
- if decision > 0:
- raise AssertionError()
- elif decision == 0:
- return self.finalize(sol)
-
- delta = self.get_delta(pos)
- sol = self.apply_delta(sol, delta, args)
-
- pos = self.previous(pos)
+
+ def finalize(self, sol, args):
+ return sol