Skip to content

chore(release): 3.12.0 - #121

Merged
wshlavacek merged 2 commits into
mainfrom
release/3.12.0
Oct 23, 2026
Merged

wshlavacek merged 2 commits into
mainfrom
release/3.12.0

Conversation

@wshlavacek

Copy link
Copy Markdown
Collaborator

This PR closes the changelog's Unreleased section as 3.12.0 and moves CMakeLists.txt, pyproject.toml and CITATION.cff off 3.11.0 together. A second commit brings RELEASING.md up to date with how 3.11.0 was cut.

Minor, not patch

Models observe this release. Results change for:

An embedder also gains a capability, run_ensemble() (#113). Either alone makes it at least a minor, as 3.10.0 and 3.11.0 were.

Minor, not major

include/ moved only by addition: Simulator::run_ensemble() and the EnsembleSpec and EnsembleResult structs it takes and returns. Every other line in the include/ diff is comment text. No existing declaration changed, so every existing call, bngsim's and PyBNF's included, compiles unchanged and means what it did.

librulemonkey now links Threads::Threads privately. RuleMonkeyConfig.cmake re-finds it for find_package() users, and an add_subdirectory() consumer such as bngsim gets it from RuleMonkey's own find_package(Threads).

The Tier-0 Arrhenius refusal changes scope. 3.11.0 ran several context shapes at the wrong rate with no warning. Each now runs at BioNetGen's rate or is refused with the rule and the reason named; the changelog lists the shapes still refused. The Tier-0 refusal of a local rate law that reads reactant_N() now also covers one that reaches it through a helper. One load-time warning is new: an energy pattern whose rate bound stays loose after the per-class split (#109).

Five runtime errors are new, each on an input that used to run wrong silently:

Not listed

The BNGsim re-vendor is tracked in #118 (lanl/bngsim#1058), which also drops bngsim's refuse_rulemonkey_energy_misreads. lanl/bngsim#1059 drops bngsim's elapsed-time shift once this is vendored.

Verified

The date is 2026-10-22. If this merges on a later day, the changelog heading and CITATION.cff date-released move with it.

Four places had drifted from practice:

- It said to squash-merge the release PR.  3.11.0 (#101) and the PRs
  around it were merged with merge commits, so the release commit keeps
  its message on main.
- It said to tag the squashed release commit.  3.11.0's tag is on the
  merge commit, f11c251, after checking that its tree matches the
  release commit's, and BNGsim's VENDOR.json records f11c251.  The
  check is now written into step 5.
- It counted nine CI checks.  The tsan job from #114 makes ten.
- It ran pre-commit as .venv/bin/pre-commit, which assumes the .venv
  the README describes.  Any pre-commit works, since it installs its own
  pinned hooks.

It also notes that the release date is written twice, so a release PR
that merges a day late moves both.
Closes the 3.12.0 section of the changelog and moves the four version
anchors (CMakeLists.txt, pyproject.toml, CITATION.cff, CHANGELOG.md).

What the section contains
-------------------------

Added: replicate ensembles, run_ensemble() and rm_driver --reps (#113).
Fixed: Arrhenius rules whose energy-pattern context the load-time
expansion could not represent run at BioNetGen's rate, or are refused
with the rule and the reason named (#109); a rule labelled _reverse_X
takes the reverse half's phi only when the model has the mirror rule X
(#109); a run from a late t_start keeps its waiting times (#110); a
session that reaches an absorbing state moves its clock to t_end; an
infinite t_end and a NaN in sample_times are refused; simulate(TimeSpec)
refuses a t_end before the session's time; functions settle in
dependency order, and a TFUN indexed by a function no longer overflows
the stack (#111); a function that reads a table function gets its whole
expression; a rate law that reads reactant_N() through a helper function
fires at its own rule's count (#59).

Why minor
---------

Models observe this release.  Results change for every Arrhenius model
whose context the expansion could not represent (48 to 52 standard
errors off BioNetGen's network on #109's reproducers), for every model
whose XML lists a function ahead of one it reads (#111), for every rate
law that reaches reactant_N() through a helper (#59), and for runs from
a t_start late enough that waiting times rounded away (z = -290 from
1e12, #110).  An embedder also gains a capability, run_ensemble().
Either alone makes it at least a minor, as 3.10.0 and 3.11.0 were.

include/ moved only by addition:

    git diff --stat v3.11.0..HEAD -- include/
     include/rulemonkey/simulator.hpp | 61 ++++++++++++++++++++++++++++++++++++----
     include/rulemonkey/types.hpp     | 48 ++++++++++++++++++++++++++++++-
     2 files changed, 102 insertions(+), 7 deletions(-)

Apart from comment text, every line is new: Simulator::run_ensemble()
and the EnsembleSpec and EnsembleResult structs it takes and returns.
No existing declaration changed, so every existing call, bngsim's and
PyBNF's included, compiles unchanged and means what it did.  That is
not a major.  librulemonkey now links Threads::Threads privately;
RuleMonkeyConfig.cmake re-finds it for find_package() users, and an
add_subdirectory() consumer such as bngsim gets it from RuleMonkey's own
find_package(Threads).

The Tier-0 Arrhenius refusal (RateLaw@type=Arrhenius) changes scope.
3.11.0 ran several context shapes at the wrong rate with no warning;
each now runs at BioNetGen's rate or is refused by name, and the shapes
still refused are listed in the changelog.  The Tier-0 refusal of a
local rate law that reads reactant_N() now also covers one that reaches
it through a helper.  One load-time warning is new: an energy pattern
whose rate bound stays loose after the per-class split (#109).  Five
runtime errors are new, each on an input that used to run wrong
silently:
- a function that depends on itself, through the functions it reads or
  a table counter (#111);
- a non-finite t_end on run(), simulate(), step_to(), run_ensemble()
  or parameter_scan();
- a NaN segment start on simulate();
- a NaN in TimeSpec::sample_times;
- simulate(TimeSpec) with a t_end before the session's time.

Not listed
----------

The expression-layer refresh to BNGsim 4361958 (#120) is not
changelogged, as RELEASING.md says for a contents refresh.  It is what
lets BNGsim vendor this release: vendor_rulemonkey.py's
EXPRTK_SYNC_FILES guard matches bngsim main again.  The RELEASING.md
update in this PR is docs.  The BNGsim re-vendor is #118
(lanl/bngsim#1058), which also drops bngsim's
refuse_rulemonkey_energy_misreads; lanl/bngsim#1059 drops bngsim's
elapsed-time shift once this is vendored.  PyPI remains out of scope.
Neither rulemonkey nor rulemonkey-harness is a distribution (#77).

Verified: ctest --preset release 67/67 (57 at 3.11.0; the ten new
cases are ensemble_test, ensemble_scheduler_test, rm_driver_reps_mean,
rm_driver_reps_refuses_species and rm_driver_reps_sd_out_unwritable
(#113), arrhenius_context_test and energy_match_test (#109),
late_start_test (#110), function_settle_order_test (#111) and
reactant_count_helper_test (#59); the bng_oracle case now also scores
arrhenius_context and arrhenius_context_bind, and arrhenius_formula
gains seven columns (#109));
RuleMonkeyConfigVersion.cmake reports PACKAGE_VERSION "3.12.0" after
cmake --preset release on this commit; mkdocs build --strict
(mkdocs-material 9.5) clean; pre-commit on CHANGELOG.md CMakeLists.txt
pyproject.toml CITATION.cff passes.
@wshlavacek
wshlavacek merged commit 9df2984 into main Oct 23, 2026
10 checks passed
@wshlavacek
wshlavacek deleted the release/3.12.0 branch October 23, 2026 02:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant