calculate_marginal_cost_prices

Function calculate_marginal_cost_prices 

Source
fn calculate_marginal_cost_prices<'a, I, J>(
    activity_keys_for_existing: I,
    activity_keys_for_candidates: J,
    upstream_prices: &CommodityPrices,
    year: u32,
    markets_to_price: &HashSet<(CommodityID, RegionID)>,
) -> HashMap<(CommodityID, RegionID, TimeSliceID), MoneyPerFlow>
where I: Iterator<Item = (&'a AssetRef, &'a TimeSliceID)>, J: Iterator<Item = (&'a AssetRef, &'a TimeSliceID)>,
Expand description

Calculate marginal cost prices for a set of commodities.

This pricing strategy aims to incorporate the marginal cost of commodity production into the price.

For a given asset, a marginal cost can be calculated for each SED/SVD output, which is the sum of:

  • Generic activity costs: Activity-related costs not tied to a specific SED/SVD output (variable operating costs, cost of purchasing inputs, plus all levies and flow costs not associated with specific SED/SVD outputs). These are shared over all SED/SVD outputs according to their flow coefficients.
  • Commodity-specific activity costs: flow costs/levies for the specific SED/SVD output.

For example, consider an asset A(SED) -> B(SED) + 2C(SED) + D(OTH), with the following costs:

  • Variable operating cost: 5 per unit activity
  • Production levy on C: 3 per unit flow
  • Production levy on D: 4 per unit flow
  • Shadow price of A: 1 per unit flow

Then:

  • Generic activity cost per activity = (1 + 5 + 4) = 10
  • Generic activity cost per SED/SVD output = 10 / (1 + 2) = 3.333
  • Marginal cost of B = 3.333
  • Marginal cost of C = 3.333 + 3 = 6.333

For each region, the price in each time slice is taken from the installed asset with the highest marginal cost. If there are no producers of the commodity in that region (in particular, this may occur when there’s no demand for the commodity), then candidate assets are considered: we take the price from the candidate asset with the lowest marginal cost, assuming full utilisation (i.e. the single candidate asset that would be most competitive if a small amount of demand was added).

Note: this should be similar to the “shadow price” strategy, which is also based on marginal costs of the most expensive producer, but may be more successful in cases where there are multiple SED/SVD outputs per asset.

§Arguments

  • activity_keys_for_existing - Iterator over activity keys from optimisation solution for existing assets
  • activity_keys_for_candidates - Iterator over activity keys from optimisation solution for candidate assets
  • upstream_prices - Prices for commodities upstream of the ones we are calculating prices for
  • year - The year for which prices are being calculated
  • markets_to_price - Set of markets to calculate marginal prices for

§Returns

A map of marginal cost prices for the specified markets in all time slices