LyoPRONTO is an open-source Python package for vial-scale lyophilization simulation and optimization. It models freezing and primary drying with heat and mass transfer equations, SciPy-based solvers, legacy web-interface compatibility helpers, and an additive typed Pint API.
A hosted web GUI is available at http://lyopronto.geddes.rcac.purdue.edu. The original video tutorial remains available on LyoHUB's YouTube channel.
From the repository root:
python -m pip install --upgrade pip setuptools wheel
python -m pip install -e .For development and tests:
python -m pip install -e ".[dev]"For documentation builds:
python -m pip install -e ".[docs]"For optional Pyomo development and manual Pyomo validation:
python -m pip install -e ".[dev,pyomo]"
idaes get-extensions --extra petscThe package metadata supports Python 3.8 and newer. GitHub Actions reads its
active CI Python version from .github/ci-config/ci-versions.yml.
The recommended executable examples live in examples/:
python examples/example_web_interface.py
python examples/example_optimizer.py
python examples/example_freezing.py
python examples/example_design_space.py
python examples/example_parameter_estimation.py
python -m examples.typed_api_examplesGenerated CSV and plot outputs are written under examples/outputs/ for the
modern examples. Historical scripts are preserved in examples/legacy/ for
backward compatibility.
For the file-oriented legacy workflow, edit main.py from the repository root
and run:
python main.pyThat path uses lyopronto.high_level helpers to save inputs, CSV outputs, and
plots from the selected simulation mode.
LyoPRONTO currently exposes four supported API layers:
- Legacy dict APIs:
calc_knownRp,calc_unknownRp,freezing,design_space,opt_Pch,opt_Tsh,opt_Pch_Tsh,functions, andconstant. - Typed Pint APIs:
typed,physical_properties,pikal,rf,fitting,cycle_time,eccurt, andvials. - High-level compatibility helpers:
read_inputs,save_inputs,execute_simulation,save_csv, andgenerate_visualizations. - Optional Pyomo prototypes:
lyopronto.pyomo_models.single_stepandlyopronto.pyomo_models.trajectory.
See docs/reference.md for current module boundaries and unit conventions.
The same reference page includes optional Pyomo model status and trajectory
discretization notes.
Run static analysis and the fast PR lane locally with:
python -m ruff check lyopronto tests examples main.py
python -m mypy lyopronto
pytest tests/ -n auto -v -m "not slow and not notebook and not pyomo"The full tracked validation lane is:
pytest tests/ -n auto -v -m "not pyomo" --cov=lyopronto --cov-config=.coveragerc.non-pyomo --cov-report=term-missing./run_local_ci.sh fast, ./run_local_ci.sh full,
./run_local_ci.sh slow, ./run_local_ci.sh notebook,
./run_local_ci.sh pyomo-light, and ./run_local_ci.sh pyomo mirror the
documented GitHub Actions lanes. Pyomo remains optional: the path-filtered
automatic Pyomo lane installs .[dev,pyomo] without IPOPT, while
solver-backed Pyomo validation stays optional.
Pull requests run static analysis and the fast SciPy lane by default. The Full
Validation workflow runs the full non-Pyomo lane for validation-sensitive code
and test changes, PRs labeled full-validation, nightly scheduled validation,
manual dispatch, and version tags. Pushes to main continue to run the full
non-Pyomo confidence gate.
All pytest lanes inherit --durations=25, --timeout=600, and
--timeout-method=thread from the shared pytest configuration through
pytest-timeout from the dev extra so hung tests fail clearly.
Build the documentation site with:
mkdocs buildFor contributor orientation and repository references, start with:
CONTRIBUTING.mdAGENTS.mddocs/README.mddocs/how-to-guides.mddocs/reference.mddocs/dev.mdtests/README.mdexamples/README.mdtest_data/README.mdbenchmarks/README.md
G. Shivkumar, P. S. Kazarin, A. D. Strongrich, and A. A. Alexeenko, "LyoPRONTO: An Open-Source Lyophilization PRocess OptimizatioN TOol", AAPS PharmSciTech (2019) 20: 328.
The paper is open access: https://link.springer.com/article/10.1208/s12249-019-1532-7.
Original authors: Gayathri Shivkumar, Petr S. Kazarin, and Alina A. Alexeenko. Maintained and updated by Isaac S. Wheeler.
Copyright (C) 2019, Gayathri Shivkumar, Petr S. Kazarin, and Alina A. Alexeenko.
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
By request, this software may also be distributed under the terms of the GNU Lesser General Public License (LGPL); for permission, contact the authors or maintainer.