1 from p2pool.util import math
4 def finalize(self, sol):
13 def forget_item(self, item):
14 self.skips.pop(item, None)
16 def __call__(self, start, *args, **kwargs):
19 sol = self.initial_solution(start, args)
20 if self.judge(sol, args) == 0:
21 return self.finalize(sol)
23 if pos not in self.skips:
24 self.skips[pos] = math.geometric(self.P), [(self.previous(pos), self.get_delta(pos))]
25 skip_length, skip = self.skips[pos]
27 # fill previous updates
28 for i in xrange(skip_length):
30 that_hash, delta = updates.pop(i)
31 x, y = self.skips[that_hash]
33 y.append((pos, delta))
35 # put desired skip nodes in updates
36 for i in xrange(len(skip), skip_length):
37 updates[i] = pos, None
39 #if skip_length + 1 in updates:
40 # updates[skip_length + 1] = self.combine(updates[skip_length + 1], updates[skip_length])
42 for jump, delta in reversed(skip):
43 sol_if = self.apply_delta(sol, delta, args)
44 decision = self.judge(sol_if, args)
45 #print pos, sol, jump, delta, sol_if, decision
47 return self.finalize(sol_if)
52 raise AssertionError()
57 # XXX could be better by combining updates
59 updates[x] = updates[x][0], self.combine_deltas(updates[x][1], delta) if updates[x][1] is not None else delta
64 class NotSkipList(Base):
65 def __call__(self, start, *args):
67 sol = self.initial_solution(start, args)
69 decision = self.judge(sol, args)
71 raise AssertionError()
73 return self.finalize(sol)
75 delta = self.get_delta(pos)
76 sol = self.apply_delta(sol, delta, args)
78 pos = self.previous(pos)