github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/vector/hnsw/distancer/hamming.go (about) 1 // _ _ 2 // __ _____ __ ___ ___ __ _| |_ ___ 3 // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ 4 // \ V V / __/ (_| |\ V /| | (_| | || __/ 5 // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| 6 // 7 // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. 8 // 9 // CONTACT: hello@weaviate.io 10 // 11 12 package distancer 13 14 import ( 15 "github.com/pkg/errors" 16 ) 17 18 var hammingImpl func(a, b []float32) float32 = func(a, b []float32) float32 { 19 var sum float32 // default value of float in golang is 0 20 21 for i := range a { 22 if a[i] != b[i] { 23 sum += float32(1) 24 } 25 } 26 27 return sum 28 } 29 30 type Hamming struct { 31 a []float32 32 } 33 34 func (l Hamming) Distance(b []float32) (float32, bool, error) { 35 if len(l.a) != len(b) { 36 return 0, false, errors.Errorf("vector lengths don't match: %d vs %d", 37 len(l.a), len(b)) 38 } 39 40 return hammingImpl(l.a, b), true, nil 41 } 42 43 type HammingProvider struct{} 44 45 func NewHammingProvider() HammingProvider { 46 return HammingProvider{} 47 } 48 49 func (l HammingProvider) SingleDist(a, b []float32) (float32, bool, error) { 50 if len(a) != len(b) { 51 return 0, false, errors.Errorf("vector lengths don't match: %d vs %d", 52 len(a), len(b)) 53 } 54 55 return hammingImpl(a, b), true, nil 56 } 57 58 func (l HammingProvider) Type() string { 59 return "hamming" 60 } 61 62 func (l HammingProvider) New(a []float32) Distancer { 63 return &Hamming{a: a} 64 } 65 66 func (l HammingProvider) Step(x, y []float32) float32 { 67 var sum float32 // default value of float in golang is 0 68 69 for i := range x { 70 if x[i] != y[i] { 71 sum += float32(1) 72 } 73 } 74 75 return sum 76 } 77 78 func (l HammingProvider) Wrap(x float32) float32 { 79 return x 80 }