github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/vector/hnsw/distancer/hamming_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 TestHammingDistancer(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 := NewHammingProvider().New(vec1).Distance(vec2) 28 require.Nil(t, err) 29 require.True(t, ok) 30 control, ok, err := NewHammingProvider().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(3) // all three positions are different 41 42 dist, ok, err := NewHammingProvider().New(vec1).Distance(vec2) 43 require.Nil(t, err) 44 require.True(t, ok) 45 control, ok, err := NewHammingProvider().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("one position different", func(t *testing.T) { 53 vec1 := []float32{10, 11} 54 vec2 := []float32{10, 15} 55 expectedDistance := float32(1) 56 57 dist, ok, err := NewHammingProvider().New(vec1).Distance(vec2) 58 require.Nil(t, err) 59 require.True(t, ok) 60 control, ok, err := NewHammingProvider().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 t.Run("three positions different", func(t *testing.T) { 68 vec1 := []float32{10, 11, 15, 25, 31} 69 vec2 := []float32{10, 15, 16, 25, 30} 70 expectedDistance := float32(3) 71 72 dist, ok, err := NewHammingProvider().New(vec1).Distance(vec2) 73 require.Nil(t, err) 74 require.True(t, ok) 75 control, ok, err := NewHammingProvider().SingleDist(vec1, vec2) 76 require.True(t, ok) 77 require.Nil(t, err) 78 assert.Equal(t, control, dist) 79 assert.Equal(t, expectedDistance, dist) 80 }) 81 } 82 83 func TestHammingDistancerStepbyStep(t *testing.T) { 84 t.Run("step by step equals SingleDist", func(t *testing.T) { 85 vec1 := []float32{10, 11, 15, 25, 31} 86 vec2 := []float32{10, 15, 16, 25, 30} 87 88 expectedDistance, ok, err := NewHammingProvider().New(vec1).Distance(vec2) 89 require.Nil(t, err) 90 require.True(t, ok) 91 92 distanceProvider := NewHammingProvider() 93 sum := float32(0.0) 94 for i := range vec1 { 95 sum += distanceProvider.Step([]float32{vec1[i]}, []float32{vec2[i]}) 96 } 97 control := distanceProvider.Wrap(sum) 98 99 assert.Equal(t, control, expectedDistance) 100 }) 101 }