pulpo

A Python-based optimization tool for life cycle assessment (LCA) that aims to import, optimize, solve, retrieve, save, and summarize LCA results.
https://github.com/flechtenberg/pulpo

Category: Industrial Ecology
Sub Category: Life Cycle Assessment

Keywords

brightway ecoinvent lca lifecycle optimization pyomo

Last synced: about 11 hours ago
JSON representation

Repository metadata

Python package for life cycle optimization

README.md

Jupyter
Python
Markdown

License
Last Commit
Commit Activity

PyPI - Version
GitHub Stars
launch - renku


📍 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 tasks Link
  • ℹ️ 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:

launch - renku

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 <2 cap remains only in the legacy bw2 extra) and pyomo is relaxed to >=6.8,<7.
  • From 1.6.0: time-dependent optimization — The pulpo.pulpo_time module (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


↑ Return


Owner metadata


GitHub Events

Total
Last Year

Committers metadata

Last synced: 3 days ago

Total Commits: 334
Total Committers: 3
Avg Commits per committer: 111.333
Development Distribution Score (DDS): 0.482

Commits in past year: 167
Committers in past year: 3
Avg Commits per committer in past year: 55.667
Development Distribution Score (DDS) in past year: 0.401

Name Email Commits
Fabian Lechtenberg f****g@u****u 173
flechtenberg f****g@c****h 86
Bartolomeus Haeussling Loewgren b****n@c****l 75

Committer domains:


Issue and Pull Request metadata

Last synced: 11 days ago

Total issues: 12
Total pull requests: 31
Average time to close issues: 8 months
Average time to close pull requests: about 23 hours
Total issue authors: 4
Total pull request authors: 2
Average comments per issue: 0.5
Average comments per pull request: 0.03
Merged pull request: 29
Bot issues: 0
Bot pull requests: 0

Past year issues: 1
Past year pull requests: 2
Past year average time to close issues: N/A
Past year average time to close pull requests: 2 days
Past year issue authors: 1
Past year pull request authors: 1
Past year average comments per issue: 0.0
Past year average comments per pull request: 0.5
Past year merged pull request: 0
Past year bot issues: 0
Past year bot pull requests: 0

More stats: https://issues.ecosyste.ms/repositories/lookup?url=https://github.com/flechtenberg/pulpo

Top Issue Authors

  • flechtenberg (9)
  • Blowgren (1)
  • akrestnik (1)
  • jacopocipriani (1)

Top Pull Request Authors

  • flechtenberg (29)
  • Copilot (2)

Top Issue Labels

  • enhancement (5)
  • bug (2)

Top Pull Request Labels

  • enhancement (2)

Package metadata

proxy.golang.org: github.com/flechtenberg/pulpo

  • Homepage:
  • Documentation: https://pkg.go.dev/github.com/flechtenberg/pulpo#section-documentation
  • Licenses: bsd-3-clause
  • Latest release: v1.6.1 (published 22 days ago)
  • Last Synced: 2026-08-01T10:16:27.240Z (4 days ago)
  • Versions: 11
  • Dependent Packages: 0
  • Dependent Repositories: 0
  • Rankings:
    • Dependent packages count: 5.395%
    • Average: 5.576%
    • Dependent repos count: 5.758%
pypi.org: pulpo-dev

Pulpo package for optimization in LCI databases

  • Homepage:
  • Documentation: https://pulpo-dev.readthedocs.io/
  • Licenses: bsd-3-clause
  • Latest release: 1.4.3 (published 10 months ago)
  • Last Synced: 2026-04-01T09:58:13.220Z (4 months ago)
  • Versions: 15
  • Dependent Packages: 0
  • Dependent Repositories: 0
  • Downloads: 70 Last month
  • Rankings:
    • Dependent packages count: 7.303%
    • Forks count: 29.948%
    • Average: 36.151%
    • Stargazers count: 38.914%
    • Dependent repos count: 68.439%
  • Maintainers (1)

Score: 9.122492281402987