diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 5b7a192fcf..0f1d6b7842 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -93,6 +93,13 @@ repos:
pass_filenames: false
files: rust/.*
language: rust
+ - id: spotless-fmt
+ name: spotless-fmt
+ entry: ci/checks/run_spotless.sh
+ pass_filenames: false
+ files: ^java/cuvs-java/src/.*\.java$
+ exclude: .*/panama/.*
+ language: script
- id: clang-format-with-cmake-placeholders
name: clang-format-with-cmake-placeholders
entry: python3 ci/checks/clang_format_with_cmake_placeholders.py
diff --git a/ci/checks/run_spotless.sh b/ci/checks/run_spotless.sh
new file mode 100755
index 0000000000..5ad4dfe203
--- /dev/null
+++ b/ci/checks/run_spotless.sh
@@ -0,0 +1,23 @@
+#!/bin/bash
+# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
+
+# pre-commit hook wrapper that runs 'spotless:apply' to format the Java client sources.
+#
+# Most cuvs contributors do not work on the Java client and do not have Maven installed. For them
+# (running outside CI without Maven) this skips gracefully, so that 'pre-commit run --all-files'
+# does not require every contributor to install Maven. In CI, Maven is expected to be available and
+# its absence is treated as an error.
+
+set -euo pipefail
+
+if ! command -v mvn >/dev/null 2>&1; then
+ if [ "${CI:-false}" = "true" ]; then
+ echo "spotless-fmt: 'mvn' is required in CI but was not found on PATH." >&2
+ exit 1
+ fi
+ echo "spotless-fmt: skipping Java formatting ('mvn' not installed and not running in CI)." >&2
+ exit 0
+fi
+
+exec mvn --batch-mode --quiet -f java/cuvs-java/pom.xml spotless:apply
diff --git a/conda/environments/all_cuda-129_arch-aarch64.yaml b/conda/environments/all_cuda-129_arch-aarch64.yaml
index 955fbf4b3b..4c152e43da 100644
--- a/conda/environments/all_cuda-129_arch-aarch64.yaml
+++ b/conda/environments/all_cuda-129_arch-aarch64.yaml
@@ -30,11 +30,13 @@ dependencies:
- libopenblas<=0.3.30
- librmm==26.10.*,>=0.0.0a0
- make
+- maven
- nccl>=2.19
- ninja
- nodejs>=22
- numpy>=2.0,<3.0
- openblas
+- openjdk=22.*
- pre-commit
- pylibraft==26.10.*,>=0.0.0a0
- pytest
diff --git a/conda/environments/all_cuda-129_arch-x86_64.yaml b/conda/environments/all_cuda-129_arch-x86_64.yaml
index e0b706e97e..37f0d5ab08 100644
--- a/conda/environments/all_cuda-129_arch-x86_64.yaml
+++ b/conda/environments/all_cuda-129_arch-x86_64.yaml
@@ -29,11 +29,13 @@ dependencies:
- libnvjitlink-dev
- librmm==26.10.*,>=0.0.0a0
- make
+- maven
- nccl>=2.19
- ninja
- nodejs>=22
- numpy>=2.0,<3.0
- openblas
+- openjdk=22.*
- pre-commit
- pylibraft==26.10.*,>=0.0.0a0
- pytest
diff --git a/conda/environments/all_cuda-133_arch-aarch64.yaml b/conda/environments/all_cuda-133_arch-aarch64.yaml
index e6972b30dc..545dcf5326 100644
--- a/conda/environments/all_cuda-133_arch-aarch64.yaml
+++ b/conda/environments/all_cuda-133_arch-aarch64.yaml
@@ -30,11 +30,13 @@ dependencies:
- libopenblas<=0.3.30
- librmm==26.10.*,>=0.0.0a0
- make
+- maven
- nccl>=2.19
- ninja
- nodejs>=22
- numpy>=2.0,<3.0
- openblas
+- openjdk=22.*
- pre-commit
- pylibraft==26.10.*,>=0.0.0a0
- pytest
diff --git a/conda/environments/all_cuda-133_arch-x86_64.yaml b/conda/environments/all_cuda-133_arch-x86_64.yaml
index bab866e313..7b06a9c20e 100644
--- a/conda/environments/all_cuda-133_arch-x86_64.yaml
+++ b/conda/environments/all_cuda-133_arch-x86_64.yaml
@@ -29,11 +29,13 @@ dependencies:
- libnvjitlink-dev
- librmm==26.10.*,>=0.0.0a0
- make
+- maven
- nccl>=2.19
- ninja
- nodejs>=22
- numpy>=2.0,<3.0
- openblas
+- openjdk=22.*
- pre-commit
- pylibraft==26.10.*,>=0.0.0a0
- pytest
diff --git a/dependencies.yaml b/dependencies.yaml
index 970b173328..a64ff1a2e2 100644
--- a/dependencies.yaml
+++ b/dependencies.yaml
@@ -297,6 +297,11 @@ dependencies:
- output_types: [conda]
packages:
- c-compiler
+ # spotless-fmt pre-commit hook requires Maven and a JDK
+ - output_types: [conda]
+ packages:
+ - maven
+ - &openjdk openjdk=22.*
clang:
common:
- output_types: conda
@@ -591,7 +596,7 @@ dependencies:
- *cmake_ver
- libboost-devel
- maven
- - openjdk=22.*
+ - *openjdk
bench:
common:
- output_types: [conda, pyproject, requirements]
diff --git a/java/cuvs-java/pom.xml b/java/cuvs-java/pom.xml
index 7d00a7e9b7..87c84794d7 100644
--- a/java/cuvs-java/pom.xml
+++ b/java/cuvs-java/pom.xml
@@ -252,14 +252,6 @@ SPDX-License-Identifier: Apache-2.0
com.diffplug.spotless
spotless-maven-plugin
2.44.5
-
-
-
- apply
-
- validate
-
-
@@ -268,15 +260,21 @@ SPDX-License-Identifier: Apache-2.0
src/**/panama/*.java
+
+
+ Use the headers_h facade, not numbered jextract classes
+ \bheaders_h_[0-9]+\b
+ headers_h
+
1.27.0
true
false
-
- ${project.basedir}/../license-header.txt
-
diff --git a/java/cuvs-java/src/main/java/com/nvidia/cuvs/CuVSAceParams.java b/java/cuvs-java/src/main/java/com/nvidia/cuvs/CuVSAceParams.java
index b70547b333..eddb404874 100644
--- a/java/cuvs-java/src/main/java/com/nvidia/cuvs/CuVSAceParams.java
+++ b/java/cuvs-java/src/main/java/com/nvidia/cuvs/CuVSAceParams.java
@@ -1,5 +1,5 @@
/*
- * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION.
+ * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.nvidia.cuvs;
@@ -75,8 +75,13 @@ public class CuVSAceParams {
*/
private final double maxGpuMemoryGb;
- private CuVSAceParams(long npartitions, long efConstruction, String buildDir, boolean useDisk,
- double maxHostMemoryGb, double maxGpuMemoryGb) {
+ private CuVSAceParams(
+ long npartitions,
+ long efConstruction,
+ String buildDir,
+ boolean useDisk,
+ double maxHostMemoryGb,
+ double maxGpuMemoryGb) {
this.npartitions = npartitions;
this.efConstruction = efConstruction;
this.buildDir = buildDir;
@@ -259,8 +264,8 @@ public Builder withMaxGpuMemoryGb(double maxGpuMemoryGb) {
* @return an instance of {@link CuVSAceParams}
*/
public CuVSAceParams build() {
- return new CuVSAceParams(npartitions, efConstruction, buildDir, useDisk,
- maxHostMemoryGb, maxGpuMemoryGb);
+ return new CuVSAceParams(
+ npartitions, efConstruction, buildDir, useDisk, maxHostMemoryGb, maxGpuMemoryGb);
}
}
}
diff --git a/java/cuvs-java/src/main/java/com/nvidia/cuvs/CuVSResources.java b/java/cuvs-java/src/main/java/com/nvidia/cuvs/CuVSResources.java
index 7bf65eaba1..9fdfcd73b0 100644
--- a/java/cuvs-java/src/main/java/com/nvidia/cuvs/CuVSResources.java
+++ b/java/cuvs-java/src/main/java/com/nvidia/cuvs/CuVSResources.java
@@ -122,11 +122,9 @@ static CuVSResources create(Path tempDirectory) throws Throwable {
* @throws LibraryException if the native library cannot be loaded
*/
static CuVSResources create(
- Path tempDirectory,
- Path memoryTrackingCsvPath,
- Duration memoryTrackingSampleInterval) throws Throwable {
+ Path tempDirectory, Path memoryTrackingCsvPath, Duration memoryTrackingSampleInterval)
+ throws Throwable {
return CuVSProvider.provider()
- .newCuVSResources(
- tempDirectory, memoryTrackingCsvPath, memoryTrackingSampleInterval);
+ .newCuVSResources(tempDirectory, memoryTrackingCsvPath, memoryTrackingSampleInterval);
}
}
diff --git a/java/cuvs-java/src/main/java/com/nvidia/cuvs/HnswAceParams.java b/java/cuvs-java/src/main/java/com/nvidia/cuvs/HnswAceParams.java
index 325f424fae..41370f0ac5 100644
--- a/java/cuvs-java/src/main/java/com/nvidia/cuvs/HnswAceParams.java
+++ b/java/cuvs-java/src/main/java/com/nvidia/cuvs/HnswAceParams.java
@@ -1,5 +1,5 @@
/*
- * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION.
+ * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.nvidia.cuvs;
@@ -21,8 +21,12 @@ public class HnswAceParams {
private double maxHostMemoryGb;
private double maxGpuMemoryGb;
- private HnswAceParams(long npartitions, String buildDir, boolean useDisk,
- double maxHostMemoryGb, double maxGpuMemoryGb) {
+ private HnswAceParams(
+ long npartitions,
+ String buildDir,
+ boolean useDisk,
+ double maxHostMemoryGb,
+ double maxGpuMemoryGb) {
this.npartitions = npartitions;
this.buildDir = buildDir;
this.useDisk = useDisk;
@@ -188,8 +192,7 @@ public Builder withMaxGpuMemoryGb(double maxGpuMemoryGb) {
* @return an instance of {@link HnswAceParams}
*/
public HnswAceParams build() {
- return new HnswAceParams(npartitions, buildDir, useDisk,
- maxHostMemoryGb, maxGpuMemoryGb);
+ return new HnswAceParams(npartitions, buildDir, useDisk, maxHostMemoryGb, maxGpuMemoryGb);
}
}
}
diff --git a/java/cuvs-java/src/main/java/com/nvidia/cuvs/HnswIndexParams.java b/java/cuvs-java/src/main/java/com/nvidia/cuvs/HnswIndexParams.java
index 070cbedae1..294e21cce5 100644
--- a/java/cuvs-java/src/main/java/com/nvidia/cuvs/HnswIndexParams.java
+++ b/java/cuvs-java/src/main/java/com/nvidia/cuvs/HnswIndexParams.java
@@ -1,5 +1,5 @@
/*
- * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION.
+ * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.nvidia.cuvs;
@@ -283,13 +283,7 @@ public Builder withAceParams(HnswAceParams aceParams) {
*/
public HnswIndexParams build() {
return new HnswIndexParams(
- hierarchy,
- efConstruction,
- numThreads,
- vectorDimension,
- m,
- metric,
- aceParams);
+ hierarchy, efConstruction, numThreads, vectorDimension, m, metric, aceParams);
}
}
}
diff --git a/java/cuvs-java/src/main/java/com/nvidia/cuvs/internal/FilterBitsetPoolConfig.java b/java/cuvs-java/src/main/java/com/nvidia/cuvs/internal/FilterBitsetPoolConfig.java
index 514c518471..66694ea85b 100644
--- a/java/cuvs-java/src/main/java/com/nvidia/cuvs/internal/FilterBitsetPoolConfig.java
+++ b/java/cuvs-java/src/main/java/com/nvidia/cuvs/internal/FilterBitsetPoolConfig.java
@@ -43,8 +43,7 @@ static OptionalLong resolvePoolBytes(String raw) {
return OptionalLong.of(DEFAULT_FILTER_POOL_BYTES);
}
- long alignedBytes =
- (requestedBytes + (RMM_ALIGNMENT_BYTES - 1)) & ~(RMM_ALIGNMENT_BYTES - 1);
+ long alignedBytes = (requestedBytes + (RMM_ALIGNMENT_BYTES - 1)) & ~(RMM_ALIGNMENT_BYTES - 1);
return OptionalLong.of(alignedBytes);
}
diff --git a/java/cuvs-java/src/main/java/com/nvidia/cuvs/spi/CuVSProvider.java b/java/cuvs-java/src/main/java/com/nvidia/cuvs/spi/CuVSProvider.java
index 8d9d8f2307..05bbc4ab0f 100644
--- a/java/cuvs-java/src/main/java/com/nvidia/cuvs/spi/CuVSProvider.java
+++ b/java/cuvs-java/src/main/java/com/nvidia/cuvs/spi/CuVSProvider.java
@@ -55,9 +55,8 @@ default Path nativeLibraryPath() {
* CSV samples
*/
default CuVSResources newCuVSResources(
- Path tempDirectory,
- Path memoryTrackingCsvPath,
- Duration memoryTrackingSampleInterval) throws Throwable {
+ Path tempDirectory, Path memoryTrackingCsvPath, Duration memoryTrackingSampleInterval)
+ throws Throwable {
throw new UnsupportedOperationException(
"Memory-tracking resources are not supported by this provider");
}
diff --git a/java/cuvs-java/src/main/java/com/nvidia/cuvs/spi/UnsupportedProvider.java b/java/cuvs-java/src/main/java/com/nvidia/cuvs/spi/UnsupportedProvider.java
index aa11190eea..2a9f9ac738 100644
--- a/java/cuvs-java/src/main/java/com/nvidia/cuvs/spi/UnsupportedProvider.java
+++ b/java/cuvs-java/src/main/java/com/nvidia/cuvs/spi/UnsupportedProvider.java
@@ -29,9 +29,7 @@ public CuVSResources newCuVSResources(Path tempDirectory) {
@Override
public CuVSResources newCuVSResources(
- Path tempDirectory,
- Path memoryTrackingCsvPath,
- Duration memoryTrackingSampleInterval) {
+ Path tempDirectory, Path memoryTrackingCsvPath, Duration memoryTrackingSampleInterval) {
throw new UnsupportedOperationException(reasons);
}
diff --git a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CagraIndexImpl.java b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CagraIndexImpl.java
index 0539a0da5f..691c99e93f 100644
--- a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CagraIndexImpl.java
+++ b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CagraIndexImpl.java
@@ -81,9 +81,7 @@ private CagraIndexImpl(InputStream inputStream, CuVSResources resources) throws
}
private CagraIndexImpl(
- InputStream inputStream,
- CuVSResources resources,
- CagraIndex.DeserializeDataset outDataset)
+ InputStream inputStream, CuVSResources resources, CagraIndex.DeserializeDataset outDataset)
throws Throwable {
this.resources = resources;
this.cagraIndexReference = deserialize(inputStream, outDataset);
@@ -412,8 +410,7 @@ public MemorySegment getIndexHandle() {
}
@Override
- public CagraIndex.PaddedDataset makePaddedDataset(CuVSMatrix dataset)
- throws Throwable {
+ public CagraIndex.PaddedDataset makePaddedDataset(CuVSMatrix dataset) throws Throwable {
checkNotDestroyed();
Objects.requireNonNull(dataset);
if (!(dataset instanceof CuVSMatrixInternal datasetInternal)) {
@@ -441,8 +438,7 @@ public CagraIndex.PaddedDataset makePaddedDataset(CuVSMatrix dataset)
}
@Override
- public CagraIndex.PaddedDatasetView makePaddedDatasetView(CuVSMatrix dataset)
- throws Throwable {
+ public CagraIndex.PaddedDatasetView makePaddedDatasetView(CuVSMatrix dataset) throws Throwable {
checkNotDestroyed();
Objects.requireNonNull(dataset);
if (!(dataset instanceof CuVSMatrixInternal datasetInternal)) {
@@ -967,8 +963,7 @@ public static CagraIndex merge(CagraIndex[] indexes, CagraIndexParams mergeParam
mergedDataset,
mergedIndex),
"cuvsCagraMerge");
- return new CagraIndexImpl(
- new IndexReference(mergedIndex, null, datasetOwner), resources);
+ return new CagraIndexImpl(new IndexReference(mergedIndex, null, datasetOwner), resources);
} catch (Throwable e) {
try {
datasetOwner.close();
@@ -1005,8 +1000,7 @@ public Builder from(InputStream inputStream) {
}
@Override
- public Builder from(
- InputStream inputStream, CagraIndex.DeserializeDataset outDataset) {
+ public Builder from(InputStream inputStream, CagraIndex.DeserializeDataset outDataset) {
this.inputStream = inputStream;
this.outDataset = Objects.requireNonNull(outDataset);
return this;
@@ -1053,7 +1047,7 @@ public CagraIndexImpl build() throws Throwable {
} else if (dataset != null) {
return new CagraIndexImpl(cagraIndexParams, dataset, cuvsResources);
} else {
- throw new IllegalArgumentException("dataset must be provided");
+ throw new IllegalArgumentException("dataset must be provided");
}
}
}
@@ -1083,9 +1077,7 @@ private IndexReference(MemorySegment indexMemorySegment, CuVSMatrix dataset) {
}
private IndexReference(
- MemorySegment indexMemorySegment,
- CuVSMatrix dataset,
- AutoCloseable datasetOwner) {
+ MemorySegment indexMemorySegment, CuVSMatrix dataset, AutoCloseable datasetOwner) {
this.memorySegment = indexMemorySegment;
this.dataset = dataset;
this.datasetOwner = datasetOwner;
diff --git a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CuVSResourcesImpl.java b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CuVSResourcesImpl.java
index ebe6fd4e86..7a3f401529 100644
--- a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CuVSResourcesImpl.java
+++ b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/CuVSResourcesImpl.java
@@ -6,7 +6,6 @@
import static com.nvidia.cuvs.internal.common.Util.checkCuVSError;
import static com.nvidia.cuvs.internal.panama.headers_h.*;
-import static com.nvidia.cuvs.internal.panama.headers_h_1.C_INT;
import com.nvidia.cuvs.CuVSResources;
import com.nvidia.cuvs.DelegatingScopedAccess;
@@ -68,17 +67,13 @@ public CuVSResourcesImpl(Path tempDirectory) {
* CSV samples
*/
public CuVSResourcesImpl(
- Path tempDirectory,
- Path memoryTrackingCsvPath,
- Duration memoryTrackingSampleInterval) {
+ Path tempDirectory, Path memoryTrackingCsvPath, Duration memoryTrackingSampleInterval) {
this.tempDirectory = tempDirectory;
try (var localArena = Arena.ofConfined()) {
var resourcesMemorySegment = localArena.allocate(cuvsResources_t);
- byte[] pathBytes =
- memoryTrackingCsvPath.toString().getBytes(StandardCharsets.UTF_8);
+ byte[] pathBytes = memoryTrackingCsvPath.toString().getBytes(StandardCharsets.UTF_8);
var pathSegment = localArena.allocate(pathBytes.length + 1L);
- MemorySegment.copy(
- pathBytes, 0, pathSegment, ValueLayout.JAVA_BYTE, 0, pathBytes.length);
+ MemorySegment.copy(pathBytes, 0, pathSegment, ValueLayout.JAVA_BYTE, 0, pathBytes.length);
pathSegment.set(ValueLayout.JAVA_BYTE, pathBytes.length, (byte) 0);
long sampleIntervalMs = memoryTrackingSampleInterval.toMillis();
checkCuVSError(
diff --git a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/FilterBitsetHandleImpl.java b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/FilterBitsetHandleImpl.java
index 4aef526bc4..b567174aed 100644
--- a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/FilterBitsetHandleImpl.java
+++ b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/FilterBitsetHandleImpl.java
@@ -71,8 +71,8 @@ void close() {
// (and callers configure per-resources workspace pools, so the workspace MRs are genuinely
// distinct). Binding the allocation to the short-lived per-query resources passed to search
// crashes: that resources can be torn down (e.g. on segment reader close) while a handle is still
- // cached in the shared FilterBitsetCache, leaving the free with a dangling resources. A dedicated,
- // never-closed resources keeps alloc and free on one always-valid workspace MR.
+ // cached in the shared FilterBitsetCache, leaving the free with a dangling resources. A
+ // dedicated, never-closed resources keeps alloc and free on one always-valid workspace MR.
private static final Object FILTER_RESOURCES_LOCK = new Object();
private static volatile CuVSResources filterResources;
@@ -85,7 +85,8 @@ private static CuVSResources filterResources() {
try {
r = CuVSResources.create();
} catch (Throwable t) {
- throw new RuntimeException("Failed to create resources for filter bitset device memory", t);
+ throw new RuntimeException(
+ "Failed to create resources for filter bitset device memory", t);
}
maybeSetFilterPool(r);
filterResources = r;
@@ -183,8 +184,10 @@ DeviceData getOrUpload() {
private DeviceData upload() {
long combinedBitsetBytes = (long) combinedLongs.length * Long.BYTES;
- // Serialize uploads: they share one resources (single stream/host-buffer) and are rare (once per
- // distinct filter, on cache miss). The free path uses the captured resources handle directly and
+ // Serialize uploads: they share one resources (single stream/host-buffer) and are rare (once
+ // per
+ // distinct filter, on cache miss). The free path uses the captured resources handle directly
+ // and
// is RMM-thread-safe, so it needs no lock.
synchronized (FILTER_RESOURCES_LOCK) {
try (var access = filterResources().access()) {
@@ -203,7 +206,8 @@ private DeviceData upload() {
checkCuVSError(cuvsStreamSync(cuvsRes), "cuvsStreamSync in FilterBitsetHandle.upload");
}
- // Stream sync has returned — device memory is fully populated. uint32 words = long count * 2.
+ // Stream sync has returned — device memory is fully populated. uint32 words = long count
+ // * 2.
return new DeviceData(combinedBitsetDP, (long) combinedLongs.length * 2);
} catch (Throwable t) {
try {
diff --git a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/GPUInfoProviderImpl.java b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/GPUInfoProviderImpl.java
index a278f536a4..6860fb9e89 100644
--- a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/GPUInfoProviderImpl.java
+++ b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/GPUInfoProviderImpl.java
@@ -8,9 +8,6 @@
import static com.nvidia.cuvs.internal.common.Util.checkCudaError;
import static com.nvidia.cuvs.internal.common.Util.cudaGetDeviceProperties;
import static com.nvidia.cuvs.internal.panama.headers_h.*;
-import static com.nvidia.cuvs.internal.panama.headers_h.cudaMemGetInfo;
-// Import from the leaf binding class (headers_h extends headers_h_1 …); it inherits every symbol,
-// so this is robust to jextract shifting symbols across the split classes on regeneration.
import com.nvidia.cuvs.CuVSResources;
import com.nvidia.cuvs.CuVSResourcesInfo;
diff --git a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/HnswIndexImpl.java b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/HnswIndexImpl.java
index ca528ac010..58457e0405 100644
--- a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/HnswIndexImpl.java
+++ b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/HnswIndexImpl.java
@@ -1,5 +1,5 @@
/*
- * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION.
+ * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.nvidia.cuvs.internal;
@@ -251,8 +251,8 @@ public static HnswIndex.Builder newBuilder(CuVSResources cuvsResources) {
* @return A new HNSW index ready for search
* @throws Throwable if an error occurs during building
*/
- public static HnswIndex build(CuVSResources resources, HnswIndexParams hnswParams, CuVSMatrix dataset)
- throws Throwable {
+ public static HnswIndex build(
+ CuVSResources resources, HnswIndexParams hnswParams, CuVSMatrix dataset) throws Throwable {
Objects.requireNonNull(resources);
Objects.requireNonNull(hnswParams);
Objects.requireNonNull(dataset);
@@ -288,7 +288,8 @@ public static HnswIndex build(CuVSResources resources, HnswIndexParams hnswParam
return new HnswIndexImpl(new IndexReference(hnswIndex), resources, hnswParams);
}
- private static CloseableHandle createHnswIndexParamsForBuild(Arena arena, HnswIndexParams params) {
+ private static CloseableHandle createHnswIndexParamsForBuild(
+ Arena arena, HnswIndexParams params) {
var hnswParams = createHnswIndexParams();
MemorySegment seg = hnswParams.handle();
@@ -324,7 +325,7 @@ private static MemorySegment prepareTensorFromMatrix(Arena arena, CuVSMatrix dat
return prepareTensor(
arena,
matrixInternal.memorySegment(),
- new long[]{dataset.size(), dataset.columns()},
+ new long[] {dataset.size(), dataset.columns()},
matrixInternal.code(),
matrixInternal.bits(),
kDLCPU());
diff --git a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/MultiPartitionCagraSearchImpl.java b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/MultiPartitionCagraSearchImpl.java
index 2ccf357ecc..0c8837f7a2 100644
--- a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/MultiPartitionCagraSearchImpl.java
+++ b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/MultiPartitionCagraSearchImpl.java
@@ -172,7 +172,8 @@ public static MultiPartitionSearchResults search(
FilterBitsetHandle f = filters.get(i);
if (f != null) {
FilterBitsetHandleImpl.DeviceData dev = ((FilterBitsetHandleImpl) f).getOrUpload();
- buildCuvsFilterStruct(arena, filterSeg, dev.combinedBitsetDP.handle(), dev.combinedWords);
+ buildCuvsFilterStruct(
+ arena, filterSeg, dev.combinedBitsetDP.handle(), dev.combinedWords);
} else {
cuvsFilter.type(filterSeg, 0 /* NO_FILTER */);
cuvsFilter.addr(filterSeg, 0L);
diff --git a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/common/Util.java b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/common/Util.java
index 8959368bc2..986ca5bd88 100644
--- a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/common/Util.java
+++ b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/internal/common/Util.java
@@ -9,12 +9,6 @@
import static com.nvidia.cuvs.internal.common.LinkerHelper.C_INT;
import static com.nvidia.cuvs.internal.common.LinkerHelper.C_LONG;
import static com.nvidia.cuvs.internal.panama.headers_h.*;
-import static com.nvidia.cuvs.internal.panama.headers_h_1.C_POINTER;
-import static com.nvidia.cuvs.internal.panama.headers_h_1.cudaMemcpyDeviceToDevice;
-import static com.nvidia.cuvs.internal.panama.headers_h_1.cudaMemcpyDeviceToHost;
-import static com.nvidia.cuvs.internal.panama.headers_h_1.cudaMemcpyHostToDevice;
-import static com.nvidia.cuvs.internal.panama.headers_h_1.cudaMemcpyHostToHost;
-import static com.nvidia.cuvs.internal.panama.headers_h_1.cudaStream_t;
import com.nvidia.cuvs.CuVSResources;
import com.nvidia.cuvs.internal.panama.DLDataType;
diff --git a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/spi/JDKProvider.java b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/spi/JDKProvider.java
index 10ba520620..4d1dbecf0f 100644
--- a/java/cuvs-java/src/main/java22/com/nvidia/cuvs/spi/JDKProvider.java
+++ b/java/cuvs-java/src/main/java22/com/nvidia/cuvs/spi/JDKProvider.java
@@ -239,9 +239,7 @@ public CuVSResources newCuVSResources(Path tempDirectory) {
@Override
public CuVSResources newCuVSResources(
- Path tempDirectory,
- Path memoryTrackingCsvPath,
- Duration memoryTrackingSampleInterval) {
+ Path tempDirectory, Path memoryTrackingCsvPath, Duration memoryTrackingSampleInterval) {
Objects.requireNonNull(tempDirectory);
Objects.requireNonNull(memoryTrackingCsvPath);
Objects.requireNonNull(memoryTrackingSampleInterval);
diff --git a/java/cuvs-java/src/test/java/com/nvidia/cuvs/BruteForceAndSearchIT.java b/java/cuvs-java/src/test/java/com/nvidia/cuvs/BruteForceAndSearchIT.java
index d348c44c3f..ab59395dd2 100644
--- a/java/cuvs-java/src/test/java/com/nvidia/cuvs/BruteForceAndSearchIT.java
+++ b/java/cuvs-java/src/test/java/com/nvidia/cuvs/BruteForceAndSearchIT.java
@@ -156,8 +156,9 @@ public void testPrefilterWithTrailingZeroWords() throws Throwable {
// farthest of all - so any leaked document from the corrupted high words would displace it.
float[][] localQueries = {{64.0f, 0.0f}};
- // Allow only document 0. All higher bits are 0, so BitSet.toLongArray() drops the trailing words
- // covering documents 64..127 - exactly the region the buggy copy fills from adjacent host memory.
+ // Allow only document 0. All higher bits are 0, so BitSet.toLongArray() drops the trailing
+ // words covering documents 64..127 - exactly the region the buggy copy fills from adjacent host
+ // memory.
BitSet prefilter = new BitSet(numDocs);
prefilter.set(0);
diff --git a/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraAceBuildAndSearchIT.java b/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraAceBuildAndSearchIT.java
index e359c5aa67..f762334619 100644
--- a/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraAceBuildAndSearchIT.java
+++ b/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraAceBuildAndSearchIT.java
@@ -191,7 +191,10 @@ public void testAceDiskBasedBuild() throws Throwable {
// Convert CAGRA index to HNSW using fromCagra
// This automatically handles disk-based indices
HnswIndexParams hnswIndexParams =
- new HnswIndexParams.Builder().withVectorDimension(2).withHierarchy(HnswHierarchy.GPU).build();
+ new HnswIndexParams.Builder()
+ .withVectorDimension(2)
+ .withHierarchy(HnswHierarchy.GPU)
+ .build();
try (var hnswIndexSerialized = HnswIndex.fromCagra(hnswIndexParams, index)) {
var hnswIndexSerializedPath = buildDir.resolve("hnsw_index.bin");
diff --git a/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraBuildAndSearchIT.java b/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraBuildAndSearchIT.java
index 77f4256b0b..e2287c0a22 100644
--- a/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraBuildAndSearchIT.java
+++ b/java/cuvs-java/src/test/java/com/nvidia/cuvs/CagraBuildAndSearchIT.java
@@ -179,8 +179,7 @@ public void testDeserializeReturnsCallerOwnedStandardDataset() throws Throwable
try (var indexDataset = index.makePaddedDataset(deviceVectors);
var outDataset = new CagraIndex.StandardDataset();
var inputStream = Files.newInputStream(indexPath);
- var loadedIndex =
- CagraIndex.newBuilder(resources).from(inputStream, outDataset).build();
+ var loadedIndex = CagraIndex.newBuilder(resources).from(inputStream, outDataset).build();
// The deserialized standard dataset is caller-owned but not searchable as-is.
var loadedDataset = loadedIndex.makePaddedDataset(deviceVectors)) {
assertTrue(outDataset.isPresent());
diff --git a/java/cuvs-java/src/test/java/com/nvidia/cuvs/FilterBitsetHandleIT.java b/java/cuvs-java/src/test/java/com/nvidia/cuvs/FilterBitsetHandleIT.java
index 605ff7c95f..2abb153207 100644
--- a/java/cuvs-java/src/test/java/com/nvidia/cuvs/FilterBitsetHandleIT.java
+++ b/java/cuvs-java/src/test/java/com/nvidia/cuvs/FilterBitsetHandleIT.java
@@ -47,6 +47,7 @@ public class FilterBitsetHandleIT extends CuVSTestCase {
/** Device storage and views attached to the partition indexes, released by {@link #closeAll}. */
private final List partitionDeviceDatasets = new ArrayList<>();
+
private final List partitionDatasetViews = new ArrayList<>();
@Before
@@ -72,7 +73,8 @@ public void testConcurrentFilteredSearchWithSharedHandleIsStable() throws Throwa
// Warm up the device upload on the long-lived `resources` so the shared allocation is bound
// to it. Per-thread resources are closed when each search thread finishes; binding the
// allocation to one of those would free it against destroyed resources at handle close.
- assertNoFilteredRows(searchOnce(resources, indices, queries, partStart, filters), partStart);
+ assertNoFilteredRows(
+ searchOnce(resources, indices, queries, partStart, filters), partStart);
List errors =
runConcurrentSearches(
indices, queries, partStart, filters, numThreads, searchesPerThread);
diff --git a/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswAceBuildAndSearchIT.java b/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswAceBuildAndSearchIT.java
index 17d64838dc..835fcd6e23 100644
--- a/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswAceBuildAndSearchIT.java
+++ b/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswAceBuildAndSearchIT.java
@@ -1,5 +1,5 @@
/*
- * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION.
+ * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/
package com.nvidia.cuvs;
@@ -227,7 +227,8 @@ public void testHnswAceWithDifferentHierarchy() throws Throwable {
float[][] queries = createSampleQueries();
List