Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
179 commits
Select commit Hold shift + click to select a range
d78f459
get build working
HowardHuang1 Feb 23, 2026
4febf8b
add dataset compression test and basic constructor types test
HowardHuang1 Feb 23, 2026
b403473
add padded_dataset class along with test cases
HowardHuang1 Feb 23, 2026
8d6833a
add support for new padded_dataset classes all the way up to the CAGR…
HowardHuang1 Feb 24, 2026
5447a4c
Merge branch 'main' into HH-Dataset-API
aamijar Feb 25, 2026
17ab09d
fix style
aamijar Feb 25, 2026
fb556c9
build() now only takes views and not unique ptrs + get rid of distinc…
HowardHuang1 Feb 28, 2026
37d28dc
clean up old overloads of build & index functions that take ownership…
HowardHuang1 Mar 2, 2026
f30e7ed
fully removed index ownership so that it only takes views + add suppo…
HowardHuang1 Mar 4, 2026
26b46a2
fix failing mg tests that do build -> serialize -> deserialize -> search
HowardHuang1 Mar 4, 2026
a38fb18
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 Mar 4, 2026
393367a
Merge branch 'release/26.04' of https://github.com/rapidsai/cuvs into…
HowardHuang1 Mar 25, 2026
70b6b58
fix formatting w/ pre-commit
HowardHuang1 Mar 25, 2026
0c3df3e
Merge upstream main into branch
HowardHuang1 Apr 9, 2026
dbc47e1
run pre-commit
HowardHuang1 Apr 9, 2026
27a6eb3
fix merge issues that cause build to fail
HowardHuang1 Apr 9, 2026
355adb3
fix failing test cases for cagra
HowardHuang1 Apr 9, 2026
5e5445b
fix cagra test cases to conform with new dataset API by always callin…
HowardHuang1 Apr 10, 2026
1d4ca18
fixed failing cagra test cases caused by shift to new padded dataset …
HowardHuang1 Apr 10, 2026
187e66e
fixed failing cagra test cases when query dimensions don't match numb…
HowardHuang1 Apr 10, 2026
e894477
Fix ace build caller mismatch and vpq keep alive error in cagra test …
HowardHuang1 Apr 10, 2026
84573a6
fix error with vpq layout queries.extent(1) != idx.dim()
HowardHuang1 Apr 10, 2026
dfb0d4c
Fix failing query vs index dimension check when calling cagra search …
HowardHuang1 Apr 10, 2026
7be7329
Fix unsupported data type due to dataset_view not taken by serialize()
HowardHuang1 Apr 10, 2026
0c9432d
Fix extend core issue in failing cagra test cases to support device_p…
HowardHuang1 Apr 10, 2026
234606e
Fix merge to treat device_padded_dataset_view as valid attached dataset
HowardHuang1 Apr 10, 2026
20f7ea7
Fix cagra test case issue where cagra merge failed to preserve 16 byt…
HowardHuang1 Apr 11, 2026
82979c8
Fix failing low recall cagra test cases so that padding in padded dat…
HowardHuang1 Apr 11, 2026
167cb75
remove is_owning state. Split into high level polymorphic_dataset<> a…
HowardHuang1 Apr 13, 2026
07caefa
Remove top level base polymorphic_dataset class and split inheritance…
HowardHuang1 Apr 14, 2026
f15317f
change index() and build() to take high level abstract dataset_view i…
HowardHuang1 Apr 14, 2026
ee0b5e4
add stride check for update_dataset() + update documentation
HowardHuang1 Apr 15, 2026
db16de1
remove unused naming aliases
HowardHuang1 Apr 15, 2026
08e5e9d
remove host_padded_dataset/view since it's not used in any control path
HowardHuang1 Apr 15, 2026
b0cc113
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 Apr 15, 2026
4098a44
fix minor CI issues
HowardHuang1 Apr 15, 2026
b130341
fix copyright
HowardHuang1 Apr 15, 2026
b897116
Revert "fix copyright"
HowardHuang1 Apr 15, 2026
547657a
fix copyright for CI
HowardHuang1 Apr 15, 2026
c124b00
remove cmake changes
HowardHuang1 Apr 15, 2026
bce0f36
Fix cmakelists for build
HowardHuang1 Apr 16, 2026
a7fbf2f
Fix build issue with spectral clustering
HowardHuang1 Apr 16, 2026
c15ed1e
Merge remote-tracking branch 'upstream/main' into HH-Dataset-API
Apr 17, 2026
8dd7436
fix FAISS cuVS bridge to support new Dataset API. Had update_dataset(…
HowardHuang1 Apr 18, 2026
34d499f
Fix ACE CAGRA device dataset padding and C API handle for disk-backed…
HowardHuang1 Apr 18, 2026
f41c355
run pre-commit formatting
HowardHuang1 Apr 18, 2026
b0e5369
Fix disk-ann type casting after splitting dataset and dataset_view in…
HowardHuang1 Apr 20, 2026
81341c9
Fix non-ACE cpu path internal call to make_padded_dataset to call cor…
HowardHuang1 Apr 20, 2026
f9e83c5
Increase compressed binary size threshold to avoid CI error
HowardHuang1 Apr 20, 2026
5598753
run pre-commit formatting
HowardHuang1 Apr 20, 2026
b4892a5
Fix failing build for hnsw examples to support new build_res return type
HowardHuang1 Apr 21, 2026
485b820
Fix seed for random make blob test for determinism
HowardHuang1 Apr 21, 2026
7b9edda
Fix broken C API handling of out_dataset ownership and lifetime durin…
HowardHuang1 Apr 21, 2026
14f6bfe
Fix non-padded dataset from host from_graph path that caused cuda mis…
HowardHuang1 Apr 21, 2026
110f9f3
Fix cagra::extend_core which requires a preallocated device buffer + …
HowardHuang1 Apr 21, 2026
69d45fe
add support for vpq dataset in C API. Previously C++ API already supp…
HowardHuang1 Apr 21, 2026
b7148c3
Disable flaky mg_ivf_flat_extend test case temporarily
HowardHuang1 Apr 21, 2026
15a8834
Fix failing java tests where tiered_index fails to keep dataset passe…
HowardHuang1 Apr 22, 2026
9543191
Fix failing java tests where tiered_index doesn't use padded dataset …
HowardHuang1 Apr 22, 2026
2dee124
Fix CAGRA search query alignment. Serialize search when padded stride…
HowardHuang1 Apr 22, 2026
7071656
cuvs_c_verify_install_headers test used to look for cpp project root.…
HowardHuang1 Apr 22, 2026
3bbf993
Merge remote-tracking branch 'upstream/main' into HH-Dataset-API
HowardHuang1 Apr 22, 2026
c8b5397
Fix RMM integration after breaking RMM API change was merged
HowardHuang1 Apr 22, 2026
d81f873
Fix docs CI check and fix linking of cmake crate in rust with CMAKE_C…
HowardHuang1 Apr 22, 2026
98b5697
revert rust build.rs config
HowardHuang1 Apr 22, 2026
c88b23c
remove leftover stale index wrapper files
HowardHuang1 Apr 22, 2026
b32e868
remove old test cases
HowardHuang1 Apr 22, 2026
1a88bb8
revert rmm changes
HowardHuang1 Apr 23, 2026
1f24980
check for 16-byte alignment in _from_args() from cuvsCagraIndexFromAr…
HowardHuang1 Apr 23, 2026
5e5ed60
rename merged_cagra_holder to cuvs_cagra_c_api_lifetime_holder since …
HowardHuang1 Apr 23, 2026
5cadbad
refactor out repeated dataset stride matching calculation into global…
HowardHuang1 Apr 24, 2026
12272d2
Add explicit stride validation in convert_dataset_view_to_padded_for_…
HowardHuang1 Apr 24, 2026
e689b04
Attach the padded dataset view, not the original unvalidated view whe…
HowardHuang1 Apr 24, 2026
58ee2e5
In the case that params.compression is set, do not drop VPQ ownership…
HowardHuang1 Apr 24, 2026
88cfb37
Fix lifetime issue in tiered_index: Repoint the CAGRA index before re…
HowardHuang1 Apr 24, 2026
706f95d
keep ace build result alive in cagra_build_into_index
HowardHuang1 Apr 24, 2026
231a9e1
ACE build is the only path that accepts raw mdspan so call make_padde…
HowardHuang1 Apr 24, 2026
8aac5bd
check for managed memory case for pinned page-locked host memory. Che…
HowardHuang1 Apr 28, 2026
d869208
fix pre-commit styles
HowardHuang1 Apr 28, 2026
ad30ca1
Merge remote-tracking branch 'upstream/main' into HH-Dataset-API
HowardHuang1 Apr 28, 2026
4c3faef
Merge branch 'main' of github.com:rapidsai/cuvs into HH-Dataset-API
HowardHuang1 Apr 30, 2026
6676c3a
bring back build() functions that return indexes and work with datase…
HowardHuang1 May 1, 2026
d53c4a8
add deprecation warnings to deprecated classes and functions
HowardHuang1 May 1, 2026
adcb0a2
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 May 1, 2026
6a91ca4
since build() returning index was brought back, make corresponding fi…
HowardHuang1 May 1, 2026
7f0ba65
fix FAISS code now that we've brought back build() that returns index…
HowardHuang1 May 1, 2026
945a249
bring back out of core non-ACE batched IVF host path
HowardHuang1 May 2, 2026
a2d937a
abide by convention where addr+dtype is used to maintain ownership an…
HowardHuang1 May 2, 2026
063e439
Use raft::resources mdspan-based API where possible
HowardHuang1 May 2, 2026
cc9c1f3
merge FAISS diff files and use raft::copy_matrix instead of cudaMemcpy
HowardHuang1 May 6, 2026
c3edfc7
revert header_check.cmake changes
HowardHuang1 May 6, 2026
5fa5bf3
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 May 6, 2026
c5cfcf2
Remove semicolon that was messing FAISS patch
HowardHuang1 May 6, 2026
58c7bbd
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 May 6, 2026
2b8801c
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 May 8, 2026
b12a6c2
refactor using templates for composition in place of inheritance
HowardHuang1 May 8, 2026
8d99fa7
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 May 8, 2026
285e5ed
consolidate aliases and get rid of naming inconsistencies
HowardHuang1 May 8, 2026
93557e4
Merge branch 'main' into HH-Dataset-API
HowardHuang1 May 10, 2026
e46300f
reapply commit a2efbee remove noexcept to avoid CI error
HowardHuang1 May 10, 2026
b1c979b
fix clang-format for pre-commit styles
HowardHuang1 May 10, 2026
c6405c6
Remove noexcept to avoid CI error
HowardHuang1 May 10, 2026
3ccbe5c
rename case 0 and case 1 in switch statement for clarity
HowardHuang1 May 11, 2026
4117f23
move overload in comments to a separate line to avoid Doxygen being m…
HowardHuang1 May 11, 2026
0340038
add back in update_dataset() functions that take in owning dataset fo…
HowardHuang1 May 11, 2026
0e2691c
mismatched branches tried to stuff template dataT into non-matching t…
HowardHuang1 May 11, 2026
7dfbf85
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 May 12, 2026
23b07d3
remove calls to detail namespace from header file cagra.hpp
HowardHuang1 May 12, 2026
46935d4
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 May 13, 2026
cebcfd4
Remove detail namespace around finalize_index_from_ace and finalize_i…
HowardHuang1 May 13, 2026
88da190
move implementation of dispatch in index out into dispatch.hpp file
HowardHuang1 May 13, 2026
79d0fd8
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 May 13, 2026
f9adbc5
remove indirect_dataset
HowardHuang1 May 13, 2026
d1c1dd4
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 May 13, 2026
5223862
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 May 14, 2026
8c836ec
fix failing CI by having deserialize_strided() recover a padded datas…
HowardHuang1 May 14, 2026
11b0c61
index was missing vpq_16_owning check when rebinding dataset during d…
HowardHuang1 May 14, 2026
1de47f9
index logical element type and vpq codebook type do not need to be th…
HowardHuang1 May 14, 2026
c6b4901
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 May 14, 2026
99ab789
pull out nested vpq_dataset creation from build(). Users should now c…
HowardHuang1 May 14, 2026
3ea5f56
remove deferred_host_dataset from build_result. Deprecate old edge ca…
HowardHuang1 May 15, 2026
ea4c1d6
remove build_result completely and remove build() overloads that retu…
HowardHuang1 May 15, 2026
68c3f6b
make_vpq_dataset now takes any_dataset_view instead of just padded_da…
HowardHuang1 May 15, 2026
f7f607d
remove unused files and includes. Added code example for make_vpq_dat…
HowardHuang1 May 15, 2026
34d2dc4
Merge branch 'main' into HH-Dataset-API
HowardHuang1 May 15, 2026
3298366
remove ace_build_result. build_ace() now returns index only. Deprecat…
HowardHuang1 May 15, 2026
0af9527
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 May 15, 2026
6459568
remove all instances of build_ace() on public API surface. Now it's o…
HowardHuang1 May 15, 2026
e3cf3d3
unify two index dataset storage variables into one
HowardHuang1 May 15, 2026
e819312
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 May 18, 2026
1c1eb55
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 May 18, 2026
fa31267
Get rid of merge_result. Pulled out nested merged dataset creation fr…
HowardHuang1 May 18, 2026
40bc7eb
fix merge conflict in cagra_build_inst.cu.in and merge upstream main
HowardHuang1 May 22, 2026
fd9d591
fix merge conflicts by adding CUVS_EXPORT after recent upstream chang…
HowardHuang1 May 22, 2026
186d81e
change make_vpq_dataset() factory to accept template mdspan parameter…
HowardHuang1 May 22, 2026
06e879d
remove 3 deprecated paths, remove deprecated strided_dataset, remove …
HowardHuang1 May 23, 2026
d95dd91
add missing update_dataset() calls after build() since build() no lon…
HowardHuang1 May 26, 2026
a8d27a6
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 May 28, 2026
44e8888
add update_dataset() at the end of detail::build_from_device_matrix a…
HowardHuang1 May 28, 2026
6021700
restore raft copy and simplify variant with std::visit
HowardHuang1 May 28, 2026
34f6460
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 Jun 2, 2026
8b3d8f8
template index on DatasetViewT to get rid of variants. Use padded_ind…
HowardHuang1 Jun 3, 2026
5411928
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 Jun 3, 2026
de2000b
remove update_dataset() call at the end of detail::build_from_device_…
HowardHuang1 Jun 3, 2026
c0190fa
fix failing cpp test cases due to missing update_dataset() calls afte…
HowardHuang1 Jun 4, 2026
baab6a7
add host counterparts to dataset API so device vs host can be disting…
HowardHuang1 Jun 4, 2026
98ef788
Merge remote-tracking branch 'upstream' into HH-Dataset-API
Jun 8, 2026
6fdfebf
template build_ace and host build on DatasetViewT and add attach_devi…
HowardHuang1 Jun 8, 2026
f356e48
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 Jun 9, 2026
53ef0e6
combine host build and device build into one build function in cagra.…
HowardHuang1 Jun 9, 2026
428542e
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 Jun 9, 2026
6e9b7a5
add templating on extend()
HowardHuang1 Jun 9, 2026
178eb3f
replace templates on public API surface with concrete index type over…
HowardHuang1 Jun 9, 2026
a09c834
remove deprecated build() overloads that take host/device_matrix_view…
HowardHuang1 Jun 9, 2026
c3af8bd
Remove variants from serialize and deserialize. Fix to just device_pa…
HowardHuang1 Jun 10, 2026
dfedfb9
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 Jun 10, 2026
6d756e5
remove variants completely. Remove variant usage from vamana
HowardHuang1 Jun 10, 2026
828c371
add fixes at call sites once variants were removed completely
HowardHuang1 Jun 11, 2026
c630451
template serialize/deserialize on DatasetViewT. Users are now expecte…
HowardHuang1 Jun 11, 2026
4258dc5
Fix FAISS to use new templated index. Add a default so that we don't …
HowardHuang1 Jun 11, 2026
f58c21e
Fix cuvs_cagra_wrapper.h: use int64_t extents and host_padded_dataset…
HowardHuang1 Jun 11, 2026
e0fce27
Fix FAISS CuvsCagra::train() to use dataset_view instead of raw mdspan
HowardHuang1 Jun 11, 2026
73bb010
Fix Python ACE test failures: use-after-free, missing FD transfers, d…
HowardHuang1 Jun 11, 2026
0dfeffe
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 Jun 11, 2026
9c024c6
Fix corrupt hunk header in faiss-1.14-cuvs-26.06.diff
HowardHuang1 Jun 11, 2026
55736de
bring back attach_dataset_on_build param. It only applies to the devi…
HowardHuang1 Jun 11, 2026
af2fd42
Fix BinaryCuvsCagra::train() device path to use make_device_padded_da…
HowardHuang1 Jun 11, 2026
598e861
Fix use-after-free in convert_host_to_device_index (MG CAGRA segfault)
HowardHuang1 Jun 12, 2026
e795819
minor fix for update_graph overload confusion
HowardHuang1 Jun 12, 2026
26b87e5
fix FAISS to call update_dataset() with padded dataset after deprecat…
HowardHuang1 Jun 14, 2026
2804440
remove deprecated update_dataset() overload taking in device_matrix_v…
HowardHuang1 Jun 15, 2026
48fc8d5
update examples/cpp/CMakeLists.txt to use C++20 to support concepts. …
HowardHuang1 Jun 15, 2026
ff8cc82
Revert "update examples/cpp/CMakeLists.txt to use C++20 to support co…
HowardHuang1 Jun 15, 2026
4d7d0a6
move FAISS changes for new Dataset API into separate 26.08 patch
HowardHuang1 Jun 15, 2026
bb275f1
use raft::copy_matrix instead of cudaMemcpy2DAsync
HowardHuang1 Jun 15, 2026
217e5bd
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 Jun 16, 2026
8001bf4
fix two examples that still use the old cagra API. Migrated them over…
HowardHuang1 Jun 16, 2026
3803e00
Merge remote-tracking branch 'upstream' into HH-Dataset-API
HowardHuang1 Jun 25, 2026
c31ea7c
fix merge conflict. Recover missing line
HowardHuang1 Jun 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 4 additions & 8 deletions c/include/cuvs/neighbors/cagra.h
Original file line number Diff line number Diff line change
Expand Up @@ -211,12 +211,6 @@ struct cuvsCagraIndexParams {
enum cuvsCagraGraphBuildAlgo build_algo;
/** Number of Iterations to run if building with NN_DESCENT */
size_t nn_descent_niter;
/**
* Optional: specify compression parameters if compression is desired.
*
* NOTE: this is experimental new API, consider it unsafe.
*/
cuvsCagraCompressionParams_t compression;
/**
* Optional: specify graph build params based on build_algo
* - IVF_PQ: cuvsIvfPqParams_t
Expand Down Expand Up @@ -466,13 +460,15 @@ CUVS_EXPORT cuvsError_t cuvsCagraSearchParamsDestroy(cuvsCagraSearchParams_t par
*/

/**
* @brief Struct to hold address of cuvs::neighbors::cagra::index and its active trained dtype
* @brief Struct holding the CAGRA index storage address and vector element dtype (DLPack-style)
*
* Matches the usual cuVS C index pattern (`addr` + `dtype`). \p addr points at implementation-owned
* storage (not always a bare `cagra::index*`); free only via \ref cuvsCagraIndexDestroy. \p dtype
* describes index vector elements for queries and template dispatch.
*/
typedef struct {
uintptr_t addr;
DLDataType dtype;

} cuvsCagraIndex;

typedef cuvsCagraIndex* cuvsCagraIndex_t;
Expand Down
459 changes: 352 additions & 107 deletions c/src/neighbors/cagra.cpp

Large diffs are not rendered by default.

5 changes: 4 additions & 1 deletion c/src/neighbors/cagra.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION.
* SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION.
* SPDX-License-Identifier: Apache-2.0
*/
#include <cuvs/neighbors/cagra.h>
Expand All @@ -15,4 +15,7 @@ void convert_c_index_params(cuvsCagraIndexParams params,
/// Converts C search params to C++
void convert_c_search_params(cuvsCagraSearchParams params,
cuvs::neighbors::cagra::search_params* out);

/** Resolves `cuvsCagraIndex::addr` to `cagra::index*`; nullptr if the handle is empty. */
void* cagra_c_api_index_ptr(cuvsCagraIndex const* idx);
} // namespace cuvs::neighbors::cagra
4 changes: 3 additions & 1 deletion c/src/neighbors/hnsw.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

#include "../core/exceptions.hpp"
#include "../core/interop.hpp"
#include "cagra.hpp"

namespace {

Expand Down Expand Up @@ -63,7 +64,8 @@ void _from_cagra(cuvsResources_t res,
std::optional<DLManagedTensor*> dataset_tensor)
{
auto res_ptr = reinterpret_cast<raft::resources*>(res);
auto index = reinterpret_cast<cuvs::neighbors::cagra::index<T, uint32_t>*>(cagra_index->addr);
auto index = reinterpret_cast<cuvs::neighbors::cagra::device_padded_index<T, uint32_t>*>(
cuvs::neighbors::cagra::cagra_c_api_index_ptr(cagra_index));
auto cpp_params = cuvs::neighbors::hnsw::index_params();
cpp_params.hierarchy = static_cast<cuvs::neighbors::hnsw::HnswHierarchy>(params->hierarchy);
cpp_params.ef_construction = params->ef_construction;
Expand Down
20 changes: 10 additions & 10 deletions c/src/neighbors/mg_cagra.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,26 +84,26 @@ extern "C" cuvsError_t cuvsMultiGpuCagraIndexDestroy(cuvsMultiGpuCagraIndex_t in
// Properly clean up the templated inner object based on dtype, like single GPU API
if (index->dtype.code == kDLFloat && index->dtype.bits == 32) {
auto mg_index_ptr =
reinterpret_cast<cuvs::neighbors::mg_index<cuvs::neighbors::cagra::index<float, uint32_t>,
reinterpret_cast<cuvs::neighbors::mg_index<cuvs::neighbors::cagra::device_padded_index<float, uint32_t>,
float,
uint32_t>*>(index->addr);
delete mg_index_ptr;
} else if (index->dtype.code == kDLFloat && index->dtype.bits == 16) {
auto mg_index_ptr =
reinterpret_cast<cuvs::neighbors::mg_index<cuvs::neighbors::cagra::index<half, uint32_t>,
reinterpret_cast<cuvs::neighbors::mg_index<cuvs::neighbors::cagra::device_padded_index<half, uint32_t>,
half,
uint32_t>*>(index->addr);
delete mg_index_ptr;
} else if (index->dtype.code == kDLInt && index->dtype.bits == 8) {
auto mg_index_ptr = reinterpret_cast<
cuvs::neighbors::
mg_index<cuvs::neighbors::cagra::index<int8_t, uint32_t>, int8_t, uint32_t>*>(
mg_index<cuvs::neighbors::cagra::device_padded_index<int8_t, uint32_t>, int8_t, uint32_t>*>(
index->addr);
delete mg_index_ptr;
} else if (index->dtype.code == kDLUInt && index->dtype.bits == 8) {
auto mg_index_ptr = reinterpret_cast<
cuvs::neighbors::
mg_index<cuvs::neighbors::cagra::index<uint8_t, uint32_t>, uint8_t, uint32_t>*>(
mg_index<cuvs::neighbors::cagra::device_padded_index<uint8_t, uint32_t>, uint8_t, uint32_t>*>(
index->addr);
delete mg_index_ptr;
}
Expand Down Expand Up @@ -159,7 +159,7 @@ void* _mg_build(cuvsResources_t res,
auto mds = cuvs::core::from_dlpack<mdspan_type>(dataset_tensor);

auto mg_index =
new cuvs::neighbors::mg_index<cuvs::neighbors::cagra::index<T, uint32_t>, T, uint32_t>(
new cuvs::neighbors::mg_index<cuvs::neighbors::cagra::device_padded_index<T, uint32_t>, T, uint32_t>(
cuvs::neighbors::cagra::build(*res_ptr, mg_params, mds));

return mg_index;
Expand All @@ -175,7 +175,7 @@ void _mg_search(cuvsResources_t res,
{
auto res_ptr = reinterpret_cast<raft::resources*>(res);
auto mg_index_ptr = reinterpret_cast<
cuvs::neighbors::mg_index<cuvs::neighbors::cagra::index<T, uint32_t>, T, uint32_t>*>(
cuvs::neighbors::mg_index<cuvs::neighbors::cagra::device_padded_index<T, uint32_t>, T, uint32_t>*>(
index.addr);

auto mg_search_params =
Expand All @@ -202,7 +202,7 @@ void _mg_extend(cuvsResources_t res,
{
auto res_ptr = reinterpret_cast<raft::resources*>(res);
auto mg_index_ptr = reinterpret_cast<
cuvs::neighbors::mg_index<cuvs::neighbors::cagra::index<T, uint32_t>, T, uint32_t>*>(
cuvs::neighbors::mg_index<cuvs::neighbors::cagra::device_padded_index<T, uint32_t>, T, uint32_t>*>(
index.addr);

using vectors_mdspan_type = raft::host_matrix_view<const T, int64_t, raft::row_major>;
Expand All @@ -222,7 +222,7 @@ void _mg_serialize(cuvsResources_t res, cuvsMultiGpuCagraIndex index, const char
{
auto res_ptr = reinterpret_cast<raft::resources*>(res);
auto mg_index_ptr = reinterpret_cast<
cuvs::neighbors::mg_index<cuvs::neighbors::cagra::index<T, uint32_t>, T, uint32_t>*>(
cuvs::neighbors::mg_index<cuvs::neighbors::cagra::device_padded_index<T, uint32_t>, T, uint32_t>*>(
index.addr);

cuvs::neighbors::cagra::serialize(*res_ptr, *mg_index_ptr, std::string(filename));
Expand All @@ -233,7 +233,7 @@ void* _mg_deserialize(cuvsResources_t res, const char* filename)
{
auto res_ptr = reinterpret_cast<raft::resources*>(res);
auto mg_index =
new cuvs::neighbors::mg_index<cuvs::neighbors::cagra::index<T, uint32_t>, T, uint32_t>(
new cuvs::neighbors::mg_index<cuvs::neighbors::cagra::device_padded_index<T, uint32_t>, T, uint32_t>(
cuvs::neighbors::cagra::deserialize<T, uint32_t>(*res_ptr, std::string(filename)));

return mg_index;
Expand All @@ -244,7 +244,7 @@ void* _mg_distribute(cuvsResources_t res, const char* filename)
{
auto res_ptr = reinterpret_cast<raft::resources*>(res);
auto mg_index =
new cuvs::neighbors::mg_index<cuvs::neighbors::cagra::index<T, uint32_t>, T, uint32_t>(
new cuvs::neighbors::mg_index<cuvs::neighbors::cagra::device_padded_index<T, uint32_t>, T, uint32_t>(
cuvs::neighbors::cagra::distribute<T, uint32_t>(*res_ptr, std::string(filename)));

return mg_index;
Expand Down
12 changes: 6 additions & 6 deletions c/src/neighbors/tiered_index.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION.
* SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION.
* SPDX-License-Identifier: Apache-2.0
*/

Expand Down Expand Up @@ -71,7 +71,7 @@ void* _build(cuvsResources_t res, cuvsTieredIndexParams params, DLManagedTensor*
case CUVS_TIERED_INDEX_ALGO_CAGRA: {
auto build_params = tiered_index::index_params<cagra::index_params>();
convert_c_index_params(params, dataset.shape[0], dataset.shape[1], &build_params);
return new tiered_index::index<cagra::index<T, uint32_t>>(
return new tiered_index::index<cagra::device_padded_index<T, uint32_t>>(
tiered_index::build(*res_ptr, build_params, mds));
}
case CUVS_TIERED_INDEX_ALGO_IVF_FLAT: {
Expand Down Expand Up @@ -219,7 +219,7 @@ extern "C" cuvsError_t cuvsTieredIndexDestroy(cuvsTieredIndex_t index_c_ptr)
switch (index.algo) {
case CUVS_TIERED_INDEX_ALGO_CAGRA: {
auto index_ptr =
reinterpret_cast<tiered_index::index<cagra::index<float, uint32_t>>*>(index.addr);
reinterpret_cast<tiered_index::index<cagra::device_padded_index<float, uint32_t>>*>(index.addr);
delete index_ptr;
break;
}
Expand Down Expand Up @@ -292,7 +292,7 @@ extern "C" cuvsError_t cuvsTieredIndexSearch(cuvsResources_t res,

switch (index.algo) {
case CUVS_TIERED_INDEX_ALGO_CAGRA: {
_search<cagra::index<float, uint32_t>>(
_search<cagra::device_padded_index<float, uint32_t>>(
res, search_params, index, queries_tensor, neighbors_tensor, distances_tensor, filter);
break;
}
Expand Down Expand Up @@ -336,7 +336,7 @@ extern "C" cuvsError_t cuvsTieredIndexExtend(cuvsResources_t res,
auto index = *index_c_ptr;
switch (index.algo) {
case CUVS_TIERED_INDEX_ALGO_CAGRA: {
_extend<cagra::index<float, uint32_t>>(res, new_vectors, index);
_extend<cagra::device_padded_index<float, uint32_t>>(res, new_vectors, index);
break;
}
case CUVS_TIERED_INDEX_ALGO_IVF_FLAT: {
Expand All @@ -363,7 +363,7 @@ extern "C" cuvsError_t cuvsTieredIndexMerge(cuvsResources_t res,

switch (indices[0]->algo) {
case CUVS_TIERED_INDEX_ALGO_CAGRA: {
_merge<cagra::index<float, uint32_t>>(res, *params, indices, num_indices, output_index);
_merge<cagra::device_padded_index<float, uint32_t>>(res, *params, indices, num_indices, output_index);
break;
}
case CUVS_TIERED_INDEX_ALGO_IVF_FLAT: {
Expand Down
24 changes: 17 additions & 7 deletions c/tests/neighbors/ann_cagra_c.cu
Original file line number Diff line number Diff line change
Expand Up @@ -165,12 +165,23 @@ TEST(CagraC, BuildExtendSearch)
(main_data_size + additional_data_size + num_queries) * dimensions, stream);
rmm::device_uvector<int32_t> random_labels_d(
(main_data_size + additional_data_size + num_queries) * dimensions, stream);
raft::random::make_blobs(random_data_d.data(),
random_labels_d.data(),
main_data_size + additional_data_size + num_queries,
dimensions,
10,
stream);

raft::random::make_blobs<float, int32_t>(
random_data_d.data(),
random_labels_d.data(),
main_data_size + additional_data_size + num_queries,
dimensions,
static_cast<int32_t>(10),
stream,
true,
nullptr,
nullptr,
1.0f,
true,
-10.0f,
10.0f,
42ULL,
raft::random::GenPC);

// create dataset DLTensor
rmm::device_uvector<float> main_d(main_data_size * dimensions, stream);
Expand Down Expand Up @@ -321,7 +332,6 @@ TEST(CagraC, BuildExtendSearch)
cuvsCagraSearch(
res, search_params, index, &queries_tensor, &neighbors_tensor, &distances_tensor, filter);

// check neighbors
ASSERT_TRUE(
cuvs::devArrMatch(min_cols.data_handle(), neighbors_d.data(), 4, cuvs::Compare<uint32_t>()));

Expand Down
5 changes: 3 additions & 2 deletions ci/validate_wheel.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,13 @@ PYDISTCHECK_ARGS=(
# PyPI hard limit is 1GiB, but try to keep these as small as possible
if [[ "${package_dir}" == "python/libcuvs" ]]; then
if [[ "${RAPIDS_CUDA_MAJOR}" == "12" ]]; then
# Cap is below PyPI’s 1 GiB limit; raise when the shipped libcuvs.so grows.
PYDISTCHECK_ARGS+=(
--max-allowed-size-compressed '350Mi'
--max-allowed-size-compressed '450Mi'
)
else
PYDISTCHECK_ARGS+=(
--max-allowed-size-compressed '220Mi'
--max-allowed-size-compressed '270Mi'
Comment thread
HowardHuang1 marked this conversation as resolved.
)
fi
elif [[ "${package_dir}" != "python/cuvs" ]]; then
Expand Down
7 changes: 0 additions & 7 deletions cpp/bench/ann/src/cuvs/cuvs_ann_bench_param_parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -330,13 +330,6 @@ void parse_build_param(const nlohmann::json& conf, cuvs::neighbors::cagra::index
std::max(params.graph_degree, params.intermediate_graph_degree);
}

nlohmann::json comp_search_conf = collect_conf_with_prefix(conf, "compression_");
if (!comp_search_conf.empty()) {
auto vpq_pams = params.compression.value_or(cuvs::neighbors::vpq_params{});
parse_build_param(comp_search_conf, vpq_pams);
params.compression.emplace(vpq_pams);
}

if (conf.contains("guarantee_connectivity")) {
params.guarantee_connectivity = conf.at("guarantee_connectivity");
}
Expand Down
39 changes: 26 additions & 13 deletions cpp/bench/ann/src/cuvs/cuvs_cagra_diskann_wrapper.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: Copyright (c) 2023-2025, NVIDIA CORPORATION.
* SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION.
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
Expand All @@ -10,10 +10,13 @@

#include <chrono>
#include <memory>
#include <optional>
#include <variant>

#include "../common/ann_types.hpp"
#include "../diskann/diskann_wrapper.h"
#include "cuvs_ann_bench_utils.h"
#include <cuvs/neighbors/dataset_view_concepts.hpp>
#include <cuvs/neighbors/vamana.hpp>
#include <utils.h>

Expand Down Expand Up @@ -165,18 +168,28 @@ void cuvs_cagra_diskann<T, IdxT>::save(const std::string& file) const

// try allocating a buffer for the dataset on host
try {
const cuvs::neighbors::strided_dataset<T, int64_t>* strided_dataset =
dynamic_cast<cuvs::neighbors::strided_dataset<T, int64_t>*>(
const_cast<cuvs::neighbors::dataset<int64_t>*>(&cagra_build_.get_index()->data()));
if (strided_dataset == nullptr) {
RAFT_LOG_DEBUG("dynamic_cast to strided_dataset failed");
auto const* idx_ptr = cagra_build_.get_index();
std::optional<raft::host_matrix<T, int64_t>> h_dataset = std::nullopt;
auto const& data_view = idx_ptr->data();
if constexpr (cuvs::neighbors::is_padded_dataset_view_v<std::decay_t<decltype(data_view)>>) {
auto const& v = data_view;
auto n_rows = v.n_rows();
auto dim = v.dim();
auto stride = v.stride();
h_dataset.emplace(raft::make_host_matrix<T, int64_t>(n_rows, dim));
raft::copy_matrix(h_dataset->data_handle(),
dim,
v.view().data_handle(),
stride,
dim,
n_rows,
raft::resource::get_cuda_stream(handle_));
} else {
auto h_dataset =
raft::make_host_matrix<T, int64_t>(strided_dataset->n_rows(), strided_dataset->dim());
raft::copy(h_dataset.data_handle(),
strided_dataset->view().data_handle(),
strided_dataset->n_rows() * strided_dataset->dim(),
raft::resource::get_cuda_stream(handle_));
RAFT_LOG_DEBUG("dataset serialization: index dataset is not device_padded_dataset_view");
}

if (h_dataset.has_value()) {
raft::resource::sync_stream(handle_);
std::string dataset_base_file = file + ".data";
std::ofstream dataset_of(dataset_base_file, std::ios::out | std::ios::binary);
if (!dataset_of) { RAFT_FAIL("Cannot open file %s", dataset_base_file.c_str()); }
Expand All @@ -187,7 +200,7 @@ void cuvs_cagra_diskann<T, IdxT>::save(const std::string& file) const
dataset_of.write((char*)&size, sizeof(int));
dataset_of.write((char*)&dim, sizeof(int));
for (int i = 0; i < size; i++) {
dataset_of.write((char*)(h_dataset.data_handle() + i * h_dataset.extent(1)),
dataset_of.write((char*)(h_dataset->data_handle() + i * h_dataset->extent(1)),
dim * sizeof(T));
}
dataset_of.close();
Expand Down
4 changes: 0 additions & 4 deletions cpp/bench/ann/src/cuvs/cuvs_cagra_hnswlib_wrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,11 +82,7 @@ class cuvs_cagra_hnswlib : public algo<T>, public algo_gpu {
template <typename T, typename IdxT>
void cuvs_cagra_hnswlib<T, IdxT>::build(const T* dataset, size_t nrow)
{
// when the data set is on host, we can pass it directly to HNSW
bool dataset_is_on_host = raft::get_device_for_address(dataset) == -1;

auto dataset_view = raft::make_host_matrix_view<const T, int64_t>(dataset, nrow, this->dim_);
// convert the index to HNSW format
hnsw_index_ = cuvs::neighbors::hnsw::build(handle_, build_param_.hnsw_index_params, dataset_view);
}

Expand Down
Loading
Loading