1 from p2pool.util import math, memoize
3 class SkipList(object):
4 def __init__(self, p=0.5):
9 def forget_item(self, item):
10 self.skips.pop(item, None)
12 @memoize.memoize_with_backing(memoize.LRUDict(5))
13 def __call__(self, start, *args):
16 sol = self.initial_solution(start, args)
17 if self.judge(sol, args) == 0:
18 return self.finalize(sol, args)
20 if pos not in self.skips:
21 self.skips[pos] = math.geometric(self.p), [(self.previous(pos), self.get_delta(pos))]
22 skip_length, skip = self.skips[pos]
24 # fill previous updates
25 for i in xrange(skip_length):
27 that_hash, delta = updates.pop(i)
28 x, y = self.skips[that_hash]
30 y.append((pos, delta))
32 # put desired skip nodes in updates
33 for i in xrange(len(skip), skip_length):
34 updates[i] = pos, None
36 #if skip_length + 1 in updates:
37 # updates[skip_length + 1] = self.combine(updates[skip_length + 1], updates[skip_length])
39 for jump, delta in reversed(skip):
40 sol_if = self.apply_delta(sol, delta, args)
41 decision = self.judge(sol_if, args)
42 #print pos, sol, jump, delta, sol_if, decision
44 return self.finalize(sol_if, args)
49 raise AssertionError()
54 # XXX could be better by combining updates
56 updates[x] = updates[x][0], self.combine_deltas(updates[x][1], delta) if updates[x][1] is not None else delta
58 def finalize(self, sol, args):