Added
-
Tree.run()runs the search to completion and returns the tree, replacing the
list(tree)idiom. Iterating aTreestill yields the per-iteration
(is_solved, node_ids)for progress display or early stopping. -
An agent skill at
skills/synplanner-usage/, in the
Agent Skills open format, giving AI coding assistants
the chython-versus-RDKit boundary, the API entry points and the recommended
defaults. It ships with a task index mapping around thirty tasks to the calls
each one needs; both are published in the documentation and indexed by
llms.txt. -
"Running a search" on the MCTS page and "Two ways to map" on the
standardization page, the latter covering when reaction mapping needs a GPU. -
Added
synplan.chem.reaction.routesas the public route post-processing layer for route
clustering, route quality, RouteCGR utilities, route I/O, analysis, depiction,
and notebook plotting. -
Added typed RouteCGR and route-export contracts, including
RouteCGRBuildResult,RouteExportResult, route diagnostics, and strict
export failure handling while preserving the existing JSON and CSV shapes. -
Added
synplan.chem.reaction.routes.representationto group RouteCGR builder, container,
depiction, state, hashing, and native deconvolution helpers. -
Added route-aware RouteCGR composition with
route_ordermetadata on dynamic
atoms and bonds, transient bonds for bonds formed and later removed during a
synthetic route, and compact per-step labels for reconstructing mapped route
reactions from the RouteCGR itself. -
Added exact RouteCGR hashing in
synplan.chem.reaction.routes.representation.hash, including a
fast WL bucket hash followed by exact canonical confirmation for shared
buckets. -
Added RouteCGR comparison helpers for identifying overlapping and unique route
IDs across route dictionaries whose route IDs do not need to match. -
Added RouteCGR analysis helpers for selected building-block lookup and real
versus supporting pseudo-reactant usage statistics. -
Added native RouteCGR deconvolution APIs (
routes_dict_from_route_cgrs()and
reactions_from_route_cgr()). -
Added
synplan.chem.reaction.routes.clusteringas a package, with clustering logic in
synplan.chem.reaction.routes.clustering.coreand route marker helpers in
synplan.chem.reaction.routes.leaving_groups. -
Added
synplan.chem.reaction.rulesandsynplan.chem.reaction.rules.representation
as the public homes for rule analysis, extraction, priority rules, and Chython
QueryCGR/Morgan rule representations. -
Added MHN ranking policy support (
architecture: mhn_ranking) with QueryCGR
rule fingerprints by default, optional QueryCGR rule-graph encoding with GPS,
bounded runtime rule-association caches, dynamic runtime rule-set scoring, and
checkpoint migration for the redesigned policy networks. -
Added
synplan mhn_network_tuningfor fine-tuning an already trained MHN
ranking checkpoint on new rule policy data. -
Added policy/network modules for pure policy wrappers, graph embedders,
checkpoint loading, featurization caches, and Lightning-based supervised
training utilities. -
Added MHN ranking configuration, policy documentation, CLI documentation, and
Tutorial 14 for MHN training/tuning workflows. -
Added strict Chython-to-RDKit SMARTS conversion with reverse diagnostics and
semantic-loss reporting for strict round-trip validation. -
Added the
mhnreact_rdkitrule-fingerprint mode for MHN ranking, using the
original RDKit path-fingerprint template encoding. -
Added
Tree.save_pickle(path)for direct tree persistence and the
synplan-convert-protection-datacommand for protection source-data conversion. -
Added API documentation for
synplan.chem.reaction.routes.
Changed
-
Pinned
chython-synplanto 1.101, which closes the interpreter-exit hang: any
process importing chython previously finished its work and never exited. -
Raised CVE floors for eleven transitive dependencies (GitPython,
jupyter-server, jupyterlab, pillow, mistune, aiohttp, bleach, idna, pyasn1,
python-multipart, soupsieve) and relocked with a seven-day cooldown on newly
published releases. -
Reorganised the maintainer documentation under
docs/development/, splitting
local setup, pull-request review and the release checklist, which now lists
the gates CI enforces. -
Requires
chython-synplan1.100, pinned exactly. Its SMARTS parser now reads
92% of real-world patterns instead of 57%, and three primitives follow
Daylight rather than chython's own reading: an unmarked charge is
unconstrained,Ais any aliphatic atom where*is any atom, andxis
ring connectivity where the heteroatom count it used to mean is nowy.
Rules written against the old meanings ofAandxneed updating. -
Supports Python 3.14, which chython 1.100 is the first release to ship wheels
for. Python 3.15 is out of reach until torch, rdkit, numpy and chytorch
publish cp315 wheels. -
Verifies chython ring-connectivity queries against RDKit's
AtomRingBondCount
during rule conversion instead of passing them through unchecked; only
rings_countand heteroatom queries stay unverifiable. -
Dropped the
exclude-newerresolution cutoff; the exactchython-synplanpin
is what holds the lock steady now. -
Moved route clustering, route analysis, route depiction, route I/O, notebook
plotting, route-quality scoring, and RouteCGR implementation to
synplan.chem.reaction.routes. -
Moved reaction-rule analysis, extraction, priority-rule parsing, and rule
representation helpers undersynplan.chem.reaction.rules. -
Moved MCTS expansion wrappers into
synplan.mcts.policy, separating generic
policy selection from MHN-specific dynamic rule-association preparation. -
Split ML graph embedders, policy networks, checkpoint loading, featurization,
and training helpers into focused submodules undersynplan.ml. -
Updated internal imports, tests, tutorials, Colab notebooks, API docs, and
migration notes to use the new route, rule, policy, and ML module layout. -
Centralized route parent-chain traversal for tree, visualisation, and RDKit
route conversion while preserving their existing output formats. -
compose_route_cgr()now uses a fast default path that returns the RouteCGR
without eagerly reconstructing reactions; callers that need the debug
reactions_dictcan request it explicitly or deconvolute from the RouteCGR. -
RouteCGR composition now assumes route-level atom mapping: the same atom-map
number must identify the same atom throughout a route, while independently
mapped local reaction steps are outside the supported input contract. -
MHN light prediction keeps the rollout-friendly integer rule-count API; dynamic
MHN rule associations are prepared by the fullpredict_reaction_rules()path.
Fixed
-
Removed the force-exit hook from
tests/conftest.py. It worked around the
chython exit hang and is unnecessary with 1.101; pytest now gets its normal
teardown instead of being terminated before it can flush. -
Four shipped configuration files could not be loaded at all, because every
config model forbids unknown keys and nothing checked that the files parse:
the two combined-policy configs carriedpriority_rules_fraction, which
belongs to a different model,mhn_ranking_policy_training.yamlused
rule_encoder_typewhere the field isrule_embedding_type, and
planning_value.yamlwas unreachable because the planning CLI merged the
node_evaluationsection into the tree config. Loading every shipped config
is now a test. -
Protecting-group selection cannot protect aldehydes, ketones, alpha-halo
ketones or phthalimide-protected amines. Nine of the twenty-five published
templates attach at two points, which acetals and dithianes need because they
replace the carbonyl double bond rather than substituting onto it, and the
product builder adds a single bond and deletes nothing. Eighteen reactive
functions allow only those templates, so they have no protection option at
all. The table is unchanged and the loader now says this once at startup
rather than failing quietly at each call. -
The functional-group patterns in
extraction_functional_groups.yamlusedA
to mean any atom, which chython 1.100 reads as any aliphatic atom, so they
silently stopped matching aromatic neighbours such as benzaldehyde and
styrene. They now use*. -
Route JSON export now recovers precursor nodes whose producing fragment is
structurally identical to the consuming reactant even when atom-number overlap
with the final target is absent, and drops malformed routes instead of emitting
JSONnullchildren. -
QueryCGR rule fingerprints and QueryCGR rule graphs preserve important query
constraints, including degree, hydrogen-count, ring-size, set-valued atom
labels, and dynamic bond semantics. -
Runtime MHN rule-association caches are bounded and keyed by the ordered rule
SMARTS plus the rule representation contract.
Removed
- Removed deprecated route compatibility namespaces:
synplan.routes,
synplan.routes.quality, andsynplan.route_quality. - Retained
synplan.chem.reaction_routesas a deprecated forwarding namespace
for the historicalmain-branch route module paths. - Removed
TreeWrapper; useTree.save_pickle(path)instead. - Removed the old flat
synplan.mcts.expansionandsynplan.ml.networks.policy
modules in favor of the new policy/network package layout.