From f3020aca736f2ca26f7229a0461657a73b876a38 Mon Sep 17 00:00:00 2001 From: Tom Bland Date: Thu, 2 Jul 2026 14:47:02 +0100 Subject: [PATCH 1/5] Refactoring from #1357 --- src/fixture.rs | 3 +- src/output.rs | 4 +- src/simulation/investment.rs | 391 ++++++------------ src/simulation/investment/appraisal.rs | 91 +--- .../investment/appraisal/constraints.rs | 7 +- .../investment/appraisal/optimisation.rs | 10 +- 6 files changed, 140 insertions(+), 366 deletions(-) diff --git a/src/fixture.rs b/src/fixture.rs index e212a0c12..7363820cf 100644 --- a/src/fixture.rs +++ b/src/fixture.rs @@ -4,7 +4,7 @@ use crate::agent::{ Agent, AgentCommodityPortionsMap, AgentID, AgentMap, AgentObjectiveMap, AgentSearchSpaceMap, DecisionRule, }; -use crate::asset::{Asset, AssetCapacity, AssetPool, AssetRef}; +use crate::asset::{Asset, AssetPool, AssetRef}; use crate::commodity::{ Commodity, CommodityID, CommodityLevyMap, CommodityType, DemandMap, PricingStrategy, }; @@ -406,7 +406,6 @@ pub fn appraisal_output(asset: Asset, time_slice: TimeSliceID) -> AppraisalOutpu let unmet_demand = indexmap! { time_slice.clone() => Flow(5.0) }; AppraisalOutput { asset: AssetRef::from(asset), - capacity: AssetCapacity::Continuous(Capacity(42.0)), coefficients: Rc::new(ObjectiveCoefficients { activity_coefficients, market_costs, diff --git a/src/output.rs b/src/output.rs index 794559b40..9479e942e 100644 --- a/src/output.rs +++ b/src/output.rs @@ -486,7 +486,7 @@ impl DebugDataWriter { asset_id: result.asset.id(), process_id: result.asset.process_id().clone(), region_id: result.asset.region_id().clone(), - capacity: result.capacity.total_capacity(), + capacity: result.asset.capacity().total_capacity(), metric: result.metric.as_ref().map(|m| m.value()), }; self.appraisal_results_writer.serialize(row)?; @@ -1183,7 +1183,7 @@ mod tests { asset_id: None, process_id: asset.process_id().clone(), region_id: asset.region_id().clone(), - capacity: Capacity(42.0), + capacity: Capacity(2.0), metric: Some(4.14), }; let records: Vec = diff --git a/src/simulation/investment.rs b/src/simulation/investment.rs index 1a2c60673..2f85a26a2 100644 --- a/src/simulation/investment.rs +++ b/src/simulation/investment.rs @@ -292,12 +292,13 @@ fn select_assets_for_single_market( commodity, region_id, year, + model.parameters.capacity_limit_factor, ) .collect::>(); // Calculate investment limits for candidate assets let investment_limits = - calculate_investment_limits_for_candidates(&opt_assets, commodity_portion); + collect_investment_limits_for_candidates(&opt_assets, commodity_portion); // Choose assets from among existing pool and candidates let best_assets = select_best_assets( @@ -655,6 +656,7 @@ fn get_demand_limiting_capacity( } /// Get options from existing and potential assets for the given parameters +#[allow(clippy::too_many_arguments)] fn get_asset_options<'a>( time_slice_info: &'a TimeSliceInfo, all_existing_assets: &'a [AssetRef], @@ -663,6 +665,7 @@ fn get_asset_options<'a>( commodity: &'a Commodity, region_id: &'a RegionID, year: u32, + capacity_limit_factor: Dimensionless, ) -> impl Iterator + 'a { // Get existing assets which produce the commodity of interest let existing_assets = all_existing_assets @@ -673,8 +676,15 @@ fn get_asset_options<'a>( .cloned(); // Get candidates assets which produce the commodity of interest - let candidate_assets = - get_candidate_assets(time_slice_info, demand, agent, region_id, commodity, year); + let candidate_assets = get_candidate_assets( + time_slice_info, + demand, + agent, + region_id, + commodity, + year, + capacity_limit_factor, + ); chain(existing_assets, candidate_assets) } @@ -687,6 +697,7 @@ fn get_candidate_assets<'a>( region_id: &'a RegionID, commodity: &'a Commodity, year: u32, + capacity_limit_factor: Dimensionless, ) -> impl Iterator + 'a { agent .iter_search_space(region_id, &commodity.id, year) @@ -698,7 +709,8 @@ fn get_candidate_assets<'a>( // Set capacity based on demand // This will serve as the upper limit when appraising the asset let capacity = get_demand_limiting_capacity(time_slice_info, &asset, commodity, demand); - let asset_capacity = AssetCapacity::from_capacity(capacity, asset.unit_size()); + let asset_capacity = AssetCapacity::from_capacity(capacity, asset.unit_size()) + .apply_limit_factor(capacity_limit_factor); asset.set_capacity(asset_capacity); asset.into() @@ -742,30 +754,20 @@ fn log_on_equal_appraisal_outputs( } } -/// Calculate investment limits for an agent's candidate assets in a given year -/// -/// Investment limits are based on demand for the commodity (capacity cannot exceed that needed to -/// meet demand), and any annual addition limits specified by the process (scaled according to the -/// agent's portion of the commodity demand and the number of years elapsed since the previous -/// milestone year). -fn calculate_investment_limits_for_candidates( +/// Investment limits are based on any annual addition limits specified by the process, scaled +/// according to the agent's portion of the commodity demand and the number of years elapsed since +/// the previous milestone year. +fn collect_investment_limits_for_candidates( opt_assets: &[AssetRef], commodity_portion: Dimensionless, ) -> HashMap { - // Calculate limits for each candidate asset opt_assets .iter() .filter(|asset| !asset.is_commissioned()) - .map(|asset| { - // Start off with the demand-limiting capacity (pre-calculated when creating candidate) - let mut cap = asset.capacity(); - - // Cap by the addition limits of the process, if specified - if let Some(limit_capacity) = asset.max_installable_capacity(commodity_portion) { - cap = cap.min(limit_capacity); - } - - (asset.clone(), cap) + .filter_map(|asset| { + asset + .max_installable_capacity(commodity_portion) + .map(|limit_capacity| (asset.clone(), limit_capacity)) }) .collect() } @@ -820,31 +822,38 @@ fn select_best_assets( continue; } - // For candidates, determine the maximum capacity that can be invested in this round. - // This is whichever is the smallest of the tranche size (based on demand limiting - // capacity before investment), the remaining available capacity for the candidate and - // the demand limiting capacity recalculated based on demand unserved by the other - // selected assets. - let max_capacity = (!asset.is_commissioned()).then(|| { - let tranche_capacity = asset - .capacity() - .apply_limit_factor(model.parameters.capacity_limit_factor); + // For candidates, cap the asset's current capacity by the demand-limiting capacity + // and, where an addition constraint exists, the remaining installable capacity. + let mut asset = asset.clone(); + if !asset.is_commissioned() { let dlc = AssetCapacity::from_capacity( - get_demand_limiting_capacity(&model.time_slice_info, asset, commodity, &demand), + get_demand_limiting_capacity( + &model.time_slice_info, + &asset, + commodity, + &demand, + ), asset.unit_size(), ); - let remaining_capacity = remaining_candidate_capacity[asset]; + let cap = asset.capacity().min(dlc); + let max_capacity = remaining_candidate_capacity + .get(&asset) + .copied() + .map_or(cap, |remaining| cap.min(remaining)); + asset.make_mut().set_capacity(max_capacity); + } - tranche_capacity.min(dlc).min(remaining_capacity) - }); + // Skip assets with zero capacity + if asset.capacity().total_capacity() <= Capacity(0.0) { + continue; + } let output = appraise_investment( model, - asset, - max_capacity, + &asset, commodity, objective_type, - &coefficients[asset], + &coefficients[&asset], &demand, )?; outputs_for_opts.push(output); @@ -884,13 +893,12 @@ fn select_best_assets( "Selected {} asset '{}' (capacity: {})", &best_output.asset.state(), &best_output.asset.process_id(), - best_output.capacity.total_capacity() + best_output.asset.capacity().total_capacity() ); // Update the assets and remaining candidate capacity update_assets( best_output.asset, - best_output.capacity, &mut opt_assets, &mut remaining_candidate_capacity, &mut best_assets, @@ -920,8 +928,7 @@ fn is_any_remaining_demand(demand: &DemandMap, absolute_tolerance: Flow) -> bool /// Update capacity of chosen asset, if needed, and update both asset options and chosen assets fn update_assets( - mut best_asset: AssetRef, - capacity: AssetCapacity, + best_asset: AssetRef, opt_assets: &mut Vec, remaining_candidate_capacity: &mut HashMap, best_assets: &mut Vec, @@ -933,27 +940,30 @@ fn update_assets( best_assets.push(best_asset); } AssetState::Candidate => { - // Remove this capacity from the available remaining capacity for this asset - let remaining_capacity = remaining_candidate_capacity.get_mut(&best_asset).unwrap(); - *remaining_capacity = *remaining_capacity - capacity; - - // If there's no capacity remaining, remove the asset from the options - if remaining_capacity.total_capacity() <= Capacity(0.0) { - let old_idx = opt_assets - .iter() - .position(|asset| *asset == best_asset) - .unwrap(); - opt_assets.swap_remove(old_idx); - remaining_candidate_capacity.remove(&best_asset); + // Track remaining capacity for assets that have limits + if let Some(remaining_capacity) = remaining_candidate_capacity.get_mut(&best_asset) { + *remaining_capacity = *remaining_capacity - best_asset.capacity(); + + // If there's no capacity remaining, remove the asset from the options + if remaining_capacity.total_capacity() <= Capacity(0.0) { + let old_idx = opt_assets + .iter() + .position(|asset| *asset == best_asset) + .unwrap(); + + opt_assets.swap_remove(old_idx); + remaining_candidate_capacity.remove(&best_asset); + } } if let Some(existing_asset) = best_assets.iter_mut().find(|asset| **asset == best_asset) { // If the asset is already in the list of best assets, add the additional required capacity - existing_asset.make_mut().increase_capacity(capacity); + existing_asset + .make_mut() + .increase_capacity(best_asset.capacity()); } else { - // Otherwise, update the capacity of the chosen asset and add it to the list of best assets - best_asset.make_mut().set_capacity(capacity); + // Otherwise add it to the list of best assets best_assets.push(best_asset); } } @@ -966,9 +976,8 @@ mod tests { use super::*; use crate::commodity::Commodity; use crate::fixture::{ - agent_id, asset, process, process_activity_limits_map, process_flows_map, - process_investment_constraints, process_parameter_map, region_id, svd_commodity, - time_slice, time_slice_info, time_slice_info2, + asset, process, process_activity_limits_map, process_flows_map, process_parameter_map, + region_id, svd_commodity, time_slice, time_slice_info, time_slice_info2, }; use crate::process::{ ActivityLimits, FlowType, Process, ProcessActivityLimitsMap, ProcessFlow, ProcessFlowsMap, @@ -977,10 +986,11 @@ mod tests { use crate::region::RegionID; use crate::time_slice::{TimeSliceID, TimeSliceInfo, TimeSliceSelection}; use crate::units::Dimensionless; - use crate::units::{ActivityPerCapacity, Capacity, Flow, FlowPerActivity, MoneyPerFlow}; + use crate::units::{ActivityPerCapacity, Flow, FlowPerActivity, MoneyPerFlow}; use indexmap::{IndexSet, indexmap}; - use rstest::rstest; + use rstest::{fixture, rstest}; use std::rc::Rc; + use std::slice::from_ref; #[rstest] fn get_demand_limiting_capacity_works( @@ -1127,101 +1137,44 @@ mod tests { } #[rstest] - fn calculate_investment_limits_for_candidates_empty_list() { - // Test with empty list of assets - let opt_assets: Vec = vec![]; - let commodity_portion = Dimensionless(1.0); - - let result = calculate_investment_limits_for_candidates(&opt_assets, commodity_portion); - + fn collect_investment_limits_for_candidates_empty_list() { + let result = collect_investment_limits_for_candidates(&[], Dimensionless(1.0)); assert!(result.is_empty()); } - #[rstest] - fn calculate_investment_limits_for_candidates_commissioned_assets_filtered( - process: Process, - region_id: RegionID, - agent_id: AgentID, - ) { - // Create a mix of commissioned and candidate assets - let process_rc = Rc::new(process); - let capacity = Capacity(10.0); - - // Create commissioned asset - should be filtered out - let commissioned_asset = Asset::new_commissioned( - agent_id.clone(), - process_rc.clone(), - region_id.clone(), - capacity, - 2015, - ) - .unwrap(); - - // Create candidate asset - should be included - let candidate_asset = - Asset::new_candidate(process_rc.clone(), region_id.clone(), capacity, 2015).unwrap(); - - let candidate_asset_ref = AssetRef::from(candidate_asset); - let opt_assets = vec![ - AssetRef::from(commissioned_asset), - candidate_asset_ref.clone(), - ]; - let commodity_portion = Dimensionless(1.0); - - let result = calculate_investment_limits_for_candidates(&opt_assets, commodity_portion); - - // Only the candidate asset should be in the result - assert_eq!(result.len(), 1); - assert!(result.contains_key(&candidate_asset_ref)); + #[fixture] + fn commissioned_asset(asset: Asset) -> AssetRef { + asset.into() } - #[rstest] - fn calculate_investment_limits_for_candidates_no_investment_constraints( - process: Process, - region_id: RegionID, - ) { - // Create candidate asset without investment constraints - let process_rc = Rc::new(process); - let capacity = Capacity(15.0); - - let candidate_asset = Asset::new_candidate(process_rc, region_id, capacity, 2015).unwrap(); - - let opt_assets = vec![AssetRef::from(candidate_asset.clone())]; - let commodity_portion = Dimensionless(0.8); - - let result = calculate_investment_limits_for_candidates(&opt_assets, commodity_portion); - - // Should return the asset's original capacity since no constraints apply - assert_eq!(result.len(), 1); - let asset_ref = AssetRef::from(candidate_asset); - assert_eq!(result[&asset_ref], AssetCapacity::Continuous(capacity)); + #[fixture] + fn uncommissioned_asset_without_limit(process: Process, region_id: RegionID) -> AssetRef { + Asset::new_candidate(Rc::new(process), region_id, Capacity(10.0), 2015) + .unwrap() + .into() } - #[rstest] - // Asset capacity higher than constraint -> limited by constraint - #[case(Capacity(15.0), Capacity(10.0))] - // Asset capacity lower than constraint -> limited by asset capacity - #[case(Capacity(5.0), Capacity(5.0))] - fn calculate_investment_limits_for_candidates_with_constraints( + #[fixture] + fn uncommissioned_asset_with_limit( region_id: RegionID, process_activity_limits_map: ProcessActivityLimitsMap, process_flows_map: ProcessFlowsMap, process_parameter_map: ProcessParameterMap, - #[case] asset_capacity: Capacity, - #[case] expected_limit: Capacity, - ) { + ) -> AssetRef { let region_ids: IndexSet = [region_id.clone()].into(); - // Add investment constraint with addition limit - let constraint = ProcessInvestmentConstraint { - addition_limit: Some(Capacity(10.0)), - }; let mut constraints = ProcessInvestmentConstraintsMap::new(); - constraints.insert((region_id.clone(), 2015), Rc::new(constraint)); + + constraints.insert( + (region_id.clone(), 2015), + Rc::new(ProcessInvestmentConstraint { + addition_limit: Some(Capacity(10.0)), + }), + ); let process = Process { id: "constrained_process".into(), - description: "Process with constraints".into(), + description: String::new(), years: 2010..=2020, activity_limits: process_activity_limits_map, flows: process_flows_map, @@ -1233,152 +1186,38 @@ mod tests { unit_size: None, }; - let process_rc = Rc::new(process); - - let candidate_asset = - Asset::new_candidate(process_rc, region_id, asset_capacity, 2015).unwrap(); - - let opt_assets = vec![AssetRef::from(candidate_asset.clone())]; - let commodity_portion = Dimensionless(1.0); - - let result = calculate_investment_limits_for_candidates(&opt_assets, commodity_portion); - - // Should be limited by the minimum of asset capacity and constraint - assert_eq!(result.len(), 1); - let asset_ref = AssetRef::from(candidate_asset); - assert_eq!( - result[&asset_ref], - AssetCapacity::Continuous(expected_limit) - ); + Asset::new_candidate(Rc::new(process), region_id, Capacity(15.0), 2015) + .unwrap() + .into() } #[rstest] - fn calculate_investment_limits_for_candidates_multiple_assets( - region_id: RegionID, - process_activity_limits_map: ProcessActivityLimitsMap, - process_flows_map: ProcessFlowsMap, - process_parameter_map: ProcessParameterMap, - ) { - let region_ids: IndexSet = [region_id.clone()].into(); - - // Create first process with constraints - let constraint1 = ProcessInvestmentConstraint { - addition_limit: Some(Capacity(12.0)), - }; - let mut constraints1 = ProcessInvestmentConstraintsMap::new(); - constraints1.insert((region_id.clone(), 2015), Rc::new(constraint1)); - - let process1 = Process { - id: "process1".into(), - description: "First process".into(), - years: 2010..=2020, - activity_limits: process_activity_limits_map.clone(), - flows: process_flows_map.clone(), - parameters: process_parameter_map.clone(), - regions: region_ids.clone(), - primary_output: None, - capacity_to_activity: ActivityPerCapacity(1.0), - investment_constraints: constraints1, - unit_size: None, - }; - - // Create second process without constraints - let process2 = Process { - id: "process2".into(), - description: "Second process".into(), - years: 2010..=2020, - activity_limits: process_activity_limits_map, - flows: process_flows_map, - parameters: process_parameter_map, - regions: region_ids, - primary_output: None, - capacity_to_activity: ActivityPerCapacity(1.0), - investment_constraints: process_investment_constraints(), - unit_size: None, - }; - - let process1_rc = Rc::new(process1); - let process2_rc = Rc::new(process2); - - let candidate1 = - Asset::new_candidate(process1_rc, region_id.clone(), Capacity(20.0), 2015).unwrap(); - - let candidate2 = Asset::new_candidate(process2_rc, region_id, Capacity(8.0), 2015).unwrap(); - - let opt_assets = vec![ - AssetRef::from(candidate1.clone()), - AssetRef::from(candidate2.clone()), - ]; - let commodity_portion = Dimensionless(0.75); - - let result = calculate_investment_limits_for_candidates(&opt_assets, commodity_portion); - - // Should have both assets in result - assert_eq!(result.len(), 2); - - // First asset should be limited by constraint: 12.0 * 0.75 = 9.0 - let asset1_ref = AssetRef::from(candidate1); - assert_eq!( - result[&asset1_ref], - AssetCapacity::Continuous(Capacity(9.0)) + fn commissioned_assets_are_excluded(commissioned_asset: AssetRef) { + let result = collect_investment_limits_for_candidates( + from_ref(&commissioned_asset), + Dimensionless(1.0), ); - // Second asset should use its original capacity (no constraints) - let asset2_ref = AssetRef::from(candidate2); - assert_eq!( - result[&asset2_ref], - AssetCapacity::Continuous(Capacity(8.0)) - ); + assert!(!result.contains_key(&commissioned_asset)); } #[rstest] - fn calculate_investment_limits_for_candidates_discrete_capacity( - region_id: RegionID, - process_activity_limits_map: crate::process::ProcessActivityLimitsMap, - process_flows_map: crate::process::ProcessFlowsMap, - process_parameter_map: crate::process::ProcessParameterMap, - ) { - let region_ids: IndexSet = [region_id.clone()].into(); - - // Add investment constraint - let constraint = ProcessInvestmentConstraint { - addition_limit: Some(Capacity(35.0)), // Enough for 3.5 units at 10.0 each - }; - let mut constraints = ProcessInvestmentConstraintsMap::new(); - constraints.insert((region_id.clone(), 2015), Rc::new(constraint)); - - let process = Process { - id: "discrete_process".into(), - description: "Process with discrete units".into(), - years: 2010..=2020, - activity_limits: process_activity_limits_map, - flows: process_flows_map, - parameters: process_parameter_map, - regions: region_ids, - primary_output: None, - capacity_to_activity: ActivityPerCapacity(1.0), - investment_constraints: constraints, - unit_size: Some(Capacity(10.0)), // Discrete units of 10.0 capacity each - }; - - let process_rc = Rc::new(process); - let capacity = Capacity(50.0); // 5 units at 10.0 each - - let candidate_asset = Asset::new_candidate(process_rc, region_id, capacity, 2015).unwrap(); - - let opt_assets = vec![AssetRef::from(candidate_asset.clone())]; - let commodity_portion = Dimensionless(1.0); + fn candidate_assets_without_limits_are_excluded(uncommissioned_asset_without_limit: AssetRef) { + let result = collect_investment_limits_for_candidates( + from_ref(&uncommissioned_asset_without_limit), + Dimensionless(1.0), + ); - let result = calculate_investment_limits_for_candidates(&opt_assets, commodity_portion); + assert!(!result.contains_key(&uncommissioned_asset_without_limit)); + } - // Should be limited by constraint and rounded down to whole units - // Constraint: 35.0, divided by unit size 10.0 = 3.5 -> floor to 3 units = 30.0 - assert_eq!(result.len(), 1); - let asset_ref = AssetRef::from(candidate_asset); - assert_eq!( - result[&asset_ref], - AssetCapacity::Discrete(3, Capacity(10.0)) + #[rstest] + fn candidate_assets_with_limits_are_included(uncommissioned_asset_with_limit: AssetRef) { + let result = collect_investment_limits_for_candidates( + from_ref(&uncommissioned_asset_with_limit), + Dimensionless(1.0), ); - assert_eq!(result[&asset_ref].total_capacity(), Capacity(30.0)); + + assert!(result.contains_key(&uncommissioned_asset_with_limit)); } } diff --git a/src/simulation/investment/appraisal.rs b/src/simulation/investment/appraisal.rs index c1924c1e4..74b0ddd3f 100644 --- a/src/simulation/investment/appraisal.rs +++ b/src/simulation/investment/appraisal.rs @@ -1,12 +1,12 @@ //! Calculation for investment tools such as Levelised Cost of X (LCOX) and Net Present Value (NPV). use super::DemandMap; use crate::agent::ObjectiveType; -use crate::asset::{Asset, AssetCapacity, AssetRef}; +use crate::asset::{Asset, AssetRef}; use crate::commodity::Commodity; use crate::finance::{lcox, snas}; use crate::model::Model; use crate::time_slice::TimeSliceID; -use crate::units::{Activity, Capacity, MoneyPerActivity, MoneyPerCapacity}; +use crate::units::{Activity, MoneyPerActivity, MoneyPerCapacity}; use anyhow::Result; use costs::annual_fixed_cost; use erased_serde::Serialize as ErasedSerialize; @@ -52,8 +52,6 @@ where pub struct AppraisalOutput { /// The asset being appraised pub asset: AssetRef, - /// The hypothetical capacity to install - pub capacity: AssetCapacity, /// Time slice level activity of the asset pub activity: IndexMap, /// The hypothetical unmet demand following investment in this asset @@ -68,14 +66,12 @@ impl AppraisalOutput { /// Create a new `AppraisalOutput` fn new( asset: AssetRef, - capacity: AssetCapacity, results: ResultsMap, metric: Option, coefficients: Rc, ) -> Self { Self { asset, - capacity, activity: results.activity, unmet_demand: results.unmet_demand, metric: metric.map(|m| Box::new(m) as Box), @@ -91,24 +87,14 @@ impl AppraisalOutput { /// vs. Windows). We want to avoid this, if possible, which is why we use a more approximate /// comparison. pub fn compare_metric(&self, other: &Self) -> Ordering { - assert!( - self.is_valid() && other.is_valid(), - "Cannot compare non-valid outputs" - ); - - // We've already checked the metrics aren't `None` in `is_valid` - self.metric - .as_ref() - .unwrap() - .compare(other.metric.as_ref().unwrap().as_ref()) - } + let (metric1, metric2) = self + .metric + .as_deref() + .zip(other.metric.as_deref()) + .expect("Cannot compare non-valid outputs"); - /// Whether this [`AppraisalOutput`] is a valid output. - /// - /// Specifically, it checks whether the metric is a valid value (not `None`) and that the - /// calculated capacity is greater than zero. - pub fn is_valid(&self) -> bool { - self.metric.is_some() && self.capacity.total_capacity() > Capacity(0.0) + // We've already checked the metrics aren't `None` + metric1.compare(metric2) } } @@ -229,16 +215,14 @@ impl MetricTrait for NPVMetric {} fn calculate_lcox( model: &Model, asset: &AssetRef, - max_capacity: AssetCapacity, commodity: &Commodity, coefficients: &Rc, demand: &DemandMap, ) -> Result { - let results = - perform_optimisation(model, asset, max_capacity, commodity, coefficients, demand)?; + let results = perform_optimisation(model, asset, commodity, coefficients, demand)?; let cost_index = lcox( - max_capacity.total_capacity(), + asset.capacity().total_capacity(), annual_fixed_cost(asset), &results.activity, &coefficients.market_costs, @@ -246,7 +230,6 @@ fn calculate_lcox( Ok(AppraisalOutput::new( asset.clone(), - max_capacity, results, cost_index.map(LCOXMetric::new), coefficients.clone(), @@ -261,13 +244,11 @@ fn calculate_lcox( fn calculate_npv( model: &Model, asset: &AssetRef, - max_capacity: AssetCapacity, commodity: &Commodity, coefficients: &Rc, demand: &DemandMap, ) -> Result { - let results = - perform_optimisation(model, asset, max_capacity, commodity, coefficients, demand)?; + let results = perform_optimisation(model, asset, commodity, coefficients, demand)?; let annual_fixed_cost = annual_fixed_cost(asset); assert!( @@ -276,7 +257,7 @@ fn calculate_npv( ); let snas = snas( - max_capacity.total_capacity(), + asset.capacity().total_capacity(), annual_fixed_cost, &results.activity, &coefficients.market_costs, @@ -284,7 +265,6 @@ fn calculate_npv( Ok(AppraisalOutput::new( asset.clone(), - max_capacity, results, snas.map(NPVMetric::new), coefficients.clone(), @@ -300,18 +280,16 @@ fn calculate_npv( pub fn appraise_investment( model: &Model, asset: &AssetRef, - max_capacity: Option, commodity: &Commodity, objective_type: &ObjectiveType, coefficients: &Rc, demand: &DemandMap, ) -> Result { - let max_capacity = max_capacity.unwrap_or(asset.capacity()); let appraisal_method = match objective_type { ObjectiveType::LevelisedCostOfX => calculate_lcox, ObjectiveType::NetPresentValue => calculate_npv, }; - appraisal_method(model, asset, max_capacity, commodity, coefficients, demand) + appraisal_method(model, asset, commodity, coefficients, demand) } /// Compare assets as a fallback if metrics are equal. @@ -331,17 +309,15 @@ fn compare_asset_fallback(asset1: &Asset, asset2: &Asset) -> Ordering { /// and newer assets are preferred over older ones. The function does not guarantee that all ties /// will be resolved. /// -/// Before sorting, outputs are filtered using [`AppraisalOutput::is_valid`], which excludes entries -/// with invalid metrics (e.g. `None`) as well as zero capacity. This avoids meaningless or `NaN` -/// appraisal metrics that could cause the program to panic, so the length of the returned vector -/// may be less than the input. +/// Before sorting, outputs are filtered to exclude entries with invalid metrics (i.e. `None`), so +/// the length of the returned vector may be less than the input. /// /// # Returns /// /// Returns the number of non-feasible assets which were removed. pub fn sort_and_filter_appraisal_outputs(outputs: &mut Vec) -> usize { let old_len = outputs.len(); - outputs.retain(AppraisalOutput::is_valid); + outputs.retain(|output| output.metric.is_some()); let num_nonfeasible = old_len - outputs.len(); outputs.sort_by(|output1, output2| match output1.compare_metric(output2) { @@ -375,7 +351,7 @@ mod tests { use crate::fixture::{agent_id, asset, process, region_id}; use crate::process::Process; use crate::region::RegionID; - use crate::units::MoneyPerActivity; + use crate::units::{Capacity, MoneyPerActivity}; use float_cmp::assert_approx_eq; use rstest::rstest; use std::rc::Rc; @@ -477,7 +453,6 @@ mod tests { .zip(metrics) .map(|(asset, metric)| AppraisalOutput { asset: AssetRef::from(asset), - capacity: AssetCapacity::Continuous(Capacity(10.0)), coefficients: objective_coeffs(), activity: IndexMap::new(), unmet_demand: IndexMap::new(), @@ -747,41 +722,11 @@ mod tests { ); } - /// Test that appraisal outputs with zero capacity are filtered out during sorting. - #[rstest] - fn appraisal_sort_filters_zero_capacity_outputs(asset: Asset) { - let metric = LCOXMetric::new(MoneyPerActivity(1.0)); - let metrics = [ - Box::new(metric.clone()), - Box::new(metric.clone()), - Box::new(metric), - ]; - - // Create outputs with zero capacity - let mut outputs: Vec = metrics - .into_iter() - .map(|metric| AppraisalOutput { - asset: AssetRef::from(asset.clone()), - capacity: AssetCapacity::Continuous(Capacity(0.0)), - coefficients: objective_coeffs(), - activity: IndexMap::new(), - unmet_demand: IndexMap::new(), - metric: Some(metric), - }) - .collect(); - - sort_and_filter_appraisal_outputs(&mut outputs); - - // All zero capacity outputs should be filtered out - assert_eq!(outputs.len(), 0); - } - /// Test that appraisal outputs with an invalid metric are filtered out #[rstest] fn appraisal_sort_filters_invalid_metric(asset: Asset) { let output = AppraisalOutput { asset: AssetRef::from(asset), - capacity: AssetCapacity::Continuous(Capacity(1.0)), // non-zero capacity coefficients: objective_coeffs(), activity: IndexMap::new(), unmet_demand: IndexMap::new(), diff --git a/src/simulation/investment/appraisal/constraints.rs b/src/simulation/investment/appraisal/constraints.rs index 129db22f6..a6abbbf87 100644 --- a/src/simulation/investment/appraisal/constraints.rs +++ b/src/simulation/investment/appraisal/constraints.rs @@ -1,7 +1,7 @@ //! Constraints for the optimisation problem. use super::DemandMap; use super::optimisation::Variable; -use crate::asset::{AssetCapacity, AssetRef}; +use crate::asset::AssetRef; use crate::commodity::Commodity; use crate::time_slice::{TimeSliceID, TimeSliceInfo}; use crate::units::Flow; @@ -12,17 +12,16 @@ use indexmap::IndexMap; /// /// Constrains the activity variables to be within the asset's activity limits. /// -/// The asset's per-capacity activity limits are scaled by the fixed `max_capacity` to give +/// The asset's per-capacity activity limits are scaled by the fixed `capacity` to give /// absolute bounds, and a single bounded constraint is added per time-slice selection covering the /// sum of activity in that selection. pub fn add_activity_constraints( problem: &mut Problem, asset: &AssetRef, - max_capacity: AssetCapacity, activity_vars: &IndexMap, time_slice_info: &TimeSliceInfo, ) { - let capacity = max_capacity.total_capacity(); + let capacity = asset.capacity().total_capacity(); for (ts_selection, limits) in asset.iter_activity_per_capacity_limits() { let limits = (capacity * *limits.start()).value()..=(capacity * *limits.end()).value(); diff --git a/src/simulation/investment/appraisal/optimisation.rs b/src/simulation/investment/appraisal/optimisation.rs index f9d0a1939..a57827459 100644 --- a/src/simulation/investment/appraisal/optimisation.rs +++ b/src/simulation/investment/appraisal/optimisation.rs @@ -2,7 +2,6 @@ use super::DemandMap; use super::ObjectiveCoefficients; use super::constraints::{add_activity_constraints, add_demand_constraints}; -use crate::asset::AssetCapacity; use crate::asset::AssetRef; use crate::commodity::Commodity; use crate::model::Model; @@ -50,13 +49,12 @@ fn add_activity_vars( fn add_constraints( problem: &mut Problem, asset: &AssetRef, - max_capacity: AssetCapacity, commodity: &Commodity, activity_vars: &IndexMap, demand: &DemandMap, time_slice_info: &TimeSliceInfo, ) { - add_activity_constraints(problem, asset, max_capacity, activity_vars, time_slice_info); + add_activity_constraints(problem, asset, activity_vars, time_slice_info); add_demand_constraints( problem, asset, @@ -104,14 +102,9 @@ fn compute_unmet_demand( } /// Performs optimisation for an asset, given the coefficients and demand. -/// -/// Maximises the objective function over the activity variables, holding the asset's capacity -/// fixed at `max_capacity`. Capacity is not a decision variable; the activity bounds are derived -/// from `max_capacity` by the activity constraints. pub fn perform_optimisation( model: &Model, asset: &AssetRef, - max_capacity: AssetCapacity, commodity: &Commodity, coefficients: &ObjectiveCoefficients, demand: &DemandMap, @@ -124,7 +117,6 @@ pub fn perform_optimisation( add_constraints( &mut problem, asset, - max_capacity, commodity, &activity_vars, demand, From eaca54beb37d24303adc99b518627e13683b8feb Mon Sep 17 00:00:00 2001 From: Tom Bland Date: Thu, 2 Jul 2026 14:48:25 +0100 Subject: [PATCH 2/5] Update test data --- tests/data/muse1_default/asset_capacities.csv | 60 +-- tests/data/muse1_default/commodity_flows.csv | 380 +++++++-------- tests/data/muse1_default/commodity_prices.csv | 142 +++--- tests/data/two_regions/asset_capacities.csv | 62 +-- tests/data/two_regions/commodity_flows.csv | 458 +++++++++--------- tests/data/two_regions/commodity_prices.csv | 180 +++---- 6 files changed, 641 insertions(+), 641 deletions(-) diff --git a/tests/data/muse1_default/asset_capacities.csv b/tests/data/muse1_default/asset_capacities.csv index 64c7c3956..de25fefa1 100644 --- a/tests/data/muse1_default/asset_capacities.csv +++ b/tests/data/muse1_default/asset_capacities.csv @@ -2,44 +2,44 @@ milestone_year,asset_id,group_id,capacity,num_units 2020,0,,24.0, 2020,1,,19.0, 2025,2,,23.939952120095757, -2025,3,,13.299973400053199, +2025,3,,14.097971804056394, 2030,2,,23.939952120095757, -2030,3,,13.299973400053199, +2030,3,,14.097971804056394, 2030,4,,5.939988120023763, -2030,5,,14.063371873256253, +2030,5,,13.42917314165371, 2035,2,,23.939952120095757, -2035,3,,13.299973400053199, +2035,3,,14.097971804056394, 2035,4,,5.939988120023763, -2035,5,,14.063371873256253, -2035,6,,6.119987760024477, -2035,7,,8.487823024353967, +2035,5,,13.42917314165371, +2035,6,,6.11998776002448, +2035,7,,8.094703810592398, 2040,2,,23.939952120095757, -2040,3,,13.299973400053199, +2040,3,,14.097971804056394, 2040,4,,5.939988120023763, -2040,5,,14.063371873256253, -2040,6,,6.119987760024477, -2040,7,,8.487823024353967, -2040,8,,5.939988120023762, -2040,9,,1.6330207339585008, +2040,5,,13.42917314165371, +2040,6,,6.11998776002448, +2040,7,,8.094703810592398, +2040,8,,5.939988120023759, +2040,9,,2.981386037227901, 2045,2,,23.939952120095757, -2045,3,,13.299973400053199, +2045,3,,14.097971804056394, 2045,4,,5.939988120023763, -2045,5,,14.063371873256253, -2045,6,,6.119987760024477, -2045,7,,8.487823024353967, -2045,8,,5.939988120023762, -2045,9,,1.6330207339585008, -2045,10,,5.9399881200237585, -2045,11,,9.593747212505615, +2045,5,,13.42917314165371, +2045,6,,6.11998776002448, +2045,7,,8.094703810592398, +2045,8,,5.939988120023759, +2045,9,,2.981386037227901, +2045,10,,5.939988120023761, +2045,11,,7.706035787928449, 2050,2,,23.939952120095757, -2050,3,,13.299973400053199, +2050,3,,14.097971804056394, 2050,4,,5.939988120023763, -2050,5,,14.063371873256253, -2050,6,,6.119987760024477, -2050,7,,8.487823024353967, -2050,8,,5.939988120023762, -2050,9,,1.6330207339585008, -2050,10,,5.9399881200237585, -2050,11,,9.593747212505615, +2050,5,,13.42917314165371, +2050,6,,6.11998776002448, +2050,7,,8.094703810592398, +2050,8,,5.939988120023759, +2050,9,,2.981386037227901, +2050,10,,5.939988120023761, +2050,11,,7.706035787928449, 2050,12,,6.1199877600244745, -2050,13,,5.851988296023411, +2050,13,,5.137589724820559, diff --git a/tests/data/muse1_default/commodity_flows.csv b/tests/data/muse1_default/commodity_flows.csv index 87fe114ea..901bf3250 100644 --- a/tests/data/muse1_default/commodity_flows.csv +++ b/tests/data/muse1_default/commodity_flows.csv @@ -59,18 +59,18 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2030,2,,heat,all-year.late-peak,3.9899999999999998 2030,2,,electricity,all-year.evening,-0.9319999999999999 2030,2,,heat,all-year.evening,2.3299999999999996 -2030,3,,wind,all-year.night,-0.6640000000000001 -2030,3,,electricity,all-year.night,0.6640000000000001 +2030,3,,wind,all-year.night,-0.664 +2030,3,,electricity,all-year.night,0.664 2030,3,,wind,all-year.morning,-0.9960000000000001 2030,3,,electricity,all-year.morning,0.9960000000000001 -2030,3,,wind,all-year.afternoon,-0.6640000000000001 -2030,3,,electricity,all-year.afternoon,0.6640000000000001 +2030,3,,wind,all-year.afternoon,-0.664 +2030,3,,electricity,all-year.afternoon,0.664 2030,3,,wind,all-year.early-peak,-0.0 2030,3,,electricity,all-year.early-peak,0.0 2030,3,,wind,all-year.late-peak,-0.0 2030,3,,electricity,all-year.late-peak,0.0 -2030,3,,wind,all-year.evening,-1.3280000000000003 -2030,3,,electricity,all-year.evening,1.3280000000000003 +2030,3,,wind,all-year.evening,-1.328 +2030,3,,electricity,all-year.evening,1.328 2030,4,,electricity,all-year.night,-0.39600000000000024 2030,4,,heat,all-year.night,0.9900000000000005 2030,4,,electricity,all-year.morning,-0.39600000000000024 @@ -91,40 +91,40 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2030,5,,electricity,all-year.afternoon,0.0 2030,5,,wind,all-year.early-peak,-0.9960000000000001 2030,5,,electricity,all-year.early-peak,0.9960000000000001 -2030,5,,wind,all-year.late-peak,-1.9920000000000004 -2030,5,,electricity,all-year.late-peak,1.9920000000000004 +2030,5,,wind,all-year.late-peak,-1.9920000000000002 +2030,5,,electricity,all-year.late-peak,1.9920000000000002 2030,5,,wind,all-year.evening,-0.0 2030,5,,electricity,all-year.evening,0.0 2035,2,,electricity,all-year.night,-0.0 2035,2,,heat,all-year.night,0.0 -2035,2,,electricity,all-year.morning,-0.3959999999999999 -2035,2,,heat,all-year.morning,0.9899999999999998 +2035,2,,electricity,all-year.morning,-0.39599999999999974 +2035,2,,heat,all-year.morning,0.9899999999999993 2035,2,,electricity,all-year.afternoon,-0.0 2035,2,,heat,all-year.afternoon,0.0 -2035,2,,electricity,all-year.early-peak,-0.3959999999999999 -2035,2,,heat,all-year.early-peak,0.9899999999999998 +2035,2,,electricity,all-year.early-peak,-0.39599999999999974 +2035,2,,heat,all-year.early-peak,0.9899999999999993 2035,2,,electricity,all-year.late-peak,-1.596 2035,2,,heat,all-year.late-peak,3.9899999999999998 -2035,2,,electricity,all-year.evening,-0.7959999999999999 -2035,2,,heat,all-year.evening,1.9899999999999998 +2035,2,,electricity,all-year.evening,-0.7959999999999998 +2035,2,,heat,all-year.evening,1.9899999999999993 2035,3,,wind,all-year.night,-0.0 2035,3,,electricity,all-year.night,0.0 -2035,3,,wind,all-year.morning,-1.2000000000000002 -2035,3,,electricity,all-year.morning,1.2000000000000002 +2035,3,,wind,all-year.morning,-1.2 +2035,3,,electricity,all-year.morning,1.2 2035,3,,wind,all-year.afternoon,-0.0 2035,3,,electricity,all-year.afternoon,0.0 -2035,3,,wind,all-year.early-peak,-1.2000000000000002 -2035,3,,electricity,all-year.early-peak,1.2000000000000002 +2035,3,,wind,all-year.early-peak,-1.2 +2035,3,,electricity,all-year.early-peak,1.2 2035,3,,wind,all-year.late-peak,-0.0 2035,3,,electricity,all-year.late-peak,0.0 -2035,3,,wind,all-year.evening,-0.18535999999999747 -2035,3,,electricity,all-year.evening,0.18535999999999747 -2035,4,,electricity,all-year.night,-0.3920000000000002 -2035,4,,heat,all-year.night,0.9800000000000004 +2035,3,,wind,all-year.evening,-0.2508799999999969 +2035,3,,electricity,all-year.evening,0.2508799999999969 +2035,4,,electricity,all-year.night,-0.392 +2035,4,,heat,all-year.night,0.98 2035,4,,electricity,all-year.morning,-0.39600000000000024 2035,4,,heat,all-year.morning,0.9900000000000005 -2035,4,,electricity,all-year.afternoon,-0.3920000000000002 -2035,4,,heat,all-year.afternoon,0.9800000000000004 +2035,4,,electricity,all-year.afternoon,-0.392 +2035,4,,heat,all-year.afternoon,0.98 2035,4,,electricity,all-year.early-peak,-0.39600000000000024 2035,4,,heat,all-year.early-peak,0.9900000000000005 2035,4,,electricity,all-year.late-peak,-0.39600000000000024 @@ -139,22 +139,22 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2035,5,,electricity,all-year.afternoon,0.0 2035,5,,wind,all-year.early-peak,-0.0 2035,5,,electricity,all-year.early-peak,0.0 -2035,5,,wind,all-year.late-peak,-2.3439 -2035,5,,electricity,all-year.late-peak,2.3439 +2035,5,,wind,all-year.late-peak,-2.238199999999999 +2035,5,,electricity,all-year.late-peak,2.238199999999999 2035,5,,wind,all-year.evening,-0.0 2035,5,,electricity,all-year.evening,0.0 -2035,6,,electricity,all-year.night,-0.40799999999999986 -2035,6,,heat,all-year.night,1.0199999999999996 -2035,6,,electricity,all-year.morning,-0.40799999999999986 -2035,6,,heat,all-year.morning,1.0199999999999996 -2035,6,,electricity,all-year.afternoon,-0.40799999999999986 -2035,6,,heat,all-year.afternoon,1.0199999999999996 -2035,6,,electricity,all-year.early-peak,-0.40799999999999986 -2035,6,,heat,all-year.early-peak,1.0199999999999996 -2035,6,,electricity,all-year.late-peak,-0.40799999999999986 -2035,6,,heat,all-year.late-peak,1.0199999999999996 -2035,6,,electricity,all-year.evening,-0.40799999999999986 -2035,6,,heat,all-year.evening,1.0199999999999996 +2035,6,,electricity,all-year.night,-0.40800000000000003 +2035,6,,heat,all-year.night,1.02 +2035,6,,electricity,all-year.morning,-0.40800000000000003 +2035,6,,heat,all-year.morning,1.02 +2035,6,,electricity,all-year.afternoon,-0.40800000000000003 +2035,6,,heat,all-year.afternoon,1.02 +2035,6,,electricity,all-year.early-peak,-0.40800000000000003 +2035,6,,heat,all-year.early-peak,1.02 +2035,6,,electricity,all-year.late-peak,-0.40800000000000003 +2035,6,,heat,all-year.late-peak,1.02 +2035,6,,electricity,all-year.evening,-0.40800000000000003 +2035,6,,heat,all-year.evening,1.02 2035,7,,wind,all-year.night,-0.8 2035,7,,electricity,all-year.night,0.8 2035,7,,wind,all-year.morning,-0.0 @@ -163,10 +163,10 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2035,7,,electricity,all-year.afternoon,0.8 2035,7,,wind,all-year.early-peak,-0.0 2035,7,,electricity,all-year.early-peak,0.0 -2035,7,,wind,all-year.late-peak,-0.056100000000000205 -2035,7,,electricity,all-year.late-peak,0.056100000000000205 -2035,7,,wind,all-year.evening,-1.4146400000000026 -2035,7,,electricity,all-year.evening,1.4146400000000026 +2035,7,,wind,all-year.late-peak,-0.16180000000000117 +2035,7,,electricity,all-year.late-peak,0.16180000000000117 +2035,7,,wind,all-year.evening,-1.3491200000000032 +2035,7,,electricity,all-year.evening,1.3491200000000032 2040,2,,electricity,all-year.night,-0.0 2040,2,,heat,all-year.night,0.0 2040,2,,electricity,all-year.morning,-0.1979999999999998 @@ -187,8 +187,8 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2040,3,,electricity,all-year.afternoon,0.0 2040,3,,wind,all-year.early-peak,-0.0 2040,3,,electricity,all-year.early-peak,0.0 -2040,3,,wind,all-year.late-peak,-1.3813599999999977 -2040,3,,electricity,all-year.late-peak,1.3813599999999977 +2040,3,,wind,all-year.late-peak,-1.446879999999997 +2040,3,,electricity,all-year.late-peak,1.446879999999997 2040,3,,wind,all-year.evening,-0.0 2040,3,,electricity,all-year.evening,0.0 2040,4,,electricity,all-year.night,-0.12800000000000003 @@ -203,62 +203,62 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2040,4,,heat,all-year.late-peak,0.9900000000000005 2040,4,,electricity,all-year.evening,-0.39600000000000024 2040,4,,heat,all-year.evening,0.9900000000000005 -2040,5,,wind,all-year.night,-0.9320000000000002 -2040,5,,electricity,all-year.night,0.9320000000000002 +2040,5,,wind,all-year.night,-0.932 +2040,5,,electricity,all-year.night,0.932 2040,5,,wind,all-year.morning,-1.3980000000000001 2040,5,,electricity,all-year.morning,1.3980000000000001 2040,5,,wind,all-year.afternoon,-0.0 2040,5,,electricity,all-year.afternoon,0.0 -2040,5,,wind,all-year.early-peak,-1.1258293333333387 -2040,5,,electricity,all-year.early-peak,1.1258293333333387 +2040,5,,wind,all-year.early-peak,-0.9011013333333374 +2040,5,,electricity,all-year.early-peak,0.9011013333333374 2040,5,,wind,all-year.late-peak,-0.0 2040,5,,electricity,all-year.late-peak,0.0 2040,5,,wind,all-year.evening,-1.864 2040,5,,electricity,all-year.evening,1.864 -2040,6,,electricity,all-year.night,-0.40799999999999986 -2040,6,,heat,all-year.night,1.0199999999999996 -2040,6,,electricity,all-year.morning,-0.40799999999999986 -2040,6,,heat,all-year.morning,1.0199999999999996 -2040,6,,electricity,all-year.afternoon,-0.40799999999999986 -2040,6,,heat,all-year.afternoon,1.0199999999999996 -2040,6,,electricity,all-year.early-peak,-0.40799999999999986 -2040,6,,heat,all-year.early-peak,1.0199999999999996 -2040,6,,electricity,all-year.late-peak,-0.40799999999999986 -2040,6,,heat,all-year.late-peak,1.0199999999999996 -2040,6,,electricity,all-year.evening,-0.40799999999999986 -2040,6,,heat,all-year.evening,1.0199999999999996 +2040,6,,electricity,all-year.night,-0.40800000000000003 +2040,6,,heat,all-year.night,1.02 +2040,6,,electricity,all-year.morning,-0.40800000000000003 +2040,6,,heat,all-year.morning,1.02 +2040,6,,electricity,all-year.afternoon,-0.40800000000000003 +2040,6,,heat,all-year.afternoon,1.02 +2040,6,,electricity,all-year.early-peak,-0.40800000000000003 +2040,6,,heat,all-year.early-peak,1.02 +2040,6,,electricity,all-year.late-peak,-0.40800000000000003 +2040,6,,heat,all-year.late-peak,1.02 +2040,6,,electricity,all-year.evening,-0.40800000000000003 +2040,6,,heat,all-year.evening,1.02 2040,7,,wind,all-year.night,-0.0 2040,7,,electricity,all-year.night,0.0 2040,7,,wind,all-year.morning,-0.0 2040,7,,electricity,all-year.morning,0.0 -2040,7,,wind,all-year.afternoon,-0.9320000000000002 -2040,7,,electricity,all-year.afternoon,0.9320000000000002 +2040,7,,wind,all-year.afternoon,-0.932 +2040,7,,electricity,all-year.afternoon,0.932 2040,7,,wind,all-year.early-peak,-0.0 2040,7,,electricity,all-year.early-peak,0.0 -2040,7,,wind,all-year.late-peak,-1.4146400000000026 -2040,7,,electricity,all-year.late-peak,1.4146400000000026 +2040,7,,wind,all-year.late-peak,-1.3491200000000032 +2040,7,,electricity,all-year.late-peak,1.3491200000000032 2040,7,,wind,all-year.evening,-0.0 2040,7,,electricity,all-year.evening,0.0 -2040,8,,electricity,all-year.night,-0.3960000000000002 -2040,8,,heat,all-year.night,0.9900000000000004 -2040,8,,electricity,all-year.morning,-0.3960000000000002 -2040,8,,heat,all-year.morning,0.9900000000000004 -2040,8,,electricity,all-year.afternoon,-0.3960000000000002 -2040,8,,heat,all-year.afternoon,0.9900000000000004 -2040,8,,electricity,all-year.early-peak,-0.3960000000000002 -2040,8,,heat,all-year.early-peak,0.9900000000000004 -2040,8,,electricity,all-year.late-peak,-0.3960000000000002 -2040,8,,heat,all-year.late-peak,0.9900000000000004 -2040,8,,electricity,all-year.evening,-0.3960000000000002 -2040,8,,heat,all-year.evening,0.9900000000000004 +2040,8,,electricity,all-year.night,-0.396 +2040,8,,heat,all-year.night,0.99 +2040,8,,electricity,all-year.morning,-0.396 +2040,8,,heat,all-year.morning,0.99 +2040,8,,electricity,all-year.afternoon,-0.396 +2040,8,,heat,all-year.afternoon,0.99 +2040,8,,electricity,all-year.early-peak,-0.396 +2040,8,,heat,all-year.early-peak,0.99 +2040,8,,electricity,all-year.late-peak,-0.396 +2040,8,,heat,all-year.late-peak,0.99 +2040,8,,electricity,all-year.evening,-0.396 +2040,8,,heat,all-year.evening,0.99 2040,9,,wind,all-year.night,-0.0 2040,9,,electricity,all-year.night,0.0 2040,9,,wind,all-year.morning,-0.0 2040,9,,electricity,all-year.morning,0.0 2040,9,,wind,all-year.afternoon,-0.0 2040,9,,electricity,all-year.afternoon,0.0 -2040,9,,wind,all-year.early-peak,-0.27217066666666145 -2040,9,,electricity,all-year.early-peak,0.27217066666666145 +2040,9,,wind,all-year.early-peak,-0.4968986666666626 +2040,9,,electricity,all-year.early-peak,0.4968986666666626 2040,9,,wind,all-year.late-peak,-0.0 2040,9,,electricity,all-year.late-peak,0.0 2040,9,,wind,all-year.evening,-0.0 @@ -273,8 +273,8 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2045,2,,heat,all-year.early-peak,0.0 2045,2,,electricity,all-year.late-peak,-1.596 2045,2,,heat,all-year.late-peak,3.9899999999999998 -2045,2,,electricity,all-year.evening,-0.5320000000000003 -2045,2,,heat,all-year.evening,1.3300000000000005 +2045,2,,electricity,all-year.evening,-0.532 +2045,2,,heat,all-year.evening,1.33 2045,3,,wind,all-year.night,-0.0 2045,3,,electricity,all-year.night,0.0 2045,3,,wind,all-year.morning,-1.596 @@ -289,40 +289,40 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2045,3,,electricity,all-year.evening,2.1280000000000006 2045,4,,electricity,all-year.night,-0.0 2045,4,,heat,all-year.night,0.0 -2045,4,,electricity,all-year.morning,-0.39600000000000013 -2045,4,,heat,all-year.morning,0.9900000000000002 +2045,4,,electricity,all-year.morning,-0.3959999999999999 +2045,4,,heat,all-year.morning,0.9899999999999998 2045,4,,electricity,all-year.afternoon,-0.0 2045,4,,heat,all-year.afternoon,0.0 -2045,4,,electricity,all-year.early-peak,-0.39600000000000013 -2045,4,,heat,all-year.early-peak,0.9900000000000002 +2045,4,,electricity,all-year.early-peak,-0.3959999999999999 +2045,4,,heat,all-year.early-peak,0.9899999999999998 2045,4,,electricity,all-year.late-peak,-0.39600000000000024 2045,4,,heat,all-year.late-peak,0.9900000000000005 2045,4,,electricity,all-year.evening,-0.39600000000000024 2045,4,,heat,all-year.evening,0.9900000000000005 -2045,5,,wind,all-year.night,-0.0 -2045,5,,electricity,all-year.night,0.0 +2045,5,,wind,all-year.night,-0.32992138666666065 +2045,5,,electricity,all-year.night,0.32992138666666065 2045,5,,wind,all-year.morning,-0.0 2045,5,,electricity,all-year.morning,0.0 2045,5,,wind,all-year.afternoon,-0.0 2045,5,,electricity,all-year.afternoon,0.0 2045,5,,wind,all-year.early-peak,-0.0 2045,5,,electricity,all-year.early-peak,0.0 -2045,5,,wind,all-year.late-peak,-0.17839893333332418 -2045,5,,electricity,all-year.late-peak,0.17839893333332418 +2045,5,,wind,all-year.late-peak,-0.5585381333333262 +2045,5,,electricity,all-year.late-peak,0.5585381333333262 2045,5,,wind,all-year.evening,-0.0 2045,5,,electricity,all-year.evening,0.0 2045,6,,electricity,all-year.night,-0.27199999999999996 2045,6,,heat,all-year.night,0.6799999999999999 -2045,6,,electricity,all-year.morning,-0.40799999999999986 -2045,6,,heat,all-year.morning,1.0199999999999996 +2045,6,,electricity,all-year.morning,-0.40800000000000003 +2045,6,,heat,all-year.morning,1.02 2045,6,,electricity,all-year.afternoon,-0.27199999999999996 2045,6,,heat,all-year.afternoon,0.6799999999999999 -2045,6,,electricity,all-year.early-peak,-0.40799999999999986 -2045,6,,heat,all-year.early-peak,1.0199999999999996 -2045,6,,electricity,all-year.late-peak,-0.40799999999999986 -2045,6,,heat,all-year.late-peak,1.0199999999999996 -2045,6,,electricity,all-year.evening,-0.40799999999999986 -2045,6,,heat,all-year.evening,1.0199999999999996 +2045,6,,electricity,all-year.early-peak,-0.40800000000000003 +2045,6,,heat,all-year.early-peak,1.02 +2045,6,,electricity,all-year.late-peak,-0.40800000000000003 +2045,6,,heat,all-year.late-peak,1.02 +2045,6,,electricity,all-year.evening,-0.40800000000000003 +2045,6,,heat,all-year.evening,1.02 2045,7,,wind,all-year.night,-0.0 2045,7,,electricity,all-year.night,0.0 2045,7,,wind,all-year.morning,-0.0 @@ -331,22 +331,22 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2045,7,,electricity,all-year.afternoon,0.0 2045,7,,wind,all-year.early-peak,-0.0 2045,7,,electricity,all-year.early-peak,0.0 -2045,7,,wind,all-year.late-peak,-1.4146400000000026 -2045,7,,electricity,all-year.late-peak,1.4146400000000026 +2045,7,,wind,all-year.late-peak,-1.3491200000000032 +2045,7,,electricity,all-year.late-peak,1.3491200000000032 2045,7,,wind,all-year.evening,-0.0 2045,7,,electricity,all-year.evening,0.0 -2045,8,,electricity,all-year.night,-0.3960000000000002 -2045,8,,heat,all-year.night,0.9900000000000004 -2045,8,,electricity,all-year.morning,-0.3960000000000002 -2045,8,,heat,all-year.morning,0.9900000000000004 -2045,8,,electricity,all-year.afternoon,-0.3960000000000002 -2045,8,,heat,all-year.afternoon,0.9900000000000004 -2045,8,,electricity,all-year.early-peak,-0.3960000000000002 -2045,8,,heat,all-year.early-peak,0.9900000000000004 -2045,8,,electricity,all-year.late-peak,-0.3960000000000002 -2045,8,,heat,all-year.late-peak,0.9900000000000004 -2045,8,,electricity,all-year.evening,-0.3960000000000002 -2045,8,,heat,all-year.evening,0.9900000000000004 +2045,8,,electricity,all-year.night,-0.396 +2045,8,,heat,all-year.night,0.99 +2045,8,,electricity,all-year.morning,-0.396 +2045,8,,heat,all-year.morning,0.99 +2045,8,,electricity,all-year.afternoon,-0.396 +2045,8,,heat,all-year.afternoon,0.99 +2045,8,,electricity,all-year.early-peak,-0.396 +2045,8,,heat,all-year.early-peak,0.99 +2045,8,,electricity,all-year.late-peak,-0.396 +2045,8,,heat,all-year.late-peak,0.99 +2045,8,,electricity,all-year.evening,-0.396 +2045,8,,heat,all-year.evening,0.99 2045,9,,wind,all-year.night,-0.0 2045,9,,electricity,all-year.night,0.0 2045,9,,wind,all-year.morning,-0.0 @@ -359,28 +359,28 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2045,9,,electricity,all-year.late-peak,0.0 2045,9,,wind,all-year.evening,-0.0 2045,9,,electricity,all-year.evening,0.0 -2045,10,,electricity,all-year.night,-0.3959999999999999 -2045,10,,heat,all-year.night,0.9899999999999998 -2045,10,,electricity,all-year.morning,-0.3959999999999999 -2045,10,,heat,all-year.morning,0.9899999999999998 -2045,10,,electricity,all-year.afternoon,-0.3959999999999999 -2045,10,,heat,all-year.afternoon,0.9899999999999998 -2045,10,,electricity,all-year.early-peak,-0.3959999999999999 -2045,10,,heat,all-year.early-peak,0.9899999999999998 -2045,10,,electricity,all-year.late-peak,-0.3959999999999999 -2045,10,,heat,all-year.late-peak,0.9899999999999998 -2045,10,,electricity,all-year.evening,-0.3959999999999999 -2045,10,,heat,all-year.evening,0.9899999999999998 -2045,11,,wind,all-year.night,-1.064 -2045,11,,electricity,all-year.night,1.064 +2045,10,,electricity,all-year.night,-0.39600000000000013 +2045,10,,heat,all-year.night,0.9900000000000002 +2045,10,,electricity,all-year.morning,-0.39600000000000013 +2045,10,,heat,all-year.morning,0.9900000000000002 +2045,10,,electricity,all-year.afternoon,-0.39600000000000013 +2045,10,,heat,all-year.afternoon,0.9900000000000002 +2045,10,,electricity,all-year.early-peak,-0.39600000000000013 +2045,10,,heat,all-year.early-peak,0.9900000000000002 +2045,10,,electricity,all-year.late-peak,-0.39600000000000013 +2045,10,,heat,all-year.late-peak,0.9900000000000002 +2045,10,,electricity,all-year.evening,-0.39600000000000013 +2045,10,,heat,all-year.evening,0.9900000000000002 +2045,11,,wind,all-year.night,-0.7340786133333395 +2045,11,,electricity,all-year.night,0.7340786133333395 2045,11,,wind,all-year.morning,-0.0 2045,11,,electricity,all-year.morning,0.0 2045,11,,wind,all-year.afternoon,-1.064 2045,11,,electricity,all-year.afternoon,1.064 2045,11,,wind,all-year.early-peak,-0.0 2045,11,,electricity,all-year.early-peak,0.0 -2045,11,,wind,all-year.late-peak,-1.5989610666666736 -2045,11,,electricity,all-year.late-peak,1.5989610666666736 +2045,11,,wind,all-year.late-peak,-1.2843418666666708 +2045,11,,electricity,all-year.late-peak,1.2843418666666708 2045,11,,wind,all-year.evening,-0.0 2045,11,,electricity,all-year.evening,0.0 2050,2,,electricity,all-year.night,-0.0 @@ -393,8 +393,8 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2050,2,,heat,all-year.early-peak,0.0 2050,2,,electricity,all-year.late-peak,-1.596 2050,2,,heat,all-year.late-peak,3.9899999999999998 -2050,2,,electricity,all-year.evening,-0.39600000000000046 -2050,2,,heat,all-year.evening,0.9900000000000011 +2050,2,,electricity,all-year.evening,-0.3960000000000003 +2050,2,,heat,all-year.evening,0.9900000000000007 2050,3,,wind,all-year.night,-0.0 2050,3,,electricity,all-year.night,0.0 2050,3,,wind,all-year.morning,-0.0 @@ -409,68 +409,68 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2050,3,,electricity,all-year.evening,0.0 2050,4,,electricity,all-year.night,-0.0 2050,4,,heat,all-year.night,0.0 -2050,4,,electricity,all-year.morning,-0.19200000000000053 -2050,4,,heat,all-year.morning,0.4800000000000013 +2050,4,,electricity,all-year.morning,-0.19200000000000036 +2050,4,,heat,all-year.morning,0.48000000000000087 2050,4,,electricity,all-year.afternoon,-0.0 2050,4,,heat,all-year.afternoon,0.0 -2050,4,,electricity,all-year.early-peak,-0.19200000000000053 -2050,4,,heat,all-year.early-peak,0.4800000000000013 +2050,4,,electricity,all-year.early-peak,-0.19200000000000036 +2050,4,,heat,all-year.early-peak,0.48000000000000087 2050,4,,electricity,all-year.late-peak,-0.39600000000000024 2050,4,,heat,all-year.late-peak,0.9900000000000005 2050,4,,electricity,all-year.evening,-0.39600000000000024 2050,4,,heat,all-year.evening,0.9900000000000005 -2050,5,,wind,all-year.night,-0.0 -2050,5,,electricity,all-year.night,0.0 +2050,5,,wind,all-year.night,-0.8895528533333165 +2050,5,,electricity,all-year.night,0.8895528533333165 2050,5,,wind,all-year.morning,-0.0 2050,5,,electricity,all-year.morning,0.0 2050,5,,wind,all-year.afternoon,-0.0 2050,5,,electricity,all-year.afternoon,0.0 2050,5,,wind,all-year.early-peak,-0.0 2050,5,,electricity,all-year.early-peak,0.0 -2050,5,,wind,all-year.late-peak,-2.1543867733333144 -2050,5,,electricity,all-year.late-peak,2.1543867733333144 +2050,5,,wind,all-year.late-peak,-2.238199999999999 +2050,5,,electricity,all-year.late-peak,2.238199999999999 2050,5,,wind,all-year.evening,-0.0 2050,5,,electricity,all-year.evening,0.0 2050,6,,electricity,all-year.night,0.0 2050,6,,heat,all-year.night,-0.0 -2050,6,,electricity,all-year.morning,-0.40799999999999986 -2050,6,,heat,all-year.morning,1.0199999999999996 +2050,6,,electricity,all-year.morning,-0.40800000000000003 +2050,6,,heat,all-year.morning,1.02 2050,6,,electricity,all-year.afternoon,0.0 2050,6,,heat,all-year.afternoon,-0.0 -2050,6,,electricity,all-year.early-peak,-0.40799999999999986 -2050,6,,heat,all-year.early-peak,1.0199999999999996 -2050,6,,electricity,all-year.late-peak,-0.40799999999999986 -2050,6,,heat,all-year.late-peak,1.0199999999999996 -2050,6,,electricity,all-year.evening,-0.40799999999999986 -2050,6,,heat,all-year.evening,1.0199999999999996 +2050,6,,electricity,all-year.early-peak,-0.40800000000000003 +2050,6,,heat,all-year.early-peak,1.02 +2050,6,,electricity,all-year.late-peak,-0.40800000000000003 +2050,6,,heat,all-year.late-peak,1.02 +2050,6,,electricity,all-year.evening,-0.40800000000000003 +2050,6,,heat,all-year.evening,1.02 2050,7,,wind,all-year.night,-0.0 2050,7,,electricity,all-year.night,0.0 2050,7,,wind,all-year.morning,-0.0 2050,7,,electricity,all-year.morning,0.0 2050,7,,wind,all-year.afternoon,-1.1999999999999997 2050,7,,electricity,all-year.afternoon,1.1999999999999997 -2050,7,,wind,all-year.early-peak,-0.8246666666666663 -2050,7,,electricity,all-year.early-peak,0.8246666666666663 +2050,7,,wind,all-year.early-peak,-0.9437333333333321 +2050,7,,electricity,all-year.early-peak,0.9437333333333321 2050,7,,wind,all-year.late-peak,-0.0 2050,7,,electricity,all-year.late-peak,0.0 -2050,7,,wind,all-year.evening,-1.3704693333333404 -2050,7,,electricity,all-year.evening,1.3704693333333404 -2050,8,,electricity,all-year.night,-0.3960000000000002 -2050,8,,heat,all-year.night,0.9900000000000004 -2050,8,,electricity,all-year.morning,-0.3960000000000002 -2050,8,,heat,all-year.morning,0.9900000000000004 -2050,8,,electricity,all-year.afternoon,-0.3960000000000002 -2050,8,,heat,all-year.afternoon,0.9900000000000004 -2050,8,,electricity,all-year.early-peak,-0.3960000000000002 -2050,8,,heat,all-year.early-peak,0.9900000000000004 -2050,8,,electricity,all-year.late-peak,-0.3960000000000002 -2050,8,,heat,all-year.late-peak,0.9900000000000004 -2050,8,,electricity,all-year.evening,-0.3960000000000002 -2050,8,,heat,all-year.evening,0.9900000000000004 +2050,7,,wind,all-year.evening,-1.0941546666666762 +2050,7,,electricity,all-year.evening,1.0941546666666762 +2050,8,,electricity,all-year.night,-0.396 +2050,8,,heat,all-year.night,0.99 +2050,8,,electricity,all-year.morning,-0.396 +2050,8,,heat,all-year.morning,0.99 +2050,8,,electricity,all-year.afternoon,-0.396 +2050,8,,heat,all-year.afternoon,0.99 +2050,8,,electricity,all-year.early-peak,-0.396 +2050,8,,heat,all-year.early-peak,0.99 +2050,8,,electricity,all-year.late-peak,-0.396 +2050,8,,heat,all-year.late-peak,0.99 +2050,8,,electricity,all-year.evening,-0.396 +2050,8,,heat,all-year.evening,0.99 2050,9,,wind,all-year.night,-0.0 2050,9,,electricity,all-year.night,0.0 -2050,9,,wind,all-year.morning,-0.27217066666666145 -2050,9,,electricity,all-year.morning,0.27217066666666145 +2050,9,,wind,all-year.morning,-0.4968986666666626 +2050,9,,electricity,all-year.morning,0.4968986666666626 2050,9,,wind,all-year.afternoon,-0.0 2050,9,,electricity,all-year.afternoon,0.0 2050,9,,wind,all-year.early-peak,-0.0 @@ -479,30 +479,30 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2050,9,,electricity,all-year.late-peak,0.0 2050,9,,wind,all-year.evening,-0.0 2050,9,,electricity,all-year.evening,0.0 -2050,10,,electricity,all-year.night,-0.3959999999999999 -2050,10,,heat,all-year.night,0.9899999999999998 -2050,10,,electricity,all-year.morning,-0.3959999999999999 -2050,10,,heat,all-year.morning,0.9899999999999998 -2050,10,,electricity,all-year.afternoon,-0.3959999999999999 -2050,10,,heat,all-year.afternoon,0.9899999999999998 -2050,10,,electricity,all-year.early-peak,-0.3959999999999999 -2050,10,,heat,all-year.early-peak,0.9899999999999998 -2050,10,,electricity,all-year.late-peak,-0.3959999999999999 -2050,10,,heat,all-year.late-peak,0.9899999999999998 -2050,10,,electricity,all-year.evening,-0.3959999999999999 -2050,10,,heat,all-year.evening,0.9899999999999998 -2050,11,,wind,all-year.night,-1.1999999999999997 -2050,11,,electricity,all-year.night,1.1999999999999997 -2050,11,,wind,all-year.morning,-1.5278293333333388 -2050,11,,electricity,all-year.morning,1.5278293333333388 +2050,10,,electricity,all-year.night,-0.39600000000000013 +2050,10,,heat,all-year.night,0.9900000000000002 +2050,10,,electricity,all-year.morning,-0.39600000000000013 +2050,10,,heat,all-year.morning,0.9900000000000002 +2050,10,,electricity,all-year.afternoon,-0.39600000000000013 +2050,10,,heat,all-year.afternoon,0.9900000000000002 +2050,10,,electricity,all-year.early-peak,-0.39600000000000013 +2050,10,,heat,all-year.early-peak,0.9900000000000002 +2050,10,,electricity,all-year.late-peak,-0.39600000000000013 +2050,10,,heat,all-year.late-peak,0.9900000000000002 +2050,10,,electricity,all-year.evening,-0.39600000000000013 +2050,10,,heat,all-year.evening,0.9900000000000002 +2050,11,,wind,all-year.night,-0.3104471466666834 +2050,11,,electricity,all-year.night,0.3104471466666834 +2050,11,,wind,all-year.morning,-1.2843418666666708 +2050,11,,electricity,all-year.morning,1.2843418666666708 2050,11,,wind,all-year.afternoon,-0.0 2050,11,,electricity,all-year.afternoon,0.0 2050,11,,wind,all-year.early-peak,-0.0 2050,11,,electricity,all-year.early-peak,0.0 -2050,11,,wind,all-year.late-peak,-1.0554798933333518 -2050,11,,electricity,all-year.late-peak,1.0554798933333518 -2050,11,,wind,all-year.evening,-0.05419733333332599 -2050,11,,electricity,all-year.evening,0.05419733333332599 +2050,11,,wind,all-year.late-peak,-1.0380528000000002 +2050,11,,electricity,all-year.late-peak,1.0380528000000002 +2050,11,,wind,all-year.evening,-0.4495786666666559 +2050,11,,electricity,all-year.evening,0.4495786666666559 2050,12,,electricity,all-year.night,-0.4079999999999997 2050,12,,heat,all-year.night,1.0199999999999991 2050,12,,electricity,all-year.morning,-0.4079999999999997 @@ -517,13 +517,13 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2050,12,,heat,all-year.evening,1.0199999999999991 2050,13,,wind,all-year.night,-0.0 2050,13,,electricity,all-year.night,0.0 -2050,13,,wind,all-year.morning,-0.0 -2050,13,,electricity,all-year.morning,0.0 +2050,13,,wind,all-year.morning,-0.018759466666666773 +2050,13,,electricity,all-year.morning,0.018759466666666773 2050,13,,wind,all-year.afternoon,-0.0 2050,13,,electricity,all-year.afternoon,0.0 -2050,13,,wind,all-year.early-peak,-0.9753333333333338 -2050,13,,electricity,all-year.early-peak,0.9753333333333338 -2050,13,,wind,all-year.late-peak,-0.3901333333333339 -2050,13,,electricity,all-year.late-peak,0.3901333333333339 -2050,13,,wind,all-year.evening,-0.9753333333333338 -2050,13,,electricity,all-year.evening,0.9753333333333338 +2050,13,,wind,all-year.early-peak,-0.8562666666666682 +2050,13,,electricity,all-year.early-peak,0.8562666666666682 +2050,13,,wind,all-year.late-peak,-0.3237472000000007 +2050,13,,electricity,all-year.late-peak,0.3237472000000007 +2050,13,,wind,all-year.evening,-0.8562666666666682 +2050,13,,electricity,all-year.evening,0.8562666666666682 diff --git a/tests/data/muse1_default/commodity_prices.csv b/tests/data/muse1_default/commodity_prices.csv index f44e24967..4fa80f2b0 100644 --- a/tests/data/muse1_default/commodity_prices.csv +++ b/tests/data/muse1_default/commodity_prices.csv @@ -3,7 +3,7 @@ milestone_year,commodity_id,region_id,time_slice,price 2020,gas,R1,all-year.morning,2.55 2020,gas,R1,all-year.afternoon,2.55 2020,gas,R1,all-year.early-peak,2.55 -2020,gas,R1,all-year.late-peak,2.5499999999999994 +2020,gas,R1,all-year.late-peak,2.55 2020,gas,R1,all-year.evening,2.55 2020,electricity,R1,all-year.night,9.10681905636597 2020,electricity,R1,all-year.morning,9.10681905636597 @@ -23,99 +23,99 @@ milestone_year,commodity_id,region_id,time_slice,price 2025,gas,R1,all-year.early-peak,2.55 2025,gas,R1,all-year.late-peak,2.55 2025,gas,R1,all-year.evening,2.55 -2025,electricity,R1,all-year.night,9.10687611710739 -2025,electricity,R1,all-year.morning,9.10687611710739 -2025,electricity,R1,all-year.afternoon,9.10687611710739 -2025,electricity,R1,all-year.early-peak,9.10687611710739 -2025,electricity,R1,all-year.late-peak,9.10687611710739 -2025,electricity,R1,all-year.evening,9.10687611710739 -2025,heat,R1,all-year.night,5.24401831140014 -2025,heat,R1,all-year.morning,5.24401831140014 -2025,heat,R1,all-year.afternoon,5.24401831140014 -2025,heat,R1,all-year.early-peak,5.24401831140014 -2025,heat,R1,all-year.late-peak,5.24401831140014 -2025,heat,R1,all-year.evening,5.24401831140014 +2025,electricity,R1,all-year.night,9.653288684133836 +2025,electricity,R1,all-year.morning,9.653288684133836 +2025,electricity,R1,all-year.afternoon,9.653288684133836 +2025,electricity,R1,all-year.early-peak,9.653288684133836 +2025,electricity,R1,all-year.late-peak,9.653288684133836 +2025,electricity,R1,all-year.evening,9.653288684133836 +2025,heat,R1,all-year.night,5.4625833382107185 +2025,heat,R1,all-year.morning,5.4625833382107185 +2025,heat,R1,all-year.afternoon,5.4625833382107185 +2025,heat,R1,all-year.early-peak,5.4625833382107185 +2025,heat,R1,all-year.late-peak,5.4625833382107185 +2025,heat,R1,all-year.evening,5.4625833382107185 2030,gas,R1,all-year.night,2.55 2030,gas,R1,all-year.morning,2.55 2030,gas,R1,all-year.afternoon,2.55 2030,gas,R1,all-year.early-peak,2.55 2030,gas,R1,all-year.late-peak,2.55 2030,gas,R1,all-year.evening,2.55 -2030,electricity,R1,all-year.night,15.43057099225766 -2030,electricity,R1,all-year.morning,15.430570992257662 -2030,electricity,R1,all-year.afternoon,15.430570992257662 -2030,electricity,R1,all-year.early-peak,15.430570992257662 -2030,electricity,R1,all-year.late-peak,14.592927890306692 -2030,electricity,R1,all-year.evening,14.592927890306692 -2030,heat,R1,all-year.night,7.509112706206558 -2030,heat,R1,all-year.morning,7.729430488524835 -2030,heat,R1,all-year.afternoon,7.509112706206559 -2030,heat,R1,all-year.early-peak,7.729430488524835 -2030,heat,R1,all-year.late-peak,7.6146895553708855 -2030,heat,R1,all-year.evening,7.504531585893219 +2030,electricity,R1,all-year.night,14.734717349234643 +2030,electricity,R1,all-year.morning,14.734717349234643 +2030,electricity,R1,all-year.afternoon,14.734717349234645 +2030,electricity,R1,all-year.early-peak,14.734717349234643 +2030,electricity,R1,all-year.late-peak,15.468503563725099 +2030,electricity,R1,all-year.evening,15.468503563725097 +2030,heat,R1,all-year.night,7.230771248997349 +2030,heat,R1,all-year.morning,7.451089031315626 +2030,heat,R1,all-year.afternoon,7.230771248997351 +2030,heat,R1,all-year.early-peak,7.451089031315626 +2030,heat,R1,all-year.late-peak,7.96491982473825 +2030,heat,R1,all-year.evening,7.854761855260581 2035,gas,R1,all-year.night,2.55 2035,gas,R1,all-year.morning,2.55 2035,gas,R1,all-year.afternoon,2.55 2035,gas,R1,all-year.early-peak,2.55 2035,gas,R1,all-year.late-peak,2.55 2035,gas,R1,all-year.evening,2.55 -2035,electricity,R1,all-year.night,9.106819056365968 -2035,electricity,R1,all-year.morning,15.132700826880638 -2035,electricity,R1,all-year.afternoon,39.72785442267275 -2035,electricity,R1,all-year.early-peak,15.13270082688064 -2035,electricity,R1,all-year.late-peak,11.58082058272924 -2035,electricity,R1,all-year.evening,17.13534831905787 -2035,heat,R1,all-year.night,4.53378926825848 -2035,heat,R1,all-year.morning,7.533001006556153 -2035,heat,R1,all-year.afternoon,16.782203414781197 -2035,heat,R1,all-year.early-peak,7.533001006556153 -2035,heat,R1,all-year.late-peak,6.710034002723222 -2035,heat,R1,all-year.evening,8.632952965471958 +2035,electricity,R1,all-year.night,9.10681905636597 +2035,electricity,R1,all-year.morning,14.175917539940446 +2035,electricity,R1,all-year.afternoon,39.165589325656455 +2035,electricity,R1,all-year.early-peak,14.175917539940444 +2035,electricity,R1,all-year.late-peak,11.326388523938252 +2035,electricity,R1,all-year.evening,18.71119733280958 +2035,heat,R1,all-year.night,4.533789268258482 +2035,heat,R1,all-year.morning,7.150287691780076 +2035,heat,R1,all-year.afternoon,16.557297375974677 +2035,heat,R1,all-year.early-peak,7.150287691780075 +2035,heat,R1,all-year.late-peak,6.608261179206827 +2035,heat,R1,all-year.evening,9.263292570972641 2040,gas,R1,all-year.night,2.55 2040,gas,R1,all-year.morning,2.55 2040,gas,R1,all-year.afternoon,2.55 2040,gas,R1,all-year.early-peak,2.55 2040,gas,R1,all-year.late-peak,2.55 2040,gas,R1,all-year.evening,2.55 -2040,electricity,R1,all-year.night,11.551806719090832 -2040,electricity,R1,all-year.morning,11.551806719090832 -2040,electricity,R1,all-year.afternoon,23.693535151235235 -2040,electricity,R1,all-year.early-peak,10.992835636183145 -2040,electricity,R1,all-year.late-peak,18.113851045571835 -2040,electricity,R1,all-year.evening,11.551806719090832 -2040,heat,R1,all-year.night,5.54589890385714 -2040,heat,R1,all-year.morning,5.911976383327804 -2040,heat,R1,all-year.afternoon,10.402590276714898 -2040,heat,R1,all-year.early-peak,5.68838795016473 -2040,heat,R1,all-year.late-peak,9.494853006488642 -2040,heat,R1,all-year.evening,6.391006400704199 +2040,electricity,R1,all-year.night,12.103895409404142 +2040,electricity,R1,all-year.morning,12.103895409404142 +2040,electricity,R1,all-year.afternoon,22.31468547991559 +2040,electricity,R1,all-year.early-peak,10.96927723008599 +2040,electricity,R1,all-year.late-peak,19.215114443435876 +2040,electricity,R1,all-year.evening,12.103895409404142 +2040,heat,R1,all-year.night,5.766734379982463 +2040,heat,R1,all-year.morning,6.132811859453127 +2040,heat,R1,all-year.afternoon,9.851050408187039 +2040,heat,R1,all-year.early-peak,5.678964587725866 +2040,heat,R1,all-year.late-peak,9.935358365634258 +2040,heat,R1,all-year.evening,6.611841876829523 2045,gas,R1,all-year.night,2.55 2045,gas,R1,all-year.morning,2.55 2045,gas,R1,all-year.afternoon,2.55 2045,gas,R1,all-year.early-peak,2.55 2045,gas,R1,all-year.late-peak,2.55 2045,gas,R1,all-year.evening,2.55 -2045,electricity,R1,all-year.night,16.616031039950602 -2045,electricity,R1,all-year.morning,11.269056517737345 -2045,electricity,R1,all-year.afternoon,17.429210280287013 -2045,electricity,R1,all-year.early-peak,20.28981504992847 -2045,electricity,R1,all-year.late-peak,15.776805108009633 -2045,electricity,R1,all-year.evening,16.231857498789626 -2045,heat,R1,all-year.night,7.5644266728848235 -2045,heat,R1,all-year.morning,5.536001134928378 -2045,heat,R1,all-year.afternoon,7.889698369019387 -2045,heat,R1,all-year.early-peak,9.144304547804829 -2045,heat,R1,all-year.late-peak,8.826491162156746 -2045,heat,R1,all-year.evening,8.26481202562894 -2050,electricity,R1,all-year.night,9.106819056365971 -2050,electricity,R1,all-year.morning,11.034626067086691 +2045,electricity,R1,all-year.night,15.035168624099324 +2045,electricity,R1,all-year.morning,11.524350754788806 +2045,electricity,R1,all-year.afternoon,16.279422982755726 +2045,electricity,R1,all-year.early-peak,22.564115185121288 +2045,electricity,R1,all-year.late-peak,15.342828617228328 +2045,electricity,R1,all-year.evening,15.035168624099324 +2045,heat,R1,all-year.night,6.932081706544311 +2045,heat,R1,all-year.morning,5.6381188297489615 +2045,heat,R1,all-year.afternoon,7.429783450006872 +2045,heat,R1,all-year.early-peak,10.054024601881952 +2045,heat,R1,all-year.late-peak,8.652900565844224 +2045,heat,R1,all-year.evening,7.786136475752818 +2050,electricity,R1,all-year.night,13.950031755274178 +2050,electricity,R1,all-year.morning,12.62639280378593 2050,electricity,R1,all-year.afternoon,9.10681905636597 -2050,electricity,R1,all-year.early-peak,9.106819056365968 -2050,electricity,R1,all-year.late-peak,17.887242702128262 +2050,electricity,R1,all-year.early-peak,9.10681905636597 +2050,electricity,R1,all-year.late-peak,13.168814406830194 2050,electricity,R1,all-year.evening,9.10681905636597 -2050,heat,R1,all-year.night,4.532314191949223 -2050,heat,R1,all-year.morning,5.501082556487147 -2050,heat,R1,all-year.afternoon,4.532314191949221 -2050,heat,R1,all-year.early-peak,4.729959752198857 -2050,heat,R1,all-year.late-peak,9.696252914335698 -2050,heat,R1,all-year.evening,5.316538233063759 +2050,heat,R1,all-year.night,6.4695992715125055 +2050,heat,R1,all-year.morning,6.1377892511668435 +2050,heat,R1,all-year.afternoon,4.532314191949222 +2050,heat,R1,all-year.early-peak,4.729959752198859 +2050,heat,R1,all-year.late-peak,7.808881596216472 +2050,heat,R1,all-year.evening,5.316538233063761 diff --git a/tests/data/two_regions/asset_capacities.csv b/tests/data/two_regions/asset_capacities.csv index ccb4b86f0..bd8be8be7 100644 --- a/tests/data/two_regions/asset_capacities.csv +++ b/tests/data/two_regions/asset_capacities.csv @@ -7,95 +7,95 @@ milestone_year,asset_id,group_id,capacity,num_units 2025,3,,19.0, 2025,4,,23.939952120095757, 2025,5,,4.939952120095759, -2025,6,,13.299973400053199, +2025,6,,14.097971804056394, 2025,7,,3.77034445931108, 2030,2,,24.0, 2030,3,,19.0, 2030,4,,23.939952120095757, 2030,5,,4.939952120095759, -2030,6,,13.299973400053199, +2030,6,,14.097971804056394, 2030,7,,3.77034445931108, 2030,8,,5.939988120023763, 2030,9,,5.939988120023761, -2030,10,,14.063371873256253, +2030,10,,13.42917314165371, 2030,11,,6.890386219227559, 2035,2,,24.0, 2035,3,,19.0, 2035,4,,23.939952120095757, 2035,5,,4.939952120095759, -2035,6,,13.299973400053199, +2035,6,,14.097971804056394, 2035,7,,3.77034445931108, 2035,8,,5.939988120023763, 2035,9,,5.939988120023761, -2035,10,,14.063371873256253, +2035,10,,13.42917314165371, 2035,11,,6.890386219227559, -2035,12,,6.119987760024477, +2035,12,,6.11998776002448, 2035,13,,6.119987760024477, -2035,14,,8.487823024353967, +2035,14,,8.094703810592398, 2035,15,,7.099185801628392, 2040,2,,24.0, 2040,3,,19.0, 2040,4,,23.939952120095757, 2040,5,,4.939952120095759, -2040,6,,13.299973400053199, +2040,6,,14.097971804056394, 2040,7,,3.77034445931108, 2040,8,,5.939988120023763, 2040,9,,5.939988120023761, -2040,10,,14.063371873256253, +2040,10,,13.42917314165371, 2040,11,,6.890386219227559, -2040,12,,6.119987760024477, +2040,12,,6.11998776002448, 2040,13,,6.119987760024477, -2040,14,,8.487823024353967, +2040,14,,8.094703810592398, 2040,15,,7.099185801628392, -2040,16,,5.939988120023762, +2040,16,,5.939988120023759, 2040,17,,5.939988120023761, -2040,18,,1.6330207339585008, +2040,18,,2.981386037227901, 2040,19,,6.8903862192275644, 2045,2,,24.0, 2045,3,,19.0, 2045,4,,23.939952120095757, 2045,5,,4.939952120095759, -2045,6,,13.299973400053199, +2045,6,,14.097971804056394, 2045,7,,3.77034445931108, 2045,8,,5.939988120023763, 2045,9,,5.939988120023761, -2045,10,,14.063371873256253, +2045,10,,13.42917314165371, 2045,11,,6.890386219227559, -2045,12,,6.119987760024477, +2045,12,,6.11998776002448, 2045,13,,6.119987760024477, -2045,14,,8.487823024353967, +2045,14,,8.094703810592398, 2045,15,,7.099185801628392, -2045,16,,5.939988120023762, +2045,16,,5.939988120023759, 2045,17,,5.939988120023761, -2045,18,,1.6330207339585008, +2045,18,,2.981386037227901, 2045,19,,6.8903862192275644, -2045,20,,5.939988120023759, +2045,20,,5.939988120023761, 2045,21,,5.939988120023761, -2045,22,,9.593747212505615, +2045,22,,7.706035787928449, 2045,23,,6.8903862192275644, 2050,2,,24.0, 2050,3,,19.0, 2050,4,,23.939952120095757, 2050,5,,4.939952120095759, -2050,6,,13.299973400053199, +2050,6,,14.097971804056394, 2050,7,,3.77034445931108, 2050,8,,5.939988120023763, 2050,9,,5.939988120023761, -2050,10,,14.063371873256253, +2050,10,,13.42917314165371, 2050,11,,6.890386219227559, -2050,12,,6.119987760024477, +2050,12,,6.11998776002448, 2050,13,,6.119987760024477, -2050,14,,8.487823024353967, +2050,14,,8.094703810592398, 2050,15,,7.099185801628392, -2050,16,,5.939988120023762, +2050,16,,5.939988120023759, 2050,17,,5.939988120023761, -2050,18,,1.6330207339585008, +2050,18,,2.981386037227901, 2050,19,,6.8903862192275644, -2050,20,,5.939988120023759, +2050,20,,5.939988120023761, 2050,21,,5.939988120023761, -2050,22,,9.593747212505615, +2050,22,,7.706035787928449, 2050,23,,6.8903862192275644, -2050,24,,6.1199877600244745, +2050,24,,6.119987760024472, 2050,25,,6.119987760024477, -2050,26,,5.851988296023411, +2050,26,,5.137589724820559, 2050,27,,7.099185801628382, diff --git a/tests/data/two_regions/commodity_flows.csv b/tests/data/two_regions/commodity_flows.csv index 60b6fe17d..3bd196405 100644 --- a/tests/data/two_regions/commodity_flows.csv +++ b/tests/data/two_regions/commodity_flows.csv @@ -122,7 +122,7 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2030,2,,gas,all-year.night,1.9256 2030,2,,gas,all-year.morning,2.260008 2030,2,,gas,all-year.afternoon,1.9256 -2030,2,,gas,all-year.early-peak,1.7400000000000002 +2030,2,,gas,all-year.early-peak,1.7400000000000004 2030,2,,gas,all-year.late-peak,4.000008 2030,2,,gas,all-year.evening,3.222808 2030,3,,gas,all-year.night,-0.0 @@ -173,18 +173,18 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2030,5,,gas,all-year.evening,-0.9550593199999998 2030,5,,heat,all-year.evening,0.8233269999999999 2030,5,,CO2f,all-year.evening,53.27749016999999 -2030,6,,wind,all-year.night,-0.6640000000000001 -2030,6,,electricity,all-year.night,0.6640000000000001 +2030,6,,wind,all-year.night,-0.664 +2030,6,,electricity,all-year.night,0.664 2030,6,,wind,all-year.morning,-0.0 2030,6,,electricity,all-year.morning,0.0 2030,6,,wind,all-year.afternoon,-0.0 2030,6,,electricity,all-year.afternoon,0.0 2030,6,,wind,all-year.early-peak,-0.0 2030,6,,electricity,all-year.early-peak,0.0 -2030,6,,wind,all-year.late-peak,-1.9920000000000004 -2030,6,,electricity,all-year.late-peak,1.9920000000000004 -2030,6,,wind,all-year.evening,-1.3280000000000003 -2030,6,,electricity,all-year.evening,1.3280000000000003 +2030,6,,wind,all-year.late-peak,-1.9920000000000002 +2030,6,,electricity,all-year.late-peak,1.9920000000000002 +2030,6,,wind,all-year.evening,-1.328 +2030,6,,electricity,all-year.evening,1.328 2030,7,,gas,all-year.night,0.0 2030,7,,gas,all-year.morning,0.6283919999999998 2030,7,,gas,all-year.afternoon,0.0 @@ -240,9 +240,9 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2030,11,,gas,all-year.late-peak,1.1483999999999996 2030,11,,gas,all-year.evening,0.0 2035,2,,gas,all-year.night,0.5432080000000004 -2035,2,,gas,all-year.morning,0.5200080000000007 +2035,2,,gas,all-year.morning,0.5200080000000009 2035,2,,gas,all-year.afternoon,2.32 -2035,2,,gas,all-year.early-peak,0.5200080000000007 +2035,2,,gas,all-year.early-peak,0.5200080000000009 2035,2,,gas,all-year.late-peak,4.000008 2035,2,,gas,all-year.evening,1.6800080000000008 2035,3,,gas,all-year.night,-0.0 @@ -265,16 +265,16 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2035,3,,CO2f,all-year.evening,75.49540983000001 2035,4,,electricity,all-year.night,-0.0 2035,4,,heat,all-year.night,0.0 -2035,4,,electricity,all-year.morning,-0.3959999999999999 -2035,4,,heat,all-year.morning,0.9899999999999998 +2035,4,,electricity,all-year.morning,-0.39599999999999974 +2035,4,,heat,all-year.morning,0.9899999999999993 2035,4,,electricity,all-year.afternoon,-0.0 2035,4,,heat,all-year.afternoon,0.0 -2035,4,,electricity,all-year.early-peak,-0.3959999999999999 -2035,4,,heat,all-year.early-peak,0.9899999999999998 +2035,4,,electricity,all-year.early-peak,-0.39599999999999974 +2035,4,,heat,all-year.early-peak,0.9899999999999993 2035,4,,electricity,all-year.late-peak,-1.596 2035,4,,heat,all-year.late-peak,3.9899999999999998 -2035,4,,electricity,all-year.evening,-0.7959999999999999 -2035,4,,heat,all-year.evening,1.9899999999999998 +2035,4,,electricity,all-year.evening,-0.7959999999999998 +2035,4,,heat,all-year.evening,1.9899999999999993 2035,5,,gas,all-year.night,-0.0 2035,5,,heat,all-year.night,0.0 2035,5,,CO2f,all-year.night,0.0 @@ -301,8 +301,8 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2035,6,,electricity,all-year.afternoon,0.0 2035,6,,wind,all-year.early-peak,-0.0 2035,6,,electricity,all-year.early-peak,0.0 -2035,6,,wind,all-year.late-peak,-0.05610000000000015 -2035,6,,electricity,all-year.late-peak,0.05610000000000015 +2035,6,,wind,all-year.late-peak,-0.16180000000000117 +2035,6,,electricity,all-year.late-peak,0.16180000000000117 2035,6,,wind,all-year.evening,-1.6 2035,6,,electricity,all-year.evening,1.6 2035,7,,gas,all-year.night,0.6283919999999998 @@ -311,12 +311,12 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2035,7,,gas,all-year.early-peak,0.6283919999999998 2035,7,,gas,all-year.late-peak,0.6283919999999998 2035,7,,gas,all-year.evening,0.6283919999999998 -2035,8,,electricity,all-year.night,-0.3920000000000002 -2035,8,,heat,all-year.night,0.9800000000000004 +2035,8,,electricity,all-year.night,-0.392 +2035,8,,heat,all-year.night,0.98 2035,8,,electricity,all-year.morning,-0.39600000000000024 2035,8,,heat,all-year.morning,0.9900000000000005 -2035,8,,electricity,all-year.afternoon,-0.3920000000000002 -2035,8,,heat,all-year.afternoon,0.9800000000000004 +2035,8,,electricity,all-year.afternoon,-0.392 +2035,8,,heat,all-year.afternoon,0.98 2035,8,,electricity,all-year.early-peak,-0.39600000000000024 2035,8,,heat,all-year.early-peak,0.9900000000000005 2035,8,,electricity,all-year.late-peak,-0.39600000000000024 @@ -343,14 +343,14 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2035,9,,CO2f,all-year.evening,64.06290000000001 2035,10,,wind,all-year.night,-0.8 2035,10,,electricity,all-year.night,0.8 -2035,10,,wind,all-year.morning,-1.2 -2035,10,,electricity,all-year.morning,1.2 +2035,10,,wind,all-year.morning,-1.2000000000000002 +2035,10,,electricity,all-year.morning,1.2000000000000002 2035,10,,wind,all-year.afternoon,-0.8 2035,10,,electricity,all-year.afternoon,0.8 2035,10,,wind,all-year.early-peak,-0.0 2035,10,,electricity,all-year.early-peak,0.0 -2035,10,,wind,all-year.late-peak,-2.3439 -2035,10,,electricity,all-year.late-peak,2.3439 +2035,10,,wind,all-year.late-peak,-2.238199999999999 +2035,10,,electricity,all-year.late-peak,2.238199999999999 2035,10,,wind,all-year.evening,-0.0 2035,10,,electricity,all-year.evening,0.0 2035,11,,gas,all-year.night,1.1483999999999996 @@ -359,18 +359,18 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2035,11,,gas,all-year.early-peak,1.1483999999999996 2035,11,,gas,all-year.late-peak,1.1483999999999996 2035,11,,gas,all-year.evening,1.1483999999999996 -2035,12,,electricity,all-year.night,-0.40799999999999986 -2035,12,,heat,all-year.night,1.0199999999999996 -2035,12,,electricity,all-year.morning,-0.40799999999999986 -2035,12,,heat,all-year.morning,1.0199999999999996 -2035,12,,electricity,all-year.afternoon,-0.40799999999999986 -2035,12,,heat,all-year.afternoon,1.0199999999999996 -2035,12,,electricity,all-year.early-peak,-0.40799999999999986 -2035,12,,heat,all-year.early-peak,1.0199999999999996 -2035,12,,electricity,all-year.late-peak,-0.40799999999999986 -2035,12,,heat,all-year.late-peak,1.0199999999999996 -2035,12,,electricity,all-year.evening,-0.40799999999999986 -2035,12,,heat,all-year.evening,1.0199999999999996 +2035,12,,electricity,all-year.night,-0.40800000000000003 +2035,12,,heat,all-year.night,1.02 +2035,12,,electricity,all-year.morning,-0.40800000000000003 +2035,12,,heat,all-year.morning,1.02 +2035,12,,electricity,all-year.afternoon,-0.40800000000000003 +2035,12,,heat,all-year.afternoon,1.02 +2035,12,,electricity,all-year.early-peak,-0.40800000000000003 +2035,12,,heat,all-year.early-peak,1.02 +2035,12,,electricity,all-year.late-peak,-0.40800000000000003 +2035,12,,heat,all-year.late-peak,1.02 +2035,12,,electricity,all-year.evening,-0.40800000000000003 +2035,12,,heat,all-year.evening,1.02 2035,13,,gas,all-year.night,-1.1831999999999994 2035,13,,heat,all-year.night,1.0199999999999996 2035,13,,CO2f,all-year.night,66.00419999999997 @@ -407,12 +407,12 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2035,15,,gas,all-year.early-peak,1.1831999999999994 2035,15,,gas,all-year.late-peak,1.1831999999999994 2035,15,,gas,all-year.evening,1.1831999999999994 -2040,2,,gas,all-year.night,0.8912080000000007 +2040,2,,gas,all-year.night,0.8912080000000004 2040,2,,gas,all-year.morning,0.0 2040,2,,gas,all-year.afternoon,1.5543999999999993 -2040,2,,gas,all-year.early-peak,0.5742 +2040,2,,gas,all-year.early-peak,0.5742000000000002 2040,2,,gas,all-year.late-peak,4.000008 -2040,2,,gas,all-year.evening,2.4456079999999996 +2040,2,,gas,all-year.evening,2.445608 2040,3,,gas,all-year.night,-0.0 2040,3,,heat,all-year.night,0.0 2040,3,,CO2f,all-year.night,0.0 @@ -463,12 +463,12 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2040,5,,CO2f,all-year.evening,53.27749016999999 2040,6,,wind,all-year.night,-0.0 2040,6,,electricity,all-year.night,0.0 -2040,6,,wind,all-year.morning,-1.3980000000000001 -2040,6,,electricity,all-year.morning,1.3980000000000001 +2040,6,,wind,all-year.morning,-1.398 +2040,6,,electricity,all-year.morning,1.398 2040,6,,wind,all-year.afternoon,-0.932 2040,6,,electricity,all-year.afternoon,0.932 -2040,6,,wind,all-year.early-peak,-0.4205650666666703 -2040,6,,electricity,all-year.early-peak,0.4205650666666703 +2040,6,,wind,all-year.early-peak,-0.3033738666666689 +2040,6,,electricity,all-year.early-peak,0.3033738666666689 2040,6,,wind,all-year.late-peak,-0.0 2040,6,,electricity,all-year.late-peak,0.0 2040,6,,wind,all-year.evening,-0.0 @@ -517,28 +517,28 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2040,10,,electricity,all-year.afternoon,0.0 2040,10,,wind,all-year.early-peak,-0.0 2040,10,,electricity,all-year.early-peak,0.0 -2040,10,,wind,all-year.late-peak,-2.3439 -2040,10,,electricity,all-year.late-peak,2.3439 -2040,10,,wind,all-year.evening,-0.17718933333333603 -2040,10,,electricity,all-year.evening,0.17718933333333603 +2040,10,,wind,all-year.late-peak,-2.238199999999999 +2040,10,,electricity,all-year.late-peak,2.238199999999999 +2040,10,,wind,all-year.evening,-0.017981333333334293 +2040,10,,electricity,all-year.evening,0.017981333333334293 2040,11,,gas,all-year.night,0.0 2040,11,,gas,all-year.morning,1.1483999999999996 2040,11,,gas,all-year.afternoon,0.0 2040,11,,gas,all-year.early-peak,1.1483999999999996 2040,11,,gas,all-year.late-peak,1.1483999999999996 2040,11,,gas,all-year.evening,0.0 -2040,12,,electricity,all-year.night,-0.40799999999999986 -2040,12,,heat,all-year.night,1.0199999999999996 -2040,12,,electricity,all-year.morning,-0.40799999999999986 -2040,12,,heat,all-year.morning,1.0199999999999996 -2040,12,,electricity,all-year.afternoon,-0.40799999999999986 -2040,12,,heat,all-year.afternoon,1.0199999999999996 -2040,12,,electricity,all-year.early-peak,-0.40799999999999986 -2040,12,,heat,all-year.early-peak,1.0199999999999996 -2040,12,,electricity,all-year.late-peak,-0.40799999999999986 -2040,12,,heat,all-year.late-peak,1.0199999999999996 -2040,12,,electricity,all-year.evening,-0.40799999999999986 -2040,12,,heat,all-year.evening,1.0199999999999996 +2040,12,,electricity,all-year.night,-0.40800000000000003 +2040,12,,heat,all-year.night,1.02 +2040,12,,electricity,all-year.morning,-0.40800000000000003 +2040,12,,heat,all-year.morning,1.02 +2040,12,,electricity,all-year.afternoon,-0.40800000000000003 +2040,12,,heat,all-year.afternoon,1.02 +2040,12,,electricity,all-year.early-peak,-0.40800000000000003 +2040,12,,heat,all-year.early-peak,1.02 +2040,12,,electricity,all-year.late-peak,-0.40800000000000003 +2040,12,,heat,all-year.late-peak,1.02 +2040,12,,electricity,all-year.evening,-0.40800000000000003 +2040,12,,heat,all-year.evening,1.02 2040,13,,gas,all-year.night,-1.1831999999999994 2040,13,,heat,all-year.night,1.0199999999999996 2040,13,,CO2f,all-year.night,66.00419999999997 @@ -557,36 +557,36 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2040,13,,gas,all-year.evening,-1.1831999999999994 2040,13,,heat,all-year.evening,1.0199999999999996 2040,13,,CO2f,all-year.evening,66.00419999999997 -2040,14,,wind,all-year.night,-0.6598293333333386 -2040,14,,electricity,all-year.night,0.6598293333333386 +2040,14,,wind,all-year.night,-0.4351013333333375 +2040,14,,electricity,all-year.night,0.4351013333333375 2040,14,,wind,all-year.morning,-0.0 2040,14,,electricity,all-year.morning,0.0 2040,14,,wind,all-year.afternoon,-0.0 2040,14,,electricity,all-year.afternoon,0.0 -2040,14,,wind,all-year.early-peak,-0.9774349333333298 -2040,14,,electricity,all-year.early-peak,0.9774349333333298 -2040,14,,wind,all-year.late-peak,-0.3432317333333358 -2040,14,,electricity,all-year.late-peak,0.3432317333333358 -2040,14,,wind,all-year.evening,-1.4146400000000026 -2040,14,,electricity,all-year.evening,1.4146400000000026 +2040,14,,wind,all-year.early-peak,-1.0946261333333311 +2040,14,,electricity,all-year.early-peak,1.0946261333333311 +2040,14,,wind,all-year.late-peak,-0.3590405333333362 +2040,14,,electricity,all-year.late-peak,0.3590405333333362 +2040,14,,wind,all-year.evening,-1.3491200000000032 +2040,14,,electricity,all-year.evening,1.3491200000000032 2040,15,,gas,all-year.night,1.1831999999999994 -2040,15,,gas,all-year.morning,1.1290079999999996 +2040,15,,gas,all-year.morning,1.1290079999999998 2040,15,,gas,all-year.afternoon,0.0 2040,15,,gas,all-year.early-peak,1.1831999999999994 2040,15,,gas,all-year.late-peak,1.1831999999999994 2040,15,,gas,all-year.evening,1.1831999999999994 -2040,16,,electricity,all-year.night,-0.3960000000000002 -2040,16,,heat,all-year.night,0.9900000000000004 -2040,16,,electricity,all-year.morning,-0.3960000000000002 -2040,16,,heat,all-year.morning,0.9900000000000004 -2040,16,,electricity,all-year.afternoon,-0.3960000000000002 -2040,16,,heat,all-year.afternoon,0.9900000000000004 -2040,16,,electricity,all-year.early-peak,-0.3960000000000002 -2040,16,,heat,all-year.early-peak,0.9900000000000004 -2040,16,,electricity,all-year.late-peak,-0.3960000000000002 -2040,16,,heat,all-year.late-peak,0.9900000000000004 -2040,16,,electricity,all-year.evening,-0.3960000000000002 -2040,16,,heat,all-year.evening,0.9900000000000004 +2040,16,,electricity,all-year.night,-0.396 +2040,16,,heat,all-year.night,0.99 +2040,16,,electricity,all-year.morning,-0.396 +2040,16,,heat,all-year.morning,0.99 +2040,16,,electricity,all-year.afternoon,-0.396 +2040,16,,heat,all-year.afternoon,0.99 +2040,16,,electricity,all-year.early-peak,-0.396 +2040,16,,heat,all-year.early-peak,0.99 +2040,16,,electricity,all-year.late-peak,-0.396 +2040,16,,heat,all-year.late-peak,0.99 +2040,16,,electricity,all-year.evening,-0.396 +2040,16,,heat,all-year.evening,0.99 2040,17,,gas,all-year.night,-1.1484 2040,17,,heat,all-year.night,0.9900000000000002 2040,17,,CO2f,all-year.night,64.06290000000001 @@ -605,18 +605,18 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2040,17,,gas,all-year.evening,-1.1484 2040,17,,heat,all-year.evening,0.9900000000000002 2040,17,,CO2f,all-year.evening,64.06290000000001 -2040,18,,wind,all-year.night,-0.27217066666666145 -2040,18,,electricity,all-year.night,0.27217066666666145 +2040,18,,wind,all-year.night,-0.4968986666666626 +2040,18,,electricity,all-year.night,0.4968986666666626 2040,18,,wind,all-year.morning,-0.0 2040,18,,electricity,all-year.morning,0.0 2040,18,,wind,all-year.afternoon,-0.0 2040,18,,electricity,all-year.afternoon,0.0 2040,18,,wind,all-year.early-peak,-0.0 2040,18,,electricity,all-year.early-peak,0.0 -2040,18,,wind,all-year.late-peak,-0.1088682666666646 -2040,18,,electricity,all-year.late-peak,0.1088682666666646 -2040,18,,wind,all-year.evening,-0.27217066666666145 -2040,18,,electricity,all-year.evening,0.27217066666666145 +2040,18,,wind,all-year.late-peak,-0.198759466666665 +2040,18,,electricity,all-year.late-peak,0.198759466666665 +2040,18,,wind,all-year.evening,-0.4968986666666626 +2040,18,,electricity,all-year.evening,0.4968986666666626 2040,19,,gas,all-year.night,0.0 2040,19,,gas,all-year.morning,1.1484000000000005 2040,19,,gas,all-year.afternoon,1.1484000000000005 @@ -628,7 +628,7 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2045,2,,gas,all-year.afternoon,0.0 2045,2,,gas,all-year.early-peak,4.000008 2045,2,,gas,all-year.late-peak,4.000007999999999 -2045,2,,gas,all-year.evening,2.062807999999999 +2045,2,,gas,all-year.evening,2.0628079999999995 2045,3,,gas,all-year.night,-0.0 2045,3,,heat,all-year.night,0.0 2045,3,,CO2f,all-year.night,0.0 @@ -657,8 +657,8 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2045,4,,heat,all-year.early-peak,0.0 2045,4,,electricity,all-year.late-peak,-1.596 2045,4,,heat,all-year.late-peak,3.9899999999999998 -2045,4,,electricity,all-year.evening,-0.5320000000000001 -2045,4,,heat,all-year.evening,1.3300000000000003 +2045,4,,electricity,all-year.evening,-0.532 +2045,4,,heat,all-year.evening,1.33 2045,5,,gas,all-year.night,-0.0 2045,5,,heat,all-year.night,0.0 2045,5,,CO2f,all-year.night,0.0 @@ -679,14 +679,14 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2045,5,,CO2f,all-year.evening,53.27749016999999 2045,6,,wind,all-year.night,-1.064 2045,6,,electricity,all-year.night,1.064 -2045,6,,wind,all-year.morning,-1.3238293333333389 -2045,6,,electricity,all-year.morning,1.3238293333333389 +2045,6,,wind,all-year.morning,-1.0991013333333375 +2045,6,,electricity,all-year.morning,1.0991013333333375 2045,6,,wind,all-year.afternoon,-0.0 2045,6,,electricity,all-year.afternoon,0.0 2045,6,,wind,all-year.early-peak,-0.0 2045,6,,electricity,all-year.early-peak,0.0 -2045,6,,wind,all-year.late-peak,-2.216666666666667 -2045,6,,electricity,all-year.late-peak,2.216666666666667 +2045,6,,wind,all-year.late-peak,-2.3496666666666672 +2045,6,,electricity,all-year.late-peak,2.3496666666666672 2045,6,,wind,all-year.evening,-0.0 2045,6,,electricity,all-year.evening,0.0 2045,7,,gas,all-year.night,0.0 @@ -697,12 +697,12 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2045,7,,gas,all-year.evening,0.6283919999999998 2045,8,,electricity,all-year.night,-0.0 2045,8,,heat,all-year.night,0.0 -2045,8,,electricity,all-year.morning,-0.39600000000000013 -2045,8,,heat,all-year.morning,0.9900000000000002 +2045,8,,electricity,all-year.morning,-0.3959999999999999 +2045,8,,heat,all-year.morning,0.9899999999999998 2045,8,,electricity,all-year.afternoon,-0.0 2045,8,,heat,all-year.afternoon,0.0 -2045,8,,electricity,all-year.early-peak,-0.39600000000000013 -2045,8,,heat,all-year.early-peak,0.9900000000000002 +2045,8,,electricity,all-year.early-peak,-0.396 +2045,8,,heat,all-year.early-peak,0.99 2045,8,,electricity,all-year.late-peak,-0.39600000000000024 2045,8,,heat,all-year.late-peak,0.9900000000000005 2045,8,,electricity,all-year.evening,-0.39600000000000024 @@ -731,30 +731,30 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2045,10,,electricity,all-year.morning,0.0 2045,10,,wind,all-year.afternoon,-0.0 2045,10,,electricity,all-year.afternoon,0.0 -2045,10,,wind,all-year.early-peak,-1.3238293333333389 -2045,10,,electricity,all-year.early-peak,1.3238293333333389 +2045,10,,wind,all-year.early-peak,-1.0991013333333377 +2045,10,,electricity,all-year.early-peak,1.0991013333333377 2045,10,,wind,all-year.late-peak,-0.0 2045,10,,electricity,all-year.late-peak,0.0 -2045,10,,wind,all-year.evening,-0.5290389333333269 -2045,10,,electricity,all-year.evening,0.5290389333333269 +2045,10,,wind,all-year.evening,-0.8436581333333296 +2045,10,,electricity,all-year.evening,0.8436581333333296 2045,11,,gas,all-year.night,0.0 2045,11,,gas,all-year.morning,0.0 2045,11,,gas,all-year.afternoon,1.1483999999999996 2045,11,,gas,all-year.early-peak,0.0 2045,11,,gas,all-year.late-peak,1.1483999999999996 2045,11,,gas,all-year.evening,0.0 -2045,12,,electricity,all-year.night,-0.2719999999999999 -2045,12,,heat,all-year.night,0.6799999999999997 -2045,12,,electricity,all-year.morning,-0.40799999999999986 -2045,12,,heat,all-year.morning,1.0199999999999996 -2045,12,,electricity,all-year.afternoon,-0.2719999999999999 -2045,12,,heat,all-year.afternoon,0.6799999999999997 -2045,12,,electricity,all-year.early-peak,-0.40799999999999986 -2045,12,,heat,all-year.early-peak,1.0199999999999996 -2045,12,,electricity,all-year.late-peak,-0.40799999999999986 -2045,12,,heat,all-year.late-peak,1.0199999999999996 -2045,12,,electricity,all-year.evening,-0.40799999999999986 -2045,12,,heat,all-year.evening,1.0199999999999996 +2045,12,,electricity,all-year.night,-0.27199999999999996 +2045,12,,heat,all-year.night,0.6799999999999999 +2045,12,,electricity,all-year.morning,-0.40800000000000003 +2045,12,,heat,all-year.morning,1.02 +2045,12,,electricity,all-year.afternoon,-0.27199999999999996 +2045,12,,heat,all-year.afternoon,0.6799999999999999 +2045,12,,electricity,all-year.early-peak,-0.40800000000000003 +2045,12,,heat,all-year.early-peak,1.02 +2045,12,,electricity,all-year.late-peak,-0.40800000000000003 +2045,12,,heat,all-year.late-peak,1.02 +2045,12,,electricity,all-year.evening,-0.40800000000000003 +2045,12,,heat,all-year.evening,1.02 2045,13,,gas,all-year.night,-0.7887999999999996 2045,13,,heat,all-year.night,0.6799999999999997 2045,13,,CO2f,all-year.night,44.00279999999998 @@ -786,23 +786,23 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2045,14,,wind,all-year.evening,-0.0 2045,14,,electricity,all-year.evening,0.0 2045,15,,gas,all-year.night,0.0 -2045,15,,gas,all-year.morning,0.6283919999999994 +2045,15,,gas,all-year.morning,0.6283919999999996 2045,15,,gas,all-year.afternoon,0.0 2045,15,,gas,all-year.early-peak,0.0 2045,15,,gas,all-year.late-peak,1.1831999999999994 2045,15,,gas,all-year.evening,1.1831999999999994 -2045,16,,electricity,all-year.night,-0.3960000000000002 -2045,16,,heat,all-year.night,0.9900000000000004 -2045,16,,electricity,all-year.morning,-0.3960000000000002 -2045,16,,heat,all-year.morning,0.9900000000000004 -2045,16,,electricity,all-year.afternoon,-0.3960000000000002 -2045,16,,heat,all-year.afternoon,0.9900000000000004 -2045,16,,electricity,all-year.early-peak,-0.3960000000000002 -2045,16,,heat,all-year.early-peak,0.9900000000000004 -2045,16,,electricity,all-year.late-peak,-0.3960000000000002 -2045,16,,heat,all-year.late-peak,0.9900000000000004 -2045,16,,electricity,all-year.evening,-0.3960000000000002 -2045,16,,heat,all-year.evening,0.9900000000000004 +2045,16,,electricity,all-year.night,-0.396 +2045,16,,heat,all-year.night,0.99 +2045,16,,electricity,all-year.morning,-0.396 +2045,16,,heat,all-year.morning,0.99 +2045,16,,electricity,all-year.afternoon,-0.396 +2045,16,,heat,all-year.afternoon,0.99 +2045,16,,electricity,all-year.early-peak,-0.396 +2045,16,,heat,all-year.early-peak,0.99 +2045,16,,electricity,all-year.late-peak,-0.396 +2045,16,,heat,all-year.late-peak,0.99 +2045,16,,electricity,all-year.evening,-0.396 +2045,16,,heat,all-year.evening,0.99 2045,17,,gas,all-year.night,-1.1484 2045,17,,heat,all-year.night,0.9900000000000002 2045,17,,CO2f,all-year.night,64.06290000000001 @@ -823,34 +823,34 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2045,17,,CO2f,all-year.evening,64.06290000000001 2045,18,,wind,all-year.night,-0.0 2045,18,,electricity,all-year.night,0.0 -2045,18,,wind,all-year.morning,-0.27217066666666145 -2045,18,,electricity,all-year.morning,0.27217066666666145 +2045,18,,wind,all-year.morning,-0.4968986666666626 +2045,18,,electricity,all-year.morning,0.4968986666666626 2045,18,,wind,all-year.afternoon,-0.0 2045,18,,electricity,all-year.afternoon,0.0 -2045,18,,wind,all-year.early-peak,-0.27217066666666145 -2045,18,,electricity,all-year.early-peak,0.27217066666666145 -2045,18,,wind,all-year.late-peak,-0.1088682666666646 -2045,18,,electricity,all-year.late-peak,0.1088682666666646 +2045,18,,wind,all-year.early-peak,-0.4968986666666626 +2045,18,,electricity,all-year.early-peak,0.4968986666666626 +2045,18,,wind,all-year.late-peak,-0.198759466666665 +2045,18,,electricity,all-year.late-peak,0.198759466666665 2045,18,,wind,all-year.evening,-0.0 2045,18,,electricity,all-year.evening,0.0 2045,19,,gas,all-year.night,0.0 2045,19,,gas,all-year.morning,0.0 -2045,19,,gas,all-year.afternoon,0.16040799999999977 -2045,19,,gas,all-year.early-peak,0.6283919999999994 +2045,19,,gas,all-year.afternoon,0.16040799999999997 +2045,19,,gas,all-year.early-peak,0.6283919999999996 2045,19,,gas,all-year.late-peak,1.1484000000000005 2045,19,,gas,all-year.evening,1.1484000000000005 -2045,20,,electricity,all-year.night,-0.396 -2045,20,,heat,all-year.night,0.99 -2045,20,,electricity,all-year.morning,-0.396 -2045,20,,heat,all-year.morning,0.99 -2045,20,,electricity,all-year.afternoon,-0.396 -2045,20,,heat,all-year.afternoon,0.99 -2045,20,,electricity,all-year.early-peak,-0.396 -2045,20,,heat,all-year.early-peak,0.99 -2045,20,,electricity,all-year.late-peak,-0.396 -2045,20,,heat,all-year.late-peak,0.99 -2045,20,,electricity,all-year.evening,-0.396 -2045,20,,heat,all-year.evening,0.99 +2045,20,,electricity,all-year.night,-0.39600000000000013 +2045,20,,heat,all-year.night,0.9900000000000002 +2045,20,,electricity,all-year.morning,-0.39600000000000013 +2045,20,,heat,all-year.morning,0.9900000000000002 +2045,20,,electricity,all-year.afternoon,-0.39600000000000013 +2045,20,,heat,all-year.afternoon,0.9900000000000002 +2045,20,,electricity,all-year.early-peak,-0.39600000000000013 +2045,20,,heat,all-year.early-peak,0.9900000000000002 +2045,20,,electricity,all-year.late-peak,-0.39600000000000013 +2045,20,,heat,all-year.late-peak,0.9900000000000002 +2045,20,,electricity,all-year.evening,-0.39600000000000013 +2045,20,,heat,all-year.evening,0.9900000000000002 2045,21,,gas,all-year.night,-1.1484 2045,21,,heat,all-year.night,0.9900000000000002 2045,21,,CO2f,all-year.night,64.06290000000001 @@ -877,10 +877,10 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2045,22,,electricity,all-year.afternoon,0.0 2045,22,,wind,all-year.early-peak,-0.0 2045,22,,electricity,all-year.early-peak,0.0 -2045,22,,wind,all-year.late-peak,-0.866465066666669 -2045,22,,electricity,all-year.late-peak,0.866465066666669 -2045,22,,wind,all-year.evening,-1.5989610666666736 -2045,22,,electricity,all-year.evening,1.5989610666666736 +2045,22,,wind,all-year.late-peak,-0.6435738666666683 +2045,22,,electricity,all-year.late-peak,0.6435738666666683 +2045,22,,wind,all-year.evening,-1.2843418666666708 +2045,22,,electricity,all-year.evening,1.2843418666666708 2045,23,,gas,all-year.night,0.0 2045,23,,gas,all-year.morning,0.0 2045,23,,gas,all-year.afternoon,1.1484000000000005 @@ -888,8 +888,8 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2045,23,,gas,all-year.late-peak,1.1484000000000005 2045,23,,gas,all-year.evening,1.1484000000000005 2050,2,,gas,all-year.night,1.703208 -2050,2,,gas,all-year.morning,1.1116080000000008 -2050,2,,gas,all-year.afternoon,2.296800000000002 +2050,2,,gas,all-year.morning,1.111608000000001 +2050,2,,gas,all-year.afternoon,2.2968000000000024 2050,2,,gas,all-year.early-peak,0.0 2050,2,,gas,all-year.late-peak,4.000008000000001 2050,2,,gas,all-year.evening,4.000008 @@ -921,8 +921,8 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2050,4,,heat,all-year.early-peak,0.0 2050,4,,electricity,all-year.late-peak,-1.596 2050,4,,heat,all-year.late-peak,3.9899999999999998 -2050,4,,electricity,all-year.evening,-0.3960000000000003 -2050,4,,heat,all-year.evening,0.9900000000000007 +2050,4,,electricity,all-year.evening,-0.39600000000000046 +2050,4,,heat,all-year.evening,0.9900000000000011 2050,5,,gas,all-year.night,-0.0 2050,5,,heat,all-year.night,0.0 2050,5,,CO2f,all-year.night,0.0 @@ -941,16 +941,16 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2050,5,,gas,all-year.evening,-0.9550593199999998 2050,5,,heat,all-year.evening,0.8233269999999999 2050,5,,CO2f,all-year.evening,53.27749016999999 -2050,6,,wind,all-year.night,-1.2 -2050,6,,electricity,all-year.night,1.2 +2050,6,,wind,all-year.night,-1.1999999999999995 +2050,6,,electricity,all-year.night,1.1999999999999995 2050,6,,wind,all-year.morning,-0.0 2050,6,,electricity,all-year.morning,0.0 2050,6,,wind,all-year.afternoon,-0.0 2050,6,,electricity,all-year.afternoon,0.0 -2050,6,,wind,all-year.early-peak,-0.11318933333333625 -2050,6,,electricity,all-year.early-peak,0.11318933333333625 -2050,6,,wind,all-year.late-peak,-2.216666666666667 -2050,6,,electricity,all-year.late-peak,2.216666666666667 +2050,6,,wind,all-year.early-peak,-0.0 +2050,6,,electricity,all-year.early-peak,0.0 +2050,6,,wind,all-year.late-peak,-2.3496666666666672 +2050,6,,electricity,all-year.late-peak,2.3496666666666672 2050,6,,wind,all-year.evening,-0.0 2050,6,,electricity,all-year.evening,0.0 2050,7,,gas,all-year.night,0.6283919999999998 @@ -961,12 +961,12 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2050,7,,gas,all-year.evening,0.0 2050,8,,electricity,all-year.night,-0.0 2050,8,,heat,all-year.night,0.0 -2050,8,,electricity,all-year.morning,-0.19200000000000045 -2050,8,,heat,all-year.morning,0.4800000000000011 +2050,8,,electricity,all-year.morning,-0.19200000000000053 +2050,8,,heat,all-year.morning,0.4800000000000013 2050,8,,electricity,all-year.afternoon,-0.0 2050,8,,heat,all-year.afternoon,0.0 -2050,8,,electricity,all-year.early-peak,-0.19200000000000045 -2050,8,,heat,all-year.early-peak,0.4800000000000011 +2050,8,,electricity,all-year.early-peak,-0.19200000000000053 +2050,8,,heat,all-year.early-peak,0.4800000000000013 2050,8,,electricity,all-year.late-peak,-0.39600000000000024 2050,8,,heat,all-year.late-peak,0.9900000000000005 2050,8,,electricity,all-year.evening,-0.39600000000000024 @@ -999,26 +999,26 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2050,10,,electricity,all-year.early-peak,0.0 2050,10,,wind,all-year.late-peak,-0.0 2050,10,,electricity,all-year.late-peak,0.0 -2050,10,,wind,all-year.evening,-1.4246666666666665 -2050,10,,electricity,all-year.evening,1.4246666666666665 +2050,10,,wind,all-year.evening,-1.5437333333333323 +2050,10,,electricity,all-year.evening,1.5437333333333323 2050,11,,gas,all-year.night,1.1483999999999996 2050,11,,gas,all-year.morning,0.0 2050,11,,gas,all-year.afternoon,0.0 2050,11,,gas,all-year.early-peak,1.1483999999999996 2050,11,,gas,all-year.late-peak,1.1483999999999996 -2050,11,,gas,all-year.evening,0.628391999999999 +2050,11,,gas,all-year.evening,0.6283919999999993 2050,12,,electricity,all-year.night,0.0 2050,12,,heat,all-year.night,-0.0 -2050,12,,electricity,all-year.morning,-0.40799999999999986 -2050,12,,heat,all-year.morning,1.0199999999999996 +2050,12,,electricity,all-year.morning,-0.40800000000000003 +2050,12,,heat,all-year.morning,1.02 2050,12,,electricity,all-year.afternoon,0.0 2050,12,,heat,all-year.afternoon,-0.0 -2050,12,,electricity,all-year.early-peak,-0.40799999999999986 -2050,12,,heat,all-year.early-peak,1.0199999999999996 -2050,12,,electricity,all-year.late-peak,-0.40799999999999986 -2050,12,,heat,all-year.late-peak,1.0199999999999996 -2050,12,,electricity,all-year.evening,-0.40799999999999986 -2050,12,,heat,all-year.evening,1.0199999999999996 +2050,12,,electricity,all-year.early-peak,-0.40800000000000003 +2050,12,,heat,all-year.early-peak,1.02 +2050,12,,electricity,all-year.late-peak,-0.40800000000000003 +2050,12,,heat,all-year.late-peak,1.02 +2050,12,,electricity,all-year.evening,-0.40800000000000003 +2050,12,,heat,all-year.evening,1.02 2050,13,,gas,all-year.night,-0.0 2050,13,,heat,all-year.night,0.0 2050,13,,CO2f,all-year.night,0.0 @@ -1039,12 +1039,12 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2050,13,,CO2f,all-year.evening,66.00419999999997 2050,14,,wind,all-year.night,-0.0 2050,14,,electricity,all-year.night,0.0 -2050,14,,wind,all-year.morning,-1.4146400000000026 -2050,14,,electricity,all-year.morning,1.4146400000000026 +2050,14,,wind,all-year.morning,-1.3031013333333374 +2050,14,,electricity,all-year.morning,1.3031013333333374 2050,14,,wind,all-year.afternoon,-0.0 2050,14,,electricity,all-year.afternoon,0.0 -2050,14,,wind,all-year.early-peak,-1.4146400000000026 -2050,14,,electricity,all-year.early-peak,1.4146400000000026 +2050,14,,wind,all-year.early-peak,-1.3491200000000032 +2050,14,,electricity,all-year.early-peak,1.3491200000000032 2050,14,,wind,all-year.late-peak,-0.0 2050,14,,electricity,all-year.late-peak,0.0 2050,14,,wind,all-year.evening,-0.0 @@ -1055,18 +1055,18 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2050,15,,gas,all-year.early-peak,0.0 2050,15,,gas,all-year.late-peak,1.1831999999999994 2050,15,,gas,all-year.evening,1.1831999999999994 -2050,16,,electricity,all-year.night,-0.3960000000000002 -2050,16,,heat,all-year.night,0.9900000000000004 -2050,16,,electricity,all-year.morning,-0.3960000000000002 -2050,16,,heat,all-year.morning,0.9900000000000004 -2050,16,,electricity,all-year.afternoon,-0.3960000000000002 -2050,16,,heat,all-year.afternoon,0.9900000000000004 -2050,16,,electricity,all-year.early-peak,-0.3960000000000002 -2050,16,,heat,all-year.early-peak,0.9900000000000004 -2050,16,,electricity,all-year.late-peak,-0.3960000000000002 -2050,16,,heat,all-year.late-peak,0.9900000000000004 -2050,16,,electricity,all-year.evening,-0.3960000000000002 -2050,16,,heat,all-year.evening,0.9900000000000004 +2050,16,,electricity,all-year.night,-0.396 +2050,16,,heat,all-year.night,0.99 +2050,16,,electricity,all-year.morning,-0.396 +2050,16,,heat,all-year.morning,0.99 +2050,16,,electricity,all-year.afternoon,-0.396 +2050,16,,heat,all-year.afternoon,0.99 +2050,16,,electricity,all-year.early-peak,-0.396 +2050,16,,heat,all-year.early-peak,0.99 +2050,16,,electricity,all-year.late-peak,-0.396 +2050,16,,heat,all-year.late-peak,0.99 +2050,16,,electricity,all-year.evening,-0.396 +2050,16,,heat,all-year.evening,0.99 2050,17,,gas,all-year.night,-1.1484 2050,17,,heat,all-year.night,0.9900000000000002 2050,17,,CO2f,all-year.night,64.06290000000001 @@ -1087,12 +1087,12 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2050,17,,CO2f,all-year.evening,64.06290000000001 2050,18,,wind,all-year.night,-0.0 2050,18,,electricity,all-year.night,0.0 -2050,18,,wind,all-year.morning,-0.27217066666666145 -2050,18,,electricity,all-year.morning,0.27217066666666145 +2050,18,,wind,all-year.morning,-0.4968986666666626 +2050,18,,electricity,all-year.morning,0.4968986666666626 2050,18,,wind,all-year.afternoon,-0.0 2050,18,,electricity,all-year.afternoon,0.0 -2050,18,,wind,all-year.early-peak,-0.27217066666666145 -2050,18,,electricity,all-year.early-peak,0.27217066666666145 +2050,18,,wind,all-year.early-peak,-0.450879999999997 +2050,18,,electricity,all-year.early-peak,0.450879999999997 2050,18,,wind,all-year.late-peak,-0.0 2050,18,,electricity,all-year.late-peak,0.0 2050,18,,wind,all-year.evening,-0.0 @@ -1103,18 +1103,18 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2050,19,,gas,all-year.early-peak,1.1484000000000005 2050,19,,gas,all-year.late-peak,1.1484000000000005 2050,19,,gas,all-year.evening,0.0 -2050,20,,electricity,all-year.night,-0.396 -2050,20,,heat,all-year.night,0.99 -2050,20,,electricity,all-year.morning,-0.396 -2050,20,,heat,all-year.morning,0.99 -2050,20,,electricity,all-year.afternoon,-0.396 -2050,20,,heat,all-year.afternoon,0.99 -2050,20,,electricity,all-year.early-peak,-0.396 -2050,20,,heat,all-year.early-peak,0.99 -2050,20,,electricity,all-year.late-peak,-0.396 -2050,20,,heat,all-year.late-peak,0.99 -2050,20,,electricity,all-year.evening,-0.396 -2050,20,,heat,all-year.evening,0.99 +2050,20,,electricity,all-year.night,-0.39600000000000013 +2050,20,,heat,all-year.night,0.9900000000000002 +2050,20,,electricity,all-year.morning,-0.39600000000000013 +2050,20,,heat,all-year.morning,0.9900000000000002 +2050,20,,electricity,all-year.afternoon,-0.39600000000000013 +2050,20,,heat,all-year.afternoon,0.9900000000000002 +2050,20,,electricity,all-year.early-peak,-0.39600000000000013 +2050,20,,heat,all-year.early-peak,0.9900000000000002 +2050,20,,electricity,all-year.late-peak,-0.39600000000000013 +2050,20,,heat,all-year.late-peak,0.9900000000000002 +2050,20,,electricity,all-year.evening,-0.39600000000000013 +2050,20,,heat,all-year.evening,0.9900000000000002 2050,21,,gas,all-year.night,-1.1484 2050,21,,heat,all-year.night,0.9900000000000002 2050,21,,CO2f,all-year.night,64.06290000000001 @@ -1137,32 +1137,32 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2050,22,,electricity,all-year.night,0.0 2050,22,,wind,all-year.morning,-0.0 2050,22,,electricity,all-year.morning,0.0 -2050,22,,wind,all-year.afternoon,-1.2 -2050,22,,electricity,all-year.afternoon,1.2 +2050,22,,wind,all-year.afternoon,-1.1999999999999997 +2050,22,,electricity,all-year.afternoon,1.1999999999999997 2050,22,,wind,all-year.early-peak,-0.0 2050,22,,electricity,all-year.early-peak,0.0 -2050,22,,wind,all-year.late-peak,-1.3833333333333333 -2050,22,,electricity,all-year.late-peak,1.3833333333333333 +2050,22,,wind,all-year.late-peak,-1.2503333333333329 +2050,22,,electricity,all-year.late-peak,1.2503333333333329 2050,22,,wind,all-year.evening,-0.0 2050,22,,electricity,all-year.evening,0.0 2050,23,,gas,all-year.night,0.0 2050,23,,gas,all-year.morning,1.1484000000000005 2050,23,,gas,all-year.afternoon,0.0 -2050,23,,gas,all-year.early-peak,1.1116080000000017 +2050,23,,gas,all-year.early-peak,1.1116080000000021 2050,23,,gas,all-year.late-peak,1.1484000000000005 2050,23,,gas,all-year.evening,1.1484000000000005 -2050,24,,electricity,all-year.night,-0.4079999999999997 -2050,24,,heat,all-year.night,1.0199999999999991 -2050,24,,electricity,all-year.morning,-0.4079999999999997 -2050,24,,heat,all-year.morning,1.0199999999999991 -2050,24,,electricity,all-year.afternoon,-0.4079999999999997 -2050,24,,heat,all-year.afternoon,1.0199999999999991 -2050,24,,electricity,all-year.early-peak,-0.4079999999999997 -2050,24,,heat,all-year.early-peak,1.0199999999999991 -2050,24,,electricity,all-year.late-peak,-0.4079999999999997 -2050,24,,heat,all-year.late-peak,1.0199999999999991 -2050,24,,electricity,all-year.evening,-0.4079999999999997 -2050,24,,heat,all-year.evening,1.0199999999999991 +2050,24,,electricity,all-year.night,-0.4079999999999995 +2050,24,,heat,all-year.night,1.0199999999999987 +2050,24,,electricity,all-year.morning,-0.4079999999999995 +2050,24,,heat,all-year.morning,1.0199999999999987 +2050,24,,electricity,all-year.afternoon,-0.4079999999999995 +2050,24,,heat,all-year.afternoon,1.0199999999999987 +2050,24,,electricity,all-year.early-peak,-0.4079999999999995 +2050,24,,heat,all-year.early-peak,1.0199999999999987 +2050,24,,electricity,all-year.late-peak,-0.4079999999999995 +2050,24,,heat,all-year.late-peak,1.0199999999999987 +2050,24,,electricity,all-year.evening,-0.4079999999999995 +2050,24,,heat,all-year.evening,1.0199999999999987 2050,25,,gas,all-year.night,-1.1831999999999994 2050,25,,heat,all-year.night,1.0199999999999996 2050,25,,CO2f,all-year.night,66.00419999999997 @@ -1183,16 +1183,16 @@ milestone_year,asset_id,group_id,commodity_id,time_slice,flow 2050,25,,CO2f,all-year.evening,66.00419999999997 2050,26,,wind,all-year.night,-0.0 2050,26,,electricity,all-year.night,0.0 -2050,26,,wind,all-year.morning,-0.1131893333333362 -2050,26,,electricity,all-year.morning,0.1131893333333362 +2050,26,,wind,all-year.morning,-0.0 +2050,26,,electricity,all-year.morning,0.0 2050,26,,wind,all-year.afternoon,-0.0 2050,26,,electricity,all-year.afternoon,0.0 2050,26,,wind,all-year.early-peak,-0.0 2050,26,,electricity,all-year.early-peak,0.0 2050,26,,wind,all-year.late-peak,-0.0 2050,26,,electricity,all-year.late-peak,0.0 -2050,26,,wind,all-year.evening,-0.9753333333333338 -2050,26,,electricity,all-year.evening,0.9753333333333338 +2050,26,,wind,all-year.evening,-0.8562666666666682 +2050,26,,electricity,all-year.evening,0.8562666666666682 2050,27,,gas,all-year.night,0.0 2050,27,,gas,all-year.morning,1.1831999999999976 2050,27,,gas,all-year.afternoon,1.1831999999999976 diff --git a/tests/data/two_regions/commodity_prices.csv b/tests/data/two_regions/commodity_prices.csv index c113ac73a..5ec0c1c42 100644 --- a/tests/data/two_regions/commodity_prices.csv +++ b/tests/data/two_regions/commodity_prices.csv @@ -47,24 +47,24 @@ milestone_year,commodity_id,region_id,time_slice,price 2025,gas,R2,all-year.early-peak,2.55 2025,gas,R2,all-year.late-peak,2.55 2025,gas,R2,all-year.evening,2.55 -2025,electricity,R1,all-year.night,9.106847586647298 -2025,electricity,R1,all-year.morning,9.106847586647298 -2025,electricity,R1,all-year.afternoon,9.106847586647298 -2025,electricity,R1,all-year.early-peak,9.106847586647298 -2025,electricity,R1,all-year.late-peak,9.106847586647298 -2025,electricity,R1,all-year.evening,9.106847586647298 +2025,electricity,R1,all-year.night,9.65325844184614 +2025,electricity,R1,all-year.morning,9.65325844184614 +2025,electricity,R1,all-year.afternoon,9.65325844184614 +2025,electricity,R1,all-year.early-peak,9.65325844184614 +2025,electricity,R1,all-year.late-peak,9.65325844184614 +2025,electricity,R1,all-year.evening,9.65325844184614 2025,electricity,R2,all-year.night,6.909684587351731 2025,electricity,R2,all-year.morning,6.909684587351732 2025,electricity,R2,all-year.afternoon,6.909684587351731 2025,electricity,R2,all-year.early-peak,6.909684587351732 2025,electricity,R2,all-year.late-peak,6.909684587351732 2025,electricity,R2,all-year.evening,6.909684587351732 -2025,heat,R1,all-year.night,5.244006899216103 -2025,heat,R1,all-year.morning,5.244006899216103 -2025,heat,R1,all-year.afternoon,5.244006899216103 -2025,heat,R1,all-year.early-peak,5.244006899216103 -2025,heat,R1,all-year.late-peak,5.244006899216103 -2025,heat,R1,all-year.evening,5.244006899216103 +2025,heat,R1,all-year.night,5.46257124129564 +2025,heat,R1,all-year.morning,5.46257124129564 +2025,heat,R1,all-year.afternoon,5.46257124129564 +2025,heat,R1,all-year.early-peak,5.46257124129564 +2025,heat,R1,all-year.late-peak,5.46257124129564 +2025,heat,R1,all-year.evening,5.46257124129564 2025,heat,R2,all-year.night,3.524102361600987 2025,heat,R2,all-year.morning,3.624236219543844 2025,heat,R2,all-year.afternoon,3.524102361600987 @@ -80,31 +80,31 @@ milestone_year,commodity_id,region_id,time_slice,price 2030,gas,R2,all-year.night,2.55 2030,gas,R2,all-year.morning,2.55 2030,gas,R2,all-year.afternoon,2.55 -2030,gas,R2,all-year.early-peak,2.5499999999999994 +2030,gas,R2,all-year.early-peak,2.55 2030,gas,R2,all-year.late-peak,2.55 2030,gas,R2,all-year.evening,2.55 -2030,electricity,R1,all-year.night,15.430648456051674 -2030,electricity,R1,all-year.morning,14.592854632490045 -2030,electricity,R1,all-year.afternoon,15.430648456051674 -2030,electricity,R1,all-year.early-peak,14.592854632490045 -2030,electricity,R1,all-year.late-peak,15.430648456051674 -2030,electricity,R1,all-year.evening,14.592854632490045 +2030,electricity,R1,all-year.night,14.734791319738402 +2030,electricity,R1,all-year.morning,15.468425910439453 +2030,electricity,R1,all-year.afternoon,14.734791319738402 +2030,electricity,R1,all-year.early-peak,15.468425910439453 +2030,electricity,R1,all-year.late-peak,14.734791319738402 +2030,electricity,R1,all-year.evening,15.468425910439453 2030,electricity,R2,all-year.night,6.909684587351732 2030,electricity,R2,all-year.morning,6.909684587351732 2030,electricity,R2,all-year.afternoon,6.909684587351732 -2030,electricity,R2,all-year.early-peak,6.909684587351731 +2030,electricity,R2,all-year.early-peak,6.909684587351732 2030,electricity,R2,all-year.late-peak,6.909684587351732 2030,electricity,R2,all-year.evening,6.909684587351732 -2030,heat,R1,all-year.night,7.509143691724162 -2030,heat,R1,all-year.morning,7.394343944617788 -2030,heat,R1,all-year.afternoon,7.509143691724162 -2030,heat,R1,all-year.early-peak,7.394343944617788 -2030,heat,R1,all-year.late-peak,7.949777781668878 -2030,heat,R1,all-year.evening,7.504502282766561 +2030,heat,R1,all-year.night,7.230800837198854 +2030,heat,R1,all-year.morning,7.74457245579755 +2030,heat,R1,all-year.afternoon,7.230800837198854 +2030,heat,R1,all-year.early-peak,7.74457245579755 +2030,heat,R1,all-year.late-peak,7.671434927143571 +2030,heat,R1,all-year.evening,7.854730793946326 2030,heat,R2,all-year.night,3.3494378343751285 2030,heat,R2,all-year.morning,3.5706263477266953 2030,heat,R2,all-year.afternoon,3.3494378343751285 -2030,heat,R2,all-year.early-peak,3.570626347726695 +2030,heat,R2,all-year.early-peak,3.5706263477266953 2030,heat,R2,all-year.late-peak,3.8653041158566306 2030,heat,R2,all-year.evening,3.7179657248996216 2035,gas,R1,all-year.night,2.55 @@ -115,31 +115,31 @@ milestone_year,commodity_id,region_id,time_slice,price 2035,gas,R1,all-year.evening,2.55 2035,gas,R2,all-year.night,2.55 2035,gas,R2,all-year.morning,2.5499999999999994 -2035,gas,R2,all-year.afternoon,2.55 +2035,gas,R2,all-year.afternoon,2.5499999999999994 2035,gas,R2,all-year.early-peak,2.55 -2035,gas,R2,all-year.late-peak,2.5500000000000003 +2035,gas,R2,all-year.late-peak,2.55 2035,gas,R2,all-year.evening,2.55 -2035,electricity,R1,all-year.night,9.10681905636597 -2035,electricity,R1,all-year.morning,9.10681905636597 -2035,electricity,R1,all-year.afternoon,26.8436692020175 -2035,electricity,R1,all-year.early-peak,18.2961198738996 -2035,electricity,R1,all-year.late-peak,16.53292519133361 -2035,electricity,R1,all-year.evening,18.2961198738996 +2035,electricity,R1,all-year.night,9.106819056365971 +2035,electricity,R1,all-year.morning,9.106819056365971 +2035,electricity,R1,all-year.afternoon,26.173860863412933 +2035,electricity,R1,all-year.early-peak,17.471042067392826 +2035,electricity,R1,all-year.late-peak,17.370728605549616 +2035,electricity,R1,all-year.evening,17.471042067392826 2035,electricity,R2,all-year.night,6.909684587351732 2035,electricity,R2,all-year.morning,6.909684587351731 -2035,electricity,R2,all-year.afternoon,6.909684587351732 +2035,electricity,R2,all-year.afternoon,6.909684587351731 2035,electricity,R2,all-year.early-peak,6.909684587351732 -2035,electricity,R2,all-year.late-peak,6.909684587351733 +2035,electricity,R2,all-year.late-peak,6.909684587351732 2035,electricity,R2,all-year.evening,6.909684587351732 -2035,heat,R1,all-year.night,4.533789268258482 -2035,heat,R1,all-year.morning,5.122648298350285 -2035,heat,R1,all-year.afternoon,11.628529326519095 -2035,heat,R1,all-year.early-peak,8.798368625363736 -2035,heat,R1,all-year.late-peak,8.690875846164971 -2035,heat,R1,all-year.evening,9.097261587408648 +2035,heat,R1,all-year.night,4.533789268258483 +2035,heat,R1,all-year.morning,5.122648298350286 +2035,heat,R1,all-year.afternoon,11.360605991077266 +2035,heat,R1,all-year.early-peak,8.468337502761027 +2035,heat,R1,all-year.late-peak,9.025997211851374 +2035,heat,R1,all-year.evening,8.76723046480594 2035,heat,R2,all-year.night,3.3398845980394016 2035,heat,R2,all-year.morning,3.4570413315505375 -2035,heat,R2,all-year.afternoon,3.3398845980394016 +2035,heat,R2,all-year.afternoon,3.339884598039401 2035,heat,R2,all-year.early-peak,3.4570413315505375 2035,heat,R2,all-year.late-peak,3.9836619713497763 2035,heat,R2,all-year.evening,3.7203523828752703 @@ -150,31 +150,31 @@ milestone_year,commodity_id,region_id,time_slice,price 2040,gas,R1,all-year.late-peak,2.55 2040,gas,R1,all-year.evening,2.55 2040,gas,R2,all-year.night,2.55 -2040,gas,R2,all-year.morning,2.5499999999999994 +2040,gas,R2,all-year.morning,2.55 2040,gas,R2,all-year.afternoon,2.55 2040,gas,R2,all-year.early-peak,2.55 2040,gas,R2,all-year.late-peak,2.5500000000000003 2040,gas,R2,all-year.evening,2.55 -2040,electricity,R1,all-year.night,21.9869107708861 -2040,electricity,R1,all-year.morning,21.9869107708861 -2040,electricity,R1,all-year.afternoon,10.200888483183942 -2040,electricity,R1,all-year.early-peak,9.10681905636597 -2040,electricity,R1,all-year.late-peak,11.97186425233236 -2040,electricity,R1,all-year.evening,15.882046250817499 +2040,electricity,R1,all-year.night,20.995393868081933 +2040,electricity,R1,all-year.morning,20.995393868081933 +2040,electricity,R1,all-year.afternoon,9.946602083451538 +2040,electricity,R1,all-year.early-peak,9.445822105264527 +2040,electricity,R1,all-year.late-peak,12.592610648717535 +2040,electricity,R1,all-year.evening,18.250113312226134 2040,electricity,R2,all-year.night,6.909684587351732 -2040,electricity,R2,all-year.morning,6.909684587351731 +2040,electricity,R2,all-year.morning,6.909684587351732 2040,electricity,R2,all-year.afternoon,6.909684587351732 2040,electricity,R2,all-year.early-peak,6.909684587351732 2040,electricity,R2,all-year.late-peak,6.909684587351733 2040,electricity,R2,all-year.evening,6.909684587351732 -2040,heat,R1,all-year.night,9.719940524575245 -2040,heat,R1,all-year.morning,10.086018004045913 -2040,heat,R1,all-year.afternoon,5.005531609494383 -2040,heat,R1,all-year.early-peak,4.933981318237859 -2040,heat,R1,all-year.late-peak,7.038058289192852 -2040,heat,R1,all-year.evening,8.123102213394866 +2040,heat,R1,all-year.night,9.32333376345358 +2040,heat,R1,all-year.morning,9.689411242924244 +2040,heat,R1,all-year.afternoon,4.90381704960142 +2040,heat,R1,all-year.early-peak,5.069582537797281 +2040,heat,R1,all-year.late-peak,7.286356847746921 +2040,heat,R1,all-year.evening,9.070329037958318 2040,heat,R2,all-year.night,3.354503882326303 -2040,heat,R2,all-year.morning,3.417882896633462 +2040,heat,R2,all-year.morning,3.4178828966334622 2040,heat,R2,all-year.afternoon,3.354503882326303 2040,heat,R2,all-year.early-peak,3.4178828966334622 2040,heat,R2,all-year.late-peak,4.041231321833798 @@ -185,31 +185,31 @@ milestone_year,commodity_id,region_id,time_slice,price 2045,gas,R1,all-year.early-peak,2.55 2045,gas,R1,all-year.late-peak,2.55 2045,gas,R1,all-year.evening,2.55 -2045,gas,R2,all-year.night,2.5499999999999994 -2045,gas,R2,all-year.morning,2.55 +2045,gas,R2,all-year.night,2.55 +2045,gas,R2,all-year.morning,2.5499999999999994 2045,gas,R2,all-year.afternoon,2.55 2045,gas,R2,all-year.early-peak,2.55 2045,gas,R2,all-year.late-peak,2.5500000000000003 2045,gas,R2,all-year.evening,2.55 -2045,electricity,R1,all-year.night,30.514350662119462 -2045,electricity,R1,all-year.morning,10.213848592025764 -2045,electricity,R1,all-year.afternoon,10.237841612925694 -2045,electricity,R1,all-year.early-peak,10.237841612925694 -2045,electricity,R1,all-year.late-peak,9.937338358476365 -2045,electricity,R1,all-year.evening,13.545152983741305 -2045,electricity,R2,all-year.night,6.909684587351731 -2045,electricity,R2,all-year.morning,6.909684587351732 +2045,electricity,R1,all-year.night,38.15444742868569 +2045,electricity,R1,all-year.morning,9.191604850660633 +2045,electricity,R1,all-year.afternoon,9.987121348393275 +2045,electricity,R1,all-year.early-peak,9.987121348393275 +2045,electricity,R1,all-year.late-peak,9.738081670875742 +2045,electricity,R1,all-year.evening,13.019510365713808 +2045,electricity,R2,all-year.night,6.909684587351732 +2045,electricity,R2,all-year.morning,6.909684587351731 2045,electricity,R2,all-year.afternoon,6.909684587351732 2045,electricity,R2,all-year.early-peak,6.909684587351732 2045,electricity,R2,all-year.late-peak,6.909684587351733 2045,electricity,R2,all-year.evening,6.909684587351732 -2045,heat,R1,all-year.night,13.123754521752367 -2045,heat,R1,all-year.morning,5.113917964643745 -2045,heat,R1,all-year.afternoon,5.013150902074859 -2045,heat,R1,all-year.early-peak,5.123515173003716 -2045,heat,R1,all-year.late-peak,6.490704462343437 -2045,heat,R1,all-year.evening,7.190130219609611 -2045,heat,R2,all-year.night,3.3514351162945846 +2045,heat,R1,all-year.night,16.17979322837886 +2045,heat,R1,all-year.morning,4.705020468097692 +2045,heat,R1,all-year.afternoon,4.9128627962618925 +2045,heat,R1,all-year.early-peak,5.023227067190748 +2045,heat,R1,all-year.late-peak,6.411001787303188 +2045,heat,R1,all-year.evening,6.979873172398613 +2045,heat,R2,all-year.night,3.3514351162945855 2045,heat,R2,all-year.morning,3.3987349566568237 2045,heat,R2,all-year.afternoon,3.3514351162945855 2045,heat,R2,all-year.early-peak,3.3987349566568237 @@ -218,24 +218,24 @@ milestone_year,commodity_id,region_id,time_slice,price 2050,gas,R2,all-year.night,2.5499999999999994 2050,gas,R2,all-year.morning,2.55 2050,gas,R2,all-year.afternoon,2.55 -2050,gas,R2,all-year.early-peak,2.5500000000000003 +2050,gas,R2,all-year.early-peak,2.55 2050,gas,R2,all-year.late-peak,2.5500000000000003 2050,gas,R2,all-year.evening,2.55 -2050,electricity,R1,all-year.night,13.725284368503113 -2050,electricity,R1,all-year.morning,11.472464005188346 -2050,electricity,R1,all-year.afternoon,13.528055949498414 -2050,electricity,R1,all-year.early-peak,11.104072897721647 -2050,electricity,R1,all-year.late-peak,13.649497522311494 -2050,electricity,R1,all-year.evening,29.304049130474564 -2050,heat,R1,all-year.night,6.37970031680408 -2050,heat,R1,all-year.morning,5.676217731727809 -2050,heat,R1,all-year.afternoon,6.3008089492021995 -2050,heat,R1,all-year.early-peak,5.528861288741129 -2050,heat,R1,all-year.late-peak,8.001154842408992 -2050,heat,R1,all-year.evening,13.3954302627072 +2050,electricity,R1,all-year.night,14.467604664097754 +2050,electricity,R1,all-year.morning,11.211930904564163 +2050,electricity,R1,all-year.afternoon,11.456010978232966 +2050,electricity,R1,all-year.early-peak,11.203213058112226 +2050,electricity,R1,all-year.late-peak,13.42163356079416 +2050,electricity,R1,all-year.evening,28.180748009289278 +2050,heat,R1,all-year.night,6.676628435041936 +2050,heat,R1,all-year.morning,5.572004491478136 +2050,heat,R1,all-year.afternoon,5.47199096069602 +2050,heat,R1,all-year.early-peak,5.568517352897361 +2050,heat,R1,all-year.late-peak,7.9100092578020575 +2050,heat,R1,all-year.evening,12.946109814233083 2050,heat,R2,all-year.night,3.3392513725541697 2050,heat,R2,all-year.morning,3.42395660947675 2050,heat,R2,all-year.afternoon,3.33925137255417 -2050,heat,R2,all-year.early-peak,3.4239566094767504 +2050,heat,R2,all-year.early-peak,3.42395660947675 2050,heat,R2,all-year.late-peak,4.103880174061839 2050,heat,R2,all-year.evening,3.59025580512548 From 4cc7413d78661a35a1f1a89f0b3f3c4eb304110a Mon Sep 17 00:00:00 2001 From: Tom Bland Date: Thu, 2 Jul 2026 14:50:39 +0100 Subject: [PATCH 3/5] Stricter requirements for capacity_to_activity --- docs/release_notes/upcoming.md | 2 ++ schemas/input/processes.yaml | 2 +- src/input/process.rs | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/release_notes/upcoming.md b/docs/release_notes/upcoming.md index 8cdb33cde..1d5ebf086 100644 --- a/docs/release_notes/upcoming.md +++ b/docs/release_notes/upcoming.md @@ -34,6 +34,8 @@ ready to be released, carry out the following steps: - Fix parsing and validation of agent search space file ([#1293]) - Use shadow prices rather than market prices for appraisal optimisations and dispatch runs during investment ([#1349]) +- Updated input data validation to ensure `capacity_to_activity > 0`. Previously, + `capacity_to_activity = 0` was permitted. [highs-opts-docs]: ../developer_guide/custom_highs_options.md [#1259]: https://github.com/EnergySystemsModellingLab/MUSE2/pull/1259 diff --git a/schemas/input/processes.yaml b/schemas/input/processes.yaml index f12d1ddac..dfa1ff2dc 100644 --- a/schemas/input/processes.yaml +++ b/schemas/input/processes.yaml @@ -31,7 +31,7 @@ fields: description: Factor relating capacity units (e.g. GW) to activity units (e.g. PJ). It is the maximum activity per year for one unit of capacity. - notes: Must be >=0. Optional (defaults to 1.0). + notes: Must be >0. Optional (defaults to 1.0). - name: unit_size type: number description: diff --git a/src/input/process.rs b/src/input/process.rs index 2f47168d4..895f5f3a8 100644 --- a/src/input/process.rs +++ b/src/input/process.rs @@ -157,8 +157,8 @@ where // Validate capacity_to_activity ensure!( - capacity_to_activity >= ActivityPerCapacity(0.0), - "Error in process {}: capacity_to_activity must be >= 0", + capacity_to_activity > ActivityPerCapacity(0.0), + "Error in process {}: capacity_to_activity must be > 0", process_raw.id ); From 34b898151e411d0df11ae1b347c0211ca2458d86 Mon Sep 17 00:00:00 2001 From: Tom Bland Date: Thu, 2 Jul 2026 14:59:48 +0100 Subject: [PATCH 4/5] Docstring improvements --- src/simulation/investment.rs | 5 ++++- src/simulation/investment/appraisal/constraints.rs | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/simulation/investment.rs b/src/simulation/investment.rs index 2f85a26a2..fcb9835df 100644 --- a/src/simulation/investment.rs +++ b/src/simulation/investment.rs @@ -690,6 +690,9 @@ fn get_asset_options<'a>( } /// Get candidate assets which produce a particular commodity for a given agent +/// +/// Capacities of candidate assets are set to the demand-limiting capacity for the given market, +/// scaled by the `capacity_limit_factor`. fn get_candidate_assets<'a>( time_slice_info: &'a TimeSliceInfo, demand: &'a DemandMap, @@ -822,7 +825,7 @@ fn select_best_assets( continue; } - // For candidates, cap the asset's current capacity by the demand-limiting capacity + // For candidates, cap the asset's capacity by the current demand-limiting capacity // and, where an addition constraint exists, the remaining installable capacity. let mut asset = asset.clone(); if !asset.is_commissioned() { diff --git a/src/simulation/investment/appraisal/constraints.rs b/src/simulation/investment/appraisal/constraints.rs index a6abbbf87..bcbe6f390 100644 --- a/src/simulation/investment/appraisal/constraints.rs +++ b/src/simulation/investment/appraisal/constraints.rs @@ -12,7 +12,7 @@ use indexmap::IndexMap; /// /// Constrains the activity variables to be within the asset's activity limits. /// -/// The asset's per-capacity activity limits are scaled by the fixed `capacity` to give +/// The asset's per-capacity activity limits are scaled by the the asset's capacity to give /// absolute bounds, and a single bounded constraint is added per time-slice selection covering the /// sum of activity in that selection. pub fn add_activity_constraints( From 86aa84c9147caaf5f8faaa06c5e5ebbb300357d3 Mon Sep 17 00:00:00 2001 From: Tom Bland Date: Thu, 2 Jul 2026 15:23:24 +0100 Subject: [PATCH 5/5] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/simulation/investment/appraisal/constraints.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/simulation/investment/appraisal/constraints.rs b/src/simulation/investment/appraisal/constraints.rs index bcbe6f390..f8e7483f2 100644 --- a/src/simulation/investment/appraisal/constraints.rs +++ b/src/simulation/investment/appraisal/constraints.rs @@ -12,7 +12,7 @@ use indexmap::IndexMap; /// /// Constrains the activity variables to be within the asset's activity limits. /// -/// The asset's per-capacity activity limits are scaled by the the asset's capacity to give +/// The asset's per-capacity activity limits are scaled by the asset's capacity to give /// absolute bounds, and a single bounded constraint is added per time-slice selection covering the /// sum of activity in that selection. pub fn add_activity_constraints(