From 2497f9bbc642ccdb65e7f5c3a5678e57345fae0c Mon Sep 17 00:00:00 2001 From: Remis Lape Date: Fri, 11 Sep 2026 14:47:41 +0100 Subject: [PATCH] Release 1.2.0 Seven merged pull requests have been waiting since 1.1.0, and one of them is now blocking work elsewhere: HJCFIT's fitting layer is duck-typed on a mechanism and needs Rate.is_free, which exists here on master and not in the published 1.1.0. Its [fitting] extra pins scalcs>=1.1.0, which is too loose -- the integration tests fail on the released wheel with "'Rate' object has no attribute 'is_free'". A minor rather than a patch release, because it corrects computed values as well as adding API. #17 root bracketing for the asymptotic pdf. Counts were not recomputed when a search bound moved, widening happened once where it needed to repeat, and the upper bound was compared against the wrong state count. det[W(s)] is also unusable at large |s|, where it is of order 1e53 and changes sign hundreds of times in noise, so roots are now refined by bisecting the eigenvalue count where the determinant cannot be trusted. Roots are validated before being returned. #18 scsim re-exports burst segmentation from dcio; one implementation in the stack rather than two. #20 the dARSdS sign. exact_mean_open_shut_time was too large by exactly twice the dead time and the conditional means by once. This changes numbers a caller will have seen. #21 impose_resolution checked against RESHJC2.FOR interval for interval. #22 the simulator checked against Q-matrix theory for multi-state mechanisms, not only the two-state case where a reciprocal rate is the answer. #23 qmatlib.H inverted sI - QFF directly, which fails where the root search walks. The singularity is removable; only the factored form has a pole. #24 GPL-2.0-or-later rather than GPL-2.0-only, without which HJCFIT (GPL-3.0-or-later) could not depend on this at all. Both version files are bumped; the versions-agree gate added in #16 is what makes that hard to get wrong. Verified: the built wheel reports 1.2.0, carries its three data files, declares GPL-2.0-or-later, and Rate.is_free is present when installed from it into a clean environment. Co-Authored-By: Claude Opus 5 --- pyproject.toml | 2 +- scalcs/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 05485a2..152a1c1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "scalcs" -version = "1.1.0" +version = "1.2.0" description = "Pure-Python Q-matrix formalism for ion channel kinetics" authors = [ { name = "Remigijus Lape", email = "r.lape@ucl.ac.uk" }, diff --git a/scalcs/version.py b/scalcs/version.py index 4e16b67..bd00743 100644 --- a/scalcs/version.py +++ b/scalcs/version.py @@ -1,3 +1,3 @@ -__version__ = "1.1.0" +__version__ = "1.2.0" version = __version__ # backward-compat alias full_version = __version__ # backward-compat alias