pdqhash-go

git clone git://archive.git.mtrnord.blog/MTRNord/pdqhash-go.git
Log | Files | Refs | LICENSE

helpers.go (1215B)


      1 package helpers
      2 
      3 import "golang.org/x/exp/constraints"
      4 
      5 func Abs[T constraints.Integer](x T) T {
      6 	if x < 0 {
      7 		return -x
      8 	}
      9 	return x
     10 }
     11 
     12 func Torben(m [][]float64, numRows, numCols int) float64 {
     13 	n := numRows * numCols
     14 	midn := (n + 1) / 2
     15 	less := 0
     16 	greater := 0
     17 	equal := 0
     18 	min := m[0][0]
     19 	max := m[0][0]
     20 	guess := float64(0.0)
     21 	maxltguess := float64(0.0)
     22 	mingtguess := float64(0.0)
     23 	for i := 0; i < numRows; i++ {
     24 		for j := 0; j < numCols; j++ {
     25 			v := m[i][j]
     26 			if v < min {
     27 				min = v
     28 			}
     29 
     30 			if v > max {
     31 				max = v
     32 			}
     33 		}
     34 	}
     35 
     36 	for {
     37 		guess = (min + max) / 2
     38 		less = 0
     39 		greater = 0
     40 		equal = 0
     41 		maxltguess = min
     42 		mingtguess = max
     43 
     44 		for i := 0; i < numRows; i++ {
     45 			for j := 0; j < numCols; j++ {
     46 				v := m[i][j]
     47 				if v < guess {
     48 					less++
     49 					if v > maxltguess {
     50 						maxltguess = v
     51 					}
     52 				} else if v > guess {
     53 					greater++
     54 					if v < mingtguess {
     55 						mingtguess = v
     56 					}
     57 				} else {
     58 					equal++
     59 				}
     60 			}
     61 		}
     62 
     63 		if less <= midn && greater <= midn {
     64 			break
     65 		} else if less > greater {
     66 			max = maxltguess
     67 		} else {
     68 			min = mingtguess
     69 		}
     70 	}
     71 
     72 	if less >= midn {
     73 		return maxltguess
     74 	} else if less+equal >= midn {
     75 		return guess
     76 	} else {
     77 		return mingtguess
     78 	}
     79 }