Skip to content

Commit 449f802

Browse files
committed
refactor(disk): consume in-crate pipnn module
Forward the disk feature to diskann/pipnn instead of depending on a separate crate. Consolidate duplicate pipeline builds and name adapter tests by the behavior they protect.
1 parent 6c832e5 commit 449f802

6 files changed

Lines changed: 12 additions & 45 deletions

File tree

Cargo.lock

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

diskann-disk/Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ vfs = { workspace = true }
4343

4444
# Optional dependencies
4545
opentelemetry = { workspace = true, optional = true }
46-
diskann-pipnn = { workspace = true, optional = true }
4746

4847
[target.'cfg(target_os = "linux")'.dependencies]
4948
io-uring = "0.6.4"
@@ -84,7 +83,7 @@ proptest.workspace = true
8483
[features]
8584
default = []
8685
perf_test = ["dep:opentelemetry"]
87-
pipnn = ["dep:diskann-pipnn"]
86+
pipnn = ["diskann/pipnn"]
8887
virtual_storage = ["diskann-providers/virtual_storage"]
8988
experimental_diversity_search = [
9089
"diskann/experimental_diversity_search",

diskann-disk/src/build/builder/build/pipnn.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
//! 5. serialize adjacency with the same header/layout used by Vamana.
1616
//!
1717
//! ```text
18-
//! dataset file ──> metadata check ──> MatrixView ──> diskann-pipnn ──> adjacency
18+
//! dataset file ──> metadata check ──> MatrixView ──> diskann::graph::pipnn ──> adjacency
1919
//! │ │
2020
//! └──────────────────> sampled medoid ────────────────────────────┤
2121
//! v
@@ -25,8 +25,8 @@
2525
//! There is no PiPNN-specific disk graph format. Keeping serialization here means
2626
//! search and loading cannot distinguish which builder produced the graph.
2727
28+
use diskann::graph::pipnn::{PiPNNBuildContext, PiPNNConfig};
2829
use diskann::{utils::VectorRepr, ANNError, ANNResult};
29-
use diskann_pipnn::{PiPNNBuildContext, PiPNNConfig};
3030
use diskann_providers::{
3131
storage::{save_adjacency_graph, StorageReadProvider, StorageWriteProvider},
3232
utils::{find_medoid_with_sampling, RayonThreadPoolRef, MAX_MEDOID_SAMPLE_SIZE},
@@ -76,7 +76,7 @@ where
7676
builder.index_configuration.dist_metric,
7777
pool.as_rayon(),
7878
)?;
79-
let adjacency = diskann_pipnn::build_graph(data.as_view(), &context)?;
79+
let adjacency = diskann::graph::pipnn::build_graph(data.as_view(), &context)?;
8080

8181
// Start-node policy belongs to the persisted index, not the core graph
8282
// constructor. Reuse the production sampled medoid implementation so the

diskann-disk/src/build/builder/build/pipnn/tests.rs

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ fn builder<'a>(
8888
}
8989

9090
#[test]
91-
fn pipnn_disk_build_rejects_configuration_dataset_mismatch() {
91+
fn disk_build_rejects_dataset_shape_mismatch() {
9292
let storage = VirtualStorageProvider::new_memory();
9393
write_data(&storage, 2, 8);
9494
let params = DiskIndexBuildParameters::new_pipnn(
@@ -107,7 +107,7 @@ fn pipnn_disk_build_rejects_configuration_dataset_mismatch() {
107107
}
108108

109109
#[test]
110-
fn pipnn_graph_adapter_rejects_point_count_mismatch() {
110+
fn graph_adapter_rejects_point_count_mismatch() {
111111
let storage = VirtualStorageProvider::new_memory();
112112
write_data(&storage, 2, 8);
113113
let parameters = pipnn();
@@ -120,20 +120,7 @@ fn pipnn_graph_adapter_rejects_point_count_mismatch() {
120120
}
121121

122122
#[test]
123-
fn pipnn_disk_build_uses_common_pipeline() {
124-
let storage = VirtualStorageProvider::new_memory();
125-
let (points, dimensions) = (256, 8);
126-
write_data(&storage, points, dimensions);
127-
let mut builder = builder(&storage, points, dimensions, 1.0, 1.2, pipnn());
128-
129-
builder.build().unwrap();
130-
131-
assert!(storage.exists(&get_disk_index_file("/index")));
132-
assert!(storage.exists("/index_pq_compressed.bin"));
133-
}
134-
135-
#[test]
136-
fn pipnn_graph_adapter_writes_real_point_header() {
123+
fn graph_adapter_writes_degree_medoid_and_frozen_count() {
137124
let storage = VirtualStorageProvider::new_memory();
138125
let (points, dimensions) = (256, 8);
139126
write_data(&storage, points, dimensions);
@@ -157,7 +144,7 @@ fn pipnn_graph_adapter_writes_real_point_header() {
157144
}
158145

159146
#[test]
160-
fn explicit_pipnn_selection_is_not_replaced_by_memory_budget() {
147+
fn explicit_selection_ignores_the_vamana_memory_strategy() {
161148
let storage = VirtualStorageProvider::new_memory();
162149
let (points, dimensions) = (256, 8);
163150
write_data(&storage, points, dimensions);
@@ -176,10 +163,11 @@ fn explicit_pipnn_selection_is_not_replaced_by_memory_budget() {
176163
assert_eq!(builder.index_configuration.config.alpha(), 1.3);
177164
builder.build().unwrap();
178165
assert!(storage.exists(&get_disk_index_file("/index")));
166+
assert!(storage.exists("/index_pq_compressed.bin"));
179167
}
180168

181169
#[test]
182-
fn pipnn_disk_build_rejects_invalid_config() {
170+
fn builder_rejects_invalid_pipnn_config() {
183171
let storage = VirtualStorageProvider::new_memory();
184172
let invalid = PiPNNParameters {
185173
c_max: 0,

diskann-disk/src/build/configuration/build_algorithm.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ impl Default for PiPNNParameters {
4646
}
4747

4848
#[cfg(feature = "pipnn")]
49-
impl From<&PiPNNParameters> for diskann_pipnn::PiPNNConfig {
49+
impl From<&PiPNNParameters> for diskann::graph::pipnn::PiPNNConfig {
5050
fn from(config: &PiPNNParameters) -> Self {
5151
Self {
5252
c_max: config.c_max,

diskann-disk/src/build/configuration/disk_index_build_parameter.rs

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ impl DiskIndexBuildParameters {
196196
}
197197

198198
#[cfg(feature = "pipnn")]
199-
pub(crate) fn pipnn_config(&self) -> Option<diskann_pipnn::PiPNNConfig> {
199+
pub(crate) fn pipnn_config(&self) -> Option<diskann::graph::pipnn::PiPNNConfig> {
200200
match &self.build_algorithm {
201201
BuildAlgorithm::PiPNN(config) => Some(config.into()),
202202
BuildAlgorithm::Vamana => None,
@@ -284,23 +284,4 @@ mod dataset_test {
284284
let chunks = NumPQChunks::new_with(64, 128).unwrap();
285285
assert_eq!(chunks.get(), 64);
286286
}
287-
288-
#[cfg(feature = "pipnn")]
289-
#[test]
290-
fn new_pipnn_uses_the_common_disk_pipeline_parameters() {
291-
let pq = NumPQChunks::new_with(1, 128).unwrap();
292-
let parameters = PiPNNParameters::default();
293-
let config = diskann_pipnn::PiPNNConfig::from(&parameters);
294-
let budget = MemoryBudget::try_from_gb(2.0).unwrap();
295-
let params = DiskIndexBuildParameters::new_pipnn(budget, pq, parameters);
296-
297-
assert_eq!(params.pipnn_config(), Some(config));
298-
assert_eq!(params.build_memory_limit(), budget);
299-
assert_eq!(params.search_pq_chunks(), pq);
300-
assert_eq!(
301-
params.data_compression_chunk_vector_count(),
302-
DEFAULT_DATA_COMPRESSION_CHUNK_VECTOR_COUNT
303-
);
304-
assert!(matches!(params.build_algorithm(), BuildAlgorithm::PiPNN(_)));
305-
}
306287
}

0 commit comments

Comments
 (0)