nidx-binding 6.9.3.post626__tar.gz → 6.9.3.post636__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 (264) hide show
  1. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/PKG-INFO +1 -1
  2. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_protos/pyproject.toml +1 -1
  3. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/hnsw/ram_hnsw.rs +23 -2
  4. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/hnsw/search.rs +25 -23
  5. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/hnsw.rs +1 -0
  6. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/segment.rs +42 -10
  7. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/pyproject.toml +1 -1
  8. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.config/nextest.toml +0 -0
  9. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-0cfce9b29547f8f5bafa6e440f86103be7b8c4ad2fd92db9ac223f4efbe23d10.json +0 -0
  10. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-1a561eed00f3dbe868bf5030059793300209179dc8fb73e4b57a54b5e81262fe.json +0 -0
  11. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-1d3fca2682e25a01143da92285297f134a6a105a96f64d87e0db3abb219855e4.json +0 -0
  12. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-249b3b57c27a71baa823f1fe0f0bba9c9af36f61c28f731e58beea60ec48e687.json +0 -0
  13. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-24cb6b683daa42d7125f862e25943ab4be7bf275cd8739f8da4859d701795e1a.json +0 -0
  14. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-263c8fce6db5b03bbd012fafdba6943cbee6ed7eb8976cdef4f5b01dde7ca6fd.json +0 -0
  15. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-2a5d92fb1638df830a4477a7cdf24e6db6b43034b7bbe74fdfb63e8afe2c4071.json +0 -0
  16. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-2b065a363f58caed60e3706603c1260dbf5a4c795604a5b68edda22eb07fec1b.json +0 -0
  17. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-3fc3cb39934683de8cd475ce1368c8373453eb1e01f81587d66b9d14b109ce6e.json +0 -0
  18. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-48f33b77b7c1633467b0b2efcaa1d3c207e7757e4f1d83b40d15e6ca365f7771.json +0 -0
  19. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-4ae09f2c08e2f324bee01bb8487a8f37678a1c5e9d327339235c50d4921a8949.json +0 -0
  20. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-4d7a76fa413c9ef0ce2a47ac7bb7e01d3e6a2aabded9487d21010a53efee8852.json +0 -0
  21. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-4fcbdd6657c7dc9b60b3a563dd41711b3dbcf72ce063427b7a01f8cddf34c244.json +0 -0
  22. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-577109ac00ccfbd38ecaccab94116f2f46a4caf5612afa372cded197123c1e08.json +0 -0
  23. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-5db25f97d8578d6d78f2f6bd4b72cc82a9b1b82805c6422d967ac63b20d99db4.json +0 -0
  24. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-5ec3233a3a23e926055056d46bdde17836a633066dbb5f349502648cd3ea9a60.json +0 -0
  25. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-66edb6ea424d8681927dcddb6bac5f1239175f4775d1f40417ba15054b0c6f19.json +0 -0
  26. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-6f9c6d201c1b5712efb68c363bffd3e0169c11f2a8f925e8cd4e8808599ff7b4.json +0 -0
  27. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-733c3ebacc86f444bf5e2dd79ade660c291e88a00fc09b722f6e2e191545874c.json +0 -0
  28. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-7a3bf27c330c468a596e8a297cf7d8b192e31e67ecc5177c1267f579e8e247c7.json +0 -0
  29. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-7a7e59e47b30b12237511fd3d7da2d17b0471ad2b006af48d6a6f587c779692b.json +0 -0
  30. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-7dcbb33312cc9f11ae3a6d73b1ace017a9f19a8bf8f10304fc57977c8efeadff.json +0 -0
  31. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-7efa7c0d747afc4b6aed0586ff846c27839c3213ff7ee9f30c89b0d0f17e60e3.json +0 -0
  32. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-8493140d788604d498a4e48da4158708572ccc9d60185290a00d549cc84533db.json +0 -0
  33. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-8493bb0059b013eaca42fd10cd7d04f0d06a8acaed379eff0d23f3229edde9ee.json +0 -0
  34. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-87996b3d6c7a2195438d7038015b06949102bce8c7b8cd8db1f83aaf23cbe489.json +0 -0
  35. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-8d33717587c6ee8f5fc339a80b1212a73d6c03e45856b1d55457fc8074709dd0.json +0 -0
  36. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-8f096d8171b89f9615d18f95d696dc9e4fb3674e103161a713cdc806f7a68506.json +0 -0
  37. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-917732a56ee04bf3a6e127319dda8225210869c82f9828d878162394dba4e078.json +0 -0
  38. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-95fe4ef93ee90733db1b67ed7987f80b5aac792f1590b979c68b418d1599eb98.json +0 -0
  39. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-9b67658569b343d8b4b61ae0a7dc721f367f2ba33c7b69b9e68bfd5c9bff5206.json +0 -0
  40. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-9c8062ea55d070afef68309e58fa987eb37fda44e1efbf68c8ba2af7846cc968.json +0 -0
  41. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-a06e1d9f6f95e4c4c2b98310ebddcc9d963cc033582bf2e945e8bf3a301b4247.json +0 -0
  42. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-a55265c9b07bd1399961a6f1e757201fd0eebe868ddaf96437111113d80fce92.json +0 -0
  43. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-a60ec2f66f1e7b84189e5b089f2087a29ff6a64326a3743dea935bbc58ee77fa.json +0 -0
  44. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-a891a37be5c2d7cce775c2dd33726b0318fd3839beab222a1b22bc6174604207.json +0 -0
  45. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-a945191bb4b3e37d6823ed3ad499339d007d69983105de8567777d9daf517b28.json +0 -0
  46. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-abe9f7832f2bd799ac44008da031e8d8ab52d4f5fbfc2a7e3974e8873bae55b2.json +0 -0
  47. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-aca588cca57a85e4d7fcc40c23cd87e57d53d11ca550d78e7e3d5e39e524fcd3.json +0 -0
  48. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-b02f8aafc00a7724510772ac41269e368c5bccf03ef7b4590e0ef6fd1a1bf64f.json +0 -0
  49. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-b742e17cabe2d64617e9aa64bafc782172f7a4f8023d1b54f952a0fb39f6b2b8.json +0 -0
  50. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-b94e349dbc0daec57f8f8f6e9e2dffb06100b1bb2b41d297c9f3b191da37a83d.json +0 -0
  51. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-bd9afa22994aba671dbf7b5f89b53c2ee02f53c0442a81265786a6d52d08512f.json +0 -0
  52. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-be60554eca98a5899efc6b49785cecd6444a6d39afed9e4a884ce2dbf162012c.json +0 -0
  53. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-bf49702b506c9a1650ece1f8e8d9f14834a902f8caefafe30ded55e2790f2188.json +0 -0
  54. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-bfcd21ed704cd305db5c17fcdec7d92aa4ac501913c9c9514d8ff92928c0c7e7.json +0 -0
  55. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-c3ab694650f49a75b146fb877a92e48c4f20f0d99f70f8ec859fbb763b01a1e5.json +0 -0
  56. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-c55542bb9fae544d87fae6f30e0fe8a9088d12075f4442ab4fe2fcd05e472234.json +0 -0
  57. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-cb29a6556d35ac630ee0aa885dd7341cf9573bd3efd216ff8a887b87686b03db.json +0 -0
  58. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-d0a1f341a89f5f14696b10baa72db9d95551c2b7e5fc67308fd52dc03dd98a92.json +0 -0
  59. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-d2ad0a0ca2649c9e4873cfcc1fc66d2d07cc45d0f65c560b06d7b5f592f4fa8a.json +0 -0
  60. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-d6cfe78eb635ba0b89ca4021a4dc8182d18ab5b197f30149cd28488eba4c1df5.json +0 -0
  61. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-d729b56dea00e49dcdba8cf0001e2811da27351eabe98212db3b589f18fc6f32.json +0 -0
  62. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-d9658bfd4e7170b41d03f2ddf2446d0bf54171c0d39d53bf20af2b8437f2ec48.json +0 -0
  63. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-dbba7b3d3289425bae711aedbf73fbc3699f857f86f84d95c3b556d05c5658b0.json +0 -0
  64. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-dcb96b649d6d63a58efd5d445453a4f3d7869a56ff714b69bedf3d616a0473ca.json +0 -0
  65. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-ebd876fbf5362a5900e75bc05f2f11c73c406ef7da4e95097fc6a1c3d1b8bc54.json +0 -0
  66. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-eef5cc6bce1cc14eba8f3e68971724ef181e88cffcedd74673615f2026b89a62.json +0 -0
  67. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/.sqlx/query-ef56d5fefc5774040d1ee397beadb475f6af02768c22f0e583c74062e2e821ce.json +0 -0
  68. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/Cargo.lock +0 -0
  69. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/Cargo.toml +0 -0
  70. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/README.md +0 -0
  71. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/migrations/20241007163501_initial.sql +0 -0
  72. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/migrations/20241211120039_merge_job_priority.sql +0 -0
  73. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/migrations/20241211121159_basic_indexes.sql +0 -0
  74. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/migrations/20241212151105_check_segment_records.sql +0 -0
  75. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/migrations/20250110145554_in_flight_messages.sql +0 -0
  76. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_binding/Cargo.toml +0 -0
  77. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_binding/src/lib.rs +0 -0
  78. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/Cargo.toml +0 -0
  79. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/fuzzy_query.rs +0 -0
  80. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/lib.rs +0 -0
  81. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/query_io.rs +0 -0
  82. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/query_parser/fuzzy_parser.rs +0 -0
  83. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/query_parser/keyword_parser.rs +0 -0
  84. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/query_parser/stop_words.rs +0 -0
  85. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/query_parser/tokenizer.rs +0 -0
  86. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/query_parser.rs +0 -0
  87. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/reader.rs +0 -0
  88. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/request_types.rs +0 -0
  89. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/resource_indexer.rs +0 -0
  90. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/schema.rs +0 -0
  91. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/search_query.rs +0 -0
  92. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/search_response.rs +0 -0
  93. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/src/set_query.rs +0 -0
  94. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/README.md +0 -0
  95. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/ar.json +0 -0
  96. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/az.json +0 -0
  97. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/bn.json +0 -0
  98. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/ca.json +0 -0
  99. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/ch.json +0 -0
  100. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/da.json +0 -0
  101. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/de.json +0 -0
  102. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/el.json +0 -0
  103. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/en.json +0 -0
  104. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/es.json +0 -0
  105. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/eu.json +0 -0
  106. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/extract.py +0 -0
  107. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/fi.json +0 -0
  108. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/fr.json +0 -0
  109. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/he.json +0 -0
  110. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/hu.json +0 -0
  111. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/id.json +0 -0
  112. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/it.json +0 -0
  113. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/kk.json +0 -0
  114. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/ne.json +0 -0
  115. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/nl.json +0 -0
  116. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/no.json +0 -0
  117. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/pt.json +0 -0
  118. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/ro.json +0 -0
  119. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/ru.json +0 -0
  120. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/sl.json +0 -0
  121. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/sv.json +0 -0
  122. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/tg.json +0 -0
  123. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/stop_words/tr.json +0 -0
  124. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/tests/common/mod.rs +0 -0
  125. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_paragraph/tests/reader.rs +0 -0
  126. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_protos/Cargo.toml +0 -0
  127. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_protos/build.py +0 -0
  128. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_protos/build.rs +0 -0
  129. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_protos/nidx.proto +0 -0
  130. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_protos/nodereader.proto +0 -0
  131. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_protos/noderesources.proto +0 -0
  132. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_protos/nodewriter.proto +0 -0
  133. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_protos/src/lib.rs +0 -0
  134. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/Cargo.toml +0 -0
  135. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/src/graph_collector.rs +0 -0
  136. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/src/graph_query_parser.rs +0 -0
  137. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/src/io_maps.rs +0 -0
  138. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/src/lib.rs +0 -0
  139. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/src/reader.rs +0 -0
  140. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/src/resource_indexer.rs +0 -0
  141. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/src/schema.rs +0 -0
  142. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/src/top_unique_n.rs +0 -0
  143. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/tests/common/mod.rs +0 -0
  144. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/tests/test_graph_query_parser_search.rs +0 -0
  145. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/tests/test_graph_search.rs +0 -0
  146. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_relation/tests/test_writer.rs +0 -0
  147. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_tantivy/Cargo.toml +0 -0
  148. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_tantivy/src/index_reader.rs +0 -0
  149. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_tantivy/src/lib.rs +0 -0
  150. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_tantivy/src/utils.rs +0 -0
  151. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_tests/Cargo.toml +0 -0
  152. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_tests/src/graph.rs +0 -0
  153. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_tests/src/lib.rs +0 -0
  154. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/Cargo.toml +0 -0
  155. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/src/lib.rs +0 -0
  156. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/src/prefilter.rs +0 -0
  157. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/src/query_io.rs +0 -0
  158. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/src/reader.rs +0 -0
  159. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/src/request_types.rs +0 -0
  160. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/src/resource_indexer.rs +0 -0
  161. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/src/schema.rs +0 -0
  162. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/src/search_query.rs +0 -0
  163. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/tests/common/mod.rs +0 -0
  164. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/tests/test_deletions.rs +0 -0
  165. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/tests/test_flow.rs +0 -0
  166. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/tests/test_search.rs +0 -0
  167. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_text/tests/test_streaming.rs +0 -0
  168. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_types/Cargo.toml +0 -0
  169. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_types/src/lib.rs +0 -0
  170. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_types/src/prefilter.rs +0 -0
  171. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_types/src/query_language.rs +0 -0
  172. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/Cargo.toml +0 -0
  173. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/config.rs +0 -0
  174. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store/v1/node.rs +0 -0
  175. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store/v1/store.rs +0 -0
  176. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store/v1/trie.rs +0 -0
  177. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store/v1/trie_ram.rs +0 -0
  178. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store/v1.rs +0 -0
  179. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store/v2/paragraph_store.rs +0 -0
  180. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store/v2/quant_vector_store.rs +0 -0
  181. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store/v2/vector_store.rs +0 -0
  182. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store/v2.rs +0 -0
  183. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_store.rs +0 -0
  184. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/data_types.rs +0 -0
  185. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/formula.rs +0 -0
  186. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/hnsw/build.rs +0 -0
  187. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/hnsw/disk_hnsw.rs +0 -0
  188. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/hnsw/params.rs +0 -0
  189. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/indexer.rs +0 -0
  190. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/inverted_index/fst_index.rs +0 -0
  191. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/inverted_index/map.rs +0 -0
  192. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/inverted_index.rs +0 -0
  193. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/lib.rs +0 -0
  194. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/multivector.rs +0 -0
  195. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/query_io.rs +0 -0
  196. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/request_types.rs +0 -0
  197. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/searcher.rs +0 -0
  198. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/segment/tests.rs +0 -0
  199. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/utils.rs +0 -0
  200. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/vector_types/dense_f32.rs +0 -0
  201. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/vector_types/mod.rs +0 -0
  202. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/src/vector_types/rabitq.rs +0 -0
  203. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/tests/common/mod.rs +0 -0
  204. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/tests/test_basic_search.rs +0 -0
  205. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/tests/test_hidden.rs +0 -0
  206. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/nidx_vector/tests/test_maxsim.rs +0 -0
  207. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/api/grpc.rs +0 -0
  208. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/api/shards.rs +0 -0
  209. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/api.rs +0 -0
  210. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/control.rs +0 -0
  211. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/errors.rs +0 -0
  212. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/grpc_server.rs +0 -0
  213. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/import_export.rs +0 -0
  214. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/indexer.rs +0 -0
  215. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/lib.rs +0 -0
  216. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/main.rs +0 -0
  217. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/metadata/deletion.rs +0 -0
  218. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/metadata/index.rs +0 -0
  219. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/metadata/index_request.rs +0 -0
  220. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/metadata/merge_job.rs +0 -0
  221. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/metadata/segment.rs +0 -0
  222. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/metadata/shard.rs +0 -0
  223. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/metadata.rs +0 -0
  224. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/metrics.rs +0 -0
  225. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/scheduler/audit_task.rs +0 -0
  226. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/scheduler/log_merge.rs +0 -0
  227. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/scheduler/merge_task.rs +0 -0
  228. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/scheduler/metrics_task.rs +0 -0
  229. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/scheduler/purge_tasks.rs +0 -0
  230. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/scheduler/vector_merge.rs +0 -0
  231. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/scheduler.rs +0 -0
  232. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher/grpc.rs +0 -0
  233. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher/index_cache.rs +0 -0
  234. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher/query_language.rs +0 -0
  235. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher/query_planner.rs +0 -0
  236. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher/shard_search.rs +0 -0
  237. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher/shard_selector.rs +0 -0
  238. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher/shard_suggest.rs +0 -0
  239. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher/streams.rs +0 -0
  240. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher/sync.rs +0 -0
  241. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/searcher.rs +0 -0
  242. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/segment_store.rs +0 -0
  243. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/settings.rs +0 -0
  244. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/telemetry/duration_layer.rs +0 -0
  245. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/telemetry/log_format.rs +0 -0
  246. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/telemetry/middleware.rs +0 -0
  247. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/telemetry.rs +0 -0
  248. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/tool.rs +0 -0
  249. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/utilization_tracker.rs +0 -0
  250. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/src/worker.rs +0 -0
  251. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/common/mod.rs +0 -0
  252. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/common/services.rs +0 -0
  253. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_date_range_search.rs +0 -0
  254. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_search_filtering.rs +0 -0
  255. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_search_relations.rs +0 -0
  256. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_search_sorting.rs +0 -0
  257. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_searcher_cluster.rs +0 -0
  258. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_security_search.rs +0 -0
  259. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_shards.rs +0 -0
  260. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_shards_api.rs +0 -0
  261. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_suggest.rs +0 -0
  262. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_synced_searcher.rs +0 -0
  263. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/tests/test_vector_normalization.rs +0 -0
  264. {nidx_binding-6.9.3.post626 → nidx_binding-6.9.3.post636}/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.3.post626
3
+ Version: 6.9.3.post636
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.3.post626"
13
+ version = "6.9.3.post636"
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" }]
@@ -113,10 +113,31 @@ impl RAMHnsw {
113
113
  /// A bug in a previous version of this program could cause a node in layer N
114
114
  /// to link to a node in layer N-1. This breaks navigation accross layer N.
115
115
  /// This function will delete any such link from the graph.
116
- pub fn fix_broken_links(&self) {
116
+ /// Also delete empty layers and entrypoints pointing to unexisting layers
117
+ pub fn fix_broken_graph(&mut self) {
118
+ // Fix links to a node not in this lauer
117
119
  for l in &self.layers[1..] {
118
120
  l.fix_broken_links();
119
121
  }
122
+
123
+ // Delete empty layers
124
+ while let Some(layer) = self.layers.last() {
125
+ if layer.out.is_empty() {
126
+ self.layers.pop();
127
+ } else {
128
+ break;
129
+ }
130
+ }
131
+
132
+ // If entrypoint point to non-existing layer, point it to the top-most layer
133
+ if self.entry_point.layer >= self.layers.len() {
134
+ self.entry_point.layer = self.layers.len() - 1;
135
+ let last_layer = self.layers.last().unwrap();
136
+ if !last_layer.contains(&self.entry_point.node) {
137
+ // If the current entrypoint node is not in the last layer, point to another node that is here
138
+ self.entry_point.node = *self.layers.last().unwrap().out.keys().next().unwrap();
139
+ }
140
+ }
120
141
  }
121
142
  }
122
143
 
@@ -172,7 +193,7 @@ mod tests {
172
193
  let mut graph = RAMHnsw::new();
173
194
  graph.layers.push(layer0);
174
195
  graph.layers.push(layer1);
175
- graph.fix_broken_links();
196
+ graph.fix_broken_graph();
176
197
  assert!(graph.layers[1].out[&VectorAddr(0)].read().unwrap().is_empty());
177
198
  }
178
199
  }
@@ -21,7 +21,7 @@
21
21
  use bit_set::BitSet;
22
22
  use rustc_hash::FxHashSet;
23
23
  use std::cmp::{Ordering, Reverse};
24
- use std::collections::{BinaryHeap, HashMap, VecDeque};
24
+ use std::collections::{BinaryHeap, HashMap};
25
25
  use std::time::Instant;
26
26
  use tracing::trace;
27
27
 
@@ -190,33 +190,29 @@ impl<'a, DR: DataRetriever> HnswSearcher<'a, DR> {
190
190
  }
191
191
  }
192
192
 
193
+ /// Breadth-first search to find the closest nodes to the entry-points that fulfill the filtering conditions
193
194
  fn closest_up_nodes<L: SearchableLayer>(
194
195
  &'a self,
195
- entry_points: Vec<VectorAddr>,
196
+ entry_points: Vec<Cnx>,
196
197
  query: &SearchVector,
197
198
  layer: L,
198
199
  number_of_results: usize,
199
200
  mut filter: NodeFilter<'a>,
200
201
  ) -> Vec<(VectorAddr, f32)> {
201
- // We just need to perform BFS, the replacement is the closest node to the actual
202
- // best solution. This algorithm takes a lazy approach to computing the similarity of
203
- // candidates.
204
-
205
202
  const MAX_VECTORS_TO_PRELOAD: u32 = 20_000;
206
203
  let mut results = Vec::new();
207
- let inner_entry_points_iter = entry_points.iter().map(|VectorAddr(inner)| *inner as usize);
204
+ let inner_entry_points_iter = entry_points.iter().map(|Cnx(VectorAddr(inner), _)| *inner as usize);
208
205
  let mut visited_nodes: BitSet = BitSet::from_iter(inner_entry_points_iter);
209
- let mut candidates = VecDeque::from(entry_points);
206
+ let mut candidates = entry_points;
207
+ candidates.sort_unstable();
210
208
 
211
209
  let mut preloaded = 0;
212
210
 
213
211
  loop {
214
- let Some(candidate) = candidates.pop_front() else {
212
+ let Some(Cnx(candidate, candidate_similarity)) = candidates.pop() else {
215
213
  break;
216
214
  };
217
215
 
218
- let candidate_similarity = self.retriever.similarity(candidate, query);
219
-
220
216
  if candidate_similarity < self.retriever.min_score() {
221
217
  break;
222
218
  }
@@ -226,22 +222,28 @@ impl<'a, DR: DataRetriever> HnswSearcher<'a, DR> {
226
222
  }
227
223
 
228
224
  if results.len() == number_of_results {
229
- return results;
225
+ break;
230
226
  }
231
227
 
232
- let mut sorted_out: Vec<_> = layer.get_out_edges(candidate).collect();
233
- sorted_out.sort_by(|a, b| b.1.total_cmp(&a.1));
234
- sorted_out.into_iter().for_each(|(new_candidate, _)| {
235
- if !visited_nodes.contains(new_candidate.0 as usize) {
236
- visited_nodes.insert(new_candidate.0 as usize);
237
- candidates.push_back(new_candidate);
238
-
239
- if self.preload_nodes && preloaded < MAX_VECTORS_TO_PRELOAD {
228
+ if self.preload_nodes && preloaded < MAX_VECTORS_TO_PRELOAD {
229
+ for (new_candidate, _) in layer.get_out_edges(candidate) {
230
+ if !visited_nodes.contains(new_candidate.0 as usize) {
240
231
  self.retriever.will_need(new_candidate);
241
232
  preloaded += 1;
242
233
  }
243
234
  }
244
- });
235
+ }
236
+
237
+ for (new_candidate, _) in layer.get_out_edges(candidate) {
238
+ if visited_nodes.insert(new_candidate.0 as usize) {
239
+ let new_similarity = self.retriever.similarity(new_candidate, query);
240
+
241
+ if new_similarity > self.retriever.min_score() {
242
+ candidates.push(Cnx(new_candidate, new_similarity));
243
+ }
244
+ }
245
+ }
246
+ candidates.sort_unstable();
245
247
  }
246
248
 
247
249
  results
@@ -364,13 +366,13 @@ impl<'a, DR: DataRetriever> HnswSearcher<'a, DR> {
364
366
  let t = Instant::now();
365
367
  let reranked = rabitq::rerank_top(neighbours.collect(), k_neighbours, self.retriever, query)
366
368
  .into_iter()
367
- .map(|Reverse(Cnx(addr, _))| addr)
369
+ .map(|Reverse(c)| c)
368
370
  .collect();
369
371
  let time = t.elapsed();
370
372
  trace!(?time, "HNSW search: reranking");
371
373
  reranked
372
374
  } else {
373
- neighbours.map(|(addr, _)| addr).collect()
375
+ neighbours.map(|(addr, score)| Cnx(addr, score.score)).collect()
374
376
  };
375
377
 
376
378
  // Find k nodes that match the filter in the last layer
@@ -26,5 +26,6 @@ mod search;
26
26
 
27
27
  pub use build::HnswBuilder;
28
28
  pub use disk_hnsw::DiskHnsw;
29
+ pub use params::M;
29
30
  pub use ram_hnsw::RAMHnsw;
30
31
  pub use search::{Cnx, DataRetriever, EstimatedScore, HnswSearcher, NodeFilter, SearchVector};
@@ -26,7 +26,7 @@ use crate::data_store::{DataStore, DataStoreV1, DataStoreV2, OpenReason, Paragra
26
26
  use crate::formula::Formula;
27
27
  use crate::inverted_index::{FilterBitSet, InvertedIndexes, build_indexes};
28
28
  use crate::vector_types::rabitq;
29
- use crate::{ParagraphAddr, VectorAddr, VectorErr, VectorR, VectorSegmentMeta, VectorSegmentMetadata};
29
+ use crate::{ParagraphAddr, VectorAddr, VectorErr, VectorR, VectorSegmentMeta, VectorSegmentMetadata, hnsw};
30
30
  use crate::{hnsw::*, inverted_index};
31
31
  use core::f32;
32
32
  use io::{BufWriter, Write};
@@ -42,9 +42,6 @@ use std::path::Path;
42
42
  use std::time::Instant;
43
43
  use tracing::{debug, trace};
44
44
 
45
- /// How much expensive is to find a node via HNSW compared to a simple brute force scan
46
- const HNSW_COST_FACTOR: usize = 100;
47
-
48
45
  mod file_names {
49
46
  pub const HNSW: &str = "index.hnsw";
50
47
  }
@@ -158,7 +155,7 @@ fn merge_indexes<DS: DataStore + 'static>(
158
155
  // If there are no deletions, we can reuse the first segment
159
156
  // HNSW since its indexes will match the the ones in data_store
160
157
  index = DiskHnsw::deserialize(&operants[0].index);
161
- index.fix_broken_links();
158
+ index.fix_broken_graph();
162
159
  start_vector_index = operants[0].data_store.stored_vector_count();
163
160
  }
164
161
  let merged_vectors_count = data_store.stored_vector_count();
@@ -543,14 +540,10 @@ impl OpenSegment {
543
540
  if matching == 0 {
544
541
  return Box::new(empty());
545
542
  }
546
- let expected_traversal_scan = top_k * self.metadata.records / matching;
547
543
 
548
544
  let t = Instant::now();
549
545
  let method;
550
- let results = if matching < expected_traversal_scan * HNSW_COST_FACTOR {
551
- method = "brute force";
552
- self.brute_force_search(bitset, top_k, retriever, encoded_query, &raw_query)
553
- } else {
546
+ let results = if use_hnsw(self.metadata.records, matching, top_k, rabitq) {
554
547
  method = "hnsw";
555
548
  let ops = HnswSearcher::new(&retriever, true);
556
549
  let filter = NodeFilter::new(bitset, with_duplicates, config);
@@ -561,6 +554,9 @@ impl OpenSegment {
561
554
  .map(|(address, dist)| ScoredVector::new(address, self.data_store.as_ref(), dist))
562
555
  .take(top_k),
563
556
  )
557
+ } else {
558
+ method = "brute force";
559
+ self.brute_force_search(bitset, top_k, retriever, encoded_query, &raw_query)
564
560
  };
565
561
 
566
562
  let time = t.elapsed();
@@ -627,6 +623,42 @@ impl OpenSegment {
627
623
  }
628
624
  }
629
625
 
626
+ fn use_hnsw(total_nodes: usize, matching_nodes: usize, top_k: usize, has_rabitq: bool) -> bool {
627
+ // Cost of a full vector comparison compared to a quantized vector comparison
628
+ let full_cost: usize;
629
+ // How many more vectors are evaluated in layer_search for quantized vectors
630
+ let search_mult: usize;
631
+ // How many vectors are reranked
632
+ let rerank_mult: usize;
633
+ if has_rabitq {
634
+ full_cost = 16;
635
+ search_mult = rabitq::RERANKING_FACTOR * 3 / 4;
636
+ rerank_mult = rabitq::RERANKING_FACTOR / 2;
637
+ } else {
638
+ full_cost = 1;
639
+ search_mult = 1;
640
+ rerank_mult = 0;
641
+ }
642
+
643
+ // Estimated vectors visited during hnsw search (quantized vectors)
644
+ let hnsw_rq = ((total_nodes as f32).ln() - 2.0).powi(2) * (top_k as f32).ln() * search_mult as f32;
645
+ // Estimated vectors visited in closest_up_nodes (full vectors)
646
+ let hnsw_full = (top_k * rerank_mult) + (top_k * hnsw::M * total_nodes / matching_nodes);
647
+
648
+ // Quantized vectors evaluated with brute-force
649
+ let bf_rq = matching_nodes;
650
+ // Estimated full vectors to be evaluated during rerank in brute-force
651
+ let bf_full = top_k * rerank_mult;
652
+
653
+ let hnsw_cost = hnsw_rq as usize + hnsw_full * full_cost;
654
+ let bf_cost = bf_rq + bf_full * full_cost;
655
+
656
+ let use_hnsw = hnsw_cost < bf_cost;
657
+ debug!(hnsw_cost, bf_cost, use_hnsw, "Estimated search costs");
658
+
659
+ use_hnsw
660
+ }
661
+
630
662
  #[cfg(test)]
631
663
  mod test {
632
664
  use std::collections::{BTreeMap, HashSet};
@@ -13,7 +13,7 @@ classifiers = [
13
13
  "Programming Language :: Python :: Implementation :: CPython",
14
14
  "Programming Language :: Python :: Implementation :: PyPy",
15
15
  ]
16
- version = "6.9.3.post626"
16
+ version = "6.9.3.post636"
17
17
 
18
18
  [project.urls]
19
19
  Homepage = "https://nuclia.com"