nidx-binding 6.9.4.post638__tar.gz → 6.9.4.post643__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.9.4.post638 → nidx_binding-6.9.4.post643}/Cargo.lock +3 -3
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/PKG-INFO +1 -1
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_protos/pyproject.toml +1 -1
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/data_types.rs +2 -6
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/hnsw/build.rs +2 -2
- nidx_binding-6.9.4.post638/nidx_vector/src/hnsw/disk_hnsw.rs → nidx_binding-6.9.4.post643/nidx_vector/src/hnsw/disk/v1.rs +108 -62
- nidx_binding-6.9.4.post643/nidx_vector/src/hnsw/disk/v2.rs +459 -0
- nidx_binding-6.9.4.post643/nidx_vector/src/hnsw/disk.rs +114 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/hnsw/ram_hnsw.rs +11 -6
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/hnsw/search.rs +6 -7
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/hnsw.rs +2 -2
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/segment.rs +21 -65
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/pyproject.toml +1 -1
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.config/nextest.toml +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-0cfce9b29547f8f5bafa6e440f86103be7b8c4ad2fd92db9ac223f4efbe23d10.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-1a561eed00f3dbe868bf5030059793300209179dc8fb73e4b57a54b5e81262fe.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-1d3fca2682e25a01143da92285297f134a6a105a96f64d87e0db3abb219855e4.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-249b3b57c27a71baa823f1fe0f0bba9c9af36f61c28f731e58beea60ec48e687.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-24cb6b683daa42d7125f862e25943ab4be7bf275cd8739f8da4859d701795e1a.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-263c8fce6db5b03bbd012fafdba6943cbee6ed7eb8976cdef4f5b01dde7ca6fd.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-2a5d92fb1638df830a4477a7cdf24e6db6b43034b7bbe74fdfb63e8afe2c4071.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-2b065a363f58caed60e3706603c1260dbf5a4c795604a5b68edda22eb07fec1b.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-3fc3cb39934683de8cd475ce1368c8373453eb1e01f81587d66b9d14b109ce6e.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-48f33b77b7c1633467b0b2efcaa1d3c207e7757e4f1d83b40d15e6ca365f7771.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-4ae09f2c08e2f324bee01bb8487a8f37678a1c5e9d327339235c50d4921a8949.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-4d7a76fa413c9ef0ce2a47ac7bb7e01d3e6a2aabded9487d21010a53efee8852.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-4fcbdd6657c7dc9b60b3a563dd41711b3dbcf72ce063427b7a01f8cddf34c244.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-577109ac00ccfbd38ecaccab94116f2f46a4caf5612afa372cded197123c1e08.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-5db25f97d8578d6d78f2f6bd4b72cc82a9b1b82805c6422d967ac63b20d99db4.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-5ec3233a3a23e926055056d46bdde17836a633066dbb5f349502648cd3ea9a60.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-66edb6ea424d8681927dcddb6bac5f1239175f4775d1f40417ba15054b0c6f19.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-6f9c6d201c1b5712efb68c363bffd3e0169c11f2a8f925e8cd4e8808599ff7b4.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-733c3ebacc86f444bf5e2dd79ade660c291e88a00fc09b722f6e2e191545874c.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-7a3bf27c330c468a596e8a297cf7d8b192e31e67ecc5177c1267f579e8e247c7.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-7a7e59e47b30b12237511fd3d7da2d17b0471ad2b006af48d6a6f587c779692b.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-7dcbb33312cc9f11ae3a6d73b1ace017a9f19a8bf8f10304fc57977c8efeadff.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-7efa7c0d747afc4b6aed0586ff846c27839c3213ff7ee9f30c89b0d0f17e60e3.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-8493140d788604d498a4e48da4158708572ccc9d60185290a00d549cc84533db.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-8493bb0059b013eaca42fd10cd7d04f0d06a8acaed379eff0d23f3229edde9ee.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-87996b3d6c7a2195438d7038015b06949102bce8c7b8cd8db1f83aaf23cbe489.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-8d33717587c6ee8f5fc339a80b1212a73d6c03e45856b1d55457fc8074709dd0.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-8f096d8171b89f9615d18f95d696dc9e4fb3674e103161a713cdc806f7a68506.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-917732a56ee04bf3a6e127319dda8225210869c82f9828d878162394dba4e078.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-95fe4ef93ee90733db1b67ed7987f80b5aac792f1590b979c68b418d1599eb98.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-9b67658569b343d8b4b61ae0a7dc721f367f2ba33c7b69b9e68bfd5c9bff5206.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-9c8062ea55d070afef68309e58fa987eb37fda44e1efbf68c8ba2af7846cc968.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-a06e1d9f6f95e4c4c2b98310ebddcc9d963cc033582bf2e945e8bf3a301b4247.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-a55265c9b07bd1399961a6f1e757201fd0eebe868ddaf96437111113d80fce92.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-a60ec2f66f1e7b84189e5b089f2087a29ff6a64326a3743dea935bbc58ee77fa.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-a891a37be5c2d7cce775c2dd33726b0318fd3839beab222a1b22bc6174604207.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-a945191bb4b3e37d6823ed3ad499339d007d69983105de8567777d9daf517b28.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-abe9f7832f2bd799ac44008da031e8d8ab52d4f5fbfc2a7e3974e8873bae55b2.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-aca588cca57a85e4d7fcc40c23cd87e57d53d11ca550d78e7e3d5e39e524fcd3.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-b02f8aafc00a7724510772ac41269e368c5bccf03ef7b4590e0ef6fd1a1bf64f.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-b742e17cabe2d64617e9aa64bafc782172f7a4f8023d1b54f952a0fb39f6b2b8.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-b94e349dbc0daec57f8f8f6e9e2dffb06100b1bb2b41d297c9f3b191da37a83d.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-bd9afa22994aba671dbf7b5f89b53c2ee02f53c0442a81265786a6d52d08512f.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-be60554eca98a5899efc6b49785cecd6444a6d39afed9e4a884ce2dbf162012c.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-bf49702b506c9a1650ece1f8e8d9f14834a902f8caefafe30ded55e2790f2188.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-bfcd21ed704cd305db5c17fcdec7d92aa4ac501913c9c9514d8ff92928c0c7e7.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-c3ab694650f49a75b146fb877a92e48c4f20f0d99f70f8ec859fbb763b01a1e5.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-c55542bb9fae544d87fae6f30e0fe8a9088d12075f4442ab4fe2fcd05e472234.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-cb29a6556d35ac630ee0aa885dd7341cf9573bd3efd216ff8a887b87686b03db.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-d0a1f341a89f5f14696b10baa72db9d95551c2b7e5fc67308fd52dc03dd98a92.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-d2ad0a0ca2649c9e4873cfcc1fc66d2d07cc45d0f65c560b06d7b5f592f4fa8a.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-d6cfe78eb635ba0b89ca4021a4dc8182d18ab5b197f30149cd28488eba4c1df5.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-d729b56dea00e49dcdba8cf0001e2811da27351eabe98212db3b589f18fc6f32.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-d9658bfd4e7170b41d03f2ddf2446d0bf54171c0d39d53bf20af2b8437f2ec48.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-dbba7b3d3289425bae711aedbf73fbc3699f857f86f84d95c3b556d05c5658b0.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-dcb96b649d6d63a58efd5d445453a4f3d7869a56ff714b69bedf3d616a0473ca.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-ebd876fbf5362a5900e75bc05f2f11c73c406ef7da4e95097fc6a1c3d1b8bc54.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-eef5cc6bce1cc14eba8f3e68971724ef181e88cffcedd74673615f2026b89a62.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/.sqlx/query-ef56d5fefc5774040d1ee397beadb475f6af02768c22f0e583c74062e2e821ce.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/Cargo.toml +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/README.md +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/migrations/20241007163501_initial.sql +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/migrations/20241211120039_merge_job_priority.sql +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/migrations/20241211121159_basic_indexes.sql +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/migrations/20241212151105_check_segment_records.sql +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/migrations/20250110145554_in_flight_messages.sql +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_binding/Cargo.toml +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_binding/src/lib.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/Cargo.toml +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/src/fuzzy_query.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/src/lib.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/src/query_io.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/src/query_parser/fuzzy_parser.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/src/query_parser/keyword_parser.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/src/query_parser/stop_words.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/src/query_parser/tokenizer.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/src/query_parser.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/src/reader.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/src/request_types.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/src/resource_indexer.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/src/schema.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/src/search_query.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/src/search_response.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/src/set_query.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/README.md +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/ar.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/az.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/bn.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/ca.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/ch.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/da.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/de.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/el.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/en.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/es.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/eu.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/extract.py +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/fi.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/fr.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/he.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/hu.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/id.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/it.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/kk.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/ne.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/nl.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/no.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/pt.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/ro.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/ru.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/sl.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/sv.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/tg.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/stop_words/tr.json +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/tests/common/mod.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_paragraph/tests/reader.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_protos/Cargo.toml +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_protos/build.py +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_protos/build.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_protos/nidx.proto +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_protos/nodereader.proto +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_protos/noderesources.proto +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_protos/nodewriter.proto +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_protos/src/lib.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_relation/Cargo.toml +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_relation/src/graph_collector.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_relation/src/graph_query_parser.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_relation/src/io_maps.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_relation/src/lib.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_relation/src/reader.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_relation/src/resource_indexer.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_relation/src/schema.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_relation/src/top_unique_n.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_relation/tests/common/mod.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_relation/tests/test_graph_query_parser_search.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_relation/tests/test_graph_search.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_relation/tests/test_writer.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_tantivy/Cargo.toml +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_tantivy/src/index_reader.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_tantivy/src/lib.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_tantivy/src/utils.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_tests/Cargo.toml +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_tests/src/graph.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_tests/src/lib.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_text/Cargo.toml +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_text/src/lib.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_text/src/prefilter.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_text/src/query_io.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_text/src/reader.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_text/src/request_types.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_text/src/resource_indexer.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_text/src/schema.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_text/src/search_query.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_text/tests/common/mod.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_text/tests/test_deletions.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_text/tests/test_flow.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_text/tests/test_search.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_text/tests/test_streaming.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_types/Cargo.toml +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_types/src/lib.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_types/src/prefilter.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_types/src/query_language.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/Cargo.toml +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/config.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/data_store/v1/node.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/data_store/v1/store.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/data_store/v1/trie.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/data_store/v1/trie_ram.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/data_store/v1.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/data_store/v2/paragraph_store.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/data_store/v2/quant_vector_store.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/data_store/v2/vector_store.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/data_store/v2.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/data_store.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/formula.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/hnsw/params.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/indexer.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/inverted_index/fst_index.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/inverted_index/map.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/inverted_index.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/lib.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/multivector.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/query_io.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/request_types.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/searcher.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/segment/tests.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/utils.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/vector_types/dense_f32.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/vector_types/mod.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/src/vector_types/rabitq.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/tests/common/mod.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/tests/test_basic_search.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/tests/test_hidden.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/nidx_vector/tests/test_maxsim.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/api/grpc.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/api/shards.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/api.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/control.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/errors.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/grpc_server.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/import_export.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/indexer.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/lib.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/main.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/metadata/deletion.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/metadata/index.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/metadata/index_request.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/metadata/merge_job.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/metadata/segment.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/metadata/shard.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/metadata.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/metrics.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/scheduler/audit_task.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/scheduler/log_merge.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/scheduler/merge_task.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/scheduler/metrics_task.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/scheduler/purge_tasks.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/scheduler/vector_merge.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/scheduler.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/searcher/grpc.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/searcher/index_cache.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/searcher/query_language.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/searcher/query_planner.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/searcher/shard_search.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/searcher/shard_selector.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/searcher/shard_suggest.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/searcher/streams.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/searcher/sync.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/searcher.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/segment_store.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/settings.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/telemetry/duration_layer.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/telemetry/log_format.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/telemetry/middleware.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/telemetry.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/tool.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/utilization_tracker.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/src/worker.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/tests/common/mod.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/tests/common/services.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/tests/test_date_range_search.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/tests/test_search_filtering.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/tests/test_search_relations.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/tests/test_search_sorting.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/tests/test_searcher_cluster.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/tests/test_security_search.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/tests/test_shards.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/tests/test_shards_api.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/tests/test_suggest.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/tests/test_synced_searcher.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/tests/test_vector_normalization.rs +0 -0
- {nidx_binding-6.9.4.post638 → nidx_binding-6.9.4.post643}/tests/test_vectorsets.rs +0 -0
|
@@ -2029,9 +2029,9 @@ dependencies = [
|
|
|
2029
2029
|
|
|
2030
2030
|
[[package]]
|
|
2031
2031
|
name = "memmap2"
|
|
2032
|
-
version = "0.9.
|
|
2032
|
+
version = "0.9.9"
|
|
2033
2033
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
2034
|
-
checksum = "
|
|
2034
|
+
checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490"
|
|
2035
2035
|
dependencies = [
|
|
2036
2036
|
"libc",
|
|
2037
2037
|
]
|
|
@@ -4185,7 +4185,7 @@ dependencies = [
|
|
|
4185
4185
|
"lru",
|
|
4186
4186
|
"lz4_flex",
|
|
4187
4187
|
"measure_time",
|
|
4188
|
-
"memmap2 0.9.
|
|
4188
|
+
"memmap2 0.9.9",
|
|
4189
4189
|
"once_cell",
|
|
4190
4190
|
"oneshot",
|
|
4191
4191
|
"rayon",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nidx_binding
|
|
3
|
-
Version: 6.9.4.
|
|
3
|
+
Version: 6.9.4.post643
|
|
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.9.4.
|
|
13
|
+
version = "6.9.4.post643"
|
|
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" }]
|
|
@@ -21,14 +21,10 @@
|
|
|
21
21
|
pub mod usize_utils {
|
|
22
22
|
pub const USIZE_LEN: usize = (usize::BITS / 8) as usize;
|
|
23
23
|
pub fn usize_from_slice_le(v: &[u8]) -> usize {
|
|
24
|
-
|
|
25
|
-
buff.copy_from_slice(v);
|
|
26
|
-
usize::from_le_bytes(buff)
|
|
24
|
+
usize::from_le_bytes(v.try_into().unwrap())
|
|
27
25
|
}
|
|
28
26
|
pub const U32_LEN: usize = (u32::BITS / 8) as usize;
|
|
29
27
|
pub fn u32_from_slice_le(v: &[u8]) -> u32 {
|
|
30
|
-
|
|
31
|
-
buff.copy_from_slice(v);
|
|
32
|
-
u32::from_le_bytes(buff)
|
|
28
|
+
u32::from_le_bytes(v.try_into().unwrap())
|
|
33
29
|
}
|
|
34
30
|
}
|
|
@@ -133,11 +133,11 @@ impl<'a, DR: DataRetriever> HnswBuilder<'a, DR> {
|
|
|
133
133
|
let vector = SearchVector::Stored(node);
|
|
134
134
|
|
|
135
135
|
// The neighbours of the node at each layer, for insertion
|
|
136
|
-
let mut layer_neighbours = Vec::with_capacity(hnsw.
|
|
136
|
+
let mut layer_neighbours = Vec::with_capacity(hnsw.num_layers());
|
|
137
137
|
let mut node_in_layer = false;
|
|
138
138
|
|
|
139
139
|
// First, find the neighbours for each layer the node appears in.
|
|
140
|
-
for l in (0..hnsw.
|
|
140
|
+
for l in (0..hnsw.num_layers()).rev() {
|
|
141
141
|
if !node_in_layer && (l == 0 || hnsw.layers[l].contains(&node)) {
|
|
142
142
|
node_in_layer = true;
|
|
143
143
|
}
|
|
@@ -43,13 +43,25 @@
|
|
|
43
43
|
//
|
|
44
44
|
//
|
|
45
45
|
|
|
46
|
-
use std::
|
|
47
|
-
use std::
|
|
46
|
+
use std::any::Any;
|
|
47
|
+
use std::fs::File;
|
|
48
|
+
use std::path::Path;
|
|
49
|
+
|
|
50
|
+
use memmap2::{Mmap, MmapOptions};
|
|
48
51
|
|
|
49
|
-
use super::ram_hnsw::{Edge, EntryPoint, RAMHnsw, RAMLayer};
|
|
50
|
-
use super::search::{SearchableHnsw, SearchableLayer};
|
|
51
|
-
use crate::VectorAddr;
|
|
52
52
|
use crate::data_types::usize_utils::*;
|
|
53
|
+
use crate::hnsw::DiskHnsw;
|
|
54
|
+
use crate::hnsw::ram_hnsw::{EntryPoint, RAMHnsw, RAMLayer};
|
|
55
|
+
use crate::hnsw::search::{SearchableHnsw, SearchableLayer};
|
|
56
|
+
use crate::{VectorAddr, VectorR};
|
|
57
|
+
|
|
58
|
+
// These are used in serialization code which is no longer used outside tests
|
|
59
|
+
#[cfg(test)]
|
|
60
|
+
use std::collections::HashMap;
|
|
61
|
+
#[cfg(test)]
|
|
62
|
+
use std::io::{self, BufWriter};
|
|
63
|
+
|
|
64
|
+
pub const FILENAME: &str = "index.hnsw";
|
|
53
65
|
|
|
54
66
|
const EDGE_LEN: usize = 4;
|
|
55
67
|
const NODE_LEN: usize = USIZE_LEN;
|
|
@@ -66,29 +78,23 @@ pub struct DiskLayer<'a> {
|
|
|
66
78
|
layer: usize,
|
|
67
79
|
}
|
|
68
80
|
|
|
69
|
-
impl<'a> SearchableLayer for &'a DiskLayer<'a> {
|
|
70
|
-
type EdgeIt = EdgeIter<'a>;
|
|
71
|
-
fn get_out_edges(&self, address: VectorAddr) -> Self::EdgeIt {
|
|
72
|
-
let node = DiskHnsw::get_node(self.hnsw, address);
|
|
73
|
-
DiskHnsw::get_out_edges(node, self.layer)
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
81
|
impl<'a> SearchableLayer for DiskLayer<'a> {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
DiskHnsw::get_out_edges(node, self.layer)
|
|
82
|
+
fn get_out_edges(&self, address: VectorAddr) -> impl Iterator<Item = VectorAddr> {
|
|
83
|
+
let node = DiskHnswV1::get_node(self.hnsw, address);
|
|
84
|
+
DiskHnswV1::get_out_edges(node, self.layer).map(|(a, _s)| a)
|
|
82
85
|
}
|
|
83
86
|
}
|
|
84
87
|
|
|
85
|
-
impl<'a> SearchableHnsw for &'a
|
|
88
|
+
impl<'a> SearchableHnsw for &'a DiskHnswV1 {
|
|
86
89
|
type L = DiskLayer<'a>;
|
|
87
90
|
fn get_entry_point(&self) -> EntryPoint {
|
|
88
|
-
|
|
91
|
+
self.entrypoint()
|
|
89
92
|
}
|
|
90
93
|
fn get_layer(&self, i: usize) -> Self::L {
|
|
91
|
-
DiskLayer {
|
|
94
|
+
DiskLayer {
|
|
95
|
+
hnsw: self.0.as_ref(),
|
|
96
|
+
layer: i,
|
|
97
|
+
}
|
|
92
98
|
}
|
|
93
99
|
}
|
|
94
100
|
|
|
@@ -97,7 +103,7 @@ pub struct EdgeIter<'a> {
|
|
|
97
103
|
buf: &'a [u8],
|
|
98
104
|
}
|
|
99
105
|
impl Iterator for EdgeIter<'_> {
|
|
100
|
-
type Item = (VectorAddr,
|
|
106
|
+
type Item = (VectorAddr, f32);
|
|
101
107
|
fn next(&mut self) -> Option<Self::Item> {
|
|
102
108
|
if self.buf.len() == self.crnt {
|
|
103
109
|
None
|
|
@@ -114,8 +120,20 @@ impl Iterator for EdgeIter<'_> {
|
|
|
114
120
|
}
|
|
115
121
|
}
|
|
116
122
|
|
|
117
|
-
pub struct
|
|
118
|
-
impl
|
|
123
|
+
pub struct DiskHnswV1(Mmap);
|
|
124
|
+
impl DiskHnswV1 {
|
|
125
|
+
pub fn open(path: &Path, prewarm: bool) -> VectorR<Self> {
|
|
126
|
+
let hnsw_file = File::open(path.join(FILENAME))?;
|
|
127
|
+
let mut index_options = MmapOptions::new();
|
|
128
|
+
if prewarm {
|
|
129
|
+
index_options.populate();
|
|
130
|
+
}
|
|
131
|
+
let index = unsafe { index_options.map(&hnsw_file)? };
|
|
132
|
+
|
|
133
|
+
Ok(DiskHnswV1(index))
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
#[cfg(test)] // Not used anymore, used to test migration in tests
|
|
119
137
|
fn serialize_node<W>(mut buf: W, offset: usize, node_addr: u32, hnsw: &RAMHnsw) -> io::Result<usize>
|
|
120
138
|
where
|
|
121
139
|
W: io::Write,
|
|
@@ -123,23 +141,23 @@ impl DiskHnsw {
|
|
|
123
141
|
let node = VectorAddr(node_addr);
|
|
124
142
|
let mut length = offset;
|
|
125
143
|
let mut indexing = HashMap::new();
|
|
126
|
-
for layer in 0..hnsw.
|
|
144
|
+
for layer in 0..hnsw.num_layers() {
|
|
127
145
|
let num_edges = hnsw.get_layer(layer).num_out_edges(&node);
|
|
128
146
|
indexing.insert(layer, length);
|
|
129
147
|
buf.write_all(&num_edges.to_le_bytes())?;
|
|
130
148
|
length += USIZE_LEN;
|
|
131
149
|
if num_edges > 0 {
|
|
132
|
-
for (cnx, edge) in hnsw.get_layer(layer).
|
|
150
|
+
for (cnx, edge) in hnsw.get_layer(layer).out[&node].read().unwrap().iter() {
|
|
133
151
|
buf.write_all(&(cnx.0 as usize).to_le_bytes())?;
|
|
134
152
|
buf.write_all(&edge.to_le_bytes())?;
|
|
135
153
|
length += CNX_LEN;
|
|
136
154
|
}
|
|
137
155
|
}
|
|
138
156
|
}
|
|
139
|
-
for layer in (0..hnsw.
|
|
157
|
+
for layer in (0..hnsw.num_layers()).rev() {
|
|
140
158
|
buf.write_all(&indexing[&layer].to_le_bytes())?;
|
|
141
159
|
}
|
|
142
|
-
length += hnsw.
|
|
160
|
+
length += hnsw.num_layers() * USIZE_LEN;
|
|
143
161
|
buf.flush()?;
|
|
144
162
|
Ok(length)
|
|
145
163
|
}
|
|
@@ -159,16 +177,18 @@ impl DiskHnsw {
|
|
|
159
177
|
buf: &node[cnx_start..cnx_end],
|
|
160
178
|
}
|
|
161
179
|
}
|
|
162
|
-
|
|
163
|
-
|
|
180
|
+
|
|
181
|
+
#[cfg(test)] // Not used anymore, used to test migration in tests
|
|
182
|
+
fn serialize_into(mut buf: impl std::io::Write, num_nodes: u32, hnsw: &RAMHnsw) -> io::Result<()> {
|
|
183
|
+
if num_nodes == 0 {
|
|
164
184
|
// Empty graph, nothing to serialize
|
|
165
185
|
return Ok(());
|
|
166
186
|
}
|
|
167
187
|
|
|
168
188
|
let mut length = 0;
|
|
169
189
|
let mut nodes_end = vec![];
|
|
170
|
-
for node in 0..
|
|
171
|
-
length =
|
|
190
|
+
for node in 0..num_nodes {
|
|
191
|
+
length = DiskHnswV1::serialize_node(&mut buf, length, node, hnsw)?;
|
|
172
192
|
nodes_end.push(length)
|
|
173
193
|
}
|
|
174
194
|
for ends_at in nodes_end.into_iter().rev() {
|
|
@@ -183,14 +203,22 @@ impl DiskHnsw {
|
|
|
183
203
|
|
|
184
204
|
Ok(())
|
|
185
205
|
}
|
|
206
|
+
|
|
207
|
+
#[cfg(test)] // Not used anymore, used to test migration in tests
|
|
208
|
+
pub fn serialize_to(path: &Path, num_nodes: u32, hnsw: &RAMHnsw) -> io::Result<()> {
|
|
209
|
+
let mut buf = BufWriter::new(File::create(path.join(FILENAME))?);
|
|
210
|
+
|
|
211
|
+
Self::serialize_into(&mut buf, num_nodes, hnsw)
|
|
212
|
+
}
|
|
213
|
+
|
|
186
214
|
// hnsw must be serialized using DiskHnsw, may have trailing bytes at the start.
|
|
187
|
-
|
|
188
|
-
assert!(!
|
|
215
|
+
fn entrypoint(&self) -> EntryPoint {
|
|
216
|
+
assert!(!self.0.is_empty());
|
|
189
217
|
|
|
190
|
-
let node_start =
|
|
218
|
+
let node_start = self.0.len() - USIZE_LEN;
|
|
191
219
|
let layer_start = node_start - USIZE_LEN;
|
|
192
|
-
let node_addr = usize_from_slice_le(&
|
|
193
|
-
let layer = usize_from_slice_le(&
|
|
220
|
+
let node_addr = usize_from_slice_le(&self.0[node_start..(node_start + NODE_LEN)]);
|
|
221
|
+
let layer = usize_from_slice_le(&self.0[layer_start..(layer_start + USIZE_LEN)]);
|
|
194
222
|
EntryPoint {
|
|
195
223
|
node: VectorAddr(node_addr as u32),
|
|
196
224
|
layer,
|
|
@@ -207,20 +235,22 @@ impl DiskHnsw {
|
|
|
207
235
|
let node_end = usize_from_slice_le(&hnsw[pos..(pos + USIZE_LEN)]);
|
|
208
236
|
&hnsw[..node_end]
|
|
209
237
|
}
|
|
238
|
+
}
|
|
210
239
|
|
|
211
|
-
|
|
240
|
+
impl DiskHnsw for DiskHnswV1 {
|
|
241
|
+
fn deserialize(&self) -> VectorR<RAMHnsw> {
|
|
212
242
|
let mut ram = RAMHnsw::new();
|
|
213
|
-
if
|
|
214
|
-
return ram;
|
|
243
|
+
if self.0.is_empty() {
|
|
244
|
+
return Ok(ram);
|
|
215
245
|
}
|
|
216
246
|
|
|
217
|
-
let end =
|
|
218
|
-
ram.entry_point =
|
|
247
|
+
let end = self.0.len();
|
|
248
|
+
ram.entry_point = self.entrypoint();
|
|
219
249
|
|
|
220
250
|
let mut node_index: u32 = 0;
|
|
221
251
|
loop {
|
|
222
252
|
let indexing_pos = end - (node_index as usize + 3) * USIZE_LEN;
|
|
223
|
-
let node_end = usize_from_slice_le(&
|
|
253
|
+
let node_end = usize_from_slice_le(&self.0[indexing_pos..indexing_pos + USIZE_LEN]);
|
|
224
254
|
let mut layer_index = 0;
|
|
225
255
|
loop {
|
|
226
256
|
if ram.layers.len() == layer_index {
|
|
@@ -228,8 +258,8 @@ impl DiskHnsw {
|
|
|
228
258
|
}
|
|
229
259
|
|
|
230
260
|
let layer_pos = node_end - (layer_index + 1) * USIZE_LEN;
|
|
231
|
-
let edges_start = usize_from_slice_le(&
|
|
232
|
-
let number_edges = usize_from_slice_le(&
|
|
261
|
+
let edges_start = usize_from_slice_le(&self.0[layer_pos..layer_pos + USIZE_LEN]);
|
|
262
|
+
let number_edges = usize_from_slice_le(&self.0[edges_start..edges_start + USIZE_LEN]);
|
|
233
263
|
|
|
234
264
|
let cnx_start = edges_start + USIZE_LEN;
|
|
235
265
|
let cnx_end = cnx_start + number_edges * CNX_LEN;
|
|
@@ -243,10 +273,10 @@ impl DiskHnsw {
|
|
|
243
273
|
.unwrap();
|
|
244
274
|
let edges = EdgeIter {
|
|
245
275
|
crnt: 0,
|
|
246
|
-
buf: &
|
|
276
|
+
buf: &self.0[cnx_start..cnx_end],
|
|
247
277
|
};
|
|
248
|
-
for (to,
|
|
249
|
-
ram_edges.push((to,
|
|
278
|
+
for (to, edge) in edges {
|
|
279
|
+
ram_edges.push((to, edge));
|
|
250
280
|
}
|
|
251
281
|
}
|
|
252
282
|
|
|
@@ -262,7 +292,15 @@ impl DiskHnsw {
|
|
|
262
292
|
node_index += 1;
|
|
263
293
|
}
|
|
264
294
|
|
|
265
|
-
ram
|
|
295
|
+
Ok(ram)
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
fn size(&self) -> usize {
|
|
299
|
+
self.0.len()
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
fn as_any(&self) -> &dyn Any {
|
|
303
|
+
self
|
|
266
304
|
}
|
|
267
305
|
}
|
|
268
306
|
|
|
@@ -270,21 +308,23 @@ impl DiskHnsw {
|
|
|
270
308
|
mod tests {
|
|
271
309
|
use std::sync::RwLock;
|
|
272
310
|
|
|
311
|
+
use tempfile::TempDir;
|
|
312
|
+
|
|
273
313
|
use super::*;
|
|
274
314
|
use crate::hnsw::ram_hnsw::RAMLayer;
|
|
275
|
-
fn layer_check<L: SearchableLayer>(buf: L, no_nodes: u32, cnx: &[Vec<(VectorAddr,
|
|
315
|
+
fn layer_check<L: SearchableLayer>(buf: L, no_nodes: u32, cnx: &[Vec<(VectorAddr, f32)>]) {
|
|
276
316
|
let no_cnx = vec![];
|
|
277
317
|
for i in 0..no_nodes {
|
|
278
318
|
let expected = cnx.get(i as usize).unwrap_or(&no_cnx);
|
|
279
319
|
let got: Vec<_> = buf.get_out_edges(VectorAddr(i)).collect();
|
|
280
|
-
assert_eq!(expected,
|
|
320
|
+
assert_eq!(got, expected.iter().map(|(x, _)| *x).collect::<Vec<_>>());
|
|
281
321
|
}
|
|
282
322
|
}
|
|
283
323
|
#[test]
|
|
284
324
|
fn empty_hnsw() {
|
|
285
325
|
let hnsw = RAMHnsw::new();
|
|
286
326
|
let mut buf = vec![];
|
|
287
|
-
|
|
327
|
+
DiskHnswV1::serialize_into(&mut buf, 0, &hnsw).unwrap();
|
|
288
328
|
assert!(buf.is_empty());
|
|
289
329
|
}
|
|
290
330
|
|
|
@@ -326,15 +366,18 @@ mod tests {
|
|
|
326
366
|
let mut hnsw = RAMHnsw::new();
|
|
327
367
|
hnsw.entry_point = entry_point;
|
|
328
368
|
hnsw.layers = vec![layer0, layer1, layer2];
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
369
|
+
|
|
370
|
+
let dir = TempDir::new().unwrap();
|
|
371
|
+
DiskHnswV1::serialize_to(dir.path(), no_nodes, &hnsw).unwrap();
|
|
372
|
+
|
|
373
|
+
let hnsw = &DiskHnswV1::open(dir.path(), false).unwrap();
|
|
374
|
+
let ep = hnsw.get_entry_point();
|
|
332
375
|
assert_eq!(ep, entry_point);
|
|
333
|
-
let layer0 =
|
|
376
|
+
let layer0 = hnsw.get_layer(0);
|
|
334
377
|
layer_check(layer0, no_nodes, &cnx0);
|
|
335
|
-
let layer1 =
|
|
378
|
+
let layer1 = hnsw.get_layer(1);
|
|
336
379
|
layer_check(layer1, no_nodes, &cnx1);
|
|
337
|
-
let layer2 =
|
|
380
|
+
let layer2 = hnsw.get_layer(2);
|
|
338
381
|
layer_check(layer2, no_nodes, &cnx2);
|
|
339
382
|
}
|
|
340
383
|
|
|
@@ -376,12 +419,15 @@ mod tests {
|
|
|
376
419
|
let mut hnsw = RAMHnsw::new();
|
|
377
420
|
hnsw.entry_point = entry_point;
|
|
378
421
|
hnsw.layers = vec![layer0, layer1, layer2];
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
422
|
+
|
|
423
|
+
let dir = TempDir::new().unwrap();
|
|
424
|
+
DiskHnswV1::serialize_to(dir.path(), no_nodes, &hnsw).unwrap();
|
|
425
|
+
let disk1 = DiskHnswV1::open(dir.path(), false).unwrap();
|
|
426
|
+
let ram = disk1.deserialize().unwrap();
|
|
427
|
+
|
|
382
428
|
let mut buf2 = vec![];
|
|
383
|
-
|
|
429
|
+
DiskHnswV1::serialize_into(&mut buf2, no_nodes, &ram).unwrap();
|
|
384
430
|
|
|
385
|
-
assert_eq!(
|
|
431
|
+
assert_eq!(disk1.0.as_ref(), buf2.as_slice());
|
|
386
432
|
}
|
|
387
433
|
}
|