From d478db8cfa15da028b283dfffeeed222795fe918 Mon Sep 17 00:00:00 2001 From: nick-youngblut Date: Wed, 23 Sep 2026 21:31:53 -0700 Subject: [PATCH] chore: bump workspace version to 0.20.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All 16 versioned workspace members, `pyscx/pyproject.toml` and `rscx/DESCRIPTION`; `tests/scx-integration-tests` stays at `0.0.0`. README's `scx-cli` download snippet follows. (ROADMAP.md no longer exists, so there is no date stamp to move.) 0.20.0 collects the merged PRs since 0.19.0 (#544-#561): - CSC sidecar series: one-pass bucketed CSC builder (#555); `build-csc` as an in-place, rollback-able append (#556); same-pass CSC build on ingest and carry-through on rewrite ops (#557); parallel CSC build and `csc="auto"` as the ingest default (#558); CSC dispatch for row-indexed transforms and row-filtered / gene-subset handles (#553, #554); CSC route coverage and the exact-nnz Wilcoxon kernel as the 1-vs-rest CSC default (#559) - Correctness: Leiden parallel local moving keeps decliners eligible (#544); five CPU-accelerator parity / convergence fixes (#548); GPU cuVS stream sync, reduction determinism, decoder bounds and VRAM accounting (#549); CLI destination-overwrite safety and MTX multimodal / streaming / integer integrity (#550); unscoped whole-matrix reads of a multimodal file refused (#551); dictionary (categorical) output from append / merge / merge --sort-by (#546) and `scx sort`'s obs spill path (#547) - Benchmarks and docs: four community analytical benchmarks (#552), laptop-test recapture (#560), README refresh (#545), docs split into per-topic directories (#561) Behaviour changes worth calling out in the release notes: - **`csc="auto"` is the ingest default** on every entry point and preset (`from_mudata` keeps `off`): files with `n_obs >= 50000` and `n_vars >= 5000` now get a CSC sidecar, costing ingest wall time and +42-71 % on disk. `--csc off` / `csc="off"` opts out (#558). - **Rewrite ops carry the CSC sidecar by default** (`compact`, `merge`, `optimize`, `sort`, `subset`), rebuilt from the output's own shards; `--csc carry|always|off`. `--rebuild-csc` / `rebuild_csc=True` are deprecated aliases for `always` (#557). - **`scx build-csc` appends in place** rather than rewriting the file, and `scx rollback` removes the sidecar (#556). - **Ten CLI subcommands no longer silently overwrite an existing destination**; `--force` is required (convert, merge, subset, query --output, upgrade, cloud-optimize, explode, pack, pull; compact / optimize / sort migrated onto the same guard) and is refused where nothing is written (#550). - **MTX**: a declared-`integer` MTX with a value past 2^24, a non-integral value or `nan`/`inf` is refused on ingest (`--allow-lossy` restores the old behaviour); multimodal MTX export requires a modality (`pyscx.to_mtx` gains `modality=`); export streams one shard at a time (#550). - **An unscoped whole-matrix read of a multimodal file raises** `MultimodalRequiresModality` instead of folding every modality into one `n_obs x n_modalities`-row answer — `to_anndata()`, `to_memory()`, `read_all_csr_shards*`, `scx pull --filter` (#551). - **Numerical changes**: UMAP init scale and `random_init` now match umap-learn, the kNN sigma search, and NB-GLM dispersion shrinkage (the `above_min_disp` residual filter always runs; new `disp_outlier_sd=2.0` carve-out, `None` disables only the carve-out) (#548); parallel Leiden labels change (#544). - **Wilcoxon on the CPU CSC route** defaults to the exact-nnz kernel (route id `cpu_csc_nnz`); `SCX_ACCEL_WILCOXON_NNZ=0` restores densify (`cpu_csc`), and `reference=` / `rankby_abs=True` still use densify (#559). - **Categorical obs columns** keep their declared categories, unused levels and `ordered` bit through append / merge / sort (#546, #547). No benchmark recapture for this release. Pre-release gate on this tree: `cargo fmt --check`; `cargo clippy --workspace --exclude rscx --all-targets -D warnings`; `cargo test --workspace --exclude rscx` (4,220 passed, 0 failed); `cargo test -p scx-convert --features hdf5` (474 passed); `cargo test -p scx-cli --features hdf5 -- --test-threads=1` (253 passed); `maturin develop --release` + `pytest tests/` (3,247 passed, 140 skipped, 2 xfailed; `pyscx.__version__ == "0.20.0"`). Not run: rscx tests, `--features cloud`, GPU pytest, fuzzing, benchmarks. Co-Authored-By: Claude Opus 5.5 (1M context) Claude-Session: https://claude.ai/code/session_01RwRKstgr4TNkXhLhkQwmjA --- Cargo.lock | 32 ++++++++++++++++---------------- README.md | 2 +- pyscx/Cargo.toml | 2 +- pyscx/pyproject.toml | 2 +- rscx/Cargo.toml | 2 +- rscx/DESCRIPTION | 2 +- scx-accel/Cargo.toml | 2 +- scx-cli/Cargo.toml | 2 +- scx-cloud/Cargo.toml | 2 +- scx-codec/Cargo.toml | 2 +- scx-convert/Cargo.toml | 2 +- scx-engine/Cargo.toml | 2 +- scx-format-io/Cargo.toml | 2 +- scx-format/Cargo.toml | 2 +- scx-gpu/Cargo.toml | 2 +- scx-loader/Cargo.toml | 2 +- scx-mtx/Cargo.toml | 2 +- scx-ops/Cargo.toml | 2 +- scx-sparse/Cargo.toml | 2 +- scx-testkit/Cargo.toml | 2 +- 20 files changed, 35 insertions(+), 35 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9a56ac2a..d86a2736 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2902,7 +2902,7 @@ dependencies = [ [[package]] name = "pyscx" -version = "0.19.0" +version = "0.20.0" dependencies = [ "arrow", "base64", @@ -3273,7 +3273,7 @@ dependencies = [ [[package]] name = "rscx" -version = "0.19.0" +version = "0.20.0" dependencies = [ "arrow", "extendr-api", @@ -3441,7 +3441,7 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "scx-accel" -version = "0.19.0" +version = "0.20.0" dependencies = [ "arrow", "criterion", @@ -3468,7 +3468,7 @@ dependencies = [ [[package]] name = "scx-cli" -version = "0.19.0" +version = "0.20.0" dependencies = [ "arrow", "byteorder", @@ -3500,7 +3500,7 @@ dependencies = [ [[package]] name = "scx-cloud" -version = "0.19.0" +version = "0.20.0" dependencies = [ "arrow", "async-trait", @@ -3523,7 +3523,7 @@ dependencies = [ [[package]] name = "scx-codec" -version = "0.19.0" +version = "0.20.0" dependencies = [ "bitpacking", "bytemuck", @@ -3540,7 +3540,7 @@ dependencies = [ [[package]] name = "scx-convert" -version = "0.19.0" +version = "0.20.0" dependencies = [ "arrow", "base64", @@ -3571,7 +3571,7 @@ dependencies = [ [[package]] name = "scx-engine" -version = "0.19.0" +version = "0.20.0" dependencies = [ "arrow", "blake3", @@ -3591,7 +3591,7 @@ dependencies = [ [[package]] name = "scx-format" -version = "0.19.0" +version = "0.20.0" dependencies = [ "arrow", "blake3", @@ -3609,7 +3609,7 @@ dependencies = [ [[package]] name = "scx-format-io" -version = "0.19.0" +version = "0.20.0" dependencies = [ "arrow", "blake3", @@ -3635,7 +3635,7 @@ dependencies = [ [[package]] name = "scx-gpu" -version = "0.19.0" +version = "0.20.0" dependencies = [ "byteorder", "crossbeam-channel", @@ -3679,7 +3679,7 @@ dependencies = [ [[package]] name = "scx-loader" -version = "0.19.0" +version = "0.20.0" dependencies = [ "arrow", "blake3", @@ -3709,7 +3709,7 @@ dependencies = [ [[package]] name = "scx-mtx" -version = "0.19.0" +version = "0.20.0" dependencies = [ "arrow", "flate2", @@ -3723,7 +3723,7 @@ dependencies = [ [[package]] name = "scx-ops" -version = "0.19.0" +version = "0.20.0" dependencies = [ "arrow", "blake3", @@ -3750,7 +3750,7 @@ dependencies = [ [[package]] name = "scx-sparse" -version = "0.19.0" +version = "0.20.0" dependencies = [ "criterion", "half", @@ -3765,7 +3765,7 @@ dependencies = [ [[package]] name = "scx-testkit" -version = "0.19.0" +version = "0.20.0" dependencies = [ "arrow", "blake3", diff --git a/README.md b/README.md index 5bef4363..62a1dfc9 100644 --- a/README.md +++ b/README.md @@ -667,7 +667,7 @@ GitHub-Release-wheel-vs-source guidance aimed at agents, see ```bash # Last published release — see https://github.com/ArcInstitute/scx/releases # for whether a newer one ever shipped -VERSION=0.19.0 +VERSION=0.20.0 # Pick the matching target for your platform: # linux x86_64 → x86_64-unknown-linux-gnu # linux arm64 → aarch64-unknown-linux-gnu diff --git a/pyscx/Cargo.toml b/pyscx/Cargo.toml index 2e475528..84278b5a 100644 --- a/pyscx/Cargo.toml +++ b/pyscx/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pyscx" -version = "0.19.0" +version = "0.20.0" edition = "2021" description = "Python bindings for SCX via PyO3" license.workspace = true diff --git a/pyscx/pyproject.toml b/pyscx/pyproject.toml index c04d3e3a..be32939d 100644 --- a/pyscx/pyproject.toml +++ b/pyscx/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "maturin" [project] name = "pyscx" -version = "0.19.0" +version = "0.20.0" description = "Python bindings for SCX (Sparse Cell eXpression System)" license = {text = "MIT"} authors = [ diff --git a/rscx/Cargo.toml b/rscx/Cargo.toml index f188a361..b2c1e2ac 100644 --- a/rscx/Cargo.toml +++ b/rscx/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "rscx" -version = "0.19.0" +version = "0.20.0" edition = "2021" description = "R bindings for SCX via extendr" license.workspace = true diff --git a/rscx/DESCRIPTION b/rscx/DESCRIPTION index 0a80f84e..6399c31d 100644 --- a/rscx/DESCRIPTION +++ b/rscx/DESCRIPTION @@ -1,6 +1,6 @@ Package: rscx Title: SCX File Format for Single-Cell RNA-seq -Version: 0.19.0 +Version: 0.20.0 Authors@R: person("Arc Institute", role = c("aut", "cre"), email = "scx@arcinstitute.org") diff --git a/scx-accel/Cargo.toml b/scx-accel/Cargo.toml index 237aeda7..4a37cb6c 100644 --- a/scx-accel/Cargo.toml +++ b/scx-accel/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "scx-accel" -version = "0.19.0" +version = "0.20.0" edition = "2021" description = "Rust-native analysis accelerators for SCX (PCA, kNN, etc.)" license.workspace = true diff --git a/scx-cli/Cargo.toml b/scx-cli/Cargo.toml index d1df572c..712a0380 100644 --- a/scx-cli/Cargo.toml +++ b/scx-cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "scx-cli" -version = "0.19.0" +version = "0.20.0" edition = "2021" description = "CLI tool for SCX: convert, info, validate" license.workspace = true diff --git a/scx-cloud/Cargo.toml b/scx-cloud/Cargo.toml index 70ddf233..43f54bcd 100644 --- a/scx-cloud/Cargo.toml +++ b/scx-cloud/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "scx-cloud" -version = "0.19.0" +version = "0.20.0" edition = "2021" description = "Cloud operations for SCX: pull, push, explode, pack, cloud-optimize" license.workspace = true diff --git a/scx-codec/Cargo.toml b/scx-codec/Cargo.toml index dfe6bb90..1179a7f6 100644 --- a/scx-codec/Cargo.toml +++ b/scx-codec/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "scx-codec" -version = "0.19.0" +version = "0.20.0" edition = "2021" description = "Compression codecs for SCX (Rice, FOR-BP, Delta-Golomb)" license.workspace = true diff --git a/scx-convert/Cargo.toml b/scx-convert/Cargo.toml index 309e83ea..d326c708 100644 --- a/scx-convert/Cargo.toml +++ b/scx-convert/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "scx-convert" -version = "0.19.0" +version = "0.20.0" edition = "2021" description = "External format <-> SCX conversion (h5ad, h5mu, MTX, 10x)" license.workspace = true diff --git a/scx-engine/Cargo.toml b/scx-engine/Cargo.toml index 31c9eb1c..a7deb42f 100644 --- a/scx-engine/Cargo.toml +++ b/scx-engine/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "scx-engine" -version = "0.19.0" +version = "0.20.0" edition = "2021" description = "Lazy query engine for SCX files" license.workspace = true diff --git a/scx-format-io/Cargo.toml b/scx-format-io/Cargo.toml index 8d862e6b..95cdc311 100644 --- a/scx-format-io/Cargo.toml +++ b/scx-format-io/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "scx-format-io" -version = "0.19.0" +version = "0.20.0" edition = "2021" description = "Runtime reader/writer, backed/streaming access, and shard codec dispatch for the SCX format" license.workspace = true diff --git a/scx-format/Cargo.toml b/scx-format/Cargo.toml index 52ac7a76..1f62bcac 100644 --- a/scx-format/Cargo.toml +++ b/scx-format/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "scx-format" -version = "0.19.0" +version = "0.20.0" edition = "2021" description = "On-disk layout/spec for the SCX format: header, catalog, shard structs, modality, codec selection (pure, no I/O)" license.workspace = true diff --git a/scx-gpu/Cargo.toml b/scx-gpu/Cargo.toml index ad64f3e2..13328348 100644 --- a/scx-gpu/Cargo.toml +++ b/scx-gpu/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "scx-gpu" -version = "0.19.0" +version = "0.20.0" edition = "2021" description = "GPU-accelerated codec decoding, cuSPARSE interop, and GPUDirect Storage for SCX" license.workspace = true diff --git a/scx-loader/Cargo.toml b/scx-loader/Cargo.toml index 85b89969..da4cb032 100644 --- a/scx-loader/Cargo.toml +++ b/scx-loader/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "scx-loader" -version = "0.19.0" +version = "0.20.0" edition = "2021" description = "ML training data loader for SCX files" license.workspace = true diff --git a/scx-mtx/Cargo.toml b/scx-mtx/Cargo.toml index 60d9eb00..e5856e8b 100644 --- a/scx-mtx/Cargo.toml +++ b/scx-mtx/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "scx-mtx" -version = "0.19.0" +version = "0.20.0" edition = "2021" description = "Matrix Market (MTX) I/O for SCX: read/write Cell Ranger MTX directories" license.workspace = true diff --git a/scx-ops/Cargo.toml b/scx-ops/Cargo.toml index c92e314c..62da341b 100644 --- a/scx-ops/Cargo.toml +++ b/scx-ops/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "scx-ops" -version = "0.19.0" +version = "0.20.0" edition = "2021" description = "File lifecycle operations (append, delete, compact, rollback, merge) for SCX files" license.workspace = true diff --git a/scx-sparse/Cargo.toml b/scx-sparse/Cargo.toml index 2838fa96..070e7fa8 100644 --- a/scx-sparse/Cargo.toml +++ b/scx-sparse/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "scx-sparse" -version = "0.19.0" +version = "0.20.0" edition = "2021" description = "CSR sparse matrix operations for SCX" license.workspace = true diff --git a/scx-testkit/Cargo.toml b/scx-testkit/Cargo.toml index 3a3e2b36..fb16e900 100644 --- a/scx-testkit/Cargo.toml +++ b/scx-testkit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "scx-testkit" -version = "0.19.0" +version = "0.20.0" edition = "2021" description = "Test-only harness for asserting SCX output identity across refactors" license.workspace = true