github.com/cryptoecc/eth-ecc@v0.0.3/consensus/ethash/LDPCDecoder.go (about)

     1  package ethash
     2  
     3  import (
     4  	"math"
     5  )
     6  
     7  //OptimizedDecoding return hashVector, outputWord, LRrtl and It is 20% faster than previous decoding function when they use same nonce
     8  //percentage can be changed because of random nonce
     9  func OptimizedDecoding(parameters Parameters, hashVector []int, H, rowInCol, colInRow [][]int) ([]int, []int, [][]float64) {
    10  	outputWord := make([]int, parameters.n)
    11  	LRqtl := make([][]float64, parameters.n)
    12  	LRrtl := make([][]float64, parameters.n)
    13  	LRft := make([]float64, parameters.n)
    14  
    15  	for i := 0; i < parameters.n; i++ {
    16  		LRqtl[i] = make([]float64, parameters.m)
    17  		LRrtl[i] = make([]float64, parameters.m)
    18  		LRft[i] = math.Log((1-crossErr)/crossErr) * float64((hashVector[i]*2 - 1))
    19  	}
    20  	LRpt := make([]float64, parameters.n)
    21  
    22  	for ind := 1; ind <= maxIter; ind++ {
    23  		for t := 0; t < parameters.n; t++ {
    24  			temp3 := 0.0
    25  
    26  			for mp := 0; mp < parameters.wc; mp++ {
    27  				temp3 = infinityTest(temp3 + LRrtl[t][rowInCol[mp][t]])
    28  			}
    29  			for m := 0; m < parameters.wc; m++ {
    30  				temp4 := temp3
    31  				temp4 = infinityTest(temp4 - LRrtl[t][rowInCol[m][t]])
    32  				LRqtl[t][rowInCol[m][t]] = infinityTest(LRft[t] + temp4)
    33  			}
    34  		}
    35  
    36  		for k := 0; k < parameters.wr; k++ {
    37  			for l := 0; l < parameters.wr; l++ {
    38  				temp3 := 0.0
    39  				sign := 1.0
    40  				tempSign := 0.0
    41  				for m := 0; m < parameters.wr; m++ {
    42  					if m != l {
    43  						temp3 = temp3 + funcF(math.Abs(LRqtl[colInRow[m][k]][k]))
    44  						if LRqtl[colInRow[m][k]][k] > 0.0 {
    45  							tempSign = 1.0
    46  						} else {
    47  							tempSign = -1.0
    48  						}
    49  						sign = sign * tempSign
    50  					}
    51  				}
    52  				magnitude := funcF(temp3)
    53  				LRrtl[colInRow[l][k]][k] = infinityTest(sign * magnitude)
    54  			}
    55  		}
    56  
    57  		for t := 0; t < parameters.n; t++ {
    58  			LRpt[t] = infinityTest(LRft[t])
    59  			for k := 0; k < parameters.wc; k++ {
    60  				LRpt[t] += LRrtl[t][rowInCol[k][t]]
    61  				LRpt[t] = infinityTest(LRpt[t])
    62  			}
    63  
    64  			if LRpt[t] >= 0 {
    65  				outputWord[t] = 1
    66  			} else {
    67  				outputWord[t] = 0
    68  			}
    69  		}
    70  	}
    71  
    72  	return hashVector, outputWord, LRrtl
    73  }