예제 #1
0
파일: fmsrutil.py 프로젝트: ialzuru/ncfs
def getStrongMDSPropertyDegree(repairNodeno, nativeBlockNum, parityBlockNum, checkNum, enc_matrix):
    '''Get strong MDS property degree.'''

    currentStrongMDSPropertyDegree = 0
    survivalcoeffvectorset = []
    flag = 0
    for i in range(parityBlockNum):
    #get coeff vectors of survival parity blocks
        if int(i/2)!= repairNodeno:
            survivalcoeffvectorset.append(CoeffVector(nativeBlockNum))
            for j in range(nativeBlockNum):
                survivalcoeffvectorset[i - flag*2].coeff_[j] = enc_matrix[i][j]
            survivalcoeffvectorset[i - flag*2].first()  
        else:
            flag =1

    s = 0
    for i in range(parityBlockNum-2):
        for j in range(parityBlockNum-2):
            if i<j:
                checkmatrix = CoeffMatrix(nativeBlockNum)
                for k in range (parityBlockNum-2):
                    if k!=i and k!=j:
                        checkmatrix.addcoeffvector(survivalcoeffvectorset[k].copy())
                if checkmatrix.rank_ == nativeBlockNum:
                    currentStrongMDSPropertyDegree += 1
                s += 1
    return currentStrongMDSPropertyDegree
예제 #2
0
def getStrongMDSPropertyDegree(repairNodeno, nativeBlockNum, parityBlockNum,
                               checkNum, enc_matrix):
    '''Get strong MDS property degree.'''

    currentStrongMDSPropertyDegree = 0
    survivalcoeffvectorset = []
    flag = 0
    for i in range(parityBlockNum):
        #get coeff vectors of survival parity blocks
        if int(i / 2) != repairNodeno:
            survivalcoeffvectorset.append(CoeffVector(nativeBlockNum))
            for j in range(nativeBlockNum):
                survivalcoeffvectorset[i -
                                       flag * 2].coeff_[j] = enc_matrix[i][j]
            survivalcoeffvectorset[i - flag * 2].first()
        else:
            flag = 1

    s = 0
    for i in range(parityBlockNum - 2):
        for j in range(parityBlockNum - 2):
            if i < j:
                checkmatrix = CoeffMatrix(nativeBlockNum)
                for k in range(parityBlockNum - 2):
                    if k != i and k != j:
                        checkmatrix.addcoeffvector(
                            survivalcoeffvectorset[k].copy())
                if checkmatrix.rank_ == nativeBlockNum:
                    currentStrongMDSPropertyDegree += 1
                s += 1
    return currentStrongMDSPropertyDegree
예제 #3
0
def checkMDS(MSR_n, MSR_k, enc_matrix):
    '''Check MDS property, for fmsr(k=n-2) only.'''
    '''Return a MDS property value.'''

    nativeBlockNum = getNativeBlockNum(MSR_n, MSR_k)
    parityBlockNum = getParityBlockNum(MSR_n, MSR_k)
    MDSpropery = True
    allcoeffvectors = []
    for i in range(parityBlockNum):
        allcoeffvectors.append(CoeffVector(nativeBlockNum))
        for j in range(nativeBlockNum):
            allcoeffvectors[i].coeff_[j] = enc_matrix[i][j]
        allcoeffvectors[i].first()
    permutation = int(MSR_n * (MSR_n - 1) / 2)
    #permutation of selecting n-2 nodes from n nodes
    checkmatrix = [CoeffMatrix(nativeBlockNum) for col in range(permutation)]
    s = 0
    for i in range(MSR_n):
        for j in range(MSR_n):
            if i < j:
                for b in range(MSR_n):
                    if b != i and b != j:
                        checkmatrix[s].addcoeffvector(
                            allcoeffvectors[b * 2].copy())
                        checkmatrix[s].addcoeffvector(
                            allcoeffvectors[b * 2 + 1].copy())
                if checkmatrix[s].rank_ != nativeBlockNum:
                    MDSpropery = False
                s += 1
    return MDSpropery
예제 #4
0
파일: fmsrutil.py 프로젝트: ialzuru/ncfs
def decode(n, k, src, blocknums, parityCoeff, dest, filesize, setting):
    '''Decode chunk files to dest file.'''

    ## special handling for 0B files
    if filesize <= 0:
        open(dest,'wb').close()
        return

    cv_temp=[]
    nativeBlockNum = getNativeBlockNum(n, k)
    parityBlockNum = getParityBlockNum(n, k)
    enc_matrix = [[GF256int(0) for col in range(nativeBlockNum)] for row in range(parityBlockNum)]
    dec_matrix = [[GF256int(0) for col in range(nativeBlockNum)] for row in range(nativeBlockNum)]
    rev_matrix = [[GF256int(0) for col in range(nativeBlockNum)] for row in range(nativeBlockNum)]
    gj_matrix = [[GF256int(0) for col in range(nativeBlockNum*2)] for row in range(nativeBlockNum)]

    ## generate the encoding matrix
    counter = 0
    for i in range(parityBlockNum):
        for j in range(nativeBlockNum):
            enc_matrix[i][j] = GF256int(parityCoeff[counter])
            counter += 1

    cm1 = CoeffMatrix(nativeBlockNum)
    for i in range(parityBlockNum):
        cv_temp.append(CoeffVector(nativeBlockNum))
        for j in range(nativeBlockNum):
            cv_temp[i].coeff_[j] = enc_matrix[i][j]
        cv_temp[i].first()
        cm1.addcoeffvector(cv_temp[i])

    ## generate the decoding matrix
    i=0
    for selectChunkNo in blocknums:
        for j in range(nativeBlockNum):
            dec_matrix[i][j]=enc_matrix[selectChunkNo][j]
        i += 1

    ## initialize the reverse matrix
    for i in range(nativeBlockNum):
        for j in range(nativeBlockNum):
            if j==i:
                rev_matrix[i][j]= GF256int(1)

    ## initialize the Gauss-Jordan matrix = [decoding,reverse]
    for i in range(nativeBlockNum):
        for j in range(nativeBlockNum*2):
            if j<nativeBlockNum:
                gj_matrix[i][j]= dec_matrix[i][j]
            else:
                gj_matrix[i][j]= rev_matrix[i][j-nativeBlockNum]

    reversematrix(n, k, gj_matrix)

    for i in range(nativeBlockNum):
        for j in range(nativeBlockNum):
            dec_matrix[i][j] = gj_matrix[i][j+nativeBlockNum]

    ##generate decode data chunks
    selectchunk=[]
    for filename in src:
        infile = open(filename,'rb')
        selectchunk.append(infile.read())
        infile.close()
    chunksize = os.path.getsize(src[0])
    indatalist = ''.join(selectchunk)

    ##rebuild the original chunks
    parityCoeff_temp = ''.join([chr(dec_matrix[i][j]) \
                                for i in range(nativeBlockNum) \
                                for j in range(nativeBlockNum)])
    outdatalist = codings.clibfmsr.clibfmsr.decodeComputation(indatalist, \
                           parityCoeff_temp, nativeBlockNum, chunksize)

    outfile = open(dest,'wb')
    writelen = 1048576
    writenext = 0
    for i in range(0,filesize-writelen,writelen):
        writenext = i+writelen
        outfile.write(outdatalist[i:writenext])
    outfile.write(outdatalist[writenext:filesize])
    outfile.close()
예제 #5
0
def decode(n, k, src, blocknums, parityCoeff, dest, filesize, setting):
    '''Decode chunk files to dest file.'''

    ## special handling for 0B files
    if filesize <= 0:
        open(dest, 'wb').close()
        return

    cv_temp = []
    nativeBlockNum = getNativeBlockNum(n, k)
    parityBlockNum = getParityBlockNum(n, k)
    enc_matrix = [[GF256int(0) for col in range(nativeBlockNum)]
                  for row in range(parityBlockNum)]
    dec_matrix = [[GF256int(0) for col in range(nativeBlockNum)]
                  for row in range(nativeBlockNum)]
    rev_matrix = [[GF256int(0) for col in range(nativeBlockNum)]
                  for row in range(nativeBlockNum)]
    gj_matrix = [[GF256int(0) for col in range(nativeBlockNum * 2)]
                 for row in range(nativeBlockNum)]

    ## generate the encoding matrix
    counter = 0
    for i in range(parityBlockNum):
        for j in range(nativeBlockNum):
            enc_matrix[i][j] = GF256int(parityCoeff[counter])
            counter += 1

    cm1 = CoeffMatrix(nativeBlockNum)
    for i in range(parityBlockNum):
        cv_temp.append(CoeffVector(nativeBlockNum))
        for j in range(nativeBlockNum):
            cv_temp[i].coeff_[j] = enc_matrix[i][j]
        cv_temp[i].first()
        cm1.addcoeffvector(cv_temp[i])

    ## generate the decoding matrix
    i = 0
    for selectChunkNo in blocknums:
        for j in range(nativeBlockNum):
            dec_matrix[i][j] = enc_matrix[selectChunkNo][j]
        i += 1

    ## initialize the reverse matrix
    for i in range(nativeBlockNum):
        for j in range(nativeBlockNum):
            if j == i:
                rev_matrix[i][j] = GF256int(1)

    ## initialize the Gauss-Jordan matrix = [decoding,reverse]
    for i in range(nativeBlockNum):
        for j in range(nativeBlockNum * 2):
            if j < nativeBlockNum:
                gj_matrix[i][j] = dec_matrix[i][j]
            else:
                gj_matrix[i][j] = rev_matrix[i][j - nativeBlockNum]

    reversematrix(n, k, gj_matrix)

    for i in range(nativeBlockNum):
        for j in range(nativeBlockNum):
            dec_matrix[i][j] = gj_matrix[i][j + nativeBlockNum]

    ##generate decode data chunks
    selectchunk = []
    for filename in src:
        infile = open(filename, 'rb')
        selectchunk.append(infile.read())
        infile.close()
    chunksize = os.path.getsize(src[0])
    indatalist = ''.join(selectchunk)

    ##rebuild the original chunks
    parityCoeff_temp = ''.join([chr(dec_matrix[i][j]) \
                                for i in range(nativeBlockNum) \
                                for j in range(nativeBlockNum)])
    outdatalist = codings.clibfmsr.clibfmsr.decodeComputation(indatalist, \
                           parityCoeff_temp, nativeBlockNum, chunksize)

    outfile = open(dest, 'wb')
    writelen = 1048576
    writenext = 0
    for i in range(0, filesize - writelen, writelen):
        writenext = i + writelen
        outfile.write(outdatalist[i:writenext])
    outfile.write(outdatalist[writenext:filesize])
    outfile.close()