📍 Overview
PULPO is a Python package for Life Cycle Optimization (LCO) based on life cycle inventories. It is designed to serve as a platform for optimization tasks of varying complexity.
The package builds on top of the Brightway LCA framework and the Pyomo optimization modeling framework.
✨ Capabilities
Applying optimization is recommended when the system of study has (1) many degrees of freedom that would otherwise prompt the manual assessment of a large number of scenarios, or (2) any of the following capabilities is relevant to the goal and scope of the study:
- Specify technology and regional choices throughout the entire supply chain (fore- and background), such as the production technology of electricity or the origin of metal resources. Consistently accounting for background changes in large-scale decisions can be significant.
- Specify constraints on any activity in the life cycle inventories, interpreted as tangible limitations such as raw material availability, production capacity, or environmental regulations.
- Optimize for or constrain any impact category for which characterization factors are available.
- Specify supply values instead of final demands, which is relevant when only production volumes are known (e.g. here).
- Optimize under uncertainty via a dedicated pipeline: import and filter uncertain LCI parameters, apply uncertainty strategies, run Global Sensitivity Analysis (Sobol), perform Monte Carlo sampling, or solve Chance-Constrained programs to obtain Pareto-optimal solutions at user-defined probability levels.
Features recently completed:
ℹ️ Optimization under uncertainty [chance-constraints, Monte Carlo, global sensitivity analysis]ℹ️ Development of a GUI for simple optimization tasksLinkℹ️ Enable PULPO to work on both bw2 and bw25 projectsℹ️ Thorough documentation hosted on flechtenberg.github.io/pulpo/
Features currently under development:
ℹ️ Multi-objective optimization [bi-objective epsilon constrained, goal programming ...]ℹ️ Integration of economic and social indicators in the optimization problem formulation
Feature requests are more than welcome!
🔧 Installation
PULPO is available on PyPI. Depending on the version of Brightway you want to work with, install either the bw2 or bw25 variant:
pip install "pulpo-dev[bw2]"
or
pip install "pulpo-dev[bw25]"
🤖 Running PULPO
Use this link to start a cloud session and test PULPO right away:
The main reference is the PULPO showcase notebook, which revolves around methanol production and covers both the core optimization features (Sections 1–9) and the full workflow of the pulpo_unc module (Section 10): uncertainty data import and filtering, gap-filling strategies, Monte Carlo from prepared distributions, Chance-Constrained optimization, and Global Sensitivity Analysis.
Additional example notebooks are available for a hydrogen case, an electricity case, and a plastic case.
There is also a workshop repository (here) created for the Brightcon 2024 conference, with guided notebooks and exercises.
🧪 Tests
Run from the package folder:
python -m unittest discover -s tests
What's new in 1.6.1?
- Windows solve-hang fix — Unspecified limits are now truly infinite instead of ±1e20/±1e24, removing HiGHS bound warnings that deadlocked pyomo ≥ 6.6's output capture during model construction.
- Python 3.13 & numpy 2 — numpy 2 is unpinned (the
<2cap remains only in the legacybw2extra) and pyomo is relaxed to>=6.8,<7. - From 1.6.0: time-dependent optimization — The
pulpo.pulpo_timemodule (PulpoOptimizerTime) adds a time-indexed formulation with inter-timestep storage / carry-over, alongside several-times-faster model instantiation.
See the changelog for the full details and earlier releases.
🤝 Contributing
Contributions are very welcome. To request a feature or report a bug, please open an Issue. If you are confident in your coding skills, feel free to implement your suggestions and send a Pull Request.
📄 License
This project is licensed under the ℹ️ BSD 3-Clause License. See the LICENSE file for additional info.
Copyright (c) 2026, Fabian Lechtenberg. All rights reserved.
👏 Acknowledgments
We would like to express our gratitude to the authors and contributors of the following packages that PULPO builds upon:
We also acknowledge the pioneering ideas and contributions from the following works:
The development of PULPO culminated in the following publication, which details the approach and outlines its implementation:
Fabian Lechtenberg, Robert Istrate, Victor Tulus, Antonio Espuña, Moisès Graells, and Gonzalo Guillén‐Gosálbez.
“PULPO: A Framework for Efficient Integration of Life Cycle Inventory Models into Life Cycle Product Optimization.”
Journal of Industrial Ecology, October 10, 2024.
https://doi.org/10.1111/jiec.13561
Please cite this article if PULPO is used to produce results for a publication or project.
Authors
- @flechtenberg
- @robyistrate
- @vtulus
- Bartolomeus Haeussling Loewgren
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pulpo_dev-1.6.1.tar.gz.
File metadata
- Download URL: pulpo_dev-1.6.1.tar.gz
- Upload date:
- Size: 92.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
df76452dce64ebb83e211f17be03f50728df887adedceb6902216b9a05cd37b2
|
|
| MD5 |
a14a67f1f44e760f252090fe5c674cd8
|
|
| BLAKE2b-256 |
da5e020dfeaaeb5bee29be17f6eb5182f2036f4947c413ace90cbfbfd53594a7
|
File details
Details for the file pulpo_dev-1.6.1-py3-none-any.whl.
File metadata
- Download URL: pulpo_dev-1.6.1-py3-none-any.whl
- Upload date:
- Size: 90.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ef0078b55fc73cc456bcfedcb939e995d586b27e2dbb037609724fb136e41486
|
|
| MD5 |
03a6528d1b258b57c0bb99a1c4b789cd
|
|
| BLAKE2b-256 |
8512088c5eb926490280c662853ab541bf16ac6f894cc50d2b1494daa0f33047
|