Repository navigation
v0.19.0 — unscoreable perturbations left out, panels without target genes, co-expression metric
LatestInstall
pip install -U cell-eval2Requires 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
fullandde;minimalandanndatathroughdelta_pearson). Sixteen metrics, and theirde_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 anyfullordebaseline 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_manifestandscore_rowstorereplaced the v2 defaultmin_nonzerowithreplace_zeroat 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 newpreservepolicy: 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_zerowithauc_pval_floor_value: 1e-10reproduces 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 toNone. Rebuild any anchor or baseline built before 0.19.0 from a map with a"*"key or aNonevalue.
Added
- Panels whose perturbations have no target gene, such as drug doses or added cytokines. A
Nonevalue intarget_gene_mapdeclares that a label has no target gene,{"*": None}declares it for every label, and the CLI flag--no-target-genessets that wildcard. A declared label excludes nothing and is never matched to a gene by name. Before, 20 of the 54fullmetrics 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_corrandcell_cov_eig_ratio, in the newcellprofile. 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. Withground_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 inspectvalidates an entry, andcell-eval2 cache doctorchecks 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=...)validatespiece_idthe waypartial_outdoes.- The README and tutorial
score_cellstreamexamples 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.