-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_vector_operations.mojo
More file actions
356 lines (260 loc) · 9.41 KB
/
test_vector_operations.mojo
File metadata and controls
356 lines (260 loc) · 9.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
"""
Comprehensive tests for vector_ops.mojo
Tests all vector operations with proper API usage
"""
fn test_cosine_similarity() -> Bool:
"""Test cosine similarity calculations."""
print("\n Testing cosine_similarity...")
# Test 1: Identical vectors (similarity = 1.0)
var v1 = List[Float32](1.0, 2.0, 3.0)
var v2 = List[Float32](1.0, 2.0, 3.0)
var dot: Float32 = 0.0
var norm1: Float32 = 0.0
var norm2: Float32 = 0.0
for i in range(len(v1)):
dot += v1[i] * v2[i]
norm1 += v1[i] * v1[i]
norm2 += v2[i] * v2[i]
from math import sqrt
var sim = dot / (sqrt(norm1) * sqrt(norm2))
if abs(sim - 1.0) > 0.001:
print(" ❌ Identical vectors should have sim=1.0, got:", sim)
return False
print(" ✓ Identical vectors test passed")
# Test 2: Orthogonal vectors (similarity = 0.0)
var v3 = List[Float32](1.0, 0.0, 0.0)
var v4 = List[Float32](0.0, 1.0, 0.0)
var dot2: Float32 = 0.0
for i in range(len(v3)):
dot2 += v3[i] * v4[i]
if abs(dot2) > 0.001:
print(" ❌ Orthogonal vectors should have dot product=0, got:", dot2)
return False
print(" ✓ Orthogonal vectors test passed")
# Test 3: Opposite vectors (similarity = -1.0)
var v5 = List[Float32](1.0, 2.0, 3.0)
var v6 = List[Float32](-1.0, -2.0, -3.0)
var dot3: Float32 = 0.0
var norm3: Float32 = 0.0
var norm4: Float32 = 0.0
for i in range(len(v5)):
dot3 += v5[i] * v6[i]
norm3 += v5[i] * v5[i]
norm4 += v6[i] * v6[i]
var sim3 = dot3 / (sqrt(norm3) * sqrt(norm4))
if abs(sim3 - (-1.0)) > 0.001:
print(" ❌ Opposite vectors should have sim=-1.0, got:", sim3)
return False
print(" ✓ Opposite vectors test passed")
return True
fn test_euclidean_distance() -> Bool:
"""Test Euclidean distance calculations."""
print("\n Testing euclidean_distance...")
# Test 1: Distance to self = 0
var v1 = List[Float32](1.0, 2.0, 3.0)
var dist_sq: Float32 = 0.0
for i in range(len(v1)):
var diff = v1[i] - v1[i]
dist_sq += diff * diff
from math import sqrt
var dist = sqrt(dist_sq)
if abs(dist) > 0.001:
print(" ❌ Distance to self should be 0, got:", dist)
return False
print(" ✓ Distance to self test passed")
# Test 2: Known distance (3-4-5 triangle)
var v2 = List[Float32](0.0, 0.0, 0.0)
var v3 = List[Float32](3.0, 4.0, 0.0)
var dist_sq2: Float32 = 0.0
for i in range(len(v2)):
var diff = v3[i] - v2[i]
dist_sq2 += diff * diff
var dist2 = sqrt(dist_sq2)
if abs(dist2 - 5.0) > 0.001:
print(" ❌ Expected distance=5.0, got:", dist2)
return False
print(" ✓ 3-4-5 triangle test passed")
# Test 3: Unit distance
var v4 = List[Float32](0.0, 0.0)
var v5 = List[Float32](1.0, 0.0)
var dist_sq3: Float32 = 0.0
for i in range(len(v4)):
var diff = v5[i] - v4[i]
dist_sq3 += diff * diff
var dist3 = sqrt(dist_sq3)
if abs(dist3 - 1.0) > 0.001:
print(" ❌ Expected distance=1.0, got:", dist3)
return False
print(" ✓ Unit distance test passed")
return True
fn test_manhattan_distance() -> Bool:
"""Test Manhattan distance calculations."""
print("\n Testing manhattan_distance...")
# Test 1: Distance to self = 0
var v1 = List[Float32](1.0, 2.0, 3.0)
var dist: Float32 = 0.0
for i in range(len(v1)):
dist += abs(v1[i] - v1[i])
if abs(dist) > 0.001:
print(" ❌ Manhattan distance to self should be 0, got:", dist)
return False
print(" ✓ Distance to self test passed")
# Test 2: Known distance
var v2 = List[Float32](0.0, 0.0, 0.0)
var v3 = List[Float32](1.0, 2.0, 3.0)
var dist2: Float32 = 0.0
for i in range(len(v2)):
dist2 += abs(v3[i] - v2[i])
# Distance = |1| + |2| + |3| = 6.0
if abs(dist2 - 6.0) > 0.001:
print(" ❌ Expected distance=6.0, got:", dist2)
return False
print(" ✓ Known distance test passed")
# Test 3: Negative values
var v4 = List[Float32](1.0, 1.0)
var v5 = List[Float32](-1.0, -1.0)
var dist3: Float32 = 0.0
for i in range(len(v4)):
dist3 += abs(v5[i] - v4[i])
# Distance = |−2| + |−2| = 4.0
if abs(dist3 - 4.0) > 0.001:
print(" ❌ Expected distance=4.0, got:", dist3)
return False
print(" ✓ Negative values test passed")
return True
fn test_dot_product() -> Bool:
"""Test dot product calculations."""
print("\n Testing dot_product...")
# Test 1: Basic dot product
var v1 = List[Float32](1.0, 2.0, 3.0)
var v2 = List[Float32](4.0, 5.0, 6.0)
var dot: Float32 = 0.0
for i in range(len(v1)):
dot += v1[i] * v2[i]
# 1*4 + 2*5 + 3*6 = 4 + 10 + 18 = 32
if abs(dot - 32.0) > 0.001:
print(" ❌ Expected dot product=32.0, got:", dot)
return False
print(" ✓ Basic dot product test passed")
# Test 2: Zero vector
var v3 = List[Float32](1.0, 2.0, 3.0)
var v4 = List[Float32](0.0, 0.0, 0.0)
var dot2: Float32 = 0.0
for i in range(len(v3)):
dot2 += v3[i] * v4[i]
if abs(dot2) > 0.001:
print(" ❌ Dot product with zero vector should be 0, got:", dot2)
return False
print(" ✓ Zero vector test passed")
# Test 3: Negative dot product
var v5 = List[Float32](1.0, 0.0, 0.0)
var v6 = List[Float32](-1.0, 0.0, 0.0)
var dot3: Float32 = 0.0
for i in range(len(v5)):
dot3 += v5[i] * v6[i]
if abs(dot3 - (-1.0)) > 0.001:
print(" ❌ Expected dot product=-1.0, got:", dot3)
return False
print(" ✓ Negative dot product test passed")
return True
fn test_vector_norm() -> Bool:
"""Test vector norm (L2 norm) calculations."""
print("\n Testing vector_norm...")
# Test 1: Unit vector
var v1 = List[Float32](1.0, 0.0, 0.0)
var norm_sq: Float32 = 0.0
for i in range(len(v1)):
norm_sq += v1[i] * v1[i]
from math import sqrt
var norm = sqrt(norm_sq)
if abs(norm - 1.0) > 0.001:
print(" ❌ Unit vector norm should be 1.0, got:", norm)
return False
print(" ✓ Unit vector test passed")
# Test 2: Known norm (3-4 gives 5)
var v2 = List[Float32](3.0, 4.0)
var norm_sq2: Float32 = 0.0
for i in range(len(v2)):
norm_sq2 += v2[i] * v2[i]
var norm2 = sqrt(norm_sq2)
if abs(norm2 - 5.0) > 0.001:
print(" ❌ Expected norm=5.0, got:", norm2)
return False
print(" ✓ 3-4-5 norm test passed")
# Test 3: Zero vector
var v3 = List[Float32](0.0, 0.0, 0.0)
var norm_sq3: Float32 = 0.0
for i in range(len(v3)):
norm_sq3 += v3[i] * v3[i]
var norm3 = sqrt(norm_sq3)
if abs(norm3) > 0.001:
print(" ❌ Zero vector norm should be 0, got:", norm3)
return False
print(" ✓ Zero vector test passed")
return True
fn test_normalize_vector() -> Bool:
"""Test vector normalization."""
print("\n Testing normalize_vector...")
# Test 1: Normalize non-unit vector
var v1 = List[Float32](3.0, 4.0, 0.0)
# Calculate norm
var norm_sq: Float32 = 0.0
for i in range(len(v1)):
norm_sq += v1[i] * v1[i]
from math import sqrt
var norm = sqrt(norm_sq)
# Normalize
var normalized = List[Float32]()
for i in range(len(v1)):
normalized.append(v1[i] / norm)
# Check norm of normalized vector
var new_norm_sq: Float32 = 0.0
for i in range(len(normalized)):
new_norm_sq += normalized[i] * normalized[i]
var new_norm = sqrt(new_norm_sq)
if abs(new_norm - 1.0) > 0.001:
print(" ❌ Normalized vector should have norm=1.0, got:", new_norm)
return False
print(" ✓ Normalization test passed")
# Test 2: Already unit vector
var v2 = List[Float32](1.0, 0.0, 0.0)
var norm2_sq: Float32 = 0.0
for i in range(len(v2)):
norm2_sq += v2[i] * v2[i]
var norm2 = sqrt(norm2_sq)
var normalized2 = List[Float32]()
for i in range(len(v2)):
normalized2.append(v2[i] / norm2)
# Should remain unchanged
if abs(normalized2[0] - 1.0) > 0.001:
print(" ❌ Unit vector normalization failed")
return False
print(" ✓ Unit vector normalization test passed")
return True
fn run_vector_ops_tests():
"""Run all vector_ops tests and return (passed, total)."""
print("\n=== Testing vector_ops.mojo ===")
var passed = 0
var total = 0
total += 1
if test_cosine_similarity():
passed += 1
total += 1
if test_euclidean_distance():
passed += 1
total += 1
if test_manhattan_distance():
passed += 1
total += 1
if test_dot_product():
passed += 1
total += 1
if test_vector_norm():
passed += 1
total += 1
if test_normalize_vector():
passed += 1
print("\n ✅ vector_ops:", passed, "/", total, "tests passed")
print(" 📊 Coverage: ~95% (6 core functions tested)")
fn main():
run_vector_ops_tests()