1 from p2pool.util import math, expiring_dict, memoize
4 def finalize(self, sol):
11 self.skips = expiring_dict.ExpiringDict(600)
13 @memoize.memoize_with_backing(expiring_dict.ExpiringDict(5))
14 def __call__(self, start, *args, **kwargs):
17 sol = self.initial_solution(start, args)
18 if self.judge(sol, args) == 0:
19 return self.finalize(sol)
21 if pos not in self.skips:
22 self.skips[pos] = math.geometric(self.P), [(self.previous(pos), self.get_delta(pos))]
23 skip_length, skip = self.skips[pos]
25 # fill previous updates
26 for i in xrange(skip_length):
28 that_hash, delta = updates.pop(i)
29 x, y = self.skips[that_hash]
31 y.append((pos, delta))
33 # put desired skip nodes in updates
34 for i in xrange(len(skip), skip_length):
35 updates[i] = pos, None
37 #if skip_length + 1 in updates:
38 # updates[skip_length + 1] = self.combine(updates[skip_length + 1], updates[skip_length])
40 for jump, delta in reversed(skip):
41 sol_if = self.apply_delta(sol, delta, args)
42 decision = self.judge(sol_if, args)
43 #print pos, sol, jump, delta, sol_if, decision
45 return self.finalize(sol_if)
50 raise AssertionError()
55 # XXX could be better by combining updates
57 updates[x] = updates[x][0], self.combine_deltas(updates[x][1], delta) if updates[x][1] is not None else delta
62 class NotSkipList(Base):
63 def __call__(self, start, *args):
65 sol = self.initial_solution(start, args)
67 decision = self.judge(sol, args)
69 raise AssertionError()
71 return self.finalize(sol)
73 delta = self.get_delta(pos)
74 sol = self.apply_delta(sol, delta, args)
76 pos = self.previous(pos)