nidx-binding 6.8.1.post513__tar.gz → 6.8.1.post515__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/PKG-INFO +1 -1
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_protos/pyproject.toml +1 -1
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/data_store/v1/store.rs +8 -8
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/data_store/v1.rs +3 -3
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/data_store/v2/paragraph_store.rs +2 -2
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/data_store/v2/vector_store.rs +2 -2
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/data_store/v2.rs +2 -2
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/data_store.rs +3 -3
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/hnsw/disk_hnsw.rs +65 -41
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/hnsw/ops_hnsw.rs +32 -26
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/hnsw/ram_hnsw.rs +14 -12
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/hnsw.rs +0 -18
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/lib.rs +1 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/segment.rs +21 -21
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/pyproject.toml +1 -1
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.config/nextest.toml +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-0cfce9b29547f8f5bafa6e440f86103be7b8c4ad2fd92db9ac223f4efbe23d10.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-1a561eed00f3dbe868bf5030059793300209179dc8fb73e4b57a54b5e81262fe.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-1d3fca2682e25a01143da92285297f134a6a105a96f64d87e0db3abb219855e4.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-249b3b57c27a71baa823f1fe0f0bba9c9af36f61c28f731e58beea60ec48e687.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-24cb6b683daa42d7125f862e25943ab4be7bf275cd8739f8da4859d701795e1a.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-263c8fce6db5b03bbd012fafdba6943cbee6ed7eb8976cdef4f5b01dde7ca6fd.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-2a5d92fb1638df830a4477a7cdf24e6db6b43034b7bbe74fdfb63e8afe2c4071.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-2b065a363f58caed60e3706603c1260dbf5a4c795604a5b68edda22eb07fec1b.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-3fc3cb39934683de8cd475ce1368c8373453eb1e01f81587d66b9d14b109ce6e.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-48f33b77b7c1633467b0b2efcaa1d3c207e7757e4f1d83b40d15e6ca365f7771.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-4ae09f2c08e2f324bee01bb8487a8f37678a1c5e9d327339235c50d4921a8949.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-4d7a76fa413c9ef0ce2a47ac7bb7e01d3e6a2aabded9487d21010a53efee8852.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-4fcbdd6657c7dc9b60b3a563dd41711b3dbcf72ce063427b7a01f8cddf34c244.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-577109ac00ccfbd38ecaccab94116f2f46a4caf5612afa372cded197123c1e08.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-5db25f97d8578d6d78f2f6bd4b72cc82a9b1b82805c6422d967ac63b20d99db4.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-5ec3233a3a23e926055056d46bdde17836a633066dbb5f349502648cd3ea9a60.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-66edb6ea424d8681927dcddb6bac5f1239175f4775d1f40417ba15054b0c6f19.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-6f9c6d201c1b5712efb68c363bffd3e0169c11f2a8f925e8cd4e8808599ff7b4.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-733c3ebacc86f444bf5e2dd79ade660c291e88a00fc09b722f6e2e191545874c.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-7a3bf27c330c468a596e8a297cf7d8b192e31e67ecc5177c1267f579e8e247c7.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-7a7e59e47b30b12237511fd3d7da2d17b0471ad2b006af48d6a6f587c779692b.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-7dcbb33312cc9f11ae3a6d73b1ace017a9f19a8bf8f10304fc57977c8efeadff.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-7efa7c0d747afc4b6aed0586ff846c27839c3213ff7ee9f30c89b0d0f17e60e3.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-8493140d788604d498a4e48da4158708572ccc9d60185290a00d549cc84533db.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-8493bb0059b013eaca42fd10cd7d04f0d06a8acaed379eff0d23f3229edde9ee.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-87996b3d6c7a2195438d7038015b06949102bce8c7b8cd8db1f83aaf23cbe489.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-8d33717587c6ee8f5fc339a80b1212a73d6c03e45856b1d55457fc8074709dd0.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-8f096d8171b89f9615d18f95d696dc9e4fb3674e103161a713cdc806f7a68506.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-917732a56ee04bf3a6e127319dda8225210869c82f9828d878162394dba4e078.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-95fe4ef93ee90733db1b67ed7987f80b5aac792f1590b979c68b418d1599eb98.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-9b67658569b343d8b4b61ae0a7dc721f367f2ba33c7b69b9e68bfd5c9bff5206.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-9c8062ea55d070afef68309e58fa987eb37fda44e1efbf68c8ba2af7846cc968.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-a06e1d9f6f95e4c4c2b98310ebddcc9d963cc033582bf2e945e8bf3a301b4247.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-a55265c9b07bd1399961a6f1e757201fd0eebe868ddaf96437111113d80fce92.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-a60ec2f66f1e7b84189e5b089f2087a29ff6a64326a3743dea935bbc58ee77fa.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-a891a37be5c2d7cce775c2dd33726b0318fd3839beab222a1b22bc6174604207.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-a945191bb4b3e37d6823ed3ad499339d007d69983105de8567777d9daf517b28.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-abe9f7832f2bd799ac44008da031e8d8ab52d4f5fbfc2a7e3974e8873bae55b2.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-aca588cca57a85e4d7fcc40c23cd87e57d53d11ca550d78e7e3d5e39e524fcd3.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-b02f8aafc00a7724510772ac41269e368c5bccf03ef7b4590e0ef6fd1a1bf64f.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-b742e17cabe2d64617e9aa64bafc782172f7a4f8023d1b54f952a0fb39f6b2b8.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-b94e349dbc0daec57f8f8f6e9e2dffb06100b1bb2b41d297c9f3b191da37a83d.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-bd9afa22994aba671dbf7b5f89b53c2ee02f53c0442a81265786a6d52d08512f.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-be60554eca98a5899efc6b49785cecd6444a6d39afed9e4a884ce2dbf162012c.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-bf49702b506c9a1650ece1f8e8d9f14834a902f8caefafe30ded55e2790f2188.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-bfcd21ed704cd305db5c17fcdec7d92aa4ac501913c9c9514d8ff92928c0c7e7.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-c3ab694650f49a75b146fb877a92e48c4f20f0d99f70f8ec859fbb763b01a1e5.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-c55542bb9fae544d87fae6f30e0fe8a9088d12075f4442ab4fe2fcd05e472234.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-cb29a6556d35ac630ee0aa885dd7341cf9573bd3efd216ff8a887b87686b03db.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-d0a1f341a89f5f14696b10baa72db9d95551c2b7e5fc67308fd52dc03dd98a92.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-d2ad0a0ca2649c9e4873cfcc1fc66d2d07cc45d0f65c560b06d7b5f592f4fa8a.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-d6cfe78eb635ba0b89ca4021a4dc8182d18ab5b197f30149cd28488eba4c1df5.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-d729b56dea00e49dcdba8cf0001e2811da27351eabe98212db3b589f18fc6f32.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-d9658bfd4e7170b41d03f2ddf2446d0bf54171c0d39d53bf20af2b8437f2ec48.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-dbba7b3d3289425bae711aedbf73fbc3699f857f86f84d95c3b556d05c5658b0.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-dcb96b649d6d63a58efd5d445453a4f3d7869a56ff714b69bedf3d616a0473ca.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-ebd876fbf5362a5900e75bc05f2f11c73c406ef7da4e95097fc6a1c3d1b8bc54.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-eef5cc6bce1cc14eba8f3e68971724ef181e88cffcedd74673615f2026b89a62.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/.sqlx/query-ef56d5fefc5774040d1ee397beadb475f6af02768c22f0e583c74062e2e821ce.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/Cargo.lock +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/Cargo.toml +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/README.md +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/migrations/20241007163501_initial.sql +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/migrations/20241211120039_merge_job_priority.sql +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/migrations/20241211121159_basic_indexes.sql +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/migrations/20241212151105_check_segment_records.sql +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/migrations/20250110145554_in_flight_messages.sql +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_binding/Cargo.toml +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_binding/src/lib.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/Cargo.toml +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/src/fuzzy_query.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/src/lib.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/src/query_io.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/src/query_parser/fuzzy_parser.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/src/query_parser/keyword_parser.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/src/query_parser/stop_words.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/src/query_parser/tokenizer.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/src/query_parser.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/src/reader.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/src/request_types.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/src/resource_indexer.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/src/schema.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/src/search_query.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/src/search_response.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/src/set_query.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/README.md +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/ar.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/az.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/bn.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/ca.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/ch.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/da.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/de.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/el.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/en.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/es.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/eu.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/extract.py +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/fi.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/fr.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/he.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/hu.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/id.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/it.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/kk.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/ne.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/nl.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/no.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/pt.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/ro.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/ru.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/sl.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/sv.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/tg.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/stop_words/tr.json +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/tests/common/mod.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_paragraph/tests/reader.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_protos/Cargo.toml +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_protos/build.py +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_protos/build.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_protos/nidx.proto +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_protos/nodereader.proto +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_protos/noderesources.proto +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_protos/nodewriter.proto +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_protos/src/lib.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_relation/Cargo.toml +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_relation/src/graph_collector.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_relation/src/graph_query_parser.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_relation/src/io_maps.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_relation/src/lib.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_relation/src/reader.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_relation/src/resource_indexer.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_relation/src/schema.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_relation/src/top_unique_n.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_relation/tests/common/mod.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_relation/tests/test_graph_query_parser_search.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_relation/tests/test_graph_search.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_relation/tests/test_writer.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_tantivy/Cargo.toml +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_tantivy/src/index_reader.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_tantivy/src/lib.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_tantivy/src/utils.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_tests/Cargo.toml +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_tests/src/graph.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_tests/src/lib.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_text/Cargo.toml +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_text/src/lib.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_text/src/prefilter.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_text/src/query_io.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_text/src/reader.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_text/src/request_types.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_text/src/resource_indexer.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_text/src/schema.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_text/src/search_query.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_text/tests/common/mod.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_text/tests/test_deletions.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_text/tests/test_flow.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_text/tests/test_search.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_text/tests/test_streaming.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_types/Cargo.toml +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_types/src/lib.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_types/src/prefilter.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_types/src/query_language.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/Cargo.toml +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/config.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/data_store/v1/node.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/data_store/v1/trie.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/data_store/v1/trie_ram.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/data_types.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/formula.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/hnsw/params.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/indexer.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/inverted_index/fst_index.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/inverted_index/map.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/inverted_index.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/multivector.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/query_io.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/request_types.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/searcher.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/segment/tests.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/utils.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/vector_types/dense_f32.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/vector_types/mod.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/tests/common/mod.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/tests/test_basic_search.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/tests/test_hidden.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/tests/test_maxsim.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/api/grpc.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/api/shards.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/api.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/control.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/errors.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/grpc_server.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/import_export.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/indexer.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/lib.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/main.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/metadata/deletion.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/metadata/index.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/metadata/index_request.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/metadata/merge_job.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/metadata/segment.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/metadata/shard.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/metadata.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/metrics.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/scheduler/audit_task.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/scheduler/log_merge.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/scheduler/merge_task.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/scheduler/metrics_task.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/scheduler/purge_tasks.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/scheduler/vector_merge.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/scheduler.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/searcher/grpc.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/searcher/index_cache.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/searcher/query_language.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/searcher/query_planner.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/searcher/shard_search.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/searcher/shard_selector.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/searcher/shard_suggest.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/searcher/streams.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/searcher/sync.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/searcher.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/segment_store.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/settings.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/telemetry/duration_layer.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/telemetry/log_format.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/telemetry/middleware.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/telemetry.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/tool.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/utilization_tracker.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/src/worker.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/tests/common/mod.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/tests/common/services.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/tests/test_date_range_search.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/tests/test_search_filtering.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/tests/test_search_relations.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/tests/test_search_sorting.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/tests/test_searcher_cluster.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/tests/test_security_search.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/tests/test_shards.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/tests/test_shards_api.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/tests/test_suggest.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/tests/test_synced_searcher.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/tests/test_vector_normalization.rs +0 -0
- {nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/tests/test_vectorsets.rs +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nidx_binding
|
|
3
|
-
Version: 6.8.1.
|
|
3
|
+
Version: 6.8.1.post515
|
|
4
4
|
Classifier: Programming Language :: Rust
|
|
5
5
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
6
6
|
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
@@ -10,7 +10,7 @@ build-backend = "pdm.backend"
|
|
|
10
10
|
|
|
11
11
|
[project]
|
|
12
12
|
name = "nidx_protos"
|
|
13
|
-
version = "6.8.1.
|
|
13
|
+
version = "6.8.1.post515"
|
|
14
14
|
license = "AGPL-3.0-or-later"
|
|
15
15
|
description = "Protobuf definitions for nucliadb/nidx"
|
|
16
16
|
authors = [{ name = "Nuclia", email = "nucliadb@nuclia.com" }]
|
{nidx_binding-6.8.1.post513 → nidx_binding-6.8.1.post515}/nidx_vector/src/data_store/v1/store.rs
RENAMED
|
@@ -67,7 +67,7 @@ impl<T: AsRef<[u8]>> IntoBuffer for T {
|
|
|
67
67
|
// O(1)
|
|
68
68
|
// Returns how many elements are in x, alive or deleted.
|
|
69
69
|
pub fn stored_elements(x: &[u8]) -> usize {
|
|
70
|
-
usize_from_slice_le(&x[..
|
|
70
|
+
usize_from_slice_le(&x[..USIZE_LEN])
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
// O(1)
|
|
@@ -230,7 +230,7 @@ mod tests {
|
|
|
230
230
|
|
|
231
231
|
let buf_map = unsafe { memmap2::Mmap::map(&buf).unwrap() };
|
|
232
232
|
let no_values = stored_elements(&buf_map);
|
|
233
|
-
assert_eq!(no_values, expected.len());
|
|
233
|
+
assert_eq!(no_values as usize, expected.len());
|
|
234
234
|
for (id, expected_value) in expected.iter().enumerate() {
|
|
235
235
|
let actual_value = get_value(&buf_map, id);
|
|
236
236
|
assert_eq!(actual_value.key(), expected_value.key);
|
|
@@ -275,7 +275,7 @@ mod tests {
|
|
|
275
275
|
.map(|s| s.key().parse().unwrap())
|
|
276
276
|
.collect();
|
|
277
277
|
|
|
278
|
-
assert_eq!(number_of_elements, values.len());
|
|
278
|
+
assert_eq!(number_of_elements as usize, values.len());
|
|
279
279
|
assert_eq!(values.len(), expected.len());
|
|
280
280
|
assert!(values.iter().all(|i| expected.contains(i)));
|
|
281
281
|
}
|
|
@@ -317,7 +317,7 @@ mod tests {
|
|
|
317
317
|
.map(|s| s.key().parse().unwrap())
|
|
318
318
|
.collect();
|
|
319
319
|
|
|
320
|
-
assert_eq!(number_of_elements, values.len());
|
|
320
|
+
assert_eq!(number_of_elements as usize, values.len());
|
|
321
321
|
assert_eq!(values.len(), expected.len());
|
|
322
322
|
assert!(values.iter().all(|i| expected.contains(i)));
|
|
323
323
|
}
|
|
@@ -358,7 +358,7 @@ mod tests {
|
|
|
358
358
|
.map(|s| s.key().parse().unwrap())
|
|
359
359
|
.collect();
|
|
360
360
|
|
|
361
|
-
assert_eq!(number_of_elements, values.len());
|
|
361
|
+
assert_eq!(number_of_elements as usize, values.len());
|
|
362
362
|
assert_eq!(values.len(), expected.len());
|
|
363
363
|
assert!(values.iter().all(|i| expected.contains(i)));
|
|
364
364
|
}
|
|
@@ -399,7 +399,7 @@ mod tests {
|
|
|
399
399
|
.map(|s| s.key().parse().unwrap())
|
|
400
400
|
.collect();
|
|
401
401
|
|
|
402
|
-
assert_eq!(number_of_elements, values.len());
|
|
402
|
+
assert_eq!(number_of_elements as usize, values.len());
|
|
403
403
|
assert_eq!(values.len(), expected.len());
|
|
404
404
|
assert!(values.iter().all(|i| expected.contains(i)));
|
|
405
405
|
}
|
|
@@ -440,7 +440,7 @@ mod tests {
|
|
|
440
440
|
.map(|s| s.key().parse().unwrap())
|
|
441
441
|
.collect();
|
|
442
442
|
|
|
443
|
-
assert_eq!(number_of_elements, values.len());
|
|
443
|
+
assert_eq!(number_of_elements as usize, values.len());
|
|
444
444
|
assert_eq!(values.len(), expected.len());
|
|
445
445
|
assert!(values.iter().all(|i| expected.contains(i)));
|
|
446
446
|
}
|
|
@@ -482,7 +482,7 @@ mod tests {
|
|
|
482
482
|
.map(|s| s.key().parse().unwrap())
|
|
483
483
|
.collect();
|
|
484
484
|
|
|
485
|
-
assert_eq!(number_of_elements, values.len());
|
|
485
|
+
assert_eq!(number_of_elements as usize, values.len());
|
|
486
486
|
assert_eq!(values.len(), expected.len());
|
|
487
487
|
assert!(values.iter().all(|i| expected.contains(i)));
|
|
488
488
|
}
|
|
@@ -46,11 +46,11 @@ impl DataStore for DataStoreV1 {
|
|
|
46
46
|
self.nodes.len()
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
fn stored_paragraph_count(&self) ->
|
|
50
|
-
store::stored_elements(&self.nodes)
|
|
49
|
+
fn stored_paragraph_count(&self) -> u32 {
|
|
50
|
+
store::stored_elements(&self.nodes) as u32
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
fn stored_vector_count(&self) ->
|
|
53
|
+
fn stored_vector_count(&self) -> u32 {
|
|
54
54
|
self.stored_paragraph_count()
|
|
55
55
|
}
|
|
56
56
|
|
|
@@ -85,8 +85,8 @@ impl VectorStore {
|
|
|
85
85
|
self.data.len()
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
pub fn stored_elements(&self) ->
|
|
89
|
-
self.data.len() / (self.record_len_bytes)
|
|
88
|
+
pub fn stored_elements(&self) -> u32 {
|
|
89
|
+
(self.data.len() / (self.record_len_bytes)) as u32
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
fn record_start(&self, VectorAddr(addr): VectorAddr) -> usize {
|
|
@@ -91,11 +91,11 @@ impl DataStore for DataStoreV2 {
|
|
|
91
91
|
self.vectors.size_bytes() + self.paragraphs.size_bytes()
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
fn stored_paragraph_count(&self) ->
|
|
94
|
+
fn stored_paragraph_count(&self) -> u32 {
|
|
95
95
|
self.paragraphs.stored_elements()
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
-
fn stored_vector_count(&self) ->
|
|
98
|
+
fn stored_vector_count(&self) -> u32 {
|
|
99
99
|
self.vectors.stored_elements()
|
|
100
100
|
}
|
|
101
101
|
|
|
@@ -90,8 +90,8 @@ impl ParagraphRef<'_> {
|
|
|
90
90
|
|
|
91
91
|
pub trait DataStore: Sync + Send {
|
|
92
92
|
fn size_bytes(&self) -> usize;
|
|
93
|
-
fn stored_paragraph_count(&self) ->
|
|
94
|
-
fn stored_vector_count(&self) ->
|
|
93
|
+
fn stored_paragraph_count(&self) -> u32;
|
|
94
|
+
fn stored_vector_count(&self) -> u32;
|
|
95
95
|
fn get_paragraph(&self, id: ParagraphAddr) -> ParagraphRef;
|
|
96
96
|
fn get_vector(&self, id: VectorAddr) -> VectorRef;
|
|
97
97
|
fn will_need(&self, id: VectorAddr);
|
|
@@ -99,5 +99,5 @@ pub trait DataStore: Sync + Send {
|
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
pub fn iter_paragraphs(data_store: &impl DataStore) -> impl Iterator<Item = ParagraphAddr> {
|
|
102
|
-
(0..data_store.stored_paragraph_count()
|
|
102
|
+
(0..data_store.stored_paragraph_count()).map(ParagraphAddr)
|
|
103
103
|
}
|
|
@@ -46,9 +46,9 @@
|
|
|
46
46
|
use std::collections::HashMap;
|
|
47
47
|
use std::io;
|
|
48
48
|
|
|
49
|
-
use super::Address;
|
|
50
49
|
use super::ops_hnsw::{Hnsw, Layer};
|
|
51
50
|
use super::ram_hnsw::{Edge, EntryPoint, RAMHnsw, RAMLayer};
|
|
51
|
+
use crate::VectorAddr;
|
|
52
52
|
use crate::data_types::usize_utils::*;
|
|
53
53
|
|
|
54
54
|
const EDGE_LEN: usize = 4;
|
|
@@ -68,16 +68,16 @@ pub struct DiskLayer<'a> {
|
|
|
68
68
|
|
|
69
69
|
impl<'a> Layer for &'a DiskLayer<'a> {
|
|
70
70
|
type EdgeIt = EdgeIter<'a>;
|
|
71
|
-
fn get_out_edges(&self,
|
|
72
|
-
let node = DiskHnsw::get_node(self.hnsw,
|
|
71
|
+
fn get_out_edges(&self, address: VectorAddr) -> Self::EdgeIt {
|
|
72
|
+
let node = DiskHnsw::get_node(self.hnsw, address);
|
|
73
73
|
DiskHnsw::get_out_edges(node, self.layer)
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
impl<'a> Layer for DiskLayer<'a> {
|
|
78
78
|
type EdgeIt = EdgeIter<'a>;
|
|
79
|
-
fn get_out_edges(&self,
|
|
80
|
-
let node = DiskHnsw::get_node(self.hnsw,
|
|
79
|
+
fn get_out_edges(&self, address: VectorAddr) -> Self::EdgeIt {
|
|
80
|
+
let node = DiskHnsw::get_node(self.hnsw, address);
|
|
81
81
|
DiskHnsw::get_out_edges(node, self.layer)
|
|
82
82
|
}
|
|
83
83
|
}
|
|
@@ -97,30 +97,30 @@ pub struct EdgeIter<'a> {
|
|
|
97
97
|
buf: &'a [u8],
|
|
98
98
|
}
|
|
99
99
|
impl Iterator for EdgeIter<'_> {
|
|
100
|
-
type Item = (
|
|
100
|
+
type Item = (VectorAddr, Edge);
|
|
101
101
|
fn next(&mut self) -> Option<Self::Item> {
|
|
102
102
|
if self.buf.len() == self.crnt {
|
|
103
103
|
None
|
|
104
104
|
} else {
|
|
105
105
|
let buf = self.buf;
|
|
106
106
|
let mut crnt = self.crnt;
|
|
107
|
-
let
|
|
107
|
+
let node_addr = usize_from_slice_le(&buf[crnt..(crnt + NODE_LEN)]);
|
|
108
108
|
crnt += USIZE_LEN;
|
|
109
109
|
let edge = f32_from_le_bytes(&buf[crnt..(crnt + EDGE_LEN)]);
|
|
110
110
|
crnt += EDGE_LEN;
|
|
111
111
|
self.crnt = crnt;
|
|
112
|
-
Some((
|
|
112
|
+
Some((VectorAddr(node_addr as u32), edge))
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
116
|
|
|
117
117
|
pub struct DiskHnsw;
|
|
118
118
|
impl DiskHnsw {
|
|
119
|
-
fn serialize_node<W>(mut buf: W, offset: usize,
|
|
119
|
+
fn serialize_node<W>(mut buf: W, offset: usize, node_addr: u32, hnsw: &RAMHnsw) -> io::Result<usize>
|
|
120
120
|
where
|
|
121
121
|
W: io::Write,
|
|
122
122
|
{
|
|
123
|
-
let node =
|
|
123
|
+
let node = VectorAddr(node_addr);
|
|
124
124
|
let mut length = offset;
|
|
125
125
|
let mut indexing = HashMap::new();
|
|
126
126
|
for layer in 0..hnsw.no_layers() {
|
|
@@ -129,7 +129,7 @@ impl DiskHnsw {
|
|
|
129
129
|
buf.write_all(&no_edges.to_le_bytes())?;
|
|
130
130
|
length += USIZE_LEN;
|
|
131
131
|
for (cnx, edge) in hnsw.get_layer(layer).get_out_edges(node) {
|
|
132
|
-
buf.write_all(&cnx.0.to_le_bytes())?;
|
|
132
|
+
buf.write_all(&(cnx.0 as usize).to_le_bytes())?;
|
|
133
133
|
buf.write_all(&edge.to_le_bytes())?;
|
|
134
134
|
length += CNX_LEN;
|
|
135
135
|
}
|
|
@@ -157,7 +157,7 @@ impl DiskHnsw {
|
|
|
157
157
|
buf: &node[cnx_start..cnx_end],
|
|
158
158
|
}
|
|
159
159
|
}
|
|
160
|
-
pub fn serialize_into<W: io::Write>(mut buf: W, no_nodes:
|
|
160
|
+
pub fn serialize_into<W: io::Write>(mut buf: W, no_nodes: u32, hnsw: RAMHnsw) -> io::Result<()> {
|
|
161
161
|
if let Some(entry_point) = hnsw.entry_point {
|
|
162
162
|
let mut length = 0;
|
|
163
163
|
let mut nodes_end = vec![];
|
|
@@ -171,7 +171,7 @@ impl DiskHnsw {
|
|
|
171
171
|
}
|
|
172
172
|
let EntryPoint { node, layer } = entry_point;
|
|
173
173
|
buf.write_all(&layer.to_le_bytes())?;
|
|
174
|
-
buf.write_all(&node.0.to_le_bytes())?;
|
|
174
|
+
buf.write_all(&(node.0 as usize).to_le_bytes())?;
|
|
175
175
|
let _length = length + 2 * USIZE_LEN;
|
|
176
176
|
buf.flush()?;
|
|
177
177
|
}
|
|
@@ -182,10 +182,10 @@ impl DiskHnsw {
|
|
|
182
182
|
if !hnsw.is_empty() {
|
|
183
183
|
let node_start = hnsw.len() - USIZE_LEN;
|
|
184
184
|
let layer_start = node_start - USIZE_LEN;
|
|
185
|
-
let
|
|
185
|
+
let node_addr = usize_from_slice_le(&hnsw[node_start..(node_start + NODE_LEN)]);
|
|
186
186
|
let layer = usize_from_slice_le(&hnsw[layer_start..(layer_start + USIZE_LEN)]);
|
|
187
187
|
Some(EntryPoint {
|
|
188
|
-
node:
|
|
188
|
+
node: VectorAddr(node_addr as u32),
|
|
189
189
|
layer,
|
|
190
190
|
})
|
|
191
191
|
} else {
|
|
@@ -194,12 +194,12 @@ impl DiskHnsw {
|
|
|
194
194
|
}
|
|
195
195
|
// hnsw must be serialized using MHnsw, may have trailing bytes at the start.
|
|
196
196
|
// The returned node will have trailing bytes at the start.
|
|
197
|
-
pub fn get_node(hnsw: &[u8],
|
|
197
|
+
pub fn get_node(hnsw: &[u8], address: VectorAddr) -> &[u8] {
|
|
198
198
|
let indexing_end = hnsw.len() - (2 * USIZE_LEN);
|
|
199
199
|
// node + 1 since the layers are stored in reverse order.
|
|
200
200
|
// [n3, n2, n1, n0, end] Since we have the position of end, the node i is
|
|
201
201
|
// i + 1 positions to its left.
|
|
202
|
-
let pos = indexing_end - ((
|
|
202
|
+
let pos = indexing_end - ((address.0 as usize + 1) * USIZE_LEN);
|
|
203
203
|
let node_end = usize_from_slice_le(&hnsw[pos..(pos + USIZE_LEN)]);
|
|
204
204
|
&hnsw[..node_end]
|
|
205
205
|
}
|
|
@@ -213,9 +213,9 @@ impl DiskHnsw {
|
|
|
213
213
|
let end = hnsw.len();
|
|
214
214
|
ram.entry_point = Self::get_entry_point(hnsw);
|
|
215
215
|
|
|
216
|
-
let mut node_index = 0;
|
|
216
|
+
let mut node_index: u32 = 0;
|
|
217
217
|
loop {
|
|
218
|
-
let indexing_pos = end - (node_index + 3) * USIZE_LEN;
|
|
218
|
+
let indexing_pos = end - (node_index as usize + 3) * USIZE_LEN;
|
|
219
219
|
let node_end = usize_from_slice_le(&hnsw[indexing_pos..indexing_pos + USIZE_LEN]);
|
|
220
220
|
let mut layer_index = 0;
|
|
221
221
|
loop {
|
|
@@ -231,7 +231,7 @@ impl DiskHnsw {
|
|
|
231
231
|
let cnx_end = cnx_start + number_edges * CNX_LEN;
|
|
232
232
|
|
|
233
233
|
if number_edges > 0 {
|
|
234
|
-
let ram_edges = ram.layers[layer_index].out.entry(
|
|
234
|
+
let ram_edges = ram.layers[layer_index].out.entry(VectorAddr(node_index)).or_default();
|
|
235
235
|
let edges = EdgeIter {
|
|
236
236
|
crnt: 0,
|
|
237
237
|
buf: &hnsw[cnx_start..cnx_end],
|
|
@@ -261,11 +261,11 @@ impl DiskHnsw {
|
|
|
261
261
|
mod tests {
|
|
262
262
|
use super::*;
|
|
263
263
|
use crate::hnsw::ram_hnsw::RAMLayer;
|
|
264
|
-
fn layer_check<L: Layer>(buf: L, no_nodes:
|
|
264
|
+
fn layer_check<L: Layer>(buf: L, no_nodes: u32, cnx: &[Vec<(VectorAddr, Edge)>]) {
|
|
265
265
|
let no_cnx = vec![];
|
|
266
266
|
for i in 0..no_nodes {
|
|
267
|
-
let expected = cnx.get(i).unwrap_or(&no_cnx);
|
|
268
|
-
let got: Vec<_> = buf.get_out_edges(
|
|
267
|
+
let expected = cnx.get(i as usize).unwrap_or(&no_cnx);
|
|
268
|
+
let got: Vec<_> = buf.get_out_edges(VectorAddr(i)).collect();
|
|
269
269
|
assert_eq!(expected, &got);
|
|
270
270
|
}
|
|
271
271
|
}
|
|
@@ -282,23 +282,35 @@ mod tests {
|
|
|
282
282
|
fn hnsw_test() {
|
|
283
283
|
let no_nodes = 3;
|
|
284
284
|
let cnx0 = vec![
|
|
285
|
-
vec![(
|
|
286
|
-
vec![(
|
|
287
|
-
vec![(
|
|
285
|
+
vec![(VectorAddr(1), 1.0)],
|
|
286
|
+
vec![(VectorAddr(2), 2.0)],
|
|
287
|
+
vec![(VectorAddr(3), 3.0)],
|
|
288
288
|
];
|
|
289
289
|
let layer0 = RAMLayer {
|
|
290
|
-
out: cnx0
|
|
290
|
+
out: cnx0
|
|
291
|
+
.iter()
|
|
292
|
+
.enumerate()
|
|
293
|
+
.map(|(i, c)| (VectorAddr(i as u32), c.clone()))
|
|
294
|
+
.collect(),
|
|
291
295
|
};
|
|
292
|
-
let cnx1 = vec![vec![(
|
|
296
|
+
let cnx1 = vec![vec![(VectorAddr(1), 4.0)], vec![(VectorAddr(2), 5.0)]];
|
|
293
297
|
let layer1 = RAMLayer {
|
|
294
|
-
out: cnx1
|
|
298
|
+
out: cnx1
|
|
299
|
+
.iter()
|
|
300
|
+
.enumerate()
|
|
301
|
+
.map(|(i, c)| (VectorAddr(i as u32), c.clone()))
|
|
302
|
+
.collect(),
|
|
295
303
|
};
|
|
296
|
-
let cnx2 = vec![vec![(
|
|
304
|
+
let cnx2 = vec![vec![(VectorAddr(1), 6.0)]];
|
|
297
305
|
let layer2 = RAMLayer {
|
|
298
|
-
out: cnx2
|
|
306
|
+
out: cnx2
|
|
307
|
+
.iter()
|
|
308
|
+
.enumerate()
|
|
309
|
+
.map(|(i, c)| (VectorAddr(i as u32), c.clone()))
|
|
310
|
+
.collect(),
|
|
299
311
|
};
|
|
300
312
|
let entry_point = EntryPoint {
|
|
301
|
-
node:
|
|
313
|
+
node: VectorAddr(0),
|
|
302
314
|
layer: 2,
|
|
303
315
|
};
|
|
304
316
|
let mut hnsw = RAMHnsw::new();
|
|
@@ -320,23 +332,35 @@ mod tests {
|
|
|
320
332
|
fn hnsw_deserialize_test() {
|
|
321
333
|
let no_nodes = 3;
|
|
322
334
|
let cnx0 = [
|
|
323
|
-
vec![(
|
|
324
|
-
vec![(
|
|
325
|
-
vec![(
|
|
335
|
+
vec![(VectorAddr(1), 1.0)],
|
|
336
|
+
vec![(VectorAddr(2), 2.0)],
|
|
337
|
+
vec![(VectorAddr(3), 3.0)],
|
|
326
338
|
];
|
|
327
339
|
let layer0 = RAMLayer {
|
|
328
|
-
out: cnx0
|
|
340
|
+
out: cnx0
|
|
341
|
+
.iter()
|
|
342
|
+
.enumerate()
|
|
343
|
+
.map(|(i, c)| (VectorAddr(i as u32), c.clone()))
|
|
344
|
+
.collect(),
|
|
329
345
|
};
|
|
330
|
-
let cnx1 = [vec![(
|
|
346
|
+
let cnx1 = [vec![(VectorAddr(1), 4.0)], vec![(VectorAddr(2), 5.0)]];
|
|
331
347
|
let layer1 = RAMLayer {
|
|
332
|
-
out: cnx1
|
|
348
|
+
out: cnx1
|
|
349
|
+
.iter()
|
|
350
|
+
.enumerate()
|
|
351
|
+
.map(|(i, c)| (VectorAddr(i as u32), c.clone()))
|
|
352
|
+
.collect(),
|
|
333
353
|
};
|
|
334
|
-
let cnx2 = [vec![(
|
|
354
|
+
let cnx2 = [vec![(VectorAddr(1), 6.0)]];
|
|
335
355
|
let layer2 = RAMLayer {
|
|
336
|
-
out: cnx2
|
|
356
|
+
out: cnx2
|
|
357
|
+
.iter()
|
|
358
|
+
.enumerate()
|
|
359
|
+
.map(|(i, c)| (VectorAddr(i as u32), c.clone()))
|
|
360
|
+
.collect(),
|
|
337
361
|
};
|
|
338
362
|
let entry_point = EntryPoint {
|
|
339
|
-
node:
|
|
363
|
+
node: VectorAddr(0),
|
|
340
364
|
layer: 2,
|
|
341
365
|
};
|
|
342
366
|
let mut hnsw = RAMHnsw::new();
|
|
@@ -27,26 +27,26 @@ use rustc_hash::FxHashSet;
|
|
|
27
27
|
use std::cmp::{Ordering, Reverse};
|
|
28
28
|
use std::collections::{BinaryHeap, HashMap, HashSet, VecDeque};
|
|
29
29
|
|
|
30
|
-
use crate::ParagraphAddr;
|
|
31
30
|
use crate::inverted_index::FilterBitSet;
|
|
31
|
+
use crate::{ParagraphAddr, VectorAddr};
|
|
32
32
|
|
|
33
33
|
use super::params;
|
|
34
34
|
use super::*;
|
|
35
35
|
|
|
36
36
|
/// Implementors of this trait can guide the hnsw search
|
|
37
37
|
pub trait DataRetriever: std::marker::Sync {
|
|
38
|
-
fn similarity(&self, x:
|
|
39
|
-
fn paragraph(&self, x:
|
|
40
|
-
fn get_vector(&self, x:
|
|
38
|
+
fn similarity(&self, x: VectorAddr, y: VectorAddr) -> f32;
|
|
39
|
+
fn paragraph(&self, x: VectorAddr) -> ParagraphAddr;
|
|
40
|
+
fn get_vector(&self, x: VectorAddr) -> &[u8];
|
|
41
41
|
/// Embeddings with smaller similarity should not be considered.
|
|
42
42
|
fn min_score(&self) -> f32;
|
|
43
|
-
fn will_need(&self, x:
|
|
43
|
+
fn will_need(&self, x: VectorAddr);
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
/// Implementors of this trait are layers of an HNSW where a nearest neighbour search can be ran.
|
|
47
47
|
pub trait Layer {
|
|
48
|
-
type EdgeIt: Iterator<Item = (
|
|
49
|
-
fn get_out_edges(&self, node:
|
|
48
|
+
type EdgeIt: Iterator<Item = (VectorAddr, Edge)>;
|
|
49
|
+
fn get_out_edges(&self, node: VectorAddr) -> Self::EdgeIt;
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
/// Implementors of this trait are an HNSW where search can be ran.
|
|
@@ -56,11 +56,11 @@ pub trait Hnsw {
|
|
|
56
56
|
fn get_layer(&self, i: usize) -> Self::L;
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
/// Tuples ([`
|
|
59
|
+
/// Tuples ([`VectorAddr`], [`f32`]) can not be stored in a [`BinaryHeap`] because [`f32`] does not
|
|
60
60
|
/// implement [`Ord`]. [`Cnx`] is an application of the new-type pattern that lets us bypass the
|
|
61
61
|
/// orphan rules and store such tuples in a [`BinaryHeap`].
|
|
62
62
|
#[derive(Clone, Copy)]
|
|
63
|
-
pub struct Cnx(pub
|
|
63
|
+
pub struct Cnx(pub VectorAddr, pub f32);
|
|
64
64
|
impl Eq for Cnx {}
|
|
65
65
|
impl Ord for Cnx {
|
|
66
66
|
fn cmp(&self, other: &Self) -> Ordering {
|
|
@@ -79,7 +79,7 @@ impl PartialOrd for Cnx {
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
/// A list of neighbours containing a pointer to the embedding and their similarity.
|
|
82
|
-
pub type Neighbours = Vec<(
|
|
82
|
+
pub type Neighbours = Vec<(VectorAddr, f32)>;
|
|
83
83
|
|
|
84
84
|
/// Guides an algorithm to the valid nodes.
|
|
85
85
|
struct NodeFilter<'a, DR> {
|
|
@@ -94,7 +94,7 @@ impl<DR: DataRetriever> NodeFilter<'_, DR> {
|
|
|
94
94
|
self.filter.contains(n)
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
pub fn is_valid(&self, n:
|
|
97
|
+
pub fn is_valid(&self, n: VectorAddr, score: f32) -> bool {
|
|
98
98
|
!score.is_nan()
|
|
99
99
|
// Reject the candidate if we already have a result for the same paragraph
|
|
100
100
|
&& !self.paragraphs.contains(&self.retriever.paragraph(n))
|
|
@@ -104,7 +104,7 @@ impl<DR: DataRetriever> NodeFilter<'_, DR> {
|
|
|
104
104
|
|
|
105
105
|
/// Adds a result so that further candidates with the same vector
|
|
106
106
|
/// or paragraph will get rejected.
|
|
107
|
-
pub fn add_result(&mut self, n:
|
|
107
|
+
pub fn add_result(&mut self, n: VectorAddr) {
|
|
108
108
|
self.paragraphs.insert(self.retriever.paragraph(n));
|
|
109
109
|
self.vec_counter.add(self.retriever.get_vector(n));
|
|
110
110
|
}
|
|
@@ -121,9 +121,9 @@ impl<'a, DR: DataRetriever> HnswOps<'a, DR> {
|
|
|
121
121
|
fn select_neighbours_heuristic(
|
|
122
122
|
&self,
|
|
123
123
|
k_neighbours: usize,
|
|
124
|
-
candidates: Vec<(
|
|
124
|
+
candidates: Vec<(VectorAddr, Edge)>,
|
|
125
125
|
layer: &RAMLayer,
|
|
126
|
-
) -> Vec<(
|
|
126
|
+
) -> Vec<(VectorAddr, Edge)> {
|
|
127
127
|
let mut results = Vec::new();
|
|
128
128
|
let mut discarded = BinaryHeap::new();
|
|
129
129
|
|
|
@@ -163,7 +163,7 @@ impl<'a, DR: DataRetriever> HnswOps<'a, DR> {
|
|
|
163
163
|
|
|
164
164
|
results
|
|
165
165
|
}
|
|
166
|
-
fn similarity(&self, x:
|
|
166
|
+
fn similarity(&self, x: VectorAddr, y: VectorAddr) -> f32 {
|
|
167
167
|
self.retriever.similarity(x, y)
|
|
168
168
|
}
|
|
169
169
|
fn get_random_layer(&mut self) -> usize {
|
|
@@ -173,19 +173,19 @@ impl<'a, DR: DataRetriever> HnswOps<'a, DR> {
|
|
|
173
173
|
}
|
|
174
174
|
fn closest_up_nodes<L: Layer>(
|
|
175
175
|
&'a self,
|
|
176
|
-
entry_points: Vec<
|
|
177
|
-
query:
|
|
176
|
+
entry_points: Vec<VectorAddr>,
|
|
177
|
+
query: VectorAddr,
|
|
178
178
|
layer: L,
|
|
179
179
|
number_of_results: usize,
|
|
180
180
|
mut filter: NodeFilter<'a, DR>,
|
|
181
|
-
) -> Vec<(
|
|
181
|
+
) -> Vec<(VectorAddr, f32)> {
|
|
182
182
|
// We just need to perform BFS, the replacement is the closest node to the actual
|
|
183
183
|
// best solution. This algorithm takes a lazy approach to computing the similarity of
|
|
184
184
|
// candidates.
|
|
185
185
|
|
|
186
186
|
const MAX_VECTORS_TO_PRELOAD: u32 = 20_000;
|
|
187
187
|
let mut results = Vec::new();
|
|
188
|
-
let inner_entry_points_iter = entry_points.iter().map(|
|
|
188
|
+
let inner_entry_points_iter = entry_points.iter().map(|VectorAddr(inner)| *inner as usize);
|
|
189
189
|
let mut visited_nodes: BitSet = BitSet::from_iter(inner_entry_points_iter);
|
|
190
190
|
let mut candidates = VecDeque::from(entry_points);
|
|
191
191
|
|
|
@@ -215,8 +215,8 @@ impl<'a, DR: DataRetriever> HnswOps<'a, DR> {
|
|
|
215
215
|
let mut sorted_out: Vec<_> = layer.get_out_edges(candidate).collect();
|
|
216
216
|
sorted_out.sort_by(|a, b| b.1.total_cmp(&a.1));
|
|
217
217
|
sorted_out.into_iter().for_each(|(new_candidate, _)| {
|
|
218
|
-
if !visited_nodes.contains(new_candidate.0) {
|
|
219
|
-
visited_nodes.insert(new_candidate.0);
|
|
218
|
+
if !visited_nodes.contains(new_candidate.0 as usize) {
|
|
219
|
+
visited_nodes.insert(new_candidate.0 as usize);
|
|
220
220
|
candidates.push_back(new_candidate);
|
|
221
221
|
|
|
222
222
|
if self.preload_nodes && preloaded < MAX_VECTORS_TO_PRELOAD {
|
|
@@ -231,10 +231,10 @@ impl<'a, DR: DataRetriever> HnswOps<'a, DR> {
|
|
|
231
231
|
}
|
|
232
232
|
fn layer_search<L: Layer>(
|
|
233
233
|
&self,
|
|
234
|
-
x:
|
|
234
|
+
x: VectorAddr,
|
|
235
235
|
layer: L,
|
|
236
236
|
k_neighbours: usize,
|
|
237
|
-
entry_points: &[
|
|
237
|
+
entry_points: &[VectorAddr],
|
|
238
238
|
) -> Neighbours {
|
|
239
239
|
let mut visited = FxHashSet::default();
|
|
240
240
|
let mut candidates = BinaryHeap::new();
|
|
@@ -280,7 +280,13 @@ impl<'a, DR: DataRetriever> HnswOps<'a, DR> {
|
|
|
280
280
|
.collect()
|
|
281
281
|
}
|
|
282
282
|
|
|
283
|
-
fn layer_insert(
|
|
283
|
+
fn layer_insert(
|
|
284
|
+
&self,
|
|
285
|
+
x: VectorAddr,
|
|
286
|
+
layer: &mut RAMLayer,
|
|
287
|
+
entry_points: &[VectorAddr],
|
|
288
|
+
mmax: usize,
|
|
289
|
+
) -> Vec<VectorAddr> {
|
|
284
290
|
use params::*;
|
|
285
291
|
let neighbours = self.layer_search::<&RAMLayer>(x, layer, ef_construction(), entry_points);
|
|
286
292
|
let neighbours = self.select_neighbours_heuristic(m(), neighbours, layer);
|
|
@@ -304,7 +310,7 @@ impl<'a, DR: DataRetriever> HnswOps<'a, DR> {
|
|
|
304
310
|
}
|
|
305
311
|
result
|
|
306
312
|
}
|
|
307
|
-
pub fn insert(&mut self, x:
|
|
313
|
+
pub fn insert(&mut self, x: VectorAddr, hnsw: &mut RAMHnsw) {
|
|
308
314
|
match hnsw.entry_point {
|
|
309
315
|
None => {
|
|
310
316
|
let top_level = self.get_random_layer();
|
|
@@ -331,7 +337,7 @@ impl<'a, DR: DataRetriever> HnswOps<'a, DR> {
|
|
|
331
337
|
|
|
332
338
|
pub fn search<H: Hnsw>(
|
|
333
339
|
&self,
|
|
334
|
-
query:
|
|
340
|
+
query: VectorAddr,
|
|
335
341
|
hnsw: H,
|
|
336
342
|
k_neighbours: usize,
|
|
337
343
|
with_filter: &FilterBitSet,
|
|
@@ -21,13 +21,15 @@
|
|
|
21
21
|
use ops_hnsw::{Hnsw, Layer};
|
|
22
22
|
use rustc_hash::FxHashMap;
|
|
23
23
|
|
|
24
|
+
use crate::VectorAddr;
|
|
25
|
+
|
|
24
26
|
use super::*;
|
|
25
27
|
|
|
26
|
-
const NO_EDGES: [(
|
|
28
|
+
const NO_EDGES: [(VectorAddr, Edge); 0] = [];
|
|
27
29
|
|
|
28
30
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
|
29
31
|
pub struct EntryPoint {
|
|
30
|
-
pub node:
|
|
32
|
+
pub node: VectorAddr,
|
|
31
33
|
pub layer: usize,
|
|
32
34
|
}
|
|
33
35
|
|
|
@@ -35,11 +37,11 @@ pub type Edge = f32;
|
|
|
35
37
|
|
|
36
38
|
#[derive(Default, Clone)]
|
|
37
39
|
pub struct RAMLayer {
|
|
38
|
-
pub out: FxHashMap<
|
|
40
|
+
pub out: FxHashMap<VectorAddr, Vec<(VectorAddr, Edge)>>,
|
|
39
41
|
}
|
|
40
42
|
|
|
41
43
|
impl RAMLayer {
|
|
42
|
-
fn out_edges(&self, node:
|
|
44
|
+
fn out_edges(&self, node: VectorAddr) -> std::iter::Copied<std::slice::Iter<'_, (VectorAddr, Edge)>> {
|
|
43
45
|
self.out
|
|
44
46
|
.get(&node)
|
|
45
47
|
.map_or_else(|| NO_EDGES.iter().copied(), |out| out.iter().copied())
|
|
@@ -47,21 +49,21 @@ impl RAMLayer {
|
|
|
47
49
|
pub fn new() -> RAMLayer {
|
|
48
50
|
RAMLayer::default()
|
|
49
51
|
}
|
|
50
|
-
pub fn add_node(&mut self, node:
|
|
52
|
+
pub fn add_node(&mut self, node: VectorAddr) {
|
|
51
53
|
self.out.entry(node).or_default();
|
|
52
54
|
}
|
|
53
|
-
pub fn add_edge(&mut self, from:
|
|
55
|
+
pub fn add_edge(&mut self, from: VectorAddr, edge: Edge, to: VectorAddr) {
|
|
54
56
|
if let Some(edges) = self.out.get_mut(&from) {
|
|
55
57
|
edges.push((to, edge))
|
|
56
58
|
}
|
|
57
59
|
}
|
|
58
|
-
pub fn take_out_edges(&mut self, x:
|
|
60
|
+
pub fn take_out_edges(&mut self, x: VectorAddr) -> Vec<(VectorAddr, Edge)> {
|
|
59
61
|
self.out.get_mut(&x).map(std::mem::take).unwrap_or_default()
|
|
60
62
|
}
|
|
61
|
-
pub fn no_out_edges(&self, node:
|
|
63
|
+
pub fn no_out_edges(&self, node: VectorAddr) -> usize {
|
|
62
64
|
self.out.get(&node).map_or(0, |v| v.len())
|
|
63
65
|
}
|
|
64
|
-
pub fn first(&self) -> Option<
|
|
66
|
+
pub fn first(&self) -> Option<VectorAddr> {
|
|
65
67
|
self.out.keys().next().cloned()
|
|
66
68
|
}
|
|
67
69
|
pub fn is_empty(&self) -> bool {
|
|
@@ -78,7 +80,7 @@ impl RAMHnsw {
|
|
|
78
80
|
pub fn new() -> RAMHnsw {
|
|
79
81
|
Self::default()
|
|
80
82
|
}
|
|
81
|
-
pub fn increase_layers_with(&mut self, x:
|
|
83
|
+
pub fn increase_layers_with(&mut self, x: VectorAddr, level: usize) -> &mut Self {
|
|
82
84
|
while self.layers.len() <= level {
|
|
83
85
|
let mut new_layer = RAMLayer::new();
|
|
84
86
|
new_layer.add_node(x);
|
|
@@ -109,8 +111,8 @@ impl RAMHnsw {
|
|
|
109
111
|
}
|
|
110
112
|
|
|
111
113
|
impl<'a> Layer for &'a RAMLayer {
|
|
112
|
-
type EdgeIt = std::iter::Copied<std::slice::Iter<'a, (
|
|
113
|
-
fn get_out_edges(&self, node:
|
|
114
|
+
type EdgeIt = std::iter::Copied<std::slice::Iter<'a, (VectorAddr, Edge)>>;
|
|
115
|
+
fn get_out_edges(&self, node: VectorAddr) -> Self::EdgeIt {
|
|
114
116
|
self.out_edges(node)
|
|
115
117
|
}
|
|
116
118
|
}
|