@@ -3,6 +3,7 @@ package main
3
3
import (
4
4
"fmt"
5
5
"math/rand"
6
+ "reflect"
6
7
"runtime"
7
8
"time"
8
9
@@ -43,26 +44,35 @@ func randVector(dim int) []float32 {
43
44
}
44
45
45
46
// 单个写入
46
- func exampleAddPoint (indexFileName string ) {
47
+ func exampleAddPoint (indexFileName string ) [] float32 {
47
48
var dim , M , ef = 128 , 32 , 300
48
49
// 最大的 elements 数
49
- var maxElements uint32 = 10000
50
+ var maxElements uint32 = 100
50
51
// 定义距离 cosine
51
52
var spaceType = "cosine"
52
- var randomSeed = 100
53
+ var randomSeed = 2000
53
54
fmt .Println ("Before Create HNSW" )
54
55
traceMemStats ()
55
56
// Init new index
56
57
h := hnswgo .New (dim , M , ef , randomSeed , maxElements , spaceType )
58
+
59
+ // randomIndex to test the api GetVectorByLabel
60
+ var randomIndex []float32
61
+
57
62
// Insert 1000 vectors to index. Label Type is uint32
58
63
var i uint32
59
64
for ; i < maxElements ; i ++ {
60
65
if i % 1000 == 0 {
61
66
fmt .Println (i )
62
67
}
63
- h .AddPoint (randVector (dim ), i )
68
+ randVec := randVector (dim )
69
+ h .AddPoint (randVec , i )
70
+ if i == 0 {
71
+ randomIndex = randVec
72
+ }
64
73
}
65
74
h .Save (indexFileName )
75
+ return randomIndex
66
76
}
67
77
68
78
// 批量写入
@@ -97,7 +107,7 @@ func exampleBatchAddPoint(indexFileName string) {
97
107
}
98
108
99
109
// 读取
100
- func exampleLoadIndex (indexFileName , spaceType string , dim int ) {
110
+ func exampleLoadIndex (indexFileName , spaceType string , dim int ) [] float32 {
101
111
h := hnswgo .Load (indexFileName , dim , spaceType )
102
112
// Search vector with maximum 5 NN
103
113
h .SetEf (15 )
@@ -109,36 +119,63 @@ func exampleLoadIndex(indexFileName, spaceType string, dim int) {
109
119
fmt .Println (endTime - startTime )
110
120
fmt .Println (labels , vectors )
111
121
122
+ // Test GetMaxElements API Before Resize
123
+ maxElementsBeforeResize := h .GetMaxElements ()
124
+ currentElementsBeforeResize := h .GetCurrentElementCount ()
125
+ fmt .Println ("maxElements, currentElements(before resize): " , maxElementsBeforeResize , currentElementsBeforeResize )
126
+
112
127
// Test ResizeIndex API
113
128
isResize := h .ResizeIndex (12000 )
114
129
fmt .Println ("Size flag: " , isResize )
115
130
131
+ // Test GetMaxElements API After Resize
132
+ maxElementsAfterResize := h .GetMaxElements ()
133
+ currentElementsAfterResize := h .GetCurrentElementCount ()
134
+ fmt .Println ("maxElements, currentElements(after resize): " , maxElementsAfterResize , currentElementsAfterResize )
135
+
136
+ // Test GetDeleteCount API
137
+ deleteCountBeforeDelete := h .GetDeleteCount ()
138
+ fmt .Println ("GetDeleteCount(before): " , deleteCountBeforeDelete )
139
+
116
140
// Test Mark API
117
141
isMarkDelete := h .MarkDelete (10 )
118
142
fmt .Println ("isMarkDelete: " , isMarkDelete )
119
143
120
144
labelIsDelete := h .GetLabelIsMarkedDeleted (10 )
121
145
fmt .Println ("labelIsDelete: " , labelIsDelete )
122
146
147
+ // Test GetDeleteCount API
148
+ deleteCountBeforeAfter := h .GetDeleteCount ()
149
+ fmt .Println ("GetDeleteCount(after): " , deleteCountBeforeAfter )
150
+
123
151
isUnmarkDelete := h .UnmarkDelete (10 )
124
152
fmt .Println ("isUnmarkDelete: " , isUnmarkDelete )
125
153
154
+ // Test GetVectorByLabel API
155
+ getVectorByIdRes := h .GetVectorByLabel (0 , dim )
156
+ fmt .Println ("Vector: " , getVectorByIdRes )
157
+
126
158
// Test Unload API
127
159
fmt .Println ("Before Unload" )
128
160
traceMemStats ()
129
161
h .Unload ()
130
162
fmt .Println ("After Unload" )
131
163
traceMemStats ()
164
+
165
+ return getVectorByIdRes
132
166
}
133
167
134
168
func main () {
135
169
// 单条写入 add index point by point
136
- exampleAddPoint ("hnsw_demo_single.bin" )
170
+ demoVector := exampleAddPoint ("hnsw_demo_single.bin" )
137
171
// 测试读取 test loading
138
- exampleLoadIndex ("hnsw_demo_single.bin" , "cosine" , 128 )
172
+ demoSearchVector := exampleLoadIndex ("hnsw_demo_single.bin" , "cosine" , 128 )
173
+ // test GetVectorByLabel API
174
+ isEqual := reflect .DeepEqual (demoVector , demoSearchVector )
175
+ fmt .Println ("GetVectorByLabel return data is equal: " , isEqual )
139
176
140
177
// 批量写入 add index with batch mode
141
- // exampleBatchAddPoint("hnsw_demo_multiple.bin")
178
+ exampleBatchAddPoint ("hnsw_demo_multiple.bin" )
142
179
// 测试读取 test loading
143
- // exampleLoadIndex("hnsw_demo_multiple.bin", "cosine", 128)
180
+ exampleLoadIndex ("hnsw_demo_multiple.bin" , "cosine" , 128 )
144
181
}
0 commit comments