import numpy as np import pytest import behavision.gallery.index as index_mod from behavision.gallery.index import VectorIndex def _unit(v): v = np.asarray(v, dtype=np.float32) return v / np.linalg.norm(v) @pytest.fixture(params=["numpy", "faiss"]) def make_index(request, monkeypatch): if request.param == "numpy": monkeypatch.setattr(index_mod, "_HAVE_FAISS", False) elif not index_mod._HAVE_FAISS: pytest.skip("faiss not installed") return lambda dim=8: VectorIndex(dim) def test_empty_index_returns_no_matches(make_index): idx = make_index() assert idx.search(_unit(np.ones(8))) == [] def test_add_search_finds_nearest(make_index): idx = make_index() a = _unit([1, 0, 0, 0, 0, 0, 0, 0]) b = _unit([0, 1, 0, 0, 0, 0, 0, 0]) idx.add([10, 20], np.vstack([a, b])) results = idx.search(_unit([0.9, 0.1, 0, 0, 0, 0, 0, 0]), k=2) assert results[0][0] == 10 assert results[0][1] > results[1][1] assert results[0][1] == pytest.approx(1.0, abs=0.05) def test_remove(make_index): idx = make_index() a = _unit(np.arange(1, 9)) idx.add([7], a.reshape(1, -1)) idx.remove([7]) assert len(idx) == 0 assert idx.search(a) == []