Repository navigation
Release v2.0.0
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.PlotResultsis removed; usereactea.visualization(see below).ChemUtils.smiles_to_img,ChemUtils.mol_to_imageandLoaders.load_results_caseare removed. - Results files changed: minimised objectives are now saved with their real sign (they were negated), in both
FINAL_*.csvandReactionMutationLogs.txt. Single-objective runs with several functions now have one correctly named column (e.g.0.3*n_rings + 0.7*qed). Paths inconfigs.yamlare saved as plain strings. - SweetReactor single-objective objective changed: it now includes
SimilarityToInitialwith 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.