Repository navigation
·
2 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
Removed
- Breaking:
li.mt.lric(pair_chunk=...)is removed, after being deprecated and ignored in 2.0.0. - Breaking:
li.mt.lric(transform_fn=...)is removed. Its default, mean-normalising each gene to 1, was redundant: after introducing analytical normalisation for the area of interest, any per-gene rescaling cancels exactly in every LRIC ratio (g,g_expr). To weight by a nonlinear transform of expression, store it as a layer and pass it -- e.g.adata.layers["sqrt"] = np.sqrt(adata.X), thenli.mt.lric(..., layer="sqrt"). Unliketransform_fn, a layer goes through the non-negativity check.
Changed
- Permutation-based methods now reject
n_permsvalues that are0, negative or not integers with a clearValueError;Noneskips permutations. - The permutation statistics behind
cellphonedb,cellchat,geometric_meanandrank_aggregatep-values are gathered and reduced a block of permutations at a time instead of as one(2, n_perms, n_interactions)tensor, so their peak memory no longer scales withn_perms(#282, by @pwwang). P-values are bit-identical for a given seed. Peak RSS / wall time,cellphonedb, MacBook Pro M3, 24 GB: 462k interactions, 1000 permutations 14.7 GB / 27 s -> 1.6 GB / 9 s; 4.2M interactions, 300 permutations 15.2 GB (memory-bound) / 510 s -> 3.7 GB / 35 s. Up to ~15% slower when the whole tensor fits in memory. Internally, the pipeline now owns the permutation test: a permutation-based method only declares how it combines ligand and receptor statistics (MethodMeta(combine=...)), plus an optional observed-only adjustment (observed_fn=, CellPhoneDB's zero mask), instead of each method re-implementing proximity weighting and p-value counting.
Fixed
- Explicit zeros stored in a sparse
Xno longer count as expressing cells inligand_props/receptor_props(and thusexpr_prop).li.pp.zi_minmaxnow prunes its sub-cutoff zeros, so with it asx_transform/y_transformfar fewer interactions passexpr_prop. - MISTy raises if a view's
obs_namesdiffer from the intra-view's; views were paired by row position, so a reordered view gave silently wrong results. li.mt.lric/li.mt.cross_pcf: pairs exactly on a radius-tile edge (e.g. gridded spots withradius_stepequal to the spacing) no longer drift into the neighbouring tile; the number of annuli isfloor(max_radius / radius_step), so float steps no longer add a spurious annulus (e.g. 0.3 / 0.1) andmax_radius < radius_stepraises.li.mt.get_lric_aucnormalises by the radial width it actually integrates, so an empty interior bin no longer pulls the score toward 0.- Docs build with
sphinx-autodoc-typehints>=3.17(thealias_typehintsshim is removed); README and decision-tree links point toliana.readthedocs.io(#283). - The pyCrossTalkeR tutorial runs in CI again; the
tutorialsextra requirespycrosstalker>=2.1.8(#271).