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> expectedResults = getExpectedResults(); - for (CuvsHnswHierarchy hierarchy : Arrays.asList(CuvsHnswHierarchy.NONE, CuvsHnswHierarchy.GPU)) { + for (CuvsHnswHierarchy hierarchy : + Arrays.asList(CuvsHnswHierarchy.NONE, CuvsHnswHierarchy.GPU)) { try (CuVSResources resources = CheckedCuVSResources.create()) { Path buildDir = Files.createTempDirectory("hnsw_ace_hierarchy_test"); diff --git a/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswRandomizedIT.java b/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswRandomizedIT.java index d5c4f9096d..fe5ca88073 100644 --- a/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswRandomizedIT.java +++ b/java/cuvs-java/src/test/java/com/nvidia/cuvs/HnswRandomizedIT.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; @@ -132,7 +132,10 @@ private void tmpResultsTopKWithRandomValues(boolean useNativeMemoryDataset) thro // Use NONE hierarchy since serializeToHNSW creates a base-layer-only index HnswIndexParams hnswIndexParams = - new HnswIndexParams.Builder().withVectorDimension(dimensions).withHierarchy(HnswHierarchy.NONE).build(); + new HnswIndexParams.Builder() + .withVectorDimension(dimensions) + .withHierarchy(HnswHierarchy.NONE) + .build(); try (var inputStreamHNSW = Files.newInputStream(hnswIndexPath)) { HnswIndex hnswIndex = diff --git a/java/cuvs-java/src/test/java/com/nvidia/cuvs/MemoryTrackingResourcesIT.java b/java/cuvs-java/src/test/java/com/nvidia/cuvs/MemoryTrackingResourcesIT.java index 494444ed9f..b80a789025 100644 --- a/java/cuvs-java/src/test/java/com/nvidia/cuvs/MemoryTrackingResourcesIT.java +++ b/java/cuvs-java/src/test/java/com/nvidia/cuvs/MemoryTrackingResourcesIT.java @@ -26,19 +26,16 @@ public void writesNonEmptyCsv() throws Throwable { Path csv = Files.createTempFile("cuvs-mtrack", ".csv"); try { try (var resources = - CuVSResources.create( - CuVSProvider.tempDirectory(), csv, Duration.ofMillis(2))) { + CuVSResources.create(CuVSProvider.tempDirectory(), csv, Duration.ofMillis(2))) { // Allocate / release a couple of small device buffers so the // background CSV reporter has something to report. - var b1 = - CuVSMatrix.deviceBuilder(resources, 64, 32, CuVSMatrix.DataType.FLOAT); + var b1 = CuVSMatrix.deviceBuilder(resources, 64, 32, CuVSMatrix.DataType.FLOAT); for (int i = 0; i < 64; ++i) { b1.addVector(new float[32]); } try (var m1 = b1.build()) { - var b2 = - CuVSMatrix.deviceBuilder(resources, 32, 16, CuVSMatrix.DataType.FLOAT); + var b2 = CuVSMatrix.deviceBuilder(resources, 32, 16, CuVSMatrix.DataType.FLOAT); for (int i = 0; i < 32; ++i) { b2.addVector(new float[16]); } diff --git a/java/cuvs-java/src/test/java/com/nvidia/cuvs/MultiPartitionCagraSearchIT.java b/java/cuvs-java/src/test/java/com/nvidia/cuvs/MultiPartitionCagraSearchIT.java index 12e6df9630..62e13b733e 100644 --- a/java/cuvs-java/src/test/java/com/nvidia/cuvs/MultiPartitionCagraSearchIT.java +++ b/java/cuvs-java/src/test/java/com/nvidia/cuvs/MultiPartitionCagraSearchIT.java @@ -35,6 +35,7 @@ public class MultiPartitionCagraSearchIT 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 diff --git a/java/examples/pom.xml b/java/examples/pom.xml index e0c327edde..b4c53552f1 100644 --- a/java/examples/pom.xml +++ b/java/examples/pom.xml @@ -105,9 +105,6 @@ SPDX-License-Identifier: Apache-2.0 true false - - ${project.basedir}/../license-header.txt - diff --git a/java/license-header.txt b/java/license-header.txt deleted file mode 100644 index e49ea20ab7..0000000000 --- a/java/license-header.txt +++ /dev/null @@ -1,4 +0,0 @@ -/* - * SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION. - * SPDX-License-Identifier: Apache-2.0 - */