github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/vector/hnsw/distancer/l2.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 "github.com/pkg/errors" 15 16 var l2SquaredImpl func(a, b []float32) float32 = func(a, b []float32) float32 { 17 var sum float32 18 19 for i := range a { 20 diff := a[i] - b[i] 21 sum += diff * diff 22 } 23 24 return sum 25 } 26 27 type L2Squared struct { 28 a []float32 29 } 30 31 func (l L2Squared) Distance(b []float32) (float32, bool, error) { 32 if len(l.a) != len(b) { 33 return 0, false, errors.Errorf("vector lengths don't match: %d vs %d", 34 len(l.a), len(b)) 35 } 36 37 return l2SquaredImpl(l.a, b), true, nil 38 } 39 40 type L2SquaredProvider struct{} 41 42 func NewL2SquaredProvider() L2SquaredProvider { 43 return L2SquaredProvider{} 44 } 45 46 func (l L2SquaredProvider) SingleDist(a, b []float32) (float32, bool, error) { 47 if len(a) != len(b) { 48 return 0, false, errors.Errorf("vector lengths don't match: %d vs %d", 49 len(a), len(b)) 50 } 51 52 return l2SquaredImpl(a, b), true, nil 53 } 54 55 func (l L2SquaredProvider) Type() string { 56 return "l2-squared" 57 } 58 59 func (l L2SquaredProvider) New(a []float32) Distancer { 60 return &L2Squared{a: a} 61 } 62 63 func (l L2SquaredProvider) Step(a, b []float32) float32 { 64 var sum float32 65 66 for i := range a { 67 diff := a[i] - b[i] 68 sum += diff * diff 69 } 70 71 return sum 72 } 73 74 func (l L2SquaredProvider) Wrap(x float32) float32 { 75 return x 76 }