# Cutoff system model¶

The distinguishing features of the cutoff system model are that waste producers pay the full cost of waste treatment or disposal, and that economic allocation is used to split most multioutput activities.

The cutoff system model consists of a few major steps, each of which is broken up into multiple transformation functions.

## Data validation¶

The first step is to do some basic data validation. We will also do validation for specific types of datasets or specific stages of the system model later on.

ocelot.transformations.parameterization.variable_names_are_unique(data)

Variable names must be globally unique within a dataset, including properties, exchanges, production volumes, and parameters.

Raises ParameterizationError if duplicates are found.

ocelot.transformations.validation.ensure_markets_only_have_one_reference_product(data)

Markets are only allowed to have one reference product exchange.

Raises InvalidMarket if zero or multiple outputs were found.

ocelot.transformations.validation.ensure_markets_dont_consume_their_ref_product(data)

Markets aren’t allowed to consume their own reference product.

Raise InvalidMarketExchange if such an exchange is found.

Direct (activity) links are excepted from this rule.

## Data cleanup¶

The first step in data cleanup is to apply the generic functions for parameter and formulas.

### Exchange manipulations¶

We can remove some exchange data which is not used in the cutoff system model.

ocelot.transformations.cutoff.cleanup.remove_consequential_exchanges(data)

Remove exchanges with have a consequential property with a value of 1.

These exchanges are not used in the cutoff system model.

Delete hard (activity) links from reference product exchanges.

Also drops activity links from dropped product exchanges, as these have amounts of zero and were formerly reference products.

These links have no meaning in the cutoff system model.

Hard links, or activity links, are links between a consuming and producing activity which exist outside the normal system model linking rules. These links are already included in the undefined datasets, and are specified by dataset authors.

The next function makes sure that we can successfully resolve these hard links in our supply chain graph.

Check whether hard (activity) links can be resolved correctly.

In order to make sure we get the correct exchange, hard links must be to either a reference product exchange or an allocatable byproduct. We can safely ignore other exchanges, e.g. losses, with the same product name if this condition is met.

Raises UnresolvableActivityLink if an exchange can’t be found.

We end the manipulation step with two functions related to the treatment of wastes and recyclables.

ocelot.transformations.cutoff.wastes.create_recycled_content_datasets(data)

Create new datasets that consume the recyclable content from recycling or waste treatment activities in the cutoff system model.

In the cutoff system model, no credit is given for the production of recyclable materials. Rather, consumers get these materials with no environmental burdens. So the production of a recyclable material (i.e. a flow with the classification recyclable) during any transforming activity will create a new flow which has no consumer. This function creates consuming activities for these flows. These new activities have no environmental burdens, and serve no purpose other than to balance the output of a recyclable material.

ocelot.transformations.cutoff.wastes.flip_non_allocatable_byproducts(dataset)

Change non-allocatable byproducts (i.e. classification recyclable or waste) from outputs to technosphere to inputs from technosphere.

This has no effect on the technosphere matrix, and should not change the behaviour of any transformation functions, which should be testing for classification instead of exchange type. However, this is the current behaviour of the existing ecoinvent system model.

Production of recyclable materials are handled by the function create_recycled_content_datasets, which creates consuming activities for these materials. Production of wastes will be handled by existing waste treatment activities.

Change something from an output to an input requires flipping the sign of all numeric fields.

## Split multioutput activities¶

### Introduction¶

There are a number of choices to be made when constructing an individual dataset, including what the inputs and outputs of a process are. From a mathematical point of view, the different is simple: inputs have a negative number in the technosphere matrix, while outputs have a postive number. The corresponds to our physical understanding of the system, where inputs are consumed and outputs are produced. However, things are never that simple - for example, in a waste treatment process, it is common to consider the treated waste as an output (with a negative sign), even though it is consumed.

In Ocelot, at least in the current version, we don’t make these choices ourselves - the inputs and outputs are defined in the undefined datasets, and our job is instead to handle multioutput datasets so that our constructed technosphere matrix is not singular.

In the undefined datasets, we distinguish between two types of outputs: reference products and byproducts. In general, reference products are the reason that producers do a transforming activity (which is why each dataset must have at least one reference product), and byproducts are what comes along for the ride. However, as with many of the definitions used in LCA, what was a sharp diving line from a distance tends to blur a bit at the boundaries.

We further distinguish three types of products (both reference and byproducts): allocatable, recyclable and waste. Formally, in the internal data format, outputs will have a type of either reference product or byproduct, and a byproduct classification of allocatable product, recyclable, or waste.

In the cutoff approach, the difference between reference products and byproducts lies in how we split multiple outputs of each.

• If we have multiple reference products, we assume that these datasets are parameterized, and we can use the formulas in the different exchanges to split the dataset into multiple datasets with one reference product each.
• If we have multiple byproducts, we use economic allocation to split emissions and inputs between the reference product and the allocatable byproducts.

The first step in allocation is to label datasets based on the allocation method that will be used.

ocelot.transformations.cutoff.allocation.choose_allocation_method(dataset)

Choose from among the following allocation methods:

• no allocation
• combined production
• combined production with byproducts
• constrained market
• economic (including true value) allocation
• recycling
• waste treatment

The chosen allocation function is returned as a string.

The choice is made using the following decision tree:

If the dataset is a market group:
• no allocation
If the dataset has only one reference product and no allocatable byproducts:
• no allocation
If the dataset is a market activity:
• and has a conditional exchange: constrained market,
• otherwise: no allocation

A conditional exchange is an exchange with the following properties:

• The exchange amount is negative
• The exchange has a hard (activity) link
• The exchange is a byproduct

Conditional exchanges are used in the consequential system model.

If there is more than one reference product,
• and there are allocatable byproducts: combined production with byproducts,
• otherwise: combined production.
If the reference production exchange has a negative amount, meaning that this dataset is a treatment service that consumes instead of producing something:
• If the reference product has the classification waste: waste treatment
• Otherwise: recycling
If no of the above apply:
• economic

Economic allocation uses “true value” properties whenever they are present.

We then apply the allocation functions in order:

ocelot.transformations.cutoff.economic.economic_allocation(dataset, use_true_value=True)

Perform economic allocation on a dataset.

Wrapped by needs_allocation, this function returns a list of datasets.

Economic allocation uses revenue (price times the amount of the exchange) to calculate the allocation factors.

However, sometimes prices are silly, or, in the language of the data quality guidelines, “prices may be influenced by market imperfections or regulation that distorts markets, resulting in relative prices that have very little to do with the true, functional value of the products” (p. 131). In this case true value allocation is performed.

True value allocation is always used when an exchange has the property true value relation. However, not all outputs will have this property, and we only want to change the weight of the exchanges which have true value relation relative to other true value exchanges - so the formula gets a bit tricky. In the following, $$i$$ is an individual exchange and $$j$$ is the set of all exchanges, $$i \in j$$. $$t$$ is the set of all exchanges which have true value relation, and $$n$$ is the set of exchanges which don’t, $$t \cup n = j$$.

$revenue_{i} = price_{i} * amount_{i}$$true\_value_{i \in t} = true\_value\_relation_{i} * amount_{i}$

The allocation factor $$\theta$$ for an exchange with has true value relation would be:

$\theta_{i \in t} = \frac{true\_value_{i}}{\sum_{t} true\_value} \frac{\sum_{t} revenue}{\sum_{j} revenue}$

And the allocation factor $$\theta$$ for exchange without true value relation would be:

$\theta_{i \in n} = \frac{revenue_{i}}{\sum_{j} revenue}$
ocelot.transformations.cutoff.markets.constrained_market_allocation(dataset)

Perform constrained market allocation on a dataset.

A constrained market has one or more conditional exchanges which produce byproducts. These byproducts are constrained in the sense that increased demands of these byproducts will not increase their production, but rather will increase the production of other materials which can substitute for these byproducts. For more detail, see pp. 81-85 of the data quality guidelines.

In the cutoff system model, constrained byproducts are not used, and these exchanges can be set to zero.

ocelot.transformations.cutoff.wastes.recycling_allocation(dataset)

Allocate a recycling activity.

Returns a list of new activities.

A recycling dataset has a reference product of the material to be recycled, and a byproduct of the material that can enter a market. For example, aluminium recycling has a reference production of -1 kg of aluminium scrap, post-consumer, prepared for melting, and allocatable byproducts of aluminium, cast alloy and aluminium oxide.

This function will change the reference product to an input (meaning that this activity will consume e.g. aluminium scrap), and then perform economic allocation on the byproducts.

Note that recycling allocation is not applied to recyclable byproducts, as the cutoff system model breaks the chain between production and consumption of these types of materials.

The net effect of recycling_allocation and flip_non_allocatable_byproducts is that all outputs that are not allocatable byproducts are moved to technosphere inputs.

ocelot.transformations.cutoff.wastes.waste_treatment_allocation(dataset)

Perform cutoff system model allocation on a waste treatment activity.

Returns a list of new activities.

In the cutoff system model, the useful products of waste treatment come with no environmental burdens - they are cut off from the rest of the supply chain. So, this allocation function creates one dataset with all the environmental burdens which treats (consumes) the actual waste, and several new datasets which provide each byproduct for free.

ocelot.transformations.cutoff.combined.combined_production(dataset)

Perform subdivision of combined production activities.

Combined production activities can vary the production of several reference products. As such, subdivision can be performed, and no allocation is needed. However, allocation may be needed for the resulting datasets, which may have byproducts.

Subdivision assumes that the datasets are parameterized. Each reference product exchange should be a variable:

{
'type': 'reference production',
'amount': 0.5,
'variable': 'a_variable_name'
}


This variable can be referred to in other exchanges or parameters to determine the amounts of technosphere input or biosphere outputs.

Subdivision is performed by iterating over the non-zero reference products, making a copy of the dataset, and setting the amount of all other reference product exchange variables to zero. We then recalculate the formulas and variables, and get the inputs needed for the production of only one reference product.

Returns a list of new datasets.

ocelot.transformations.cutoff.combined.combined_production_with_byproducts(dataset)

Subdivide, allocate, and then merge combined production datasets with byproducts.

If a dataset has two reference products, A and B, and a byproduct C, then subdivision will create two new datasets, A’ and B’. Each of these will have C as a byproduct, so economic allocation is performed on both A’ and B’, giving a total of four datasets: A’, B’, C1 (from A’), and C2 (from B’). However, C1 and C2 are producing the same product, so they need to be merged to make one C dataset.

Returns a list of new datasets.

ocelot.transformations.cutoff.combined.combined_production_without_products(dataset)

A special case of combined production allocation where there are multiple recyclable reference products and no allocatable reference products.

This special case occurs only once in ecoinvent 3.2, in the dataset treatment of manure and biowaste by anaerobic digestion. This activity has the following reference products:

• used vegetable cooking oil: recyclable
• manure, liquid, cattle: recyclable
• manure, solid, cattle: recyclable
• manure, liquid, swine: recyclable
• biowaste: waste

And the following byproducts:

• biogas: allocatable product
• digester sludge: recyclable

After the combined production without byproducts algorithm is applied, the following datasets are returned:

• treatment of manure and biowaste by anaerobic digestion (Reference product: biowaste)
• treatment of manure and biowaste by anaerobic digestion (Reference product: biogas)
• treatment of manure and biowaste by anaerobic digestion, from used vegetable cooking oil (Reference product: biogas)
• treatment of manure and biowaste by anaerobic digestion, from manure, liquid, cattle (Reference product: biogas)
• treatment of manure and biowaste by anaerobic digestion, from manure, solid, cattle (Reference product: biogas)
• treatment of manure and biowaste by anaerobic digestion, from manure, liquid, swine (Reference product: biogas)

This might seem funny at first, but it is consistent with the other allocation procedures for combined production and recycling. First, the byproduct of digester sludge is switched to a negative input, and is treated the same as any other input. Next, combined production allocation creates five datasets, one for each reference product.

For the dataset treating biowaste, our waste treatment allocation procedure tells us that “the useful products of waste treatment come with no environmental burdens”. This means that the biogas produced by the treatment of biowaste comes for free. The same is not true for the recyclable products. No treatment is needed - this is what it means to be a recyclable - so the recyclable output is switched to a negative input, and the biogas is switched to the reference product.

The final step is to handle the fact that we have multiple processes with the same activity name and reference product. We handle this by appending the name of the recyclable to each treatment process that consumes a recyclable, so treatment of manure and biowaste by anaerobic digestion becaomes treatment of manure and biowaste by anaerobic digestion, from manure, liquid, cattle.

After allocation, we can drop a category of hard (activity) links - those from a reference product. These hard links don’t have any meaning, as reference products are produced by the activity, and don’t need to be linked.

ocelot.transformations.cutoff.cleanup.drop_rp_activity_links(data)

Delete hard (activity) links from reference product exchanges.

Also drops activity links from dropped product exchanges, as these have amounts of zero and were formerly reference products.

These links have no meaning in the cutoff system model.

The next set is Linking consumers and suppliers in space.