Skip to main content

bw-functional

PyPI Status Python Version License

Read the documentation at https://multifunctional.readthedocs.io/ Tests Codecov

pre-commit Black

Adding functions to Brightway processes

Installation

You can install bw-functional via [pip] from [PyPI]:

$ pip install bw-functional

The intended conda install is from conda-forge (pending acceptance of the feedstock PR):

$ conda install -c conda-forge bw-functional

The package remains available for now on the private LCA Anaconda channel, but that channel is deprecated in favor of conda-forge. Prefer conda-forge once the package appears there.

Usage

Multifunctional activities can lead to linear algebra problems which don't have exactly one solution. Therefore, we commonly need to apply a handling function to either partition such activities, or otherwise manipulate their data such that they allow for the creation of a square and non-singular technosphere matrix.

This library is designed around the following workflow:

Users create and register a bw_functional.FunctionalSQLiteDatabase. Registering this database must include the database metadata key default_allocation, which refers to an allocation strategy function present in bw_functional.allocation_strategies.

import bw_functional
mf_db = bw_functional.FunctionalSQLiteDatabase("emojis FTW")
mf_db.register()

Multifunctional process(es) are created and written to the FunctionalSQLiteDatabase. A multifunctional process is any process with multiple "functions", either outputs (products) and/or input (reducts).

mf_data = {
    ("emojis FTW", "😼"): {
        "type": "product",
        "name": "meow",
        "unit": "kg",
        "processor": ("emojis FTW", "1"),
        "properties": {
            "price": {'unit': 'EUR', 'amount': 7, 'normalize': True},
            "mass": {'unit': 'kg', 'amount': 1, 'normalize': True},
        },
    },
    ("emojis FTW", "🐶"): {
        "type": "product",
        "name": "woof",
        "unit": "kg",
        "processor": ("emojis FTW", "1"),
        "properties": {
            "price": {'unit': 'EUR', 'amount': 12, 'normalize': True},
            "mass": {'unit': 'kg', 'amount': 4, 'normalize': True},
        },
    },
    ("emojis FTW", "1"): {
        "name": "process - 1",
        "location": "somewhere",
        "exchanges": [
            {
                "type": "production",
                "input": ("emojis FTW", "😼"),
                "amount": 4,
            },
            {
                "type": "production",
                "input": ("emojis FTW", "🐶"),
                "amount": 6,
            },
        ],
    }
}

LCA calculations can then be done as normal. See dev/basic_example.ipynb for a simple example.

Substitution

WORK IN PROGRESS

Built-in allocation functions

bw-functional includes the following built-in allocation functions:

  • manual_allocation: Does allocation based on the "allocation" field of the Product. Doesn't normalize by amount of production exchange.
  • equal: Splits burdens equally among all functional edges.

You can also do property-based allocation by specifying the property label in the allocation field of the Process.

Technical notes

Process-specific allocation strategies

Individual processes can override the default database allocation by specifying their own allocation:

import bw2data as bd
node = bd.get_activity(database="emojis FTW", code="1")
node["allocation"] = "mass"
node.save()

How does it work?

Recent Brightway versions allow users to specify which graph nodes types should be used when building matrices, and which types can be ignored. We create a multifunctional process node with the type multifunctional, which will be ignored when creating processed datapackages. However, in our database class FunctionalSQLiteDatabase we change the function which creates these processed datapackages to load the multifunctional processes, perform whatever strategy is needed to handle multifunctionality, and then use the results of those handling strategies (e.g. monofunctional processes) in the processed datapackage.

We also tell MultifunctionalDatabase to load a new ReadOnlyProcess process class instead of the standard Activity class when interacting with the database. This new class is read only because the data is generated from the multifunctional process itself - if updates are needed, either that input process or the allocation function should be modified.

Contributing

Contributions are very welcome. To learn more, see the Contributor Guide.

License

Distributed under the terms of the BSD 3 Clause license, multifunctional is free and open source software.

Issues

If you encounter any problems, please file an issue along with a detailed description.

Building the Documentation

You can build the documentation locally by installing the documentation Conda environment:

conda env create -f docs/environment.yml

activating the environment

conda activate sphinx_multifunctional

and running the build command:

sphinx-build docs _build/html --builder=html --jobs=auto --write-all; open _build/html/index.html

Metadata

Release files for bw-functional 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for bw-functional 0.1.0
File Size Uploaded
bw_functional-0.1.0.tar.gz 27.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for bw-functional 0.1.0
File Interpreter ABI Platform
bw_functional-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 50.4 kB

Release files / bw_functional-0.1.0.tar.gz

Download URL bw_functional-0.1.0.tar.gz
Size 27.4 kB
Tags Source
SHA-256 checksum
How to use checksums
a254639c490cbd905500ca2935fdd1c0c5abf65bd6a7e5e51f583d1a7f9ea19b
BLAKE2b-256 checksum
How to use checksums
28da43e28259d0b676495d5e53de42b985bf3cf4a68fed4c2f4902e1da99681b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / bw_functional-0.1.0-py3-none-any.whl

Download URL bw_functional-0.1.0-py3-none-any.whl
Size 23.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
28f36fea7bb04869ffece49b2820b3347589aa254c4c7cc1784ae03c11af166c
BLAKE2b-256 checksum
How to use checksums
87c84150f1f3ddb4ed2971492f839c4c243c5ed322e280532d26c32c0ad97c30
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page