1
0
mirror of https://github.com/sqlite/sqlite.git synced 2026-10-23 21:49:02 +03:00
Files
sqlite/ext/vec1/test/vec1query.test
dan e32fbe0c23 Import vec1 sources into directory ext/vec1/ of this project.
FossilOrigin-Name: 3a0876d973868be7b6f4156a434cd09098c7ab1abdc7f0ef4f3d12a03de68b24
2026-09-30 14:49:16 +00:00

148 lines
3.1 KiB
Plaintext

# 2026-01-17
#
# The author disclaims copyright to this source code. In place of
# a legal notice, here is a blessing:
#
# May you do good and not evil.
# May you find forgiveness for yourself and forgive others.
# May you share freely, never taking more than you give.
#
#***********************************************************************
#
#
source [file join [file dirname [info script]] vec1_common.tcl]
set testprefix vec1query
vec1_load db
set lCentroid [list]
proc allocate_centroids {nCentroid nElem} {
global lCentroid
for {set ii 0} {$ii < $nCentroid} {incr ii} {
lappend lCentroid [randvec $nElem 10.0]
}
}
proc randvec {nElem {scale 1.0}} {
set vec [list]
for {set ii 0} {$ii < $nElem} {incr ii} {
lappend vec [expr {rand() * $scale}]
}
return $vec
}
proc addvec {a b} {
if {[llength $a]!=[llength $b]} {
error "vectors are different lengths"
}
set ret [list]
foreach ia $a ib $b {
lappend ret [expr $ia + $ib]
}
return $ret
}
proc cvec {nDim} {
global lCentroid
if {[llength $lCentroid]==0} {
allocate_centroids 16 $nDim
}
set ii [expr int(abs(rand()) * [llength $lCentroid])]
set ret [addvec [lindex $lCentroid $ii] [randvec $nDim 1.0]]
binary format r* $ret
}
db func cvec cvec
do_execsql_test 1.0 {
CREATE VIRTUAL TABLE v1 USING vec1(v);
}
do_execsql_test 1.1 {
WITH s(i) AS (
SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1000
)
INSERT INTO v1 SELECT cvec(24) FROM s;
}
do_execsql_test 1.2 {
INSERT INTO v1(cmd, arg) VALUES('rebuild', (
SELECT vec1_train(v, '{codesize:0, nbucket:20, distance:"l2"}') FROM v1
));
}
set nRep 100
proc testquery {v p} {
db one {SELECT
(SELECT rowid FROM v1($v, $p) ORDER BY vec1_l2_distance(v, $v))
==
(SELECT rowid FROM v1 ORDER BY vec1_l2_distance(v, $v))
}
}
do_test 1.3 {
set nTry 0
set nFind 0
for {set ii 0} {$ii < $nRep} {incr ii} {
set v [cvec 24]
set p "{K:50, nprobe:4}"
incr nTry 1
incr nFind [testquery $v $p]
}
expr {((double($nFind) / $nTry) >= 0.98) ? "ok" : "$nFind/$nTry"}
} {ok}
do_test 1.4 {
set nTry 0
set nFind 0
for {set ii 0} {$ii < $nRep} {incr ii} {
set v [random_vector 24]
set p "{K:50, nprobe:4}"
incr nTry 1
incr nFind [testquery $v $p]
}
expr {((double($nFind) / $nTry) >= 0.99) ? "ok" : "$nFind/$nTry"}
} {ok}
model2tbl model v1
if {1 || [set_test_counter errors]>0} {
set ii 0
foreach c $lCentroid {
set bin [binary format r* $c]
puts -nonewline "CENTROID $ii: "
set L [
db eval {
SELECT format('%.1f', vec1_l2_distance($bin, coarse)) AS d FROM model
}
]
puts [lrange [lsort $L] 0 0]
incr ii
}
}
do_execsql_test 1.5 {
PRAGMA integrity_check
} {ok}
set v [db one {SELECT random_vector(24)}]
set p "{K:50,nprobe:null}"
do_catchsql_test 1.6 {
SELECT (SELECT rowid FROM v1($v, $p) ORDER BY vec1_cos_distance(v, $v))
==(SELECT rowid FROM v1 ORDER BY vec1_cos_distance(v, $v))
} {1 {vec1: null value in json object}}
do_catchsql_test 1.7 {
SELECT rowid FROM v1($v, -10)
} {1 {vec1: K must be an integer value between 0 and 33554432}}
finish_test