亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? piecepicker.py

?? BitTorrentABC-Linux-V.2.4.3源碼
?? PY
字號:
# Written by Bram Cohen
# see LICENSE.txt for license information

from random import randrange, shuffle, choice
from time import time
true = 1
false = 0

class PiecePicker:
    def __init__(self, numpieces, rarest_first_cutoff = 1, rarest_first_priority_cutoff = 3):
        self.rarest_first_cutoff = rarest_first_cutoff
        self.rarest_first_priority_cutoff = rarest_first_priority_cutoff
        self.numpieces = numpieces
        self.interests = [range(numpieces)]
        shuffle(self.interests[0])
        self.pos_in_interests = [0] * numpieces
        for i in xrange(numpieces):
            self.pos_in_interests[self.interests[0][i]] = i
        self.seed_interests = [[]]
        self.seed_pos_in_interests = []
        for i in xrange(numpieces):
            self.seed_interests[0].append(self.interests[0][i])
            self.seed_pos_in_interests.append(self.pos_in_interests[i])
#        self.numinterests = [0] * numpieces
        self.started = []
        self.totalcount = 0
        self.numhaves = [0] * numpieces
        self.seed_numhaves = [0] * numpieces
        self.crosscount = [numpieces]
        self.crosscount2 = [numpieces]
        self.has = [0] * numpieces
        self.numgot = 0
        self.done = false
        self.scrambled = range(numpieces)
        shuffle(self.scrambled)
        self.seed_connections = {}
        self.seed_got_haves = [0] * numpieces
        self.seed_time = None
        self.seeds_seen_recently = 0

    def got_have(self, piece):
        self.totalcount+=1
        numint = self.numhaves[piece]
        self.crosscount[numint] -= 1
        self.crosscount2[numint+self.has[piece]] -= 1
        self.numhaves[piece] += 1
        if numint+1==len(self.crosscount):
            self.crosscount.append(0)
        if numint+1+self.has[piece] == len(self.crosscount2):
            self.crosscount2.append(0)
        self.crosscount[numint+1] += 1
        self.crosscount2[numint+1+self.has[piece]] += 1
        seedint = self.seed_numhaves[piece]
        self.seed_numhaves[piece] += 1
        if seedint == len(self.seed_interests) - 1:
            self.seed_interests.append([])
        self._shift_over(piece,
                    self.seed_interests[seedint], self.seed_interests[seedint + 1],
                    self.seed_pos_in_interests)
#        print 'got have for '+str(piece)
        self.seed_got_haves[piece] += 1
        if self.has[piece]:
            return
        if numint == len(self.interests) - 1:
            self.interests.append([])
        self._shift_over(piece, self.interests[numint], self.interests[numint + 1])

    def lost_have(self, piece):
        self.totalcount-=1
        numint = self.numhaves[piece]
        self.crosscount[numint] -= 1
        self.crosscount2[numint+self.has[piece]] -= 1
        self.numhaves[piece]-=1
        self.crosscount[numint-1] += 1
        self.crosscount2[numint-1+self.has[piece]] += 1
        seedint = self.seed_numhaves[piece]
        self.seed_numhaves[piece]-=1
        self._shift_over(piece,
                    self.seed_interests[seedint], self.seed_interests[seedint - 1],
                    self.seed_pos_in_interests)
        if self.has[piece]:
            return
        self._shift_over(piece, self.interests[numint], self.interests[numint - 1])

    def _shift_over(self, piece, l1, l2, parray = None):
        if parray is None:
            parray = self.pos_in_interests
        p = parray[piece]
        l1[p] = l1[-1]
        parray[l1[-1]] = p
        del l1[-1]
        newp = randrange(len(l2) + 1)
        if newp == len(l2):
            parray[piece] = len(l2)
            l2.append(piece)
        else:
            old = l2[newp]
            parray[old] = len(l2)
            l2.append(old)
            l2[newp] = piece
            parray[piece] = newp

    def requested(self, piece):
        if piece not in self.started:
            self.started.append(piece)

    def complete(self, piece):
        assert not self.has[piece]
        self.has[piece] = 1
        self.crosscount2[self.numhaves[piece]] -= 1
        if self.numhaves[piece]+1==len(self.crosscount2):
            self.crosscount2.append(0)
        self.crosscount2[self.numhaves[piece]+1]+=1
        self.numgot += 1
        if self.numgot == self.numpieces:
            self.done = true
        l = self.interests[self.numhaves[piece]]
        p = self.pos_in_interests[piece]
        l[p] = l[-1]
        self.pos_in_interests[l[-1]] = p
        del l[-1]
#        self.numinterests[piece] = None
        try:
            self.started.remove(piece)
        except ValueError:
            pass

    def next(self, havefunc):
        bests = None
        bestnum = 2 ** 30
        for i in self.started:
            if havefunc(i):
                if self.numhaves[i] < bestnum:
                    bests = [i]
                    bestnum = self.numhaves[i]
                elif self.numhaves[i] == bestnum:
                    bests.append(i)
        if self.numgot < self.rarest_first_cutoff and bests:
            return choice(bests)
        for i in xrange(0, min(bestnum, len(self.interests))):
            if bests and i >= self.rarest_first_priority_cutoff:
                break
            for j in self.interests[i]:
                if havefunc(j):
                    return j
        if bests:
            return choice(bests)
        return None

    def am_I_complete(self):
        return self.done
    
    def bump(self, piece):
        l = self.interests[self.numhaves[piece]]
        pos = self.pos_in_interests[piece]
        del l[pos]
        l.append(piece)
        for i in range(pos,len(l)):
            self.pos_in_interests[l[i]] = i


    def next_have(self, connection, looser_upload):
        if self.seed_time is None:
            self.seed_time = time()
        if time() < self.seed_time+10:  # wait 10 seconds after seeing the first peers
            return None                 # to give time to grab have lists
        if not connection.upload.super_seeding:
            return None
        if connection in self.seed_connections:
            if looser_upload:
                num = 1     # send a new have even if it hasn't spread that piece elsewhere
            else:
                num = 2
            if self.seed_got_haves[self.seed_connections[connection]] < num:
                return None
            if not connection.upload.was_ever_interested:   # it never downloaded it?
                connection.upload.skipped_count += 1
                if connection.upload.skipped_count >= 3:    # probably another stealthed seed
                    return -1                               # signal to close it
#            print connection.get_ip()+' sent '+str(self.seed_connections[connection])+' fine,'
        best = []
        bestnum = 2 ** 30
        for tier in self.seed_interests:
            for piece in tier:
                if not connection.download.have[piece]:
                    seedint = self.seed_numhaves[piece]
                    self.seed_numhaves[piece] += 1  # tweak it up one, so you don't duplicate effort
                    if seedint == len(self.seed_interests) - 1:
                        self.seed_interests.append([])
                    self._shift_over(piece,
                                self.seed_interests[seedint], self.seed_interests[seedint + 1],
                                self.seed_pos_in_interests)
                    self.seed_got_haves[piece] = 0       # reset this
                    self.seed_connections[connection] = piece
                    connection.upload.seed_have_list.append(piece)
#                    print 'sending '+connection.get_ip()+' a have for '+str(piece)
                    return piece
        return -1       # something screwy; terminate connection

    def lost_peer(self, connection):
        try:
            del self.seed_connections[connection]
        except:
            pass




def test_requested():
    p = PiecePicker(9)
    p.complete(8)
    p.got_have(0)
    p.got_have(2)
    p.got_have(4)
    p.got_have(6)
    p.requested(1)
    p.requested(1)
    p.requested(3)
    p.requested(0)
    p.requested(6)
    v = _pull(p)
    assert v[:2] == [1, 3] or v[:2] == [3, 1]
    assert v[2:4] == [0, 6] or v[2:4] == [6, 0]
    assert v[4:] == [2, 4] or v[4:] == [4, 2]

def test_change_interest():
    p = PiecePicker(9)
    p.complete(8)
    p.got_have(0)
    p.got_have(2)
    p.got_have(4)
    p.got_have(6)
    p.lost_have(2)
    p.lost_have(6)
    v = _pull(p)
    assert v == [0, 4] or v == [4, 0]

def test_change_interest2():
    p = PiecePicker(9)
    p.complete(8)
    p.got_have(0)
    p.got_have(2)
    p.got_have(4)
    p.got_have(6)
    p.lost_have(2)
    p.lost_have(6)
    v = _pull(p)
    assert v == [0, 4] or v == [4, 0]

def test_complete():
    p = PiecePicker(1)
    p.got_have(0)
    p.complete(0)
    assert _pull(p) == []
    p.got_have(0)
    p.lost_have(0)

def test_rarest_first_takes_priority():
    p = PiecePicker(3)
    p.complete(2)
    p.requested(0)
    p.got_have(1)
    p.got_have(0)
    p.got_have(0)
    assert _pull(p) == [1, 0]

def test_rarer_in_started_takes_priority():
    p = PiecePicker(3)
    p.complete(2)
    p.requested(0)
    p.requested(1)
    p.got_have(1)
    p.got_have(0)
    p.got_have(0)
    assert _pull(p) == [1, 0]

def test_zero():
    assert _pull(PiecePicker(0)) == []

def _pull(pp):
    r = []
    def want(p, r = r):
        return p not in r
    while true:
        n = pp.next(want)
        if n is None:
            break
        r.append(n)
    return r

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
波多野结衣一区二区三区| 蜜桃一区二区三区四区| 久久久777精品电影网影网| 国产成人av电影在线| 亚洲国产视频a| 久久久www成人免费毛片麻豆| 97久久超碰国产精品| 捆绑紧缚一区二区三区视频| 中文字幕视频一区二区三区久| 欧美精品v国产精品v日韩精品 | 一本大道久久a久久精二百| 看电视剧不卡顿的网站| 亚洲女人****多毛耸耸8| 久久综合久久99| 欧美麻豆精品久久久久久| 99精品视频在线观看| 国产一区二区三区免费观看| 丝袜美腿成人在线| 亚洲人吸女人奶水| 国产女人18毛片水真多成人如厕| 91精品国产色综合久久ai换脸 | 亚洲电影你懂得| 中文字幕一区二区三区视频| 久久只精品国产| 制服丝袜国产精品| 欧美午夜精品一区二区蜜桃| 波多野结衣在线一区| 国产中文字幕一区| 免费在线看成人av| 亚洲第一综合色| 一区二区在线电影| 亚洲欧美在线高清| 国产精品欧美一区二区三区| 国产午夜精品久久久久久久 | 欧美精品一区二区三| 7777精品伊人久久久大香线蕉经典版下载| 99久久精品免费| 国产69精品久久777的优势| 99久久国产综合精品女不卡| 国产一区二区免费看| 激情综合色综合久久综合| 日本aⅴ精品一区二区三区| 五月天中文字幕一区二区| 亚洲电影你懂得| 亚洲成av人片一区二区三区| 亚洲午夜三级在线| 亚洲永久精品国产| 亚洲一区二区三区美女| 亚洲精品免费在线| 伊人色综合久久天天| 亚洲第一搞黄网站| 婷婷综合久久一区二区三区| 天堂va蜜桃一区二区三区| 日韩国产一区二| 美女一区二区视频| 国产原创一区二区三区| 国产麻豆视频精品| 成人中文字幕合集| 91原创在线视频| 91久久免费观看| 欧美无人高清视频在线观看| 欧美精品在线一区二区三区| 欧美一区二区三区白人| 日韩午夜小视频| 国产精一品亚洲二区在线视频| 亚洲欧美在线观看| 一区二区三区四区中文字幕| 亚洲成av人片一区二区三区| 首页亚洲欧美制服丝腿| 久草这里只有精品视频| 大桥未久av一区二区三区中文| 不卡电影免费在线播放一区| 欧美亚洲综合在线| 欧美成人精品高清在线播放| 久久精品夜夜夜夜久久| 中文字幕中文字幕在线一区 | 亚洲福中文字幕伊人影院| 婷婷综合久久一区二区三区| 极品瑜伽女神91| 91麻豆.com| 1024成人网色www| 一区二区免费在线播放| 久久99精品久久久久久动态图| 成人影视亚洲图片在线| 在线视频一区二区三| 欧美不卡一区二区三区四区| 国产精品妹子av| 日韩福利视频导航| 国产成人99久久亚洲综合精品| 在线观看一区二区视频| 精品第一国产综合精品aⅴ| 1024成人网| 麻豆精品视频在线观看免费| 99精品视频在线观看| 欧美成人a视频| 玉米视频成人免费看| 国产一区美女在线| 欧美日韩一区 二区 三区 久久精品| 日韩三级在线免费观看| 亚洲精品少妇30p| 激情五月激情综合网| 色婷婷综合久色| 久久久三级国产网站| 五月婷婷另类国产| a在线欧美一区| 精品剧情在线观看| 亚洲一区二区三区四区五区黄| 国产乱理伦片在线观看夜一区| 欧美人与性动xxxx| 亚洲欧洲美洲综合色网| 国产一区中文字幕| 欧美精品高清视频| 一区二区三区精品视频在线| 国产91色综合久久免费分享| 欧美一区二区三区在线电影| 亚洲精品中文字幕乱码三区| 国产成a人无v码亚洲福利| 在线播放欧美女士性生活| 国产精品不卡在线| 国产黑丝在线一区二区三区| 老司机免费视频一区二区| 成人国产精品免费观看| 2021久久国产精品不只是精品| 亚洲国产精品久久不卡毛片| 成人av高清在线| 久久久蜜桃精品| 色系网站成人免费| 亚洲国产高清在线| 国产一区视频在线看| 欧美一区二区视频在线观看2022 | 国产精品久久久久四虎| 国产高清不卡二三区| 精品国产区一区| 另类的小说在线视频另类成人小视频在线 | 国产老肥熟一区二区三区| 日韩亚洲欧美中文三级| 丝瓜av网站精品一区二区| 91成人免费网站| 一区二区三区四区在线播放| 91在线精品秘密一区二区| 国产精品久久久一本精品| 成人白浆超碰人人人人| 国产精品色哟哟| www.欧美亚洲| 亚洲欧美另类综合偷拍| 91一区一区三区| 一区二区三区四区在线| 欧美亚洲尤物久久| 亚洲一区二区三区免费视频| 欧美日韩在线播放三区四区| 亚洲国产aⅴ天堂久久| 欧美电影一区二区三区| 蜜桃久久久久久| 欧美精品一区二区三区高清aⅴ | 99精品久久久久久| 综合网在线视频| 欧美综合久久久| 天天影视涩香欲综合网| 日韩精品专区在线| 国内不卡的二区三区中文字幕| 国产人成一区二区三区影院| 成人午夜激情影院| 亚洲猫色日本管| 欧美高清激情brazzers| 精品一二三四区| 国产区在线观看成人精品| 91在线porny国产在线看| 亚洲一区二区三区不卡国产欧美| 欧美精品久久久久久久多人混战 | 色综合欧美在线| 性欧美大战久久久久久久久| www国产亚洲精品久久麻豆| 国产xxx精品视频大全| 亚洲黄色性网站| 日韩亚洲欧美在线观看| 国产精品2024| 一区二区三区四区在线播放 | 韩国成人精品a∨在线观看| 国产日韩精品视频一区| 色狠狠av一区二区三区| 亚洲福利视频三区| 久久先锋资源网| 色999日韩国产欧美一区二区| 日本中文字幕一区二区有限公司| 国产亚洲女人久久久久毛片| 色香色香欲天天天影视综合网| 日本91福利区| 最新中文字幕一区二区三区| 91麻豆精品国产91久久久久久| 色综合久久综合中文综合网| 亚洲美女偷拍久久| 欧美一区二区三区四区高清 | 色婷婷久久一区二区三区麻豆| 蜜芽一区二区三区| 最新国产精品久久精品| 欧美成人一区二区| 色婷婷av久久久久久久| 国产一区二区精品久久91| 亚洲五月六月丁香激情| 国产亚洲精品7777|