@@ -3494,9 +3494,9 @@ struct merge_params {
34943494
34953495/* * @brief Merge multiple physical CAGRA indices into one.
34963496 *
3497- * The overload without `merge_params` uses `merge_algo::AUTO`. AUTO runs Fastener only after a
3498- * non-mutating preflight validates every input and option; otherwise it calls the existing rebuild
3499- * implementation. REBUILD always preserves every input dataset.
3497+ * `merge_params` selects the algorithm and defaults to `merge_algo::AUTO`. AUTO runs Fastener only
3498+ * after a non-mutating preflight validates every input and option; otherwise it calls the existing
3499+ * rebuild implementation. REBUILD always preserves every input dataset.
35003500 *
35013501 * Fastener supports unfiltered, uncompressed `float`, `half`, `int8_t`, and `uint8_t`
35023502 * indices using L2Expanded and `uint32_t` graph IDs. Fastener uses `root_fanout` at the first
@@ -3510,40 +3510,91 @@ struct merge_params {
35103510 * which holds only a view of it.
35113511 *
35123512 * @note This API only supports physical merge (`merge_strategy = MERGE_STRATEGY_PHYSICAL`).
3513- * All input indices must use the same `DatasetViewT` (dense padded or standard device views),
3514- * and must share one row stride.
3513+ * All input indices must use the same dataset layout (device padded or device standard), and must
3514+ * share one row stride.
35153515 *
35163516 * @param[in] res RAFT resources used for the merge.
35173517 * @param[in] params Parameters for the returned CAGRA index.
35183518 * @param[in] indices CAGRA indices to merge.
35193519 * @param[in] merged_dataset Caller-owned storage for the consolidated dataset. Must have one row
35203520 * per retained vector after applying `row_filter`, and the same dimension and stride as the input
35213521 * datasets.
3522+ * @param[in] merge_params Parameters for the merge, including the algorithm selection.
35223523 * @param[in] row_filter Optional row filter. Any filter selects rebuild in AUTO and is rejected by
35233524 * explicit FASTENER.
35243525 * @return The merged physical CAGRA index.
35253526 */
3526- template <typename T, typename IdxT, cuvs::neighbors::ann_dataset_view DatasetViewT>
35273527auto merge (raft::resources const & res,
35283528 const cuvs::neighbors::cagra::index_params& params,
3529- std::vector<cuvs::neighbors::cagra::index<T, IdxT, DatasetViewT>*>& indices,
3530- DatasetViewT merged_dataset,
3529+ std::vector<cuvs::neighbors::cagra::device_padded_index<float , uint32_t >*>& indices,
3530+ cuvs::neighbors::device_padded_dataset_view<float , int64_t > merged_dataset,
3531+ const cuvs::neighbors::cagra::merge_params& merge_params = {},
35313532 const cuvs::neighbors::filtering::base_filter& row_filter =
35323533 cuvs::neighbors::filtering::none_sample_filter{})
3533- -> cuvs::neighbors::cagra::index<T, IdxT, DatasetViewT>;
3534+ -> cuvs::neighbors::cagra::device_padded_index<float, uint32_t>;
3535+
3536+ auto merge (raft::resources const & res,
3537+ const cuvs::neighbors::cagra::index_params& params,
3538+ std::vector<cuvs::neighbors::cagra::device_standard_index<float , uint32_t >*>& indices,
3539+ cuvs::neighbors::device_standard_dataset_view<float , int64_t > merged_dataset,
3540+ const cuvs::neighbors::cagra::merge_params& merge_params = {},
3541+ const cuvs::neighbors::filtering::base_filter& row_filter =
3542+ cuvs::neighbors::filtering::none_sample_filter{})
3543+ -> cuvs::neighbors::cagra::device_standard_index<float, uint32_t>;
3544+
3545+ auto merge (raft::resources const & res,
3546+ const cuvs::neighbors::cagra::index_params& params,
3547+ std::vector<cuvs::neighbors::cagra::device_padded_index<half, uint32_t >*>& indices,
3548+ cuvs::neighbors::device_padded_dataset_view<half, int64_t > merged_dataset,
3549+ const cuvs::neighbors::cagra::merge_params& merge_params = {},
3550+ const cuvs::neighbors::filtering::base_filter& row_filter =
3551+ cuvs::neighbors::filtering::none_sample_filter{})
3552+ -> cuvs::neighbors::cagra::device_padded_index<half, uint32_t>;
3553+
3554+ auto merge (raft::resources const & res,
3555+ const cuvs::neighbors::cagra::index_params& params,
3556+ std::vector<cuvs::neighbors::cagra::device_standard_index<half, uint32_t >*>& indices,
3557+ cuvs::neighbors::device_standard_dataset_view<half, int64_t > merged_dataset,
3558+ const cuvs::neighbors::cagra::merge_params& merge_params = {},
3559+ const cuvs::neighbors::filtering::base_filter& row_filter =
3560+ cuvs::neighbors::filtering::none_sample_filter{})
3561+ -> cuvs::neighbors::cagra::device_standard_index<half, uint32_t>;
3562+
3563+ auto merge (raft::resources const & res,
3564+ const cuvs::neighbors::cagra::index_params& params,
3565+ std::vector<cuvs::neighbors::cagra::device_padded_index<int8_t , uint32_t >*>& indices,
3566+ cuvs::neighbors::device_padded_dataset_view<int8_t , int64_t > merged_dataset,
3567+ const cuvs::neighbors::cagra::merge_params& merge_params = {},
3568+ const cuvs::neighbors::filtering::base_filter& row_filter =
3569+ cuvs::neighbors::filtering::none_sample_filter{})
3570+ -> cuvs::neighbors::cagra::device_padded_index<int8_t, uint32_t>;
35343571
3535- /* * @copydoc merge
3536- * @param[in] merge_params Parameters for the merge, including the algorithm selection.
3537- */
3538- template <typename T, typename IdxT, cuvs::neighbors::ann_dataset_view DatasetViewT>
35393572auto merge (raft::resources const & res,
35403573 const cuvs::neighbors::cagra::index_params& params,
3541- std::vector<cuvs::neighbors::cagra::index<T, IdxT, DatasetViewT >*>& indices,
3542- DatasetViewT merged_dataset,
3543- const cuvs::neighbors::cagra::merge_params& merge_params,
3574+ std::vector<cuvs::neighbors::cagra::device_standard_index< int8_t , uint32_t >*>& indices,
3575+ cuvs::neighbors::device_standard_dataset_view< int8_t , int64_t > merged_dataset,
3576+ const cuvs::neighbors::cagra::merge_params& merge_params = {} ,
35443577 const cuvs::neighbors::filtering::base_filter& row_filter =
35453578 cuvs::neighbors::filtering::none_sample_filter{})
3546- -> cuvs::neighbors::cagra::index<T, IdxT, DatasetViewT>;
3579+ -> cuvs::neighbors::cagra::device_standard_index<int8_t, uint32_t>;
3580+
3581+ auto merge (raft::resources const & res,
3582+ const cuvs::neighbors::cagra::index_params& params,
3583+ std::vector<cuvs::neighbors::cagra::device_padded_index<uint8_t , uint32_t >*>& indices,
3584+ cuvs::neighbors::device_padded_dataset_view<uint8_t , int64_t > merged_dataset,
3585+ const cuvs::neighbors::cagra::merge_params& merge_params = {},
3586+ const cuvs::neighbors::filtering::base_filter& row_filter =
3587+ cuvs::neighbors::filtering::none_sample_filter{})
3588+ -> cuvs::neighbors::cagra::device_padded_index<uint8_t, uint32_t>;
3589+
3590+ auto merge (raft::resources const & res,
3591+ const cuvs::neighbors::cagra::index_params& params,
3592+ std::vector<cuvs::neighbors::cagra::device_standard_index<uint8_t , uint32_t >*>& indices,
3593+ cuvs::neighbors::device_standard_dataset_view<uint8_t , int64_t > merged_dataset,
3594+ const cuvs::neighbors::cagra::merge_params& merge_params = {},
3595+ const cuvs::neighbors::filtering::base_filter& row_filter =
3596+ cuvs::neighbors::filtering::none_sample_filter{})
3597+ -> cuvs::neighbors::cagra::device_standard_index<uint8_t, uint32_t>;
35473598
35483599/* *
35493600 * @}
@@ -4388,23 +4439,56 @@ void serialize(const raft::resources& clique,
43884439 * cuvs::neighbors::cagra::serialize(clique, index, filename);
43894440 * cuvs::neighbors::mg_index<cagra::device_standard_index<float, uint32_t>, float, uint32_t>
43904441 * new_index(clique, REPLICATED);
4391- * cuvs::neighbors::cagra::deserialize<float, uint32_t> (clique, filename, &new_index);
4442+ * cuvs::neighbors::cagra::deserialize(clique, filename, &new_index);
43924443 *
43934444 * @endcode
43944445 *
43954446 * @param[in] clique a `raft::resources` object specifying the NCCL clique configuration
43964447 * @param[in] filename path to the file to be deserialized
43974448 *
43984449 */
4399- template < typename T, typename IdxT>
4400- void deserialize ( const raft::resources& clique,
4401- const std::string& filename,
4402- cuvs::neighbors::mg_index<cagra::device_standard_index<T, IdxT >, T, IdxT >* index);
4450+ void deserialize (
4451+ const raft::resources& clique,
4452+ const std::string& filename,
4453+ cuvs::neighbors::mg_index<cagra::device_padded_index< float , uint32_t >, float , uint32_t >* index);
44034454
4404- template <typename T, typename IdxT>
4405- void deserialize (const raft::resources& clique,
4406- const std::string& filename,
4407- cuvs::neighbors::mg_index<cagra::device_padded_index<T, IdxT>, T, IdxT>* index);
4455+ void deserialize (
4456+ const raft::resources& clique,
4457+ const std::string& filename,
4458+ cuvs::neighbors::mg_index<cagra::device_standard_index<float , uint32_t >, float , uint32_t >* index);
4459+
4460+ void deserialize (
4461+ const raft::resources& clique,
4462+ const std::string& filename,
4463+ cuvs::neighbors::mg_index<cagra::device_padded_index<half, uint32_t >, half, uint32_t >* index);
4464+
4465+ void deserialize (
4466+ const raft::resources& clique,
4467+ const std::string& filename,
4468+ cuvs::neighbors::mg_index<cagra::device_standard_index<half, uint32_t >, half, uint32_t >* index);
4469+
4470+ void deserialize (
4471+ const raft::resources& clique,
4472+ const std::string& filename,
4473+ cuvs::neighbors::mg_index<cagra::device_padded_index<int8_t , uint32_t >, int8_t , uint32_t >* index);
4474+
4475+ void deserialize (
4476+ const raft::resources& clique,
4477+ const std::string& filename,
4478+ cuvs::neighbors::mg_index<cagra::device_standard_index<int8_t , uint32_t >, int8_t , uint32_t >*
4479+ index);
4480+
4481+ void deserialize (
4482+ const raft::resources& clique,
4483+ const std::string& filename,
4484+ cuvs::neighbors::mg_index<cagra::device_padded_index<uint8_t , uint32_t >, uint8_t , uint32_t >*
4485+ index);
4486+
4487+ void deserialize (
4488+ const raft::resources& clique,
4489+ const std::string& filename,
4490+ cuvs::neighbors::mg_index<cagra::device_standard_index<uint8_t , uint32_t >, uint8_t , uint32_t >*
4491+ index);
44084492
44094493// / \defgroup mg_cpp_distribute ANN MG local index distribution
44104494
@@ -4422,23 +4506,56 @@ void deserialize(const raft::resources& clique,
44224506 * cuvs::neighbors::cagra::serialize(clique, filename, index);
44234507 * cuvs::neighbors::mg_index<cagra::device_standard_index<float, uint32_t>, float, uint32_t>
44244508 * distributed_index(clique, REPLICATED);
4425- * cuvs::neighbors::cagra::distribute<float, uint32_t> (clique, filename, &distributed_index);
4509+ * cuvs::neighbors::cagra::distribute(clique, filename, &distributed_index);
44264510 *
44274511 * @endcode
44284512 *
44294513 * @param[in] clique a `raft::resources` object specifying the NCCL clique configuration
44304514 * @param[in] filename path to the file to be deserialized : a local index
44314515 *
44324516 */
4433- template < typename T, typename IdxT>
4434- void distribute ( const raft::resources& clique,
4435- const std::string& filename,
4436- cuvs::neighbors::mg_index<cagra::device_standard_index<T, IdxT >, T, IdxT >* index);
4517+ void distribute (
4518+ const raft::resources& clique,
4519+ const std::string& filename,
4520+ cuvs::neighbors::mg_index<cagra::device_padded_index< float , uint32_t >, float , uint32_t >* index);
44374521
4438- template <typename T, typename IdxT>
4439- void distribute (const raft::resources& clique,
4440- const std::string& filename,
4441- cuvs::neighbors::mg_index<cagra::device_padded_index<T, IdxT>, T, IdxT>* index);
4522+ void distribute (
4523+ const raft::resources& clique,
4524+ const std::string& filename,
4525+ cuvs::neighbors::mg_index<cagra::device_standard_index<float , uint32_t >, float , uint32_t >* index);
4526+
4527+ void distribute (
4528+ const raft::resources& clique,
4529+ const std::string& filename,
4530+ cuvs::neighbors::mg_index<cagra::device_padded_index<half, uint32_t >, half, uint32_t >* index);
4531+
4532+ void distribute (
4533+ const raft::resources& clique,
4534+ const std::string& filename,
4535+ cuvs::neighbors::mg_index<cagra::device_standard_index<half, uint32_t >, half, uint32_t >* index);
4536+
4537+ void distribute (
4538+ const raft::resources& clique,
4539+ const std::string& filename,
4540+ cuvs::neighbors::mg_index<cagra::device_padded_index<int8_t , uint32_t >, int8_t , uint32_t >* index);
4541+
4542+ void distribute (
4543+ const raft::resources& clique,
4544+ const std::string& filename,
4545+ cuvs::neighbors::mg_index<cagra::device_standard_index<int8_t , uint32_t >, int8_t , uint32_t >*
4546+ index);
4547+
4548+ void distribute (
4549+ const raft::resources& clique,
4550+ const std::string& filename,
4551+ cuvs::neighbors::mg_index<cagra::device_padded_index<uint8_t , uint32_t >, uint8_t , uint32_t >*
4552+ index);
4553+
4554+ void distribute (
4555+ const raft::resources& clique,
4556+ const std::string& filename,
4557+ cuvs::neighbors::mg_index<cagra::device_standard_index<uint8_t , uint32_t >, uint8_t , uint32_t >*
4558+ index);
44424559
44434560/* *
44444561 * @brief Build a kNN graph using IVF-PQ.
0 commit comments