github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/vector/hnsw/distancer/manhattan_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 TestManhattanDistancer(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 := NewManhattanProvider().New(vec1).Distance(vec2) 28 require.Nil(t, err) 29 require.True(t, ok) 30 control, ok, err := NewManhattanProvider().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 // distance will be abs(3-1.5) + abs(4-2) + abs(5-2.5) = 1.5 + 2 + 2.5 = 6 41 expectedDistance := float32(6) 42 43 dist, ok, err := NewManhattanProvider().New(vec1).Distance(vec2) 44 require.Nil(t, err) 45 require.True(t, ok) 46 control, ok, err := NewManhattanProvider().SingleDist(vec1, vec2) 47 require.True(t, ok) 48 require.Nil(t, err) 49 assert.Equal(t, control, dist) 50 assert.Equal(t, expectedDistance, dist) 51 }) 52 53 t.Run("different vectors", func(t *testing.T) { 54 vec1 := []float32{10, 11} 55 vec2 := []float32{13, 15} 56 // distance will be calculated as abs(10-13) + abs(11-15) = 3 + 4 = 7 57 expectedDistance := float32(7) 58 59 dist, ok, err := NewManhattanProvider().New(vec1).Distance(vec2) 60 require.Nil(t, err) 61 require.True(t, ok) 62 control, ok, err := NewManhattanProvider().SingleDist(vec1, vec2) 63 require.True(t, ok) 64 require.Nil(t, err) 65 assert.Equal(t, control, dist) 66 assert.Equal(t, expectedDistance, dist) 67 }) 68 } 69 70 func TestManhattanDistancerStepbyStep(t *testing.T) { 71 t.Run("step by step equals SingleDist", func(t *testing.T) { 72 vec1 := []float32{3, 4, 5} 73 vec2 := []float32{1.5, 2, 2.5} 74 75 expectedDistance, ok, err := NewManhattanProvider().New(vec1).Distance(vec2) 76 require.Nil(t, err) 77 require.True(t, ok) 78 79 distanceProvider := NewManhattanProvider() 80 sum := float32(0.0) 81 for i := range vec1 { 82 sum += distanceProvider.Step([]float32{vec1[i]}, []float32{vec2[i]}) 83 } 84 control := distanceProvider.Wrap(sum) 85 86 assert.Equal(t, control, expectedDistance) 87 }) 88 }