nidx-binding 6.9.4.post640__tar.gz → 6.9.4.post651__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.
Files changed (266) hide show
  1. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/PKG-INFO +1 -1
  2. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_protos/pyproject.toml +1 -1
  3. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/data_types.rs +2 -6
  4. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/hnsw/build.rs +2 -2
  5. nidx_binding-6.9.4.post640/nidx_vector/src/hnsw/disk_hnsw.rs → nidx_binding-6.9.4.post651/nidx_vector/src/hnsw/disk/v1.rs +108 -62
  6. nidx_binding-6.9.4.post651/nidx_vector/src/hnsw/disk/v2.rs +459 -0
  7. nidx_binding-6.9.4.post651/nidx_vector/src/hnsw/disk.rs +114 -0
  8. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/hnsw/ram_hnsw.rs +11 -6
  9. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/hnsw/search.rs +6 -7
  10. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/hnsw.rs +2 -2
  11. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/segment.rs +21 -65
  12. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/pyproject.toml +1 -1
  13. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.config/nextest.toml +0 -0
  14. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-0cfce9b29547f8f5bafa6e440f86103be7b8c4ad2fd92db9ac223f4efbe23d10.json +0 -0
  15. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-1a561eed00f3dbe868bf5030059793300209179dc8fb73e4b57a54b5e81262fe.json +0 -0
  16. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-1d3fca2682e25a01143da92285297f134a6a105a96f64d87e0db3abb219855e4.json +0 -0
  17. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-249b3b57c27a71baa823f1fe0f0bba9c9af36f61c28f731e58beea60ec48e687.json +0 -0
  18. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-24cb6b683daa42d7125f862e25943ab4be7bf275cd8739f8da4859d701795e1a.json +0 -0
  19. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-263c8fce6db5b03bbd012fafdba6943cbee6ed7eb8976cdef4f5b01dde7ca6fd.json +0 -0
  20. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-2a5d92fb1638df830a4477a7cdf24e6db6b43034b7bbe74fdfb63e8afe2c4071.json +0 -0
  21. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-2b065a363f58caed60e3706603c1260dbf5a4c795604a5b68edda22eb07fec1b.json +0 -0
  22. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-3fc3cb39934683de8cd475ce1368c8373453eb1e01f81587d66b9d14b109ce6e.json +0 -0
  23. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-48f33b77b7c1633467b0b2efcaa1d3c207e7757e4f1d83b40d15e6ca365f7771.json +0 -0
  24. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-4ae09f2c08e2f324bee01bb8487a8f37678a1c5e9d327339235c50d4921a8949.json +0 -0
  25. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-4d7a76fa413c9ef0ce2a47ac7bb7e01d3e6a2aabded9487d21010a53efee8852.json +0 -0
  26. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-4fcbdd6657c7dc9b60b3a563dd41711b3dbcf72ce063427b7a01f8cddf34c244.json +0 -0
  27. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-577109ac00ccfbd38ecaccab94116f2f46a4caf5612afa372cded197123c1e08.json +0 -0
  28. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-5db25f97d8578d6d78f2f6bd4b72cc82a9b1b82805c6422d967ac63b20d99db4.json +0 -0
  29. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-5ec3233a3a23e926055056d46bdde17836a633066dbb5f349502648cd3ea9a60.json +0 -0
  30. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-66edb6ea424d8681927dcddb6bac5f1239175f4775d1f40417ba15054b0c6f19.json +0 -0
  31. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-6f9c6d201c1b5712efb68c363bffd3e0169c11f2a8f925e8cd4e8808599ff7b4.json +0 -0
  32. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-733c3ebacc86f444bf5e2dd79ade660c291e88a00fc09b722f6e2e191545874c.json +0 -0
  33. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-7a3bf27c330c468a596e8a297cf7d8b192e31e67ecc5177c1267f579e8e247c7.json +0 -0
  34. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-7a7e59e47b30b12237511fd3d7da2d17b0471ad2b006af48d6a6f587c779692b.json +0 -0
  35. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-7dcbb33312cc9f11ae3a6d73b1ace017a9f19a8bf8f10304fc57977c8efeadff.json +0 -0
  36. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-7efa7c0d747afc4b6aed0586ff846c27839c3213ff7ee9f30c89b0d0f17e60e3.json +0 -0
  37. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-8493140d788604d498a4e48da4158708572ccc9d60185290a00d549cc84533db.json +0 -0
  38. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-8493bb0059b013eaca42fd10cd7d04f0d06a8acaed379eff0d23f3229edde9ee.json +0 -0
  39. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-87996b3d6c7a2195438d7038015b06949102bce8c7b8cd8db1f83aaf23cbe489.json +0 -0
  40. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-8d33717587c6ee8f5fc339a80b1212a73d6c03e45856b1d55457fc8074709dd0.json +0 -0
  41. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-8f096d8171b89f9615d18f95d696dc9e4fb3674e103161a713cdc806f7a68506.json +0 -0
  42. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-917732a56ee04bf3a6e127319dda8225210869c82f9828d878162394dba4e078.json +0 -0
  43. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-95fe4ef93ee90733db1b67ed7987f80b5aac792f1590b979c68b418d1599eb98.json +0 -0
  44. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-9b67658569b343d8b4b61ae0a7dc721f367f2ba33c7b69b9e68bfd5c9bff5206.json +0 -0
  45. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-9c8062ea55d070afef68309e58fa987eb37fda44e1efbf68c8ba2af7846cc968.json +0 -0
  46. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-a06e1d9f6f95e4c4c2b98310ebddcc9d963cc033582bf2e945e8bf3a301b4247.json +0 -0
  47. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-a55265c9b07bd1399961a6f1e757201fd0eebe868ddaf96437111113d80fce92.json +0 -0
  48. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-a60ec2f66f1e7b84189e5b089f2087a29ff6a64326a3743dea935bbc58ee77fa.json +0 -0
  49. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-a891a37be5c2d7cce775c2dd33726b0318fd3839beab222a1b22bc6174604207.json +0 -0
  50. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-a945191bb4b3e37d6823ed3ad499339d007d69983105de8567777d9daf517b28.json +0 -0
  51. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-abe9f7832f2bd799ac44008da031e8d8ab52d4f5fbfc2a7e3974e8873bae55b2.json +0 -0
  52. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-aca588cca57a85e4d7fcc40c23cd87e57d53d11ca550d78e7e3d5e39e524fcd3.json +0 -0
  53. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-b02f8aafc00a7724510772ac41269e368c5bccf03ef7b4590e0ef6fd1a1bf64f.json +0 -0
  54. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-b742e17cabe2d64617e9aa64bafc782172f7a4f8023d1b54f952a0fb39f6b2b8.json +0 -0
  55. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-b94e349dbc0daec57f8f8f6e9e2dffb06100b1bb2b41d297c9f3b191da37a83d.json +0 -0
  56. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-bd9afa22994aba671dbf7b5f89b53c2ee02f53c0442a81265786a6d52d08512f.json +0 -0
  57. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-be60554eca98a5899efc6b49785cecd6444a6d39afed9e4a884ce2dbf162012c.json +0 -0
  58. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-bf49702b506c9a1650ece1f8e8d9f14834a902f8caefafe30ded55e2790f2188.json +0 -0
  59. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-bfcd21ed704cd305db5c17fcdec7d92aa4ac501913c9c9514d8ff92928c0c7e7.json +0 -0
  60. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-c3ab694650f49a75b146fb877a92e48c4f20f0d99f70f8ec859fbb763b01a1e5.json +0 -0
  61. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-c55542bb9fae544d87fae6f30e0fe8a9088d12075f4442ab4fe2fcd05e472234.json +0 -0
  62. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-cb29a6556d35ac630ee0aa885dd7341cf9573bd3efd216ff8a887b87686b03db.json +0 -0
  63. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-d0a1f341a89f5f14696b10baa72db9d95551c2b7e5fc67308fd52dc03dd98a92.json +0 -0
  64. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-d2ad0a0ca2649c9e4873cfcc1fc66d2d07cc45d0f65c560b06d7b5f592f4fa8a.json +0 -0
  65. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-d6cfe78eb635ba0b89ca4021a4dc8182d18ab5b197f30149cd28488eba4c1df5.json +0 -0
  66. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-d729b56dea00e49dcdba8cf0001e2811da27351eabe98212db3b589f18fc6f32.json +0 -0
  67. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-d9658bfd4e7170b41d03f2ddf2446d0bf54171c0d39d53bf20af2b8437f2ec48.json +0 -0
  68. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-dbba7b3d3289425bae711aedbf73fbc3699f857f86f84d95c3b556d05c5658b0.json +0 -0
  69. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-dcb96b649d6d63a58efd5d445453a4f3d7869a56ff714b69bedf3d616a0473ca.json +0 -0
  70. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-ebd876fbf5362a5900e75bc05f2f11c73c406ef7da4e95097fc6a1c3d1b8bc54.json +0 -0
  71. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-eef5cc6bce1cc14eba8f3e68971724ef181e88cffcedd74673615f2026b89a62.json +0 -0
  72. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/.sqlx/query-ef56d5fefc5774040d1ee397beadb475f6af02768c22f0e583c74062e2e821ce.json +0 -0
  73. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/Cargo.lock +0 -0
  74. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/Cargo.toml +0 -0
  75. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/README.md +0 -0
  76. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/migrations/20241007163501_initial.sql +0 -0
  77. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/migrations/20241211120039_merge_job_priority.sql +0 -0
  78. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/migrations/20241211121159_basic_indexes.sql +0 -0
  79. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/migrations/20241212151105_check_segment_records.sql +0 -0
  80. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/migrations/20250110145554_in_flight_messages.sql +0 -0
  81. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_binding/Cargo.toml +0 -0
  82. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_binding/src/lib.rs +0 -0
  83. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/Cargo.toml +0 -0
  84. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/src/fuzzy_query.rs +0 -0
  85. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/src/lib.rs +0 -0
  86. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/src/query_io.rs +0 -0
  87. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/src/query_parser/fuzzy_parser.rs +0 -0
  88. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/src/query_parser/keyword_parser.rs +0 -0
  89. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/src/query_parser/stop_words.rs +0 -0
  90. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/src/query_parser/tokenizer.rs +0 -0
  91. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/src/query_parser.rs +0 -0
  92. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/src/reader.rs +0 -0
  93. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/src/request_types.rs +0 -0
  94. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/src/resource_indexer.rs +0 -0
  95. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/src/schema.rs +0 -0
  96. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/src/search_query.rs +0 -0
  97. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/src/search_response.rs +0 -0
  98. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/src/set_query.rs +0 -0
  99. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/README.md +0 -0
  100. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/ar.json +0 -0
  101. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/az.json +0 -0
  102. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/bn.json +0 -0
  103. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/ca.json +0 -0
  104. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/ch.json +0 -0
  105. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/da.json +0 -0
  106. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/de.json +0 -0
  107. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/el.json +0 -0
  108. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/en.json +0 -0
  109. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/es.json +0 -0
  110. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/eu.json +0 -0
  111. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/extract.py +0 -0
  112. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/fi.json +0 -0
  113. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/fr.json +0 -0
  114. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/he.json +0 -0
  115. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/hu.json +0 -0
  116. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/id.json +0 -0
  117. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/it.json +0 -0
  118. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/kk.json +0 -0
  119. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/ne.json +0 -0
  120. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/nl.json +0 -0
  121. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/no.json +0 -0
  122. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/pt.json +0 -0
  123. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/ro.json +0 -0
  124. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/ru.json +0 -0
  125. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/sl.json +0 -0
  126. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/sv.json +0 -0
  127. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/tg.json +0 -0
  128. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/stop_words/tr.json +0 -0
  129. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/tests/common/mod.rs +0 -0
  130. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_paragraph/tests/reader.rs +0 -0
  131. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_protos/Cargo.toml +0 -0
  132. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_protos/build.py +0 -0
  133. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_protos/build.rs +0 -0
  134. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_protos/nidx.proto +0 -0
  135. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_protos/nodereader.proto +0 -0
  136. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_protos/noderesources.proto +0 -0
  137. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_protos/nodewriter.proto +0 -0
  138. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_protos/src/lib.rs +0 -0
  139. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_relation/Cargo.toml +0 -0
  140. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_relation/src/graph_collector.rs +0 -0
  141. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_relation/src/graph_query_parser.rs +0 -0
  142. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_relation/src/io_maps.rs +0 -0
  143. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_relation/src/lib.rs +0 -0
  144. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_relation/src/reader.rs +0 -0
  145. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_relation/src/resource_indexer.rs +0 -0
  146. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_relation/src/schema.rs +0 -0
  147. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_relation/src/top_unique_n.rs +0 -0
  148. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_relation/tests/common/mod.rs +0 -0
  149. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_relation/tests/test_graph_query_parser_search.rs +0 -0
  150. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_relation/tests/test_graph_search.rs +0 -0
  151. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_relation/tests/test_writer.rs +0 -0
  152. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_tantivy/Cargo.toml +0 -0
  153. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_tantivy/src/index_reader.rs +0 -0
  154. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_tantivy/src/lib.rs +0 -0
  155. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_tantivy/src/utils.rs +0 -0
  156. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_tests/Cargo.toml +0 -0
  157. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_tests/src/graph.rs +0 -0
  158. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_tests/src/lib.rs +0 -0
  159. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_text/Cargo.toml +0 -0
  160. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_text/src/lib.rs +0 -0
  161. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_text/src/prefilter.rs +0 -0
  162. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_text/src/query_io.rs +0 -0
  163. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_text/src/reader.rs +0 -0
  164. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_text/src/request_types.rs +0 -0
  165. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_text/src/resource_indexer.rs +0 -0
  166. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_text/src/schema.rs +0 -0
  167. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_text/src/search_query.rs +0 -0
  168. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_text/tests/common/mod.rs +0 -0
  169. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_text/tests/test_deletions.rs +0 -0
  170. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_text/tests/test_flow.rs +0 -0
  171. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_text/tests/test_search.rs +0 -0
  172. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_text/tests/test_streaming.rs +0 -0
  173. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_types/Cargo.toml +0 -0
  174. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_types/src/lib.rs +0 -0
  175. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_types/src/prefilter.rs +0 -0
  176. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_types/src/query_language.rs +0 -0
  177. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/Cargo.toml +0 -0
  178. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/config.rs +0 -0
  179. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/data_store/v1/node.rs +0 -0
  180. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/data_store/v1/store.rs +0 -0
  181. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/data_store/v1/trie.rs +0 -0
  182. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/data_store/v1/trie_ram.rs +0 -0
  183. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/data_store/v1.rs +0 -0
  184. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/data_store/v2/paragraph_store.rs +0 -0
  185. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/data_store/v2/quant_vector_store.rs +0 -0
  186. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/data_store/v2/vector_store.rs +0 -0
  187. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/data_store/v2.rs +0 -0
  188. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/data_store.rs +0 -0
  189. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/formula.rs +0 -0
  190. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/hnsw/params.rs +0 -0
  191. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/indexer.rs +0 -0
  192. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/inverted_index/fst_index.rs +0 -0
  193. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/inverted_index/map.rs +0 -0
  194. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/inverted_index.rs +0 -0
  195. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/lib.rs +0 -0
  196. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/multivector.rs +0 -0
  197. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/query_io.rs +0 -0
  198. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/request_types.rs +0 -0
  199. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/searcher.rs +0 -0
  200. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/segment/tests.rs +0 -0
  201. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/utils.rs +0 -0
  202. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/vector_types/dense_f32.rs +0 -0
  203. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/vector_types/mod.rs +0 -0
  204. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/src/vector_types/rabitq.rs +0 -0
  205. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/tests/common/mod.rs +0 -0
  206. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/tests/test_basic_search.rs +0 -0
  207. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/tests/test_hidden.rs +0 -0
  208. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/nidx_vector/tests/test_maxsim.rs +0 -0
  209. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/api/grpc.rs +0 -0
  210. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/api/shards.rs +0 -0
  211. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/api.rs +0 -0
  212. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/control.rs +0 -0
  213. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/errors.rs +0 -0
  214. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/grpc_server.rs +0 -0
  215. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/import_export.rs +0 -0
  216. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/indexer.rs +0 -0
  217. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/lib.rs +0 -0
  218. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/main.rs +0 -0
  219. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/metadata/deletion.rs +0 -0
  220. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/metadata/index.rs +0 -0
  221. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/metadata/index_request.rs +0 -0
  222. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/metadata/merge_job.rs +0 -0
  223. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/metadata/segment.rs +0 -0
  224. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/metadata/shard.rs +0 -0
  225. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/metadata.rs +0 -0
  226. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/metrics.rs +0 -0
  227. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/scheduler/audit_task.rs +0 -0
  228. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/scheduler/log_merge.rs +0 -0
  229. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/scheduler/merge_task.rs +0 -0
  230. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/scheduler/metrics_task.rs +0 -0
  231. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/scheduler/purge_tasks.rs +0 -0
  232. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/scheduler/vector_merge.rs +0 -0
  233. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/scheduler.rs +0 -0
  234. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/searcher/grpc.rs +0 -0
  235. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/searcher/index_cache.rs +0 -0
  236. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/searcher/query_language.rs +0 -0
  237. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/searcher/query_planner.rs +0 -0
  238. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/searcher/shard_search.rs +0 -0
  239. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/searcher/shard_selector.rs +0 -0
  240. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/searcher/shard_suggest.rs +0 -0
  241. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/searcher/streams.rs +0 -0
  242. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/searcher/sync.rs +0 -0
  243. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/searcher.rs +0 -0
  244. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/segment_store.rs +0 -0
  245. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/settings.rs +0 -0
  246. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/telemetry/duration_layer.rs +0 -0
  247. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/telemetry/log_format.rs +0 -0
  248. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/telemetry/middleware.rs +0 -0
  249. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/telemetry.rs +0 -0
  250. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/tool.rs +0 -0
  251. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/utilization_tracker.rs +0 -0
  252. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/src/worker.rs +0 -0
  253. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/tests/common/mod.rs +0 -0
  254. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/tests/common/services.rs +0 -0
  255. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/tests/test_date_range_search.rs +0 -0
  256. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/tests/test_search_filtering.rs +0 -0
  257. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/tests/test_search_relations.rs +0 -0
  258. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/tests/test_search_sorting.rs +0 -0
  259. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/tests/test_searcher_cluster.rs +0 -0
  260. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/tests/test_security_search.rs +0 -0
  261. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/tests/test_shards.rs +0 -0
  262. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/tests/test_shards_api.rs +0 -0
  263. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/tests/test_suggest.rs +0 -0
  264. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/tests/test_synced_searcher.rs +0 -0
  265. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/tests/test_vector_normalization.rs +0 -0
  266. {nidx_binding-6.9.4.post640 → nidx_binding-6.9.4.post651}/tests/test_vectorsets.rs +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nidx_binding
3
- Version: 6.9.4.post640
3
+ Version: 6.9.4.post651
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.post640"
13
+ version = "6.9.4.post651"
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
- let mut buff = [0; USIZE_LEN];
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
- let mut buff = [0; U32_LEN];
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.no_layers());
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.no_layers()).rev() {
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::collections::HashMap;
47
- use std::io;
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
- type EdgeIt = EdgeIter<'a>;
79
- fn get_out_edges(&self, address: VectorAddr) -> Self::EdgeIt {
80
- let node = DiskHnsw::get_node(self.hnsw, address);
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 [u8] {
88
+ impl<'a> SearchableHnsw for &'a DiskHnswV1 {
86
89
  type L = DiskLayer<'a>;
87
90
  fn get_entry_point(&self) -> EntryPoint {
88
- DiskHnsw::get_entry_point(self)
91
+ self.entrypoint()
89
92
  }
90
93
  fn get_layer(&self, i: usize) -> Self::L {
91
- DiskLayer { hnsw: self, layer: i }
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, Edge);
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 DiskHnsw;
118
- impl DiskHnsw {
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.no_layers() {
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).get_out_edges(node) {
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.no_layers()).rev() {
157
+ for layer in (0..hnsw.num_layers()).rev() {
140
158
  buf.write_all(&indexing[&layer].to_le_bytes())?;
141
159
  }
142
- length += hnsw.no_layers() * USIZE_LEN;
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
- pub fn serialize_into<W: io::Write>(mut buf: W, no_nodes: u32, hnsw: RAMHnsw) -> io::Result<()> {
163
- if no_nodes == 0 {
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..no_nodes {
171
- length = DiskHnsw::serialize_node(&mut buf, length, node, &hnsw)?;
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
- pub fn get_entry_point(hnsw: &[u8]) -> EntryPoint {
188
- assert!(!hnsw.is_empty());
215
+ fn entrypoint(&self) -> EntryPoint {
216
+ assert!(!self.0.is_empty());
189
217
 
190
- let node_start = hnsw.len() - USIZE_LEN;
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(&hnsw[node_start..(node_start + NODE_LEN)]);
193
- let layer = usize_from_slice_le(&hnsw[layer_start..(layer_start + USIZE_LEN)]);
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
- pub fn deserialize(hnsw: &[u8]) -> RAMHnsw {
240
+ impl DiskHnsw for DiskHnswV1 {
241
+ fn deserialize(&self) -> VectorR<RAMHnsw> {
212
242
  let mut ram = RAMHnsw::new();
213
- if hnsw.is_empty() {
214
- return ram;
243
+ if self.0.is_empty() {
244
+ return Ok(ram);
215
245
  }
216
246
 
217
- let end = hnsw.len();
218
- ram.entry_point = Self::get_entry_point(hnsw);
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(&hnsw[indexing_pos..indexing_pos + USIZE_LEN]);
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(&hnsw[layer_pos..layer_pos + USIZE_LEN]);
232
- let number_edges = usize_from_slice_le(&hnsw[edges_start..edges_start + USIZE_LEN]);
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: &hnsw[cnx_start..cnx_end],
276
+ buf: &self.0[cnx_start..cnx_end],
247
277
  };
248
- for (to, weight) in edges {
249
- ram_edges.push((to, weight));
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, Edge)>]) {
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, &got);
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
- DiskHnsw::serialize_into(&mut buf, 0, hnsw).unwrap();
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
- let mut buf = vec![];
330
- DiskHnsw::serialize_into(&mut buf, no_nodes, hnsw).unwrap();
331
- let ep = DiskHnsw::get_entry_point(&buf);
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 = buf.as_slice().get_layer(0);
376
+ let layer0 = hnsw.get_layer(0);
334
377
  layer_check(layer0, no_nodes, &cnx0);
335
- let layer1 = buf.as_slice().get_layer(1);
378
+ let layer1 = hnsw.get_layer(1);
336
379
  layer_check(layer1, no_nodes, &cnx1);
337
- let layer2 = buf.as_slice().get_layer(2);
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
- let mut buf = vec![];
380
- DiskHnsw::serialize_into(&mut buf, no_nodes, hnsw).unwrap();
381
- let ram = DiskHnsw::deserialize(&buf);
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
- DiskHnsw::serialize_into(&mut buf2, no_nodes, ram).unwrap();
429
+ DiskHnswV1::serialize_into(&mut buf2, no_nodes, &ram).unwrap();
384
430
 
385
- assert_eq!(buf, buf2);
431
+ assert_eq!(disk1.0.as_ref(), buf2.as_slice());
386
432
  }
387
433
  }