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

163 lines
3.8 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 vec1binary
foreach {tn nElem codesize} {
1 16 2
2 16 1
3 48 6
4 48 3
} {
reset_db
vec1_load db
expr srand(0)
do_execsql_test 1.$tn.0 {
CREATE VIRTUAL TABLE v1 USING vec1(v);
}
set nRow [expr 40]
set nLimit [expr 40]
do_execsql_test 1.$tn.1 {
WITH s(i) AS (
SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<$nRow
)
INSERT INTO v1 SELECT random_vector($nElem) FROM s;
}
set jarg "{quantizer:\"bq\", nbucket: 8, codesize: $codesize}"
do_execsql_test 1.$tn.2 {
INSERT INTO v1(cmd, arg) VALUES('rebuild', (
SELECT vec1_train(v, $jarg) FROM v1
));
}
set v [db one {SELECT random_vector($nElem)}]
set res [db eval {
SELECT rowid FROM v1 ORDER by vec1_l2_distance($v, v) LIMIT $nLimit
}]
do_execsql_test 1.$tn.2 {
SELECT rowid FROM v1($v, '{K:50, nprobe:8}')
ORDER BY vec1_l2_distance(v, $v)
LIMIT $nLimit
} $res
do_execsql_test 1.$tn.3 {
PRAGMA integrity_check
} {ok}
}
#-------------------------------------------------------------------------
reset_db
vec1_load db
do_execsql_test 2.1 {
CREATE VIRTUAL TABLE v1 USING vec1(v);
INSERT INTO v1(cmd, arg) VALUES('rebuild', (
WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<$nRow )
SELECT vec1_train(random_vector(8), '{quantizer:"bq", nbucket:8}') FROM s
));
INSERT INTO v1 VALUES( random_vector(8) );
}
set v [db one {SELECT random_vector(8)}]
do_execsql_test 2.2 {
SELECT rowid FROM v1($v, '{nprobe:8}') LIMIT $nLimit
} {1}
#-------------------------------------------------------------------------
reset_db
vec1_load db
do_execsql_test 2.1 {
CREATE VIRTUAL TABLE v1 USING vec1(abc);
INSERT INTO v1(cmd, arg) VALUES('rebuild', (
WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<$nRow )
SELECT vec1_train(random_vector(64), '{quantizer:"bq", nbucket:2}') FROM s
));
WITH s(i) AS (
SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1000
)
INSERT INTO v1 SELECT random_vector(64) FROM s;
}
do_execsql_test 2.2 {
PRAGMA integrity_check
} {ok}
foreach id [db eval {SELECT rowid FROM v1}] {
db eval { DELETE FROM v1 WHERE rowid = $id }
if {($id % 1)==0} {
do_execsql_test 2.3.$id {
PRAGMA integrity_check
} {ok}
}
}
#-------------------------------------------------------------------------
# Now check the version number in model headers. This should be 7 when
# using a binary quantizer, or 4 otherwise.
#
reset_db
vec1_load db
foreach {tn jarg iVersion} {
1 "{nbucket:2, codesize:8}" 4
2 "{nbucket:2, codesize:8, quantizer:\"bq\"}" 7
3 "{nbucket:2, codesize:8, quantizer:\"pq\"}" 4
} {
do_test 2.$tn {
set M [db one {
WITH s(i) AS (
SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<512
)
SELECT vec1_train(random_vector(16), $jarg) FROM s;
}]
binary scan $M I version
set version
} $iVersion
}
#-------------------------------------------------------------------------
reset_db
vec1_load db
do_execsql_test 3.1 {
CREATE VIRTUAL TABLE v1 USING vec1(v);
WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<1000 )
INSERT INTO v1 SELECT random_vector(100) FROM s;
INSERT INTO v1(cmd, arg) VALUES('rebuild', (
SELECT vec1_train(v, '{quantizer:"bq", nbucket:2, codesize:8}') FROM v1
));
}
set v [db one {SELECT random_vector(100)}]
do_execsql_test 3.2 {
SELECT count(*) FROM (
SELECT rowid FROM v1($v, '{nprobe:2}') LIMIT 5
);
} {5}
finish_test