diff --git a/c/CMakeLists.txt b/c/CMakeLists.txt index 2439f9269f..d7fb7bfd3a 100644 --- a/c/CMakeLists.txt +++ b/c/CMakeLists.txt @@ -115,6 +115,8 @@ set_target_properties( POSITION_INDEPENDENT_CODE ON INTERFACE_POSITION_INDEPENDENT_CODE ON EXPORT_NAME c_api + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON ) # Setup the VERSION and SOVERSION of our library diff --git a/c/include/cuvs/cluster/kmeans.h b/c/include/cuvs/cluster/kmeans.h index 8f55edb925..2365b64b0d 100644 --- a/c/include/cuvs/cluster/kmeans.h +++ b/c/include/cuvs/cluster/kmeans.h @@ -10,6 +10,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -119,7 +121,7 @@ typedef struct cuvsKMeansParams* cuvsKMeansParams_t; * @param[in] params cuvsKMeansParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsKMeansParamsCreate(cuvsKMeansParams_t* params); +CUVS_EXPORT cuvsError_t cuvsKMeansParamsCreate(cuvsKMeansParams_t* params); /** * @brief De-allocate KMeans params @@ -127,7 +129,7 @@ cuvsError_t cuvsKMeansParamsCreate(cuvsKMeansParams_t* params); * @param[in] params * @return cuvsError_t */ -cuvsError_t cuvsKMeansParamsDestroy(cuvsKMeansParams_t params); +CUVS_EXPORT cuvsError_t cuvsKMeansParamsDestroy(cuvsKMeansParams_t params); /** * @brief Type of k-means algorithm. @@ -173,7 +175,7 @@ typedef enum { CUVS_KMEANS_TYPE_KMEANS = 0, CUVS_KMEANS_TYPE_KMEANS_BALANCED = 1 * closest cluster center. * @param[out] n_iter Number of iterations run. */ -cuvsError_t cuvsKMeansFit(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsKMeansFit(cuvsResources_t res, cuvsKMeansParams_t params, DLManagedTensor* X, DLManagedTensor* sample_weight, @@ -200,7 +202,7 @@ cuvsError_t cuvsKMeansFit(cuvsResources_t res, * @param[out] inertia Sum of squared distances of samples to * their closest cluster center. */ -cuvsError_t cuvsKMeansPredict(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsKMeansPredict(cuvsResources_t res, cuvsKMeansParams_t params, DLManagedTensor* X, DLManagedTensor* sample_weight, @@ -222,7 +224,7 @@ cuvsError_t cuvsKMeansPredict(cuvsResources_t res, * @param[out] cost Resulting cluster cost * */ -cuvsError_t cuvsKMeansClusterCost(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsKMeansClusterCost(cuvsResources_t res, DLManagedTensor* X, DLManagedTensor* centroids, double* cost); diff --git a/c/include/cuvs/core/all.h b/c/include/cuvs/core/all.h index e34e584b9a..6834f1b095 100644 --- a/c/include/cuvs/core/all.h +++ b/c/include/cuvs/core/all.h @@ -9,6 +9,7 @@ #pragma once #include +#include #include #include diff --git a/c/include/cuvs/core/c_api.h b/c/include/cuvs/core/c_api.h index b9941d6ae4..00d4729481 100644 --- a/c/include/cuvs/core/c_api.h +++ b/c/include/cuvs/core/c_api.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ @@ -10,6 +10,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -27,13 +29,13 @@ typedef enum { CUVS_ERROR = 0, CUVS_SUCCESS = 1 } cuvsError_t; /** @brief Returns a string describing the last seen error on this thread, or * NULL if the last function succeeded. */ -const char* cuvsGetLastErrorText(); +CUVS_EXPORT const char* cuvsGetLastErrorText(); /** * @brief Sets a string describing an error seen on the thread. Passing NULL * clears any previously seen error message. */ -void cuvsSetLastErrorText(const char* error); +CUVS_EXPORT void cuvsSetLastErrorText(const char* error); /** @} */ @@ -58,11 +60,11 @@ typedef enum { /** @brief Returns the current log level */ -cuvsLogLevel_t cuvsGetLogLevel(); +CUVS_EXPORT cuvsLogLevel_t cuvsGetLogLevel(); /** @brief Sets the log level */ -void cuvsSetLogLevel(cuvsLogLevel_t); +CUVS_EXPORT void cuvsSetLogLevel(cuvsLogLevel_t); /** @} */ @@ -83,7 +85,7 @@ typedef uintptr_t cuvsResources_t; * @param[in] res cuvsResources_t opaque C handle * @return cuvsError_t */ -cuvsError_t cuvsResourcesCreate(cuvsResources_t* res); +CUVS_EXPORT cuvsError_t cuvsResourcesCreate(cuvsResources_t* res); /** * @brief Destroy and de-allocate opaque C handle for C++ type `raft::resources` @@ -91,7 +93,7 @@ cuvsError_t cuvsResourcesCreate(cuvsResources_t* res); * @param[in] res cuvsResources_t opaque C handle * @return cuvsError_t */ -cuvsError_t cuvsResourcesDestroy(cuvsResources_t res); +CUVS_EXPORT cuvsError_t cuvsResourcesDestroy(cuvsResources_t res); /** * @brief Set cudaStream_t on cuvsResources_t to queue CUDA kernels on APIs @@ -101,7 +103,7 @@ cuvsError_t cuvsResourcesDestroy(cuvsResources_t res); * @param[in] stream cudaStream_t stream to queue CUDA kernels * @return cuvsError_t */ -cuvsError_t cuvsStreamSet(cuvsResources_t res, cudaStream_t stream); +CUVS_EXPORT cuvsError_t cuvsStreamSet(cuvsResources_t res, cudaStream_t stream); /** * @brief Get the cudaStream_t from a cuvsResources_t @@ -110,7 +112,7 @@ cuvsError_t cuvsStreamSet(cuvsResources_t res, cudaStream_t stream); * @param[out] stream cudaStream_t stream to queue CUDA kernels * @return cuvsError_t */ -cuvsError_t cuvsStreamGet(cuvsResources_t res, cudaStream_t* stream); +CUVS_EXPORT cuvsError_t cuvsStreamGet(cuvsResources_t res, cudaStream_t* stream); /** * @brief Syncs the current CUDA stream on the resources object @@ -118,7 +120,7 @@ cuvsError_t cuvsStreamGet(cuvsResources_t res, cudaStream_t* stream); * @param[in] res cuvsResources_t opaque C handle * @return cuvsError_t */ -cuvsError_t cuvsStreamSync(cuvsResources_t res); +CUVS_EXPORT cuvsError_t cuvsStreamSync(cuvsResources_t res); /** * @brief Get the id of the device associated with this cuvsResources_t @@ -127,7 +129,7 @@ cuvsError_t cuvsStreamSync(cuvsResources_t res); * @param[out] device_id int the id of the device associated with res * @return cuvsError_t */ -cuvsError_t cuvsDeviceIdGet(cuvsResources_t res, int* device_id); +CUVS_EXPORT cuvsError_t cuvsDeviceIdGet(cuvsResources_t res, int* device_id); /** * @brief Create an Initialized opaque C handle for C++ type `raft::device_resources_snmg` @@ -136,7 +138,7 @@ cuvsError_t cuvsDeviceIdGet(cuvsResources_t res, int* device_id); * @param[in] res cuvsResources_t opaque C handle * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuResourcesCreate(cuvsResources_t* res); +CUVS_EXPORT cuvsError_t cuvsMultiGpuResourcesCreate(cuvsResources_t* res); /** * @brief Create an Initialized opaque C handle for C++ type `raft::device_resources_snmg` @@ -146,7 +148,7 @@ cuvsError_t cuvsMultiGpuResourcesCreate(cuvsResources_t* res); * @param[in] device_ids DLManagedTensor* containing device IDs to use * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuResourcesCreateWithDeviceIds(cuvsResources_t* res, +CUVS_EXPORT cuvsError_t cuvsMultiGpuResourcesCreateWithDeviceIds(cuvsResources_t* res, DLManagedTensor* device_ids); /** @@ -155,7 +157,7 @@ cuvsError_t cuvsMultiGpuResourcesCreateWithDeviceIds(cuvsResources_t* res, * @param[in] res cuvsResources_t opaque C handle * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuResourcesDestroy(cuvsResources_t res); +CUVS_EXPORT cuvsError_t cuvsMultiGpuResourcesDestroy(cuvsResources_t res); /** * @brief Set a memory pool on all devices managed by the multi-GPU resources @@ -164,7 +166,7 @@ cuvsError_t cuvsMultiGpuResourcesDestroy(cuvsResources_t res); * @param[in] percent_of_free_memory Percent of free memory to allocate for the pool * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuResourcesSetMemoryPool(cuvsResources_t res, int percent_of_free_memory); +CUVS_EXPORT cuvsError_t cuvsMultiGpuResourcesSetMemoryPool(cuvsResources_t res, int percent_of_free_memory); /** @} */ /** @@ -181,7 +183,7 @@ cuvsError_t cuvsMultiGpuResourcesSetMemoryPool(cuvsResources_t res, int percent_ * @param[in] bytes Size in bytes to allocate * @return cuvsError_t */ -cuvsError_t cuvsRMMAlloc(cuvsResources_t res, void** ptr, size_t bytes); +CUVS_EXPORT cuvsError_t cuvsRMMAlloc(cuvsResources_t res, void** ptr, size_t bytes); /** * @brief Deallocates device memory using RMM @@ -191,7 +193,7 @@ cuvsError_t cuvsRMMAlloc(cuvsResources_t res, void** ptr, size_t bytes); * @param[in] bytes Size in bytes to allocate * @return cuvsError_t */ -cuvsError_t cuvsRMMFree(cuvsResources_t res, void* ptr, size_t bytes); +CUVS_EXPORT cuvsError_t cuvsRMMFree(cuvsResources_t res, void* ptr, size_t bytes); /** * @brief Switches the working memory resource to use the RMM pool memory resource, which will @@ -207,14 +209,14 @@ cuvsError_t cuvsRMMFree(cuvsResources_t res, void* ptr, size_t bytes); * @param[in] managed Whether to use a managed memory resource as upstream resource or not * @return cuvsError_t */ -cuvsError_t cuvsRMMPoolMemoryResourceEnable(int initial_pool_size_percent, +CUVS_EXPORT cuvsError_t cuvsRMMPoolMemoryResourceEnable(int initial_pool_size_percent, int max_pool_size_percent, bool managed); /** * @brief Resets the memory resource to use the default memory resource (cuda_memory_resource) * @return cuvsError_t */ -cuvsError_t cuvsRMMMemoryResourceReset(); +CUVS_EXPORT cuvsError_t cuvsRMMMemoryResourceReset(); /** * @brief Allocates pinned memory on the host using RMM @@ -222,7 +224,7 @@ cuvsError_t cuvsRMMMemoryResourceReset(); * @param[in] bytes Size in bytes to allocate * @return cuvsError_t */ -cuvsError_t cuvsRMMHostAlloc(void** ptr, size_t bytes); +CUVS_EXPORT cuvsError_t cuvsRMMHostAlloc(void** ptr, size_t bytes); /** * @brief Deallocates pinned memory on the host using RMM @@ -230,7 +232,7 @@ cuvsError_t cuvsRMMHostAlloc(void** ptr, size_t bytes); * @param[in] bytes Size in bytes to deallocate * @return cuvsError_t */ -cuvsError_t cuvsRMMHostFree(void* ptr, size_t bytes); +CUVS_EXPORT cuvsError_t cuvsRMMHostFree(void* ptr, size_t bytes); /** * @brief Get the version of the cuVS library @@ -239,7 +241,7 @@ cuvsError_t cuvsRMMHostFree(void* ptr, size_t bytes); * @param[out] patch Patch version * @return cuvsError_t */ -cuvsError_t cuvsVersionGet(uint16_t* major, uint16_t* minor, uint16_t* patch); +CUVS_EXPORT cuvsError_t cuvsVersionGet(uint16_t* major, uint16_t* minor, uint16_t* patch); /** * @brief Copy a matrix @@ -256,7 +258,7 @@ cuvsError_t cuvsVersionGet(uint16_t* major, uint16_t* minor, uint16_t* patch); * @param[in] src Pointer to DLManagedTensor to copy * @param[out] dst Pointer to DLManagedTensor to receive copy of data */ -cuvsError_t cuvsMatrixCopy(cuvsResources_t res, DLManagedTensor* src, DLManagedTensor* dst); +CUVS_EXPORT cuvsError_t cuvsMatrixCopy(cuvsResources_t res, DLManagedTensor* src, DLManagedTensor* dst); /** * @brief Slices rows from a matrix @@ -267,7 +269,7 @@ cuvsError_t cuvsMatrixCopy(cuvsResources_t res, DLManagedTensor* src, DLManagedT * @param[in] end Last row index to include in the output * @param[out] dst Pointer to DLManagedTensor to receive slice from matrix */ -cuvsError_t cuvsMatrixSliceRows( +CUVS_EXPORT cuvsError_t cuvsMatrixSliceRows( cuvsResources_t res, DLManagedTensor* src, int64_t start, int64_t end, DLManagedTensor* dst); /** @} */ diff --git a/c/include/cuvs/core/export.h b/c/include/cuvs/core/export.h new file mode 100644 index 0000000000..7b6d2aae84 --- /dev/null +++ b/c/include/cuvs/core/export.h @@ -0,0 +1,18 @@ +/* + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +// Symbol visibility macros for cuVS shared libraries. +// When CXX_VISIBILITY_PRESET is set to hidden, only symbols explicitly +// marked with CUVS_EXPORT will be visible in the shared library. +// CUVS_HIDDEN can be used to explicitly mark symbols as hidden. +#if (defined(__GNUC__) && !defined(__MINGW32__) && !defined(__MINGW64__)) +#define CUVS_EXPORT __attribute__((visibility("default"))) +#define CUVS_HIDDEN __attribute__((visibility("hidden"))) +#else +#define CUVS_EXPORT +#define CUVS_HIDDEN +#endif diff --git a/c/include/cuvs/distance/distance.h b/c/include/cuvs/distance/distance.h index 5bd65432a6..ebc64c043b 100644 --- a/c/include/cuvs/distance/distance.h +++ b/c/include/cuvs/distance/distance.h @@ -1,9 +1,11 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2024, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ #pragma once +#include + #ifdef __cplusplus extern "C" { #endif diff --git a/c/include/cuvs/distance/pairwise_distance.h b/c/include/cuvs/distance/pairwise_distance.h index e10072f653..0dbe41d5d7 100644 --- a/c/include/cuvs/distance/pairwise_distance.h +++ b/c/include/cuvs/distance/pairwise_distance.h @@ -8,6 +8,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -45,7 +47,7 @@ extern "C" { * @param[in] metric distance to evaluate * @param[in] metric_arg metric argument (used for Minkowski distance) */ -cuvsError_t cuvsPairwiseDistance(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsPairwiseDistance(cuvsResources_t res, DLManagedTensor* x, DLManagedTensor* y, DLManagedTensor* dist, diff --git a/c/include/cuvs/neighbors/all_neighbors.h b/c/include/cuvs/neighbors/all_neighbors.h index f121b5cc33..96f0dd4a83 100644 --- a/c/include/cuvs/neighbors/all_neighbors.h +++ b/c/include/cuvs/neighbors/all_neighbors.h @@ -12,6 +12,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -67,7 +69,7 @@ typedef struct cuvsAllNeighborsIndexParams* cuvsAllNeighborsIndexParams_t; * * @return cuvsError_t */ -cuvsError_t cuvsAllNeighborsIndexParamsCreate(cuvsAllNeighborsIndexParams_t* index_params); +CUVS_EXPORT cuvsError_t cuvsAllNeighborsIndexParamsCreate(cuvsAllNeighborsIndexParams_t* index_params); /** * @brief Destroy an all-neighbors index parameters struct. @@ -76,7 +78,7 @@ cuvsError_t cuvsAllNeighborsIndexParamsCreate(cuvsAllNeighborsIndexParams_t* ind * * @return cuvsError_t */ -cuvsError_t cuvsAllNeighborsIndexParamsDestroy(cuvsAllNeighborsIndexParams_t index_params); +CUVS_EXPORT cuvsError_t cuvsAllNeighborsIndexParamsDestroy(cuvsAllNeighborsIndexParams_t index_params); /** @} */ @@ -103,7 +105,7 @@ cuvsError_t cuvsAllNeighborsIndexParamsDestroy(cuvsAllNeighborsIndexParams_t ind * datasets, `n_clusters` must be 1 (no batching); `overlap_factor` is ignored. * Outputs always reside in device memory. */ -cuvsError_t cuvsAllNeighborsBuild(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsAllNeighborsBuild(cuvsResources_t res, cuvsAllNeighborsIndexParams_t params, DLManagedTensor* dataset, DLManagedTensor* indices, diff --git a/c/include/cuvs/neighbors/brute_force.h b/c/include/cuvs/neighbors/brute_force.h index 170e1de9b2..3db424420d 100644 --- a/c/include/cuvs/neighbors/brute_force.h +++ b/c/include/cuvs/neighbors/brute_force.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ @@ -11,6 +11,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -36,14 +38,14 @@ typedef cuvsBruteForceIndex* cuvsBruteForceIndex_t; * @param[in] index cuvsBruteForceIndex_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsBruteForceIndexCreate(cuvsBruteForceIndex_t* index); +CUVS_EXPORT cuvsError_t cuvsBruteForceIndexCreate(cuvsBruteForceIndex_t* index); /** * @brief De-allocate BRUTEFORCE index * * @param[in] index cuvsBruteForceIndex_t to de-allocate */ -cuvsError_t cuvsBruteForceIndexDestroy(cuvsBruteForceIndex_t index); +CUVS_EXPORT cuvsError_t cuvsBruteForceIndexDestroy(cuvsBruteForceIndex_t index); /** * @} */ @@ -89,7 +91,7 @@ cuvsError_t cuvsBruteForceIndexDestroy(cuvsBruteForceIndex_t index); * @param[out] index cuvsBruteForceIndex_t Newly built BRUTEFORCE index * @return cuvsError_t */ -cuvsError_t cuvsBruteForceBuild(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsBruteForceBuild(cuvsResources_t res, DLManagedTensor* dataset, cuvsDistanceType metric, float metric_arg, @@ -145,7 +147,7 @@ cuvsError_t cuvsBruteForceBuild(cuvsResources_t res, * @param[in] prefilter cuvsFilter input prefilter that can be used to filter queries and neighbors based on the given bitmap. */ -cuvsError_t cuvsBruteForceSearch(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsBruteForceSearch(cuvsResources_t res, cuvsBruteForceIndex_t index, DLManagedTensor* queries, DLManagedTensor* neighbors, @@ -181,7 +183,7 @@ cuvsError_t cuvsBruteForceSearch(cuvsResources_t res, * @param[in] index BRUTEFORCE index * */ -cuvsError_t cuvsBruteForceSerialize(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsBruteForceSerialize(cuvsResources_t res, const char* filename, cuvsBruteForceIndex_t index); @@ -208,7 +210,7 @@ cuvsError_t cuvsBruteForceSerialize(cuvsResources_t res, * @param[in] filename the name of the file that stores the index * @param[out] index BRUTEFORCE index loaded disk */ -cuvsError_t cuvsBruteForceDeserialize(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsBruteForceDeserialize(cuvsResources_t res, const char* filename, cuvsBruteForceIndex_t index); diff --git a/c/include/cuvs/neighbors/cagra.h b/c/include/cuvs/neighbors/cagra.h index 3304e10f37..22809da37e 100644 --- a/c/include/cuvs/neighbors/cagra.h +++ b/c/include/cuvs/neighbors/cagra.h @@ -13,6 +13,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -232,7 +234,7 @@ typedef struct cuvsCagraIndexParams* cuvsCagraIndexParams_t; * @param[in] params cuvsCagraIndexParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsCagraIndexParamsCreate(cuvsCagraIndexParams_t* params); +CUVS_EXPORT cuvsError_t cuvsCagraIndexParamsCreate(cuvsCagraIndexParams_t* params); /** * @brief De-allocate CAGRA Index params @@ -240,7 +242,7 @@ cuvsError_t cuvsCagraIndexParamsCreate(cuvsCagraIndexParams_t* params); * @param[in] params * @return cuvsError_t */ -cuvsError_t cuvsCagraIndexParamsDestroy(cuvsCagraIndexParams_t params); +CUVS_EXPORT cuvsError_t cuvsCagraIndexParamsDestroy(cuvsCagraIndexParams_t params); /** * @brief Allocate CAGRA Compression params, and populate with default values @@ -248,7 +250,7 @@ cuvsError_t cuvsCagraIndexParamsDestroy(cuvsCagraIndexParams_t params); * @param[in] params cuvsCagraCompressionParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsCagraCompressionParamsCreate(cuvsCagraCompressionParams_t* params); +CUVS_EXPORT cuvsError_t cuvsCagraCompressionParamsCreate(cuvsCagraCompressionParams_t* params); /** * @brief De-allocate CAGRA Compression params @@ -256,7 +258,7 @@ cuvsError_t cuvsCagraCompressionParamsCreate(cuvsCagraCompressionParams_t* param * @param[in] params * @return cuvsError_t */ -cuvsError_t cuvsCagraCompressionParamsDestroy(cuvsCagraCompressionParams_t params); +CUVS_EXPORT cuvsError_t cuvsCagraCompressionParamsDestroy(cuvsCagraCompressionParams_t params); /** * @brief Allocate ACE params, and populate with default values @@ -264,7 +266,7 @@ cuvsError_t cuvsCagraCompressionParamsDestroy(cuvsCagraCompressionParams_t param * @param[in] params cuvsAceParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsAceParamsCreate(cuvsAceParams_t* params); +CUVS_EXPORT cuvsError_t cuvsAceParamsCreate(cuvsAceParams_t* params); /** * @brief De-allocate ACE params @@ -272,7 +274,7 @@ cuvsError_t cuvsAceParamsCreate(cuvsAceParams_t* params); * @param[in] params * @return cuvsError_t */ -cuvsError_t cuvsAceParamsDestroy(cuvsAceParams_t params); +CUVS_EXPORT cuvsError_t cuvsAceParamsDestroy(cuvsAceParams_t params); /** * @brief Create CAGRA index parameters similar to an HNSW index @@ -289,7 +291,7 @@ cuvsError_t cuvsAceParamsDestroy(cuvsAceParams_t params); * @param[in] metric Distance metric to use * @return cuvsError_t */ -cuvsError_t cuvsCagraIndexParamsFromHnswParams(cuvsCagraIndexParams_t params, +CUVS_EXPORT cuvsError_t cuvsCagraIndexParamsFromHnswParams(cuvsCagraIndexParams_t params, int64_t n_rows, int64_t dim, int M, @@ -326,7 +328,7 @@ typedef struct cuvsCagraExtendParams* cuvsCagraExtendParams_t; * @param[in] params cuvsCagraExtendParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsCagraExtendParamsCreate(cuvsCagraExtendParams_t* params); +CUVS_EXPORT cuvsError_t cuvsCagraExtendParamsCreate(cuvsCagraExtendParams_t* params); /** * @brief De-allocate CAGRA Extend params @@ -334,7 +336,7 @@ cuvsError_t cuvsCagraExtendParamsCreate(cuvsCagraExtendParams_t* params); * @param[in] params * @return cuvsError_t */ -cuvsError_t cuvsCagraExtendParamsDestroy(cuvsCagraExtendParams_t params); +CUVS_EXPORT cuvsError_t cuvsCagraExtendParamsDestroy(cuvsCagraExtendParams_t params); /** * @} @@ -444,7 +446,7 @@ typedef struct cuvsCagraSearchParams* cuvsCagraSearchParams_t; * @param[in] params cuvsCagraSearchParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsCagraSearchParamsCreate(cuvsCagraSearchParams_t* params); +CUVS_EXPORT cuvsError_t cuvsCagraSearchParamsCreate(cuvsCagraSearchParams_t* params); /** * @brief De-allocate CAGRA search params @@ -452,7 +454,7 @@ cuvsError_t cuvsCagraSearchParamsCreate(cuvsCagraSearchParams_t* params); * @param[in] params * @return cuvsError_t */ -cuvsError_t cuvsCagraSearchParamsDestroy(cuvsCagraSearchParams_t params); +CUVS_EXPORT cuvsError_t cuvsCagraSearchParamsDestroy(cuvsCagraSearchParams_t params); /** * @} @@ -481,14 +483,14 @@ typedef cuvsCagraIndex* cuvsCagraIndex_t; * @param[in] index cuvsCagraIndex_t to allocate * @return cagraError_t */ -cuvsError_t cuvsCagraIndexCreate(cuvsCagraIndex_t* index); +CUVS_EXPORT cuvsError_t cuvsCagraIndexCreate(cuvsCagraIndex_t* index); /** * @brief De-allocate CAGRA index * * @param[in] index cuvsCagraIndex_t to de-allocate */ -cuvsError_t cuvsCagraIndexDestroy(cuvsCagraIndex_t index); +CUVS_EXPORT cuvsError_t cuvsCagraIndexDestroy(cuvsCagraIndex_t index); /** * @brief Get dimension of the CAGRA index @@ -497,7 +499,7 @@ cuvsError_t cuvsCagraIndexDestroy(cuvsCagraIndex_t index); * @param[out] dim return dimension of the index * @return cuvsError_t */ -cuvsError_t cuvsCagraIndexGetDims(cuvsCagraIndex_t index, int64_t* dim); +CUVS_EXPORT cuvsError_t cuvsCagraIndexGetDims(cuvsCagraIndex_t index, int64_t* dim); /** * @brief Get size of the CAGRA index @@ -506,7 +508,7 @@ cuvsError_t cuvsCagraIndexGetDims(cuvsCagraIndex_t index, int64_t* dim); * @param[out] size return number of vectors in the index * @return cuvsError_t */ -cuvsError_t cuvsCagraIndexGetSize(cuvsCagraIndex_t index, int64_t* size); +CUVS_EXPORT cuvsError_t cuvsCagraIndexGetSize(cuvsCagraIndex_t index, int64_t* size); /** * @brief Get graph degree of the CAGRA index @@ -515,7 +517,7 @@ cuvsError_t cuvsCagraIndexGetSize(cuvsCagraIndex_t index, int64_t* size); * @param[out] graph_degree return graph degree * @return cuvsError_t */ -cuvsError_t cuvsCagraIndexGetGraphDegree(cuvsCagraIndex_t index, int64_t* graph_degree); +CUVS_EXPORT cuvsError_t cuvsCagraIndexGetGraphDegree(cuvsCagraIndex_t index, int64_t* graph_degree); /** * @brief Returns a view of the CAGRA dataset @@ -536,7 +538,7 @@ cuvsError_t cuvsCagraIndexGetGraphDegree(cuvsCagraIndex_t index, int64_t* graph_ * @param[out] dataset the dataset used in cagra * @return cuvsError_t */ -cuvsError_t cuvsCagraIndexGetDataset(cuvsCagraIndex_t index, DLManagedTensor* dataset); +CUVS_EXPORT cuvsError_t cuvsCagraIndexGetDataset(cuvsCagraIndex_t index, DLManagedTensor* dataset); /** * @brief Returns a view of the CAGRA graph @@ -557,7 +559,7 @@ cuvsError_t cuvsCagraIndexGetDataset(cuvsCagraIndex_t index, DLManagedTensor* da * @param[out] graph the output knn graph. * @return cuvsError_t */ -cuvsError_t cuvsCagraIndexGetGraph(cuvsCagraIndex_t index, DLManagedTensor* graph); +CUVS_EXPORT cuvsError_t cuvsCagraIndexGetGraph(cuvsCagraIndex_t index, DLManagedTensor* graph); /** * @} @@ -612,7 +614,7 @@ cuvsError_t cuvsCagraIndexGetGraph(cuvsCagraIndex_t index, DLManagedTensor* grap * created with cuvsCagraIndexCreate. * @return cuvsError_t */ -cuvsError_t cuvsCagraBuild(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsCagraBuild(cuvsResources_t res, cuvsCagraIndexParams_t params, DLManagedTensor* dataset, cuvsCagraIndex_t index); @@ -641,7 +643,7 @@ cuvsError_t cuvsCagraBuild(cuvsResources_t res, * @param[in,out] index cuvsCagraIndex_t CAGRA index * @return cuvsError_t */ -cuvsError_t cuvsCagraExtend(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsCagraExtend(cuvsResources_t res, cuvsCagraExtendParams_t params, DLManagedTensor* additional_dataset, cuvsCagraIndex_t index); @@ -704,7 +706,7 @@ cuvsError_t cuvsCagraExtend(cuvsResources_t res, * @param[in] filter cuvsFilter input filter that can be used to filter queries and neighbors based on the given bitset. */ -cuvsError_t cuvsCagraSearch(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsCagraSearch(cuvsResources_t res, cuvsCagraSearchParams_t params, cuvsCagraIndex_t index, DLManagedTensor* queries, @@ -742,7 +744,7 @@ cuvsError_t cuvsCagraSearch(cuvsResources_t res, * @param[in] include_dataset Whether or not to write out the dataset to the file. * */ -cuvsError_t cuvsCagraSerialize(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsCagraSerialize(cuvsResources_t res, const char* filename, cuvsCagraIndex_t index, bool include_dataset); @@ -771,7 +773,7 @@ cuvsError_t cuvsCagraSerialize(cuvsResources_t res, * @param[in] index CAGRA index * */ -cuvsError_t cuvsCagraSerializeToHnswlib(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsCagraSerializeToHnswlib(cuvsResources_t res, const char* filename, cuvsCagraIndex_t index); @@ -785,7 +787,7 @@ cuvsError_t cuvsCagraSerializeToHnswlib(cuvsResources_t res, * @param[inout] index cuvsCagraIndex_t CAGRA index loaded from disk. This index needs to be already * created with cuvsCagraIndexCreate. */ -cuvsError_t cuvsCagraDeserialize(cuvsResources_t res, const char* filename, cuvsCagraIndex_t index); +CUVS_EXPORT cuvsError_t cuvsCagraDeserialize(cuvsResources_t res, const char* filename, cuvsCagraIndex_t index); /** * Load index from a dataset and graph @@ -821,7 +823,7 @@ cuvsError_t cuvsCagraDeserialize(cuvsResources_t res, const char* filename, cuvs * * @endcode */ -cuvsError_t cuvsCagraIndexFromArgs(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsCagraIndexFromArgs(cuvsResources_t res, cuvsDistanceType metric, DLManagedTensor* graph, DLManagedTensor* dataset, @@ -888,7 +890,7 @@ cuvsError_t cuvsCagraIndexFromArgs(cuvsResources_t res, * @param[out] output_index Output handle that will store the merged index. * Must be initialized using `cuvsCagraIndexCreate` before use. */ -cuvsError_t cuvsCagraMerge(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsCagraMerge(cuvsResources_t res, cuvsCagraIndexParams_t params, cuvsCagraIndex_t* indices, size_t num_indices, diff --git a/c/include/cuvs/neighbors/common.h b/c/include/cuvs/neighbors/common.h index 80767ea726..d4a124b45c 100644 --- a/c/include/cuvs/neighbors/common.h +++ b/c/include/cuvs/neighbors/common.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ @@ -7,6 +7,8 @@ #include +#include + #ifdef __cplusplus extern "C" { #endif diff --git a/c/include/cuvs/neighbors/hnsw.h b/c/include/cuvs/neighbors/hnsw.h index b80ea65f03..15eb1b0569 100644 --- a/c/include/cuvs/neighbors/hnsw.h +++ b/c/include/cuvs/neighbors/hnsw.h @@ -13,6 +13,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -94,7 +96,7 @@ typedef struct cuvsHnswAceParams* cuvsHnswAceParams_t; * @param[in] params cuvsHnswAceParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsHnswAceParamsCreate(cuvsHnswAceParams_t* params); +CUVS_EXPORT cuvsError_t cuvsHnswAceParamsCreate(cuvsHnswAceParams_t* params); /** * @brief De-allocate HNSW ACE params @@ -102,7 +104,7 @@ cuvsError_t cuvsHnswAceParamsCreate(cuvsHnswAceParams_t* params); * @param[in] params * @return cuvsError_t */ -cuvsError_t cuvsHnswAceParamsDestroy(cuvsHnswAceParams_t params); +CUVS_EXPORT cuvsError_t cuvsHnswAceParamsDestroy(cuvsHnswAceParams_t params); struct cuvsHnswIndexParams { /* hierarchy of the hnsw index */ @@ -138,7 +140,7 @@ typedef struct cuvsHnswIndexParams* cuvsHnswIndexParams_t; * @param[in] params cuvsHnswIndexParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsHnswIndexParamsCreate(cuvsHnswIndexParams_t* params); +CUVS_EXPORT cuvsError_t cuvsHnswIndexParamsCreate(cuvsHnswIndexParams_t* params); /** * @brief De-allocate HNSW Index params @@ -146,7 +148,7 @@ cuvsError_t cuvsHnswIndexParamsCreate(cuvsHnswIndexParams_t* params); * @param[in] params * @return cuvsError_t */ -cuvsError_t cuvsHnswIndexParamsDestroy(cuvsHnswIndexParams_t params); +CUVS_EXPORT cuvsError_t cuvsHnswIndexParamsDestroy(cuvsHnswIndexParams_t params); /** * @} @@ -175,14 +177,14 @@ typedef cuvsHnswIndex* cuvsHnswIndex_t; * @param[in] index cuvsHnswIndex_t to allocate * @return HnswError_t */ -cuvsError_t cuvsHnswIndexCreate(cuvsHnswIndex_t* index); +CUVS_EXPORT cuvsError_t cuvsHnswIndexCreate(cuvsHnswIndex_t* index); /** * @brief De-allocate HNSW index * * @param[in] index cuvsHnswIndex_t to de-allocate */ -cuvsError_t cuvsHnswIndexDestroy(cuvsHnswIndex_t index); +CUVS_EXPORT cuvsError_t cuvsHnswIndexDestroy(cuvsHnswIndex_t index); /** * @} @@ -206,7 +208,7 @@ typedef struct cuvsHnswExtendParams* cuvsHnswExtendParams_t; * @param[in] params cuvsHnswExtendParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsHnswExtendParamsCreate(cuvsHnswExtendParams_t* params); +CUVS_EXPORT cuvsError_t cuvsHnswExtendParamsCreate(cuvsHnswExtendParams_t* params); /** * @brief De-allocate HNSW extend params @@ -215,7 +217,7 @@ cuvsError_t cuvsHnswExtendParamsCreate(cuvsHnswExtendParams_t* params); * @return cuvsError_t */ -cuvsError_t cuvsHnswExtendParamsDestroy(cuvsHnswExtendParams_t params); +CUVS_EXPORT cuvsError_t cuvsHnswExtendParamsDestroy(cuvsHnswExtendParams_t params); /** * @} @@ -267,12 +269,12 @@ cuvsError_t cuvsHnswExtendParamsDestroy(cuvsHnswExtendParams_t params); * cuvsError_t res_destroy_status = cuvsResourcesDestroy(res); * @endcode */ -cuvsError_t cuvsHnswFromCagra(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsHnswFromCagra(cuvsResources_t res, cuvsHnswIndexParams_t params, cuvsCagraIndex_t cagra_index, cuvsHnswIndex_t hnsw_index); -cuvsError_t cuvsHnswFromCagraWithDataset(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsHnswFromCagraWithDataset(cuvsResources_t res, cuvsHnswIndexParams_t params, cuvsCagraIndex_t cagra_index, cuvsHnswIndex_t hnsw_index, @@ -344,7 +346,7 @@ cuvsError_t cuvsHnswFromCagraWithDataset(cuvsResources_t res, * cuvsResourcesDestroy(res); * @endcode */ -cuvsError_t cuvsHnswBuild(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsHnswBuild(cuvsResources_t res, cuvsHnswIndexParams_t params, DLManagedTensor* dataset, cuvsHnswIndex_t index); @@ -402,7 +404,7 @@ cuvsError_t cuvsHnswBuild(cuvsResources_t res, * @endcode */ -cuvsError_t cuvsHnswExtend(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsHnswExtend(cuvsResources_t res, cuvsHnswExtendParams_t params, DLManagedTensor* additional_dataset, cuvsHnswIndex_t index); @@ -429,7 +431,7 @@ typedef struct cuvsHnswSearchParams* cuvsHnswSearchParams_t; * @param[in] params cuvsHnswSearchParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsHnswSearchParamsCreate(cuvsHnswSearchParams_t* params); +CUVS_EXPORT cuvsError_t cuvsHnswSearchParamsCreate(cuvsHnswSearchParams_t* params); /** * @brief De-allocate HNSW search params @@ -437,7 +439,7 @@ cuvsError_t cuvsHnswSearchParamsCreate(cuvsHnswSearchParams_t* params); * @param[in] params cuvsHnswSearchParams_t to de-allocate * @return cuvsError_t */ -cuvsError_t cuvsHnswSearchParamsDestroy(cuvsHnswSearchParams_t params); +CUVS_EXPORT cuvsError_t cuvsHnswSearchParamsDestroy(cuvsHnswSearchParams_t params); /** * @} @@ -496,7 +498,7 @@ cuvsError_t cuvsHnswSearchParamsDestroy(cuvsHnswSearchParams_t params); * @param[out] neighbors DLManagedTensor* output `k` neighbors for queries * @param[out] distances DLManagedTensor* output `k` distances for queries */ -cuvsError_t cuvsHnswSearch(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsHnswSearch(cuvsResources_t res, cuvsHnswSearchParams_t params, cuvsHnswIndex_t index, DLManagedTensor* queries, @@ -551,7 +553,7 @@ cuvsError_t cuvsHnswSearch(cuvsResources_t res, * cuvsError_t res_destroy_status = cuvsResourcesDestroy(res); * @endcode */ -cuvsError_t cuvsHnswSerialize(cuvsResources_t res, const char* filename, cuvsHnswIndex_t index); +CUVS_EXPORT cuvsError_t cuvsHnswSerialize(cuvsResources_t res, const char* filename, cuvsHnswIndex_t index); /** * Load hnswlib index from file which was serialized from a HNSW index. @@ -589,7 +591,7 @@ cuvsError_t cuvsHnswSerialize(cuvsResources_t res, const char* filename, cuvsHns * @param[in] metric the distance metric used to build the index * @param[out] index HNSW index loaded disk */ -cuvsError_t cuvsHnswDeserialize(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsHnswDeserialize(cuvsResources_t res, cuvsHnswIndexParams_t params, const char* filename, int dim, diff --git a/c/include/cuvs/neighbors/ivf_flat.h b/c/include/cuvs/neighbors/ivf_flat.h index 1580639481..e1531eb091 100644 --- a/c/include/cuvs/neighbors/ivf_flat.h +++ b/c/include/cuvs/neighbors/ivf_flat.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ @@ -12,6 +12,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -77,7 +79,7 @@ typedef struct cuvsIvfFlatIndexParams* cuvsIvfFlatIndexParams_t; * @param[in] index_params cuvsIvfFlatIndexParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsIvfFlatIndexParamsCreate(cuvsIvfFlatIndexParams_t* index_params); +CUVS_EXPORT cuvsError_t cuvsIvfFlatIndexParamsCreate(cuvsIvfFlatIndexParams_t* index_params); /** * @brief De-allocate IVF-Flat Index params @@ -85,7 +87,7 @@ cuvsError_t cuvsIvfFlatIndexParamsCreate(cuvsIvfFlatIndexParams_t* index_params) * @param[in] index_params * @return cuvsError_t */ -cuvsError_t cuvsIvfFlatIndexParamsDestroy(cuvsIvfFlatIndexParams_t index_params); +CUVS_EXPORT cuvsError_t cuvsIvfFlatIndexParamsDestroy(cuvsIvfFlatIndexParams_t index_params); /** * @} */ @@ -111,7 +113,7 @@ typedef struct cuvsIvfFlatSearchParams* cuvsIvfFlatSearchParams_t; * @param[in] params cuvsIvfFlatSearchParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsIvfFlatSearchParamsCreate(cuvsIvfFlatSearchParams_t* params); +CUVS_EXPORT cuvsError_t cuvsIvfFlatSearchParamsCreate(cuvsIvfFlatSearchParams_t* params); /** * @brief De-allocate IVF-Flat search params @@ -119,7 +121,7 @@ cuvsError_t cuvsIvfFlatSearchParamsCreate(cuvsIvfFlatSearchParams_t* params); * @param[in] params * @return cuvsError_t */ -cuvsError_t cuvsIvfFlatSearchParamsDestroy(cuvsIvfFlatSearchParams_t params); +CUVS_EXPORT cuvsError_t cuvsIvfFlatSearchParamsDestroy(cuvsIvfFlatSearchParams_t params); /** * @} */ @@ -145,20 +147,32 @@ typedef cuvsIvfFlatIndex* cuvsIvfFlatIndex_t; * @param[in] index cuvsIvfFlatIndex_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsIvfFlatIndexCreate(cuvsIvfFlatIndex_t* index); +CUVS_EXPORT cuvsError_t cuvsIvfFlatIndexCreate(cuvsIvfFlatIndex_t* index); /** * @brief De-allocate IVF-Flat index * * @param[in] index cuvsIvfFlatIndex_t to de-allocate */ -cuvsError_t cuvsIvfFlatIndexDestroy(cuvsIvfFlatIndex_t index); +CUVS_EXPORT cuvsError_t cuvsIvfFlatIndexDestroy(cuvsIvfFlatIndex_t index); -/** Get the number of clusters/inverted lists */ -cuvsError_t cuvsIvfFlatIndexGetNLists(cuvsIvfFlatIndex_t index, int64_t* n_lists); +/** + * @brief Get the number of clusters/inverted lists in the index + * + * @param[in] index cuvsIvfFlatIndex_t Built IVF-Flat index + * @param[out] n_lists Pointer to store the number of lists + * @return cuvsError_t + */ +CUVS_EXPORT cuvsError_t cuvsIvfFlatIndexGetNLists(cuvsIvfFlatIndex_t index, int64_t* n_lists); -/** Get the dimensionality of the data */ -cuvsError_t cuvsIvfFlatIndexGetDim(cuvsIvfFlatIndex_t index, int64_t* dim); +/** + * @brief Get the dimensionality of the indexed data + * + * @param[in] index cuvsIvfFlatIndex_t Built IVF-Flat index + * @param[out] dim Pointer to store the dimensionality + * @return cuvsError_t + */ +CUVS_EXPORT cuvsError_t cuvsIvfFlatIndexGetDim(cuvsIvfFlatIndex_t index, int64_t* dim); /** * @brief Get the cluster centers corresponding to the lists [n_lists, dim] @@ -167,7 +181,7 @@ cuvsError_t cuvsIvfFlatIndexGetDim(cuvsIvfFlatIndex_t index, int64_t* dim); * @param[out] centers Preallocated array on host or device memory to store output, [n_lists, dim] * @return cuvsError_t */ -cuvsError_t cuvsIvfFlatIndexGetCenters(cuvsIvfFlatIndex_t index, DLManagedTensor* centers); +CUVS_EXPORT cuvsError_t cuvsIvfFlatIndexGetCenters(cuvsIvfFlatIndex_t index, DLManagedTensor* centers); /** * @} @@ -219,7 +233,7 @@ cuvsError_t cuvsIvfFlatIndexGetCenters(cuvsIvfFlatIndex_t index, DLManagedTensor * @param[out] index cuvsIvfFlatIndex_t Newly built IVF-Flat index * @return cuvsError_t */ -cuvsError_t cuvsIvfFlatBuild(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsIvfFlatBuild(cuvsResources_t res, cuvsIvfFlatIndexParams_t index_params, DLManagedTensor* dataset, cuvsIvfFlatIndex_t index); @@ -276,7 +290,7 @@ cuvsError_t cuvsIvfFlatBuild(cuvsResources_t res, * @param[in] filter cuvsFilter input filter that can be used to filter queries and neighbors based on the given bitset. */ -cuvsError_t cuvsIvfFlatSearch(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsIvfFlatSearch(cuvsResources_t res, cuvsIvfFlatSearchParams_t search_params, cuvsIvfFlatIndex_t index, DLManagedTensor* queries, @@ -312,7 +326,7 @@ cuvsError_t cuvsIvfFlatSearch(cuvsResources_t res, * @param[in] filename the file name for saving the index * @param[in] index IVF-Flat index */ -cuvsError_t cuvsIvfFlatSerialize(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsIvfFlatSerialize(cuvsResources_t res, const char* filename, cuvsIvfFlatIndex_t index); @@ -325,7 +339,7 @@ cuvsError_t cuvsIvfFlatSerialize(cuvsResources_t res, * @param[in] filename the name of the file that stores the index * @param[out] index IVF-Flat index loaded disk */ -cuvsError_t cuvsIvfFlatDeserialize(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsIvfFlatDeserialize(cuvsResources_t res, const char* filename, cuvsIvfFlatIndex_t index); /** @@ -345,7 +359,7 @@ cuvsError_t cuvsIvfFlatDeserialize(cuvsResources_t res, * @param[inout] index IVF-Flat index to be extended * @return cuvsError_t */ -cuvsError_t cuvsIvfFlatExtend(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsIvfFlatExtend(cuvsResources_t res, DLManagedTensor* new_vectors, DLManagedTensor* new_indices, cuvsIvfFlatIndex_t index); diff --git a/c/include/cuvs/neighbors/ivf_pq.h b/c/include/cuvs/neighbors/ivf_pq.h index c780ab8065..687c8f8385 100644 --- a/c/include/cuvs/neighbors/ivf_pq.h +++ b/c/include/cuvs/neighbors/ivf_pq.h @@ -11,6 +11,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -141,7 +143,7 @@ typedef struct cuvsIvfPqIndexParams* cuvsIvfPqIndexParams_t; * @param[in] index_params cuvsIvfPqIndexParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsIvfPqIndexParamsCreate(cuvsIvfPqIndexParams_t* index_params); +CUVS_EXPORT cuvsError_t cuvsIvfPqIndexParamsCreate(cuvsIvfPqIndexParams_t* index_params); /** * @brief De-allocate IVF-PQ Index params @@ -149,7 +151,7 @@ cuvsError_t cuvsIvfPqIndexParamsCreate(cuvsIvfPqIndexParams_t* index_params); * @param[in] index_params * @return cuvsError_t */ -cuvsError_t cuvsIvfPqIndexParamsDestroy(cuvsIvfPqIndexParams_t index_params); +CUVS_EXPORT cuvsError_t cuvsIvfPqIndexParamsDestroy(cuvsIvfPqIndexParams_t index_params); /** * @} */ @@ -224,7 +226,7 @@ typedef struct cuvsIvfPqSearchParams* cuvsIvfPqSearchParams_t; * @param[in] params cuvsIvfPqSearchParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsIvfPqSearchParamsCreate(cuvsIvfPqSearchParams_t* params); +CUVS_EXPORT cuvsError_t cuvsIvfPqSearchParamsCreate(cuvsIvfPqSearchParams_t* params); /** * @brief De-allocate IVF-PQ search params @@ -232,7 +234,7 @@ cuvsError_t cuvsIvfPqSearchParamsCreate(cuvsIvfPqSearchParams_t* params); * @param[in] params * @return cuvsError_t */ -cuvsError_t cuvsIvfPqSearchParamsDestroy(cuvsIvfPqSearchParams_t params); +CUVS_EXPORT cuvsError_t cuvsIvfPqSearchParamsDestroy(cuvsIvfPqSearchParams_t params); /** * @} */ @@ -258,33 +260,33 @@ typedef cuvsIvfPqIndex* cuvsIvfPqIndex_t; * @param[in] index cuvsIvfPqIndex_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsIvfPqIndexCreate(cuvsIvfPqIndex_t* index); +CUVS_EXPORT cuvsError_t cuvsIvfPqIndexCreate(cuvsIvfPqIndex_t* index); /** * @brief De-allocate IVF-PQ index * * @param[in] index cuvsIvfPqIndex_t to de-allocate */ -cuvsError_t cuvsIvfPqIndexDestroy(cuvsIvfPqIndex_t index); +CUVS_EXPORT cuvsError_t cuvsIvfPqIndexDestroy(cuvsIvfPqIndex_t index); /** Get the number of clusters/inverted lists */ -cuvsError_t cuvsIvfPqIndexGetNLists(cuvsIvfPqIndex_t index, int64_t* n_lists); +CUVS_EXPORT cuvsError_t cuvsIvfPqIndexGetNLists(cuvsIvfPqIndex_t index, int64_t* n_lists); /** Get the dimensionality */ -cuvsError_t cuvsIvfPqIndexGetDim(cuvsIvfPqIndex_t index, int64_t* dim); +CUVS_EXPORT cuvsError_t cuvsIvfPqIndexGetDim(cuvsIvfPqIndex_t index, int64_t* dim); /** Get the size of the index */ -cuvsError_t cuvsIvfPqIndexGetSize(cuvsIvfPqIndex_t index, int64_t* size); +CUVS_EXPORT cuvsError_t cuvsIvfPqIndexGetSize(cuvsIvfPqIndex_t index, int64_t* size); /** Get the dimensionality of an encoded vector after compression by PQ. */ -cuvsError_t cuvsIvfPqIndexGetPqDim(cuvsIvfPqIndex_t index, int64_t* pq_dim); +CUVS_EXPORT cuvsError_t cuvsIvfPqIndexGetPqDim(cuvsIvfPqIndex_t index, int64_t* pq_dim); /** Get the bit length of an encoded vector element after compression by PQ.*/ -cuvsError_t cuvsIvfPqIndexGetPqBits(cuvsIvfPqIndex_t index, int64_t* pq_bits); +CUVS_EXPORT cuvsError_t cuvsIvfPqIndexGetPqBits(cuvsIvfPqIndex_t index, int64_t* pq_bits); /** Get the Dimensionality of a subspace, i.e. the number of vector * components mapped to a subspace */ -cuvsError_t cuvsIvfPqIndexGetPqLen(cuvsIvfPqIndex_t index, int64_t* pq_len); +CUVS_EXPORT cuvsError_t cuvsIvfPqIndexGetPqLen(cuvsIvfPqIndex_t index, int64_t* pq_len); /** * @brief Get the cluster centers corresponding to the lists in the original space @@ -293,7 +295,7 @@ cuvsError_t cuvsIvfPqIndexGetPqLen(cuvsIvfPqIndex_t index, int64_t* pq_len); * @param[out] centers Output tensor that will be populated with a non-owning view of the data * @return cuvsError_t */ -cuvsError_t cuvsIvfPqIndexGetCenters(cuvsIvfPqIndex_t index, DLManagedTensor* centers); +CUVS_EXPORT cuvsError_t cuvsIvfPqIndexGetCenters(cuvsIvfPqIndex_t index, DLManagedTensor* centers); /** * @brief Get the padded cluster centers [n_lists, dim_ext] @@ -306,7 +308,7 @@ cuvsError_t cuvsIvfPqIndexGetCenters(cuvsIvfPqIndex_t index, DLManagedTensor* ce * @param[out] centers Output tensor that will be populated with a non-owning view of the data * @return cuvsError_t */ -cuvsError_t cuvsIvfPqIndexGetCentersPadded(cuvsIvfPqIndex_t index, DLManagedTensor* centers); +CUVS_EXPORT cuvsError_t cuvsIvfPqIndexGetCentersPadded(cuvsIvfPqIndex_t index, DLManagedTensor* centers); /** * @brief Get the PQ cluster centers @@ -318,7 +320,7 @@ cuvsError_t cuvsIvfPqIndexGetCentersPadded(cuvsIvfPqIndex_t index, DLManagedTens * @param[out] pq_centers Output tensor that will be populated with a non-owning view of the data * @return cuvsError_t */ -cuvsError_t cuvsIvfPqIndexGetPqCenters(cuvsIvfPqIndex_t index, DLManagedTensor* pq_centers); +CUVS_EXPORT cuvsError_t cuvsIvfPqIndexGetPqCenters(cuvsIvfPqIndex_t index, DLManagedTensor* pq_centers); /** * @brief Get the rotated cluster centers [n_lists, rot_dim] @@ -328,7 +330,7 @@ cuvsError_t cuvsIvfPqIndexGetPqCenters(cuvsIvfPqIndex_t index, DLManagedTensor* * @param[out] centers_rot Output tensor that will be populated with a non-owning view of the data * @return cuvsError_t */ -cuvsError_t cuvsIvfPqIndexGetCentersRot(cuvsIvfPqIndex_t index, DLManagedTensor* centers_rot); +CUVS_EXPORT cuvsError_t cuvsIvfPqIndexGetCentersRot(cuvsIvfPqIndex_t index, DLManagedTensor* centers_rot); /** * @brief Get the rotation matrix [rot_dim, dim] @@ -339,7 +341,7 @@ cuvsError_t cuvsIvfPqIndexGetCentersRot(cuvsIvfPqIndex_t index, DLManagedTensor* * data * @return cuvsError_t */ -cuvsError_t cuvsIvfPqIndexGetRotationMatrix(cuvsIvfPqIndex_t index, +CUVS_EXPORT cuvsError_t cuvsIvfPqIndexGetRotationMatrix(cuvsIvfPqIndex_t index, DLManagedTensor* rotation_matrix); /** @@ -349,7 +351,7 @@ cuvsError_t cuvsIvfPqIndexGetRotationMatrix(cuvsIvfPqIndex_t index, * @param[out] list_sizes Output tensor that will be populated with a non-owning view of the data * @return cuvsError_t */ -cuvsError_t cuvsIvfPqIndexGetListSizes(cuvsIvfPqIndex_t index, DLManagedTensor* list_sizes); +CUVS_EXPORT cuvsError_t cuvsIvfPqIndexGetListSizes(cuvsIvfPqIndex_t index, DLManagedTensor* list_sizes); /** * @brief Unpack `n_rows` consecutive PQ encoded vectors of a single list (cluster) in the @@ -368,7 +370,7 @@ cuvsError_t cuvsIvfPqIndexGetListSizes(cuvsIvfPqIndex_t index, DLManagedTensor* * @param[in] offset * How many records in the list to skip. */ -cuvsError_t cuvsIvfPqIndexUnpackContiguousListData(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsIvfPqIndexUnpackContiguousListData(cuvsResources_t res, cuvsIvfPqIndex_t index, DLManagedTensor* out_codes, uint32_t label, @@ -383,7 +385,7 @@ cuvsError_t cuvsIvfPqIndexUnpackContiguousListData(cuvsResources_t res, * output tensor that will be populated with a non-owning view of the data * @return cuvsError_t */ -cuvsError_t cuvsIvfPqIndexGetListIndices(cuvsIvfPqIndex_t index, +CUVS_EXPORT cuvsError_t cuvsIvfPqIndexGetListIndices(cuvsIvfPqIndex_t index, uint32_t label, DLManagedTensor* out_labels); /** @@ -437,7 +439,7 @@ cuvsError_t cuvsIvfPqIndexGetListIndices(cuvsIvfPqIndex_t index, * @param[out] index cuvsIvfPqIndex_t Newly built IVF-PQ index * @return cuvsError_t */ -cuvsError_t cuvsIvfPqBuild(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsIvfPqBuild(cuvsResources_t res, cuvsIvfPqIndexParams_t params, DLManagedTensor* dataset, cuvsIvfPqIndex_t index); @@ -471,7 +473,7 @@ cuvsError_t cuvsIvfPqBuild(cuvsResources_t res, * @param[out] index cuvsIvfPqIndex_t Newly built view-type IVF-PQ index * @return cuvsError_t */ -cuvsError_t cuvsIvfPqBuildPrecomputed(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsIvfPqBuildPrecomputed(cuvsResources_t res, cuvsIvfPqIndexParams_t params, uint32_t dim, DLManagedTensor* pq_centers, @@ -531,7 +533,7 @@ cuvsError_t cuvsIvfPqBuildPrecomputed(cuvsResources_t res, * @param[out] neighbors DLManagedTensor* output `k` neighbors for queries * @param[out] distances DLManagedTensor* output `k` distances for queries */ -cuvsError_t cuvsIvfPqSearch(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsIvfPqSearch(cuvsResources_t res, cuvsIvfPqSearchParams_t search_params, cuvsIvfPqIndex_t index, DLManagedTensor* queries, @@ -565,7 +567,7 @@ cuvsError_t cuvsIvfPqSearch(cuvsResources_t res, * @param[in] filename the file name for saving the index * @param[in] index IVF-PQ index */ -cuvsError_t cuvsIvfPqSerialize(cuvsResources_t res, const char* filename, cuvsIvfPqIndex_t index); +CUVS_EXPORT cuvsError_t cuvsIvfPqSerialize(cuvsResources_t res, const char* filename, cuvsIvfPqIndex_t index); /** * Load index from file. @@ -576,7 +578,7 @@ cuvsError_t cuvsIvfPqSerialize(cuvsResources_t res, const char* filename, cuvsIv * @param[in] filename the name of the file that stores the index * @param[out] index IVF-PQ index loaded disk */ -cuvsError_t cuvsIvfPqDeserialize(cuvsResources_t res, const char* filename, cuvsIvfPqIndex_t index); +CUVS_EXPORT cuvsError_t cuvsIvfPqDeserialize(cuvsResources_t res, const char* filename, cuvsIvfPqIndex_t index); /** * @} */ @@ -594,7 +596,7 @@ cuvsError_t cuvsIvfPqDeserialize(cuvsResources_t res, const char* filename, cuvs * @param[inout] index IVF-PQ index to be extended * @return cuvsError_t */ -cuvsError_t cuvsIvfPqExtend(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsIvfPqExtend(cuvsResources_t res, DLManagedTensor* new_vectors, DLManagedTensor* new_indices, cuvsIvfPqIndex_t index); @@ -616,7 +618,7 @@ cuvsError_t cuvsIvfPqExtend(cuvsResources_t res, * @param[out] output_dataset DLManagedTensor* input vectors after pq-encoding * @return cuvsError_t */ -cuvsError_t cuvsIvfPqTransform(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsIvfPqTransform(cuvsResources_t res, cuvsIvfPqIndex_t index, DLManagedTensor* input_dataset, DLManagedTensor* output_labels, diff --git a/c/include/cuvs/neighbors/mg_cagra.h b/c/include/cuvs/neighbors/mg_cagra.h index a9cf52e1d2..1f6f150b06 100644 --- a/c/include/cuvs/neighbors/mg_cagra.h +++ b/c/include/cuvs/neighbors/mg_cagra.h @@ -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 */ @@ -11,6 +11,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -40,7 +42,7 @@ typedef struct cuvsMultiGpuCagraIndexParams* cuvsMultiGpuCagraIndexParams_t; * @param[in] index_params cuvsMultiGpuCagraIndexParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuCagraIndexParamsCreate(cuvsMultiGpuCagraIndexParams_t* index_params); +CUVS_EXPORT cuvsError_t cuvsMultiGpuCagraIndexParamsCreate(cuvsMultiGpuCagraIndexParams_t* index_params); /** * @brief De-allocate Multi-GPU CAGRA Index params @@ -48,7 +50,7 @@ cuvsError_t cuvsMultiGpuCagraIndexParamsCreate(cuvsMultiGpuCagraIndexParams_t* i * @param[in] index_params * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuCagraIndexParamsDestroy(cuvsMultiGpuCagraIndexParams_t index_params); +CUVS_EXPORT cuvsError_t cuvsMultiGpuCagraIndexParamsDestroy(cuvsMultiGpuCagraIndexParams_t index_params); /** * @} @@ -83,7 +85,7 @@ typedef struct cuvsMultiGpuCagraSearchParams* cuvsMultiGpuCagraSearchParams_t; * @param[in] params cuvsMultiGpuCagraSearchParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuCagraSearchParamsCreate(cuvsMultiGpuCagraSearchParams_t* params); +CUVS_EXPORT cuvsError_t cuvsMultiGpuCagraSearchParamsCreate(cuvsMultiGpuCagraSearchParams_t* params); /** * @brief De-allocate Multi-GPU CAGRA search params @@ -91,7 +93,7 @@ cuvsError_t cuvsMultiGpuCagraSearchParamsCreate(cuvsMultiGpuCagraSearchParams_t* * @param[in] params * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuCagraSearchParamsDestroy(cuvsMultiGpuCagraSearchParams_t params); +CUVS_EXPORT cuvsError_t cuvsMultiGpuCagraSearchParamsDestroy(cuvsMultiGpuCagraSearchParams_t params); /** * @} @@ -119,7 +121,7 @@ typedef cuvsMultiGpuCagraIndex* cuvsMultiGpuCagraIndex_t; * @param[in] index cuvsMultiGpuCagraIndex_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuCagraIndexCreate(cuvsMultiGpuCagraIndex_t* index); +CUVS_EXPORT cuvsError_t cuvsMultiGpuCagraIndexCreate(cuvsMultiGpuCagraIndex_t* index); /** * @brief De-allocate Multi-GPU CAGRA index @@ -127,7 +129,7 @@ cuvsError_t cuvsMultiGpuCagraIndexCreate(cuvsMultiGpuCagraIndex_t* index); * @param[in] index cuvsMultiGpuCagraIndex_t to de-allocate * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuCagraIndexDestroy(cuvsMultiGpuCagraIndex_t index); +CUVS_EXPORT cuvsError_t cuvsMultiGpuCagraIndexDestroy(cuvsMultiGpuCagraIndex_t index); /** * @} @@ -147,7 +149,7 @@ cuvsError_t cuvsMultiGpuCagraIndexDestroy(cuvsMultiGpuCagraIndex_t index); * @param[out] index Multi-GPU CAGRA index * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuCagraBuild(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsMultiGpuCagraBuild(cuvsResources_t res, cuvsMultiGpuCagraIndexParams_t params, DLManagedTensor* dataset_tensor, cuvsMultiGpuCagraIndex_t index); @@ -172,7 +174,7 @@ cuvsError_t cuvsMultiGpuCagraBuild(cuvsResources_t res, * @param[out] distances_tensor DLManagedTensor* output distances * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuCagraSearch(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsMultiGpuCagraSearch(cuvsResources_t res, cuvsMultiGpuCagraSearchParams_t params, cuvsMultiGpuCagraIndex_t index, DLManagedTensor* queries_tensor, @@ -197,7 +199,7 @@ cuvsError_t cuvsMultiGpuCagraSearch(cuvsResources_t res, * @param[in] new_indices_tensor DLManagedTensor* new indices (optional, can be NULL) * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuCagraExtend(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsMultiGpuCagraExtend(cuvsResources_t res, cuvsMultiGpuCagraIndex_t index, DLManagedTensor* new_vectors_tensor, DLManagedTensor* new_indices_tensor); @@ -219,7 +221,7 @@ cuvsError_t cuvsMultiGpuCagraExtend(cuvsResources_t res, * @param[in] filename Path to the output file * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuCagraSerialize(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsMultiGpuCagraSerialize(cuvsResources_t res, cuvsMultiGpuCagraIndex_t index, const char* filename); @@ -240,7 +242,7 @@ cuvsError_t cuvsMultiGpuCagraSerialize(cuvsResources_t res, * @param[out] index Multi-GPU CAGRA index * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuCagraDeserialize(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsMultiGpuCagraDeserialize(cuvsResources_t res, const char* filename, cuvsMultiGpuCagraIndex_t index); @@ -261,7 +263,7 @@ cuvsError_t cuvsMultiGpuCagraDeserialize(cuvsResources_t res, * @param[out] index Multi-GPU CAGRA index * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuCagraDistribute(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsMultiGpuCagraDistribute(cuvsResources_t res, const char* filename, cuvsMultiGpuCagraIndex_t index); diff --git a/c/include/cuvs/neighbors/mg_common.h b/c/include/cuvs/neighbors/mg_common.h index 30965f8766..6e4d00191e 100644 --- a/c/include/cuvs/neighbors/mg_common.h +++ b/c/include/cuvs/neighbors/mg_common.h @@ -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 */ @@ -7,6 +7,8 @@ #include +#include + #ifdef __cplusplus extern "C" { #endif diff --git a/c/include/cuvs/neighbors/mg_ivf_flat.h b/c/include/cuvs/neighbors/mg_ivf_flat.h index a4816e261c..6233e0bd7a 100644 --- a/c/include/cuvs/neighbors/mg_ivf_flat.h +++ b/c/include/cuvs/neighbors/mg_ivf_flat.h @@ -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 */ @@ -11,6 +11,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -40,7 +42,7 @@ typedef struct cuvsMultiGpuIvfFlatIndexParams* cuvsMultiGpuIvfFlatIndexParams_t; * @param[in] index_params cuvsMultiGpuIvfFlatIndexParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfFlatIndexParamsCreate(cuvsMultiGpuIvfFlatIndexParams_t* index_params); +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfFlatIndexParamsCreate(cuvsMultiGpuIvfFlatIndexParams_t* index_params); /** * @brief De-allocate Multi-GPU IVF-Flat Index params @@ -48,7 +50,7 @@ cuvsError_t cuvsMultiGpuIvfFlatIndexParamsCreate(cuvsMultiGpuIvfFlatIndexParams_ * @param[in] index_params * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfFlatIndexParamsDestroy(cuvsMultiGpuIvfFlatIndexParams_t index_params); +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfFlatIndexParamsDestroy(cuvsMultiGpuIvfFlatIndexParams_t index_params); /** * @} @@ -83,7 +85,7 @@ typedef struct cuvsMultiGpuIvfFlatSearchParams* cuvsMultiGpuIvfFlatSearchParams_ * @param[in] params cuvsMultiGpuIvfFlatSearchParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfFlatSearchParamsCreate(cuvsMultiGpuIvfFlatSearchParams_t* params); +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfFlatSearchParamsCreate(cuvsMultiGpuIvfFlatSearchParams_t* params); /** * @brief De-allocate Multi-GPU IVF-Flat search params @@ -91,7 +93,7 @@ cuvsError_t cuvsMultiGpuIvfFlatSearchParamsCreate(cuvsMultiGpuIvfFlatSearchParam * @param[in] params * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfFlatSearchParamsDestroy(cuvsMultiGpuIvfFlatSearchParams_t params); +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfFlatSearchParamsDestroy(cuvsMultiGpuIvfFlatSearchParams_t params); /** * @} @@ -119,7 +121,7 @@ typedef cuvsMultiGpuIvfFlatIndex* cuvsMultiGpuIvfFlatIndex_t; * @param[in] index cuvsMultiGpuIvfFlatIndex_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfFlatIndexCreate(cuvsMultiGpuIvfFlatIndex_t* index); +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfFlatIndexCreate(cuvsMultiGpuIvfFlatIndex_t* index); /** * @brief De-allocate Multi-GPU IVF-Flat index @@ -127,7 +129,7 @@ cuvsError_t cuvsMultiGpuIvfFlatIndexCreate(cuvsMultiGpuIvfFlatIndex_t* index); * @param[in] index cuvsMultiGpuIvfFlatIndex_t to de-allocate * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfFlatIndexDestroy(cuvsMultiGpuIvfFlatIndex_t index); +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfFlatIndexDestroy(cuvsMultiGpuIvfFlatIndex_t index); /** * @} @@ -147,7 +149,7 @@ cuvsError_t cuvsMultiGpuIvfFlatIndexDestroy(cuvsMultiGpuIvfFlatIndex_t index); * @param[out] index Multi-GPU IVF-Flat index * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfFlatBuild(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfFlatBuild(cuvsResources_t res, cuvsMultiGpuIvfFlatIndexParams_t params, DLManagedTensor* dataset_tensor, cuvsMultiGpuIvfFlatIndex_t index); @@ -172,7 +174,7 @@ cuvsError_t cuvsMultiGpuIvfFlatBuild(cuvsResources_t res, * @param[out] distances_tensor DLManagedTensor* output distances * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfFlatSearch(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfFlatSearch(cuvsResources_t res, cuvsMultiGpuIvfFlatSearchParams_t params, cuvsMultiGpuIvfFlatIndex_t index, DLManagedTensor* queries_tensor, @@ -197,7 +199,7 @@ cuvsError_t cuvsMultiGpuIvfFlatSearch(cuvsResources_t res, * @param[in] new_indices_tensor DLManagedTensor* new indices (optional, can be NULL) * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfFlatExtend(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfFlatExtend(cuvsResources_t res, cuvsMultiGpuIvfFlatIndex_t index, DLManagedTensor* new_vectors_tensor, DLManagedTensor* new_indices_tensor); @@ -219,7 +221,7 @@ cuvsError_t cuvsMultiGpuIvfFlatExtend(cuvsResources_t res, * @param[in] filename Path to the output file * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfFlatSerialize(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfFlatSerialize(cuvsResources_t res, cuvsMultiGpuIvfFlatIndex_t index, const char* filename); @@ -240,7 +242,7 @@ cuvsError_t cuvsMultiGpuIvfFlatSerialize(cuvsResources_t res, * @param[out] index Multi-GPU IVF-Flat index * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfFlatDeserialize(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfFlatDeserialize(cuvsResources_t res, const char* filename, cuvsMultiGpuIvfFlatIndex_t index); @@ -261,7 +263,7 @@ cuvsError_t cuvsMultiGpuIvfFlatDeserialize(cuvsResources_t res, * @param[out] index Multi-GPU IVF-Flat index * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfFlatDistribute(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfFlatDistribute(cuvsResources_t res, const char* filename, cuvsMultiGpuIvfFlatIndex_t index); diff --git a/c/include/cuvs/neighbors/mg_ivf_pq.h b/c/include/cuvs/neighbors/mg_ivf_pq.h index 1c220747b9..7fb94479ae 100644 --- a/c/include/cuvs/neighbors/mg_ivf_pq.h +++ b/c/include/cuvs/neighbors/mg_ivf_pq.h @@ -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 */ @@ -11,6 +11,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -40,7 +42,7 @@ typedef struct cuvsMultiGpuIvfPqIndexParams* cuvsMultiGpuIvfPqIndexParams_t; * @param[in] index_params cuvsMultiGpuIvfPqIndexParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfPqIndexParamsCreate(cuvsMultiGpuIvfPqIndexParams_t* index_params); +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfPqIndexParamsCreate(cuvsMultiGpuIvfPqIndexParams_t* index_params); /** * @brief De-allocate Multi-GPU IVF-PQ Index params @@ -48,7 +50,7 @@ cuvsError_t cuvsMultiGpuIvfPqIndexParamsCreate(cuvsMultiGpuIvfPqIndexParams_t* i * @param[in] index_params * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfPqIndexParamsDestroy(cuvsMultiGpuIvfPqIndexParams_t index_params); +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfPqIndexParamsDestroy(cuvsMultiGpuIvfPqIndexParams_t index_params); /** * @} @@ -83,7 +85,7 @@ typedef struct cuvsMultiGpuIvfPqSearchParams* cuvsMultiGpuIvfPqSearchParams_t; * @param[in] params cuvsMultiGpuIvfPqSearchParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfPqSearchParamsCreate(cuvsMultiGpuIvfPqSearchParams_t* params); +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfPqSearchParamsCreate(cuvsMultiGpuIvfPqSearchParams_t* params); /** * @brief De-allocate Multi-GPU IVF-PQ search params @@ -91,7 +93,7 @@ cuvsError_t cuvsMultiGpuIvfPqSearchParamsCreate(cuvsMultiGpuIvfPqSearchParams_t* * @param[in] params * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfPqSearchParamsDestroy(cuvsMultiGpuIvfPqSearchParams_t params); +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfPqSearchParamsDestroy(cuvsMultiGpuIvfPqSearchParams_t params); /** * @} @@ -119,7 +121,7 @@ typedef cuvsMultiGpuIvfPqIndex* cuvsMultiGpuIvfPqIndex_t; * @param[in] index cuvsMultiGpuIvfPqIndex_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfPqIndexCreate(cuvsMultiGpuIvfPqIndex_t* index); +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfPqIndexCreate(cuvsMultiGpuIvfPqIndex_t* index); /** * @brief De-allocate Multi-GPU IVF-PQ index @@ -127,7 +129,7 @@ cuvsError_t cuvsMultiGpuIvfPqIndexCreate(cuvsMultiGpuIvfPqIndex_t* index); * @param[in] index cuvsMultiGpuIvfPqIndex_t to de-allocate * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfPqIndexDestroy(cuvsMultiGpuIvfPqIndex_t index); +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfPqIndexDestroy(cuvsMultiGpuIvfPqIndex_t index); /** * @} @@ -147,7 +149,7 @@ cuvsError_t cuvsMultiGpuIvfPqIndexDestroy(cuvsMultiGpuIvfPqIndex_t index); * @param[out] index Multi-GPU IVF-PQ index * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfPqBuild(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfPqBuild(cuvsResources_t res, cuvsMultiGpuIvfPqIndexParams_t params, DLManagedTensor* dataset_tensor, cuvsMultiGpuIvfPqIndex_t index); @@ -172,7 +174,7 @@ cuvsError_t cuvsMultiGpuIvfPqBuild(cuvsResources_t res, * @param[out] distances_tensor DLManagedTensor* output distances * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfPqSearch(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfPqSearch(cuvsResources_t res, cuvsMultiGpuIvfPqSearchParams_t params, cuvsMultiGpuIvfPqIndex_t index, DLManagedTensor* queries_tensor, @@ -197,7 +199,7 @@ cuvsError_t cuvsMultiGpuIvfPqSearch(cuvsResources_t res, * @param[in] new_indices_tensor DLManagedTensor* new indices (optional, can be NULL) * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfPqExtend(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfPqExtend(cuvsResources_t res, cuvsMultiGpuIvfPqIndex_t index, DLManagedTensor* new_vectors_tensor, DLManagedTensor* new_indices_tensor); @@ -219,7 +221,7 @@ cuvsError_t cuvsMultiGpuIvfPqExtend(cuvsResources_t res, * @param[in] filename Path to the output file * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfPqSerialize(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfPqSerialize(cuvsResources_t res, cuvsMultiGpuIvfPqIndex_t index, const char* filename); @@ -240,7 +242,7 @@ cuvsError_t cuvsMultiGpuIvfPqSerialize(cuvsResources_t res, * @param[out] index Multi-GPU IVF-PQ index * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfPqDeserialize(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfPqDeserialize(cuvsResources_t res, const char* filename, cuvsMultiGpuIvfPqIndex_t index); @@ -261,7 +263,7 @@ cuvsError_t cuvsMultiGpuIvfPqDeserialize(cuvsResources_t res, * @param[out] index Multi-GPU IVF-PQ index * @return cuvsError_t */ -cuvsError_t cuvsMultiGpuIvfPqDistribute(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsMultiGpuIvfPqDistribute(cuvsResources_t res, const char* filename, cuvsMultiGpuIvfPqIndex_t index); diff --git a/c/include/cuvs/neighbors/nn_descent.h b/c/include/cuvs/neighbors/nn_descent.h index 0c7102e3e1..2ec201211d 100644 --- a/c/include/cuvs/neighbors/nn_descent.h +++ b/c/include/cuvs/neighbors/nn_descent.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ @@ -11,6 +11,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -68,7 +70,7 @@ typedef struct cuvsNNDescentIndexParams* cuvsNNDescentIndexParams_t; * @param[in] index_params cuvsNNDescentIndexParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsNNDescentIndexParamsCreate(cuvsNNDescentIndexParams_t* index_params); +CUVS_EXPORT cuvsError_t cuvsNNDescentIndexParamsCreate(cuvsNNDescentIndexParams_t* index_params); /** * @brief De-allocate NN-Descent Index params @@ -76,7 +78,7 @@ cuvsError_t cuvsNNDescentIndexParamsCreate(cuvsNNDescentIndexParams_t* index_par * @param[in] index_params * @return cuvsError_t */ -cuvsError_t cuvsNNDescentIndexParamsDestroy(cuvsNNDescentIndexParams_t index_params); +CUVS_EXPORT cuvsError_t cuvsNNDescentIndexParamsDestroy(cuvsNNDescentIndexParams_t index_params); /** * @} */ @@ -102,14 +104,14 @@ typedef cuvsNNDescentIndex* cuvsNNDescentIndex_t; * @param[in] index cuvsNNDescentIndex_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsNNDescentIndexCreate(cuvsNNDescentIndex_t* index); +CUVS_EXPORT cuvsError_t cuvsNNDescentIndexCreate(cuvsNNDescentIndex_t* index); /** * @brief De-allocate NN-Descent index * * @param[in] index cuvsNNDescentIndex_t to de-allocate */ -cuvsError_t cuvsNNDescentIndexDestroy(cuvsNNDescentIndex_t index); +CUVS_EXPORT cuvsError_t cuvsNNDescentIndexDestroy(cuvsNNDescentIndex_t index); /** * @} */ @@ -162,7 +164,7 @@ cuvsError_t cuvsNNDescentIndexDestroy(cuvsNNDescentIndex_t index); * @param[out] index cuvsNNDescentIndex_t Newly built NN-Descent index * @return cuvsError_t */ -cuvsError_t cuvsNNDescentBuild(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsNNDescentBuild(cuvsResources_t res, cuvsNNDescentIndexParams_t index_params, DLManagedTensor* dataset, DLManagedTensor* graph, @@ -179,7 +181,7 @@ cuvsError_t cuvsNNDescentBuild(cuvsResources_t res, * @param[out] graph Preallocated graph on host memory to store output * @return cuvsError_t */ -cuvsError_t cuvsNNDescentIndexGetGraph(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsNNDescentIndexGetGraph(cuvsResources_t res, cuvsNNDescentIndex_t index, DLManagedTensor* graph); @@ -194,7 +196,7 @@ cuvsError_t cuvsNNDescentIndexGetGraph(cuvsResources_t res, * @param[out] distances Preallocated memory to store the output distances tensor * @return cuvsError_t */ -cuvsError_t cuvsNNDescentIndexGetDistances(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsNNDescentIndexGetDistances(cuvsResources_t res, cuvsNNDescentIndex_t index, DLManagedTensor* distances); #ifdef __cplusplus diff --git a/c/include/cuvs/neighbors/refine.h b/c/include/cuvs/neighbors/refine.h index 9110d1da03..5001f82e9a 100644 --- a/c/include/cuvs/neighbors/refine.h +++ b/c/include/cuvs/neighbors/refine.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2024, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ @@ -10,6 +10,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -34,7 +36,7 @@ extern "C" { * @param[out] indices device matrix that stores the refined indices [n_queries, k] * @param[out] distances device matrix that stores the refined distances [n_queries, k] */ -cuvsError_t cuvsRefine(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsRefine(cuvsResources_t res, DLManagedTensor* dataset, DLManagedTensor* queries, DLManagedTensor* candidates, diff --git a/c/include/cuvs/neighbors/tiered_index.h b/c/include/cuvs/neighbors/tiered_index.h index 12b3ee0655..ae6ea81ae2 100644 --- a/c/include/cuvs/neighbors/tiered_index.h +++ b/c/include/cuvs/neighbors/tiered_index.h @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ @@ -14,6 +14,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -50,14 +52,14 @@ typedef cuvsTieredIndex* cuvsTieredIndex_t; * @param[in] index cuvsTieredIndex_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsTieredIndexCreate(cuvsTieredIndex_t* index); +CUVS_EXPORT cuvsError_t cuvsTieredIndexCreate(cuvsTieredIndex_t* index); /** * @brief De-allocate Tiered index * * @param[in] index cuvsTieredIndex_t to de-allocate */ -cuvsError_t cuvsTieredIndexDestroy(cuvsTieredIndex_t index); +CUVS_EXPORT cuvsError_t cuvsTieredIndexDestroy(cuvsTieredIndex_t index); /** * @} */ @@ -102,7 +104,7 @@ typedef struct cuvsTieredIndexParams* cuvsTieredIndexParams_t; * @param[in] index_params cuvsTieredIndexParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsTieredIndexParamsCreate(cuvsTieredIndexParams_t* index_params); +CUVS_EXPORT cuvsError_t cuvsTieredIndexParamsCreate(cuvsTieredIndexParams_t* index_params); /** * @brief De-allocate Tiered Index params @@ -110,7 +112,7 @@ cuvsError_t cuvsTieredIndexParamsCreate(cuvsTieredIndexParams_t* index_params); * @param[in] index_params * @return cuvsError_t */ -cuvsError_t cuvsTieredIndexParamsDestroy(cuvsTieredIndexParams_t index_params); +CUVS_EXPORT cuvsError_t cuvsTieredIndexParamsDestroy(cuvsTieredIndexParams_t index_params); /** * @} */ @@ -159,7 +161,7 @@ cuvsError_t cuvsTieredIndexParamsDestroy(cuvsTieredIndexParams_t index_params); * @param[out] index cuvsTieredIndex_t Newly built TieredIndex index * @return cuvsError_t */ -cuvsError_t cuvsTieredIndexBuild(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsTieredIndexBuild(cuvsResources_t res, cuvsTieredIndexParams_t index_params, DLManagedTensor* dataset, cuvsTieredIndex_t index); @@ -209,7 +211,7 @@ cuvsError_t cuvsTieredIndexBuild(cuvsResources_t res, * @param[in] prefilter cuvsFilter input prefilter that can be used to filter queries and neighbors based on the given bitmap. */ -cuvsError_t cuvsTieredIndexSearch(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsTieredIndexSearch(cuvsResources_t res, void* search_params, cuvsTieredIndex_t index, DLManagedTensor* queries, @@ -232,7 +234,7 @@ cuvsError_t cuvsTieredIndexSearch(cuvsResources_t res, * @param[inout] index Tiered index to be extended * @return cuvsError_t */ -cuvsError_t cuvsTieredIndexExtend(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsTieredIndexExtend(cuvsResources_t res, DLManagedTensor* new_vectors, cuvsTieredIndex_t index); /** @@ -253,7 +255,7 @@ cuvsError_t cuvsTieredIndexExtend(cuvsResources_t res, * @param[out] output_index the merged index * @return cuvsError_t */ -cuvsError_t cuvsTieredIndexMerge(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsTieredIndexMerge(cuvsResources_t res, cuvsTieredIndexParams_t index_params, cuvsTieredIndex_t* indices, size_t num_indices, diff --git a/c/include/cuvs/neighbors/vamana.h b/c/include/cuvs/neighbors/vamana.h index 6c092fe297..cb85082561 100644 --- a/c/include/cuvs/neighbors/vamana.h +++ b/c/include/cuvs/neighbors/vamana.h @@ -12,6 +12,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -66,7 +68,7 @@ typedef struct cuvsVamanaIndexParams* cuvsVamanaIndexParams_t; * @param[in] params cuvsVamanaIndexParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsVamanaIndexParamsCreate(cuvsVamanaIndexParams_t* params); +CUVS_EXPORT cuvsError_t cuvsVamanaIndexParamsCreate(cuvsVamanaIndexParams_t* params); /** * @brief De-allocate Vamana Index params @@ -74,7 +76,7 @@ cuvsError_t cuvsVamanaIndexParamsCreate(cuvsVamanaIndexParams_t* params); * @param[in] params cuvsVamanaIndexParams_t to de-allocate * @return cuvsError_t */ -cuvsError_t cuvsVamanaIndexParamsDestroy(cuvsVamanaIndexParams_t params); +CUVS_EXPORT cuvsError_t cuvsVamanaIndexParamsDestroy(cuvsVamanaIndexParams_t params); /** * @} @@ -103,7 +105,7 @@ typedef cuvsVamanaIndex* cuvsVamanaIndex_t; * @param[in] index cuvsVamanaIndex_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsVamanaIndexCreate(cuvsVamanaIndex_t* index); +CUVS_EXPORT cuvsError_t cuvsVamanaIndexCreate(cuvsVamanaIndex_t* index); /** * @brief De-allocate Vamana index @@ -111,7 +113,7 @@ cuvsError_t cuvsVamanaIndexCreate(cuvsVamanaIndex_t* index); * @param[in] index cuvsVamanaIndex_t to de-allocate * @return cuvsError_t */ -cuvsError_t cuvsVamanaIndexDestroy(cuvsVamanaIndex_t index); +CUVS_EXPORT cuvsError_t cuvsVamanaIndexDestroy(cuvsVamanaIndex_t index); /** * @brief Get the dimension of the index @@ -120,7 +122,7 @@ cuvsError_t cuvsVamanaIndexDestroy(cuvsVamanaIndex_t index); * @param[out] dim pointer to dimension to set * @return cuvsError_t */ -cuvsError_t cuvsVamanaIndexGetDims(cuvsVamanaIndex_t index, int* dim); +CUVS_EXPORT cuvsError_t cuvsVamanaIndexGetDims(cuvsVamanaIndex_t index, int* dim); /** * @} @@ -166,7 +168,7 @@ cuvsError_t cuvsVamanaIndexGetDims(cuvsVamanaIndex_t index, int* dim); * @param[out] index cuvsVamanaIndex_t Vamana index * @return cuvsError_t */ -cuvsError_t cuvsVamanaBuild(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsVamanaBuild(cuvsResources_t res, cuvsVamanaIndexParams_t params, DLManagedTensor* dataset, cuvsVamanaIndex_t index); @@ -202,7 +204,7 @@ cuvsError_t cuvsVamanaBuild(cuvsResources_t res, * @param[in] include_dataset whether to include the dataset in the serialized index * @return cuvsError_t */ -cuvsError_t cuvsVamanaSerialize(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsVamanaSerialize(cuvsResources_t res, const char* filename, cuvsVamanaIndex_t index, bool include_dataset); diff --git a/c/include/cuvs/preprocessing/pca.h b/c/include/cuvs/preprocessing/pca.h index 767b4584c2..3ed144d166 100644 --- a/c/include/cuvs/preprocessing/pca.h +++ b/c/include/cuvs/preprocessing/pca.h @@ -10,6 +10,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -67,7 +69,7 @@ typedef struct cuvsPcaParams* cuvsPcaParams_t; * @param[out] params cuvsPcaParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsPcaParamsCreate(cuvsPcaParams_t* params); +CUVS_EXPORT cuvsError_t cuvsPcaParamsCreate(cuvsPcaParams_t* params); /** * @brief De-allocate PCA params. @@ -75,7 +77,7 @@ cuvsError_t cuvsPcaParamsCreate(cuvsPcaParams_t* params); * @param[in] params cuvsPcaParams_t to de-allocate * @return cuvsError_t */ -cuvsError_t cuvsPcaParamsDestroy(cuvsPcaParams_t params); +CUVS_EXPORT cuvsError_t cuvsPcaParamsDestroy(cuvsPcaParams_t params); /** * @brief Perform PCA fit operation. @@ -125,7 +127,7 @@ cuvsError_t cuvsPcaParamsDestroy(cuvsPcaParams_t params); * @param[in] flip_signs_based_on_U whether to determine signs by U (true) or V.T (false) * @return cuvsError_t */ -cuvsError_t cuvsPcaFit(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsPcaFit(cuvsResources_t res, cuvsPcaParams_t params, DLManagedTensor* input, DLManagedTensor* components, @@ -154,7 +156,7 @@ cuvsError_t cuvsPcaFit(cuvsResources_t res, * @param[in] flip_signs_based_on_U whether to determine signs by U (true) or V.T (false) * @return cuvsError_t */ -cuvsError_t cuvsPcaFitTransform(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsPcaFitTransform(cuvsResources_t res, cuvsPcaParams_t params, DLManagedTensor* input, DLManagedTensor* trans_input, @@ -180,7 +182,7 @@ cuvsError_t cuvsPcaFitTransform(cuvsResources_t res, * @param[out] trans_input transformed data [n_rows x n_components] (col-major, float32, device) * @return cuvsError_t */ -cuvsError_t cuvsPcaTransform(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsPcaTransform(cuvsResources_t res, cuvsPcaParams_t params, DLManagedTensor* input, DLManagedTensor* components, @@ -202,7 +204,7 @@ cuvsError_t cuvsPcaTransform(cuvsResources_t res, * @param[out] output reconstructed data [n_rows x n_cols] (col-major, float32, device) * @return cuvsError_t */ -cuvsError_t cuvsPcaInverseTransform(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsPcaInverseTransform(cuvsResources_t res, cuvsPcaParams_t params, DLManagedTensor* trans_input, DLManagedTensor* components, diff --git a/c/include/cuvs/preprocessing/quantize/binary.h b/c/include/cuvs/preprocessing/quantize/binary.h index acd1bd97e9..e172fd2d18 100644 --- a/c/include/cuvs/preprocessing/quantize/binary.h +++ b/c/include/cuvs/preprocessing/quantize/binary.h @@ -9,6 +9,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -52,7 +54,7 @@ typedef struct cuvsBinaryQuantizerParams* cuvsBinaryQuantizerParams_t; * @param[in] params cuvsBinaryQuantizerParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsBinaryQuantizerParamsCreate(cuvsBinaryQuantizerParams_t* params); +CUVS_EXPORT cuvsError_t cuvsBinaryQuantizerParamsCreate(cuvsBinaryQuantizerParams_t* params); /** * @brief De-allocate Binary Quantizer params @@ -60,7 +62,7 @@ cuvsError_t cuvsBinaryQuantizerParamsCreate(cuvsBinaryQuantizerParams_t* params) * @param[in] params * @return cuvsError_t */ -cuvsError_t cuvsBinaryQuantizerParamsDestroy(cuvsBinaryQuantizerParams_t params); +CUVS_EXPORT cuvsError_t cuvsBinaryQuantizerParamsDestroy(cuvsBinaryQuantizerParams_t params); /** * @brief Defines and stores threshold for quantization upon training @@ -81,7 +83,7 @@ typedef cuvsBinaryQuantizer* cuvsBinaryQuantizer_t; * @param[in] quantizer cuvsBinaryQuantizer_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsBinaryQuantizerCreate(cuvsBinaryQuantizer_t* quantizer); +CUVS_EXPORT cuvsError_t cuvsBinaryQuantizerCreate(cuvsBinaryQuantizer_t* quantizer); /** * @brief De-allocate Binary Quantizer @@ -89,7 +91,7 @@ cuvsError_t cuvsBinaryQuantizerCreate(cuvsBinaryQuantizer_t* quantizer); * @param[in] quantizer * @return cuvsError_t */ -cuvsError_t cuvsBinaryQuantizerDestroy(cuvsBinaryQuantizer_t quantizer); +CUVS_EXPORT cuvsError_t cuvsBinaryQuantizerDestroy(cuvsBinaryQuantizer_t quantizer); /** * @brief Trains a binary quantizer to be used later for quantizing the dataset. @@ -99,7 +101,7 @@ cuvsError_t cuvsBinaryQuantizerDestroy(cuvsBinaryQuantizer_t quantizer); * @param[in] dataset a row-major host or device matrix * @param[out] quantizer trained binary quantizer */ -cuvsError_t cuvsBinaryQuantizerTrain(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsBinaryQuantizerTrain(cuvsResources_t res, cuvsBinaryQuantizerParams_t params, DLManagedTensor* dataset, cuvsBinaryQuantizer_t quantizer); @@ -115,7 +117,7 @@ cuvsError_t cuvsBinaryQuantizerTrain(cuvsResources_t res, * @param[in] dataset a row-major host or device matrix to transform * @param[out] out a row-major host or device matrix to store transformed data */ -cuvsError_t cuvsBinaryQuantizerTransform(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsBinaryQuantizerTransform(cuvsResources_t res, DLManagedTensor* dataset, DLManagedTensor* out); @@ -131,7 +133,7 @@ cuvsError_t cuvsBinaryQuantizerTransform(cuvsResources_t res, * @param[in] dataset a row-major host or device matrix to transform * @param[out] out a row-major host or device matrix to store transformed data */ -cuvsError_t cuvsBinaryQuantizerTransformWithParams(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsBinaryQuantizerTransformWithParams(cuvsResources_t res, cuvsBinaryQuantizer_t quantizer, DLManagedTensor* dataset, DLManagedTensor* out); diff --git a/c/include/cuvs/preprocessing/quantize/pq.h b/c/include/cuvs/preprocessing/quantize/pq.h index 0b61c6da3c..552e6ec0b2 100644 --- a/c/include/cuvs/preprocessing/quantize/pq.h +++ b/c/include/cuvs/preprocessing/quantize/pq.h @@ -10,6 +10,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -82,7 +84,7 @@ typedef struct cuvsProductQuantizerParams* cuvsProductQuantizerParams_t; * @param[in] params cuvsProductQuantizerParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsProductQuantizerParamsCreate(cuvsProductQuantizerParams_t* params); +CUVS_EXPORT cuvsError_t cuvsProductQuantizerParamsCreate(cuvsProductQuantizerParams_t* params); /** * @brief De-allocate Product Quantizer params @@ -90,7 +92,7 @@ cuvsError_t cuvsProductQuantizerParamsCreate(cuvsProductQuantizerParams_t* param * @param[in] params * @return cuvsError_t */ -cuvsError_t cuvsProductQuantizerParamsDestroy(cuvsProductQuantizerParams_t params); +CUVS_EXPORT cuvsError_t cuvsProductQuantizerParamsDestroy(cuvsProductQuantizerParams_t params); /** * @brief Defines and stores product quantizer upon training @@ -111,7 +113,7 @@ typedef cuvsProductQuantizer* cuvsProductQuantizer_t; * @param[in] quantizer cuvsProductQuantizer_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsProductQuantizerCreate(cuvsProductQuantizer_t* quantizer); +CUVS_EXPORT cuvsError_t cuvsProductQuantizerCreate(cuvsProductQuantizer_t* quantizer); /** * @brief De-allocate Product Quantizer @@ -119,7 +121,7 @@ cuvsError_t cuvsProductQuantizerCreate(cuvsProductQuantizer_t* quantizer); * @param[in] quantizer * @return cuvsError_t */ -cuvsError_t cuvsProductQuantizerDestroy(cuvsProductQuantizer_t quantizer); +CUVS_EXPORT cuvsError_t cuvsProductQuantizerDestroy(cuvsProductQuantizer_t quantizer); /** * @brief Builds a product quantizer to be used later for quantizing the dataset. @@ -129,7 +131,7 @@ cuvsError_t cuvsProductQuantizerDestroy(cuvsProductQuantizer_t quantizer); * @param[in] dataset a row-major host or device matrix * @param[out] quantizer trained product quantizer */ -cuvsError_t cuvsProductQuantizerBuild(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsProductQuantizerBuild(cuvsResources_t res, cuvsProductQuantizerParams_t params, DLManagedTensor* dataset, cuvsProductQuantizer_t quantizer); @@ -146,7 +148,7 @@ cuvsError_t cuvsProductQuantizerBuild(cuvsResources_t res, * @param[out] vq_labels a device vector to store VQ labels. * Optional, can be NULL. */ -cuvsError_t cuvsProductQuantizerTransform(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsProductQuantizerTransform(cuvsResources_t res, cuvsProductQuantizer_t quantizer, DLManagedTensor* dataset, DLManagedTensor* codes_out, @@ -164,7 +166,7 @@ cuvsError_t cuvsProductQuantizerTransform(cuvsResources_t res, * @param[out] vq_labels a device vector containing the VQ labels when VQ is used. * Optional, can be NULL. */ - cuvsError_t cuvsProductQuantizerInverseTransform(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsProductQuantizerInverseTransform(cuvsResources_t res, cuvsProductQuantizer_t quantizer, DLManagedTensor* pq_codes, DLManagedTensor* out, @@ -176,7 +178,7 @@ cuvsError_t cuvsProductQuantizerTransform(cuvsResources_t res, * @param[in] quantizer product quantizer * @param[out] pq_bits bit length of the vector element after compression by PQ */ -cuvsError_t cuvsProductQuantizerGetPqBits(cuvsProductQuantizer_t quantizer, uint32_t* pq_bits); +CUVS_EXPORT cuvsError_t cuvsProductQuantizerGetPqBits(cuvsProductQuantizer_t quantizer, uint32_t* pq_bits); /** * @brief Get the dimensionality of the vector after compression by PQ. @@ -184,7 +186,7 @@ cuvsError_t cuvsProductQuantizerGetPqBits(cuvsProductQuantizer_t quantizer, uint * @param[in] quantizer product quantizer * @param[out] pq_dim dimensionality of the vector after compression by PQ */ -cuvsError_t cuvsProductQuantizerGetPqDim(cuvsProductQuantizer_t quantizer, uint32_t* pq_dim); +CUVS_EXPORT cuvsError_t cuvsProductQuantizerGetPqDim(cuvsProductQuantizer_t quantizer, uint32_t* pq_dim); /** * @brief Get the PQ codebook. @@ -192,7 +194,7 @@ cuvsError_t cuvsProductQuantizerGetPqDim(cuvsProductQuantizer_t quantizer, uint3 * @param[in] quantizer product quantizer * @param[out] pq_codebook PQ codebook */ -cuvsError_t cuvsProductQuantizerGetPqCodebook(cuvsProductQuantizer_t quantizer, +CUVS_EXPORT cuvsError_t cuvsProductQuantizerGetPqCodebook(cuvsProductQuantizer_t quantizer, DLManagedTensor* pq_codebook); /** @@ -201,7 +203,7 @@ cuvsError_t cuvsProductQuantizerGetPqCodebook(cuvsProductQuantizer_t quantizer, * @param[in] quantizer product quantizer * @param[out] vq_codebook VQ codebook */ -cuvsError_t cuvsProductQuantizerGetVqCodebook(cuvsProductQuantizer_t quantizer, +CUVS_EXPORT cuvsError_t cuvsProductQuantizerGetVqCodebook(cuvsProductQuantizer_t quantizer, DLManagedTensor* vq_codebook); /** * @brief Get the encoded dimension of the quantized dataset. @@ -209,7 +211,7 @@ cuvsError_t cuvsProductQuantizerGetVqCodebook(cuvsProductQuantizer_t quantizer, * @param[in] quantizer product quantizer * @param[out] encoded_dim encoded dimension of the quantized dataset */ -cuvsError_t cuvsProductQuantizerGetEncodedDim(cuvsProductQuantizer_t quantizer, +CUVS_EXPORT cuvsError_t cuvsProductQuantizerGetEncodedDim(cuvsProductQuantizer_t quantizer, uint32_t* encoded_dim); /** @@ -218,7 +220,7 @@ cuvsError_t cuvsProductQuantizerGetEncodedDim(cuvsProductQuantizer_t quantizer, * @param[in] quantizer product quantizer * @param[out] use_vq whether VQ is used */ -cuvsError_t cuvsProductQuantizerGetUseVq(cuvsProductQuantizer_t quantizer, bool* use_vq); +CUVS_EXPORT cuvsError_t cuvsProductQuantizerGetUseVq(cuvsProductQuantizer_t quantizer, bool* use_vq); /** * @} */ diff --git a/c/include/cuvs/preprocessing/quantize/scalar.h b/c/include/cuvs/preprocessing/quantize/scalar.h index e3ac302413..9724ddbfa8 100644 --- a/c/include/cuvs/preprocessing/quantize/scalar.h +++ b/c/include/cuvs/preprocessing/quantize/scalar.h @@ -9,6 +9,8 @@ #include #include +#include + #ifdef __cplusplus extern "C" { #endif @@ -36,7 +38,7 @@ typedef struct cuvsScalarQuantizerParams* cuvsScalarQuantizerParams_t; * @param[in] params cuvsScalarQuantizerParams_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsScalarQuantizerParamsCreate(cuvsScalarQuantizerParams_t* params); +CUVS_EXPORT cuvsError_t cuvsScalarQuantizerParamsCreate(cuvsScalarQuantizerParams_t* params); /** * @brief De-allocate Scalar Quantizer params @@ -44,7 +46,7 @@ cuvsError_t cuvsScalarQuantizerParamsCreate(cuvsScalarQuantizerParams_t* params) * @param[in] params * @return cuvsError_t */ -cuvsError_t cuvsScalarQuantizerParamsDestroy(cuvsScalarQuantizerParams_t params); +CUVS_EXPORT cuvsError_t cuvsScalarQuantizerParamsDestroy(cuvsScalarQuantizerParams_t params); /** * @brief Defines and stores scalar for quantisation upon training @@ -65,7 +67,7 @@ typedef cuvsScalarQuantizer* cuvsScalarQuantizer_t; * @param[in] quantizer cuvsScalarQuantizer_t to allocate * @return cuvsError_t */ -cuvsError_t cuvsScalarQuantizerCreate(cuvsScalarQuantizer_t* quantizer); +CUVS_EXPORT cuvsError_t cuvsScalarQuantizerCreate(cuvsScalarQuantizer_t* quantizer); /** * @brief De-allocate Scalar Quantizer @@ -73,7 +75,7 @@ cuvsError_t cuvsScalarQuantizerCreate(cuvsScalarQuantizer_t* quantizer); * @param[in] quantizer * @return cuvsError_t */ -cuvsError_t cuvsScalarQuantizerDestroy(cuvsScalarQuantizer_t quantizer); +CUVS_EXPORT cuvsError_t cuvsScalarQuantizerDestroy(cuvsScalarQuantizer_t quantizer); /** * @brief Trains a scalar quantizer to be used later for quantizing the dataset. @@ -83,7 +85,7 @@ cuvsError_t cuvsScalarQuantizerDestroy(cuvsScalarQuantizer_t quantizer); * @param[in] dataset a row-major host or device matrix * @param[out] quantizer trained scalar quantizer */ -cuvsError_t cuvsScalarQuantizerTrain(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsScalarQuantizerTrain(cuvsResources_t res, cuvsScalarQuantizerParams_t params, DLManagedTensor* dataset, cuvsScalarQuantizer_t quantizer); @@ -96,7 +98,7 @@ cuvsError_t cuvsScalarQuantizerTrain(cuvsResources_t res, * @param[in] dataset a row-major host or device matrix to transform * @param[out] out a row-major host or device matrix to store transformed data */ -cuvsError_t cuvsScalarQuantizerTransform(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsScalarQuantizerTransform(cuvsResources_t res, cuvsScalarQuantizer_t quantizer, DLManagedTensor* dataset, DLManagedTensor* out); @@ -113,7 +115,7 @@ cuvsError_t cuvsScalarQuantizerTransform(cuvsResources_t res, * @param[out] out a row-major host or device matrix * */ -cuvsError_t cuvsScalarQuantizerInverseTransform(cuvsResources_t res, +CUVS_EXPORT cuvsError_t cuvsScalarQuantizerInverseTransform(cuvsResources_t res, cuvsScalarQuantizer_t quantizer, DLManagedTensor* dataset, DLManagedTensor* out); diff --git a/c/src/distance/pairwise_distance.cpp b/c/src/distance/pairwise_distance.cpp index 6ddd79e42c..f3981ee059 100644 --- a/c/src/distance/pairwise_distance.cpp +++ b/c/src/distance/pairwise_distance.cpp @@ -1,6 +1,6 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2024-2025, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ @@ -13,6 +13,7 @@ #include #include +#include #include #include "../core/exceptions.hpp" diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index f50a0ae77a..b83c81a627 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -935,6 +935,8 @@ if(NOT BUILD_CPU_ONLY) CUDA_STANDARD 20 CUDA_STANDARD_REQUIRED ON POSITION_INDEPENDENT_CODE ON + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON ) target_compile_options( cuvs_objs diff --git a/cpp/doxygen/Doxyfile b/cpp/doxygen/Doxyfile index a1c20422e7..943fbbc035 100644 --- a/cpp/doxygen/Doxyfile +++ b/cpp/doxygen/Doxyfile @@ -1061,6 +1061,8 @@ EXCLUDE_SYMLINKS = NO # exclude all test directories for example use the pattern */test/* EXCLUDE_PATTERNS = */detail/* \ + */export.h \ + */export.hpp \ */specializations/* \ */thirdparty/* @@ -2392,7 +2394,7 @@ ENABLE_PREPROCESSING = YES # The default value is: NO. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -MACRO_EXPANSION = NO +MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then # the macro expansion is limited to the macros specified with the PREDEFINED and @@ -2400,7 +2402,7 @@ MACRO_EXPANSION = NO # The default value is: NO. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -EXPAND_ONLY_PREDEF = NO +EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES, the include files in the # INCLUDE_PATH will be searched if a #include is found. @@ -2434,7 +2436,9 @@ INCLUDE_FILE_PATTERNS = # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. PREDEFINED = "CUVS_BUILD_MG_ALGOS=1" \ - "CUVS_BUILD_CAGRA_HNSWLIB=1" + "CUVS_BUILD_CAGRA_HNSWLIB=1" \ + "CUVS_EXPORT=" \ + "CUVS_HIDDEN=" # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this # tag can be used to specify a list of macro names that should be expanded. The diff --git a/cpp/include/cuvs/cluster/agglomerative.hpp b/cpp/include/cuvs/cluster/agglomerative.hpp index 050f0cecdc..ea0399ebf0 100644 --- a/cpp/include/cuvs/cluster/agglomerative.hpp +++ b/cpp/include/cuvs/cluster/agglomerative.hpp @@ -10,11 +10,14 @@ #include #include +#include #include #include #include -namespace cuvs::cluster::agglomerative { +namespace CUVS_EXPORT cuvs { +namespace cluster { +namespace agglomerative { // constant to indirectly control the number of neighbors. k = sqrt(n) + c. default to 15 constexpr int DEFAULT_CONST_C = 15; @@ -257,4 +260,6 @@ void build_dendrogram(raft::resources const& handle, /** * @} */ -}; // end namespace cuvs::cluster::agglomerative +} // namespace agglomerative +} // namespace cluster +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/cluster/kmeans.hpp b/cpp/include/cuvs/cluster/kmeans.hpp index d299d9f483..88b92995cd 100644 --- a/cpp/include/cuvs/cluster/kmeans.hpp +++ b/cpp/include/cuvs/cluster/kmeans.hpp @@ -11,9 +11,12 @@ #include #include +#include #include -namespace cuvs::cluster::kmeans { +namespace CUVS_EXPORT cuvs { +namespace cluster { +namespace kmeans { /** Base structure for parameters that are common to all k-means algorithms */ struct base_params { @@ -1630,4 +1633,6 @@ void find_k(raft::resources const& handle, */ } // namespace helpers -} // namespace cuvs::cluster::kmeans +} // namespace kmeans +} // namespace cluster +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/cluster/spectral.hpp b/cpp/include/cuvs/cluster/spectral.hpp index f1ed2fd7ff..deea697743 100644 --- a/cpp/include/cuvs/cluster/spectral.hpp +++ b/cpp/include/cuvs/cluster/spectral.hpp @@ -1,15 +1,18 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ #pragma once +#include #include #include #include #include -namespace cuvs::cluster::spectral { +namespace CUVS_EXPORT cuvs { +namespace cluster { +namespace spectral { /** * @defgroup spectral_params Spectral Clustering Parameters @@ -160,4 +163,6 @@ void fit_predict(raft::resources const& handle, * @} */ -} // namespace cuvs::cluster::spectral +} // namespace spectral +} // namespace cluster +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/core/bitmap.hpp b/cpp/include/cuvs/core/bitmap.hpp index 681117276f..952ad3b9dc 100644 --- a/cpp/include/cuvs/core/bitmap.hpp +++ b/cpp/include/cuvs/core/bitmap.hpp @@ -1,16 +1,19 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2024, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ #pragma once +#include #include -namespace cuvs::core { +namespace CUVS_EXPORT cuvs { +namespace core { /* To use bitmap functions containing CUDA code, include */ template using bitmap_view = raft::core::bitmap_view; -} // end namespace cuvs::core +} // namespace core +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/core/bitset.hpp b/cpp/include/cuvs/core/bitset.hpp index 7038400e8f..2ca82a4627 100644 --- a/cpp/include/cuvs/core/bitset.hpp +++ b/cpp/include/cuvs/core/bitset.hpp @@ -1,10 +1,11 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2024, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ #pragma once +#include #include extern template struct raft::core::bitset; @@ -13,7 +14,8 @@ extern template struct raft::core::bitset; extern template struct raft::core::bitset; extern template struct raft::core::bitset; -namespace cuvs::core { +namespace CUVS_EXPORT cuvs { +namespace core { /* To use bitset functions containing CUDA code, include */ template @@ -22,4 +24,5 @@ using bitset_view = raft::core::bitset_view; template using bitset = raft::core::bitset; -} // end namespace cuvs::core +} // namespace core +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/core/export.hpp b/cpp/include/cuvs/core/export.hpp new file mode 100644 index 0000000000..7b6d2aae84 --- /dev/null +++ b/cpp/include/cuvs/core/export.hpp @@ -0,0 +1,18 @@ +/* + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +// Symbol visibility macros for cuVS shared libraries. +// When CXX_VISIBILITY_PRESET is set to hidden, only symbols explicitly +// marked with CUVS_EXPORT will be visible in the shared library. +// CUVS_HIDDEN can be used to explicitly mark symbols as hidden. +#if (defined(__GNUC__) && !defined(__MINGW32__) && !defined(__MINGW64__)) +#define CUVS_EXPORT __attribute__((visibility("default"))) +#define CUVS_HIDDEN __attribute__((visibility("hidden"))) +#else +#define CUVS_EXPORT +#define CUVS_HIDDEN +#endif diff --git a/cpp/include/cuvs/distance/distance.hpp b/cpp/include/cuvs/distance/distance.hpp index e8accdaaf3..3dd273696e 100644 --- a/cpp/include/cuvs/distance/distance.hpp +++ b/cpp/include/cuvs/distance/distance.hpp @@ -7,11 +7,13 @@ #include #include +#include #include #include #include -namespace cuvs::distance { +namespace CUVS_EXPORT cuvs { +namespace distance { /** enum to tell how to compute distance */ enum class DistanceType : int { @@ -465,4 +467,5 @@ void pairwise_distance(raft::resources const& handle, /** @} */ // end group pairwise_distance_runtime -}; // namespace cuvs::distance +} // namespace distance +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/distance/grammian.hpp b/cpp/include/cuvs/distance/grammian.hpp index 4cb3aa47b6..eab612adc6 100644 --- a/cpp/include/cuvs/distance/grammian.hpp +++ b/cpp/include/cuvs/distance/grammian.hpp @@ -1,18 +1,21 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2022-2024, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2022-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ #pragma once #include +#include #include #include #include #include #include -namespace cuvs::distance::kernels { +namespace CUVS_EXPORT cuvs { +namespace distance { +namespace kernels { template using dense_input_matrix_view_t = raft::device_matrix_view; @@ -651,4 +654,6 @@ class RBFKernel : public GramMatrixBase { int ld2, int ld_out); }; -}; // end namespace cuvs::distance::kernels +} // namespace kernels +} // namespace distance +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/distance/kde.hpp b/cpp/include/cuvs/distance/kde.hpp index ea3ef8da78..16230de236 100644 --- a/cpp/include/cuvs/distance/kde.hpp +++ b/cpp/include/cuvs/distance/kde.hpp @@ -9,9 +9,11 @@ #include #include +#include #include -namespace cuvs::distance { +namespace CUVS_EXPORT cuvs { +namespace distance { /** * @brief Compute log-density estimates for query points using kernel density estimation. @@ -78,4 +80,5 @@ extern template void kde( cuvs::distance::DistanceType, double); -} // namespace cuvs::distance +} // namespace distance +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/neighbors/all_neighbors.hpp b/cpp/include/cuvs/neighbors/all_neighbors.hpp index 70e066ef2f..8f0a98d8a7 100644 --- a/cpp/include/cuvs/neighbors/all_neighbors.hpp +++ b/cpp/include/cuvs/neighbors/all_neighbors.hpp @@ -9,9 +9,12 @@ #include #include +#include #include -namespace cuvs::neighbors::all_neighbors { +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace all_neighbors { // For re-exporting into all_neighbors namespace namespace graph_build_params = cuvs::neighbors::graph_build_params; /** @@ -169,4 +172,6 @@ void build( float alpha = 1.0); /** @} */ -} // namespace cuvs::neighbors::all_neighbors +} // namespace all_neighbors +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/neighbors/ball_cover.hpp b/cpp/include/cuvs/neighbors/ball_cover.hpp index 17fa94bfd7..7471c91c27 100644 --- a/cpp/include/cuvs/neighbors/ball_cover.hpp +++ b/cpp/include/cuvs/neighbors/ball_cover.hpp @@ -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 */ @@ -15,8 +15,11 @@ #include #include +#include -namespace cuvs::neighbors::ball_cover { +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace ball_cover { /** * @ingroup random_ball_cover @@ -338,4 +341,6 @@ void knn_query(raft::resources const& handle, /** @} */ -} // namespace cuvs::neighbors::ball_cover +} // namespace ball_cover +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/neighbors/brute_force.hpp b/cpp/include/cuvs/neighbors/brute_force.hpp index b57c2e7a0f..9d690f8f89 100644 --- a/cpp/include/cuvs/neighbors/brute_force.hpp +++ b/cpp/include/cuvs/neighbors/brute_force.hpp @@ -13,8 +13,11 @@ #include #include +#include -namespace cuvs::neighbors::brute_force { +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace brute_force { struct index_params : cuvs::neighbors::index_params {}; @@ -925,12 +928,17 @@ void deserialize(raft::resources const& handle, * @} */ -} // namespace cuvs::neighbors::brute_force - +} // namespace brute_force +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs /** Specialized parameters utilizing brute force to build knn graph */ -namespace cuvs::neighbors::graph_build_params { +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace graph_build_params { struct brute_force_params { cuvs::neighbors::brute_force::index_params build_params; cuvs::neighbors::brute_force::search_params search_params; }; -} // namespace cuvs::neighbors::graph_build_params +} // namespace graph_build_params +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/neighbors/cagra.hpp b/cpp/include/cuvs/neighbors/cagra.hpp index a7e1249677..6a5d15bc59 100644 --- a/cpp/include/cuvs/neighbors/cagra.hpp +++ b/cpp/include/cuvs/neighbors/cagra.hpp @@ -26,11 +26,14 @@ #include #include +#include #include #include #include -namespace cuvs::neighbors::graph_build_params { +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace graph_build_params { using iterative_search_params = cuvs::neighbors::search_params; /** Specialized parameters for ACE (Augmented Core Extraction) graph build */ @@ -95,9 +98,12 @@ struct ace_params { ace_params() = default; }; -} // namespace cuvs::neighbors::graph_build_params - -namespace cuvs::neighbors::cagra { +} // namespace graph_build_params +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace cagra { // For re-exporting into cagra namespace namespace graph_build_params = cuvs::neighbors::graph_build_params; /** @@ -3227,9 +3233,13 @@ void build_knn_graph(raft::resources const& res, raft::host_matrix_view knn_graph, cuvs::neighbors::cagra::graph_build_params::ivf_pq_params build_params); -} // namespace cuvs::neighbors::cagra - -namespace cuvs::neighbors::cagra::helpers { +} // namespace cagra +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace cagra { +namespace helpers { /** * @brief Optimize a KNN graph into a CAGRA graph. @@ -3254,4 +3264,7 @@ void optimize(raft::resources const& handle, raft::host_matrix_view knn_graph, raft::host_matrix_view new_graph); -} // namespace cuvs::neighbors::cagra::helpers +} // namespace helpers +} // namespace cagra +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/neighbors/common.hpp b/cpp/include/cuvs/neighbors/common.hpp index c7111aaf4a..7569ee2508 100644 --- a/cpp/include/cuvs/neighbors/common.hpp +++ b/cpp/include/cuvs/neighbors/common.hpp @@ -27,9 +27,11 @@ #ifdef __cpp_lib_bitops #include +#include #endif -namespace cuvs::neighbors { +namespace CUVS_EXPORT cuvs { +namespace neighbors { /** * @addtogroup cagra_cpp_index_params * @{ @@ -977,4 +979,5 @@ struct mg_index { std::shared_ptr> round_robin_counter_; }; -} // namespace cuvs::neighbors +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/neighbors/composite/index.hpp b/cpp/include/cuvs/neighbors/composite/index.hpp index ef57fbe0a5..e7b7f9a872 100644 --- a/cpp/include/cuvs/neighbors/composite/index.hpp +++ b/cpp/include/cuvs/neighbors/composite/index.hpp @@ -9,9 +9,12 @@ #include #include +#include #include -namespace cuvs::neighbors::composite { +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace composite { /** * @brief Composite index that searches multiple CAGRA sub-indices and merges results. @@ -91,4 +94,6 @@ class composite_index { std::vector*> children_; }; -} // namespace cuvs::neighbors::composite +} // namespace composite +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/neighbors/dynamic_batching.hpp b/cpp/include/cuvs/neighbors/dynamic_batching.hpp index 8e76d9168d..720bfee4d0 100644 --- a/cpp/include/cuvs/neighbors/dynamic_batching.hpp +++ b/cpp/include/cuvs/neighbors/dynamic_batching.hpp @@ -1,13 +1,16 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2024, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ #pragma once +#include #include -namespace cuvs::neighbors::dynamic_batching { +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace dynamic_batching { namespace detail { template @@ -276,4 +279,6 @@ void search(raft::resources const& res, /** @} */ -} // namespace cuvs::neighbors::dynamic_batching +} // namespace dynamic_batching +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/neighbors/epsilon_neighborhood.hpp b/cpp/include/cuvs/neighbors/epsilon_neighborhood.hpp index 659de004e9..59541421c5 100644 --- a/cpp/include/cuvs/neighbors/epsilon_neighborhood.hpp +++ b/cpp/include/cuvs/neighbors/epsilon_neighborhood.hpp @@ -1,15 +1,18 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ #pragma once +#include #include #include #include -namespace cuvs::neighbors::epsilon_neighborhood { +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace epsilon_neighborhood { /** * @defgroup epsilon_neighborhood_cpp_l2 Epsilon Neighborhood L2 Operations @@ -66,4 +69,6 @@ void compute(raft::resources const& handle, /** @} */ // end group epsilon_neighborhood_cpp_l2 -} // namespace cuvs::neighbors::epsilon_neighborhood +} // namespace epsilon_neighborhood +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/neighbors/hnsw.hpp b/cpp/include/cuvs/neighbors/hnsw.hpp index 7ee91f18ba..fb726fed71 100644 --- a/cpp/include/cuvs/neighbors/hnsw.hpp +++ b/cpp/include/cuvs/neighbors/hnsw.hpp @@ -18,11 +18,14 @@ #include #include +#include #include #include #include -namespace cuvs::neighbors::hnsw { +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace hnsw { // Re-export graph_build_params into hnsw namespace for convenience namespace graph_build_params = cuvs::neighbors::graph_build_params; @@ -1231,8 +1234,9 @@ void deserialize(raft::resources const& res, * @} */ -} // namespace cuvs::neighbors::hnsw - +} // namespace hnsw +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs #else #error "This header is only available if cuVS CMake option `BUILD_CAGRA_HNSWLIB=ON" #endif diff --git a/cpp/include/cuvs/neighbors/ivf_flat.hpp b/cpp/include/cuvs/neighbors/ivf_flat.hpp index f214db295c..a8fb4f49be 100644 --- a/cpp/include/cuvs/neighbors/ivf_flat.hpp +++ b/cpp/include/cuvs/neighbors/ivf_flat.hpp @@ -7,13 +7,16 @@ #include "common.hpp" #include +#include #include #include #include #include #include -namespace cuvs::neighbors::ivf_flat { +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace ivf_flat { /** * @defgroup ivf_flat_cpp_index_params IVF-Flat index build parameters * @{ @@ -3571,4 +3574,6 @@ __device__ __forceinline__ void compute_dist_udf_impl(AccT& acc, AccT x, AccT y) } // namespace experimental::udf -} // namespace cuvs::neighbors::ivf_flat +} // namespace ivf_flat +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/neighbors/ivf_pq.hpp b/cpp/include/cuvs/neighbors/ivf_pq.hpp index 1fa7a3a7d6..d83412038a 100644 --- a/cpp/include/cuvs/neighbors/ivf_pq.hpp +++ b/cpp/include/cuvs/neighbors/ivf_pq.hpp @@ -16,12 +16,15 @@ #include #include +#include #include #include #include #include -namespace cuvs::neighbors::ivf_pq { +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace ivf_pq { /** * @defgroup ivf_pq_cpp_index_params IVF-PQ index build parameters @@ -3357,9 +3360,13 @@ void resize_list(raft::resources const& res, */ } // namespace helpers -} // namespace cuvs::neighbors::ivf_pq +} // namespace ivf_pq +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs -namespace cuvs::neighbors::graph_build_params { +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace graph_build_params { /** Specialized parameters utilizing IVF-PQ to build knn graph */ struct ivf_pq_params { cuvs::neighbors::ivf_pq::index_params build_params; @@ -3426,4 +3433,6 @@ struct ivf_pq_params { refinement_rate = 1; } }; -} // namespace cuvs::neighbors::graph_build_params +} // namespace graph_build_params +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/neighbors/knn_merge_parts.hpp b/cpp/include/cuvs/neighbors/knn_merge_parts.hpp index 7581a28c7c..2236e03733 100644 --- a/cpp/include/cuvs/neighbors/knn_merge_parts.hpp +++ b/cpp/include/cuvs/neighbors/knn_merge_parts.hpp @@ -1,16 +1,18 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ #pragma once #include +#include #include #include #include -namespace cuvs::neighbors { +namespace CUVS_EXPORT cuvs { +namespace neighbors { /** * @brief Merge knn distances and index matrix, which have been partitioned * by row, into a single matrix with only the k-nearest neighbors. @@ -40,4 +42,5 @@ void knn_merge_parts(raft::resources const& res, raft::device_matrix_view outK, raft::device_matrix_view outV, raft::device_vector_view translations); -} // namespace cuvs::neighbors +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/neighbors/nn_descent.hpp b/cpp/include/cuvs/neighbors/nn_descent.hpp index 9ad548a628..7698038c8c 100644 --- a/cpp/include/cuvs/neighbors/nn_descent.hpp +++ b/cpp/include/cuvs/neighbors/nn_descent.hpp @@ -17,8 +17,11 @@ #include #include +#include -namespace cuvs::neighbors::nn_descent { +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace nn_descent { /** * @defgroup nn_descent_cpp_index_params The nn-descent algorithm parameters. * @{ @@ -532,8 +535,13 @@ bool has_enough_device_memory(raft::resources const& res, raft::matrix_extent dataset, size_t idx_size = 4); -} // namespace cuvs::neighbors::nn_descent - -namespace cuvs::neighbors::graph_build_params { +} // namespace nn_descent +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace graph_build_params { using nn_descent_params = cuvs::neighbors::nn_descent::index_params; } +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/neighbors/refine.hpp b/cpp/include/cuvs/neighbors/refine.hpp index 7ddcd7c7d7..c609f9c757 100644 --- a/cpp/include/cuvs/neighbors/refine.hpp +++ b/cpp/include/cuvs/neighbors/refine.hpp @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2024, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ @@ -7,6 +7,7 @@ #include +#include #include #include #include @@ -14,7 +15,8 @@ #include #include -namespace cuvs::neighbors { +namespace CUVS_EXPORT cuvs { +namespace neighbors { /** * @defgroup ann_refine Approximate Nearest Neighbors Refinement * @{ @@ -470,4 +472,5 @@ void refine(raft::resources const& handle, raft::host_matrix_view distances, cuvs::distance::DistanceType metric = cuvs::distance::DistanceType::L2Unexpanded); -} // namespace cuvs::neighbors +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/neighbors/scann.hpp b/cpp/include/cuvs/neighbors/scann.hpp index 56948c3a74..de0487265e 100644 --- a/cpp/include/cuvs/neighbors/scann.hpp +++ b/cpp/include/cuvs/neighbors/scann.hpp @@ -20,10 +20,14 @@ #include #include +#include #include #include -namespace cuvs::neighbors::experimental::scann { +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace experimental { +namespace scann { /** * @defgroup scann_cpp_index_params ScaNN index build parameters * @{ @@ -321,4 +325,7 @@ void serialize(raft::resources const& handle, * @} */ -} // namespace cuvs::neighbors::experimental::scann +} // namespace scann +} // namespace experimental +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/neighbors/tiered_index.hpp b/cpp/include/cuvs/neighbors/tiered_index.hpp index 845cf10a85..8d0e18281c 100644 --- a/cpp/include/cuvs/neighbors/tiered_index.hpp +++ b/cpp/include/cuvs/neighbors/tiered_index.hpp @@ -1,17 +1,20 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ #pragma once +#include #include #include #include #include #include -namespace cuvs::neighbors::ivf_pq { +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace ivf_pq { // The default ivf-pq index doesn't have a 'value_type', since it // can accept multiple different types at search time. // However, the tiered index code needs a value_type (for the bfknn tier), @@ -20,9 +23,12 @@ template struct typed_index : index { using value_type = T; }; -} // namespace cuvs::neighbors::ivf_pq - -namespace cuvs::neighbors::tiered_index { +} // namespace ivf_pq +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace tiered_index { // forward reference to tiered_index implementation. namespace detail { @@ -216,4 +222,6 @@ auto merge(raft::resources const& res, const std::vector>*>& indices) -> tiered_index::index>; -} // namespace cuvs::neighbors::tiered_index +} // namespace tiered_index +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/neighbors/vamana.hpp b/cpp/include/cuvs/neighbors/vamana.hpp index c3ba86d5b6..645adc5c5d 100644 --- a/cpp/include/cuvs/neighbors/vamana.hpp +++ b/cpp/include/cuvs/neighbors/vamana.hpp @@ -17,10 +17,13 @@ #include #include +#include #include #include -namespace cuvs::neighbors::vamana { +namespace CUVS_EXPORT cuvs { +namespace neighbors { +namespace vamana { /** * @defgroup vamana_cpp_index_params Vamana index build parameters @@ -615,4 +618,6 @@ auto deserialize_codebooks(const std::string& codebook_prefix, const int dim) * @} */ -} // namespace cuvs::neighbors::vamana +} // namespace vamana +} // namespace neighbors +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/preprocessing/pca.hpp b/cpp/include/cuvs/preprocessing/pca.hpp index f30b245d34..361b3f0075 100644 --- a/cpp/include/cuvs/preprocessing/pca.hpp +++ b/cpp/include/cuvs/preprocessing/pca.hpp @@ -5,11 +5,14 @@ #pragma once +#include #include #include #include -namespace cuvs::preprocessing::pca { +namespace CUVS_EXPORT cuvs { +namespace preprocessing { +namespace pca { using solver = raft::linalg::solver; @@ -182,4 +185,6 @@ void inverse_transform(raft::resources const& handle, /** @} */ // end group pca -} // namespace cuvs::preprocessing::pca +} // namespace pca +} // namespace preprocessing +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/preprocessing/quantize/binary.hpp b/cpp/include/cuvs/preprocessing/quantize/binary.hpp index ede09fe4ba..29861f8ab9 100644 --- a/cpp/include/cuvs/preprocessing/quantize/binary.hpp +++ b/cpp/include/cuvs/preprocessing/quantize/binary.hpp @@ -12,8 +12,12 @@ #include #include +#include -namespace cuvs::preprocessing::quantize::binary { +namespace CUVS_EXPORT cuvs { +namespace preprocessing { +namespace quantize { +namespace binary { /** * @defgroup binary Binary quantizer utilities @@ -428,4 +432,7 @@ void transform(raft::resources const& res, /** @} */ // end of group binary -} // namespace cuvs::preprocessing::quantize::binary +} // namespace binary +} // namespace quantize +} // namespace preprocessing +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/preprocessing/quantize/pq.hpp b/cpp/include/cuvs/preprocessing/quantize/pq.hpp index 104e43dc72..bdbe77bac6 100644 --- a/cpp/include/cuvs/preprocessing/quantize/pq.hpp +++ b/cpp/include/cuvs/preprocessing/quantize/pq.hpp @@ -11,9 +11,13 @@ #include #include +#include #include -namespace cuvs::preprocessing::quantize::pq { +namespace CUVS_EXPORT cuvs { +namespace preprocessing { +namespace quantize { +namespace pq { /** * @defgroup pq Product Quantizer utilities @@ -241,4 +245,7 @@ void inverse_transform( /** @} */ // end of group product -} // namespace cuvs::preprocessing::quantize::pq +} // namespace pq +} // namespace quantize +} // namespace preprocessing +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/preprocessing/quantize/scalar.hpp b/cpp/include/cuvs/preprocessing/quantize/scalar.hpp index b2817f807b..016ebd5dc5 100644 --- a/cpp/include/cuvs/preprocessing/quantize/scalar.hpp +++ b/cpp/include/cuvs/preprocessing/quantize/scalar.hpp @@ -12,8 +12,12 @@ #include #include +#include -namespace cuvs::preprocessing::quantize::scalar { +namespace CUVS_EXPORT cuvs { +namespace preprocessing { +namespace quantize { +namespace scalar { /** * @defgroup scalar Scalar quantizer utilities @@ -471,4 +475,7 @@ void inverse_transform(raft::resources const& res, /** @} */ // end of group scalar -} // namespace cuvs::preprocessing::quantize::scalar +} // namespace scalar +} // namespace quantize +} // namespace preprocessing +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/preprocessing/spectral_embedding.hpp b/cpp/include/cuvs/preprocessing/spectral_embedding.hpp index e7a578d2ab..355069312b 100644 --- a/cpp/include/cuvs/preprocessing/spectral_embedding.hpp +++ b/cpp/include/cuvs/preprocessing/spectral_embedding.hpp @@ -10,9 +10,12 @@ #include #include +#include #include -namespace cuvs::preprocessing::spectral_embedding { +namespace CUVS_EXPORT cuvs { +namespace preprocessing { +namespace spectral_embedding { /** * @brief Parameters for spectral embedding algorithm @@ -188,13 +191,21 @@ void transform(raft::resources const& handle, * @} */ -} // namespace cuvs::preprocessing::spectral_embedding +} // namespace spectral_embedding +} // namespace preprocessing +} // namespace CUVS_EXPORT cuvs -namespace cuvs::preprocessing::spectral_embedding::helpers { +namespace CUVS_EXPORT cuvs { +namespace preprocessing { +namespace spectral_embedding { +namespace helpers { void create_connectivity_graph(raft::resources const& handle, params spectral_embedding_config, raft::device_matrix_view dataset, raft::device_coo_matrix& connectivity_graph); -} // namespace cuvs::preprocessing::spectral_embedding::helpers +} // namespace helpers +} // namespace spectral_embedding +} // namespace preprocessing +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/selection/select_k.hpp b/cpp/include/cuvs/selection/select_k.hpp index 00d044fddd..415a3d7099 100644 --- a/cpp/include/cuvs/selection/select_k.hpp +++ b/cpp/include/cuvs/selection/select_k.hpp @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2024, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ @@ -11,9 +11,11 @@ #include #include +#include #include -namespace cuvs::selection { +namespace CUVS_EXPORT cuvs { +namespace selection { using SelectAlgo = raft::matrix::SelectAlgo; /** @@ -197,4 +199,5 @@ void select_k( std::optional> len_i = std::nullopt); /** @} */ // end of group select_k -} // namespace cuvs::selection +} // namespace selection +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/stats/silhouette_score.hpp b/cpp/include/cuvs/stats/silhouette_score.hpp index 5eebef14c5..062b7106ad 100644 --- a/cpp/include/cuvs/stats/silhouette_score.hpp +++ b/cpp/include/cuvs/stats/silhouette_score.hpp @@ -1,14 +1,15 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2024, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ #pragma once +#include #include #include #include -namespace cuvs { +namespace CUVS_EXPORT cuvs { namespace stats { /** @@ -107,4 +108,4 @@ double silhouette_score_batched( cuvs::distance::DistanceType metric = cuvs::distance::DistanceType::L2Unexpanded); } // namespace stats -} // namespace cuvs +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/stats/trustworthiness_score.hpp b/cpp/include/cuvs/stats/trustworthiness_score.hpp index 09d63de90f..cc1b05666f 100644 --- a/cpp/include/cuvs/stats/trustworthiness_score.hpp +++ b/cpp/include/cuvs/stats/trustworthiness_score.hpp @@ -1,14 +1,15 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2024, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ #pragma once +#include #include #include #include -namespace cuvs { +namespace CUVS_EXPORT cuvs { namespace stats { /** * @defgroup stats_trustworthiness Trustworthiness @@ -37,4 +38,4 @@ double trustworthiness_score( /** @} */ // end group stats_trustworthiness } // namespace stats -} // namespace cuvs +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/util/cutlass_utils.hpp b/cpp/include/cuvs/util/cutlass_utils.hpp index e934eb56eb..aecd96ae37 100644 --- a/cpp/include/cuvs/util/cutlass_utils.hpp +++ b/cpp/include/cuvs/util/cutlass_utils.hpp @@ -4,9 +4,10 @@ */ #pragma once +#include #include -namespace cuvs { +namespace CUVS_EXPORT cuvs { /** * @brief Exception thrown when a CUTLASS error is encountered. @@ -16,4 +17,4 @@ struct cutlass_error : public raft::exception { explicit cutlass_error(std::string const& message) : raft::exception(message) {} }; -} // namespace cuvs +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/util/file_io.hpp b/cpp/include/cuvs/util/file_io.hpp index f6053e69f8..5ad86d41a6 100644 --- a/cpp/include/cuvs/util/file_io.hpp +++ b/cpp/include/cuvs/util/file_io.hpp @@ -19,11 +19,13 @@ #include #include +#include #include #include #include -namespace cuvs::util { +namespace CUVS_EXPORT cuvs { +namespace util { /** * @brief Streambuf that reads from a POSIX file descriptor */ @@ -294,4 +296,5 @@ class buffered_ofstream { size_t pos_; }; -} // namespace cuvs::util +} // namespace util +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/include/cuvs/util/host_memory.hpp b/cpp/include/cuvs/util/host_memory.hpp index 7ca9da1687..06e253c1db 100644 --- a/cpp/include/cuvs/util/host_memory.hpp +++ b/cpp/include/cuvs/util/host_memory.hpp @@ -1,15 +1,17 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ #pragma once #include +#include #include #include -namespace cuvs::util { +namespace CUVS_EXPORT cuvs { +namespace util { /** * @brief Get available host memory from /proc/meminfo @@ -22,4 +24,5 @@ namespace cuvs::util { */ size_t get_free_host_memory(); -} // namespace cuvs::util +} // namespace util +} // namespace CUVS_EXPORT cuvs diff --git a/cpp/src/distance/kde.cu b/cpp/src/distance/kde.cu index b9989bffec..dc66c808b3 100644 --- a/cpp/src/distance/kde.cu +++ b/cpp/src/distance/kde.cu @@ -3,6 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ +#include #include #include @@ -657,7 +658,7 @@ void kde(raft::resources const& handle, } // Explicit instantiations -template void kde( +template CUVS_EXPORT void kde( raft::resources const&, raft::device_matrix_view, raft::device_matrix_view, @@ -669,7 +670,7 @@ template void kde( cuvs::distance::DistanceType, float); -template void kde( +template CUVS_EXPORT void kde( raft::resources const&, raft::device_matrix_view, raft::device_matrix_view, diff --git a/cpp/src/neighbors/epsilon_neighborhood.cu b/cpp/src/neighbors/epsilon_neighborhood.cu index c8e52da564..d05dc21d20 100644 --- a/cpp/src/neighbors/epsilon_neighborhood.cu +++ b/cpp/src/neighbors/epsilon_neighborhood.cu @@ -1,9 +1,10 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ #include "detail/epsilon_neighborhood.cuh" +#include #include #include @@ -49,7 +50,7 @@ void compute(raft::resources const& handle, } // Explicit template instantiations -template void compute( +template CUVS_EXPORT void compute( raft::resources const& handle, raft::device_matrix_view x, raft::device_matrix_view y, @@ -58,7 +59,7 @@ template void compute( float eps, cuvs::distance::DistanceType metric); -template void compute( +template CUVS_EXPORT void compute( raft::resources const& handle, raft::device_matrix_view x, raft::device_matrix_view y, @@ -67,7 +68,7 @@ template void compute( float eps, cuvs::distance::DistanceType metric); -template void compute( +template CUVS_EXPORT void compute( raft::resources const& handle, raft::device_matrix_view x, raft::device_matrix_view y, @@ -76,7 +77,7 @@ template void compute( double eps, cuvs::distance::DistanceType metric); -template void compute( +template CUVS_EXPORT void compute( raft::resources const& handle, raft::device_matrix_view x, raft::device_matrix_view y, diff --git a/cpp/src/neighbors/ivf_flat_index.cpp b/cpp/src/neighbors/ivf_flat_index.cpp index 77b24d4690..82e7f142bf 100644 --- a/cpp/src/neighbors/ivf_flat_index.cpp +++ b/cpp/src/neighbors/ivf_flat_index.cpp @@ -1,8 +1,9 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2024, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION. * SPDX-License-Identifier: Apache-2.0 */ +#include #include namespace cuvs::neighbors::ivf_flat { @@ -215,10 +216,10 @@ void index::check_consistency() "inconsistent number of lists (clusters)"); } -template struct index; // Used for refine function -template struct index; -template struct index; -template struct index; -template struct index; +template struct CUVS_EXPORT index; // Used for refine function +template struct CUVS_EXPORT index; +template struct CUVS_EXPORT index; +template struct CUVS_EXPORT index; +template struct CUVS_EXPORT index; } // namespace cuvs::neighbors::ivf_flat