@@ -154,9 +154,11 @@ quantizer<MathT> build(
154154 pq_code_book = cuvs::neighbors::detail::train_pq<MathT>(
155155 res, vpq_params, dataset, raft::make_const_mdspan (vq_code_book.view ()));
156156 }
157+ std::optional<raft::device_matrix<MathT, uint32_t , raft::row_major>> vq_code_book_opt;
158+ if (filled_params.use_vq ) { vq_code_book_opt = std::move (vq_code_book); }
157159 return {filled_params,
158160 vpq_codebooks<MathT>{std::make_unique<vpq_codebooks_owning<MathT>>(
159- std::move (vq_code_book ), std::move (pq_code_book ))}};
161+ std::move (pq_code_book ), std::move (vq_code_book_opt ))}};
160162}
161163
162164template <typename MathT>
@@ -195,12 +197,9 @@ quantizer<MathT> build_view(
195197 vq_centers.value ().extent (0 ));
196198 }
197199
198- auto vq_view =
199- vq_centers.has_value ()
200- ? vq_centers.value ()
201- : raft::make_device_matrix_view<const MathT, uint32_t , raft::row_major>(nullptr , 0 , 0 );
202- return {params,
203- vpq_codebooks<MathT>{std::make_unique<vpq_codebooks_view<MathT>>(vq_view, pq_centers)}};
200+ return {
201+ params,
202+ vpq_codebooks<MathT>{std::make_unique<vpq_codebooks_view<MathT>>(pq_centers, vq_centers)}};
204203}
205204
206205template <typename T, typename QuantI, typename AccessorType>
@@ -223,7 +222,9 @@ void transform(
223222 RAFT_EXPECTS (quantizer.params_quantizer .pq_bits >= 4 && quantizer.params_quantizer .pq_bits <= 16 ,
224223 " PQ bits must be within [4, 16]" );
225224
226- auto vq_centers = quantizer.codebooks .vq_code_book ();
225+ auto vq_centers_opt = quantizer.codebooks .vq_code_book ();
226+ auto vq_centers = vq_centers_opt.value_or (
227+ raft::make_device_matrix_view<const T, uint32_t , raft::row_major>(nullptr , 0 , 0 ));
227228 auto pq_centers = quantizer.codebooks .pq_code_book ();
228229 auto vq_labels_view = raft::make_device_vector_view<uint32_t , int64_t >(nullptr , 0 );
229230 if (vq_labels.has_value ()) { vq_labels_view = vq_labels.value (); }
@@ -360,11 +361,14 @@ void inverse_transform(
360361 RAFT_EXPECTS (quantizer.params_quantizer .pq_bits >= 4 && quantizer.params_quantizer .pq_bits <= 16 ,
361362 " PQ bits must be within [4, 16]" );
362363
364+ auto vq_centers_opt = quantizer.codebooks .vq_code_book ();
365+ auto vq_centers = vq_centers_opt.value_or (
366+ raft::make_device_matrix_view<const T, uint32_t , raft::row_major>(nullptr , 0 , 0 ));
363367 reconstruct_vectors<T, T, idx_t , label_t >(res,
364368 quantizer.params_quantizer ,
365369 codes,
366370 quantizer.codebooks .pq_code_book (),
367- quantizer. codebooks . vq_code_book () ,
371+ vq_centers ,
368372 vq_labels,
369373 out,
370374 quantizer.params_quantizer .use_subspaces );
@@ -374,21 +378,26 @@ template <typename NewMathT, typename OldMathT>
374378auto vpq_convert_math_type (const raft::resources& res, const vpq_codebooks<OldMathT>& src)
375379 -> vpq_codebooks<NewMathT>
376380{
377- auto vq_src = src.vq_code_book ();
378- auto pq_src = src.pq_code_book ();
381+ auto vq_src_opt = src.vq_code_book ();
382+ auto pq_src = src.pq_code_book ();
379383
380- auto vq_new = raft::make_device_matrix<NewMathT, uint32_t , raft::row_major>(
381- res, vq_src.extent (0 ), vq_src.extent (1 ));
382384 auto pq_new = raft::make_device_matrix<NewMathT, uint32_t , raft::row_major>(
383385 res, pq_src.extent (0 ), pq_src.extent (1 ));
384-
385- raft::linalg::map (
386- res, vq_new.view (), cuvs::spatial::knn::detail::utils::mapping<NewMathT>{}, vq_src);
387386 raft::linalg::map (
388387 res, pq_new.view (), cuvs::spatial::knn::detail::utils::mapping<NewMathT>{}, pq_src);
389388
389+ std::optional<raft::device_matrix<NewMathT, uint32_t , raft::row_major>> vq_new_opt;
390+ if (vq_src_opt.has_value ()) {
391+ auto vq_src = vq_src_opt.value ();
392+ auto vq_new = raft::make_device_matrix<NewMathT, uint32_t , raft::row_major>(
393+ res, vq_src.extent (0 ), vq_src.extent (1 ));
394+ raft::linalg::map (
395+ res, vq_new.view (), cuvs::spatial::knn::detail::utils::mapping<NewMathT>{}, vq_src);
396+ vq_new_opt = std::move (vq_new);
397+ }
398+
390399 return vpq_codebooks<NewMathT>{
391- std::make_unique<vpq_codebooks_owning<NewMathT>>(std::move (vq_new ), std::move (pq_new ))};
400+ std::make_unique<vpq_codebooks_owning<NewMathT>>(std::move (pq_new ), std::move (vq_new_opt ))};
392401}
393402
394403template <typename DatasetT, typename MathT, typename IdxT>
@@ -419,8 +428,8 @@ auto vpq_build(const raft::resources& res,
419428 true );
420429
421430 return vpq_dataset<MathT, IdxT>{
422- vpq_codebooks<MathT>{std::make_unique<vpq_codebooks_owning<MathT>>(std::move (vq_code_book ),
423- std::move (pq_code_book ))},
431+ vpq_codebooks<MathT>{std::make_unique<vpq_codebooks_owning<MathT>>(std::move (pq_code_book ),
432+ std::move (vq_code_book ))},
424433 std::move (codes)};
425434}
426435
0 commit comments