Skip to content

Release v2.0.0

Choose a tag to compare

@github-actions github-actions released this 25 Oct 09:11

ReactEA 2.0.0

Modernised ReactEA: Python 3.11+, current dependencies, a new route plotting module, and many bug fixes.

⚠️ Breaking changes

  • Python 3.11+ required (3.11–3.14 supported). Dependencies upgraded to numpy 2, pandas 3, RDKit 2026.9 (rdkit-pypi → rdkit), jmetalpy 1.9.
  • Plotting API replaced: reactea.vizualization.PlotResults is removed; use reactea.visualization (see below). ChemUtils.smiles_to_img, ChemUtils.mol_to_image and Loaders.load_results_case are removed.
  • Results files changed: minimised objectives are now saved with their real sign (they were negated), in both FINAL_*.csv and ReactionMutationLogs.txt. Single-objective runs with several functions now have one correctly named column (e.g. 0.3*n_rings + 0.7*qed). Paths in configs.yaml are saved as plain strings.
  • SweetReactor single-objective objective changed: it now includes SimilarityToInitial with the intended weights. Before, the weights were silently replaced by equal weights.
  • RandomSearch changed: it is now a random walk with reaction rules. Before, it only returned the seed.
  • Evaluation runs serially by default. For expensive functions, pass n_jobs=-1 (e.g. Docking(target, n_jobs=-1), evaluation_functions_wrapper(..., n_jobs=-1)).

New

  • Route plotting: draw each solution's route as a reaction scheme, with aligned structures, highlighted changes, EC numbers and co-reactants on the arrows, and scores. Export as SVG or PNG.
    from reactea.visualization import load_routes, draw_route, save_routes
    routes = load_routes('output_dir/EXP/NSGAII')
    draw_route(routes[0]).save('route.svg')
    Or set save_routes: True in the config to save all routes at the end of a run.
  • Project managed with uv; run_reactea accepts a config dict and respects visualize.
  • README documents all configuration options and the results files.

Fixes

  • Out-of-memory crashes: reaction rules are compiled the first time they're used (rule loading went from 2.8 GB to 374 MB).
  • Single-objective SweetReactor crashed with numpy ≥ 1.24.
  • Non-elitist ES (elitist: False) never evolved.
  • Reactions with more than 1,000 matches (e.g. a compound reacting with itself) only ever modified the first atoms of the molecule; the products are now sampled across the whole molecule.
  • Live Pareto plot (visualize) showed the worst solutions; also fixed for matplotlib 3.11.
  • The CLI no longer requires the verbose and visualize keys.
  • SimilarityToInitial crashed on invalid molecules (numpy 2); deprecated RDKit fingerprint APIs replaced with identical results.
  • IBEA compatibility with jmetalpy 1.9; example configs fixed.

Performance

  • Python 3.14 is no longer ~5× slower (joblib loky backend).
  • PenalizedSweetness loads the DeepSweet models once instead of on every evaluation.
  • SAS no longer slows down over long runs.