Skip to content

v0.19.0 — unscoreable perturbations left out, panels without target genes, co-expression metric

Latest

Choose a tag to compare

@alexdobin alexdobin released this 16 Oct 19:46

Install

pip install -U cell-eval2

Requires Python 3.11+. The extras are unchanged — [gpu], [gpudge], [scale] — except that [scale] now also installs pyarrow>=15.

Competition scoring is unchanged

rule_version stays 3, and the competition rule digest and the score scales are bit-identical to 0.18.0's. Bundles built under rule_version 3 score under 0.19.0, and no vcc2026 number moves. Outside the competition profile some scores do move; see below.

Breaking changes — what to rebuild

  • A perturbation the reference cannot score is no longer scored (v2 full and de; minimal and anndata through delta_pearson). Sixteen metrics, and their de_deseq2_* versions, are gated on the reference alone: a perturbation with fewer than 10 reference-significant genes is left out of the aggregate instead of being given the metric's worst value. The left-out set is the same for every submission, and a prediction that fails inside the gate is still penalized. ⚠️ Rebuild any full or de baseline or ceiling built before 0.19.0; nothing detects a stale one. Warm result caches are invalidated automatically.
  • Partitioned PR/ROC AUC keeps tiny p-values in order. score_cellstream, score_h5ad_manifest and score_rowstore replaced the v2 default min_nonzero with replace_zero at 1e-10, whose float32 round-trip scored any p-value below about 7e-46 as 1e-10 — below a weaker 1e-20. They now use the new preserve policy: float64, floored at the smallest positive float64. Whole-table scoring and every default are unchanged. Recompute partitioned AUC baselines and ceilings; auc_pval_floor: replace_zero with auc_pval_floor_value: 1e-10 reproduces the old numbers.
  • Partial results written by 0.18.0 cannot be combined with partials written by 0.19.0.
  • target_gene_map: a "*" key now means "every label" and must map to None. Rebuild any anchor or baseline built before 0.19.0 from a map with a "*" key or a None value.

Added

  • Panels whose perturbations have no target gene, such as drug doses or added cytokines. A None value in target_gene_map declares that a label has no target gene, {"*": None} declares it for every label, and the CLI flag --no-target-genes sets that wildcard. A declared label excludes nothing and is never matched to a gene by name. Before, 20 of the 54 full metrics raised on such a panel; now all 54 score it. Gene panels are unchanged.
  • Single-cell co-expression metrics, opt-in and unscored: cell_cov_ccc, cell_cov_corr and cell_cov_eig_ratio, in the new cell profile. They compare the real and predicted gene–gene correlation structure across single cells, which no pseudobulk metric can see. They need raw cells, so only in-memory scoring computes them; the streaming and partitioned scorers refuse them.
  • A ground-truth DE cache for score_cellstream, off by default. With ground_truth_cache=<root>, every prediction scored against the same ground truth reuses one real-DE table, keyed by the archive's content checksum and every setting that changes the table. cell-eval2 cache inspect validates an entry, and cell-eval2 cache doctor checks a cache root.
  • de.auc_pval_floor: preserve, the policy partitioned scoring now uses.

Changed

  • score_cellstream(..., write_de=True) writes its DE tables through a pinned Parquet writer, in bounded memory, and publishes its five outputs together, rolling back on any error. Rows, values and columns are the same as 0.18.0's; the file bytes differ.

Fixed

  • partition_inmem.score_piece(de_out=...) validates piece_id the way partial_out does.
  • The README and tutorial score_cellstream examples now run as written.

Credits

Chris Carpenter contributed the single-cell co-expression metrics, following a specification by Hani Goodarzi. Abhinav Adduri found and fixed the partitioned AUC p-value floor. Joseph Min asked for panels without target genes. Beatrice Bevilacqua raised the problem of perturbations the reference cannot score. Nick Youngblut designed the ground-truth DE cache and the DE-table output contract.

Note on issue numbers

Issue and pull-request numbers in CHANGELOG.md refer to the internal development repository this tree was copied from, not to this one.