github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/vector/hnsw/distancer/l2_test.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 "testing" 16 17 "github.com/stretchr/testify/assert" 18 "github.com/stretchr/testify/require" 19 ) 20 21 func TestL2Distancer(t *testing.T) { 22 t.Run("identical vectors", func(t *testing.T) { 23 vec1 := []float32{3, 4, 5} 24 vec2 := []float32{3, 4, 5} 25 expectedDistance := float32(0) 26 27 dist, ok, err := NewL2SquaredProvider().New(vec1).Distance(vec2) 28 require.Nil(t, err) 29 require.True(t, ok) 30 control, ok, err := NewL2SquaredProvider().SingleDist(vec1, vec2) 31 require.True(t, ok) 32 require.Nil(t, err) 33 assert.Equal(t, control, dist) 34 assert.Equal(t, expectedDistance, dist) 35 }) 36 37 t.Run("same angle, different euclidean position", func(t *testing.T) { 38 vec1 := []float32{3, 4, 5} 39 vec2 := []float32{1.5, 2, 2.5} 40 expectedDistance := float32(12.5) 41 42 dist, ok, err := NewL2SquaredProvider().New(vec1).Distance(vec2) 43 require.Nil(t, err) 44 require.True(t, ok) 45 control, ok, err := NewL2SquaredProvider().SingleDist(vec1, vec2) 46 require.True(t, ok) 47 require.Nil(t, err) 48 assert.Equal(t, control, dist) 49 assert.Equal(t, expectedDistance, dist) 50 }) 51 52 t.Run("different vectors", func(t *testing.T) { 53 vec1 := []float32{10, 11} 54 vec2 := []float32{13, 15} 55 expectedDistance := float32(25) 56 57 dist, ok, err := NewL2SquaredProvider().New(vec1).Distance(vec2) 58 require.Nil(t, err) 59 require.True(t, ok) 60 control, ok, err := NewL2SquaredProvider().SingleDist(vec1, vec2) 61 require.True(t, ok) 62 require.Nil(t, err) 63 assert.Equal(t, control, dist) 64 assert.Equal(t, expectedDistance, dist) 65 }) 66 } 67 68 func TestL2DistancerStepbyStep(t *testing.T) { 69 t.Run("step by step equals SingleDist", func(t *testing.T) { 70 vec1 := []float32{3, 4, 5} 71 vec2 := []float32{1.5, 2, 2.5} 72 73 expectedDistance, ok, err := NewL2SquaredProvider().New(vec1).Distance(vec2) 74 require.Nil(t, err) 75 require.True(t, ok) 76 77 distanceProvider := NewL2SquaredProvider() 78 sum := float32(0.0) 79 for i := range vec1 { 80 sum += distanceProvider.Step([]float32{vec1[i]}, []float32{vec2[i]}) 81 } 82 control := distanceProvider.Wrap(sum) 83 84 assert.Equal(t, control, expectedDistance) 85 }) 86 }