2828
2929#include " quantized_distance.h"
3030#include " pq_data_store.h"
31+ #include " debug_utils.h"
3132
3233#define OVERHEAD_FACTOR 1.1
3334#define EXPAND_IF_FULL 0
@@ -145,7 +146,8 @@ template <typename T, typename TagT = uint32_t, typename LabelT = uint32_t> clas
145146 template <typename IDType>
146147 DISKANN_DLLEXPORT std::pair<uint32_t , uint32_t > search (const T *query, const size_t K, const uint32_t L,
147148 IDType *indices, float *distances = nullptr , const uint32_t maxLperSeller = 0 ,
148- std::function<float (const std::uint8_t *, size_t )> rerank_fn = nullptr);
149+ std::function<float (const std::uint8_t *, size_t )> rerank_fn = nullptr,
150+ DebugTraversalInfo *debug_info = nullptr);
149151
150152 template <typename IDType>
151153 std::pair<uint32_t , uint32_t > diverse_search (const T* query, const size_t K, const uint32_t L, const uint32_t maxLperSeller, IDType* indices,
@@ -157,6 +159,30 @@ template <typename T, typename TagT = uint32_t, typename LabelT = uint32_t> clas
157159 float *distances, std::vector<T *> &res_vectors, bool use_filters,
158160 const std::vector<std::string>& filter_labels);
159161
162+ // Debug interface: retrieve the raw embedding stored at the given internal location index.
163+ // Caller must allocate vec with at least get_aligned_dim() elements of type T.
164+ DISKANN_DLLEXPORT void get_embedding (uint32_t location, T *vec) const ;
165+
166+ // Debug search: runs ANN search and records every traversed node.
167+ // debug_info is populated in traversal order; call FilterReason helpers to classify entries.
168+ template <typename IDType>
169+ DISKANN_DLLEXPORT std::pair<uint32_t , uint32_t > debug_search (
170+ const T *query, const size_t K, const uint32_t L,
171+ IDType *indices, float *distances,
172+ DebugTraversalInfo &debug_info,
173+ const uint32_t maxLperSeller = 0 ,
174+ std::function<float (const std::uint8_t *, size_t )> rerank_fn = nullptr);
175+
176+ // Debug filtered search: same as debug_search but applies label filtering.
177+ template <typename IDType>
178+ DISKANN_DLLEXPORT std::pair<uint32_t , uint32_t > debug_search_with_filters (
179+ const T *query, const std::vector<LabelT> &filter_labels,
180+ const size_t K, const uint32_t L,
181+ IDType *indices, float *distances,
182+ DebugTraversalInfo &debug_info,
183+ const uint32_t maxLperSeller = 0 ,
184+ std::function<float (const std::uint8_t *, size_t )> rerank_fn = nullptr);
185+
160186 virtual std::pair<uint32_t , uint32_t > _diverse_search (const DataType& query, const size_t K, const uint32_t L, const uint32_t maxLperSeller,
161187 std::any& indices, float * distances = nullptr ,
162188 std::function<float (const std::uint8_t *, size_t )> rerank_fn = nullptr) override ;
@@ -166,7 +192,8 @@ template <typename T, typename TagT = uint32_t, typename LabelT = uint32_t> clas
166192 DISKANN_DLLEXPORT std::pair<uint32_t , uint32_t > search_with_filters (const T *query, const std::vector<LabelT> &filter_labels,
167193 const size_t K, const uint32_t L, const uint32_t maxLperSeller,
168194 IndexType *indices, float *distances,
169- std::function<float (const std::uint8_t *, size_t )> rerank_fn = nullptr);
195+ std::function<float (const std::uint8_t *, size_t )> rerank_fn = nullptr,
196+ DebugTraversalInfo *debug_info = nullptr);
170197
171198 // Will fail if tag already in the index or if tag=0.
172199 DISKANN_DLLEXPORT int insert_point (const T *point, const TagT tag);
@@ -235,6 +262,22 @@ template <typename T, typename TagT = uint32_t, typename LabelT = uint32_t> clas
235262 float *distances,
236263 std::function<float (const std::uint8_t *, size_t )> rerank_fn = nullptr) override ;
237264
265+ virtual void _get_embedding (uint32_t location, DataType &vec) override ;
266+
267+ virtual std::pair<uint32_t , uint32_t > _debug_search (const DataType &query, const size_t K, const uint32_t L,
268+ std::any &indices, float *distances,
269+ DebugTraversalInfo &debug_info,
270+ const uint32_t maxLperSeller,
271+ std::function<float (const std::uint8_t *, size_t )> rerank_fn) override ;
272+
273+ virtual std::pair<uint32_t , uint32_t > _debug_search_with_filters (const DataType &query,
274+ const std::vector<std::string> &raw_labels,
275+ const size_t K, const uint32_t L,
276+ std::any &indices, float *distances,
277+ DebugTraversalInfo &debug_info,
278+ const uint32_t maxLperSeller,
279+ std::function<float (const std::uint8_t *, size_t )> rerank_fn) override ;
280+
238281 virtual int _insert_point (const DataType &data_point, const TagType tag) override ;
239282 virtual int _insert_point (const DataType &data_point, const TagType tag, const std::vector<std::string> &labels) override ;
240283
@@ -293,7 +336,9 @@ template <typename T, typename TagT = uint32_t, typename LabelT = uint32_t> clas
293336 // The query to use is placed in scratch->aligned_query
294337 std::pair<uint32_t , uint32_t > iterate_to_fixed_point (InMemQueryScratch<T> *scratch, const uint32_t Lindex,
295338 const std::vector<uint32_t > &init_ids, bool use_filter,
296- const std::vector<LabelT> &filters, bool search_invocation, uint32_t maxLperSeller = 0 );
339+ const std::vector<LabelT> &filters, bool search_invocation,
340+ uint32_t maxLperSeller = 0 ,
341+ DebugTraversalInfo *debug_info = nullptr );
297342
298343 void search_for_point_and_prune (int location, uint32_t Lindex, std::vector<uint32_t > &pruned_list,
299344 InMemQueryScratch<T> *scratch, bool use_filter = false ,
0 commit comments