Skip to content

Reuse raft::mdarray/mdspan directly in dense dataset storage - #2530

Open
HowardHuang1 wants to merge 4 commits into
NVIDIA:mainfrom
HowardHuang1:hh-abstract-common-dataset-functions-one-level-up-and-reuse-mdarray-26_10
Open

Reuse raft::mdarray/mdspan directly in dense dataset storage#2530
HowardHuang1 wants to merge 4 commits into
NVIDIA:mainfrom
HowardHuang1:hh-abstract-common-dataset-functions-one-level-up-and-reuse-mdarray-26_10

Conversation

@HowardHuang1

@HowardHuang1 HowardHuang1 commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

Addresses #2395.

dense_owning_matrix/dense_view_matrix (and the VPQ codebook/code matrix aliases) picked between raft::device_matrix and raft::host_matrix via std::conditional_t, even though those are themselves just aliases for raft::mdarray/raft::mdspan with the exact accessor already computed as Accessor. Point the aliases at raft::mdarray/raft::mdspan directly instead.

dense_row_major_dataset_owning_storage/_view_storage also wrapped their matrix/view as a field and hand-forwarded view()/data_handle(), which raft::mdarray/raft::mdspan already provide natively. They now inherit from the matrix/view type instead, so those forwards are no longer needed.

…2395)

dense_owning_matrix/dense_view_matrix (and the VPQ codebook/code matrix
aliases) picked between raft::device_matrix and raft::host_matrix via
std::conditional_t, even though those are themselves just aliases for
raft::mdarray/raft::mdspan with the exact accessor already computed as
Accessor. Point the aliases at raft::mdarray/raft::mdspan directly instead.

dense_row_major_dataset_owning_storage/_view_storage also wrapped their
matrix/view as a field and hand-forwarded view()/data_handle(), which
raft::mdarray/raft::mdspan already provide natively. They now inherit from
the matrix/view type instead, so those forwards are no longer needed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@HowardHuang1
HowardHuang1 requested a review from a team as a code owner August 30, 2026 23:52
@copy-pr-bot

copy-pr-bot Bot commented Aug 30, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

HowardHuang1 and others added 3 commits September 2, 2026 08:21
…dataset-functions-one-level-up-and-reuse-mdarray-26_10
as_dataset_view()/n_rows()/dim() can be shared across all dataset
kinds with zero per-kind dispatch inside dataset/dataset_view
themselves. Adds cuvs::neighbors::experimental::{dataset,dataset_view}
as a Spec/policy-based prototype: every member is a one-line forward
to spec_type::get_*(), with all kind-specific logic (empty_spec,
mdarray_spec, vpq_spec) living outside dataset/dataset_view, which
never name or branch on a concrete kind. dataset and dataset_view
stay two independent, non-inheriting types (no shared_ptr, no
"sometimes owning" object).

Purely additive: lives in its own namespace, not referenced by any
existing type, alias, or call site. Verified via a standalone sandbox
(all three specs, both dataset and dataset_view, asserting n_rows/dim/
as_dataset_view) and a full rebuild + DATASET_C_TEST (7/7) +
CAGRA_C_TEST (14/14) + PREPROCESSING_TEST (226/226) + NEIGHBORS_TEST
(339/339), all passing unchanged from before this commit.

Limitations / not yet done:
- Not wired up: the real dataset/dataset_view types (Container-tagged)
  and every downstream consumer (CAGRA build/search, serialization,
  the C API, compile-time classification traits like
  dataset_view_kind_of/is_padded_dataset_view_v) are untouched. This
  prototype does not replace them yet.
- mdarray_spec's layout choice for the padded case is unverified
  against CAGRA's actual alignment requirements -- needs confirmation
  before real use.
- No sparse (CSR/COO) or scalar-quantized specs; only empty/dense/vpq,
  matching today's four kinds minus the empty/dense split.
- This design is still an open thread with the team, not finalized;
  land as prototype only, pending further review.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…VIDIA#2395)

common.hpp's dataset<ContainerType,DataT,IdxT,Accessor>/dataset_view<...>
(four hand-specialized structs tagged by ContainerType) are replaced by
dataset<T,IdxT,SpecT>/dataset_view<T,IdxT,SpecT>: two independent,
non-inheriting types where every member is a one-line forward to a
per-kind Spec (empty_dataset_spec, padded_dataset_spec,
standard_dataset_spec, vpq_dataset_spec) -- no dispatch inside
dataset/dataset_view themselves. VPQ's codebooks move from three flat,
ungrouped matrices (vq_code_book, pq_code_book, data as direct members)
into a dictionary_type{vq_code_book, pq_code_book} bundle alongside data,
giving every kind the same shape (one data slot + one optional
dictionary slot). The old dataset_view -> owner back-pointer (.dset())
is removed; a VPQ view now holds its own dictionary_view() directly,
matching padded/standard views holding their own state.

Public aliases (device_padded_dataset<T,IdxT> etc.) keep their names and
2-arg construction signatures, so most call sites are unaffected. Call
sites that reached into dataset internals directly needed updating:
.view()/.stride() on a dataset or dataset_view -> .data_view(); raw
.vq_code_book/.pq_code_book/.data member access -> .dictionary_view()/
.data_view(); old 3-arg VPQ construction -> 2-arg (codes,
dictionary_type{vq,pq}). Touches CAGRA build/search/serialize/merge,
VPQ training (pq.cuh), SCANN, Vamana, HNSW export, multi-GPU CAGRA, and
the C API's product-quantizer codebook accessors (pq.cpp) -- the one
place the C API reaches into dataset internals rather than going through
the opaque cuvsDataset handle.

Also: removes detail::vpq_dataset_spec_impl (only empty/padded/standard/
vpq_dataset_spec exist as public specs; padded and standard share
dense_dataset_spec_impl since two tags need the same body, but VPQ had
no second tag to share with, so its body is now inlined directly into
vpq_dataset_spec, consistent with how empty_dataset_spec is already
written).

Verified: full rebuild clean; DATASET_C_TEST (7/7), CAGRA_C_TEST (14/14),
PREPROCESSING_TEST (226/226), NEIGHBORS_TEST (339/339) all pass.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@HowardHuang1
HowardHuang1 requested a review from a team as a code owner September 4, 2026 23:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant