home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / lib / python2.4 / site-packages / BitTorrent / PiecePicker.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-08-31  |  5.5 KB  |  218 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. from random import randrange, shuffle, choice
  5.  
  6. class PiecePicker:
  7.     
  8.     def __init__(self, numpieces, rarest_first_cutoff = 1):
  9.         self.rarest_first_cutoff = rarest_first_cutoff
  10.         self.numpieces = numpieces
  11.         self.interests = [
  12.             range(numpieces)]
  13.         self.pos_in_interests = range(numpieces)
  14.         self.numinterests = [
  15.             0] * numpieces
  16.         self.started = []
  17.         self.seedstarted = []
  18.         self.numgot = 0
  19.         self.scrambled = range(numpieces)
  20.         shuffle(self.scrambled)
  21.  
  22.     
  23.     def got_have(self, piece):
  24.         if self.numinterests[piece] is None:
  25.             return None
  26.         
  27.         numint = self.numinterests[piece]
  28.         if numint == len(self.interests) - 1:
  29.             self.interests.append([])
  30.         
  31.         self.numinterests[piece] += 1
  32.         self._shift_over(piece, self.interests[numint], self.interests[numint + 1])
  33.  
  34.     
  35.     def lost_have(self, piece):
  36.         if self.numinterests[piece] is None:
  37.             return None
  38.         
  39.         numint = self.numinterests[piece]
  40.         self.numinterests[piece] -= 1
  41.         self._shift_over(piece, self.interests[numint], self.interests[numint - 1])
  42.  
  43.     
  44.     def _shift_over(self, piece, l1, l2):
  45.         p = self.pos_in_interests[piece]
  46.         l1[p] = l1[-1]
  47.         self.pos_in_interests[l1[-1]] = p
  48.         del l1[-1]
  49.         newp = randrange(len(l2) + 1)
  50.         if newp == len(l2):
  51.             self.pos_in_interests[piece] = len(l2)
  52.             l2.append(piece)
  53.         else:
  54.             old = l2[newp]
  55.             self.pos_in_interests[old] = len(l2)
  56.             l2.append(old)
  57.             l2[newp] = piece
  58.             self.pos_in_interests[piece] = newp
  59.  
  60.     
  61.     def requested(self, piece, seed = False):
  62.         if piece not in self.started:
  63.             self.started.append(piece)
  64.         
  65.         if seed and piece not in self.seedstarted:
  66.             self.seedstarted.append(piece)
  67.         
  68.  
  69.     
  70.     def complete(self, piece):
  71.         self.numgot += 1
  72.         l = self.interests[self.numinterests[piece]]
  73.         p = self.pos_in_interests[piece]
  74.         l[p] = l[-1]
  75.         self.pos_in_interests[l[-1]] = p
  76.         del l[-1]
  77.         self.numinterests[piece] = None
  78.         
  79.         try:
  80.             self.started.remove(piece)
  81.             self.seedstarted.remove(piece)
  82.         except ValueError:
  83.             self
  84.             self
  85.         except:
  86.             self
  87.  
  88.  
  89.     
  90.     def next(self, havefunc, seed = False):
  91.         bests = None
  92.         bestnum = 2 ** 30
  93.         if seed:
  94.             s = self.seedstarted
  95.         else:
  96.             s = self.started
  97.         for i in s:
  98.             if havefunc(i):
  99.                 if self.numinterests[i] < bestnum:
  100.                     bests = [
  101.                         i]
  102.                     bestnum = self.numinterests[i]
  103.                 elif self.numinterests[i] == bestnum:
  104.                     bests.append(i)
  105.                 
  106.             self.numinterests[i] < bestnum
  107.         
  108.         if bests:
  109.             return choice(bests)
  110.         
  111.         if self.numgot < self.rarest_first_cutoff:
  112.             for i in self.scrambled:
  113.                 if havefunc(i):
  114.                     return i
  115.                     continue
  116.             
  117.             return None
  118.         
  119.         for i in xrange(1, min(bestnum, len(self.interests))):
  120.             for j in self.interests[i]:
  121.                 if havefunc(j):
  122.                     return j
  123.                     continue
  124.             
  125.         
  126.  
  127.     
  128.     def am_I_complete(self):
  129.         return self.numgot == self.numpieces
  130.  
  131.     
  132.     def bump(self, piece):
  133.         l = self.interests[self.numinterests[piece]]
  134.         pos = self.pos_in_interests[piece]
  135.         del l[pos]
  136.         l.append(piece)
  137.         for i in range(pos, len(l)):
  138.             self.pos_in_interests[l[i]] = i
  139.         
  140.  
  141.  
  142.  
  143. def test_requested():
  144.     p = PiecePicker(9)
  145.     p.complete(8)
  146.     p.got_have(0)
  147.     p.got_have(2)
  148.     p.got_have(4)
  149.     p.got_have(6)
  150.     p.requested(1)
  151.     p.requested(1)
  152.     p.requested(3)
  153.     p.requested(0)
  154.     p.requested(6)
  155.     v = _pull(p)
  156.  
  157.  
  158. def test_change_interest():
  159.     p = PiecePicker(9)
  160.     p.complete(8)
  161.     p.got_have(0)
  162.     p.got_have(2)
  163.     p.got_have(4)
  164.     p.got_have(6)
  165.     p.lost_have(2)
  166.     p.lost_have(6)
  167.     v = _pull(p)
  168.  
  169.  
  170. def test_change_interest2():
  171.     p = PiecePicker(9)
  172.     p.complete(8)
  173.     p.got_have(0)
  174.     p.got_have(2)
  175.     p.got_have(4)
  176.     p.got_have(6)
  177.     p.lost_have(2)
  178.     p.lost_have(6)
  179.     v = _pull(p)
  180.  
  181.  
  182. def test_complete():
  183.     p = PiecePicker(1)
  184.     p.got_have(0)
  185.     p.complete(0)
  186.     p.got_have(0)
  187.     p.lost_have(0)
  188.  
  189.  
  190. def test_rarer_in_started_takes_priority():
  191.     p = PiecePicker(3)
  192.     p.complete(2)
  193.     p.requested(0)
  194.     p.requested(1)
  195.     p.got_have(1)
  196.     p.got_have(0)
  197.     p.got_have(0)
  198.  
  199.  
  200. def test_zero():
  201.     pass
  202.  
  203.  
  204. def _pull(pp):
  205.     r = []
  206.     
  207.     def want(p, r = r):
  208.         return p not in r
  209.  
  210.     while True:
  211.         n = pp.next(want)
  212.         if n is None:
  213.             break
  214.         
  215.         r.append(n)
  216.     return r
  217.  
  218.