From 16df8d37918573ea35071fcc7e10ed9fd6e167a4 Mon Sep 17 00:00:00 2001 From: nick-gorman Date: Wed, 22 Apr 2026 16:27:48 +1000 Subject: [PATCH 01/14] Add network_expansion templater and related infrastructure MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extends the new-format templater with two output tables: network_expansion_options and network_transmission_path_expansion_costs. A single expansion_id keyed by expansion_type (forward / reverse / constraint_relaxation) unifies physical paths and constraint-group relaxations under one schema, so downstream consumers don't have to join back to network_transmission_paths to classify rows. Option selection picks the lowest dollars-per-MW per expansion_id using the first year with complete costs. Cost is divided by max(forward, reverse) so an asymmetric option can be represented in the translator as a single extendable PyPSA Link. Known-table discovery for the local cache moves from hard-coded lists to a static manifest (known_tables.yaml), so augmentation tables can be enumerated by prefix — necessary because v7.5 has one table per flow path x scenario. Co-Authored-By: Claude Opus 4.7 (1M context) --- CLAUDE.md | 52 + pyproject.toml | 1 + src/ispypsa/cli/dodo.py | 2 +- .../iasr_table_caching/known_tables.yaml | 286 ++++++ src/ispypsa/iasr_table_caching/local_cache.py | 38 +- src/ispypsa/templater/create_template.py | 25 +- src/ispypsa/templater/helpers.py | 14 + src/ispypsa/templater/network_expansion.py | 970 ++++++++++++++++++ .../schemas/network_expansion_options.yaml | 16 +- ...ork_transmission_path_expansion_costs.yaml | 7 +- .../test_local_cache.py | 15 +- .../test_create_ispypsa_inputs_template.py | 49 + .../test_templater/test_network_expansion.py | 564 ++++++++++ 13 files changed, 2018 insertions(+), 21 deletions(-) create mode 100644 src/ispypsa/iasr_table_caching/known_tables.yaml create mode 100644 src/ispypsa/templater/network_expansion.py create mode 100644 tests/test_templater/test_network_expansion.py diff --git a/CLAUDE.md b/CLAUDE.md index 8823a87c..f71c4d05 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -31,6 +31,10 @@ def template_network_transmission_paths(iasr_tables, scenario): `_map_*`, `_merge_*`. - **Single responsibility** — each helper does one thing. If a helper needs an internal comment explaining a second step, it should probably be two helpers. +- **No hidden preconditions** — if a helper's correctness depends on a column + value or invariant set by the caller, set it explicitly inside the helper + instead. Preconditions that don't appear in the signature or name are easy + to break during refactoring. ### Clarity over cleverness @@ -58,6 +62,38 @@ through testing. Let the code fail clearly when preconditions aren't met. No backwards compatibility unless explicitly requested — update all call sites directly. +### Docstrings: I/O Example + +Every non-trivial function should include an `I/O Example:` section in its docstring +showing a concrete input → output mapping. The goal is that a reviewer can understand +the function's behaviour from the docstring alone, without reading the body. + +Conventions: + +- Use a plain CSV-like table format for DataFrame inputs and outputs — no need to + wrap in runnable `csv_str_to_df` calls, since this is illustrative, not a doctest. +- Abbreviate long column names when they would otherwise overflow the line; point at + the relevant constants for the real names. +- Cover representative edge cases in the same example, with trailing `# comment` + notes on the rows that demonstrate each case. +- For trivial utility functions, one-line input → output cases are enough. + +```python +def _duplicate_for_both_directions(limits: pd.DataFrame) -> pd.DataFrame: + """Mirrors each row into a forward and a reverse entry. + + I/O Example: + limits: + path_id timeslice capacity + Q1-NQ peak_demand 750 + + returns: + path_id direction timeslice capacity + Q1-NQ forward peak_demand 750 + Q1-NQ reverse peak_demand 750 + """ +``` + ## Logging Logging surfaces things a user or operator wants to know during a template/translation @@ -207,6 +243,19 @@ same readable form as every other expected DataFrame in the test). Use this for collapsed/missing-data rows instead of `iloc` + `pd.isna` probes. - Use `check_dtype=False` when type precision isn't critical (e.g. NaN columns) +### Integration tests + +When a public orchestrator calls into per-module helpers that have their own +thorough tests, the orchestrator's integration test should verify wiring only — +not duplicate content checks. Assert: + +- the expected output keys are present +- each output has the expected column set +- each output has the expected row count + +Skip `assert_frame_equal`. Add a one-line comment stating that the detailed +content is covered by the per-module tests. + ## Development Environment Use `uv` for package management. Key commands: @@ -222,3 +271,6 @@ uv run pre-commit run --all-files # Run linters - Only commit when explicitly requested - Commit messages should focus on the "why" rather than the "what" +- Before staging, list the files you intend to commit and confirm with the user. + Local-only edits (dev configs, feature flag flips, experiment artefacts) often + sit alongside the real change and should not be swept into the commit. diff --git a/pyproject.toml b/pyproject.toml index 67a40add..d6dd4ff0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -88,6 +88,7 @@ select = [ [tool.hatch.build] include = [ "src/ispypsa/**/*.py", + "src/ispypsa/**/*.yaml", "src/ispypsa/data_fetch/manifests/**/*.txt", "src/ispypsa/templater/manually_extracted_template_tables/**/*.csv", ] diff --git a/src/ispypsa/cli/dodo.py b/src/ispypsa/cli/dodo.py index 342b9b6d..325a73aa 100644 --- a/src/ispypsa/cli/dodo.py +++ b/src/ispypsa/cli/dodo.py @@ -208,7 +208,7 @@ def get_operational_pypsa_file(): @return_empty_list_if_no_config def get_local_cache_files(): """Get list of local cache files.""" - return list_cache_files(get_parsed_workbook_cache()) + return list_cache_files(get_parsed_workbook_cache(), config.iasr_workbook_version) @return_empty_list_if_no_config diff --git a/src/ispypsa/iasr_table_caching/known_tables.yaml b/src/ispypsa/iasr_table_caching/known_tables.yaml new file mode 100644 index 00000000..124dccad --- /dev/null +++ b/src/ispypsa/iasr_table_caching/known_tables.yaml @@ -0,0 +1,286 @@ +'7.5': +- affine_heat_rates_existing_generators +- affine_heat_rates_new_entrants +- aggregated_storage_regional_energy_capacity +- aggregated_storage_regional_power_capacity +- appliance_uptake_forecasts_accelerate_transition +- appliance_uptake_forecasts_slower_growth +- appliance_uptake_forecasts_step_change +- auxiliary_load_existing_committed_anticipated_additional_generators +- auxiliary_load_new_entrants +- basslink_daily_energy_transfer_limit +- battery_properties +- biomass_fuel_price +- biomethane_prices +- build_cost_hydrogen_pipeline +- build_costs +- build_limits_phes +- capacity_factors_wind_and_solar +- capacity_investment_dispatchable_capacity_targets +- capacity_investment_generation_targets +- coal_fuel_price +- coal_minimum_stable_level +- coal_retirement_fault_level_replacement_cost +- connection_cost_forecast_other +- connection_cost_forecast_wind_and_solar +- connection_costs_for_wind_and_solar +- connection_costs_other +- connections_forecasts_accelerated_transition +- connections_forecasts_consultant_mapping +- connections_forecasts_slower_growth +- connections_forecasts_step_change +- consumer_energy_resources_summary +- cost_of_water_for_hydrogen_production +- data_centre_forecasts_accelerated_transition +- data_centre_forecasts_consultant_scenario_mapping +- data_centre_forecasts_slower_growth +- data_centre_forecasts_step_change +- discount_rate +- distribution_network_CER_augmentation_tranche_costs +- distribution_network_CER_augmentation_tranche_costs_forecast +- distribution_network_cer_generation_limit_profiles +- dsp_summer +- dsp_winter +- economic_growth_forecasts_consultant_scenario_mapping +- efficient_level_of_system_strength_cost +- electricity_consumption_rate_adjustments_to_include_conversion_to_ammonia +- electrification_accelerated_transition +- electrification_consultant_scenario_mapping +- electrification_slower_growth +- electrification_step_change +- electrolyser_balance_of_plant +- electrolysers_electricity_consumption_rate +- embedded_storage_consultant_scenario_mapping +- embedded_storage_regional_energy_capacity +- embedded_storage_regional_power_capacity +- emissions_intensity_existing_committed_anticipated_additional_generators +- emissions_intensity_new_entrants +- end_use_fuel_consumption_accelerated_transition +- end_use_fuel_consumption_slower_growth +- end_use_fuel_consumption_step_change +- energy_efficiency_business_accelerated_transition +- energy_efficiency_business_reduced_energy_efficiency +- energy_efficiency_business_slower_growth +- energy_efficiency_business_step_change +- energy_efficiency_consultant_mapping +- energy_efficiency_residential_accelerated_transition +- energy_efficiency_residential_reduced_energy_efficiency +- energy_efficiency_residential_slower_growth +- energy_efficiency_residential_step_change +- ev_energy_capacity +- ev_energy_consultant_scenario_mapping +- ev_uptake +- existing_committed_anticipated_additional_generator_summary +- existing_sub_regional_topology_representation_capacity_outlook_model +- expected_closure_years +- fcev_consultant_scenario_mapping +- fcev_uptake +- first_of_a_kind_premium +- fixed_opex_existing_committed_anticipated_additional_generators +- fixed_opex_new_entrants +- flow_path_augmentation_cost_slower_growth_CNSW-NNSW +- flow_path_augmentation_costs_accelerated_transition_CNSW-NNSW +- flow_path_augmentation_costs_accelerated_transition_CNSW-SNW +- flow_path_augmentation_costs_accelerated_transition_CQ-GG +- flow_path_augmentation_costs_accelerated_transition_CQ-NQ +- flow_path_augmentation_costs_accelerated_transition_CSA-NSA +- flow_path_augmentation_costs_accelerated_transition_MEL-WNV +- flow_path_augmentation_costs_accelerated_transition_NNSW-SQ +- flow_path_augmentation_costs_accelerated_transition_SESA-CSA +- flow_path_augmentation_costs_accelerated_transition_SEV-MEL +- flow_path_augmentation_costs_accelerated_transition_SNSW-CNSW +- flow_path_augmentation_costs_accelerated_transition_SQ-CQ +- flow_path_augmentation_costs_accelerated_transition_TAS-SEV +- flow_path_augmentation_costs_accelerated_transition_WNV-SESA +- flow_path_augmentation_costs_accelerated_transition_WNV-SNSW +- flow_path_augmentation_costs_slower_growth_CNSW-SNW +- flow_path_augmentation_costs_slower_growth_CQ-GG +- flow_path_augmentation_costs_slower_growth_CQ-NQ +- flow_path_augmentation_costs_slower_growth_CSA-NSA +- flow_path_augmentation_costs_slower_growth_MEL_WNV +- flow_path_augmentation_costs_slower_growth_NNSW-SQ +- flow_path_augmentation_costs_slower_growth_SESA-CSA +- flow_path_augmentation_costs_slower_growth_SEV_MEL +- flow_path_augmentation_costs_slower_growth_SNSW-CNSW +- flow_path_augmentation_costs_slower_growth_SQ-CQ +- flow_path_augmentation_costs_slower_growth_TAS-SEV +- flow_path_augmentation_costs_slower_growth_WNV-SESA +- flow_path_augmentation_costs_slower_growth_WNV-SNSW +- flow_path_augmentation_costs_step_change_CNSW-NNSW +- flow_path_augmentation_costs_step_change_CNSW-SNW +- flow_path_augmentation_costs_step_change_CQ-GG +- flow_path_augmentation_costs_step_change_CQ-NQ +- flow_path_augmentation_costs_step_change_CSA-NSA +- flow_path_augmentation_costs_step_change_MEL-WNV +- flow_path_augmentation_costs_step_change_NNSW-SQ +- flow_path_augmentation_costs_step_change_SESA-CSA +- flow_path_augmentation_costs_step_change_SEV-MEL +- flow_path_augmentation_costs_step_change_SNSW-CNSW +- flow_path_augmentation_costs_step_change_SQ-CQ +- flow_path_augmentation_costs_step_change_TAS-SEV +- flow_path_augmentation_costs_step_change_WNV-SESA +- flow_path_augmentation_costs_step_change_WNV-SNSW +- flow_path_augmentation_options_CNSW-NNSW +- flow_path_augmentation_options_CNSW-SNW +- flow_path_augmentation_options_CQ-GG +- flow_path_augmentation_options_CQ-NQ +- flow_path_augmentation_options_CSA-NSA +- flow_path_augmentation_options_MEL-WNV +- flow_path_augmentation_options_NNSW-SQ +- flow_path_augmentation_options_SESA-CSA +- flow_path_augmentation_options_SEV-MEL +- flow_path_augmentation_options_SNSW-CNSW +- flow_path_augmentation_options_SQ-CQ +- flow_path_augmentation_options_TAS-SEV +- flow_path_augmentation_options_WNV-SESA +- flow_path_augmentation_options_WNV-SNSW +- flow_path_transfer_capability +- gas_and_liquid_fuel_prices_consultant_scenario_mapping +- gas_prices_existing_generators +- gas_prices_new_entrants +- gas_production_costs +- gas_system_properties_pipelines +- gas_system_properties_processing_facilities +- gas_system_properties_reserves_and_resources_1 +- gas_system_properties_reserves_and_resources_2 +- gas_system_properties_storage_facilities +- gpg_emissions_reduction_biomethane +- gpg_min_stable_level_existing_generators +- gpg_min_stable_level_new_entrants +- gpg_secondary_fuel_prices +- gross_state_product_accelerated_transition +- gross_state_product_slower_growth +- gross_state_product_step_change +- heat_rates_existing_committed_anticipated_additional_generators +- heat_rates_new_entrants +- household_disposable_income_accelerated_transition +- household_disposable_income_slower_growth +- household_disposable_income_step_change +- hydro_inflows_barron_gorge +- hydro_inflows_blowering +- hydro_inflows_dartmouth +- hydro_inflows_eildon +- hydro_inflows_hume +- hydro_inflows_kareeya +- hydro_inflows_snowy +- hydro_inflows_tas +- hydrogen_consumption_by_region_type +- hydrogen_consumption_by_sub_region_type +- hydrogen_consumption_explicit +- hydrogen_demand_domestic +- hydrogen_demand_export +- hydrogen_demand_green_commodities +- hydrogen_demand_green_steel +- hydrogen_export_ports +- hydrogen_heat_content +- hydrogen_limit_for_gpg +- hydrogen_monthly_profiles +- hydrogen_prices +- industrial_fuel_costs +- initial_resource_limits +- initial_transmission_limits +- inter_regional_loss_equations_committed_and_anticipated +- inter_regional_loss_equations_development_options +- inter_regional_loss_equations_existing +- interconnector_transfer_capability +- lead_time_and_project_life +- liquid_fuel_prices +- locational_cost_factors +- locational_cost_pumped_hydro_factors +- long_duration_outages_existing_generators +- lret_target +- maintenance_existing_generators +- maintenance_new_entrants +- marginal_loss_factors_existing_generators +- marginal_loss_factors_new_entrant_electrolysers +- marginal_loss_factors_new_entrants +- maximum_capacity_existing_committed_anticipated_additional_generators +- maximum_capacity_new_entrants +- minimum_electrolyser_utilisation_factor +- nem_carbon_budget +- network_committed_and_anticipated_project_timing +- new_entrant_electrolysers_summary +- new_entrants_summary +- notional_transfer_uplift_committed_and_anticipated +- nsw_roadmap_min_vre_generation_target +- nsw_roadmap_rez_max_connection_limit +- nsw_roadmap_storage_energy_capacity_trajectory +- nsw_roadmap_storage_power_capacity_trajectory +- on_site_diesel_properties +- onsg_regional_capacity +- onsg_sub_regional_capacity +- other_distributed_resources_build_limits +- other_outages_existing_generators +- outages_new_entrants +- pipeline_transmission_tariffs +- powering_australia_plan +- pumped_hydro_existing_committed_anticipated_additional_properties +- pumped_hydro_new_entrant_properties +- pvnsg_consultant_scenario_mapping +- pvnsg_energy_capacity +- pvnsg_power_capacity +- ramp_rates_existing_generators +- ramp_rates_new_entrants +- reference_temperatures +- regional_carbon_budget_summary +- regional_carbon_budget_trajectory +- regional_reference_nodes +- regional_reserve +- regional_topology_representation +- renewable_energy_zones +- residential_electricity_price_indices +- residential_fuel_costs +- retirement_costs +- rez_augmentation_costs_accelerated_transition_NSW +- rez_augmentation_costs_accelerated_transition_QLD +- rez_augmentation_costs_accelerated_transition_SA +- rez_augmentation_costs_accelerated_transition_TAS +- rez_augmentation_costs_accelerated_transition_VIC +- rez_augmentation_costs_slower_growth_NSW +- rez_augmentation_costs_slower_growth_QLD +- rez_augmentation_costs_slower_growth_SA +- rez_augmentation_costs_slower_growth_TAS +- rez_augmentation_costs_slower_growth_VIC +- rez_augmentation_costs_step_change_NSW +- rez_augmentation_costs_step_change_QLD +- rez_augmentation_costs_step_change_SA +- rez_augmentation_costs_step_change_TAS +- rez_augmentation_costs_step_change_VIC +- rez_augmentation_options_NSW +- rez_augmentation_options_QLD +- rez_augmentation_options_SA +- rez_augmentation_options_TAS +- rez_augmentation_options_VIC +- rez_group_constraint_summary +- rez_secondary_transmission_limit_summary +- rez_transmission_limit_summary +- rez_transmission_modifiers +- rooftop_pv_consultant_scenario_mapping +- rooftop_pv_energy_capacity +- rooftop_pv_power_capacity +- sa_renewable_generation_target +- seasonal_ratings_existing_committed_anticipated_additional_generators +- seasonal_ratings_new_entrants +- sub_regional_load_and_generation_representation +- sub_regional_reference_nodes +- sydney_ring_generator_coefficients +- synchronous_unit_commitment_requirement_accelerated_transition +- synchronous_unit_commitment_requirement_step_change&slow_growth +- tas_renewable_energy_target +- tas_renewable_target_trajectory +- technology_cost_breakdown_ratios +- technology_specific_lcfs +- temperature_dependence_murrylink +- transmission_unplanned_outage_rate +- v2g_consultant_scenario_mapping +- v2g_energy_capacity +- v2g_power_capacity +- value_of_customer_reliability +- value_of_emissions_reduction +- variable_opex_existing_committed_anticipated_additional_generators +- variable_opex_new_entrants +- vic_offshore_wind_target +- vic_renewable_target +- vic_storage_target +- wacc +- water_for_hydrogen diff --git a/src/ispypsa/iasr_table_caching/local_cache.py b/src/ispypsa/iasr_table_caching/local_cache.py index b26087b4..c873b194 100644 --- a/src/ispypsa/iasr_table_caching/local_cache.py +++ b/src/ispypsa/iasr_table_caching/local_cache.py @@ -1,5 +1,7 @@ +from importlib.resources import files from pathlib import Path +import yaml from isp_workbook_parser import Parser from ..feature_flags import FEATURE_FLAGS @@ -14,16 +16,35 @@ _REZ_CONNECTION_PREPATORY_ACTIVITIES_TABLES, ) +_KNOWN_TABLES_RESOURCE = files("ispypsa.iasr_table_caching") / "known_tables.yaml" -def _build_required_tables() -> list[str]: +# Augmentation table prefixes the new-format templater consumes. Two flow-path +# cost prefixes are listed to absorb a known workbook typo — see +# Open-ISP/isp-workbook-parser#80; drop the singular form once fixed upstream. +_AUGMENTATION_PREFIXES = ( + "flow_path_augmentation_options_", + "flow_path_augmentation_costs_", + "flow_path_augmentation_cost_", + "rez_augmentation_options_", + "rez_augmentation_costs_", +) + + +def _load_known_tables() -> dict[str, list[str]]: + """Loads the static manifest of all tables known to exist per workbook version.""" + return yaml.safe_load(_KNOWN_TABLES_RESOURCE.read_text()) + + +def _build_required_tables(iasr_workbook_version: str) -> list[str]: if FEATURE_FLAGS["use_new_table_format"]: - _NETWORK_REQUIRED_TABLES = [ + all_tables = _load_known_tables()[iasr_workbook_version] + augmentation = [n for n in all_tables if n.startswith(_AUGMENTATION_PREFIXES)] + return [ "sub_regional_reference_nodes", "renewable_energy_zones", "flow_path_transfer_capability", "initial_transmission_limits", - ] - return _NETWORK_REQUIRED_TABLES + ] + augmentation else: _GENERATOR_PROPERTY_TABLES = [ table_name @@ -109,9 +130,6 @@ def _build_required_tables() -> list[str]: ) -REQUIRED_TABLES = _build_required_tables() - - def build_local_cache( cache_path: Path | str, workbook_path: Path | str, iasr_workbook_version: str ) -> None: @@ -144,12 +162,12 @@ def build_local_cache( "The IASR workbook provided does not match the version " "specified in the config." ) - tables_to_get = REQUIRED_TABLES + tables_to_get = _build_required_tables(iasr_workbook_version) workbook.save_tables(cache_path, tables=tables_to_get) return None -def list_cache_files(cache_path): - files = REQUIRED_TABLES +def list_cache_files(cache_path, iasr_workbook_version: str): + files = _build_required_tables(iasr_workbook_version) files = [cache_path / Path(file + ".csv") for file in files] return files diff --git a/src/ispypsa/templater/create_template.py b/src/ispypsa/templater/create_template.py index 5b6873b4..3ef98b82 100644 --- a/src/ispypsa/templater/create_template.py +++ b/src/ispypsa/templater/create_template.py @@ -18,6 +18,14 @@ _template_sub_regional_flow_paths, ) from ispypsa.templater.geography import _template_network_geography +from ispypsa.templater.network_expansion import ( + _append_new_parallel_paths, + _extract_flow_path_costs_from_iasr, + _extract_flow_path_options_from_iasr, + _extract_rez_costs_from_iasr, + _extract_rez_options_from_iasr, + _template_network_expansion, +) from ispypsa.templater.nodes import ( _template_regions, _template_sub_regions, @@ -65,11 +73,11 @@ def create_ispypsa_inputs_template( scenario: str, regional_granularity: str, - iasr_tables: dict[str : pd.DataFrame], - manually_extracted_tables: dict[str : pd.DataFrame], + iasr_tables: dict[str, pd.DataFrame], + manually_extracted_tables: dict[str, pd.DataFrame], filter_to_nem_regions: list[str] = None, filter_to_isp_sub_regions: list[str] = None, -) -> dict[str : pd.DataFrame]: +) -> dict[str, pd.DataFrame]: """Creates a template set of [`ISPyPSA` input tables](tables/ispypsa.md). Examples: @@ -149,8 +157,19 @@ def create_ispypsa_inputs_template( sub_regional_geography, regional_granularity, ) + flow_path_options = _extract_flow_path_options_from_iasr(iasr_tables) + paths, limits = _append_new_parallel_paths(paths, limits, flow_path_options) template["network_transmission_paths"] = paths template["network_transmission_path_limits"] = limits + expansion_options, expansion_costs = _template_network_expansion( + flow_path_options=flow_path_options, + flow_path_costs=_extract_flow_path_costs_from_iasr(iasr_tables, scenario), + rez_options=_extract_rez_options_from_iasr(iasr_tables), + rez_costs=_extract_rez_costs_from_iasr(iasr_tables, scenario), + network_transmission_paths=paths, + ) + template["network_expansion_options"] = expansion_options + template["network_transmission_path_expansion_costs"] = expansion_costs return template template = {} diff --git a/src/ispypsa/templater/helpers.py b/src/ispypsa/templater/helpers.py index 4d6441a9..ab13e6a7 100644 --- a/src/ispypsa/templater/helpers.py +++ b/src/ispypsa/templater/helpers.py @@ -220,6 +220,20 @@ def _add_units_to_financial_year_columns( return cols +def _financial_year_string_to_end_year_int(fy_string: str) -> int: + """Converts an IASR financial-year string like '2024-25' to its ending year (2025). + + Adds 1 to the start year (rather than parsing the two-digit end) to avoid + century-crossover ambiguity, mirroring + :func:`ispypsa.translator.helpers._get_financial_year_int_from_string`. + + I/O Example: + "2024-25" -> 2025 + "2099-00" -> 2100 + """ + return int(fy_string.split("-")[0]) + 1 + + def _convert_financial_year_columns_to_float(df: pd.DataFrame) -> pd.DataFrame: """Forcefully converts FY columns to float columns""" cols = [ diff --git a/src/ispypsa/templater/network_expansion.py b/src/ispypsa/templater/network_expansion.py new file mode 100644 index 00000000..5c43484c --- /dev/null +++ b/src/ispypsa/templater/network_expansion.py @@ -0,0 +1,970 @@ +import logging +import re + +import pandas as pd + +from .helpers import ( + _financial_year_string_to_end_year_int, + _fuzzy_match_names, + _snakecase_string, +) + +_FLOW_PATH_FORWARD_MW_COL = ( + "Notional transfer level increase (MW) Note: Same increase applies to all transfer " + "limit conditions (Peak demand, Summer typical and Winter reference)_Forward direction" +) +_FLOW_PATH_REVERSE_MW_COL = _FLOW_PATH_FORWARD_MW_COL.replace( + "Forward direction", "Reverse direction" +) + + +# --- New parallel paths inferred from augmentation source --- +# +# Some flow-path augmentation keys (e.g. CNSW-SNW) describe corridors whose +# existing topology is split into parallel suffixed paths (CNSW-SNW_NTH, +# CNSW-SNW_STH) — the un-suffixed key has no matching path_id. Per the decision +# logged in Open-ISP/ISPyPSA#96, we treat those keys as new parallel paths: +# the augmentation builds a third Link alongside the existing ones, with no +# pre-existing capacity. This loses any directional preference encoded in the +# IASR ``Development path`` column (NTH vs STH vs new corridor) — fine until +# a custom constraint actually differentiates them. + + +_NEW_PATH_DIRECTIONS = ("forward", "reverse") +_NEW_PATH_TIMESLICES = ("peak_demand", "summer_typical", "winter_reference") + + +def _new_parallel_path_rows( + flow_path_options: dict[str, pd.DataFrame], + existing_path_ids: set[str], +) -> tuple[pd.DataFrame, pd.DataFrame]: + """Builds topology + zero-capacity limit rows for augmentation keys without an existing path. + + Limits are explicit zeros (not NaN) because these paths physically don't exist + yet — NaN in this schema means "translator applies default capacity", which + would let the model dispatch flow on a Link that hasn't been built. + + I/O Example: + flow_path_options keys: {"CQ-NQ", "CNSW-SNW"} + existing_path_ids: {"CQ-NQ", "CNSW-SNW_NTH", "CNSW-SNW_STH"} + + returns: + paths: + path_id geo_from geo_to carrier + CNSW-SNW CNSW SNW AC + limits (6 rows: 2 directions x 3 timeslices, all 0 MW): + path_id direction timeslice capacity + CNSW-SNW forward peak_demand 0 + CNSW-SNW forward summer_typical 0 + ... etc + """ + new_keys = sorted(set(flow_path_options.keys()) - existing_path_ids) + paths = pd.DataFrame( + [_parse_path_key(k) for k in new_keys], + columns=["path_id", "geo_from", "geo_to", "carrier"], + ) + limits = pd.DataFrame( + [ + {"path_id": k, "direction": d, "timeslice": t, "capacity": 0.0} + for k in new_keys + for d in _NEW_PATH_DIRECTIONS + for t in _NEW_PATH_TIMESLICES + ], + columns=["path_id", "direction", "timeslice", "capacity"], + ) + return paths, limits + + +def _parse_path_key(key: str) -> dict: + """Parses a flow-path key like 'CNSW-SNW' into topology fields. Splits on the first hyphen.""" + geo_from, geo_to = key.split("-", 1) + return {"path_id": key, "geo_from": geo_from, "geo_to": geo_to, "carrier": "AC"} + + +def _append_new_parallel_paths( + paths: pd.DataFrame, + limits: pd.DataFrame, + flow_path_options: dict[str, pd.DataFrame], +) -> tuple[pd.DataFrame, pd.DataFrame]: + """Appends topology + limit rows for any augmentation corridors not already in the path table. + + Thin wrapper that calls :func:`_new_parallel_path_rows` and concatenates the result + into the upstream ``paths`` and ``limits`` tables. See ISPyPSA#96 for the modelling + decision. + + I/O Example: + paths: + path_id geo_from geo_to carrier + CNSW-SNW_NTH CNSW SNW AC + CNSW-SNW_STH CNSW SNW AC + + flow_path_options keys: {"CNSW-SNW"} # un-suffixed corridor + + returns paths (new row appended): + path_id geo_from geo_to carrier + CNSW-SNW_NTH CNSW SNW AC + CNSW-SNW_STH CNSW SNW AC + CNSW-SNW CNSW SNW AC + """ + new_paths, new_limits = _new_parallel_path_rows( + flow_path_options, set(paths["path_id"]) + ) + if new_paths.empty: + return paths, limits + paths = pd.concat([paths, new_paths], ignore_index=True) + limits = pd.concat([limits, new_limits], ignore_index=True) + return paths, limits + + +# --- Extraction from iasr_tables dict --- + + +def _extract_flow_path_options_from_iasr( + iasr_tables: dict[str, pd.DataFrame], +) -> dict[str, pd.DataFrame]: + """Discovers flow_path_augmentation_options_ tables and keys them by path_id.""" + return _iasr_tables_with_prefix(iasr_tables, "flow_path_augmentation_options_") + + +def _extract_flow_path_costs_from_iasr( + iasr_tables: dict[str, pd.DataFrame], scenario: str +) -> dict[str, pd.DataFrame]: + """Discovers flow_path_augmentation_costs__ tables and keys them by path_id.""" + snake = _snakecase_string(scenario) + return _iasr_tables_with_prefix( + iasr_tables, + ( + f"flow_path_augmentation_costs_{snake}_", + # v7.5 workbook has one mistyped table (singular "cost"); drop the + # second prefix once Open-ISP/isp-workbook-parser#80 is fixed. + f"flow_path_augmentation_cost_{snake}_", + ), + ) + + +def _extract_rez_options_from_iasr( + iasr_tables: dict[str, pd.DataFrame], +) -> dict[str, pd.DataFrame]: + """Discovers rez_augmentation_options_ tables and keys them by state code.""" + return _iasr_tables_with_prefix(iasr_tables, "rez_augmentation_options_") + + +def _extract_rez_costs_from_iasr( + iasr_tables: dict[str, pd.DataFrame], scenario: str +) -> dict[str, pd.DataFrame]: + """Discovers rez_augmentation_costs__ tables and keys them by state code.""" + return _iasr_tables_with_prefix( + iasr_tables, f"rez_augmentation_costs_{_snakecase_string(scenario)}_" + ) + + +def _iasr_tables_with_prefix( + iasr_tables: dict[str, pd.DataFrame], prefixes: str | tuple[str, ...] +) -> dict[str, pd.DataFrame]: + """Returns the subset of iasr_tables whose names start with any of ``prefixes``, stripped of the matching prefix. + + Accepts a single prefix or a tuple of alternative prefixes (used to absorb + upstream typos — see Open-ISP/isp-workbook-parser#80). + + I/O Example: + iasr_tables (keys only): + flow_path_augmentation_options_CQ-NQ + flow_path_augmentation_options_NNSW-SQ + rez_augmentation_options_NSW + renewable_energy_zones + + prefixes: "flow_path_augmentation_options_" + + returns (keys only): + CQ-NQ + NNSW-SQ + """ + if isinstance(prefixes, str): + prefixes = (prefixes,) + result = {} + for name, df in iasr_tables.items(): + for prefix in prefixes: + if name.startswith(prefix): + result[name[len(prefix) :]] = df + break + return result + + +# --- Orchestrator --- + + +def _template_network_expansion( + flow_path_options: dict[str, pd.DataFrame], + flow_path_costs: dict[str, pd.DataFrame], + rez_options: dict[str, pd.DataFrame], + rez_costs: dict[str, pd.DataFrame], + network_transmission_paths: pd.DataFrame, +) -> tuple[pd.DataFrame, pd.DataFrame]: + """ + Process flow path and REZ augmentation options and cost forecasts to find the least + cost option for each path, return results in `ISPyPSA` format as two tables: the + selected options split by direction, and a long-form cost trajectory in $/MW. + + Args: + flow_path_options: dict mapping path_id to pd.DataFrame of flow path + augmentation options. DataFrames include columns 'Flow path', + 'Option name', and the notional transfer level increase columns for + forward and reverse directions. + flow_path_costs: dict mapping path_id to pd.DataFrame of flow path + augmentation costs for the selected scenario. DataFrames include + columns 'Flow path', 'Option', and one column per financial year + (e.g., '2024-25', '2025-26', ...). + rez_options: dict mapping state code to pd.DataFrame of REZ augmentation + options. DataFrames include columns 'REZ / constraint ID', 'Option', + 'Additional network capacity (MW)', and 'Additional import capacity (MW)'. + rez_costs: dict mapping state code to pd.DataFrame of REZ augmentation costs + for the selected scenario. DataFrames include columns 'REZ / Constraint + ID', 'Option', and one column per financial year. + network_transmission_paths: pd.DataFrame templated network paths table with + columns 'path_id', 'geo_from', etc. Used to map REZ IDs to their + pre-built path_id. Constraint-group IDs (absent from this table) pass + through unchanged as the expansion_id. + + Returns: + Tuple of (options, costs) pd.DataFrames. + + options: one row per (expansion_id, expansion_type). Physical paths emit + forward + reverse; constraint groups emit a single constraint_relaxation + row. Columns: + - expansion_id + - expansion_type ('forward', 'reverse', or 'constraint_relaxation') + - allowed_expansion (MW) + - expansion_option (name of the selected augmentation option, + retained for traceability) + + costs: long-form cost trajectory. Columns: + - expansion_id + - year (financial-year ending year as int, e.g. 2025 for FY 2024-25) + - cost ($/MW) + + I/O Example: + Inputs (abbreviated): + + flow_path_options["CQ-NQ"]: + Flow path Option name Fwd_MW Rev_MW Indicative cost ... + CQ-NQ CQ-NQ Option 1 1000 1200 500 + CQ-NQ CQ-NQ Option 2 1500 1500 1000 + + flow_path_costs["CQ-NQ"]: + Flow path Option 2024-25 2025-26 ... + CQ-NQ CQ-NQ Option 1 500000000 510000000 + CQ-NQ CQ-NQ Option 2 1200000000 1220000000 + + rez_options["NSW"]: + REZ / constraint ID Option Additional_net_MW Additional_imp_MW + N1 Option 1 1660 1660 + + rez_costs["NSW"]: + REZ / Constraint ID Option 2024-25 2025-26 ... + N1 Option 1 5875680000 5964045000 + + network_transmission_paths: + path_id geo_from geo_to carrier + CQ-NQ CQ NQ AC + N1-CNSW N1 CNSW AC + + Outputs: + + options (network_expansion_options): + expansion_id expansion_type allowed_expansion expansion_option + CQ-NQ forward 1000 CQ-NQ Option 1 # better $/MW than Option 2 + CQ-NQ reverse 1200 CQ-NQ Option 1 + N1-CNSW forward 1660 Option 1 + N1-CNSW reverse 1660 Option 1 + + costs (network_transmission_path_expansion_costs), in $/MW: + expansion_id year cost + CQ-NQ 2025 416666.67 # 500M / 1200 + CQ-NQ 2026 425000.00 + N1-CNSW 2025 3539566.27 # 5.88B / 1660 + N1-CNSW 2026 3593401.81 + """ + options = _load_all_options( + flow_path_options, rez_options, network_transmission_paths + ) + costs = _load_all_costs( + flow_path_costs, rez_costs, network_transmission_paths, options + ) + selected = _select_least_cost_option_per_expansion(options, costs) + options_table = _build_options_table(options, selected, network_transmission_paths) + costs_table = _build_costs_table(costs, options, selected) + return options_table, costs_table + + +# --- Options loading --- + + +def _load_all_options( + flow_path_options: dict[str, pd.DataFrame], + rez_options: dict[str, pd.DataFrame], + network_transmission_paths: pd.DataFrame, +) -> pd.DataFrame: + """Concats flow-path and REZ augmentation options into one normalised frame.""" + flow = _extract_flow_path_options(flow_path_options) + rez = _extract_rez_options(rez_options, network_transmission_paths) + return pd.concat([flow, rez], ignore_index=True) + + +def _extract_flow_path_options( + flow_path_options: dict[str, pd.DataFrame], +) -> pd.DataFrame: + """Normalises flow-path augmentation options to a standard schema. + + I/O Example: + flow_path_options["CQ-NQ"]: + Flow path Option name Fwd_MW Rev_MW + CQ-NQ CQ-NQ Option 1 1000 1200 + CQ-NQ CQ-NQ Option 2 text text # non-numeric, dropped + + returns: + expansion_id option_name forward_mw reverse_mw + CQ-NQ CQ-NQ Option 1 1000.0 1200.0 + """ + if not flow_path_options: + return _empty_options_frame() + frames = [ + _normalise_flow_path_option_frame(df) for df in flow_path_options.values() + ] + return pd.concat(frames, ignore_index=True) + + +def _normalise_flow_path_option_frame(df: pd.DataFrame) -> pd.DataFrame: + """Renames columns, parses MW values, drops rows with no numeric capacity. + + I/O Example: + df (real IASR column names abbreviated — see ``_FLOW_PATH_FORWARD_MW_COL``): + Flow path Option name Fwd_MW Rev_MW + CQ-NQ CQ-NQ Option 1 1000 1200 + CQ-NQ CQ-NQ Option 2 text text + + returns: + expansion_id option_name forward_mw reverse_mw + CQ-NQ CQ-NQ Option 1 1000.0 1200.0 # Option 2 dropped + """ + normalised = pd.DataFrame( + { + "expansion_id": df["Flow path"], + "option_name": df["Option name"], + "forward_mw": _parse_numeric(df[_FLOW_PATH_FORWARD_MW_COL]), + "reverse_mw": _parse_numeric(df[_FLOW_PATH_REVERSE_MW_COL]), + } + ) + return _drop_options_with_no_capacity(normalised) + + +def _extract_rez_options( + rez_options: dict[str, pd.DataFrame], + network_transmission_paths: pd.DataFrame, +) -> pd.DataFrame: + """Normalises REZ augmentation options and maps REZ IDs to their path_id. + + I/O Example: + rez_options["NSW"]: + REZ / constraint ID Option Additional_net_MW Additional_imp_MW + N1 Option 1 1660 1660 + SWNSW1 Option 1 "Removes limit" "" # dropped + + network_transmission_paths: + path_id geo_from + N1-CNSW N1 + + returns: + expansion_id option_name forward_mw reverse_mw + N1-CNSW Option 1 1660.0 1660.0 + """ + if not rez_options: + return _empty_options_frame() + geo_from_to_path_id = _build_geo_from_to_path_id_map(network_transmission_paths) + frames = [ + _normalise_rez_option_frame(df, geo_from_to_path_id) + for df in rez_options.values() + ] + return pd.concat(frames, ignore_index=True) + + +def _normalise_rez_option_frame( + df: pd.DataFrame, geo_from_to_path_id: dict[str, str] +) -> pd.DataFrame: + """Renames columns, maps REZ ID to expansion_id, parses MW values, drops no-capacity rows. + + I/O Example: + df: + REZ / constraint ID Option Additional_net_MW Additional_imp_MW + N1 Option 1 1660 1660 + SWQLD1 Option 1 150 NaN # constraint group + SWNSW1 Option 1 "Removes limit" NaN # dropped + + geo_from_to_path_id: {"N1": "N1-NNSW"} + + returns: + expansion_id option_name forward_mw reverse_mw + N1-NNSW Option 1 1660.0 1660.0 + SWQLD1 Option 1 150.0 NaN # passed through unchanged + """ + normalised = pd.DataFrame( + { + "expansion_id": _map_rez_id_to_expansion_id( + df["REZ / constraint ID"], geo_from_to_path_id + ), + "option_name": df["Option"], + "forward_mw": _parse_numeric(df["Additional network capacity (MW)"]), + "reverse_mw": _parse_numeric(df["Additional import capacity (MW)"]), + } + ) + normalised = normalised.dropna(subset=["expansion_id"]) + return _drop_options_with_no_capacity(normalised) + + +def _map_rez_id_to_expansion_id( + rez_id: pd.Series, geo_from_to_path_id: dict[str, str] +) -> pd.Series: + """Maps REZ IDs to their path_id (which is their expansion_id); constraint group + IDs (e.g. SWQLD1, SEVIC1) aren't in the map and pass through unchanged. NaN stays + NaN so the caller can drop it. + + I/O Example: + rez_id: + N1 + SWQLD1 + NaN + + geo_from_to_path_id: {"N1": "N1-NNSW", "Q1": "Q1-NQ"} + + returns: + N1-NNSW # REZ mapped to its path_id + SWQLD1 # constraint group passes through + None # NaN → None for caller to drop + """ + + def convert(r): + if pd.isna(r): + return None + return geo_from_to_path_id.get(r, r) + + return rez_id.map(convert) + + +def _build_geo_from_to_path_id_map( + network_transmission_paths: pd.DataFrame, +) -> dict[str, str]: + """Maps each geo_from value to its path_id. REZ IDs appear once (one parent + subregion per REZ); subregion IDs may appear multiple times and collapse to + whichever path_id appears last — harmless because REZ options tables never + contain subregion IDs. + + I/O Example: + network_transmission_paths: + path_id geo_from geo_to carrier + CQ-NQ CQ NQ AC + CQ-GG CQ GG AC # CQ collapses, but we never look it up + N1-NNSW N1 NNSW AC + + returns: + {"CQ": "CQ-GG", "N1": "N1-NNSW"} + """ + return dict( + zip( + network_transmission_paths["geo_from"], + network_transmission_paths["path_id"], + ) + ) + + +def _drop_options_with_no_capacity(options: pd.DataFrame) -> pd.DataFrame: + """Drops rows where both forward and reverse capacity are non-numeric, with logging. + + I/O Example: + options: + expansion_id option_name forward_mw reverse_mw + CQ-NQ Option 1 1000.0 1200.0 + CQ-NQ Option 2 NaN NaN # dropped, log emitted + SWQLD1 Option 1 150.0 NaN # kept (forward is numeric) + + returns: + expansion_id option_name forward_mw reverse_mw + CQ-NQ Option 1 1000.0 1200.0 + SWQLD1 Option 1 150.0 NaN + """ + no_capacity = options["forward_mw"].isna() & options["reverse_mw"].isna() + if no_capacity.any(): + dropped = options.loc[no_capacity, ["expansion_id", "option_name"]] + for _, row in dropped.iterrows(): + logging.info( + f"Skipping option '{row['option_name']}' for '{row['expansion_id']}': " + "no numeric capacity in forward or reverse direction." + ) + return options.loc[~no_capacity].reset_index(drop=True) + + +# --- Costs loading --- + + +def _load_all_costs( + flow_path_costs: dict[str, pd.DataFrame], + rez_costs: dict[str, pd.DataFrame], + network_transmission_paths: pd.DataFrame, + options: pd.DataFrame, +) -> pd.DataFrame: + """Concats flow-path and REZ cost tables and aligns option_names to ``options``.""" + flow = _extract_flow_path_costs(flow_path_costs) + rez = _extract_rez_costs(rez_costs, network_transmission_paths) + costs = pd.concat([flow, rez], ignore_index=True) + return _align_option_names_to_options(costs, options) + + +def _extract_flow_path_costs( + flow_path_costs: dict[str, pd.DataFrame], +) -> pd.DataFrame: + """Melts flow-path cost tables from wide (year columns) to long format. + + I/O Example: + flow_path_costs["CQ-NQ"]: + Flow path Option 2024-25 2025-26 + CQ-NQ CQ-NQ Option 1 500000000 510000000 + + returns: + expansion_id option_name year cost + CQ-NQ CQ-NQ Option 1 2025 500000000 + CQ-NQ CQ-NQ Option 1 2026 510000000 + """ + if not flow_path_costs: + return _empty_costs_frame() + frames = [ + _normalise_cost_frame(df, id_col="Flow path", option_col="Option") + for df in flow_path_costs.values() + ] + return pd.concat(frames, ignore_index=True) + + +def _extract_rez_costs( + rez_costs: dict[str, pd.DataFrame], + network_transmission_paths: pd.DataFrame, +) -> pd.DataFrame: + """Melts REZ cost tables and maps REZ ID (or constraint group ID) to expansion_id. + + I/O Example: + rez_costs["NSW"]: + REZ / Constraint ID Option 2024-25 2025-26 + N1 Option 1 5875000000 5964000000 + SWQLD1 Option 1 500000 505000 + + network_transmission_paths: + path_id geo_from + N1-NNSW N1 + + returns: + expansion_id option_name year cost + N1-NNSW Option 1 2025 5875000000 + N1-NNSW Option 1 2026 5964000000 + SWQLD1 Option 1 2025 500000 # constraint group passes through + SWQLD1 Option 1 2026 505000 + """ + if not rez_costs: + return _empty_costs_frame() + geo_from_to_path_id = _build_geo_from_to_path_id_map(network_transmission_paths) + # IASR uses "REZ / Constraint ID" (capital C) in cost tables but "REZ / constraint ID" + # (lowercase c) in the options tables — preserved verbatim from the source workbook. + frames = [ + _normalise_cost_frame(df, id_col="REZ / Constraint ID", option_col="Option") + for df in rez_costs.values() + ] + long = pd.concat(frames, ignore_index=True) + long["expansion_id"] = _map_rez_id_to_expansion_id( + long["expansion_id"], geo_from_to_path_id + ) + return long.reset_index(drop=True) + + +def _normalise_cost_frame( + df: pd.DataFrame, id_col: str, option_col: str +) -> pd.DataFrame: + """Melts a wide cost frame to (expansion_id, option_name, year, cost), dropping non-numeric costs. + + Year column names (e.g. '2024-25') are converted to the financial-year ending + year as an int (2025) — see :func:`_financial_year_string_to_end_year_int`. + + I/O Example: + df (with id_col="Flow path", option_col="Option"): + Flow path Option Status 2024-25 2025-26 + CQ-NQ Option 1 500000000 510000000 + CQ-NQ Option 2 "N/A" 1220000000 + + returns: + expansion_id option_name year cost + CQ-NQ Option 1 2025 500000000 + CQ-NQ Option 1 2026 510000000 + CQ-NQ Option 2 2026 1220000000 # 2025 dropped (non-numeric) + """ + year_cols = [c for c in df.columns if _looks_like_financial_year(c)] + long = df[[id_col, option_col] + year_cols].melt( + id_vars=[id_col, option_col], var_name="year", value_name="cost" + ) + long = long.rename(columns={id_col: "expansion_id", option_col: "option_name"}) + long["year"] = long["year"].map(_financial_year_string_to_end_year_int) + long["cost"] = pd.to_numeric(long["cost"], errors="coerce") + return long.dropna(subset=["cost"]).reset_index(drop=True) + + +def _looks_like_financial_year(col: str) -> bool: + """True if column name matches a financial year pattern like '2024-25'.""" + return bool(re.match(r"^\d{4}-\d{2}$", str(col))) + + +# --- Selection --- + + +def _select_least_cost_option_per_expansion( + options: pd.DataFrame, costs: pd.DataFrame +) -> pd.DataFrame: + """Selects the lowest $/MW option per expansion_id using the first year with complete costs. + + I/O Example: + options: + expansion_id option_name forward_mw reverse_mw + CQ-NQ CQ-NQ Option 1 1000 1200 # $/MW = 500M/1200 = 416,667 + CQ-NQ CQ-NQ Option 2 1500 1500 # $/MW = 1.2B/1500 = 800,000 + + costs (first year with complete costs = 2025): + expansion_id option_name year cost + CQ-NQ CQ-NQ Option 1 2025 500000000 + CQ-NQ CQ-NQ Option 2 2025 1200000000 + + returns: + expansion_id option_name + CQ-NQ CQ-NQ Option 1 + """ + anchor_costs = _first_year_with_complete_costs_per_expansion(costs) + scored = _score_options(options, anchor_costs) + return _pick_min_per_expansion(scored) + + +def _align_option_names_to_options( + costs: pd.DataFrame, options: pd.DataFrame +) -> pd.DataFrame: + """Fuzzy-matches each expansion's cost option_names to its option_names in the options frame. + + Bridges systematic mismatches between the two source tables (em-dash vs hyphen, + path prefix variations, optional ``(Project Marinus …)``-style annotations). + + I/O Example: + options: + expansion_id option_name + NNSW-SQ NNSW-SQ Option 1 + TAS-SEV TAS-SEV Option 1 (Project Marinus Stage 1) + + costs: + expansion_id option_name year cost + NNSW-SQ NNSW–SQ Option 1 2025 500000000 # em-dash + TAS-SEV TAS-SEV Option 1 2025 3750000000 # no annotation + + returns: + expansion_id option_name year cost + NNSW-SQ NNSW-SQ Option 1 2025 500000000 + TAS-SEV TAS-SEV Option 1 (Project Marinus Stage 1) 2025 3750000000 + """ + aligned = [] + for expansion_id, cost_group in costs.groupby("expansion_id"): + option_names = options.loc[ + options["expansion_id"] == expansion_id, "option_name" + ].unique() + if len(option_names) == 0: + logging.warning( + f"No options for expansion_id '{expansion_id}'; " + f"dropping {len(cost_group)} orphaned cost row(s). " + "Expected when all options for the expansion_id were dropped for " + "non-numeric capacity; otherwise indicates the upstream options " + "table is missing for this id." + ) + continue + cost_group = cost_group.copy() + cost_group["option_name"] = _fuzzy_match_names( + cost_group["option_name"], + option_names, + task_desc=f"matching cost option_names to options for {expansion_id}", + threshold=60, + ) + aligned.append(cost_group) + return pd.concat(aligned, ignore_index=True) if aligned else costs.iloc[0:0] + + +def _first_year_with_complete_costs_per_expansion(costs: pd.DataFrame) -> pd.DataFrame: + """For each expansion_id, returns costs from the earliest year where all options have a cost. + + I/O Example: + costs: + expansion_id option_name year cost + CQ-NQ Option 1 2025 500000000 + CQ-NQ Option 1 2026 510000000 + CQ-NQ Option 2 2026 1220000000 # Option 2 missing 2025 + + returns (2026 is the first year with complete costs for CQ-NQ): + expansion_id option_name year cost + CQ-NQ Option 1 2026 510000000 + CQ-NQ Option 2 2026 1220000000 + """ + selected = [] + for expansion_id, group in costs.groupby("expansion_id"): + year = _earliest_complete_year(group) + if year is None: + logging.warning( + f"No year with complete costs for '{expansion_id}'; skipping." + ) + continue + selected.append(group.loc[group["year"] == year]) + return pd.concat(selected, ignore_index=True) if selected else costs.iloc[0:0] + + +def _earliest_complete_year(path_costs: pd.DataFrame) -> int | None: + """Finds the earliest year where every option in this path has a cost, else None. + + I/O Example: + path_costs: + option_name year cost + Option 1 2025 500000000 + Option 1 2026 510000000 + Option 2 2026 1220000000 + + returns: 2026 # 2025 missing Option 2 cost + """ + option_count = path_costs["option_name"].nunique() + per_year = path_costs.groupby("year")["option_name"].nunique() + complete_years = per_year[per_year == option_count].index + return min(complete_years) if len(complete_years) else None + + +def _score_options(options: pd.DataFrame, anchor_costs: pd.DataFrame) -> pd.DataFrame: + """Joins options to their anchor-year cost and computes $/MW using max directional MW. + + I/O Example: + options: + expansion_id option_name forward_mw reverse_mw + CQ-NQ Option 1 1000 1200 + CQ-NQ Option 2 1500 1500 + + anchor_costs: + expansion_id option_name cost + CQ-NQ Option 1 500000000 + CQ-NQ Option 2 1200000000 + + returns (max_mw = max(forward, reverse); cost_per_mw = cost / max_mw): + expansion_id option_name forward_mw reverse_mw cost max_mw cost_per_mw + CQ-NQ Option 1 1000 1200 500000000 1200 416666.67 + CQ-NQ Option 2 1500 1500 1200000000 1500 800000.00 + """ + merged = options.merge( + anchor_costs[["expansion_id", "option_name", "cost"]], + on=["expansion_id", "option_name"], + how="inner", + ) + merged["max_mw"] = merged[["forward_mw", "reverse_mw"]].max(axis=1) + merged["cost_per_mw"] = merged["cost"] / merged["max_mw"] + return merged + + +def _pick_min_per_expansion(scored: pd.DataFrame) -> pd.DataFrame: + """Returns the (expansion_id, option_name) of the minimum $/MW option per expansion. + + I/O Example: + scored: + expansion_id option_name cost_per_mw + CQ-NQ Option 1 416666.67 # winner + CQ-NQ Option 2 800000.00 + N1-NNSW Option 1 3539566.27 # winner (only option) + + returns: + expansion_id option_name + CQ-NQ Option 1 + N1-NNSW Option 1 + """ + winners = scored.loc[scored.groupby("expansion_id")["cost_per_mw"].idxmin()] + return winners[["expansion_id", "option_name"]].reset_index(drop=True) + + +# --- Output shaping --- + + +def _build_options_table( + options: pd.DataFrame, + selected: pd.DataFrame, + network_transmission_paths: pd.DataFrame, +) -> pd.DataFrame: + """Filters to selected options and emits (expansion_id, expansion_type, allowed_expansion, expansion_option). + + Physical paths emit two rows (``forward`` + ``reverse``); constraint groups + (expansion_ids absent from ``network_transmission_paths``) emit one + ``constraint_relaxation`` row. + + I/O Example: + options: + expansion_id option_name forward_mw reverse_mw + CQ-NQ Option 1 1000 1200 + CQ-NQ Option 2 1500 1500 # not selected + SWQLD1 Option 1 330 NaN # constraint group + + selected: + expansion_id option_name + CQ-NQ Option 1 + SWQLD1 Option 1 + + network_transmission_paths: + path_id geo_from geo_to carrier + CQ-NQ CQ NQ AC + + returns: + expansion_id expansion_type allowed_expansion expansion_option + CQ-NQ forward 1000 Option 1 + CQ-NQ reverse 1200 Option 1 + SWQLD1 constraint_relaxation 330 Option 1 + """ + selected_options = options.merge( + selected, on=["expansion_id", "option_name"], how="inner" + ) + path_ids = set(network_transmission_paths["path_id"]) + is_path = selected_options["expansion_id"].isin(path_ids) + path_rows = _melt_path_options_to_directions(selected_options[is_path]) + constraint_rows = _build_constraint_relaxation_rows(selected_options[~is_path]) + combined = pd.concat([path_rows, constraint_rows], ignore_index=True) + return ( + combined[ + ["expansion_id", "expansion_type", "allowed_expansion", "expansion_option"] + ] + .sort_values(["expansion_id", "expansion_type"]) + .reset_index(drop=True) + ) + + +def _melt_path_options_to_directions(options: pd.DataFrame) -> pd.DataFrame: + """For physical paths, melts forward/reverse capacity columns into expansion_type rows. + + Blank source values are emitted as 0 — for paths, a missing direction + means "this option provides no expansion in that direction". + + I/O Example: + options: + expansion_id option_name forward_mw reverse_mw + CQ-NQ Option 1 1000 1200 + DN1-CNSW Option 2a 500 NaN # no reverse expansion in source + + returns: + expansion_id expansion_option expansion_type allowed_expansion + CQ-NQ Option 1 forward 1000 + CQ-NQ Option 1 reverse 1200 + DN1-CNSW Option 2a forward 500 + DN1-CNSW Option 2a reverse 0 # NaN -> 0 + """ + long = options.melt( + id_vars=["expansion_id", "option_name"], + value_vars=["forward_mw", "reverse_mw"], + var_name="expansion_type", + value_name="allowed_expansion", + ) + long["expansion_type"] = long["expansion_type"].str.replace("_mw", "", regex=False) + long["allowed_expansion"] = long["allowed_expansion"].fillna(0) + return long.rename(columns={"option_name": "expansion_option"}) + + +def _build_constraint_relaxation_rows(options: pd.DataFrame) -> pd.DataFrame: + """For constraint groups, emits one row per expansion_id using whichever direction has capacity. + + I/O Example: + options: + expansion_id option_name forward_mw reverse_mw + SWQLD1 Option 1 330 NaN + + returns: + expansion_id expansion_type allowed_expansion expansion_option + SWQLD1 constraint_relaxation 330 Option 1 + """ + return pd.DataFrame( + { + "expansion_id": options["expansion_id"].values, + "expansion_type": "constraint_relaxation", + "allowed_expansion": options["forward_mw"] + .combine_first(options["reverse_mw"]) + .values, + "expansion_option": options["option_name"].values, + } + ) + + +def _build_costs_table( + costs: pd.DataFrame, options: pd.DataFrame, selected: pd.DataFrame +) -> pd.DataFrame: + """Filters costs to selected options and divides by max directional MW to get $/MW. + + I/O Example: + costs: + expansion_id option_name year cost + CQ-NQ Option 1 2025 500000000 + CQ-NQ Option 1 2026 510000000 + CQ-NQ Option 2 2025 1200000000 # not selected + + options: + expansion_id option_name forward_mw reverse_mw + CQ-NQ Option 1 1000 1200 + CQ-NQ Option 2 1500 1500 + + selected: + expansion_id option_name + CQ-NQ Option 1 + + returns (cost is divided by max_mw = max(1000, 1200) = 1200): + expansion_id year cost + CQ-NQ 2025 416666.67 + CQ-NQ 2026 425000.00 + """ + selected_costs = costs.merge( + selected, on=["expansion_id", "option_name"], how="inner" + ) + selected_with_mw = selected_costs.merge( + options[["expansion_id", "option_name", "forward_mw", "reverse_mw"]], + on=["expansion_id", "option_name"], + how="inner", + ) + selected_with_mw["max_mw"] = selected_with_mw[["forward_mw", "reverse_mw"]].max( + axis=1 + ) + selected_with_mw["cost"] = selected_with_mw["cost"] / selected_with_mw["max_mw"] + return ( + selected_with_mw[["expansion_id", "year", "cost"]] + .sort_values(["expansion_id", "year"]) + .reset_index(drop=True) + ) + + +# --- Utilities --- + + +def _parse_numeric(series: pd.Series) -> pd.Series: + """Parses a series to floats; non-numeric becomes NaN. Handles comma-thousands.""" + cleaned = series.astype(str).str.replace(",", "", regex=False) + return pd.to_numeric(cleaned, errors="coerce") + + +def _empty_options_frame() -> pd.DataFrame: + """Schema-shaped empty DataFrame for the internal options representation.""" + return pd.DataFrame( + { + "expansion_id": pd.Series(dtype="object"), + "option_name": pd.Series(dtype="object"), + "forward_mw": pd.Series(dtype="float64"), + "reverse_mw": pd.Series(dtype="float64"), + } + ) + + +def _empty_costs_frame() -> pd.DataFrame: + """Schema-shaped empty DataFrame for the internal costs representation.""" + return pd.DataFrame( + { + "expansion_id": pd.Series(dtype="object"), + "option_name": pd.Series(dtype="object"), + "year": pd.Series(dtype="int64"), + "cost": pd.Series(dtype="float64"), + } + ) diff --git a/src/ispypsa/validation/schemas/network_expansion_options.yaml b/src/ispypsa/validation/schemas/network_expansion_options.yaml index 687a1ba2..25f28e07 100644 --- a/src/ispypsa/validation/schemas/network_expansion_options.yaml +++ b/src/ispypsa/validation/schemas/network_expansion_options.yaml @@ -1,11 +1,13 @@ table: network_expansion_options required: false unique: - - [expansion_id] + - [expansion_id, expansion_type] description: > Defines the selected expansion option and allowed capacity increase for expandable network elements. Covers both physical transmission paths and - group constraints that can be relaxed through expansion. + group constraints that can be relaxed through expansion. Physical paths + emit two rows (forward and reverse); constraint groups emit one + constraint_relaxation row. columns: expansion_id: type: string @@ -19,11 +21,19 @@ columns: Identifier for the expandable network element. Maps to path_id in network_transmission_paths for physical paths, or to constraint_id in constraints_rhs for group constraints. + expansion_type: + type: string + required: true + allowed_values: [forward, reverse, constraint_relaxation] + description: > + Aspect of the network this row's capacity describes. ``forward`` and + ``reverse`` apply to physical paths; ``constraint_relaxation`` applies + to group constraints. allowed_expansion: type: float required: true units: MW - description: Capacity increase provided by the selected expansion option. + description: Capacity increase provided by the selected expansion option for this expansion_type. expansion_option: type: string required: false diff --git a/src/ispypsa/validation/schemas/network_transmission_path_expansion_costs.yaml b/src/ispypsa/validation/schemas/network_transmission_path_expansion_costs.yaml index 6d125a1b..2a3a3f7c 100644 --- a/src/ispypsa/validation/schemas/network_transmission_path_expansion_costs.yaml +++ b/src/ispypsa/validation/schemas/network_transmission_path_expansion_costs.yaml @@ -24,4 +24,9 @@ columns: type: float required: true units: $/MW - description: Annualised expansion cost. + description: > + Annualised expansion cost, expressed per MW of the maximum directional + capacity: total option cost divided by max(forward, reverse) of the + selected option's allowed_expansion. For symmetric options (forward == + reverse) this is unambiguous; for asymmetric options the divisor is + whichever direction has the larger capacity increase. diff --git a/tests/test_iasr_table_caching/test_local_cache.py b/tests/test_iasr_table_caching/test_local_cache.py index 97bfbdb7..a937e725 100644 --- a/tests/test_iasr_table_caching/test_local_cache.py +++ b/tests/test_iasr_table_caching/test_local_cache.py @@ -8,13 +8,22 @@ def test_build_required_tables_new_format(): "ispypsa.iasr_table_caching.local_cache.FEATURE_FLAGS", {"use_new_table_format": True}, ): - result = _build_required_tables() - assert result == [ + result = _build_required_tables("7.5") + # Base topology tables come first + assert result[:4] == [ "sub_regional_reference_nodes", "renewable_energy_zones", "flow_path_transfer_capability", "initial_transmission_limits", ] + # Augmentation tables discovered from the manifest by prefix + assert "flow_path_augmentation_options_CQ-NQ" in result + assert "flow_path_augmentation_costs_step_change_CQ-NQ" in result + assert "rez_augmentation_options_NSW" in result + assert "rez_augmentation_costs_step_change_NSW" in result + # Typo'd table is included so the templater can pick it up while + # Open-ISP/isp-workbook-parser#80 is open. + assert "flow_path_augmentation_cost_slower_growth_CNSW-NNSW" in result def test_build_required_tables_old_format(): @@ -22,7 +31,7 @@ def test_build_required_tables_old_format(): "ispypsa.iasr_table_caching.local_cache.FEATURE_FLAGS", {"use_new_table_format": False}, ): - result = _build_required_tables() + result = _build_required_tables("6.0") assert "sub_regional_reference_nodes" in result assert "initial_build_limits" in result assert "existing_generators_summary" in result diff --git a/tests/test_templater/test_create_ispypsa_inputs_template.py b/tests/test_templater/test_create_ispypsa_inputs_template.py index f5609b94..1cb21267 100644 --- a/tests/test_templater/test_create_ispypsa_inputs_template.py +++ b/tests/test_templater/test_create_ispypsa_inputs_template.py @@ -96,6 +96,34 @@ def test_create_ispypsa_inputs_template_new_format(csv_str_to_df): REZ ID, REZ transmission network limit_Peak demand, REZ transmission network limit_Summer typical, REZ transmission network limit_Winter reference Q1, 750, 750, 750 """) + # Minimal expansion inputs covering one flow path and one REZ state. The extractors + # tolerate missing path/state tables, so we only supply CQ-NQ and NSW here. + flow_path_aug_options_cq_nq = pd.DataFrame( + [("CQ-NQ", "CQ-NQ Option 1", 1000, 1000)], + columns=[ + "Flow path", + "Option name", + "Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Forward direction", + "Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Reverse direction", + ], + ) + flow_path_aug_costs_cq_nq = pd.DataFrame( + [("CQ-NQ", "CQ-NQ Option 1", 1_000_000, 1_010_000)], + columns=["Flow path", "Option", "2024-25", "2025-26"], + ) + rez_aug_options_nsw = pd.DataFrame( + [("N3", "Option 1", 1500, 1500)], + columns=[ + "REZ / constraint ID", + "Option", + "Additional network capacity (MW)", + "Additional import capacity (MW)", + ], + ) + rez_aug_costs_nsw = pd.DataFrame( + [("N3", "Option 1", 750_000, 760_000)], + columns=["REZ / Constraint ID", "Option", "2024-25", "2025-26"], + ) with patch( "ispypsa.templater.create_template.FEATURE_FLAGS", @@ -109,6 +137,10 @@ def test_create_ispypsa_inputs_template_new_format(csv_str_to_df): "renewable_energy_zones": renewable_energy_zones, "flow_path_transfer_capability": flow_path_transfer_capability, "initial_transmission_limits": initial_transmission_limits, + "flow_path_augmentation_options_CQ-NQ": flow_path_aug_options_cq_nq, + "flow_path_augmentation_costs_step_change_CQ-NQ": flow_path_aug_costs_cq_nq, + "rez_augmentation_options_NSW": rez_aug_options_nsw, + "rez_augmentation_costs_step_change_NSW": rez_aug_costs_nsw, }, manually_extracted_tables={}, ) @@ -130,6 +162,23 @@ def test_create_ispypsa_inputs_template_new_format(csv_str_to_df): # N3-CNSW: 1 (absent from initial_transmission_limits, collapsed). assert len(limits) == 13 + assert "network_expansion_options" in result + expansion_options = result["network_expansion_options"] + assert set(expansion_options.columns) == { + "expansion_id", + "expansion_type", + "allowed_expansion", + "expansion_option", + } + # CQ-NQ + N3-CNSW, each emitted as forward + reverse (both are physical paths). + assert len(expansion_options) == 4 + + assert "network_transmission_path_expansion_costs" in result + expansion_costs = result["network_transmission_path_expansion_costs"] + assert set(expansion_costs.columns) == {"expansion_id", "year", "cost"} + # 2 expansion_ids x 2 years + assert len(expansion_costs) == 4 + def test_create_ispypsa_inputs_template_new_format_nem_regions(csv_str_to_df): sub_regional_reference_nodes = csv_str_to_df(""" diff --git a/tests/test_templater/test_network_expansion.py b/tests/test_templater/test_network_expansion.py new file mode 100644 index 00000000..73f570af --- /dev/null +++ b/tests/test_templater/test_network_expansion.py @@ -0,0 +1,564 @@ +import logging + +import pandas as pd + +from ispypsa.templater.network_expansion import ( + _FLOW_PATH_FORWARD_MW_COL, + _FLOW_PATH_REVERSE_MW_COL, + _align_option_names_to_options, + _first_year_with_complete_costs_per_expansion, + _new_parallel_path_rows, + _template_network_expansion, +) + +_FP_OPT_COLS = [ + "Flow path", + "Option name", + _FLOW_PATH_FORWARD_MW_COL, + _FLOW_PATH_REVERSE_MW_COL, +] + + +def _fp_options(rows: list[tuple]) -> pd.DataFrame: + return pd.DataFrame(rows, columns=_FP_OPT_COLS) + + +def _fp_costs(rows: list[tuple], years: list[str]) -> pd.DataFrame: + return pd.DataFrame(rows, columns=["Flow path", "Option"] + years) + + +def _rez_options(rows: list[tuple]) -> pd.DataFrame: + return pd.DataFrame( + rows, + columns=[ + "REZ / constraint ID", + "Option", + "Additional network capacity (MW)", + "Additional import capacity (MW)", + ], + ) + + +def _rez_costs(rows: list[tuple], years: list[str]) -> pd.DataFrame: + return pd.DataFrame(rows, columns=["REZ / Constraint ID", "Option"] + years) + + +def _paths_table(rows: list[tuple]) -> pd.DataFrame: + """Build a minimal network_transmission_paths frame. Rows are (path_id, geo_from).""" + return pd.DataFrame(rows, columns=["path_id", "geo_from"]) + + +def test_template_network_expansion_picks_least_cost_and_splits_directions( + csv_str_to_df, +): + flow_path_options = { + "CQ-NQ": _fp_options( + [ + # Option 1: 1000MW, will have higher $/MW + ("CQ-NQ", "CQ-NQ Option 1", 1000, 1000), + # Option 2: 500MW, will have lower $/MW (winner) + ("CQ-NQ", "CQ-NQ Option 2", 500, 400), + ] + ), + } + flow_path_costs = { + "CQ-NQ": _fp_costs( + [ + ("CQ-NQ", "CQ-NQ Option 1", 1_000_000, 1_010_000), + ("CQ-NQ", "CQ-NQ Option 2", 200_000, 205_000), + ], + years=["2024-25", "2025-26"], + ), + } + rez_options = { + "NSW": _rez_options( + [ + ("N1", "Option 1", 1660, 1660), + ] + ), + } + rez_costs = { + "NSW": _rez_costs( + [("N1", "Option 1", 5_000_000, 5_100_000)], + years=["2024-25", "2025-26"], + ), + } + network_transmission_paths = _paths_table([("N1-NNSW", "N1"), ("CQ-NQ", "CQ")]) + + options, costs = _template_network_expansion( + flow_path_options=flow_path_options, + flow_path_costs=flow_path_costs, + rez_options=rez_options, + rez_costs=rez_costs, + network_transmission_paths=network_transmission_paths, + ) + + # CQ-NQ Option 2 wins ($200k / 500MW = $400/MW vs Option 1 $1M/1000MW = $1000/MW) + expected_options = csv_str_to_df(""" + expansion_id, expansion_type, allowed_expansion, expansion_option + CQ-NQ, forward, 500, CQ-NQ Option 2 + CQ-NQ, reverse, 400, CQ-NQ Option 2 + N1-NNSW, forward, 1660, Option 1 + N1-NNSW, reverse, 1660, Option 1 + """) + pd.testing.assert_frame_equal( + options.sort_values(["expansion_id", "expansion_type"]).reset_index(drop=True), + expected_options.sort_values(["expansion_id", "expansion_type"]).reset_index( + drop=True + ), + check_dtype=False, + ) + + # cost_per_mw: CQ-NQ uses max(500, 400) = 500; N1 uses max(1660, 1660) = 1660 + expected_costs = csv_str_to_df(""" + expansion_id, year, cost + CQ-NQ, 2025, 400.0 + CQ-NQ, 2026, 410.0 + N1-NNSW, 2025, 3012.048192771084 + N1-NNSW, 2026, 3072.289156626506 + """) + pd.testing.assert_frame_equal( + costs.sort_values(["expansion_id", "year"]).reset_index(drop=True), + expected_costs.sort_values(["expansion_id", "year"]).reset_index(drop=True), + check_dtype=False, + rtol=1e-5, + ) + + +def test_template_network_expansion_skips_non_numeric_capacity(csv_str_to_df): + # SWNSW1-style option with "Removes limit" should be skipped. + flow_path_options = { + "CQ-NQ": _fp_options( + [ + ("CQ-NQ", "CQ-NQ Option 1", 1000, 1000), + ( + "CQ-NQ", + "CQ-NQ Option 2", + "Removes limit", + "Non-network augmentation", + ), + ] + ), + } + flow_path_costs = { + "CQ-NQ": _fp_costs( + [ + ("CQ-NQ", "CQ-NQ Option 1", 1_000_000, 1_010_000), + ("CQ-NQ", "CQ-NQ Option 2", 500_000, 505_000), + ], + years=["2024-25", "2025-26"], + ), + } + rez_options = {"NSW": _rez_options([])} + rez_costs = {"NSW": _rez_costs([], years=["2024-25", "2025-26"])} + network_transmission_paths = _paths_table([("CQ-NQ", "CQ")]) + + options, costs = _template_network_expansion( + flow_path_options=flow_path_options, + flow_path_costs=flow_path_costs, + rez_options=rez_options, + rez_costs=rez_costs, + network_transmission_paths=network_transmission_paths, + ) + + # Only Option 1 survives (Option 2 has non-numeric capacity, skipped). + expected_options = csv_str_to_df(""" + expansion_id, expansion_type, allowed_expansion, expansion_option + CQ-NQ, forward, 1000, CQ-NQ Option 1 + CQ-NQ, reverse, 1000, CQ-NQ Option 1 + """) + pd.testing.assert_frame_equal( + options.sort_values(["expansion_id", "expansion_type"]).reset_index(drop=True), + expected_options.sort_values(["expansion_id", "expansion_type"]).reset_index( + drop=True + ), + check_dtype=False, + ) + + +def test_template_network_expansion_fuzzy_matches_em_dash_option_names(csv_str_to_df): + # Options table uses hyphen; costs table uses em-dash. Fuzzy match should bridge them. + flow_path_options = { + "NNSW-SQ": _fp_options( + [ + ("NNSW-SQ", "NNSW-SQ Option 1", 1000, 1000), + ] + ), + } + flow_path_costs = { + "NNSW-SQ": _fp_costs( + [("NNSW-SQ", "NNSW–SQ Option 1", 500_000, 505_000)], # em-dash + years=["2024-25", "2025-26"], + ), + } + rez_options = {"NSW": _rez_options([])} + rez_costs = {"NSW": _rez_costs([], years=["2024-25", "2025-26"])} + network_transmission_paths = _paths_table([("NNSW-SQ", "NNSW")]) + + options, costs = _template_network_expansion( + flow_path_options=flow_path_options, + flow_path_costs=flow_path_costs, + rez_options=rez_options, + rez_costs=rez_costs, + network_transmission_paths=network_transmission_paths, + ) + + # Em-dash cost option_name is aligned to the hyphen form, so the join finds it + # and both directions + both years are emitted. + expected_options = csv_str_to_df(""" + expansion_id, expansion_type, allowed_expansion, expansion_option + NNSW-SQ, forward, 1000, NNSW-SQ Option 1 + NNSW-SQ, reverse, 1000, NNSW-SQ Option 1 + """) + pd.testing.assert_frame_equal( + options.sort_values(["expansion_id", "expansion_type"]).reset_index(drop=True), + expected_options.sort_values(["expansion_id", "expansion_type"]).reset_index( + drop=True + ), + check_dtype=False, + ) + + expected_costs = csv_str_to_df(""" + expansion_id, year, cost + NNSW-SQ, 2025, 500.0 + NNSW-SQ, 2026, 505.0 + """) + pd.testing.assert_frame_equal( + costs.sort_values(["expansion_id", "year"]).reset_index(drop=True), + expected_costs.sort_values(["expansion_id", "year"]).reset_index(drop=True), + check_dtype=False, + rtol=1e-5, + ) + + +def test_new_parallel_path_rows_picks_up_keys_without_existing_path(csv_str_to_df): + # Augmentation source has a key (CNSW-SNW) that has no exact match in the existing + # topology — only suffixed parallel paths (CNSW-SNW_NTH, CNSW-SNW_STH) exist. The + # key should produce a new parallel-path topology row plus six zero-capacity limit + # rows (2 directions x 3 timeslices) — zero, not NaN, because the path doesn't + # physically exist yet. + flow_path_options = { + "CQ-NQ": pd.DataFrame(), # already in topology, no new row + "CNSW-SNW": pd.DataFrame(), # new parallel path + } + existing_path_ids = {"CQ-NQ", "CNSW-SNW_NTH", "CNSW-SNW_STH"} + + new_paths, new_limits = _new_parallel_path_rows( + flow_path_options, existing_path_ids + ) + + expected_paths = csv_str_to_df(""" + path_id, geo_from, geo_to, carrier + CNSW-SNW, CNSW, SNW, AC + """) + pd.testing.assert_frame_equal( + new_paths.reset_index(drop=True), + expected_paths.reset_index(drop=True), + check_dtype=False, + ) + # 6 zero-capacity rows: 2 directions x 3 timeslices. + assert list(new_limits.columns) == ["path_id", "direction", "timeslice", "capacity"] + assert len(new_limits) == 6 + assert (new_limits["path_id"] == "CNSW-SNW").all() + assert (new_limits["capacity"] == 0.0).all() + assert set(new_limits["direction"]) == {"forward", "reverse"} + assert set(new_limits["timeslice"]) == { + "peak_demand", + "summer_typical", + "winter_reference", + } + + +def test_template_network_expansion_treats_blank_path_direction_as_zero(csv_str_to_df): + # A REZ-derived path option with no reverse capacity in the source should still + # emit both forward and reverse rows; the missing direction is 0 MW (no expansion), + # not NaN. + flow_path_options = {} + flow_path_costs = {} + rez_options = { + "NSW": _rez_options( + [ + ("DN1", "Option 1", 500, None), + ] + ), + } + rez_costs = { + "NSW": _rez_costs( + [("DN1", "Option 1", 1_000_000, 1_010_000)], + years=["2024-25", "2025-26"], + ), + } + network_transmission_paths = _paths_table([("DN1-CNSW", "DN1")]) + + options, _ = _template_network_expansion( + flow_path_options=flow_path_options, + flow_path_costs=flow_path_costs, + rez_options=rez_options, + rez_costs=rez_costs, + network_transmission_paths=network_transmission_paths, + ) + + expected_options = csv_str_to_df(""" + expansion_id, expansion_type, allowed_expansion, expansion_option + DN1-CNSW, forward, 500, Option 1 + DN1-CNSW, reverse, 0, Option 1 + """) + pd.testing.assert_frame_equal( + options.sort_values(["expansion_id", "expansion_type"]).reset_index(drop=True), + expected_options.sort_values(["expansion_id", "expansion_type"]).reset_index( + drop=True + ), + check_dtype=False, + ) + + +def test_template_network_expansion_passes_constraint_group_ids_through(csv_str_to_df): + # Constraint-group IDs (e.g. SWQLD1) aren't in renewable_energy_zones but should still + # be emitted as expansion_ids (per the cross-cutting decision), unchanged from the source. + # Winner calc: Option 1 = $500k / 150MW = $3333/MW; Option 2 = $800k / 330MW = $2424/MW → Option 2. + flow_path_options = {} + flow_path_costs = {} + rez_options = { + "QLD": _rez_options( + [ + ("SWQLD1", "Option 1", 150, None), + ("SWQLD1", "Option 2", 330, None), + ] + ), + } + rez_costs = { + "QLD": _rez_costs( + [ + ("SWQLD1", "Option 1", 500_000, 505_000), + ("SWQLD1", "Option 2", 800_000, 810_000), + ], + years=["2024-25", "2025-26"], + ), + } + # network_transmission_paths does NOT include SWQLD1 (only the Q1 REZ connection). + network_transmission_paths = _paths_table([("Q1-NQ", "Q1")]) + + options, costs = _template_network_expansion( + flow_path_options=flow_path_options, + flow_path_costs=flow_path_costs, + rez_options=rez_options, + rez_costs=rez_costs, + network_transmission_paths=network_transmission_paths, + ) + + # Constraint group: emits a single constraint_relaxation row, not a forward/reverse pair. + expected_options = csv_str_to_df(""" + expansion_id, expansion_type, allowed_expansion, expansion_option + SWQLD1, constraint_relaxation, 330, Option 2 + """) + pd.testing.assert_frame_equal( + options.sort_values(["expansion_id", "expansion_type"]).reset_index(drop=True), + expected_options.sort_values(["expansion_id", "expansion_type"]).reset_index( + drop=True + ), + check_dtype=False, + ) + + expected_costs = csv_str_to_df(""" + expansion_id, year, cost + SWQLD1, 2025, 2424.242424242424 + SWQLD1, 2026, 2454.545454545454 + """) + pd.testing.assert_frame_equal( + costs.sort_values(["expansion_id", "year"]).reset_index(drop=True), + expected_costs.sort_values(["expansion_id", "year"]).reset_index(drop=True), + check_dtype=False, + rtol=1e-5, + ) + + +def test_template_network_expansion_empty_inputs_produce_empty_outputs(): + options, costs = _template_network_expansion( + flow_path_options={}, + flow_path_costs={}, + rez_options={}, + rez_costs={}, + network_transmission_paths=_paths_table([]), + ) + + assert list(options.columns) == [ + "expansion_id", + "expansion_type", + "allowed_expansion", + "expansion_option", + ] + assert list(costs.columns) == ["expansion_id", "year", "cost"] + assert len(options) == 0 + assert len(costs) == 0 + + +def test_template_network_expansion_flow_paths_only_rez_empty(csv_str_to_df): + # Flow paths populated, REZ inputs empty — only flow-path rows emitted. + flow_path_options = { + "CQ-NQ": _fp_options([("CQ-NQ", "CQ-NQ Option 1", 1000, 1200)]), + } + flow_path_costs = { + "CQ-NQ": _fp_costs( + [("CQ-NQ", "CQ-NQ Option 1", 600_000, 612_000)], + years=["2024-25", "2025-26"], + ), + } + + options, costs = _template_network_expansion( + flow_path_options=flow_path_options, + flow_path_costs=flow_path_costs, + rez_options={}, + rez_costs={}, + network_transmission_paths=_paths_table([("CQ-NQ", "CQ")]), + ) + + expected_options = csv_str_to_df(""" + expansion_id, expansion_type, allowed_expansion, expansion_option + CQ-NQ, forward, 1000, CQ-NQ Option 1 + CQ-NQ, reverse, 1200, CQ-NQ Option 1 + """) + pd.testing.assert_frame_equal( + options.sort_values(["expansion_id", "expansion_type"]).reset_index(drop=True), + expected_options.sort_values(["expansion_id", "expansion_type"]).reset_index( + drop=True + ), + check_dtype=False, + ) + + expected_costs = csv_str_to_df(""" + expansion_id, year, cost + CQ-NQ, 2025, 500.0 + CQ-NQ, 2026, 510.0 + """) + pd.testing.assert_frame_equal( + costs.sort_values(["expansion_id", "year"]).reset_index(drop=True), + expected_costs.sort_values(["expansion_id", "year"]).reset_index(drop=True), + check_dtype=False, + rtol=1e-5, + ) + + +def test_align_option_names_warns_when_costs_have_no_matching_options(caplog): + # Costs contain an expansion_id that has no corresponding options rows (e.g. because + # all options were dropped for non-numeric capacity upstream, or because the upstream + # options table is missing). The orphaned cost rows should be dropped with a warning. + options = pd.DataFrame( + { + "expansion_id": ["CQ-NQ"], + "option_name": ["Option 1"], + } + ) + costs = pd.DataFrame( + { + "expansion_id": ["CQ-NQ", "SWNSW1", "SWNSW1"], + "option_name": ["Option 1", "Option 1", "Option 1"], + "year": [2025, 2025, 2026], + "cost": [500_000, 1_000_000, 1_020_000], + } + ) + + with caplog.at_level(logging.WARNING): + result = _align_option_names_to_options(costs, options) + + assert set(result["expansion_id"]) == {"CQ-NQ"} + assert any( + "SWNSW1" in r.message and "orphaned" in r.message for r in caplog.records + ) + + +def test_first_year_with_complete_costs_warns_and_skips_when_no_complete_year(caplog): + # Two options for one expansion, but every year is missing one option's cost — + # no year is "complete", so the expansion is dropped with a warning. + costs = pd.DataFrame( + { + "expansion_id": ["CQ-NQ", "CQ-NQ"], + "option_name": ["Option 1", "Option 2"], + "year": [2025, 2026], + "cost": [500_000, 600_000], + } + ) + + with caplog.at_level(logging.WARNING): + result = _first_year_with_complete_costs_per_expansion(costs) + + assert len(result) == 0 + assert any("CQ-NQ" in r.message for r in caplog.records) + + +def test_template_network_expansion_drops_expansion_with_no_complete_year(caplog): + # End-to-end: an expansion with no complete-cost year produces no rows in either output. + flow_path_options = { + "CQ-NQ": _fp_options( + [ + ("CQ-NQ", "CQ-NQ Option 1", 1000, 1000), + ("CQ-NQ", "CQ-NQ Option 2", 1500, 1500), + ] + ), + } + flow_path_costs = { + "CQ-NQ": _fp_costs( + # Each option has a cost in a different year; no year covers both. + [ + ("CQ-NQ", "CQ-NQ Option 1", 500_000, None), + ("CQ-NQ", "CQ-NQ Option 2", None, 600_000), + ], + years=["2024-25", "2025-26"], + ), + } + + with caplog.at_level(logging.WARNING): + options, costs = _template_network_expansion( + flow_path_options=flow_path_options, + flow_path_costs=flow_path_costs, + rez_options={}, + rez_costs={}, + network_transmission_paths=_paths_table([("CQ-NQ", "CQ")]), + ) + + assert len(options) == 0 + assert len(costs) == 0 + assert any("CQ-NQ" in r.message for r in caplog.records) + + +def test_template_network_expansion_rez_only_flow_paths_empty(csv_str_to_df): + # REZ inputs populated, flow paths empty — only REZ-derived rows emitted. + rez_options = {"NSW": _rez_options([("N1", "Option 1", 1660, 1660)])} + rez_costs = { + "NSW": _rez_costs( + [("N1", "Option 1", 5_000_000, 5_100_000)], + years=["2024-25", "2025-26"], + ), + } + + options, costs = _template_network_expansion( + flow_path_options={}, + flow_path_costs={}, + rez_options=rez_options, + rez_costs=rez_costs, + network_transmission_paths=_paths_table([("N1-NNSW", "N1")]), + ) + + expected_options = csv_str_to_df(""" + expansion_id, expansion_type, allowed_expansion, expansion_option + N1-NNSW, forward, 1660, Option 1 + N1-NNSW, reverse, 1660, Option 1 + """) + pd.testing.assert_frame_equal( + options.sort_values(["expansion_id", "expansion_type"]).reset_index(drop=True), + expected_options.sort_values(["expansion_id", "expansion_type"]).reset_index( + drop=True + ), + check_dtype=False, + ) + + expected_costs = csv_str_to_df(""" + expansion_id, year, cost + N1-NNSW, 2025, 3012.048192771084 + N1-NNSW, 2026, 3072.289156626506 + """) + pd.testing.assert_frame_equal( + costs.sort_values(["expansion_id", "year"]).reset_index(drop=True), + expected_costs.sort_values(["expansion_id", "year"]).reset_index(drop=True), + check_dtype=False, + rtol=1e-5, + ) From 4ad1a9bd86cddd654d9a7e312d0f17b48e204d15 Mon Sep 17 00:00:00 2001 From: nick-gorman Date: Wed, 29 Apr 2026 16:44:04 +1000 Subject: [PATCH 02/14] Filter flow-path augmentations to match aggregated network paths At nem_regions and single_region the network paths table is aggregated before the expansion templater runs, so flow-path augmentation entries keyed by raw IASR sub-region path IDs no longer line up with the surviving paths. Drop intra-region entries and re-key cross-region ones (NNSW-SQ -> NSW-QLD, suffixes preserved); at single_region drop all flow-path augmentations entirely. REZ and constraint-group entries are unaffected: REZ entries remap automatically via the geo-to-path lookup built from the already-aggregated paths, and constraint groups stay valid at all granularities since they can still bite on REZ-to- region lines. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/ispypsa/templater/create_template.py | 17 ++- src/ispypsa/templater/network_expansion.py | 93 ++++++++++++++ .../test_create_ispypsa_inputs_template.py | 117 +++++++++++++++--- .../test_templater/test_network_expansion.py | 103 +++++++++++++++ 4 files changed, 314 insertions(+), 16 deletions(-) diff --git a/src/ispypsa/templater/create_template.py b/src/ispypsa/templater/create_template.py index 3ef98b82..ab00ed2e 100644 --- a/src/ispypsa/templater/create_template.py +++ b/src/ispypsa/templater/create_template.py @@ -24,6 +24,7 @@ _extract_flow_path_options_from_iasr, _extract_rez_costs_from_iasr, _extract_rez_options_from_iasr, + _filter_flow_path_augmentations_to_granularity, _template_network_expansion, ) from ispypsa.templater.nodes import ( @@ -157,13 +158,25 @@ def create_ispypsa_inputs_template( sub_regional_geography, regional_granularity, ) - flow_path_options = _extract_flow_path_options_from_iasr(iasr_tables) + region_lookup = dict( + zip(sub_regional_geography["geo_id"], sub_regional_geography["region_id"]) + ) + flow_path_options = _filter_flow_path_augmentations_to_granularity( + _extract_flow_path_options_from_iasr(iasr_tables), + regional_granularity, + region_lookup, + ) + flow_path_costs = _filter_flow_path_augmentations_to_granularity( + _extract_flow_path_costs_from_iasr(iasr_tables, scenario), + regional_granularity, + region_lookup, + ) paths, limits = _append_new_parallel_paths(paths, limits, flow_path_options) template["network_transmission_paths"] = paths template["network_transmission_path_limits"] = limits expansion_options, expansion_costs = _template_network_expansion( flow_path_options=flow_path_options, - flow_path_costs=_extract_flow_path_costs_from_iasr(iasr_tables, scenario), + flow_path_costs=flow_path_costs, rez_options=_extract_rez_options_from_iasr(iasr_tables), rez_costs=_extract_rez_costs_from_iasr(iasr_tables, scenario), network_transmission_paths=paths, diff --git a/src/ispypsa/templater/network_expansion.py b/src/ispypsa/templater/network_expansion.py index 5c43484c..da5f8fe0 100644 --- a/src/ispypsa/templater/network_expansion.py +++ b/src/ispypsa/templater/network_expansion.py @@ -190,6 +190,99 @@ def _iasr_tables_with_prefix( return result +# --- Granularity-aware filtering of flow-path augmentations --- + + +def _filter_flow_path_augmentations_to_granularity( + augmentations: dict[str, pd.DataFrame], + regional_granularity: str, + region_lookup: dict[str, str], +) -> dict[str, pd.DataFrame]: + """Filters/re-keys flow-path augmentation tables to match the aggregated network paths. + + Flow-path augmentation tables come from IASR keyed by sub-region path IDs. When + `network_transmission_paths` is aggregated to a coarser granularity, augmentation + entries for paths that no longer exist would point at non-existent expansion_ids. + + sub_regions: returned unchanged. + nem_regions: intra-region keys dropped; cross-region keys re-keyed + (NNSW-SQ → NSW-QLD), preserving any '_suffix'. The "Flow path" column + inside each DataFrame is also rewritten so it stays aligned with the dict key. + single_region: returns an empty dict — flow paths don't exist at this granularity. + + I/O Example: + augmentations: + "CQ-NQ": # intra-QLD + "NNSW-SQ": # NSW <-> QLD + + region_lookup: {"CQ": "QLD", "NQ": "QLD", "NNSW": "NSW", "SQ": "QLD"} + + regional_granularity = "nem_regions" returns: + "NSW-QLD": + + regional_granularity = "single_region" returns: {} + """ + if regional_granularity == "sub_regions": + return augmentations + if regional_granularity == "single_region": + return {} + if regional_granularity == "nem_regions": + return _aggregate_flow_path_augmentations_to_nem_regions( + augmentations, region_lookup + ) + raise ValueError(f"Unknown regional_granularity: {regional_granularity!r}") + + +def _aggregate_flow_path_augmentations_to_nem_regions( + augmentations: dict[str, pd.DataFrame], + region_lookup: dict[str, str], +) -> dict[str, pd.DataFrame]: + """Drops intra-region augmentation entries and re-keys cross-region ones. + + I/O Example: + augmentations keys: {"CQ-NQ", "NNSW-SQ", "NNSW-SQ_Terranora"} + region_lookup: {"CQ": "QLD", "NQ": "QLD", "NNSW": "NSW", "SQ": "QLD"} + + returns keys: {"NSW-QLD", "NSW-QLD_Terranora"} # CQ-NQ dropped (intra-QLD) + """ + result = {} + for old_key, df in augmentations.items(): + new_key = _rekey_augmentation_path_to_region(old_key, region_lookup) + if new_key is None: + continue + new_df = df.copy() + new_df["Flow path"] = new_key + result[new_key] = new_df + return result + + +def _rekey_augmentation_path_to_region( + path_key: str, region_lookup: dict[str, str] +) -> str | None: + """Aggregates a sub-region augmentation key to its NEM-region key, or None if intra-region. + + Splits the key into base and optional suffix, maps each base endpoint to its + region via ``region_lookup``, and rebuilds. Returns ``None`` when both endpoints + sit in the same region (intra-region augmentations don't survive aggregation). + + I/O Example: + region_lookup: {"NNSW": "NSW", "SQ": "QLD", "CQ": "QLD", "NQ": "QLD", + "CNSW": "NSW", "SNW": "NSW"} + + "NNSW-SQ" -> "NSW-QLD" # cross-region + "NNSW-SQ_Terranora" -> "NSW-QLD_Terranora" # suffix preserved + "CQ-NQ" -> None # intra-QLD + "CNSW-SNW" -> None # intra-NSW + """ + base, sep, suffix = path_key.partition("_") + geo_from, geo_to = base.split("-", 1) + region_from = region_lookup[geo_from] + region_to = region_lookup[geo_to] + if region_from == region_to: + return None + return f"{region_from}-{region_to}{sep}{suffix}" + + # --- Orchestrator --- diff --git a/tests/test_templater/test_create_ispypsa_inputs_template.py b/tests/test_templater/test_create_ispypsa_inputs_template.py index 1cb21267..fdcea6e9 100644 --- a/tests/test_templater/test_create_ispypsa_inputs_template.py +++ b/tests/test_templater/test_create_ispypsa_inputs_template.py @@ -10,6 +10,25 @@ list_templater_output_files, load_manually_extracted_tables, ) +from ispypsa.templater.network_expansion import ( + _FLOW_PATH_FORWARD_MW_COL, + _FLOW_PATH_REVERSE_MW_COL, +) + +_FP_AUG_OPTION_COLS = [ + "Flow path", + "Option name", + _FLOW_PATH_FORWARD_MW_COL, + _FLOW_PATH_REVERSE_MW_COL, +] +_FP_AUG_COST_COLS = ["Flow path", "Option", "2024-25", "2025-26"] +_REZ_AUG_OPTION_COLS = [ + "REZ / constraint ID", + "Option", + "Additional network capacity (MW)", + "Additional import capacity (MW)", +] +_REZ_AUG_COST_COLS = ["REZ / Constraint ID", "Option", "2024-25", "2025-26"] def test_create_ispypsa_inputs_template_sub_regions( @@ -100,29 +119,19 @@ def test_create_ispypsa_inputs_template_new_format(csv_str_to_df): # tolerate missing path/state tables, so we only supply CQ-NQ and NSW here. flow_path_aug_options_cq_nq = pd.DataFrame( [("CQ-NQ", "CQ-NQ Option 1", 1000, 1000)], - columns=[ - "Flow path", - "Option name", - "Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Forward direction", - "Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Reverse direction", - ], + columns=_FP_AUG_OPTION_COLS, ) flow_path_aug_costs_cq_nq = pd.DataFrame( [("CQ-NQ", "CQ-NQ Option 1", 1_000_000, 1_010_000)], - columns=["Flow path", "Option", "2024-25", "2025-26"], + columns=_FP_AUG_COST_COLS, ) rez_aug_options_nsw = pd.DataFrame( [("N3", "Option 1", 1500, 1500)], - columns=[ - "REZ / constraint ID", - "Option", - "Additional network capacity (MW)", - "Additional import capacity (MW)", - ], + columns=_REZ_AUG_OPTION_COLS, ) rez_aug_costs_nsw = pd.DataFrame( [("N3", "Option 1", 750_000, 760_000)], - columns=["REZ / Constraint ID", "Option", "2024-25", "2025-26"], + columns=_REZ_AUG_COST_COLS, ) with patch( @@ -203,6 +212,33 @@ def test_create_ispypsa_inputs_template_new_format_nem_regions(csv_str_to_df): REZ ID, REZ transmission network limit_Peak demand, REZ transmission network limit_Summer typical, REZ transmission network limit_Winter reference Q1, 750, 750, 750 """) + # Augmentation tables for both an intra-region path (CQ-NQ, dropped) and a + # cross-region path (NNSW-SQ, re-keyed to NSW-QLD). REZ N3 augmentation + # exercises automatic REZ→region remapping (N3-CNSW → N3-NSW). + flow_path_aug_options_cq_nq = pd.DataFrame( + [("CQ-NQ", "CQ-NQ Option 1", 1000, 1000)], + columns=_FP_AUG_OPTION_COLS, + ) + flow_path_aug_options_nnsw_sq = pd.DataFrame( + [("NNSW-SQ", "NNSW-SQ Option 1", 500, 600)], + columns=_FP_AUG_OPTION_COLS, + ) + flow_path_aug_costs_cq_nq = pd.DataFrame( + [("CQ-NQ", "CQ-NQ Option 1", 1_000_000, 1_010_000)], + columns=_FP_AUG_COST_COLS, + ) + flow_path_aug_costs_nnsw_sq = pd.DataFrame( + [("NNSW-SQ", "NNSW-SQ Option 1", 600_000, 610_000)], + columns=_FP_AUG_COST_COLS, + ) + rez_aug_options_nsw = pd.DataFrame( + [("N3", "Option 1", 1500, 1500)], + columns=_REZ_AUG_OPTION_COLS, + ) + rez_aug_costs_nsw = pd.DataFrame( + [("N3", "Option 1", 750_000, 760_000)], + columns=_REZ_AUG_COST_COLS, + ) with patch( "ispypsa.templater.create_template.FEATURE_FLAGS", @@ -216,6 +252,12 @@ def test_create_ispypsa_inputs_template_new_format_nem_regions(csv_str_to_df): "renewable_energy_zones": renewable_energy_zones, "flow_path_transfer_capability": flow_path_transfer_capability, "initial_transmission_limits": initial_transmission_limits, + "flow_path_augmentation_options_CQ-NQ": flow_path_aug_options_cq_nq, + "flow_path_augmentation_options_NNSW-SQ": flow_path_aug_options_nnsw_sq, + "flow_path_augmentation_costs_step_change_CQ-NQ": flow_path_aug_costs_cq_nq, + "flow_path_augmentation_costs_step_change_NNSW-SQ": flow_path_aug_costs_nnsw_sq, + "rez_augmentation_options_NSW": rez_aug_options_nsw, + "rez_augmentation_costs_step_change_NSW": rez_aug_costs_nsw, }, manually_extracted_tables={}, ) @@ -234,6 +276,18 @@ def test_create_ispypsa_inputs_template_new_format_nem_regions(csv_str_to_df): # NNSW-SQ -> NSW-QLD: 6 rows. Q1-QLD: 6 rows. N3-NSW: 1 collapsed row. assert len(limits) == 13 + expansion_options = result["network_expansion_options"] + # CQ-NQ augmentation dropped (intra-QLD); NNSW-SQ re-keyed to NSW-QLD; + # N3 REZ augmentation re-keyed via geography to N3-NSW. Both physical paths + # emit forward + reverse, so 4 rows total. + assert set(expansion_options["expansion_id"]) == {"NSW-QLD", "N3-NSW"} + assert len(expansion_options) == 4 + + expansion_costs = result["network_transmission_path_expansion_costs"] + assert set(expansion_costs["expansion_id"]) == {"NSW-QLD", "N3-NSW"} + # 2 expansion_ids x 2 years + assert len(expansion_costs) == 4 + def test_create_ispypsa_inputs_template_new_format_single_region(csv_str_to_df): sub_regional_reference_nodes = csv_str_to_df(""" @@ -254,6 +308,25 @@ def test_create_ispypsa_inputs_template_new_format_single_region(csv_str_to_df): REZ ID, REZ transmission network limit_Peak demand, REZ transmission network limit_Summer typical, REZ transmission network limit_Winter reference Q1, 750, 750, 750 """) + # CQ-NQ augmentation present in inputs; expected to be dropped entirely at + # single_region. REZ N3 augmentation should still flow through with + # expansion_id = N3-NEM. + flow_path_aug_options_cq_nq = pd.DataFrame( + [("CQ-NQ", "CQ-NQ Option 1", 1000, 1000)], + columns=_FP_AUG_OPTION_COLS, + ) + flow_path_aug_costs_cq_nq = pd.DataFrame( + [("CQ-NQ", "CQ-NQ Option 1", 1_000_000, 1_010_000)], + columns=_FP_AUG_COST_COLS, + ) + rez_aug_options_nsw = pd.DataFrame( + [("N3", "Option 1", 1500, 1500)], + columns=_REZ_AUG_OPTION_COLS, + ) + rez_aug_costs_nsw = pd.DataFrame( + [("N3", "Option 1", 750_000, 760_000)], + columns=_REZ_AUG_COST_COLS, + ) with patch( "ispypsa.templater.create_template.FEATURE_FLAGS", @@ -267,6 +340,10 @@ def test_create_ispypsa_inputs_template_new_format_single_region(csv_str_to_df): "renewable_energy_zones": renewable_energy_zones, "flow_path_transfer_capability": flow_path_transfer_capability, "initial_transmission_limits": initial_transmission_limits, + "flow_path_augmentation_options_CQ-NQ": flow_path_aug_options_cq_nq, + "flow_path_augmentation_costs_step_change_CQ-NQ": flow_path_aug_costs_cq_nq, + "rez_augmentation_options_NSW": rez_aug_options_nsw, + "rez_augmentation_costs_step_change_NSW": rez_aug_costs_nsw, }, manually_extracted_tables={}, ) @@ -284,3 +361,15 @@ def test_create_ispypsa_inputs_template_new_format_single_region(csv_str_to_df): assert set(limits.columns) == {"path_id", "direction", "timeslice", "capacity"} # Q1-NEM: 6 rows. N3-NEM: 1 collapsed row. assert len(limits) == 7 + + expansion_options = result["network_expansion_options"] + # CQ-NQ augmentation dropped entirely (no flow paths exist at single_region). + # N3 REZ augmentation flows through with expansion_id = N3-NEM, emitting + # forward + reverse rows. + assert set(expansion_options["expansion_id"]) == {"N3-NEM"} + assert len(expansion_options) == 2 + + expansion_costs = result["network_transmission_path_expansion_costs"] + assert set(expansion_costs["expansion_id"]) == {"N3-NEM"} + # 1 expansion_id x 2 years + assert len(expansion_costs) == 2 diff --git a/tests/test_templater/test_network_expansion.py b/tests/test_templater/test_network_expansion.py index 73f570af..d4848fc8 100644 --- a/tests/test_templater/test_network_expansion.py +++ b/tests/test_templater/test_network_expansion.py @@ -6,8 +6,10 @@ _FLOW_PATH_FORWARD_MW_COL, _FLOW_PATH_REVERSE_MW_COL, _align_option_names_to_options, + _filter_flow_path_augmentations_to_granularity, _first_year_with_complete_costs_per_expansion, _new_parallel_path_rows, + _rekey_augmentation_path_to_region, _template_network_expansion, ) @@ -562,3 +564,104 @@ def test_template_network_expansion_rez_only_flow_paths_empty(csv_str_to_df): check_dtype=False, rtol=1e-5, ) + + +# --- Granularity-aware filtering --- + + +_REGION_LOOKUP = { + "CQ": "QLD", + "NQ": "QLD", + "SQ": "QLD", + "NNSW": "NSW", + "CNSW": "NSW", + "SNW": "NSW", +} + + +def test_rekey_augmentation_path_drops_intra_region(): + assert _rekey_augmentation_path_to_region("CQ-NQ", _REGION_LOOKUP) is None + assert _rekey_augmentation_path_to_region("CNSW-SNW", _REGION_LOOKUP) is None + + +def test_rekey_augmentation_path_remaps_cross_region(): + assert _rekey_augmentation_path_to_region("NNSW-SQ", _REGION_LOOKUP) == "NSW-QLD" + + +def test_rekey_augmentation_path_preserves_suffix(): + assert ( + _rekey_augmentation_path_to_region("NNSW-SQ_Terranora", _REGION_LOOKUP) + == "NSW-QLD_Terranora" + ) + + +def test_filter_flow_path_augmentations_sub_regions_returns_input_unchanged(): + augmentations = { + "CQ-NQ": _fp_options([("CQ-NQ", "Option 1", 1000, 1000)]), + "NNSW-SQ": _fp_options([("NNSW-SQ", "Option 1", 950, 1450)]), + } + + result = _filter_flow_path_augmentations_to_granularity( + augmentations, "sub_regions", _REGION_LOOKUP + ) + + assert result is augmentations + + +def test_filter_flow_path_augmentations_single_region_returns_empty(): + augmentations = { + "CQ-NQ": _fp_options([("CQ-NQ", "Option 1", 1000, 1000)]), + "NNSW-SQ": _fp_options([("NNSW-SQ", "Option 1", 950, 1450)]), + } + + result = _filter_flow_path_augmentations_to_granularity( + augmentations, "single_region", _REGION_LOOKUP + ) + + assert result == {} + + +def test_filter_flow_path_augmentations_nem_regions_drops_intra_and_rekeys_cross(): + augmentations = { + "CQ-NQ": _fp_options([("CQ-NQ", "Option 1", 1000, 1000)]), + "NNSW-SQ": _fp_options([("NNSW-SQ", "Option 1", 950, 1450)]), + "NNSW-SQ_Terranora": _fp_options([("NNSW-SQ_Terranora", "Option 1", 200, 250)]), + } + + result = _filter_flow_path_augmentations_to_granularity( + augmentations, "nem_regions", _REGION_LOOKUP + ) + + assert set(result.keys()) == {"NSW-QLD", "NSW-QLD_Terranora"} + assert (result["NSW-QLD"]["Flow path"] == "NSW-QLD").all() + assert (result["NSW-QLD_Terranora"]["Flow path"] == "NSW-QLD_Terranora").all() + + +def test_filter_flow_path_augmentations_nem_regions_handles_costs_frames(): + augmentations = { + "NNSW-SQ": _fp_costs( + [("NNSW-SQ", "Option 1", 1_000_000, 1_010_000)], + years=["2024-25", "2025-26"], + ), + } + + result = _filter_flow_path_augmentations_to_granularity( + augmentations, "nem_regions", _REGION_LOOKUP + ) + + assert set(result.keys()) == {"NSW-QLD"} + assert (result["NSW-QLD"]["Flow path"] == "NSW-QLD").all() + # Cost columns survive the rewrite untouched. + assert result["NSW-QLD"].loc[0, "2024-25"] == 1_000_000 + + +def test_filter_flow_path_augmentations_does_not_mutate_input_frames(): + augmentations = { + "NNSW-SQ": _fp_options([("NNSW-SQ", "Option 1", 950, 1450)]), + } + + _filter_flow_path_augmentations_to_granularity( + augmentations, "nem_regions", _REGION_LOOKUP + ) + + assert (augmentations["NNSW-SQ"]["Flow path"] == "NNSW-SQ").all() From a4e6b85850941bb6011d633e959dacec80a151e7 Mon Sep 17 00:00:00 2001 From: nick-gorman Date: Tue, 5 May 2026 11:40:36 +1000 Subject: [PATCH 03/14] Bring test_network_expansion.py in line with the testing convention MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Audited the file against the CLAUDE.md rules that landed on new-format-network-tables and applied the same treatment we did to the transmission tests: full-DataFrame assertions instead of row-count / set membership / iloc / pd.isna probes, full log lines instead of marker + per-name any() checks, and csv_str_to_df for empty expected outputs. Also dropped four of the five DataFrame-builder helpers (_fp_costs, _rez_options, _rez_costs, _paths_table) — they hid only short, non-private column lists, and inlining via csv_str_to_df reads more consistently with the rest of the file. _fp_options is kept because its column list pulls in two private constants from the source module that csv_str_to_df can't reference; a file-level docstring records the rationale. While reviewing test_first_year_with_complete_costs_warns_..., the source warning was too terse ("No year with complete costs for 'X'; skipping.") to be useful in a real run. Replaced with a message that names the failure mode and the likely cause. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/ispypsa/templater/network_expansion.py | 3 +- .../test_templater/test_network_expansion.py | 432 +++++++++++------- 2 files changed, 260 insertions(+), 175 deletions(-) diff --git a/src/ispypsa/templater/network_expansion.py b/src/ispypsa/templater/network_expansion.py index da5f8fe0..2fed18f3 100644 --- a/src/ispypsa/templater/network_expansion.py +++ b/src/ispypsa/templater/network_expansion.py @@ -805,7 +805,8 @@ def _first_year_with_complete_costs_per_expansion(costs: pd.DataFrame) -> pd.Dat year = _earliest_complete_year(group) if year is None: logging.warning( - f"No year with complete costs for '{expansion_id}'; skipping." + f"No year has costs for all options of expansion '{expansion_id}'; " + "dropping the expansion. Likely indicates gaps in the upstream cost table." ) continue selected.append(group.loc[group["year"] == year]) diff --git a/tests/test_templater/test_network_expansion.py b/tests/test_templater/test_network_expansion.py index d4848fc8..6e9ff657 100644 --- a/tests/test_templater/test_network_expansion.py +++ b/tests/test_templater/test_network_expansion.py @@ -1,3 +1,12 @@ +"""Tests for the network_expansion templater. + +Inputs and expected outputs are built with the ``csv_str_to_df`` fixture. The one +exception is ``_fp_options``: flow-path option tables carry two long IASR column +names that live as private constants in the source module +(``_FLOW_PATH_FORWARD_MW_COL`` and ``_FLOW_PATH_REVERSE_MW_COL``), so a small helper +keeps the column list out of every test body. +""" + import logging import pandas as pd @@ -25,31 +34,6 @@ def _fp_options(rows: list[tuple]) -> pd.DataFrame: return pd.DataFrame(rows, columns=_FP_OPT_COLS) -def _fp_costs(rows: list[tuple], years: list[str]) -> pd.DataFrame: - return pd.DataFrame(rows, columns=["Flow path", "Option"] + years) - - -def _rez_options(rows: list[tuple]) -> pd.DataFrame: - return pd.DataFrame( - rows, - columns=[ - "REZ / constraint ID", - "Option", - "Additional network capacity (MW)", - "Additional import capacity (MW)", - ], - ) - - -def _rez_costs(rows: list[tuple], years: list[str]) -> pd.DataFrame: - return pd.DataFrame(rows, columns=["REZ / Constraint ID", "Option"] + years) - - -def _paths_table(rows: list[tuple]) -> pd.DataFrame: - """Build a minimal network_transmission_paths frame. Rows are (path_id, geo_from).""" - return pd.DataFrame(rows, columns=["path_id", "geo_from"]) - - def test_template_network_expansion_picks_least_cost_and_splits_directions( csv_str_to_df, ): @@ -64,28 +48,29 @@ def test_template_network_expansion_picks_least_cost_and_splits_directions( ), } flow_path_costs = { - "CQ-NQ": _fp_costs( - [ - ("CQ-NQ", "CQ-NQ Option 1", 1_000_000, 1_010_000), - ("CQ-NQ", "CQ-NQ Option 2", 200_000, 205_000), - ], - years=["2024-25", "2025-26"], - ), + "CQ-NQ": csv_str_to_df(""" + Flow path, Option, 2024-25, 2025-26 + CQ-NQ, CQ-NQ Option 1, 1000000, 1010000 + CQ-NQ, CQ-NQ Option 2, 200000, 205000 + """), } rez_options = { - "NSW": _rez_options( - [ - ("N1", "Option 1", 1660, 1660), - ] - ), + "NSW": csv_str_to_df(""" + REZ / constraint ID, Option, Additional network capacity (MW), Additional import capacity (MW) + N1, Option 1, 1660, 1660 + """), } rez_costs = { - "NSW": _rez_costs( - [("N1", "Option 1", 5_000_000, 5_100_000)], - years=["2024-25", "2025-26"], - ), + "NSW": csv_str_to_df(""" + REZ / Constraint ID, Option, 2024-25, 2025-26 + N1, Option 1, 5000000, 5100000 + """), } - network_transmission_paths = _paths_table([("N1-NNSW", "N1"), ("CQ-NQ", "CQ")]) + network_transmission_paths = csv_str_to_df(""" + path_id, geo_from + N1-NNSW, N1 + CQ-NQ, CQ + """) options, costs = _template_network_expansion( flow_path_options=flow_path_options, @@ -111,13 +96,14 @@ def test_template_network_expansion_picks_least_cost_and_splits_directions( check_dtype=False, ) - # cost_per_mw: CQ-NQ uses max(500, 400) = 500; N1 uses max(1660, 1660) = 1660 + # cost_per_mw: CQ-NQ uses max(500, 400) = 500MW → $200k/500 = 400, $205k/500 = 410. + # N1 uses max(1660, 1660) = 1660MW → $5M/1660 ≈ 3012.05, $5.1M/1660 ≈ 3072.29. expected_costs = csv_str_to_df(""" expansion_id, year, cost CQ-NQ, 2025, 400.0 CQ-NQ, 2026, 410.0 - N1-NNSW, 2025, 3012.048192771084 - N1-NNSW, 2026, 3072.289156626506 + N1-NNSW, 2025, 3012.05 + N1-NNSW, 2026, 3072.29 """) pd.testing.assert_frame_equal( costs.sort_values(["expansion_id", "year"]).reset_index(drop=True), @@ -143,17 +129,18 @@ def test_template_network_expansion_skips_non_numeric_capacity(csv_str_to_df): ), } flow_path_costs = { - "CQ-NQ": _fp_costs( - [ - ("CQ-NQ", "CQ-NQ Option 1", 1_000_000, 1_010_000), - ("CQ-NQ", "CQ-NQ Option 2", 500_000, 505_000), - ], - years=["2024-25", "2025-26"], - ), + "CQ-NQ": csv_str_to_df(""" + Flow path, Option, 2024-25, 2025-26 + CQ-NQ, CQ-NQ Option 1, 1000000, 1010000 + CQ-NQ, CQ-NQ Option 2, 500000, 505000 + """), } - rez_options = {"NSW": _rez_options([])} - rez_costs = {"NSW": _rez_costs([], years=["2024-25", "2025-26"])} - network_transmission_paths = _paths_table([("CQ-NQ", "CQ")]) + rez_options = {} + rez_costs = {} + network_transmission_paths = csv_str_to_df(""" + path_id, geo_from + CQ-NQ, CQ + """) options, costs = _template_network_expansion( flow_path_options=flow_path_options, @@ -188,14 +175,17 @@ def test_template_network_expansion_fuzzy_matches_em_dash_option_names(csv_str_t ), } flow_path_costs = { - "NNSW-SQ": _fp_costs( - [("NNSW-SQ", "NNSW–SQ Option 1", 500_000, 505_000)], # em-dash - years=["2024-25", "2025-26"], - ), + "NNSW-SQ": csv_str_to_df(""" + Flow path, Option, 2024-25, 2025-26 + NNSW-SQ, NNSW–SQ Option 1, 500000, 505000 + """), # em-dash in option name } - rez_options = {"NSW": _rez_options([])} - rez_costs = {"NSW": _rez_costs([], years=["2024-25", "2025-26"])} - network_transmission_paths = _paths_table([("NNSW-SQ", "NNSW")]) + rez_options = {} + rez_costs = {} + network_transmission_paths = csv_str_to_df(""" + path_id, geo_from + NNSW-SQ, NNSW + """) options, costs = _template_network_expansion( flow_path_options=flow_path_options, @@ -259,16 +249,21 @@ def test_new_parallel_path_rows_picks_up_keys_without_existing_path(csv_str_to_d check_dtype=False, ) # 6 zero-capacity rows: 2 directions x 3 timeslices. - assert list(new_limits.columns) == ["path_id", "direction", "timeslice", "capacity"] - assert len(new_limits) == 6 - assert (new_limits["path_id"] == "CNSW-SNW").all() - assert (new_limits["capacity"] == 0.0).all() - assert set(new_limits["direction"]) == {"forward", "reverse"} - assert set(new_limits["timeslice"]) == { - "peak_demand", - "summer_typical", - "winter_reference", - } + expected_limits = csv_str_to_df(""" + path_id, direction, timeslice, capacity + CNSW-SNW, forward, peak_demand, 0 + CNSW-SNW, forward, summer_typical, 0 + CNSW-SNW, forward, winter_reference, 0 + CNSW-SNW, reverse, peak_demand, 0 + CNSW-SNW, reverse, summer_typical, 0 + CNSW-SNW, reverse, winter_reference, 0 + """) + pd.testing.assert_frame_equal( + new_limits.sort_values(["direction", "timeslice"]).reset_index(drop=True), + expected_limits.sort_values(["direction", "timeslice"]).reset_index(drop=True), + check_exact=False, + check_dtype=False, + ) def test_template_network_expansion_treats_blank_path_direction_as_zero(csv_str_to_df): @@ -278,19 +273,21 @@ def test_template_network_expansion_treats_blank_path_direction_as_zero(csv_str_ flow_path_options = {} flow_path_costs = {} rez_options = { - "NSW": _rez_options( - [ - ("DN1", "Option 1", 500, None), - ] - ), + "NSW": csv_str_to_df(""" + REZ / constraint ID, Option, Additional network capacity (MW), Additional import capacity (MW) + DN1, Option 1, 500, + """), } rez_costs = { - "NSW": _rez_costs( - [("DN1", "Option 1", 1_000_000, 1_010_000)], - years=["2024-25", "2025-26"], - ), + "NSW": csv_str_to_df(""" + REZ / Constraint ID, Option, 2024-25, 2025-26 + DN1, Option 1, 1000000, 1010000 + """), } - network_transmission_paths = _paths_table([("DN1-CNSW", "DN1")]) + network_transmission_paths = csv_str_to_df(""" + path_id, geo_from + DN1-CNSW, DN1 + """) options, _ = _template_network_expansion( flow_path_options=flow_path_options, @@ -321,24 +318,24 @@ def test_template_network_expansion_passes_constraint_group_ids_through(csv_str_ flow_path_options = {} flow_path_costs = {} rez_options = { - "QLD": _rez_options( - [ - ("SWQLD1", "Option 1", 150, None), - ("SWQLD1", "Option 2", 330, None), - ] - ), + "QLD": csv_str_to_df(""" + REZ / constraint ID, Option, Additional network capacity (MW), Additional import capacity (MW) + SWQLD1, Option 1, 150, + SWQLD1, Option 2, 330, + """), } rez_costs = { - "QLD": _rez_costs( - [ - ("SWQLD1", "Option 1", 500_000, 505_000), - ("SWQLD1", "Option 2", 800_000, 810_000), - ], - years=["2024-25", "2025-26"], - ), + "QLD": csv_str_to_df(""" + REZ / Constraint ID, Option, 2024-25, 2025-26 + SWQLD1, Option 1, 500000, 505000 + SWQLD1, Option 2, 800000, 810000 + """), } # network_transmission_paths does NOT include SWQLD1 (only the Q1 REZ connection). - network_transmission_paths = _paths_table([("Q1-NQ", "Q1")]) + network_transmission_paths = csv_str_to_df(""" + path_id, geo_from + Q1-NQ, Q1 + """) options, costs = _template_network_expansion( flow_path_options=flow_path_options, @@ -363,8 +360,8 @@ def test_template_network_expansion_passes_constraint_group_ids_through(csv_str_ expected_costs = csv_str_to_df(""" expansion_id, year, cost - SWQLD1, 2025, 2424.242424242424 - SWQLD1, 2026, 2454.545454545454 + SWQLD1, 2025, 2424.24 + SWQLD1, 2026, 2454.55 """) pd.testing.assert_frame_equal( costs.sort_values(["expansion_id", "year"]).reset_index(drop=True), @@ -374,24 +371,34 @@ def test_template_network_expansion_passes_constraint_group_ids_through(csv_str_ ) -def test_template_network_expansion_empty_inputs_produce_empty_outputs(): +def test_template_network_expansion_empty_inputs_produce_empty_outputs(csv_str_to_df): options, costs = _template_network_expansion( flow_path_options={}, flow_path_costs={}, rez_options={}, rez_costs={}, - network_transmission_paths=_paths_table([]), + network_transmission_paths=csv_str_to_df(""" + path_id, geo_from + """), ) - assert list(options.columns) == [ - "expansion_id", - "expansion_type", - "allowed_expansion", - "expansion_option", - ] - assert list(costs.columns) == ["expansion_id", "year", "cost"] - assert len(options) == 0 - assert len(costs) == 0 + expected_options = csv_str_to_df(""" + expansion_id, expansion_type, allowed_expansion, expansion_option + """) + pd.testing.assert_frame_equal( + options.reset_index(drop=True), + expected_options.reset_index(drop=True), + check_dtype=False, + ) + + expected_costs = csv_str_to_df(""" + expansion_id, year, cost + """) + pd.testing.assert_frame_equal( + costs.reset_index(drop=True), + expected_costs.reset_index(drop=True), + check_dtype=False, + ) def test_template_network_expansion_flow_paths_only_rez_empty(csv_str_to_df): @@ -400,10 +407,10 @@ def test_template_network_expansion_flow_paths_only_rez_empty(csv_str_to_df): "CQ-NQ": _fp_options([("CQ-NQ", "CQ-NQ Option 1", 1000, 1200)]), } flow_path_costs = { - "CQ-NQ": _fp_costs( - [("CQ-NQ", "CQ-NQ Option 1", 600_000, 612_000)], - years=["2024-25", "2025-26"], - ), + "CQ-NQ": csv_str_to_df(""" + Flow path, Option, 2024-25, 2025-26 + CQ-NQ, CQ-NQ Option 1, 600000, 612000 + """), } options, costs = _template_network_expansion( @@ -411,7 +418,10 @@ def test_template_network_expansion_flow_paths_only_rez_empty(csv_str_to_df): flow_path_costs=flow_path_costs, rez_options={}, rez_costs={}, - network_transmission_paths=_paths_table([("CQ-NQ", "CQ")]), + network_transmission_paths=csv_str_to_df(""" + path_id, geo_from + CQ-NQ, CQ + """), ) expected_options = csv_str_to_df(""" @@ -440,54 +450,76 @@ def test_template_network_expansion_flow_paths_only_rez_empty(csv_str_to_df): ) -def test_align_option_names_warns_when_costs_have_no_matching_options(caplog): +def test_align_option_names_warns_when_costs_have_no_matching_options( + csv_str_to_df, caplog +): # Costs contain an expansion_id that has no corresponding options rows (e.g. because # all options were dropped for non-numeric capacity upstream, or because the upstream # options table is missing). The orphaned cost rows should be dropped with a warning. - options = pd.DataFrame( - { - "expansion_id": ["CQ-NQ"], - "option_name": ["Option 1"], - } - ) - costs = pd.DataFrame( - { - "expansion_id": ["CQ-NQ", "SWNSW1", "SWNSW1"], - "option_name": ["Option 1", "Option 1", "Option 1"], - "year": [2025, 2025, 2026], - "cost": [500_000, 1_000_000, 1_020_000], - } - ) + options = csv_str_to_df(""" + expansion_id, option_name + CQ-NQ, Option 1 + """) + costs = csv_str_to_df(""" + expansion_id, option_name, year, cost + CQ-NQ, Option 1, 2025, 500000 + SWNSW1, Option 1, 2025, 1000000 + SWNSW1, Option 1, 2026, 1020000 + """) with caplog.at_level(logging.WARNING): result = _align_option_names_to_options(costs, options) - assert set(result["expansion_id"]) == {"CQ-NQ"} - assert any( - "SWNSW1" in r.message and "orphaned" in r.message for r in caplog.records + expected = csv_str_to_df(""" + expansion_id, option_name, year, cost + CQ-NQ, Option 1, 2025, 500000 + """) + pd.testing.assert_frame_equal( + result.reset_index(drop=True), + expected.reset_index(drop=True), + check_dtype=False, ) + assert ( + "No options for expansion_id 'SWNSW1'; dropping 2 orphaned cost row(s). " + "Expected when all options for the expansion_id were dropped for " + "non-numeric capacity; otherwise indicates the upstream options " + "table is missing for this id." + ) in caplog.text + -def test_first_year_with_complete_costs_warns_and_skips_when_no_complete_year(caplog): +def test_first_year_with_complete_costs_warns_and_skips_when_no_complete_year( + csv_str_to_df, caplog +): # Two options for one expansion, but every year is missing one option's cost — # no year is "complete", so the expansion is dropped with a warning. - costs = pd.DataFrame( - { - "expansion_id": ["CQ-NQ", "CQ-NQ"], - "option_name": ["Option 1", "Option 2"], - "year": [2025, 2026], - "cost": [500_000, 600_000], - } - ) + costs = csv_str_to_df(""" + expansion_id, option_name, year, cost + CQ-NQ, Option 1, 2025, 500000 + CQ-NQ, Option 2, 2026, 600000 + """) with caplog.at_level(logging.WARNING): result = _first_year_with_complete_costs_per_expansion(costs) - assert len(result) == 0 - assert any("CQ-NQ" in r.message for r in caplog.records) + expected = csv_str_to_df(""" + expansion_id, option_name, year, cost + """) + pd.testing.assert_frame_equal( + result.reset_index(drop=True), + expected.reset_index(drop=True), + check_dtype=False, + ) + + assert ( + "No year has costs for all options of expansion 'CQ-NQ'; " + "dropping the expansion. Likely indicates gaps in the upstream cost table." + ) in caplog.text -def test_template_network_expansion_drops_expansion_with_no_complete_year(caplog): +def test_template_network_expansion_drops_expansion_with_no_complete_year( + csv_str_to_df, caplog +): # End-to-end: an expansion with no complete-cost year produces no rows in either output. flow_path_options = { "CQ-NQ": _fp_options( @@ -497,15 +529,13 @@ def test_template_network_expansion_drops_expansion_with_no_complete_year(caplog ] ), } + # Each option has a cost in a different year; no year covers both. flow_path_costs = { - "CQ-NQ": _fp_costs( - # Each option has a cost in a different year; no year covers both. - [ - ("CQ-NQ", "CQ-NQ Option 1", 500_000, None), - ("CQ-NQ", "CQ-NQ Option 2", None, 600_000), - ], - years=["2024-25", "2025-26"], - ), + "CQ-NQ": csv_str_to_df(""" + Flow path, Option, 2024-25, 2025-26 + CQ-NQ, CQ-NQ Option 1, 500000, + CQ-NQ, CQ-NQ Option 2, , 600000 + """), } with caplog.at_level(logging.WARNING): @@ -514,22 +544,49 @@ def test_template_network_expansion_drops_expansion_with_no_complete_year(caplog flow_path_costs=flow_path_costs, rez_options={}, rez_costs={}, - network_transmission_paths=_paths_table([("CQ-NQ", "CQ")]), + network_transmission_paths=csv_str_to_df(""" + path_id, geo_from + CQ-NQ, CQ + """), ) - assert len(options) == 0 - assert len(costs) == 0 - assert any("CQ-NQ" in r.message for r in caplog.records) + expected_options = csv_str_to_df(""" + expansion_id, expansion_type, allowed_expansion, expansion_option + """) + pd.testing.assert_frame_equal( + options.reset_index(drop=True), + expected_options.reset_index(drop=True), + check_dtype=False, + ) + + expected_costs = csv_str_to_df(""" + expansion_id, year, cost + """) + pd.testing.assert_frame_equal( + costs.reset_index(drop=True), + expected_costs.reset_index(drop=True), + check_dtype=False, + ) + + assert ( + "No year has costs for all options of expansion 'CQ-NQ'; " + "dropping the expansion. Likely indicates gaps in the upstream cost table." + ) in caplog.text def test_template_network_expansion_rez_only_flow_paths_empty(csv_str_to_df): # REZ inputs populated, flow paths empty — only REZ-derived rows emitted. - rez_options = {"NSW": _rez_options([("N1", "Option 1", 1660, 1660)])} + rez_options = { + "NSW": csv_str_to_df(""" + REZ / constraint ID, Option, Additional network capacity (MW), Additional import capacity (MW) + N1, Option 1, 1660, 1660 + """), + } rez_costs = { - "NSW": _rez_costs( - [("N1", "Option 1", 5_000_000, 5_100_000)], - years=["2024-25", "2025-26"], - ), + "NSW": csv_str_to_df(""" + REZ / Constraint ID, Option, 2024-25, 2025-26 + N1, Option 1, 5000000, 5100000 + """), } options, costs = _template_network_expansion( @@ -537,7 +594,10 @@ def test_template_network_expansion_rez_only_flow_paths_empty(csv_str_to_df): flow_path_costs={}, rez_options=rez_options, rez_costs=rez_costs, - network_transmission_paths=_paths_table([("N1-NNSW", "N1")]), + network_transmission_paths=csv_str_to_df(""" + path_id, geo_from + N1-NNSW, N1 + """), ) expected_options = csv_str_to_df(""" @@ -553,10 +613,11 @@ def test_template_network_expansion_rez_only_flow_paths_empty(csv_str_to_df): check_dtype=False, ) + # cost_per_mw: $5M / 1660MW ≈ 3012.05; $5.1M / 1660MW ≈ 3072.29. expected_costs = csv_str_to_df(""" expansion_id, year, cost - N1-NNSW, 2025, 3012.048192771084 - N1-NNSW, 2026, 3072.289156626506 + N1-NNSW, 2025, 3012.05 + N1-NNSW, 2026, 3072.29 """) pd.testing.assert_frame_equal( costs.sort_values(["expansion_id", "year"]).reset_index(drop=True), @@ -633,16 +694,30 @@ def test_filter_flow_path_augmentations_nem_regions_drops_intra_and_rekeys_cross ) assert set(result.keys()) == {"NSW-QLD", "NSW-QLD_Terranora"} - assert (result["NSW-QLD"]["Flow path"] == "NSW-QLD").all() - assert (result["NSW-QLD_Terranora"]["Flow path"] == "NSW-QLD_Terranora").all() + expected_nsw_qld = _fp_options([("NSW-QLD", "Option 1", 950, 1450)]) + pd.testing.assert_frame_equal( + result["NSW-QLD"].reset_index(drop=True), + expected_nsw_qld.reset_index(drop=True), + check_dtype=False, + ) -def test_filter_flow_path_augmentations_nem_regions_handles_costs_frames(): + expected_terranora = _fp_options([("NSW-QLD_Terranora", "Option 1", 200, 250)]) + pd.testing.assert_frame_equal( + result["NSW-QLD_Terranora"].reset_index(drop=True), + expected_terranora.reset_index(drop=True), + check_dtype=False, + ) + + +def test_filter_flow_path_augmentations_nem_regions_handles_costs_frames( + csv_str_to_df, +): augmentations = { - "NNSW-SQ": _fp_costs( - [("NNSW-SQ", "Option 1", 1_000_000, 1_010_000)], - years=["2024-25", "2025-26"], - ), + "NNSW-SQ": csv_str_to_df(""" + Flow path, Option, 2024-25, 2025-26 + NNSW-SQ, Option 1, 1000000, 1010000 + """), } result = _filter_flow_path_augmentations_to_granularity( @@ -650,18 +725,27 @@ def test_filter_flow_path_augmentations_nem_regions_handles_costs_frames(): ) assert set(result.keys()) == {"NSW-QLD"} - assert (result["NSW-QLD"]["Flow path"] == "NSW-QLD").all() + # Cost columns survive the rewrite untouched. - assert result["NSW-QLD"].loc[0, "2024-25"] == 1_000_000 + expected = csv_str_to_df(""" + Flow path, Option, 2024-25, 2025-26 + NSW-QLD, Option 1, 1000000, 1010000 + """) + pd.testing.assert_frame_equal( + result["NSW-QLD"].reset_index(drop=True), + expected.reset_index(drop=True), + check_dtype=False, + ) def test_filter_flow_path_augmentations_does_not_mutate_input_frames(): augmentations = { "NNSW-SQ": _fp_options([("NNSW-SQ", "Option 1", 950, 1450)]), } + snapshot = augmentations["NNSW-SQ"].copy() _filter_flow_path_augmentations_to_granularity( augmentations, "nem_regions", _REGION_LOOKUP ) - assert (augmentations["NNSW-SQ"]["Flow path"] == "NNSW-SQ").all() + pd.testing.assert_frame_equal(augmentations["NNSW-SQ"], snapshot) From bfdab3f7b62b3bcb0c4596ae2227eb655c556dfd Mon Sep 17 00:00:00 2001 From: nick-gorman Date: Tue, 5 May 2026 12:23:12 +1000 Subject: [PATCH 04/14] Bring create_ispypsa_inputs_template integration tests in line MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same audit pass as the test_network_expansion.py cleanup, applied to the three new-format integration tests: - Drop redundant `assert "..." in result` lines from _new_format; the immediately-following `result["..."]` access raises KeyError with the same diagnostic and is consistent with the other two integration tests. - Drop three module-level column constants (_FP_AUG_COST_COLS, _REZ_AUG_OPTION_COLS, _REZ_AUG_COST_COLS) and the pd.DataFrame([(...)], columns=...) input pattern that depended on them; inline as csv_str_to_df instead. Keep _FP_AUG_OPTION_COLS, which still pulls two private constants from the source module. Left the `set(expansion["expansion_id"]) == {...}` content checks in the nem_regions and single_region integration tests in place: they pin the intersection of granularity, REZ remapping, and augmentation filtering at the orchestrator level — worth the slight maintenance cost over the strict "presence + columns + row count" rule. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../test_create_ispypsa_inputs_template.py | 93 ++++++++----------- 1 file changed, 40 insertions(+), 53 deletions(-) diff --git a/tests/test_templater/test_create_ispypsa_inputs_template.py b/tests/test_templater/test_create_ispypsa_inputs_template.py index fdcea6e9..28f5ce6f 100644 --- a/tests/test_templater/test_create_ispypsa_inputs_template.py +++ b/tests/test_templater/test_create_ispypsa_inputs_template.py @@ -21,14 +21,6 @@ _FLOW_PATH_FORWARD_MW_COL, _FLOW_PATH_REVERSE_MW_COL, ] -_FP_AUG_COST_COLS = ["Flow path", "Option", "2024-25", "2025-26"] -_REZ_AUG_OPTION_COLS = [ - "REZ / constraint ID", - "Option", - "Additional network capacity (MW)", - "Additional import capacity (MW)", -] -_REZ_AUG_COST_COLS = ["REZ / Constraint ID", "Option", "2024-25", "2025-26"] def test_create_ispypsa_inputs_template_sub_regions( @@ -121,18 +113,18 @@ def test_create_ispypsa_inputs_template_new_format(csv_str_to_df): [("CQ-NQ", "CQ-NQ Option 1", 1000, 1000)], columns=_FP_AUG_OPTION_COLS, ) - flow_path_aug_costs_cq_nq = pd.DataFrame( - [("CQ-NQ", "CQ-NQ Option 1", 1_000_000, 1_010_000)], - columns=_FP_AUG_COST_COLS, - ) - rez_aug_options_nsw = pd.DataFrame( - [("N3", "Option 1", 1500, 1500)], - columns=_REZ_AUG_OPTION_COLS, - ) - rez_aug_costs_nsw = pd.DataFrame( - [("N3", "Option 1", 750_000, 760_000)], - columns=_REZ_AUG_COST_COLS, - ) + flow_path_aug_costs_cq_nq = csv_str_to_df(""" + Flow path, Option, 2024-25, 2025-26 + CQ-NQ, CQ-NQ Option 1, 1000000, 1010000 + """) + rez_aug_options_nsw = csv_str_to_df(""" + REZ / constraint ID, Option, Additional network capacity (MW), Additional import capacity (MW) + N3, Option 1, 1500, 1500 + """) + rez_aug_costs_nsw = csv_str_to_df(""" + REZ / Constraint ID, Option, 2024-25, 2025-26 + N3, Option 1, 750000, 760000 + """) with patch( "ispypsa.templater.create_template.FEATURE_FLAGS", @@ -154,24 +146,20 @@ def test_create_ispypsa_inputs_template_new_format(csv_str_to_df): manually_extracted_tables={}, ) - assert "network_geography" in result geography = result["network_geography"] assert set(geography.columns) == {"geo_id", "geo_type", "region_id", "subregion_id"} assert len(geography) == 4 # 2 subregions + 2 REZs - assert "network_transmission_paths" in result paths = result["network_transmission_paths"] assert set(paths.columns) == {"path_id", "geo_from", "geo_to", "carrier"} assert len(paths) == 3 # 1 flow path + 2 REZ connections - assert "network_transmission_path_limits" in result limits = result["network_transmission_path_limits"] assert set(limits.columns) == {"path_id", "direction", "timeslice", "capacity"} # CQ-NQ: 6 (2 directions x 3 timeslices). Q1-NQ: 6 (REZ mirrored to both directions). # N3-CNSW: 1 (absent from initial_transmission_limits, collapsed). assert len(limits) == 13 - assert "network_expansion_options" in result expansion_options = result["network_expansion_options"] assert set(expansion_options.columns) == { "expansion_id", @@ -182,7 +170,6 @@ def test_create_ispypsa_inputs_template_new_format(csv_str_to_df): # CQ-NQ + N3-CNSW, each emitted as forward + reverse (both are physical paths). assert len(expansion_options) == 4 - assert "network_transmission_path_expansion_costs" in result expansion_costs = result["network_transmission_path_expansion_costs"] assert set(expansion_costs.columns) == {"expansion_id", "year", "cost"} # 2 expansion_ids x 2 years @@ -223,22 +210,22 @@ def test_create_ispypsa_inputs_template_new_format_nem_regions(csv_str_to_df): [("NNSW-SQ", "NNSW-SQ Option 1", 500, 600)], columns=_FP_AUG_OPTION_COLS, ) - flow_path_aug_costs_cq_nq = pd.DataFrame( - [("CQ-NQ", "CQ-NQ Option 1", 1_000_000, 1_010_000)], - columns=_FP_AUG_COST_COLS, - ) - flow_path_aug_costs_nnsw_sq = pd.DataFrame( - [("NNSW-SQ", "NNSW-SQ Option 1", 600_000, 610_000)], - columns=_FP_AUG_COST_COLS, - ) - rez_aug_options_nsw = pd.DataFrame( - [("N3", "Option 1", 1500, 1500)], - columns=_REZ_AUG_OPTION_COLS, - ) - rez_aug_costs_nsw = pd.DataFrame( - [("N3", "Option 1", 750_000, 760_000)], - columns=_REZ_AUG_COST_COLS, - ) + flow_path_aug_costs_cq_nq = csv_str_to_df(""" + Flow path, Option, 2024-25, 2025-26 + CQ-NQ, CQ-NQ Option 1, 1000000, 1010000 + """) + flow_path_aug_costs_nnsw_sq = csv_str_to_df(""" + Flow path, Option, 2024-25, 2025-26 + NNSW-SQ, NNSW-SQ Option 1, 600000, 610000 + """) + rez_aug_options_nsw = csv_str_to_df(""" + REZ / constraint ID, Option, Additional network capacity (MW), Additional import capacity (MW) + N3, Option 1, 1500, 1500 + """) + rez_aug_costs_nsw = csv_str_to_df(""" + REZ / Constraint ID, Option, 2024-25, 2025-26 + N3, Option 1, 750000, 760000 + """) with patch( "ispypsa.templater.create_template.FEATURE_FLAGS", @@ -315,18 +302,18 @@ def test_create_ispypsa_inputs_template_new_format_single_region(csv_str_to_df): [("CQ-NQ", "CQ-NQ Option 1", 1000, 1000)], columns=_FP_AUG_OPTION_COLS, ) - flow_path_aug_costs_cq_nq = pd.DataFrame( - [("CQ-NQ", "CQ-NQ Option 1", 1_000_000, 1_010_000)], - columns=_FP_AUG_COST_COLS, - ) - rez_aug_options_nsw = pd.DataFrame( - [("N3", "Option 1", 1500, 1500)], - columns=_REZ_AUG_OPTION_COLS, - ) - rez_aug_costs_nsw = pd.DataFrame( - [("N3", "Option 1", 750_000, 760_000)], - columns=_REZ_AUG_COST_COLS, - ) + flow_path_aug_costs_cq_nq = csv_str_to_df(""" + Flow path, Option, 2024-25, 2025-26 + CQ-NQ, CQ-NQ Option 1, 1000000, 1010000 + """) + rez_aug_options_nsw = csv_str_to_df(""" + REZ / constraint ID, Option, Additional network capacity (MW), Additional import capacity (MW) + N3, Option 1, 1500, 1500 + """) + rez_aug_costs_nsw = csv_str_to_df(""" + REZ / Constraint ID, Option, 2024-25, 2025-26 + N3, Option 1, 750000, 760000 + """) with patch( "ispypsa.templater.create_template.FEATURE_FLAGS", From 52de6f522c8634d701d021607568b075071cdf1e Mon Sep 17 00:00:00 2001 From: nick-gorman Date: Tue, 5 May 2026 12:50:10 +1000 Subject: [PATCH 05/14] Cover _new_parallel_path_rows wiring in the new-format integration test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The unit test for _new_parallel_path_rows in test_network_expansion.py exercised the helper's content but no integration test triggered the un-suffixed-corridor branch via create_ispypsa_inputs_template. A refactor that dropped the _append_new_parallel_paths(...) call from create_template.py would have passed all tests. Extend test_create_ispypsa_inputs_template_new_format with two suffixed siblings (CNSW-SNW (NTH), (STH)) in flow_path_transfer_capability plus an un-suffixed CNSW-SNW augmentation. The new `assert "CNSW-SNW" in set(paths["path_id"])` is the load-bearing check — its comment names _append_new_parallel_paths so a regression failure points straight at the broken wiring. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../test_create_ispypsa_inputs_template.py | 56 ++++++++++++++----- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/tests/test_templater/test_create_ispypsa_inputs_template.py b/tests/test_templater/test_create_ispypsa_inputs_template.py index 28f5ce6f..b9049351 100644 --- a/tests/test_templater/test_create_ispypsa_inputs_template.py +++ b/tests/test_templater/test_create_ispypsa_inputs_template.py @@ -89,19 +89,28 @@ def test_create_ispypsa_inputs_template_single_regions( # presence, column schema, and row count: full DataFrame content is exercised by the # per-module templater tests. def test_create_ispypsa_inputs_template_new_format(csv_str_to_df): + # SNW is included alongside NQ and CNSW so the parallel-path scenario below + # (CNSW-SNW corridor) has valid endpoints in the geography. sub_regional_reference_nodes = csv_str_to_df(""" - NEM region, ISP sub-region, Sub-regional reference node - Queensland, Northern Queensland (NQ), Ross 275 kV - New South Wales, Central New South Wales (CNSW), Wellington 330 kV + NEM region, ISP sub-region, Sub-regional reference node + Queensland, Northern Queensland (NQ), Ross 275 kV + New South Wales, Central New South Wales (CNSW), Wellington 330 kV + New South Wales, Southern New South Wales (SNW), Lower Tumut 330 kV """) renewable_energy_zones = csv_str_to_df(""" ID, Name, NEM region, ISP sub-region Q1, Far North QLD, QLD, NQ N3, Central-West Orana, NSW, CNSW """) + # CNSW-SNW (NTH) and CNSW-SNW (STH) are the two existing siblings of the + # CNSW-SNW corridor. The augmentation key CNSW-SNW (un-suffixed) below has + # no exact match here, which triggers _new_parallel_path_rows to inject a + # new path row. flow_path_transfer_capability = csv_str_to_df(""" - Flow Paths, Forward direction capability approximation (MW)_Peak demand, Forward direction capability approximation (MW)_Summer typical, Forward direction capability approximation (MW)_Winter reference, Reverse direction capability approximation (MW)_Peak demand, Reverse direction capability approximation (MW)_Summer typical, Reverse direction capability approximation (MW)_Winter reference - CQ-NQ, 1200, 1200, 1400, 1440, 1440, 1910 + Flow Paths, Forward direction capability approximation (MW)_Peak demand, Forward direction capability approximation (MW)_Summer typical, Forward direction capability approximation (MW)_Winter reference, Reverse direction capability approximation (MW)_Peak demand, Reverse direction capability approximation (MW)_Summer typical, Reverse direction capability approximation (MW)_Winter reference + CQ-NQ, 1200, 1200, 1400, 1440, 1440, 1910 + CNSW-SNW (NTH), 900, 900, 900, 900, 900, 900 + CNSW-SNW (STH), 800, 800, 800, 800, 800, 800 """) initial_transmission_limits = csv_str_to_df(""" REZ ID, REZ transmission network limit_Peak demand, REZ transmission network limit_Summer typical, REZ transmission network limit_Winter reference @@ -117,6 +126,16 @@ def test_create_ispypsa_inputs_template_new_format(csv_str_to_df): Flow path, Option, 2024-25, 2025-26 CQ-NQ, CQ-NQ Option 1, 1000000, 1010000 """) + # Augmentation key CNSW-SNW has no exact match in flow_path_transfer_capability + # — exercises _new_parallel_path_rows end-to-end. + flow_path_aug_options_cnsw_snw = pd.DataFrame( + [("CNSW-SNW", "CNSW-SNW Option 1", 1500, 1500)], + columns=_FP_AUG_OPTION_COLS, + ) + flow_path_aug_costs_cnsw_snw = csv_str_to_df(""" + Flow path, Option, 2024-25, 2025-26 + CNSW-SNW, CNSW-SNW Option 1, 800000, 810000 + """) rez_aug_options_nsw = csv_str_to_df(""" REZ / constraint ID, Option, Additional network capacity (MW), Additional import capacity (MW) N3, Option 1, 1500, 1500 @@ -140,6 +159,8 @@ def test_create_ispypsa_inputs_template_new_format(csv_str_to_df): "initial_transmission_limits": initial_transmission_limits, "flow_path_augmentation_options_CQ-NQ": flow_path_aug_options_cq_nq, "flow_path_augmentation_costs_step_change_CQ-NQ": flow_path_aug_costs_cq_nq, + "flow_path_augmentation_options_CNSW-SNW": flow_path_aug_options_cnsw_snw, + "flow_path_augmentation_costs_step_change_CNSW-SNW": flow_path_aug_costs_cnsw_snw, "rez_augmentation_options_NSW": rez_aug_options_nsw, "rez_augmentation_costs_step_change_NSW": rez_aug_costs_nsw, }, @@ -148,17 +169,24 @@ def test_create_ispypsa_inputs_template_new_format(csv_str_to_df): geography = result["network_geography"] assert set(geography.columns) == {"geo_id", "geo_type", "region_id", "subregion_id"} - assert len(geography) == 4 # 2 subregions + 2 REZs + # 3 subregions (NQ + CNSW + SNW) + 2 REZs. + assert len(geography) == 5 paths = result["network_transmission_paths"] assert set(paths.columns) == {"path_id", "geo_from", "geo_to", "carrier"} - assert len(paths) == 3 # 1 flow path + 2 REZ connections + # CQ-NQ + 2 REZ connections (Q1-NQ, N3-CNSW) + CNSW-SNW_NTH + CNSW-SNW_STH + # + CNSW-SNW (injected by _new_parallel_path_rows). + assert len(paths) == 6 + # Specifically pin the new parallel-path row — a regression in the + # _append_new_parallel_paths wiring would fail this assertion. + assert "CNSW-SNW" in set(paths["path_id"]) limits = result["network_transmission_path_limits"] assert set(limits.columns) == {"path_id", "direction", "timeslice", "capacity"} - # CQ-NQ: 6 (2 directions x 3 timeslices). Q1-NQ: 6 (REZ mirrored to both directions). - # N3-CNSW: 1 (absent from initial_transmission_limits, collapsed). - assert len(limits) == 13 + # 3 flow paths × 6 (CQ-NQ + 2 CNSW-SNW siblings) + Q1-NQ × 6 (REZ mirrored) + # + N3-CNSW × 1 (collapsed, absent from initial_transmission_limits) + # + CNSW-SNW × 6 zero-capacity rows from _new_parallel_path_rows. + assert len(limits) == 31 expansion_options = result["network_expansion_options"] assert set(expansion_options.columns) == { @@ -167,13 +195,13 @@ def test_create_ispypsa_inputs_template_new_format(csv_str_to_df): "allowed_expansion", "expansion_option", } - # CQ-NQ + N3-CNSW, each emitted as forward + reverse (both are physical paths). - assert len(expansion_options) == 4 + # CQ-NQ + N3-CNSW + CNSW-SNW, each emitted as forward + reverse. + assert len(expansion_options) == 6 expansion_costs = result["network_transmission_path_expansion_costs"] assert set(expansion_costs.columns) == {"expansion_id", "year", "cost"} - # 2 expansion_ids x 2 years - assert len(expansion_costs) == 4 + # 3 expansion_ids x 2 years + assert len(expansion_costs) == 6 def test_create_ispypsa_inputs_template_new_format_nem_regions(csv_str_to_df): From ed734c4d5d2add4e5aba1489cd5b53ab3b94f1ce Mon Sep 17 00:00:00 2001 From: nick-gorman Date: Tue, 5 May 2026 13:02:52 +1000 Subject: [PATCH 06/14] Dedupe fuzzy-match log lines MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _log_fuzzy_match emitted one log line per row of the input series, so when callers passed e.g. one cost row per year for the same option name, each name-matching decision was logged N times. In a real run with several years × dozens of expansions, this produced hundreds of redundant lines that masked the actually-distinct decisions. Dedup with sorted(set(zip(...))) so each (original, match) decision appears exactly once. The CLAUDE.md exception that lets fuzzy matching log per-decision (rather than as a summary) is preserved — one line per distinct decision is the audit unit, not one line per row. Sorted output also gives stable ordering across runs. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/ispypsa/templater/helpers.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/ispypsa/templater/helpers.py b/src/ispypsa/templater/helpers.py index ab13e6a7..2c5a20bc 100644 --- a/src/ispypsa/templater/helpers.py +++ b/src/ispypsa/templater/helpers.py @@ -123,11 +123,16 @@ def _one_to_one_priority_based_fuzzy_matching( def _log_fuzzy_match( original_series: pd.Series, matched_series: pd.Series, task_desc: str ) -> None: - """Log any fuzzy matches at the INFO level""" + """Log any fuzzy matches at the INFO level — one line per distinct mapping. + + Callers may pass series with the same (original, match) pair repeated across + rows (e.g. one cost row per year for the same option name). Dedup so each + name-matching decision appears exactly once in the log, regardless of how many + rows shared it. Sorted for stable order across runs. + """ if any(diff := matched_series != original_series): - originals = original_series[diff] - matches = matched_series[diff] - for original, match in zip(originals, matches): + pairs = sorted(set(zip(original_series[diff], matched_series[diff]))) + for original, match in pairs: logging.info(f"'{original}' matched to '{match}' whilst {task_desc}") From 4d99dbcc3e96b4803453f1498c7920f784c51de6 Mon Sep 17 00:00:00 2001 From: nick-gorman Date: Wed, 6 May 2026 13:00:38 +1000 Subject: [PATCH 07/14] Reframe logging rule around repeated firings The previous wording ("aggregate individual row contents into a sorted list") was being read as a blanket rule. The actual concern was redundant firings of one logical event (e.g. once per year per option), not per-decision logs where each line is a distinct audit point. Recast the rule around that, with the existing fuzzy-match log promoted from "exception" to canonical example of the per-decision pattern. Co-Authored-By: Claude Opus 4.7 (1M context) --- CLAUDE.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index f71c4d05..bb39b526 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -125,9 +125,12 @@ are `raise`d, not logged. ### What not to log - The successful happy path inside a helper. -- Individual row contents — aggregate into a `sorted(...)` list and log once. The - fuzzy-match log in `helpers.py` is an exception: it logs each non-exact match - individually so the user can audit name-matching decisions one by one. +- Repeated firings of the same event — when one logical decision (a drop, a fallback, a + fuzzy match) would fire many times because of redundant rows (e.g. once per year per + option), aggregate into a `sorted(...)` list and log once. When each firing is a + *distinct* decision the user may want to audit (one log line per dropped option, one + per fuzzy match), per-row is fine. The fuzzy-match log in `helpers.py` is the + canonical example of the per-row case. - Anything readily inspected from the returned DataFrame. - The same condition at multiple call sites — log once at the source where the cause is visible. From 415ab5575b8220d215380da0610915b417cd35ce Mon Sep 17 00:00:00 2001 From: nick-gorman Date: Wed, 6 May 2026 13:01:17 +1000 Subject: [PATCH 08/14] Tighten transmission/expansion module boundaries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two issues from a code-review pass. The parallel-path append (for augmentation corridors with no matching existing path, e.g. CNSW-SNW alongside CNSW-SNW_NTH/_STH) used to live in create_template.py, where its position in the call sequence was an implicit contract: if reordered, those corridors would silently misclassify as constraint groups in the expansion output. Moved the append into _template_network_transmission so the contract is enforced where the paths are built. Pulled the design rationale (corridor-keyed augmentations, why a synthetic third Link, why explicit zero capacity) into the docstring of _append_new_parallel_paths in its new home. _build_geo_from_to_path_id_map collapsed duplicate geo_from values for subregions, relying on the implicit guarantee that REZ option tables never contain subregion IDs — a hidden precondition. Threaded rez_ids through _template_network_expansion so the map is built from REZ rows only. The collision becomes structurally impossible. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/ispypsa/templater/create_template.py | 18 +- src/ispypsa/templater/network_expansion.py | 161 ++++-------------- src/ispypsa/templater/transmission.py | 155 ++++++++++++++++- .../test_templater/test_network_expansion.py | 53 +----- tests/test_templater/test_transmission.py | 44 +++++ 5 files changed, 240 insertions(+), 191 deletions(-) diff --git a/src/ispypsa/templater/create_template.py b/src/ispypsa/templater/create_template.py index ab00ed2e..e499d19e 100644 --- a/src/ispypsa/templater/create_template.py +++ b/src/ispypsa/templater/create_template.py @@ -19,7 +19,6 @@ ) from ispypsa.templater.geography import _template_network_geography from ispypsa.templater.network_expansion import ( - _append_new_parallel_paths, _extract_flow_path_costs_from_iasr, _extract_flow_path_options_from_iasr, _extract_rez_costs_from_iasr, @@ -151,13 +150,6 @@ def create_ispypsa_inputs_template( iasr_tables["renewable_energy_zones"], regional_granularity, ) - paths, limits = _template_network_transmission( - iasr_tables["flow_path_transfer_capability"], - iasr_tables["initial_transmission_limits"], - iasr_tables["renewable_energy_zones"], - sub_regional_geography, - regional_granularity, - ) region_lookup = dict( zip(sub_regional_geography["geo_id"], sub_regional_geography["region_id"]) ) @@ -171,7 +163,14 @@ def create_ispypsa_inputs_template( regional_granularity, region_lookup, ) - paths, limits = _append_new_parallel_paths(paths, limits, flow_path_options) + paths, limits = _template_network_transmission( + iasr_tables["flow_path_transfer_capability"], + iasr_tables["initial_transmission_limits"], + iasr_tables["renewable_energy_zones"], + sub_regional_geography, + regional_granularity, + flow_path_options, + ) template["network_transmission_paths"] = paths template["network_transmission_path_limits"] = limits expansion_options, expansion_costs = _template_network_expansion( @@ -180,6 +179,7 @@ def create_ispypsa_inputs_template( rez_options=_extract_rez_options_from_iasr(iasr_tables), rez_costs=_extract_rez_costs_from_iasr(iasr_tables, scenario), network_transmission_paths=paths, + rez_ids=set(iasr_tables["renewable_energy_zones"]["ID"]), ) template["network_expansion_options"] = expansion_options template["network_transmission_path_expansion_costs"] = expansion_costs diff --git a/src/ispypsa/templater/network_expansion.py b/src/ispypsa/templater/network_expansion.py index 2fed18f3..812378b2 100644 --- a/src/ispypsa/templater/network_expansion.py +++ b/src/ispypsa/templater/network_expansion.py @@ -18,104 +18,6 @@ ) -# --- New parallel paths inferred from augmentation source --- -# -# Some flow-path augmentation keys (e.g. CNSW-SNW) describe corridors whose -# existing topology is split into parallel suffixed paths (CNSW-SNW_NTH, -# CNSW-SNW_STH) — the un-suffixed key has no matching path_id. Per the decision -# logged in Open-ISP/ISPyPSA#96, we treat those keys as new parallel paths: -# the augmentation builds a third Link alongside the existing ones, with no -# pre-existing capacity. This loses any directional preference encoded in the -# IASR ``Development path`` column (NTH vs STH vs new corridor) — fine until -# a custom constraint actually differentiates them. - - -_NEW_PATH_DIRECTIONS = ("forward", "reverse") -_NEW_PATH_TIMESLICES = ("peak_demand", "summer_typical", "winter_reference") - - -def _new_parallel_path_rows( - flow_path_options: dict[str, pd.DataFrame], - existing_path_ids: set[str], -) -> tuple[pd.DataFrame, pd.DataFrame]: - """Builds topology + zero-capacity limit rows for augmentation keys without an existing path. - - Limits are explicit zeros (not NaN) because these paths physically don't exist - yet — NaN in this schema means "translator applies default capacity", which - would let the model dispatch flow on a Link that hasn't been built. - - I/O Example: - flow_path_options keys: {"CQ-NQ", "CNSW-SNW"} - existing_path_ids: {"CQ-NQ", "CNSW-SNW_NTH", "CNSW-SNW_STH"} - - returns: - paths: - path_id geo_from geo_to carrier - CNSW-SNW CNSW SNW AC - limits (6 rows: 2 directions x 3 timeslices, all 0 MW): - path_id direction timeslice capacity - CNSW-SNW forward peak_demand 0 - CNSW-SNW forward summer_typical 0 - ... etc - """ - new_keys = sorted(set(flow_path_options.keys()) - existing_path_ids) - paths = pd.DataFrame( - [_parse_path_key(k) for k in new_keys], - columns=["path_id", "geo_from", "geo_to", "carrier"], - ) - limits = pd.DataFrame( - [ - {"path_id": k, "direction": d, "timeslice": t, "capacity": 0.0} - for k in new_keys - for d in _NEW_PATH_DIRECTIONS - for t in _NEW_PATH_TIMESLICES - ], - columns=["path_id", "direction", "timeslice", "capacity"], - ) - return paths, limits - - -def _parse_path_key(key: str) -> dict: - """Parses a flow-path key like 'CNSW-SNW' into topology fields. Splits on the first hyphen.""" - geo_from, geo_to = key.split("-", 1) - return {"path_id": key, "geo_from": geo_from, "geo_to": geo_to, "carrier": "AC"} - - -def _append_new_parallel_paths( - paths: pd.DataFrame, - limits: pd.DataFrame, - flow_path_options: dict[str, pd.DataFrame], -) -> tuple[pd.DataFrame, pd.DataFrame]: - """Appends topology + limit rows for any augmentation corridors not already in the path table. - - Thin wrapper that calls :func:`_new_parallel_path_rows` and concatenates the result - into the upstream ``paths`` and ``limits`` tables. See ISPyPSA#96 for the modelling - decision. - - I/O Example: - paths: - path_id geo_from geo_to carrier - CNSW-SNW_NTH CNSW SNW AC - CNSW-SNW_STH CNSW SNW AC - - flow_path_options keys: {"CNSW-SNW"} # un-suffixed corridor - - returns paths (new row appended): - path_id geo_from geo_to carrier - CNSW-SNW_NTH CNSW SNW AC - CNSW-SNW_STH CNSW SNW AC - CNSW-SNW CNSW SNW AC - """ - new_paths, new_limits = _new_parallel_path_rows( - flow_path_options, set(paths["path_id"]) - ) - if new_paths.empty: - return paths, limits - paths = pd.concat([paths, new_paths], ignore_index=True) - limits = pd.concat([limits, new_limits], ignore_index=True) - return paths, limits - - # --- Extraction from iasr_tables dict --- @@ -292,6 +194,7 @@ def _template_network_expansion( rez_options: dict[str, pd.DataFrame], rez_costs: dict[str, pd.DataFrame], network_transmission_paths: pd.DataFrame, + rez_ids: set[str], ) -> tuple[pd.DataFrame, pd.DataFrame]: """ Process flow path and REZ augmentation options and cost forecasts to find the least @@ -314,9 +217,12 @@ def _template_network_expansion( for the selected scenario. DataFrames include columns 'REZ / Constraint ID', 'Option', and one column per financial year. network_transmission_paths: pd.DataFrame templated network paths table with - columns 'path_id', 'geo_from', etc. Used to map REZ IDs to their - pre-built path_id. Constraint-group IDs (absent from this table) pass - through unchanged as the expansion_id. + columns 'path_id', 'geo_from', etc. Used to discriminate physical paths + from constraint groups in the output (constraint-group IDs are absent + from this table and emit a single ``constraint_relaxation`` row). + rez_ids: set of REZ IDs (from ``renewable_energy_zones["ID"]``). Used to + filter ``network_transmission_paths`` down to REZ rows when building + the REZ-ID -> path_id lookup. Returns: Tuple of (options, costs) pd.DataFrames. @@ -377,12 +283,11 @@ def _template_network_expansion( N1-CNSW 2025 3539566.27 # 5.88B / 1660 N1-CNSW 2026 3593401.81 """ - options = _load_all_options( - flow_path_options, rez_options, network_transmission_paths - ) - costs = _load_all_costs( - flow_path_costs, rez_costs, network_transmission_paths, options - ) + rez_paths = network_transmission_paths[ + network_transmission_paths["geo_from"].isin(rez_ids) + ] + options = _load_all_options(flow_path_options, rez_options, rez_paths) + costs = _load_all_costs(flow_path_costs, rez_costs, rez_paths, options) selected = _select_least_cost_option_per_expansion(options, costs) options_table = _build_options_table(options, selected, network_transmission_paths) costs_table = _build_costs_table(costs, options, selected) @@ -395,11 +300,11 @@ def _template_network_expansion( def _load_all_options( flow_path_options: dict[str, pd.DataFrame], rez_options: dict[str, pd.DataFrame], - network_transmission_paths: pd.DataFrame, + rez_paths: pd.DataFrame, ) -> pd.DataFrame: """Concats flow-path and REZ augmentation options into one normalised frame.""" flow = _extract_flow_path_options(flow_path_options) - rez = _extract_rez_options(rez_options, network_transmission_paths) + rez = _extract_rez_options(rez_options, rez_paths) return pd.concat([flow, rez], ignore_index=True) @@ -452,7 +357,7 @@ def _normalise_flow_path_option_frame(df: pd.DataFrame) -> pd.DataFrame: def _extract_rez_options( rez_options: dict[str, pd.DataFrame], - network_transmission_paths: pd.DataFrame, + rez_paths: pd.DataFrame, ) -> pd.DataFrame: """Normalises REZ augmentation options and maps REZ IDs to their path_id. @@ -462,7 +367,7 @@ def _extract_rez_options( N1 Option 1 1660 1660 SWNSW1 Option 1 "Removes limit" "" # dropped - network_transmission_paths: + rez_paths: path_id geo_from N1-CNSW N1 @@ -472,7 +377,7 @@ def _extract_rez_options( """ if not rez_options: return _empty_options_frame() - geo_from_to_path_id = _build_geo_from_to_path_id_map(network_transmission_paths) + geo_from_to_path_id = _build_geo_from_to_path_id_map(rez_paths) frames = [ _normalise_rez_option_frame(df, geo_from_to_path_id) for df in rez_options.values() @@ -543,29 +448,21 @@ def convert(r): def _build_geo_from_to_path_id_map( - network_transmission_paths: pd.DataFrame, + rez_paths: pd.DataFrame, ) -> dict[str, str]: - """Maps each geo_from value to its path_id. REZ IDs appear once (one parent - subregion per REZ); subregion IDs may appear multiple times and collapse to - whichever path_id appears last — harmless because REZ options tables never - contain subregion IDs. + """Maps each REZ ID (geo_from) to its path_id. Expects REZ-only rows so that + each geo_from appears once. I/O Example: - network_transmission_paths: + rez_paths: path_id geo_from geo_to carrier - CQ-NQ CQ NQ AC - CQ-GG CQ GG AC # CQ collapses, but we never look it up + Q1-NQ Q1 NQ AC N1-NNSW N1 NNSW AC returns: - {"CQ": "CQ-GG", "N1": "N1-NNSW"} + {"Q1": "Q1-NQ", "N1": "N1-NNSW"} """ - return dict( - zip( - network_transmission_paths["geo_from"], - network_transmission_paths["path_id"], - ) - ) + return dict(zip(rez_paths["geo_from"], rez_paths["path_id"])) def _drop_options_with_no_capacity(options: pd.DataFrame) -> pd.DataFrame: @@ -600,12 +497,12 @@ def _drop_options_with_no_capacity(options: pd.DataFrame) -> pd.DataFrame: def _load_all_costs( flow_path_costs: dict[str, pd.DataFrame], rez_costs: dict[str, pd.DataFrame], - network_transmission_paths: pd.DataFrame, + rez_paths: pd.DataFrame, options: pd.DataFrame, ) -> pd.DataFrame: """Concats flow-path and REZ cost tables and aligns option_names to ``options``.""" flow = _extract_flow_path_costs(flow_path_costs) - rez = _extract_rez_costs(rez_costs, network_transmission_paths) + rez = _extract_rez_costs(rez_costs, rez_paths) costs = pd.concat([flow, rez], ignore_index=True) return _align_option_names_to_options(costs, options) @@ -636,7 +533,7 @@ def _extract_flow_path_costs( def _extract_rez_costs( rez_costs: dict[str, pd.DataFrame], - network_transmission_paths: pd.DataFrame, + rez_paths: pd.DataFrame, ) -> pd.DataFrame: """Melts REZ cost tables and maps REZ ID (or constraint group ID) to expansion_id. @@ -646,7 +543,7 @@ def _extract_rez_costs( N1 Option 1 5875000000 5964000000 SWQLD1 Option 1 500000 505000 - network_transmission_paths: + rez_paths: path_id geo_from N1-NNSW N1 @@ -659,7 +556,7 @@ def _extract_rez_costs( """ if not rez_costs: return _empty_costs_frame() - geo_from_to_path_id = _build_geo_from_to_path_id_map(network_transmission_paths) + geo_from_to_path_id = _build_geo_from_to_path_id_map(rez_paths) # IASR uses "REZ / Constraint ID" (capital C) in cost tables but "REZ / constraint ID" # (lowercase c) in the options tables — preserved verbatim from the source workbook. frames = [ diff --git a/src/ispypsa/templater/transmission.py b/src/ispypsa/templater/transmission.py index 6f438030..6e0fb4e7 100644 --- a/src/ispypsa/templater/transmission.py +++ b/src/ispypsa/templater/transmission.py @@ -32,11 +32,13 @@ def _template_network_transmission( renewable_energy_zones: pd.DataFrame, sub_regional_geography: pd.DataFrame, regional_granularity: str, + flow_path_options: dict[str, pd.DataFrame] | None = None, ) -> tuple[pd.DataFrame, pd.DataFrame]: """Creates the network_transmission_paths and network_transmission_path_limits tables. Sub-regional paths and limits are built first; then if a coarser granularity - is requested, the result is aggregated to that level. + is requested, the result is aggregated to that level. Finally, augmentation + keys without an existing path (new parallel corridors) are appended. Args: flow_path_transfer_capability: IASR flow path transfer capability table. @@ -48,6 +50,11 @@ def _template_network_transmission( flow paths when aggregating to a coarser granularity. regional_granularity: one of "sub_regions", "nem_regions", or "single_region". + flow_path_options: granularity-filtered dict of flow-path augmentation + options, keyed by path_id. Keys without an existing path become + new zero-capacity parallel corridors (see ``_append_new_parallel_paths``). + ``None`` (the default) means no augmentation data — used by tests that + don't exercise parallel-path behaviour. Returns: Tuple of (network_transmission_paths, network_transmission_path_limits). @@ -118,6 +125,11 @@ def _template_network_transmission( path_id direction timeslice capacity Q1-NEM forward peak_demand 750 N1-NEM (NaN) (NaN) (NaN) + + When ``flow_path_options`` contains keys without a matching path_id (e.g. + ``CNSW-SNW`` when only ``CNSW-SNW_NTH``/``_STH`` exist), those corridors are + appended as zero-capacity parallel paths — see ``_append_new_parallel_paths`` + for an example. """ topology = _parse_flow_path_topology(flow_path_transfer_capability["Flow Paths"]) flow_paths = _add_flow_path_carrier(topology) @@ -130,16 +142,34 @@ def _template_network_transmission( paths = pd.concat([flow_paths, rez_paths], ignore_index=True) limits = pd.concat([flow_limits, rez_limits], ignore_index=True) limits = _collapse_paths_with_no_limits(limits) + paths, limits = _aggregate_to_granularity( + paths, + limits, + regional_granularity, + renewable_energy_zones, + sub_regional_geography, + ) + return _append_new_parallel_paths(paths, limits, flow_path_options or {}) + + +def _aggregate_to_granularity( + paths: pd.DataFrame, + limits: pd.DataFrame, + regional_granularity: str, + renewable_energy_zones: pd.DataFrame, + sub_regional_geography: pd.DataFrame, +) -> tuple[pd.DataFrame, pd.DataFrame]: + """Dispatches to the appropriate aggregation step for the chosen granularity.""" if regional_granularity == "sub_regions": return paths, limits rez_ids = set(renewable_energy_zones["ID"]) - region_lookup = dict( - zip(sub_regional_geography["geo_id"], sub_regional_geography["region_id"]) - ) - if regional_granularity == "nem_regions": - return _aggregate_to_nem_regions(paths, limits, region_lookup, rez_ids) if regional_granularity == "single_region": return _aggregate_to_single_region(paths, limits, rez_ids) + if regional_granularity == "nem_regions": + region_lookup = dict( + zip(sub_regional_geography["geo_id"], sub_regional_geography["region_id"]) + ) + return _aggregate_to_nem_regions(paths, limits, region_lookup, rez_ids) raise ValueError(f"Unknown regional_granularity: {regional_granularity!r}") @@ -809,3 +839,116 @@ def _remap_limit_path_ids( kept = limits[limits["path_id"].isin(rename_map.keys())].copy() kept["path_id"] = kept["path_id"].map(rename_map) return kept.reset_index(drop=True) + + +# --- Augmentation-driven new parallel corridors --- + +_NEW_PATH_DIRECTIONS = ("forward", "reverse") +_NEW_PATH_TIMESLICES = ("peak_demand", "summer_typical", "winter_reference") + + +def _append_new_parallel_paths( + paths: pd.DataFrame, + limits: pd.DataFrame, + flow_path_options: dict[str, pd.DataFrame], +) -> tuple[pd.DataFrame, pd.DataFrame]: + """Appends topology + limit rows for augmentation corridors not already in the path table. + + Some flow-path augmentation tables in the IASR are keyed at corridor level + (e.g. ``flow_path_augmentation_options_CNSW-SNW``), not at the level of an + individual physical path. The corridor's existing topology is split across + parallel suffixed paths (``CNSW-SNW_NTH``, ``CNSW-SNW_STH``), so the un-suffixed + key has no matching ``path_id`` in the base topology — but it still describes + a real transmission expansion option. + + Without injecting a synthetic path for that un-suffixed key, the expansion + orchestrator misclassifies the option. ``_build_options_table`` discriminates + physical paths from constraint groups by membership in + ``network_transmission_paths``, so an unmatched key would emit a single + ``constraint_relaxation`` row instead of forward+reverse expansion rows, and + the translator would build a phantom constraint rather than an expandable Link. + + The fix is to inject a third Link alongside the NTH/STH siblings with no + pre-existing capacity. The IASR's ``Development path`` column distinguishes + NTH-specific, STH-specific, and "new corridor" options at the per-option level, + but threading that through reliably wasn't straightforward and we chose + simplicity: collapse all of them onto one new parallel link. This loses the + directional preference between NTH/STH/new-build — fine until a custom + constraint actually differentiates them. + + Limits on the new link are explicit zeros, not NaN. NaN means "translator + applies default capacity" downstream (see ``_collapse_paths_with_no_limits``), + which would let the model dispatch flow across a corridor that doesn't yet + exist. Explicit zero forbids dispatch until the augmentation is actually built. + + See Open-ISP/ISPyPSA#96 for the original modelling decision. + + I/O Example: + paths: + path_id geo_from geo_to carrier + CNSW-SNW_NTH CNSW SNW AC + CNSW-SNW_STH CNSW SNW AC + + flow_path_options keys: {"CNSW-SNW"} # un-suffixed corridor + + returns paths (new row appended): + path_id geo_from geo_to carrier + CNSW-SNW_NTH CNSW SNW AC + CNSW-SNW_STH CNSW SNW AC + CNSW-SNW CNSW SNW AC + """ + new_paths, new_limits = _new_parallel_path_rows( + flow_path_options, set(paths["path_id"]) + ) + if new_paths.empty: + return paths, limits + paths = pd.concat([paths, new_paths], ignore_index=True) + limits = pd.concat([limits, new_limits], ignore_index=True) + return paths, limits + + +def _new_parallel_path_rows( + flow_path_options: dict[str, pd.DataFrame], + existing_path_ids: set[str], +) -> tuple[pd.DataFrame, pd.DataFrame]: + """Builds topology + zero-capacity limit rows for augmentation keys without an existing path. + + Limits are explicit zeros (not NaN) because these paths physically don't exist + yet — NaN in this schema means "translator applies default capacity", which + would let the model dispatch flow on a Link that hasn't been built. + + I/O Example: + flow_path_options keys: {"CQ-NQ", "CNSW-SNW"} + existing_path_ids: {"CQ-NQ", "CNSW-SNW_NTH", "CNSW-SNW_STH"} + + returns: + paths: + path_id geo_from geo_to carrier + CNSW-SNW CNSW SNW AC + limits (6 rows: 2 directions x 3 timeslices, all 0 MW): + path_id direction timeslice capacity + CNSW-SNW forward peak_demand 0 + CNSW-SNW forward summer_typical 0 + ... etc + """ + new_keys = sorted(set(flow_path_options.keys()) - existing_path_ids) + paths = pd.DataFrame( + [_parse_path_key(k) for k in new_keys], + columns=["path_id", "geo_from", "geo_to", "carrier"], + ) + limits = pd.DataFrame( + [ + {"path_id": k, "direction": d, "timeslice": t, "capacity": 0.0} + for k in new_keys + for d in _NEW_PATH_DIRECTIONS + for t in _NEW_PATH_TIMESLICES + ], + columns=["path_id", "direction", "timeslice", "capacity"], + ) + return paths, limits + + +def _parse_path_key(key: str) -> dict: + """Parses a flow-path key like 'CNSW-SNW' into topology fields. Splits on the first hyphen.""" + geo_from, geo_to = key.split("-", 1) + return {"path_id": key, "geo_from": geo_from, "geo_to": geo_to, "carrier": "AC"} diff --git a/tests/test_templater/test_network_expansion.py b/tests/test_templater/test_network_expansion.py index 6e9ff657..a2e26503 100644 --- a/tests/test_templater/test_network_expansion.py +++ b/tests/test_templater/test_network_expansion.py @@ -17,7 +17,6 @@ _align_option_names_to_options, _filter_flow_path_augmentations_to_granularity, _first_year_with_complete_costs_per_expansion, - _new_parallel_path_rows, _rekey_augmentation_path_to_region, _template_network_expansion, ) @@ -78,6 +77,7 @@ def test_template_network_expansion_picks_least_cost_and_splits_directions( rez_options=rez_options, rez_costs=rez_costs, network_transmission_paths=network_transmission_paths, + rez_ids={"N1"}, ) # CQ-NQ Option 2 wins ($200k / 500MW = $400/MW vs Option 1 $1M/1000MW = $1000/MW) @@ -148,6 +148,7 @@ def test_template_network_expansion_skips_non_numeric_capacity(csv_str_to_df): rez_options=rez_options, rez_costs=rez_costs, network_transmission_paths=network_transmission_paths, + rez_ids=set(), ) # Only Option 1 survives (Option 2 has non-numeric capacity, skipped). @@ -193,6 +194,7 @@ def test_template_network_expansion_fuzzy_matches_em_dash_option_names(csv_str_t rez_options=rez_options, rez_costs=rez_costs, network_transmission_paths=network_transmission_paths, + rez_ids=set(), ) # Em-dash cost option_name is aligned to the hyphen form, so the join finds it @@ -223,49 +225,6 @@ def test_template_network_expansion_fuzzy_matches_em_dash_option_names(csv_str_t ) -def test_new_parallel_path_rows_picks_up_keys_without_existing_path(csv_str_to_df): - # Augmentation source has a key (CNSW-SNW) that has no exact match in the existing - # topology — only suffixed parallel paths (CNSW-SNW_NTH, CNSW-SNW_STH) exist. The - # key should produce a new parallel-path topology row plus six zero-capacity limit - # rows (2 directions x 3 timeslices) — zero, not NaN, because the path doesn't - # physically exist yet. - flow_path_options = { - "CQ-NQ": pd.DataFrame(), # already in topology, no new row - "CNSW-SNW": pd.DataFrame(), # new parallel path - } - existing_path_ids = {"CQ-NQ", "CNSW-SNW_NTH", "CNSW-SNW_STH"} - - new_paths, new_limits = _new_parallel_path_rows( - flow_path_options, existing_path_ids - ) - - expected_paths = csv_str_to_df(""" - path_id, geo_from, geo_to, carrier - CNSW-SNW, CNSW, SNW, AC - """) - pd.testing.assert_frame_equal( - new_paths.reset_index(drop=True), - expected_paths.reset_index(drop=True), - check_dtype=False, - ) - # 6 zero-capacity rows: 2 directions x 3 timeslices. - expected_limits = csv_str_to_df(""" - path_id, direction, timeslice, capacity - CNSW-SNW, forward, peak_demand, 0 - CNSW-SNW, forward, summer_typical, 0 - CNSW-SNW, forward, winter_reference, 0 - CNSW-SNW, reverse, peak_demand, 0 - CNSW-SNW, reverse, summer_typical, 0 - CNSW-SNW, reverse, winter_reference, 0 - """) - pd.testing.assert_frame_equal( - new_limits.sort_values(["direction", "timeslice"]).reset_index(drop=True), - expected_limits.sort_values(["direction", "timeslice"]).reset_index(drop=True), - check_exact=False, - check_dtype=False, - ) - - def test_template_network_expansion_treats_blank_path_direction_as_zero(csv_str_to_df): # A REZ-derived path option with no reverse capacity in the source should still # emit both forward and reverse rows; the missing direction is 0 MW (no expansion), @@ -295,6 +254,7 @@ def test_template_network_expansion_treats_blank_path_direction_as_zero(csv_str_ rez_options=rez_options, rez_costs=rez_costs, network_transmission_paths=network_transmission_paths, + rez_ids={"DN1"}, ) expected_options = csv_str_to_df(""" @@ -343,6 +303,7 @@ def test_template_network_expansion_passes_constraint_group_ids_through(csv_str_ rez_options=rez_options, rez_costs=rez_costs, network_transmission_paths=network_transmission_paths, + rez_ids={"Q1"}, ) # Constraint group: emits a single constraint_relaxation row, not a forward/reverse pair. @@ -380,6 +341,7 @@ def test_template_network_expansion_empty_inputs_produce_empty_outputs(csv_str_t network_transmission_paths=csv_str_to_df(""" path_id, geo_from """), + rez_ids=set(), ) expected_options = csv_str_to_df(""" @@ -422,6 +384,7 @@ def test_template_network_expansion_flow_paths_only_rez_empty(csv_str_to_df): path_id, geo_from CQ-NQ, CQ """), + rez_ids=set(), ) expected_options = csv_str_to_df(""" @@ -548,6 +511,7 @@ def test_template_network_expansion_drops_expansion_with_no_complete_year( path_id, geo_from CQ-NQ, CQ """), + rez_ids=set(), ) expected_options = csv_str_to_df(""" @@ -598,6 +562,7 @@ def test_template_network_expansion_rez_only_flow_paths_empty(csv_str_to_df): path_id, geo_from N1-NNSW, N1 """), + rez_ids={"N1"}, ) expected_options = csv_str_to_df(""" diff --git a/tests/test_templater/test_transmission.py b/tests/test_templater/test_transmission.py index 7e430975..707fafaa 100644 --- a/tests/test_templater/test_transmission.py +++ b/tests/test_templater/test_transmission.py @@ -2,6 +2,7 @@ from ispypsa.templater.transmission import ( _collapse_paths_with_no_limits, + _new_parallel_path_rows, _template_network_transmission, ) @@ -563,3 +564,46 @@ def test_collapse_multiple_all_nan_paths(csv_str_to_df): expected.sort_values("path_id").reset_index(drop=True), check_dtype=False, ) + + +def test_new_parallel_path_rows_picks_up_keys_without_existing_path(csv_str_to_df): + # Augmentation source has a key (CNSW-SNW) that has no exact match in the existing + # topology — only suffixed parallel paths (CNSW-SNW_NTH, CNSW-SNW_STH) exist. The + # key should produce a new parallel-path topology row plus six zero-capacity limit + # rows (2 directions x 3 timeslices) — zero, not NaN, because the path doesn't + # physically exist yet. + flow_path_options = { + "CQ-NQ": pd.DataFrame(), # already in topology, no new row + "CNSW-SNW": pd.DataFrame(), # new parallel path + } + existing_path_ids = {"CQ-NQ", "CNSW-SNW_NTH", "CNSW-SNW_STH"} + + new_paths, new_limits = _new_parallel_path_rows( + flow_path_options, existing_path_ids + ) + + expected_paths = csv_str_to_df(""" + path_id, geo_from, geo_to, carrier + CNSW-SNW, CNSW, SNW, AC + """) + pd.testing.assert_frame_equal( + new_paths.reset_index(drop=True), + expected_paths.reset_index(drop=True), + check_dtype=False, + ) + # 6 zero-capacity rows: 2 directions x 3 timeslices. + expected_limits = csv_str_to_df(""" + path_id, direction, timeslice, capacity + CNSW-SNW, forward, peak_demand, 0 + CNSW-SNW, forward, summer_typical, 0 + CNSW-SNW, forward, winter_reference, 0 + CNSW-SNW, reverse, peak_demand, 0 + CNSW-SNW, reverse, summer_typical, 0 + CNSW-SNW, reverse, winter_reference, 0 + """) + pd.testing.assert_frame_equal( + new_limits.sort_values(["direction", "timeslice"]).reset_index(drop=True), + expected_limits.sort_values(["direction", "timeslice"]).reset_index(drop=True), + check_exact=False, + check_dtype=False, + ) From b131ec923241c4d994f6ba7739a7569781e5c1c8 Mon Sep 17 00:00:00 2001 From: nick-gorman Date: Wed, 6 May 2026 15:25:52 +1000 Subject: [PATCH 09/14] Round out incomplete I/O examples surfaced by docstring review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A multi-agent docstring sweep flagged four examples that had drifted from the code or under-documented their outputs: - _aggregate_to_nem_regions: the example dropped the N1-NSW NaN row from the returned limits, even though _remap_limit_path_ids keeps any row whose path_id is in the rename map. - _append_new_parallel_paths: the rationale spends a paragraph on why limits are explicit zeros, not NaN — but the example only showed the paths half of the returned tuple. Added the limits side so the zero-capacity rows are visible alongside the rationale. - _template_network_expansion: the example didn't include the new required rez_ids input, so a reader couldn't reproduce it. - _aggregate_flow_path_augmentations_to_nem_regions: shown only as set notation over keys, hiding the dict-of-DataFrames structure and the "Flow path" column rewrite. Aligned with the wrapper's format. Also fixed a stray double-space in the def line of the same function. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/ispypsa/templater/network_expansion.py | 12 ++++++++++-- src/ispypsa/templater/transmission.py | 17 +++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/ispypsa/templater/network_expansion.py b/src/ispypsa/templater/network_expansion.py index 812378b2..2ed73e64 100644 --- a/src/ispypsa/templater/network_expansion.py +++ b/src/ispypsa/templater/network_expansion.py @@ -142,10 +142,16 @@ def _aggregate_flow_path_augmentations_to_nem_regions( """Drops intra-region augmentation entries and re-keys cross-region ones. I/O Example: - augmentations keys: {"CQ-NQ", "NNSW-SQ", "NNSW-SQ_Terranora"} + augmentations: + "CQ-NQ": # intra-QLD + "NNSW-SQ": # NSW <-> QLD + "NNSW-SQ_Terranora": # parallel suffix + region_lookup: {"CQ": "QLD", "NQ": "QLD", "NNSW": "NSW", "SQ": "QLD"} - returns keys: {"NSW-QLD", "NSW-QLD_Terranora"} # CQ-NQ dropped (intra-QLD) + returns: + "NSW-QLD": # CQ-NQ dropped (intra-QLD) + "NSW-QLD_Terranora": # suffix preserved """ result = {} for old_key, df in augmentations.items(): @@ -267,6 +273,8 @@ def _template_network_expansion( CQ-NQ CQ NQ AC N1-CNSW N1 CNSW AC + rez_ids: {"N1"} # used to filter network_transmission_paths to REZ-only rows + Outputs: options (network_expansion_options): diff --git a/src/ispypsa/templater/transmission.py b/src/ispypsa/templater/transmission.py index 6e0fb4e7..0aeffc9f 100644 --- a/src/ispypsa/templater/transmission.py +++ b/src/ispypsa/templater/transmission.py @@ -591,6 +591,7 @@ def _aggregate_to_nem_regions( path_id direction timeslice capacity NSW-QLD forward peak_demand 950 # CQ-NQ row dropped Q1-QLD forward peak_demand 750 + N1-NSW (NaN) (NaN) (NaN) # collapsed row preserved through rename Raises ValueError if any flow-path or REZ-path geo is missing from ``region_lookup`` (every geo must map to a real region). @@ -889,6 +890,11 @@ def _append_new_parallel_paths( CNSW-SNW_NTH CNSW SNW AC CNSW-SNW_STH CNSW SNW AC + limits (existing siblings, abbreviated): + path_id direction timeslice capacity + CNSW-SNW_NTH forward peak_demand 900 + CNSW-SNW_STH forward peak_demand 800 + flow_path_options keys: {"CNSW-SNW"} # un-suffixed corridor returns paths (new row appended): @@ -896,6 +902,17 @@ def _append_new_parallel_paths( CNSW-SNW_NTH CNSW SNW AC CNSW-SNW_STH CNSW SNW AC CNSW-SNW CNSW SNW AC + + returns limits (six explicit-zero rows appended for CNSW-SNW: 2 directions x 3 timeslices): + path_id direction timeslice capacity + CNSW-SNW_NTH forward peak_demand 900 + CNSW-SNW_STH forward peak_demand 800 + CNSW-SNW forward peak_demand 0 + CNSW-SNW forward summer_typical 0 + CNSW-SNW forward winter_reference 0 + CNSW-SNW reverse peak_demand 0 + CNSW-SNW reverse summer_typical 0 + CNSW-SNW reverse winter_reference 0 """ new_paths, new_limits = _new_parallel_path_rows( flow_path_options, set(paths["path_id"]) From 92a467e58314448f7aaf184ffe355e9172255f5d Mon Sep 17 00:00:00 2001 From: nick-gorman Date: Wed, 6 May 2026 15:47:31 +1000 Subject: [PATCH 10/14] Fill coverage gaps in network_expansion test suite Adds direct tests for utilities and branches that were only covered end-to-end (or not at all): the IASR-prefix typo absorption, the no-numeric-capacity INFO log, em-dash alignment, earliest-complete-year selection, the unknown-granularity ValueError, and the small parsing helpers. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../test_templater/test_network_expansion.py | 190 ++++++++++++++++++ 1 file changed, 190 insertions(+) diff --git a/tests/test_templater/test_network_expansion.py b/tests/test_templater/test_network_expansion.py index a2e26503..0eacf853 100644 --- a/tests/test_templater/test_network_expansion.py +++ b/tests/test_templater/test_network_expansion.py @@ -10,13 +10,19 @@ import logging import pandas as pd +import pytest from ispypsa.templater.network_expansion import ( _FLOW_PATH_FORWARD_MW_COL, _FLOW_PATH_REVERSE_MW_COL, _align_option_names_to_options, + _extract_flow_path_costs_from_iasr, _filter_flow_path_augmentations_to_granularity, _first_year_with_complete_costs_per_expansion, + _iasr_tables_with_prefix, + _looks_like_financial_year, + _normalise_cost_frame, + _parse_numeric, _rekey_augmentation_path_to_region, _template_network_expansion, ) @@ -33,6 +39,39 @@ def _fp_options(rows: list[tuple]) -> pd.DataFrame: return pd.DataFrame(rows, columns=_FP_OPT_COLS) +# --- IASR extraction --- + + +def test_iasr_tables_with_prefix_strips_prefix_and_filters_others(): + iasr_tables = { + "flow_path_augmentation_options_CQ-NQ": pd.DataFrame({"x": [1]}), + "flow_path_augmentation_options_NNSW-SQ": pd.DataFrame({"x": [2]}), + "rez_augmentation_options_NSW": pd.DataFrame({"x": [3]}), + "renewable_energy_zones": pd.DataFrame({"x": [4]}), + } + + result = _iasr_tables_with_prefix(iasr_tables, "flow_path_augmentation_options_") + + assert set(result.keys()) == {"CQ-NQ", "NNSW-SQ"} + + +def test_extract_flow_path_costs_from_iasr_absorbs_workbook_typo(): + # Workbook v7.5 has one mistyped table using singular "cost" instead of "costs". + # The extractor accepts either prefix and merges the results, while ignoring + # tables for other scenarios. + iasr_tables = { + "flow_path_augmentation_costs_step_change_CQ-NQ": pd.DataFrame({"x": [1]}), + "flow_path_augmentation_cost_step_change_NNSW-SQ": pd.DataFrame({"x": [2]}), + "flow_path_augmentation_costs_progressive_change_CQ-NQ": pd.DataFrame( + {"x": [3]} + ), + } + + result = _extract_flow_path_costs_from_iasr(iasr_tables, "Step Change") + + assert set(result.keys()) == {"CQ-NQ", "NNSW-SQ"} + + def test_template_network_expansion_picks_least_cost_and_splits_directions( csv_str_to_df, ): @@ -166,6 +205,51 @@ def test_template_network_expansion_skips_non_numeric_capacity(csv_str_to_df): ) +def test_template_network_expansion_logs_skipped_non_numeric_capacity_options( + csv_str_to_df, caplog +): + # Same shape as the skip test above, but asserts the INFO log fires for the + # dropped option so the operator can audit silent filtering. + flow_path_options = { + "CQ-NQ": _fp_options( + [ + ("CQ-NQ", "CQ-NQ Option 1", 1000, 1000), + ( + "CQ-NQ", + "CQ-NQ Option 2", + "Removes limit", + "Non-network augmentation", + ), + ] + ), + } + flow_path_costs = { + "CQ-NQ": csv_str_to_df(""" + Flow path, Option, 2024-25, 2025-26 + CQ-NQ, CQ-NQ Option 1, 1000000, 1010000 + CQ-NQ, CQ-NQ Option 2, 500000, 505000 + """), + } + + with caplog.at_level(logging.INFO): + _template_network_expansion( + flow_path_options=flow_path_options, + flow_path_costs=flow_path_costs, + rez_options={}, + rez_costs={}, + network_transmission_paths=csv_str_to_df(""" + path_id, geo_from + CQ-NQ, CQ + """), + rez_ids=set(), + ) + + assert ( + "Skipping option 'CQ-NQ Option 2' for 'CQ-NQ': " + "no numeric capacity in forward or reverse direction." + ) in caplog.text + + def test_template_network_expansion_fuzzy_matches_em_dash_option_names(csv_str_to_df): # Options table uses hyphen; costs table uses em-dash. Fuzzy match should bridge them. flow_path_options = { @@ -451,6 +535,37 @@ def test_align_option_names_warns_when_costs_have_no_matching_options( ) in caplog.text +def test_align_option_names_rewrites_em_dash_to_hyphen(csv_str_to_df): + # The cost option_name uses an em-dash; the options table uses a hyphen. + # Fuzzy matching should rewrite the cost option_name to the hyphen form so + # downstream joins on (expansion_id, option_name) succeed. + options = csv_str_to_df(""" + expansion_id, option_name + NNSW-SQ, NNSW-SQ Option 1 + """) + costs = pd.DataFrame( + { + "expansion_id": ["NNSW-SQ", "NNSW-SQ"], + "option_name": ["NNSW–SQ Option 1", "NNSW–SQ Option 1"], + "year": [2025, 2026], + "cost": [500000, 510000], + } + ) + + result = _align_option_names_to_options(costs, options) + + expected = csv_str_to_df(""" + expansion_id, option_name, year, cost + NNSW-SQ, NNSW-SQ Option 1, 2025, 500000 + NNSW-SQ, NNSW-SQ Option 1, 2026, 510000 + """) + pd.testing.assert_frame_equal( + result.reset_index(drop=True), + expected.reset_index(drop=True), + check_dtype=False, + ) + + def test_first_year_with_complete_costs_warns_and_skips_when_no_complete_year( csv_str_to_df, caplog ): @@ -480,6 +595,32 @@ def test_first_year_with_complete_costs_warns_and_skips_when_no_complete_year( ) in caplog.text +def test_first_year_with_complete_costs_picks_earliest_complete_year(csv_str_to_df): + # 2025 is missing Option 2's cost; both 2026 and 2027 have all options. + # The earliest complete year (2026) is selected and only those rows survive. + costs = csv_str_to_df(""" + expansion_id, option_name, year, cost + CQ-NQ, Option 1, 2025, 500000 + CQ-NQ, Option 1, 2026, 510000 + CQ-NQ, Option 1, 2027, 520000 + CQ-NQ, Option 2, 2026, 600000 + CQ-NQ, Option 2, 2027, 610000 + """) + + result = _first_year_with_complete_costs_per_expansion(costs) + + expected = csv_str_to_df(""" + expansion_id, option_name, year, cost + CQ-NQ, Option 1, 2026, 510000 + CQ-NQ, Option 2, 2026, 600000 + """) + pd.testing.assert_frame_equal( + result.sort_values("option_name").reset_index(drop=True), + expected.sort_values("option_name").reset_index(drop=True), + check_dtype=False, + ) + + def test_template_network_expansion_drops_expansion_with_no_complete_year( csv_str_to_df, caplog ): @@ -714,3 +855,52 @@ def test_filter_flow_path_augmentations_does_not_mutate_input_frames(): ) pd.testing.assert_frame_equal(augmentations["NNSW-SQ"], snapshot) + + +def test_filter_flow_path_augmentations_unknown_granularity_raises(): + with pytest.raises(ValueError, match="Unknown regional_granularity"): + _filter_flow_path_augmentations_to_granularity({}, "regional", _REGION_LOOKUP) + + +# --- Utilities --- + + +def test_parse_numeric_handles_comma_thousands(): + # Strings with thousands separators are parsed; non-numeric and empty become NaN. + series = pd.Series(["1,000", "1,500.5", "abc", ""]) + + result = _parse_numeric(series) + + expected = pd.Series([1000.0, 1500.5, float("nan"), float("nan")]) + pd.testing.assert_series_equal(result, expected, check_dtype=False) + + +def test_normalise_cost_frame_drops_non_numeric_year_cells(csv_str_to_df): + # Drop is per-cell after the melt: Option 1 keeps 2026 only; Option 2 keeps 2025 only. + df = csv_str_to_df(""" + Flow path, Option, 2024-25, 2025-26 + CQ-NQ, Option 1, N/A, 510000 + CQ-NQ, Option 2, 600000, N/A + """) + + result = _normalise_cost_frame(df, id_col="Flow path", option_col="Option") + + expected = csv_str_to_df(""" + expansion_id, option_name, year, cost + CQ-NQ, Option 1, 2026, 510000 + CQ-NQ, Option 2, 2025, 600000 + """) + pd.testing.assert_frame_equal( + result.sort_values("option_name").reset_index(drop=True), + expected.sort_values("option_name").reset_index(drop=True), + check_dtype=False, + ) + + +def test_looks_like_financial_year_matches_only_canonical_format(): + assert _looks_like_financial_year("2024-25") is True + assert _looks_like_financial_year("2025-26") is True + assert _looks_like_financial_year("2024-2025") is False + assert _looks_like_financial_year("24-25") is False + assert _looks_like_financial_year("Status") is False + assert _looks_like_financial_year("Flow path") is False From 575a3937f8a8f72218d7ab2634582e2c0c248684 Mon Sep 17 00:00:00 2001 From: nick-gorman Date: Thu, 7 May 2026 10:55:34 +1000 Subject: [PATCH 11/14] Cover new-format templater end-to-end through the CLI The use_new_table_format=true path had no test driving it via the CLI, which is the surface most likely to regress when AEMO updates the 7.5 workbook or the templater logic shifts. Added a parameterised CLI test over all three regional granularities that asserts row counts derived from named structural quantities (flow paths, REZs, parallel-path injections, REZs without limits, etc.) plus referential integrity between paths/limits and options/costs. To keep CI off the workbook binary, the input fixture is committed as parsed CSVs at tests/test_workbook_table_cache/7.5/. The existing 6.0 truncated fixture was moved into a sibling 6.0/ subdir so the two versions sit alongside each other and serve different purposes (truncated unit-test inputs vs full e2e inputs) without aliasing. Flag flips for subprocess CLI tests need to cross the process boundary, so feature_flags.py now honours an ISPYPSA_USE_NEW_TABLE_FORMAT env override on top of the YAML default. Co-Authored-By: Claude Opus 4.7 (1M context) --- scripts/build_75_test_cache.py | 33 +++ src/ispypsa/cli/dodo.py | 4 +- src/ispypsa/feature_flags.py | 12 ++ tests/conftest.py | 2 +- tests/test_cli/cli_test_helpers.py | 39 ++-- tests/test_cli/test_create_ispypsa_inputs.py | 199 ++++++++++++++++++ .../{ => 6.0}/additional_projects_summary.csv | 0 .../anticipated_projects_summary.csv | 0 ...tted_anticipated_additional_generators.csv | 0 .../{ => 6.0}/auxiliary_load_new_entrants.csv | 0 .../{ => 6.0}/batteries_summary.csv | 0 .../{ => 6.0}/battery_properties.csv | 0 .../{ => 6.0}/biomass_prices.csv | 0 .../{ => 6.0}/biomethane_prices.csv | 0 .../build_costs_current_policies.csv | 0 .../build_costs_global_nze_by_2050.csv | 0 .../build_costs_global_nze_post_2050.csv | 0 .../{ => 6.0}/build_costs_pumped_hydro.csv | 0 .../build_costs_scenario_mapping.csv | 0 ...investment_scheme_renewable_trajectory.csv | 0 ...y_investment_scheme_storage_trajectory.csv | 0 ...mass_price_consultant_scenario_mapping.csv | 0 .../{ => 6.0}/coal_minimum_stable_level.csv | 0 .../coal_prices_green_energy_exports.csv | 0 .../coal_prices_progressive_change.csv | 0 .../{ => 6.0}/coal_prices_step_change.csv | 0 .../committed_generators_summary.csv | 0 ...st_forecast_non_rez_progressive_change.csv | 0 ...n_rez_step_change&green_energy_exports.csv | 0 ...cast_wind_and_solar_progressive_change.csv | 0 ...solar_step_change&green_energy_exports.csv | 0 .../connection_costs_for_wind_and_solar.csv | 0 .../{ => 6.0}/connection_costs_other.csv | 0 .../{ => 6.0}/existing_generators_summary.csv | 0 .../{ => 6.0}/expected_closure_years.csv | 0 ...tted_anticipated_additional_generators.csv | 0 .../{ => 6.0}/fixed_opex_new_entrants.csv | 0 ...ion_costs_progressive_change_CNSW-NNSW.csv | 0 ...tion_costs_progressive_change_CNSW-SNW.csv | 0 ...ntation_costs_progressive_change_CQ-GG.csv | 0 ...ntation_costs_progressive_change_CQ-NQ.csv | 0 ...ation_costs_progressive_change_NNSW-SQ.csv | 0 ...tion_costs_progressive_change_SESA-CSA.csv | 0 ...ion_costs_progressive_change_SNSW-CNSW.csv | 0 ...ntation_costs_progressive_change_SQ-CQ.csv | 0 ...ation_costs_progressive_change_TAS-VIC.csv | 0 ...tion_costs_progressive_change_VIC-SESA.csv | 0 ...tion_costs_progressive_change_VIC-SNSW.csv | 0 ...ressive_change_actionable_isp_projects.csv | 0 ...gressive_change_preparatory_activities.csv | 0 ...nge_and_green_energy_exports_CNSW-NNSW.csv | 0 ...ange_and_green_energy_exports_CNSW-SNW.csv | 0 ..._change_and_green_energy_exports_CQ-GG.csv | 0 ..._change_and_green_energy_exports_CQ-NQ.csv | 0 ...hange_and_green_energy_exports_NNSW-SQ.csv | 0 ...ange_and_green_energy_exports_SESA-CSA.csv | 0 ...nge_and_green_energy_exports_SNSW-CNSW.csv | 0 ..._change_and_green_energy_exports_SQ-CQ.csv | 0 ...hange_and_green_energy_exports_TAS-VIC.csv | 0 ...ange_and_green_energy_exports_VIC-SESA.csv | 0 ...ange_and_green_energy_exports_VIC-SNSW.csv | 0 ...energy_exports_actionable_isp_projects.csv | 0 ..._energy_exports_preparatory_activities.csv | 0 ...ow_path_augmentation_options_CNSW-NNSW.csv | 0 ...low_path_augmentation_options_CNSW-SNW.csv | 0 .../flow_path_augmentation_options_CQ-GG.csv | 0 .../flow_path_augmentation_options_CQ-NQ.csv | 0 ...flow_path_augmentation_options_NNSW-SQ.csv | 0 ...low_path_augmentation_options_SESA-CSA.csv | 0 ...ow_path_augmentation_options_SNSW-CNSW.csv | 0 .../flow_path_augmentation_options_SQ-CQ.csv | 0 ...flow_path_augmentation_options_TAS-VIC.csv | 0 ...low_path_augmentation_options_VIC-SESA.csv | 0 ...low_path_augmentation_options_VIC-SNSW.csv | 0 .../flow_path_transfer_capability.csv | 0 ...l_outages_forecast_existing_generators.csv | 0 .../gas_prices_green_energy_exports.csv | 0 .../gas_prices_progressive_change.csv | 0 .../{ => 6.0}/gas_prices_step_change.csv | 0 .../gpg_emissions_reduction_biomethane.csv | 0 .../gpg_emissions_reduction_h2_kogan.csv | 0 .../gpg_emissions_reduction_h2_sa_turbine.csv | 0 ...g_min_stable_level_existing_generators.csv | 0 .../gpg_min_stable_level_new_entrants.csv | 0 ...tted_anticipated_additional_generators.csv | 0 .../{ => 6.0}/heat_rates_new_entrants.csv | 0 .../{ => 6.0}/hydrogen_prices.csv | 0 .../{ => 6.0}/initial_build_limits.csv | 0 .../interconnector_transfer_capability.csv | 0 .../{ => 6.0}/lead_time_and_project_life.csv | 0 .../{ => 6.0}/liquid_fuel_prices.csv | 0 .../{ => 6.0}/locational_cost_factors.csv | 0 ...g_duration_outages_existing_generators.csv | 0 .../maintenance_existing_generators.csv | 0 .../{ => 6.0}/maintenance_new_entrants.csv | 0 ...ginal_loss_factors_additional_projects.csv | 0 ...inal_loss_factors_anticipated_projects.csv | 0 ...inal_loss_factors_committed_generators.csv | 0 ...ng_committed_and_anticipated_batteries.csv | 0 ...ginal_loss_factors_existing_generators.csv | 0 .../marginal_loss_factors_new_entrants.csv | 0 .../maximum_capacity_additional_projects.csv | 0 .../maximum_capacity_anticipated_projects.csv | 0 .../maximum_capacity_committed_generators.csv | 0 ...ng_committed_and_anticipated_batteries.csv | 0 .../maximum_capacity_existing_generators.csv | 0 .../maximum_capacity_new_entrants.csv | 0 .../{ => 6.0}/new_entrants_summary.csv | 0 .../nsw_roadmap_renewable_trajectory.csv | 0 .../nsw_roadmap_storage_trajectory.csv | 0 .../outages_2023-2024_existing_generators.csv | 0 .../{ => 6.0}/outages_new_entrants.csv | 0 ...l_outages_forecast_existing_generators.csv | 0 .../powering_australia_plan_trajectory.csv | 0 .../qld_renewable_target_trajectory.csv | 0 .../{ => 6.0}/regional_reference_nodes.csv | 0 .../regional_topology_representation.csv | 0 .../{ => 6.0}/renewable_energy_zones.csv | 0 ...mentation_costs_progressive_change_NSW.csv | 0 ...mentation_costs_progressive_change_QLD.csv | 0 ...gmentation_costs_progressive_change_SA.csv | 0 ...mentation_costs_progressive_change_TAS.csv | 0 ...mentation_costs_progressive_change_VIC.csv | 0 ...gressive_change_preparatory_activities.csv | 0 ...ep_change_and_green_energy_exports_NSW.csv | 0 ...ep_change_and_green_energy_exports_QLD.csv | 0 ...tep_change_and_green_energy_exports_SA.csv | 0 ...ep_change_and_green_energy_exports_TAS.csv | 0 ...ep_change_and_green_energy_exports_VIC.csv | 0 ..._energy_exports_preparatory_activities.csv | 0 .../rez_augmentation_options_NSW.csv | 0 .../rez_augmentation_options_QLD.csv | 0 .../{ => 6.0}/rez_augmentation_options_SA.csv | 0 .../rez_augmentation_options_TAS.csv | 0 .../rez_augmentation_options_VIC.csv | 0 .../seasonal_ratings_additional_projects.csv | 0 .../seasonal_ratings_anticipated_projects.csv | 0 .../seasonal_ratings_committed_generators.csv | 0 ...ng_committed_and_anticipated_batteries.csv | 0 .../seasonal_ratings_existing_generators.csv | 0 .../seasonal_ratings_new_entrants.csv | 0 .../sub_regional_reference_nodes.csv | 0 .../tas_renewable_target_trajectory.csv | 0 .../technology_cost_breakdown_ratios.csv | 0 .../{ => 6.0}/technology_specific_lcfs.csv | 0 .../transmission_expansion_costs.csv | 0 ...tted_anticipated_additional_generators.csv | 0 .../{ => 6.0}/variable_opex_new_entrants.csv | 0 .../vic_offshore_wind_target_trajectory.csv | 0 .../vic_renewable_target_trajectory.csv | 0 .../vic_storage_target_trajectory.csv | 0 ...mentation_cost_slower_growth_CNSW-NNSW.csv | 6 + ...costs_accelerated_transition_CNSW-NNSW.csv | 6 + ..._costs_accelerated_transition_CNSW-SNW.csv | 11 + ...ion_costs_accelerated_transition_CQ-GG.csv | 5 + ...ion_costs_accelerated_transition_CQ-NQ.csv | 5 + ...n_costs_accelerated_transition_CSA-NSA.csv | 6 + ...n_costs_accelerated_transition_MEL-WNV.csv | 5 + ...n_costs_accelerated_transition_NNSW-SQ.csv | 5 + ..._costs_accelerated_transition_SESA-CSA.csv | 5 + ...n_costs_accelerated_transition_SEV-MEL.csv | 6 + ...costs_accelerated_transition_SNSW-CNSW.csv | 5 + ...ion_costs_accelerated_transition_SQ-CQ.csv | 6 + ...n_costs_accelerated_transition_TAS-SEV.csv | 3 + ..._costs_accelerated_transition_WNV-SESA.csv | 4 + ..._costs_accelerated_transition_WNV-SNSW.csv | 2 + ...mentation_costs_slower_growth_CNSW-SNW.csv | 11 + ...augmentation_costs_slower_growth_CQ-GG.csv | 5 + ...augmentation_costs_slower_growth_CQ-NQ.csv | 5 + ...gmentation_costs_slower_growth_CSA-NSA.csv | 6 + ...gmentation_costs_slower_growth_MEL_WNV.csv | 5 + ...gmentation_costs_slower_growth_NNSW-SQ.csv | 5 + ...mentation_costs_slower_growth_SESA-CSA.csv | 5 + ...gmentation_costs_slower_growth_SEV_MEL.csv | 6 + ...entation_costs_slower_growth_SNSW-CNSW.csv | 5 + ...augmentation_costs_slower_growth_SQ-CQ.csv | 6 + ...gmentation_costs_slower_growth_TAS-SEV.csv | 3 + ...mentation_costs_slower_growth_WNV-SESA.csv | 4 + ...mentation_costs_slower_growth_WNV-SNSW.csv | 2 + ...gmentation_costs_step_change_CNSW-NNSW.csv | 6 + ...ugmentation_costs_step_change_CNSW-SNW.csv | 11 + ...h_augmentation_costs_step_change_CQ-GG.csv | 5 + ...h_augmentation_costs_step_change_CQ-NQ.csv | 5 + ...augmentation_costs_step_change_CSA-NSA.csv | 6 + ...augmentation_costs_step_change_MEL-WNV.csv | 5 + ...augmentation_costs_step_change_NNSW-SQ.csv | 5 + ...ugmentation_costs_step_change_SESA-CSA.csv | 5 + ...augmentation_costs_step_change_SEV-MEL.csv | 6 + ...gmentation_costs_step_change_SNSW-CNSW.csv | 5 + ...h_augmentation_costs_step_change_SQ-CQ.csv | 6 + ...augmentation_costs_step_change_TAS-SEV.csv | 3 + ...ugmentation_costs_step_change_WNV-SESA.csv | 4 + ...ugmentation_costs_step_change_WNV-SNSW.csv | 2 + ...ow_path_augmentation_options_CNSW-NNSW.csv | 6 + ...low_path_augmentation_options_CNSW-SNW.csv | 11 + .../flow_path_augmentation_options_CQ-GG.csv | 5 + .../flow_path_augmentation_options_CQ-NQ.csv | 5 + ...flow_path_augmentation_options_CSA-NSA.csv | 6 + ...flow_path_augmentation_options_MEL-WNV.csv | 5 + ...flow_path_augmentation_options_NNSW-SQ.csv | 6 + ...low_path_augmentation_options_SESA-CSA.csv | 5 + ...flow_path_augmentation_options_SEV-MEL.csv | 6 + ...ow_path_augmentation_options_SNSW-CNSW.csv | 6 + .../flow_path_augmentation_options_SQ-CQ.csv | 7 + ...flow_path_augmentation_options_TAS-SEV.csv | 3 + ...low_path_augmentation_options_WNV-SESA.csv | 4 + ...low_path_augmentation_options_WNV-SNSW.csv | 2 + .../7.5/flow_path_transfer_capability.csv | 19 ++ .../7.5/initial_transmission_limits.csv | 48 +++++ .../7.5/renewable_energy_zones.csv | 48 +++++ ...ation_costs_accelerated_transition_NSW.csv | 33 +++ ...ation_costs_accelerated_transition_QLD.csv | 19 ++ ...tation_costs_accelerated_transition_SA.csv | 14 ++ ...ation_costs_accelerated_transition_TAS.csv | 11 + ...ation_costs_accelerated_transition_VIC.csv | 19 ++ ...z_augmentation_costs_slower_growth_NSW.csv | 33 +++ ...z_augmentation_costs_slower_growth_QLD.csv | 19 ++ ...ez_augmentation_costs_slower_growth_SA.csv | 14 ++ ...z_augmentation_costs_slower_growth_TAS.csv | 11 + ...z_augmentation_costs_slower_growth_VIC.csv | 19 ++ ...rez_augmentation_costs_step_change_NSW.csv | 33 +++ ...rez_augmentation_costs_step_change_QLD.csv | 19 ++ .../rez_augmentation_costs_step_change_SA.csv | 14 ++ ...rez_augmentation_costs_step_change_TAS.csv | 11 + ...rez_augmentation_costs_step_change_VIC.csv | 19 ++ .../7.5/rez_augmentation_options_NSW.csv | 37 ++++ .../7.5/rez_augmentation_options_QLD.csv | 27 +++ .../7.5/rez_augmentation_options_SA.csv | 17 ++ .../7.5/rez_augmentation_options_TAS.csv | 11 + .../7.5/rez_augmentation_options_VIC.csv | 23 ++ .../7.5/sub_regional_reference_nodes.csv | 16 ++ 231 files changed, 1103 insertions(+), 19 deletions(-) create mode 100644 scripts/build_75_test_cache.py rename tests/test_workbook_table_cache/{ => 6.0}/additional_projects_summary.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/anticipated_projects_summary.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/auxiliary_load_existing_committed_anticipated_additional_generators.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/auxiliary_load_new_entrants.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/batteries_summary.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/battery_properties.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/biomass_prices.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/biomethane_prices.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/build_costs_current_policies.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/build_costs_global_nze_by_2050.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/build_costs_global_nze_post_2050.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/build_costs_pumped_hydro.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/build_costs_scenario_mapping.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/capacity_investment_scheme_renewable_trajectory.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/capacity_investment_scheme_storage_trajectory.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/coal_and_biomass_price_consultant_scenario_mapping.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/coal_minimum_stable_level.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/coal_prices_green_energy_exports.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/coal_prices_progressive_change.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/coal_prices_step_change.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/committed_generators_summary.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/connection_cost_forecast_non_rez_progressive_change.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/connection_cost_forecast_non_rez_step_change&green_energy_exports.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/connection_cost_forecast_wind_and_solar_progressive_change.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/connection_cost_forecast_wind_and_solar_step_change&green_energy_exports.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/connection_costs_for_wind_and_solar.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/connection_costs_other.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/existing_generators_summary.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/expected_closure_years.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/fixed_opex_existing_committed_anticipated_additional_generators.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/fixed_opex_new_entrants.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_progressive_change_CNSW-NNSW.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_progressive_change_CNSW-SNW.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_progressive_change_CQ-GG.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_progressive_change_CQ-NQ.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_progressive_change_NNSW-SQ.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_progressive_change_SESA-CSA.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_progressive_change_SNSW-CNSW.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_progressive_change_SQ-CQ.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_progressive_change_TAS-VIC.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_progressive_change_VIC-SESA.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_progressive_change_VIC-SNSW.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_progressive_change_actionable_isp_projects.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_progressive_change_preparatory_activities.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_step_change_and_green_energy_exports_CNSW-NNSW.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_step_change_and_green_energy_exports_CNSW-SNW.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_step_change_and_green_energy_exports_CQ-GG.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_step_change_and_green_energy_exports_CQ-NQ.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_step_change_and_green_energy_exports_NNSW-SQ.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_step_change_and_green_energy_exports_SESA-CSA.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_step_change_and_green_energy_exports_SNSW-CNSW.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_step_change_and_green_energy_exports_SQ-CQ.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_step_change_and_green_energy_exports_TAS-VIC.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_step_change_and_green_energy_exports_VIC-SESA.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_step_change_and_green_energy_exports_VIC-SNSW.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_step_change_and_green_energy_exports_actionable_isp_projects.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_costs_step_change_and_green_energy_exports_preparatory_activities.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_options_CNSW-NNSW.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_options_CNSW-SNW.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_options_CQ-GG.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_options_CQ-NQ.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_options_NNSW-SQ.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_options_SESA-CSA.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_options_SNSW-CNSW.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_options_SQ-CQ.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_options_TAS-VIC.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_options_VIC-SESA.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_augmentation_options_VIC-SNSW.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/flow_path_transfer_capability.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/full_outages_forecast_existing_generators.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/gas_prices_green_energy_exports.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/gas_prices_progressive_change.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/gas_prices_step_change.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/gpg_emissions_reduction_biomethane.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/gpg_emissions_reduction_h2_kogan.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/gpg_emissions_reduction_h2_sa_turbine.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/gpg_min_stable_level_existing_generators.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/gpg_min_stable_level_new_entrants.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/heat_rates_existing_committed_anticipated_additional_generators.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/heat_rates_new_entrants.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/hydrogen_prices.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/initial_build_limits.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/interconnector_transfer_capability.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/lead_time_and_project_life.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/liquid_fuel_prices.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/locational_cost_factors.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/long_duration_outages_existing_generators.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/maintenance_existing_generators.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/maintenance_new_entrants.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/marginal_loss_factors_additional_projects.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/marginal_loss_factors_anticipated_projects.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/marginal_loss_factors_committed_generators.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/marginal_loss_factors_existing_committed_and_anticipated_batteries.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/marginal_loss_factors_existing_generators.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/marginal_loss_factors_new_entrants.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/maximum_capacity_additional_projects.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/maximum_capacity_anticipated_projects.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/maximum_capacity_committed_generators.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/maximum_capacity_existing_committed_and_anticipated_batteries.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/maximum_capacity_existing_generators.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/maximum_capacity_new_entrants.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/new_entrants_summary.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/nsw_roadmap_renewable_trajectory.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/nsw_roadmap_storage_trajectory.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/outages_2023-2024_existing_generators.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/outages_new_entrants.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/partial_outages_forecast_existing_generators.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/powering_australia_plan_trajectory.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/qld_renewable_target_trajectory.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/regional_reference_nodes.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/regional_topology_representation.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/renewable_energy_zones.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/rez_augmentation_costs_progressive_change_NSW.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/rez_augmentation_costs_progressive_change_QLD.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/rez_augmentation_costs_progressive_change_SA.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/rez_augmentation_costs_progressive_change_TAS.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/rez_augmentation_costs_progressive_change_VIC.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/rez_augmentation_costs_progressive_change_preparatory_activities.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/rez_augmentation_costs_step_change_and_green_energy_exports_NSW.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/rez_augmentation_costs_step_change_and_green_energy_exports_QLD.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/rez_augmentation_costs_step_change_and_green_energy_exports_SA.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/rez_augmentation_costs_step_change_and_green_energy_exports_TAS.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/rez_augmentation_costs_step_change_and_green_energy_exports_VIC.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/rez_augmentation_costs_step_change_and_green_energy_exports_preparatory_activities.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/rez_augmentation_options_NSW.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/rez_augmentation_options_QLD.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/rez_augmentation_options_SA.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/rez_augmentation_options_TAS.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/rez_augmentation_options_VIC.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/seasonal_ratings_additional_projects.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/seasonal_ratings_anticipated_projects.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/seasonal_ratings_committed_generators.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/seasonal_ratings_existing_committed_and_anticipated_batteries.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/seasonal_ratings_existing_generators.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/seasonal_ratings_new_entrants.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/sub_regional_reference_nodes.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/tas_renewable_target_trajectory.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/technology_cost_breakdown_ratios.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/technology_specific_lcfs.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/transmission_expansion_costs.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/variable_opex_existing_committed_anticipated_additional_generators.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/variable_opex_new_entrants.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/vic_offshore_wind_target_trajectory.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/vic_renewable_target_trajectory.csv (100%) rename tests/test_workbook_table_cache/{ => 6.0}/vic_storage_target_trajectory.csv (100%) create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_cost_slower_growth_CNSW-NNSW.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CNSW-NNSW.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CNSW-SNW.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CQ-GG.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CQ-NQ.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CSA-NSA.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_MEL-WNV.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_NNSW-SQ.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_SESA-CSA.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_SEV-MEL.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_SNSW-CNSW.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_SQ-CQ.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_TAS-SEV.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_WNV-SESA.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_WNV-SNSW.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_CNSW-SNW.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_CQ-GG.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_CQ-NQ.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_CSA-NSA.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_MEL_WNV.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_NNSW-SQ.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_SESA-CSA.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_SEV_MEL.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_SNSW-CNSW.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_SQ-CQ.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_TAS-SEV.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_WNV-SESA.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_WNV-SNSW.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CNSW-NNSW.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CNSW-SNW.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CQ-GG.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CQ-NQ.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CSA-NSA.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_MEL-WNV.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_NNSW-SQ.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_SESA-CSA.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_SEV-MEL.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_SNSW-CNSW.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_SQ-CQ.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_TAS-SEV.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_WNV-SESA.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_WNV-SNSW.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CNSW-NNSW.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CNSW-SNW.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CQ-GG.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CQ-NQ.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CSA-NSA.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_MEL-WNV.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_NNSW-SQ.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_SESA-CSA.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_SEV-MEL.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_SNSW-CNSW.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_SQ-CQ.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_TAS-SEV.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_WNV-SESA.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_WNV-SNSW.csv create mode 100644 tests/test_workbook_table_cache/7.5/flow_path_transfer_capability.csv create mode 100644 tests/test_workbook_table_cache/7.5/initial_transmission_limits.csv create mode 100644 tests/test_workbook_table_cache/7.5/renewable_energy_zones.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_NSW.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_QLD.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_SA.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_TAS.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_VIC.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_NSW.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_QLD.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_SA.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_TAS.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_VIC.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_NSW.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_QLD.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_SA.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_TAS.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_VIC.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_options_NSW.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_options_QLD.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_options_SA.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_options_TAS.csv create mode 100644 tests/test_workbook_table_cache/7.5/rez_augmentation_options_VIC.csv create mode 100644 tests/test_workbook_table_cache/7.5/sub_regional_reference_nodes.csv diff --git a/scripts/build_75_test_cache.py b/scripts/build_75_test_cache.py new file mode 100644 index 00000000..4606725c --- /dev/null +++ b/scripts/build_75_test_cache.py @@ -0,0 +1,33 @@ +"""One-off: build tests/test_workbook_table_cache/7.5 from the local 7.5 workbook. + +Run with the new-format flag set: + + ISPYPSA_USE_NEW_TABLE_FORMAT=true uv run python scripts/build_75_test_cache.py +""" + +from pathlib import Path + +from ispypsa.iasr_table_caching import build_local_cache + + +def main() -> None: + repo_root = Path(__file__).resolve().parent.parent + workbook_path = ( + repo_root + / "data" + / "workbooks" + / "7.5" + / "Draft 2026 ISP Inputs and Assumptions workbook.xlsx" + ) + cache_path = repo_root / "tests" / "test_workbook_table_cache" / "7.5" + + if not workbook_path.exists(): + raise FileNotFoundError(f"Workbook not found at: {workbook_path}") + + cache_path.mkdir(parents=True, exist_ok=True) + build_local_cache(cache_path, workbook_path, "7.5") + print(f"Wrote cache CSVs to {cache_path}") + + +if __name__ == "__main__": + main() diff --git a/src/ispypsa/cli/dodo.py b/src/ispypsa/cli/dodo.py index 325a73aa..95cc7436 100644 --- a/src/ispypsa/cli/dodo.py +++ b/src/ispypsa/cli/dodo.py @@ -308,11 +308,13 @@ def build_parsed_workbook_cache() -> None: if os.environ.get("ISPYPSA_TEST_MOCK_CACHE", "").lower() == "true": # In test mode, just ensure cache directory exists and copy pre-existing files parsed_workbook_cache.mkdir(parents=True, exist_ok=True) - # Copy any existing test cache files if they don't already exist + # Copy any existing test cache files if they don't already exist. The + # cache is partitioned by workbook version on disk. test_cache_dir = ( Path(__file__).parent.parent.parent.parent / "tests" / "test_workbook_table_cache" + / version ) if test_cache_dir.exists(): for csv_file in test_cache_dir.glob("*.csv"): diff --git a/src/ispypsa/feature_flags.py b/src/ispypsa/feature_flags.py index 2370ff0a..3296c5bd 100644 --- a/src/ispypsa/feature_flags.py +++ b/src/ispypsa/feature_flags.py @@ -1,3 +1,4 @@ +import os from pathlib import Path import yaml @@ -6,3 +7,14 @@ with open(_flags_path) as f: FEATURE_FLAGS = yaml.safe_load(f) + +# Env-var overrides win over the YAML defaults. Used by tests that need to flip +# a flag for a subprocess CLI run, where monkeypatching the imported dict isn't +# an option. +_ENV_OVERRIDES = { + "use_new_table_format": "ISPYPSA_USE_NEW_TABLE_FORMAT", +} +for _flag, _env_var in _ENV_OVERRIDES.items(): + _value = os.environ.get(_env_var) + if _value is not None: + FEATURE_FLAGS[_flag] = _value.lower() == "true" diff --git a/tests/conftest.py b/tests/conftest.py index 5812d28e..53a8c7fb 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -7,7 +7,7 @@ @pytest.fixture(scope="module") def workbook_table_cache_test_path(): - return Path("tests", "test_workbook_table_cache") + return Path("tests", "test_workbook_table_cache", "6.0") @pytest.fixture diff --git a/tests/test_cli/cli_test_helpers.py b/tests/test_cli/cli_test_helpers.py index d258c156..922d1c13 100644 --- a/tests/test_cli/cli_test_helpers.py +++ b/tests/test_cli/cli_test_helpers.py @@ -50,26 +50,14 @@ def modify_config_value(config_path, key_path, new_value): yaml.dump(config, f) -@pytest.fixture -def prepare_test_cache(tmp_path, mock_workbook_file): - """Prepare test cache by copying from test_workbook_table_cache. - - Creates a complete cache directory with all required CSV files, - ensuring timestamps are newer than the workbook file so the cache - task considers itself up-to-date. - - Args: - tmp_path: pytest temporary directory - mock_workbook_file: Path to mock Excel workbook - - Returns: - Path: Path to the prepared cache directory - """ +def _populate_test_cache(tmp_path, mock_workbook_file, version): + """Copy the version-specific test cache CSVs into a tmp cache dir.""" cache_dir = tmp_path / "cache" cache_dir.mkdir(parents=True, exist_ok=True) - # Copy all CSV files from tests/test_workbook_table_cache to cache_dir - test_cache_dir = Path(__file__).parent.parent / "test_workbook_table_cache" + test_cache_dir = ( + Path(__file__).parent.parent / "test_workbook_table_cache" / version + ) for csv_file in test_cache_dir.glob("*.csv"): shutil.copy2(csv_file, cache_dir / csv_file.name) @@ -87,6 +75,23 @@ def prepare_test_cache(tmp_path, mock_workbook_file): return cache_dir +@pytest.fixture +def prepare_test_cache(tmp_path, mock_workbook_file): + """Prepare a 6.0-format test cache by copying from test_workbook_table_cache/6.0. + + Creates a complete cache directory with all required CSV files, + ensuring timestamps are newer than the workbook file so the cache + task considers itself up-to-date. + """ + return _populate_test_cache(tmp_path, mock_workbook_file, "6.0") + + +@pytest.fixture +def prepare_test_cache_new_format(tmp_path, mock_workbook_file): + """Prepare a 7.5 new-format test cache from test_workbook_table_cache/7.5.""" + return _populate_test_cache(tmp_path, mock_workbook_file, "7.5") + + @pytest.fixture def mock_workbook_file(tmp_path): """Create a minimal Excel workbook that passes basic validation. diff --git a/tests/test_cli/test_create_ispypsa_inputs.py b/tests/test_cli/test_create_ispypsa_inputs.py index 9755db5e..a935abd3 100644 --- a/tests/test_cli/test_create_ispypsa_inputs.py +++ b/tests/test_cli/test_create_ispypsa_inputs.py @@ -8,6 +8,7 @@ - CLI flags and dependency chain execution (combined) - Config path variations (combined) - Single task mode failure +- New-format end-to-end row counts and structural relationships (per granularity) """ import shutil @@ -29,6 +30,7 @@ mock_workbook_file, modify_config_value, prepare_test_cache, + prepare_test_cache_new_format, run_cli_command, run_extensive, verify_output_files, @@ -266,3 +268,200 @@ def test_single_task_mode_fails_without_deps(mock_config, tmp_path, run_cli_comm config_path = create_config_with_missing_cache(mock_config, tmp_path) result = run_cli_command([f"config={config_path}", "create_ispypsa_inputs", "-s"]) assert result.returncode != 0 + + +# ── New-format end-to-end row counts ─────────────────────────────────────────── +# +# Drives the new-format templater via the CLI for each regional granularity +# against a frozen 7.5 cache committed at tests/test_workbook_table_cache/7.5/. +# Per output table the assertions blend two kinds: +# +# - **Principled** — row counts derived from named entity constants below +# (e.g. paths = flow paths visible at granularity + REZs + parallel +# injections), plus referential-integrity invariants (every limit row +# references a path that exists; every cost row references an option). When +# these fire, the named constant tells you which structural quantity moved. +# - **Drift-detection** — pinned counts where a clean formula would just be +# templater logic in disguise. Currently only the expansion-cost row count +# falls in this bucket (per-option year coverage varies). Refresh by +# rerunning the test and pasting the failure value into the dict below. +# +# AEMO updates to the 7.5 workbook should force a deliberate review of every +# constant in this block. + +# Entity counts derived from the input cache. +_NUM_SUBREGIONS_75 = 15 +_NUM_REGIONS_75 = 5 +_NUM_REZS_75 = 47 +_NUM_FLOW_PATHS_75 = 18 + +# REZs whose row in `initial_transmission_limits` has all-NaN limit columns. +# Each collapses to a single placeholder row in network_transmission_path_limits +# instead of the usual `NUM_TIMESLICES × NUM_DIRECTIONS` rows. +_NUM_REZS_WITHOUT_LIMITS_75 = 15 + +# Flow paths in the 7.5 input whose augmentation key has no exact match in +# `flow_path_transfer_capability` and that therefore get a synthetic +# parallel-path row injected. Sub_regions only — at coarser granularities +# the parent path collapses, taking the injection with it. +_NUM_PARALLEL_PATHS_INJECTED_75_SUB_REGIONS = 1 + +# Flow paths whose endpoints sit in different NEM regions and therefore +# survive the nem_regions collapse. (The remaining 11 of 18 are intra-region.) +_NUM_INTER_REGIONAL_FLOW_PATHS_75 = 7 + +# REZ-only constraint relaxations (granularity-independent — they live on REZs +# and so survive every granularity collapse). One per REZ that has at least +# one augmentation option, capped at 8 in the 7.5 inputs. +_NUM_REZ_CONSTRAINT_OPTIONS_75 = 8 + +# Number of distinct flow-path expansion options surviving at each granularity +# (each emits a forward + reverse row in network_expansion_options, so they +# contribute 2× to the row count and 1× to the unique-id count). +_NUM_FLOW_PATH_OPTIONS_AT_GRANULARITY_75 = { + "sub_regions": 43, + "nem_regions": 34, + "single_region": 31, +} + +_NUM_TIMESLICES = 3 +_NUM_DIRECTIONS = 2 +_LIMIT_ROWS_PER_FULL_PATH = _NUM_TIMESLICES * _NUM_DIRECTIONS + +_GEOS_PER_GRANULARITY_75 = { + "sub_regions": _NUM_SUBREGIONS_75, + "nem_regions": _NUM_REGIONS_75, + "single_region": 1, +} + +_PATHS_PER_GRANULARITY_75 = { + "sub_regions": ( + _NUM_FLOW_PATHS_75 + _NUM_REZS_75 + _NUM_PARALLEL_PATHS_INJECTED_75_SUB_REGIONS + ), + "nem_regions": _NUM_INTER_REGIONAL_FLOW_PATHS_75 + _NUM_REZS_75, + "single_region": _NUM_REZS_75, +} + +# Drift-detection only — per-option year coverage varies. +_EXPECTED_EXPANSION_COST_ROWS_75 = { + "sub_regions": 1581, + "nem_regions": 1302, + "single_region": 1209, +} + + +def _write_new_format_config(tmp_path, mock_workbook_file, granularity): + """Write a 7.5 config tuned to drive the new-format templater for `granularity`.""" + config_path = tmp_path / f"new_format_config_{granularity}.yaml" + config_content = { + "scenario": "Step Change", + "wacc": 0.07, + "discount_rate": 0.05, + "network": { + "transmission_expansion": True, + "rez_transmission_expansion": True, + "annuitisation_lifetime": 30, + "nodes": {"regional_granularity": granularity, "rezs": "discrete_nodes"}, + "transmission_expansion_limit_override": None, + "rez_connection_expansion_limit_override": None, + "rez_to_sub_region_transmission_default_limit": 1e6, + }, + "temporal": { + "year_type": "fy", + "range": {"start_year": 2025, "end_year": 2026}, + "capacity_expansion": { + "resolution_min": 30, + "reference_year_cycle": [2018], + "investment_periods": [2025], + "aggregation": {"representative_weeks": [0]}, + }, + "operational": { + "resolution_min": 30, + "reference_year_cycle": [2018], + "horizon": 336, + "overlap": 48, + "aggregation": {"representative_weeks": [0]}, + }, + }, + "unserved_energy": {"cost": 10000.0, "max_per_node": 1e5}, + "solver": "highs", + "iasr_workbook_version": "7.5", + "paths": { + "ispypsa_run_name": "test_run", + "parsed_traces_directory": "tests/trace_data", + "parsed_workbook_cache": str(tmp_path / "cache"), + "workbook_path": str(mock_workbook_file), + "run_directory": str(tmp_path / "run_dir"), + }, + "trace_data": {"dataset_type": "example", "dateset_year": 2024}, + } + with open(config_path, "w") as f: + yaml.dump(config_content, f) + return config_path + + +@pytest.mark.parametrize("granularity", ["sub_regions", "nem_regions", "single_region"]) +def test_create_ispypsa_inputs_new_format( + granularity, + tmp_path, + mock_workbook_file, + prepare_test_cache_new_format, + run_cli_command, + monkeypatch, +): + monkeypatch.setenv("ISPYPSA_USE_NEW_TABLE_FORMAT", "true") + monkeypatch.setenv("ISPYPSA_TEST_MOCK_CACHE", "true") + + config_path = _write_new_format_config(tmp_path, mock_workbook_file, granularity) + + result = run_cli_command([f"config={config_path}", "create_ispypsa_inputs"]) + assert result.returncode == 0, ( + f"CLI failed for granularity={granularity}.\n" + f"STDOUT:\n{result.stdout}\nSTDERR:\n{result.stderr}" + ) + + output_dir = tmp_path / "run_dir" / "test_run" / "ispypsa_inputs" + geo = pd.read_csv(output_dir / "network_geography.csv") + paths = pd.read_csv(output_dir / "network_transmission_paths.csv") + limits = pd.read_csv(output_dir / "network_transmission_path_limits.csv") + options = pd.read_csv(output_dir / "network_expansion_options.csv") + costs = pd.read_csv(output_dir / "network_transmission_path_expansion_costs.csv") + + # network_geography — one row per (sub-)region or REZ; geo_ids are unique. + assert len(geo) == _GEOS_PER_GRANULARITY_75[granularity] + _NUM_REZS_75 + assert geo["geo_id"].is_unique + + # network_transmission_paths — derived from named structural quantities: + # sub_regions = flow paths + REZ connections + parallel-path injections; + # nem_regions drops intra-region flow paths; single_region drops them all. + expected_paths = _PATHS_PER_GRANULARITY_75[granularity] + assert len(paths) == expected_paths + assert paths["path_id"].is_unique + # Every geo participates in at least one path (no isolated nodes). + assert set(paths["geo_from"]) | set(paths["geo_to"]) == set(geo["geo_id"]) + + # network_transmission_path_limits — paths with full limit data emit + # NUM_TIMESLICES × NUM_DIRECTIONS rows; the REZs whose initial-limit row is + # all-NaN collapse to a single placeholder row. + expected_limits = ( + expected_paths - _NUM_REZS_WITHOUT_LIMITS_75 + ) * _LIMIT_ROWS_PER_FULL_PATH + _NUM_REZS_WITHOUT_LIMITS_75 + assert len(limits) == expected_limits + # Every path has at least one limit row; no orphan limits. + assert set(limits["path_id"]) == set(paths["path_id"]) + + # network_expansion_options — each surviving flow-path option emits paired + # forward + reverse rows sharing one expansion_id; REZ constraint + # relaxations contribute one row (and one id) each. + num_fp_options = _NUM_FLOW_PATH_OPTIONS_AT_GRANULARITY_75[granularity] + assert len(options) == 2 * num_fp_options + _NUM_REZ_CONSTRAINT_OPTIONS_75 + assert ( + options["expansion_id"].nunique() + == num_fp_options + _NUM_REZ_CONSTRAINT_OPTIONS_75 + ) + + # network_transmission_path_expansion_costs — every option has cost rows; + # no orphan costs. Total row count is drift-only (per-option year coverage + # is uneven). + assert set(costs["expansion_id"]) == set(options["expansion_id"]) + assert len(costs) == _EXPECTED_EXPANSION_COST_ROWS_75[granularity] diff --git a/tests/test_workbook_table_cache/additional_projects_summary.csv b/tests/test_workbook_table_cache/6.0/additional_projects_summary.csv similarity index 100% rename from tests/test_workbook_table_cache/additional_projects_summary.csv rename to tests/test_workbook_table_cache/6.0/additional_projects_summary.csv diff --git a/tests/test_workbook_table_cache/anticipated_projects_summary.csv b/tests/test_workbook_table_cache/6.0/anticipated_projects_summary.csv similarity index 100% rename from tests/test_workbook_table_cache/anticipated_projects_summary.csv rename to tests/test_workbook_table_cache/6.0/anticipated_projects_summary.csv diff --git a/tests/test_workbook_table_cache/auxiliary_load_existing_committed_anticipated_additional_generators.csv b/tests/test_workbook_table_cache/6.0/auxiliary_load_existing_committed_anticipated_additional_generators.csv similarity index 100% rename from tests/test_workbook_table_cache/auxiliary_load_existing_committed_anticipated_additional_generators.csv rename to tests/test_workbook_table_cache/6.0/auxiliary_load_existing_committed_anticipated_additional_generators.csv diff --git a/tests/test_workbook_table_cache/auxiliary_load_new_entrants.csv b/tests/test_workbook_table_cache/6.0/auxiliary_load_new_entrants.csv similarity index 100% rename from tests/test_workbook_table_cache/auxiliary_load_new_entrants.csv rename to tests/test_workbook_table_cache/6.0/auxiliary_load_new_entrants.csv diff --git a/tests/test_workbook_table_cache/batteries_summary.csv b/tests/test_workbook_table_cache/6.0/batteries_summary.csv similarity index 100% rename from tests/test_workbook_table_cache/batteries_summary.csv rename to tests/test_workbook_table_cache/6.0/batteries_summary.csv diff --git a/tests/test_workbook_table_cache/battery_properties.csv b/tests/test_workbook_table_cache/6.0/battery_properties.csv similarity index 100% rename from tests/test_workbook_table_cache/battery_properties.csv rename to tests/test_workbook_table_cache/6.0/battery_properties.csv diff --git a/tests/test_workbook_table_cache/biomass_prices.csv b/tests/test_workbook_table_cache/6.0/biomass_prices.csv similarity index 100% rename from tests/test_workbook_table_cache/biomass_prices.csv rename to tests/test_workbook_table_cache/6.0/biomass_prices.csv diff --git a/tests/test_workbook_table_cache/biomethane_prices.csv b/tests/test_workbook_table_cache/6.0/biomethane_prices.csv similarity index 100% rename from tests/test_workbook_table_cache/biomethane_prices.csv rename to tests/test_workbook_table_cache/6.0/biomethane_prices.csv diff --git a/tests/test_workbook_table_cache/build_costs_current_policies.csv b/tests/test_workbook_table_cache/6.0/build_costs_current_policies.csv similarity index 100% rename from tests/test_workbook_table_cache/build_costs_current_policies.csv rename to tests/test_workbook_table_cache/6.0/build_costs_current_policies.csv diff --git a/tests/test_workbook_table_cache/build_costs_global_nze_by_2050.csv b/tests/test_workbook_table_cache/6.0/build_costs_global_nze_by_2050.csv similarity index 100% rename from tests/test_workbook_table_cache/build_costs_global_nze_by_2050.csv rename to tests/test_workbook_table_cache/6.0/build_costs_global_nze_by_2050.csv diff --git a/tests/test_workbook_table_cache/build_costs_global_nze_post_2050.csv b/tests/test_workbook_table_cache/6.0/build_costs_global_nze_post_2050.csv similarity index 100% rename from tests/test_workbook_table_cache/build_costs_global_nze_post_2050.csv rename to tests/test_workbook_table_cache/6.0/build_costs_global_nze_post_2050.csv diff --git a/tests/test_workbook_table_cache/build_costs_pumped_hydro.csv b/tests/test_workbook_table_cache/6.0/build_costs_pumped_hydro.csv similarity index 100% rename from tests/test_workbook_table_cache/build_costs_pumped_hydro.csv rename to tests/test_workbook_table_cache/6.0/build_costs_pumped_hydro.csv diff --git a/tests/test_workbook_table_cache/build_costs_scenario_mapping.csv b/tests/test_workbook_table_cache/6.0/build_costs_scenario_mapping.csv similarity index 100% rename from tests/test_workbook_table_cache/build_costs_scenario_mapping.csv rename to tests/test_workbook_table_cache/6.0/build_costs_scenario_mapping.csv diff --git a/tests/test_workbook_table_cache/capacity_investment_scheme_renewable_trajectory.csv b/tests/test_workbook_table_cache/6.0/capacity_investment_scheme_renewable_trajectory.csv similarity index 100% rename from tests/test_workbook_table_cache/capacity_investment_scheme_renewable_trajectory.csv rename to tests/test_workbook_table_cache/6.0/capacity_investment_scheme_renewable_trajectory.csv diff --git a/tests/test_workbook_table_cache/capacity_investment_scheme_storage_trajectory.csv b/tests/test_workbook_table_cache/6.0/capacity_investment_scheme_storage_trajectory.csv similarity index 100% rename from tests/test_workbook_table_cache/capacity_investment_scheme_storage_trajectory.csv rename to tests/test_workbook_table_cache/6.0/capacity_investment_scheme_storage_trajectory.csv diff --git a/tests/test_workbook_table_cache/coal_and_biomass_price_consultant_scenario_mapping.csv b/tests/test_workbook_table_cache/6.0/coal_and_biomass_price_consultant_scenario_mapping.csv similarity index 100% rename from tests/test_workbook_table_cache/coal_and_biomass_price_consultant_scenario_mapping.csv rename to tests/test_workbook_table_cache/6.0/coal_and_biomass_price_consultant_scenario_mapping.csv diff --git a/tests/test_workbook_table_cache/coal_minimum_stable_level.csv b/tests/test_workbook_table_cache/6.0/coal_minimum_stable_level.csv similarity index 100% rename from tests/test_workbook_table_cache/coal_minimum_stable_level.csv rename to tests/test_workbook_table_cache/6.0/coal_minimum_stable_level.csv diff --git a/tests/test_workbook_table_cache/coal_prices_green_energy_exports.csv b/tests/test_workbook_table_cache/6.0/coal_prices_green_energy_exports.csv similarity index 100% rename from tests/test_workbook_table_cache/coal_prices_green_energy_exports.csv rename to tests/test_workbook_table_cache/6.0/coal_prices_green_energy_exports.csv diff --git a/tests/test_workbook_table_cache/coal_prices_progressive_change.csv b/tests/test_workbook_table_cache/6.0/coal_prices_progressive_change.csv similarity index 100% rename from tests/test_workbook_table_cache/coal_prices_progressive_change.csv rename to tests/test_workbook_table_cache/6.0/coal_prices_progressive_change.csv diff --git a/tests/test_workbook_table_cache/coal_prices_step_change.csv b/tests/test_workbook_table_cache/6.0/coal_prices_step_change.csv similarity index 100% rename from tests/test_workbook_table_cache/coal_prices_step_change.csv rename to tests/test_workbook_table_cache/6.0/coal_prices_step_change.csv diff --git a/tests/test_workbook_table_cache/committed_generators_summary.csv b/tests/test_workbook_table_cache/6.0/committed_generators_summary.csv similarity index 100% rename from tests/test_workbook_table_cache/committed_generators_summary.csv rename to tests/test_workbook_table_cache/6.0/committed_generators_summary.csv diff --git a/tests/test_workbook_table_cache/connection_cost_forecast_non_rez_progressive_change.csv b/tests/test_workbook_table_cache/6.0/connection_cost_forecast_non_rez_progressive_change.csv similarity index 100% rename from tests/test_workbook_table_cache/connection_cost_forecast_non_rez_progressive_change.csv rename to tests/test_workbook_table_cache/6.0/connection_cost_forecast_non_rez_progressive_change.csv diff --git a/tests/test_workbook_table_cache/connection_cost_forecast_non_rez_step_change&green_energy_exports.csv b/tests/test_workbook_table_cache/6.0/connection_cost_forecast_non_rez_step_change&green_energy_exports.csv similarity index 100% rename from tests/test_workbook_table_cache/connection_cost_forecast_non_rez_step_change&green_energy_exports.csv rename to tests/test_workbook_table_cache/6.0/connection_cost_forecast_non_rez_step_change&green_energy_exports.csv diff --git a/tests/test_workbook_table_cache/connection_cost_forecast_wind_and_solar_progressive_change.csv b/tests/test_workbook_table_cache/6.0/connection_cost_forecast_wind_and_solar_progressive_change.csv similarity index 100% rename from tests/test_workbook_table_cache/connection_cost_forecast_wind_and_solar_progressive_change.csv rename to tests/test_workbook_table_cache/6.0/connection_cost_forecast_wind_and_solar_progressive_change.csv diff --git a/tests/test_workbook_table_cache/connection_cost_forecast_wind_and_solar_step_change&green_energy_exports.csv b/tests/test_workbook_table_cache/6.0/connection_cost_forecast_wind_and_solar_step_change&green_energy_exports.csv similarity index 100% rename from tests/test_workbook_table_cache/connection_cost_forecast_wind_and_solar_step_change&green_energy_exports.csv rename to tests/test_workbook_table_cache/6.0/connection_cost_forecast_wind_and_solar_step_change&green_energy_exports.csv diff --git a/tests/test_workbook_table_cache/connection_costs_for_wind_and_solar.csv b/tests/test_workbook_table_cache/6.0/connection_costs_for_wind_and_solar.csv similarity index 100% rename from tests/test_workbook_table_cache/connection_costs_for_wind_and_solar.csv rename to tests/test_workbook_table_cache/6.0/connection_costs_for_wind_and_solar.csv diff --git a/tests/test_workbook_table_cache/connection_costs_other.csv b/tests/test_workbook_table_cache/6.0/connection_costs_other.csv similarity index 100% rename from tests/test_workbook_table_cache/connection_costs_other.csv rename to tests/test_workbook_table_cache/6.0/connection_costs_other.csv diff --git a/tests/test_workbook_table_cache/existing_generators_summary.csv b/tests/test_workbook_table_cache/6.0/existing_generators_summary.csv similarity index 100% rename from tests/test_workbook_table_cache/existing_generators_summary.csv rename to tests/test_workbook_table_cache/6.0/existing_generators_summary.csv diff --git a/tests/test_workbook_table_cache/expected_closure_years.csv b/tests/test_workbook_table_cache/6.0/expected_closure_years.csv similarity index 100% rename from tests/test_workbook_table_cache/expected_closure_years.csv rename to tests/test_workbook_table_cache/6.0/expected_closure_years.csv diff --git a/tests/test_workbook_table_cache/fixed_opex_existing_committed_anticipated_additional_generators.csv b/tests/test_workbook_table_cache/6.0/fixed_opex_existing_committed_anticipated_additional_generators.csv similarity index 100% rename from tests/test_workbook_table_cache/fixed_opex_existing_committed_anticipated_additional_generators.csv rename to tests/test_workbook_table_cache/6.0/fixed_opex_existing_committed_anticipated_additional_generators.csv diff --git a/tests/test_workbook_table_cache/fixed_opex_new_entrants.csv b/tests/test_workbook_table_cache/6.0/fixed_opex_new_entrants.csv similarity index 100% rename from tests/test_workbook_table_cache/fixed_opex_new_entrants.csv rename to tests/test_workbook_table_cache/6.0/fixed_opex_new_entrants.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_CNSW-NNSW.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_CNSW-NNSW.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_CNSW-NNSW.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_CNSW-NNSW.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_CNSW-SNW.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_CNSW-SNW.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_CNSW-SNW.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_CNSW-SNW.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_CQ-GG.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_CQ-GG.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_CQ-GG.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_CQ-GG.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_CQ-NQ.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_CQ-NQ.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_CQ-NQ.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_CQ-NQ.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_NNSW-SQ.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_NNSW-SQ.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_NNSW-SQ.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_NNSW-SQ.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_SESA-CSA.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_SESA-CSA.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_SESA-CSA.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_SESA-CSA.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_SNSW-CNSW.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_SNSW-CNSW.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_SNSW-CNSW.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_SNSW-CNSW.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_SQ-CQ.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_SQ-CQ.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_SQ-CQ.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_SQ-CQ.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_TAS-VIC.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_TAS-VIC.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_TAS-VIC.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_TAS-VIC.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_VIC-SESA.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_VIC-SESA.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_VIC-SESA.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_VIC-SESA.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_VIC-SNSW.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_VIC-SNSW.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_VIC-SNSW.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_VIC-SNSW.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_actionable_isp_projects.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_actionable_isp_projects.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_actionable_isp_projects.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_actionable_isp_projects.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_preparatory_activities.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_preparatory_activities.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_progressive_change_preparatory_activities.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_progressive_change_preparatory_activities.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_CNSW-NNSW.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_CNSW-NNSW.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_CNSW-NNSW.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_CNSW-NNSW.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_CNSW-SNW.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_CNSW-SNW.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_CNSW-SNW.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_CNSW-SNW.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_CQ-GG.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_CQ-GG.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_CQ-GG.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_CQ-GG.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_CQ-NQ.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_CQ-NQ.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_CQ-NQ.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_CQ-NQ.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_NNSW-SQ.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_NNSW-SQ.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_NNSW-SQ.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_NNSW-SQ.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_SESA-CSA.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_SESA-CSA.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_SESA-CSA.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_SESA-CSA.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_SNSW-CNSW.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_SNSW-CNSW.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_SNSW-CNSW.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_SNSW-CNSW.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_SQ-CQ.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_SQ-CQ.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_SQ-CQ.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_SQ-CQ.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_TAS-VIC.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_TAS-VIC.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_TAS-VIC.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_TAS-VIC.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_VIC-SESA.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_VIC-SESA.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_VIC-SESA.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_VIC-SESA.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_VIC-SNSW.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_VIC-SNSW.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_VIC-SNSW.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_VIC-SNSW.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_actionable_isp_projects.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_actionable_isp_projects.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_actionable_isp_projects.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_actionable_isp_projects.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_preparatory_activities.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_preparatory_activities.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_costs_step_change_and_green_energy_exports_preparatory_activities.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_costs_step_change_and_green_energy_exports_preparatory_activities.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_options_CNSW-NNSW.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_CNSW-NNSW.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_options_CNSW-NNSW.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_CNSW-NNSW.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_options_CNSW-SNW.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_CNSW-SNW.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_options_CNSW-SNW.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_CNSW-SNW.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_options_CQ-GG.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_CQ-GG.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_options_CQ-GG.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_CQ-GG.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_options_CQ-NQ.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_CQ-NQ.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_options_CQ-NQ.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_CQ-NQ.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_options_NNSW-SQ.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_NNSW-SQ.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_options_NNSW-SQ.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_NNSW-SQ.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_options_SESA-CSA.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_SESA-CSA.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_options_SESA-CSA.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_SESA-CSA.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_options_SNSW-CNSW.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_SNSW-CNSW.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_options_SNSW-CNSW.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_SNSW-CNSW.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_options_SQ-CQ.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_SQ-CQ.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_options_SQ-CQ.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_SQ-CQ.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_options_TAS-VIC.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_TAS-VIC.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_options_TAS-VIC.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_TAS-VIC.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_options_VIC-SESA.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_VIC-SESA.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_options_VIC-SESA.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_VIC-SESA.csv diff --git a/tests/test_workbook_table_cache/flow_path_augmentation_options_VIC-SNSW.csv b/tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_VIC-SNSW.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_augmentation_options_VIC-SNSW.csv rename to tests/test_workbook_table_cache/6.0/flow_path_augmentation_options_VIC-SNSW.csv diff --git a/tests/test_workbook_table_cache/flow_path_transfer_capability.csv b/tests/test_workbook_table_cache/6.0/flow_path_transfer_capability.csv similarity index 100% rename from tests/test_workbook_table_cache/flow_path_transfer_capability.csv rename to tests/test_workbook_table_cache/6.0/flow_path_transfer_capability.csv diff --git a/tests/test_workbook_table_cache/full_outages_forecast_existing_generators.csv b/tests/test_workbook_table_cache/6.0/full_outages_forecast_existing_generators.csv similarity index 100% rename from tests/test_workbook_table_cache/full_outages_forecast_existing_generators.csv rename to tests/test_workbook_table_cache/6.0/full_outages_forecast_existing_generators.csv diff --git a/tests/test_workbook_table_cache/gas_prices_green_energy_exports.csv b/tests/test_workbook_table_cache/6.0/gas_prices_green_energy_exports.csv similarity index 100% rename from tests/test_workbook_table_cache/gas_prices_green_energy_exports.csv rename to tests/test_workbook_table_cache/6.0/gas_prices_green_energy_exports.csv diff --git a/tests/test_workbook_table_cache/gas_prices_progressive_change.csv b/tests/test_workbook_table_cache/6.0/gas_prices_progressive_change.csv similarity index 100% rename from tests/test_workbook_table_cache/gas_prices_progressive_change.csv rename to tests/test_workbook_table_cache/6.0/gas_prices_progressive_change.csv diff --git a/tests/test_workbook_table_cache/gas_prices_step_change.csv b/tests/test_workbook_table_cache/6.0/gas_prices_step_change.csv similarity index 100% rename from tests/test_workbook_table_cache/gas_prices_step_change.csv rename to tests/test_workbook_table_cache/6.0/gas_prices_step_change.csv diff --git a/tests/test_workbook_table_cache/gpg_emissions_reduction_biomethane.csv b/tests/test_workbook_table_cache/6.0/gpg_emissions_reduction_biomethane.csv similarity index 100% rename from tests/test_workbook_table_cache/gpg_emissions_reduction_biomethane.csv rename to tests/test_workbook_table_cache/6.0/gpg_emissions_reduction_biomethane.csv diff --git a/tests/test_workbook_table_cache/gpg_emissions_reduction_h2_kogan.csv b/tests/test_workbook_table_cache/6.0/gpg_emissions_reduction_h2_kogan.csv similarity index 100% rename from tests/test_workbook_table_cache/gpg_emissions_reduction_h2_kogan.csv rename to tests/test_workbook_table_cache/6.0/gpg_emissions_reduction_h2_kogan.csv diff --git a/tests/test_workbook_table_cache/gpg_emissions_reduction_h2_sa_turbine.csv b/tests/test_workbook_table_cache/6.0/gpg_emissions_reduction_h2_sa_turbine.csv similarity index 100% rename from tests/test_workbook_table_cache/gpg_emissions_reduction_h2_sa_turbine.csv rename to tests/test_workbook_table_cache/6.0/gpg_emissions_reduction_h2_sa_turbine.csv diff --git a/tests/test_workbook_table_cache/gpg_min_stable_level_existing_generators.csv b/tests/test_workbook_table_cache/6.0/gpg_min_stable_level_existing_generators.csv similarity index 100% rename from tests/test_workbook_table_cache/gpg_min_stable_level_existing_generators.csv rename to tests/test_workbook_table_cache/6.0/gpg_min_stable_level_existing_generators.csv diff --git a/tests/test_workbook_table_cache/gpg_min_stable_level_new_entrants.csv b/tests/test_workbook_table_cache/6.0/gpg_min_stable_level_new_entrants.csv similarity index 100% rename from tests/test_workbook_table_cache/gpg_min_stable_level_new_entrants.csv rename to tests/test_workbook_table_cache/6.0/gpg_min_stable_level_new_entrants.csv diff --git a/tests/test_workbook_table_cache/heat_rates_existing_committed_anticipated_additional_generators.csv b/tests/test_workbook_table_cache/6.0/heat_rates_existing_committed_anticipated_additional_generators.csv similarity index 100% rename from tests/test_workbook_table_cache/heat_rates_existing_committed_anticipated_additional_generators.csv rename to tests/test_workbook_table_cache/6.0/heat_rates_existing_committed_anticipated_additional_generators.csv diff --git a/tests/test_workbook_table_cache/heat_rates_new_entrants.csv b/tests/test_workbook_table_cache/6.0/heat_rates_new_entrants.csv similarity index 100% rename from tests/test_workbook_table_cache/heat_rates_new_entrants.csv rename to tests/test_workbook_table_cache/6.0/heat_rates_new_entrants.csv diff --git a/tests/test_workbook_table_cache/hydrogen_prices.csv b/tests/test_workbook_table_cache/6.0/hydrogen_prices.csv similarity index 100% rename from tests/test_workbook_table_cache/hydrogen_prices.csv rename to tests/test_workbook_table_cache/6.0/hydrogen_prices.csv diff --git a/tests/test_workbook_table_cache/initial_build_limits.csv b/tests/test_workbook_table_cache/6.0/initial_build_limits.csv similarity index 100% rename from tests/test_workbook_table_cache/initial_build_limits.csv rename to tests/test_workbook_table_cache/6.0/initial_build_limits.csv diff --git a/tests/test_workbook_table_cache/interconnector_transfer_capability.csv b/tests/test_workbook_table_cache/6.0/interconnector_transfer_capability.csv similarity index 100% rename from tests/test_workbook_table_cache/interconnector_transfer_capability.csv rename to tests/test_workbook_table_cache/6.0/interconnector_transfer_capability.csv diff --git a/tests/test_workbook_table_cache/lead_time_and_project_life.csv b/tests/test_workbook_table_cache/6.0/lead_time_and_project_life.csv similarity index 100% rename from tests/test_workbook_table_cache/lead_time_and_project_life.csv rename to tests/test_workbook_table_cache/6.0/lead_time_and_project_life.csv diff --git a/tests/test_workbook_table_cache/liquid_fuel_prices.csv b/tests/test_workbook_table_cache/6.0/liquid_fuel_prices.csv similarity index 100% rename from tests/test_workbook_table_cache/liquid_fuel_prices.csv rename to tests/test_workbook_table_cache/6.0/liquid_fuel_prices.csv diff --git a/tests/test_workbook_table_cache/locational_cost_factors.csv b/tests/test_workbook_table_cache/6.0/locational_cost_factors.csv similarity index 100% rename from tests/test_workbook_table_cache/locational_cost_factors.csv rename to tests/test_workbook_table_cache/6.0/locational_cost_factors.csv diff --git a/tests/test_workbook_table_cache/long_duration_outages_existing_generators.csv b/tests/test_workbook_table_cache/6.0/long_duration_outages_existing_generators.csv similarity index 100% rename from tests/test_workbook_table_cache/long_duration_outages_existing_generators.csv rename to tests/test_workbook_table_cache/6.0/long_duration_outages_existing_generators.csv diff --git a/tests/test_workbook_table_cache/maintenance_existing_generators.csv b/tests/test_workbook_table_cache/6.0/maintenance_existing_generators.csv similarity index 100% rename from tests/test_workbook_table_cache/maintenance_existing_generators.csv rename to tests/test_workbook_table_cache/6.0/maintenance_existing_generators.csv diff --git a/tests/test_workbook_table_cache/maintenance_new_entrants.csv b/tests/test_workbook_table_cache/6.0/maintenance_new_entrants.csv similarity index 100% rename from tests/test_workbook_table_cache/maintenance_new_entrants.csv rename to tests/test_workbook_table_cache/6.0/maintenance_new_entrants.csv diff --git a/tests/test_workbook_table_cache/marginal_loss_factors_additional_projects.csv b/tests/test_workbook_table_cache/6.0/marginal_loss_factors_additional_projects.csv similarity index 100% rename from tests/test_workbook_table_cache/marginal_loss_factors_additional_projects.csv rename to tests/test_workbook_table_cache/6.0/marginal_loss_factors_additional_projects.csv diff --git a/tests/test_workbook_table_cache/marginal_loss_factors_anticipated_projects.csv b/tests/test_workbook_table_cache/6.0/marginal_loss_factors_anticipated_projects.csv similarity index 100% rename from tests/test_workbook_table_cache/marginal_loss_factors_anticipated_projects.csv rename to tests/test_workbook_table_cache/6.0/marginal_loss_factors_anticipated_projects.csv diff --git a/tests/test_workbook_table_cache/marginal_loss_factors_committed_generators.csv b/tests/test_workbook_table_cache/6.0/marginal_loss_factors_committed_generators.csv similarity index 100% rename from tests/test_workbook_table_cache/marginal_loss_factors_committed_generators.csv rename to tests/test_workbook_table_cache/6.0/marginal_loss_factors_committed_generators.csv diff --git a/tests/test_workbook_table_cache/marginal_loss_factors_existing_committed_and_anticipated_batteries.csv b/tests/test_workbook_table_cache/6.0/marginal_loss_factors_existing_committed_and_anticipated_batteries.csv similarity index 100% rename from tests/test_workbook_table_cache/marginal_loss_factors_existing_committed_and_anticipated_batteries.csv rename to tests/test_workbook_table_cache/6.0/marginal_loss_factors_existing_committed_and_anticipated_batteries.csv diff --git a/tests/test_workbook_table_cache/marginal_loss_factors_existing_generators.csv b/tests/test_workbook_table_cache/6.0/marginal_loss_factors_existing_generators.csv similarity index 100% rename from tests/test_workbook_table_cache/marginal_loss_factors_existing_generators.csv rename to tests/test_workbook_table_cache/6.0/marginal_loss_factors_existing_generators.csv diff --git a/tests/test_workbook_table_cache/marginal_loss_factors_new_entrants.csv b/tests/test_workbook_table_cache/6.0/marginal_loss_factors_new_entrants.csv similarity index 100% rename from tests/test_workbook_table_cache/marginal_loss_factors_new_entrants.csv rename to tests/test_workbook_table_cache/6.0/marginal_loss_factors_new_entrants.csv diff --git a/tests/test_workbook_table_cache/maximum_capacity_additional_projects.csv b/tests/test_workbook_table_cache/6.0/maximum_capacity_additional_projects.csv similarity index 100% rename from tests/test_workbook_table_cache/maximum_capacity_additional_projects.csv rename to tests/test_workbook_table_cache/6.0/maximum_capacity_additional_projects.csv diff --git a/tests/test_workbook_table_cache/maximum_capacity_anticipated_projects.csv b/tests/test_workbook_table_cache/6.0/maximum_capacity_anticipated_projects.csv similarity index 100% rename from tests/test_workbook_table_cache/maximum_capacity_anticipated_projects.csv rename to tests/test_workbook_table_cache/6.0/maximum_capacity_anticipated_projects.csv diff --git a/tests/test_workbook_table_cache/maximum_capacity_committed_generators.csv b/tests/test_workbook_table_cache/6.0/maximum_capacity_committed_generators.csv similarity index 100% rename from tests/test_workbook_table_cache/maximum_capacity_committed_generators.csv rename to tests/test_workbook_table_cache/6.0/maximum_capacity_committed_generators.csv diff --git a/tests/test_workbook_table_cache/maximum_capacity_existing_committed_and_anticipated_batteries.csv b/tests/test_workbook_table_cache/6.0/maximum_capacity_existing_committed_and_anticipated_batteries.csv similarity index 100% rename from tests/test_workbook_table_cache/maximum_capacity_existing_committed_and_anticipated_batteries.csv rename to tests/test_workbook_table_cache/6.0/maximum_capacity_existing_committed_and_anticipated_batteries.csv diff --git a/tests/test_workbook_table_cache/maximum_capacity_existing_generators.csv b/tests/test_workbook_table_cache/6.0/maximum_capacity_existing_generators.csv similarity index 100% rename from tests/test_workbook_table_cache/maximum_capacity_existing_generators.csv rename to tests/test_workbook_table_cache/6.0/maximum_capacity_existing_generators.csv diff --git a/tests/test_workbook_table_cache/maximum_capacity_new_entrants.csv b/tests/test_workbook_table_cache/6.0/maximum_capacity_new_entrants.csv similarity index 100% rename from tests/test_workbook_table_cache/maximum_capacity_new_entrants.csv rename to tests/test_workbook_table_cache/6.0/maximum_capacity_new_entrants.csv diff --git a/tests/test_workbook_table_cache/new_entrants_summary.csv b/tests/test_workbook_table_cache/6.0/new_entrants_summary.csv similarity index 100% rename from tests/test_workbook_table_cache/new_entrants_summary.csv rename to tests/test_workbook_table_cache/6.0/new_entrants_summary.csv diff --git a/tests/test_workbook_table_cache/nsw_roadmap_renewable_trajectory.csv b/tests/test_workbook_table_cache/6.0/nsw_roadmap_renewable_trajectory.csv similarity index 100% rename from tests/test_workbook_table_cache/nsw_roadmap_renewable_trajectory.csv rename to tests/test_workbook_table_cache/6.0/nsw_roadmap_renewable_trajectory.csv diff --git a/tests/test_workbook_table_cache/nsw_roadmap_storage_trajectory.csv b/tests/test_workbook_table_cache/6.0/nsw_roadmap_storage_trajectory.csv similarity index 100% rename from tests/test_workbook_table_cache/nsw_roadmap_storage_trajectory.csv rename to tests/test_workbook_table_cache/6.0/nsw_roadmap_storage_trajectory.csv diff --git a/tests/test_workbook_table_cache/outages_2023-2024_existing_generators.csv b/tests/test_workbook_table_cache/6.0/outages_2023-2024_existing_generators.csv similarity index 100% rename from tests/test_workbook_table_cache/outages_2023-2024_existing_generators.csv rename to tests/test_workbook_table_cache/6.0/outages_2023-2024_existing_generators.csv diff --git a/tests/test_workbook_table_cache/outages_new_entrants.csv b/tests/test_workbook_table_cache/6.0/outages_new_entrants.csv similarity index 100% rename from tests/test_workbook_table_cache/outages_new_entrants.csv rename to tests/test_workbook_table_cache/6.0/outages_new_entrants.csv diff --git a/tests/test_workbook_table_cache/partial_outages_forecast_existing_generators.csv b/tests/test_workbook_table_cache/6.0/partial_outages_forecast_existing_generators.csv similarity index 100% rename from tests/test_workbook_table_cache/partial_outages_forecast_existing_generators.csv rename to tests/test_workbook_table_cache/6.0/partial_outages_forecast_existing_generators.csv diff --git a/tests/test_workbook_table_cache/powering_australia_plan_trajectory.csv b/tests/test_workbook_table_cache/6.0/powering_australia_plan_trajectory.csv similarity index 100% rename from tests/test_workbook_table_cache/powering_australia_plan_trajectory.csv rename to tests/test_workbook_table_cache/6.0/powering_australia_plan_trajectory.csv diff --git a/tests/test_workbook_table_cache/qld_renewable_target_trajectory.csv b/tests/test_workbook_table_cache/6.0/qld_renewable_target_trajectory.csv similarity index 100% rename from tests/test_workbook_table_cache/qld_renewable_target_trajectory.csv rename to tests/test_workbook_table_cache/6.0/qld_renewable_target_trajectory.csv diff --git a/tests/test_workbook_table_cache/regional_reference_nodes.csv b/tests/test_workbook_table_cache/6.0/regional_reference_nodes.csv similarity index 100% rename from tests/test_workbook_table_cache/regional_reference_nodes.csv rename to tests/test_workbook_table_cache/6.0/regional_reference_nodes.csv diff --git a/tests/test_workbook_table_cache/regional_topology_representation.csv b/tests/test_workbook_table_cache/6.0/regional_topology_representation.csv similarity index 100% rename from tests/test_workbook_table_cache/regional_topology_representation.csv rename to tests/test_workbook_table_cache/6.0/regional_topology_representation.csv diff --git a/tests/test_workbook_table_cache/renewable_energy_zones.csv b/tests/test_workbook_table_cache/6.0/renewable_energy_zones.csv similarity index 100% rename from tests/test_workbook_table_cache/renewable_energy_zones.csv rename to tests/test_workbook_table_cache/6.0/renewable_energy_zones.csv diff --git a/tests/test_workbook_table_cache/rez_augmentation_costs_progressive_change_NSW.csv b/tests/test_workbook_table_cache/6.0/rez_augmentation_costs_progressive_change_NSW.csv similarity index 100% rename from tests/test_workbook_table_cache/rez_augmentation_costs_progressive_change_NSW.csv rename to tests/test_workbook_table_cache/6.0/rez_augmentation_costs_progressive_change_NSW.csv diff --git a/tests/test_workbook_table_cache/rez_augmentation_costs_progressive_change_QLD.csv b/tests/test_workbook_table_cache/6.0/rez_augmentation_costs_progressive_change_QLD.csv similarity index 100% rename from tests/test_workbook_table_cache/rez_augmentation_costs_progressive_change_QLD.csv rename to tests/test_workbook_table_cache/6.0/rez_augmentation_costs_progressive_change_QLD.csv diff --git a/tests/test_workbook_table_cache/rez_augmentation_costs_progressive_change_SA.csv b/tests/test_workbook_table_cache/6.0/rez_augmentation_costs_progressive_change_SA.csv similarity index 100% rename from tests/test_workbook_table_cache/rez_augmentation_costs_progressive_change_SA.csv rename to tests/test_workbook_table_cache/6.0/rez_augmentation_costs_progressive_change_SA.csv diff --git a/tests/test_workbook_table_cache/rez_augmentation_costs_progressive_change_TAS.csv b/tests/test_workbook_table_cache/6.0/rez_augmentation_costs_progressive_change_TAS.csv similarity index 100% rename from tests/test_workbook_table_cache/rez_augmentation_costs_progressive_change_TAS.csv rename to tests/test_workbook_table_cache/6.0/rez_augmentation_costs_progressive_change_TAS.csv diff --git a/tests/test_workbook_table_cache/rez_augmentation_costs_progressive_change_VIC.csv b/tests/test_workbook_table_cache/6.0/rez_augmentation_costs_progressive_change_VIC.csv similarity index 100% rename from tests/test_workbook_table_cache/rez_augmentation_costs_progressive_change_VIC.csv rename to tests/test_workbook_table_cache/6.0/rez_augmentation_costs_progressive_change_VIC.csv diff --git a/tests/test_workbook_table_cache/rez_augmentation_costs_progressive_change_preparatory_activities.csv b/tests/test_workbook_table_cache/6.0/rez_augmentation_costs_progressive_change_preparatory_activities.csv similarity index 100% rename from tests/test_workbook_table_cache/rez_augmentation_costs_progressive_change_preparatory_activities.csv rename to tests/test_workbook_table_cache/6.0/rez_augmentation_costs_progressive_change_preparatory_activities.csv diff --git a/tests/test_workbook_table_cache/rez_augmentation_costs_step_change_and_green_energy_exports_NSW.csv b/tests/test_workbook_table_cache/6.0/rez_augmentation_costs_step_change_and_green_energy_exports_NSW.csv similarity index 100% rename from tests/test_workbook_table_cache/rez_augmentation_costs_step_change_and_green_energy_exports_NSW.csv rename to tests/test_workbook_table_cache/6.0/rez_augmentation_costs_step_change_and_green_energy_exports_NSW.csv diff --git a/tests/test_workbook_table_cache/rez_augmentation_costs_step_change_and_green_energy_exports_QLD.csv b/tests/test_workbook_table_cache/6.0/rez_augmentation_costs_step_change_and_green_energy_exports_QLD.csv similarity index 100% rename from tests/test_workbook_table_cache/rez_augmentation_costs_step_change_and_green_energy_exports_QLD.csv rename to tests/test_workbook_table_cache/6.0/rez_augmentation_costs_step_change_and_green_energy_exports_QLD.csv diff --git a/tests/test_workbook_table_cache/rez_augmentation_costs_step_change_and_green_energy_exports_SA.csv b/tests/test_workbook_table_cache/6.0/rez_augmentation_costs_step_change_and_green_energy_exports_SA.csv similarity index 100% rename from tests/test_workbook_table_cache/rez_augmentation_costs_step_change_and_green_energy_exports_SA.csv rename to tests/test_workbook_table_cache/6.0/rez_augmentation_costs_step_change_and_green_energy_exports_SA.csv diff --git a/tests/test_workbook_table_cache/rez_augmentation_costs_step_change_and_green_energy_exports_TAS.csv b/tests/test_workbook_table_cache/6.0/rez_augmentation_costs_step_change_and_green_energy_exports_TAS.csv similarity index 100% rename from tests/test_workbook_table_cache/rez_augmentation_costs_step_change_and_green_energy_exports_TAS.csv rename to tests/test_workbook_table_cache/6.0/rez_augmentation_costs_step_change_and_green_energy_exports_TAS.csv diff --git a/tests/test_workbook_table_cache/rez_augmentation_costs_step_change_and_green_energy_exports_VIC.csv b/tests/test_workbook_table_cache/6.0/rez_augmentation_costs_step_change_and_green_energy_exports_VIC.csv similarity index 100% rename from tests/test_workbook_table_cache/rez_augmentation_costs_step_change_and_green_energy_exports_VIC.csv rename to tests/test_workbook_table_cache/6.0/rez_augmentation_costs_step_change_and_green_energy_exports_VIC.csv diff --git a/tests/test_workbook_table_cache/rez_augmentation_costs_step_change_and_green_energy_exports_preparatory_activities.csv b/tests/test_workbook_table_cache/6.0/rez_augmentation_costs_step_change_and_green_energy_exports_preparatory_activities.csv similarity index 100% rename from tests/test_workbook_table_cache/rez_augmentation_costs_step_change_and_green_energy_exports_preparatory_activities.csv rename to tests/test_workbook_table_cache/6.0/rez_augmentation_costs_step_change_and_green_energy_exports_preparatory_activities.csv diff --git a/tests/test_workbook_table_cache/rez_augmentation_options_NSW.csv b/tests/test_workbook_table_cache/6.0/rez_augmentation_options_NSW.csv similarity index 100% rename from tests/test_workbook_table_cache/rez_augmentation_options_NSW.csv rename to tests/test_workbook_table_cache/6.0/rez_augmentation_options_NSW.csv diff --git a/tests/test_workbook_table_cache/rez_augmentation_options_QLD.csv b/tests/test_workbook_table_cache/6.0/rez_augmentation_options_QLD.csv similarity index 100% rename from tests/test_workbook_table_cache/rez_augmentation_options_QLD.csv rename to tests/test_workbook_table_cache/6.0/rez_augmentation_options_QLD.csv diff --git a/tests/test_workbook_table_cache/rez_augmentation_options_SA.csv b/tests/test_workbook_table_cache/6.0/rez_augmentation_options_SA.csv similarity index 100% rename from tests/test_workbook_table_cache/rez_augmentation_options_SA.csv rename to tests/test_workbook_table_cache/6.0/rez_augmentation_options_SA.csv diff --git a/tests/test_workbook_table_cache/rez_augmentation_options_TAS.csv b/tests/test_workbook_table_cache/6.0/rez_augmentation_options_TAS.csv similarity index 100% rename from tests/test_workbook_table_cache/rez_augmentation_options_TAS.csv rename to tests/test_workbook_table_cache/6.0/rez_augmentation_options_TAS.csv diff --git a/tests/test_workbook_table_cache/rez_augmentation_options_VIC.csv b/tests/test_workbook_table_cache/6.0/rez_augmentation_options_VIC.csv similarity index 100% rename from tests/test_workbook_table_cache/rez_augmentation_options_VIC.csv rename to tests/test_workbook_table_cache/6.0/rez_augmentation_options_VIC.csv diff --git a/tests/test_workbook_table_cache/seasonal_ratings_additional_projects.csv b/tests/test_workbook_table_cache/6.0/seasonal_ratings_additional_projects.csv similarity index 100% rename from tests/test_workbook_table_cache/seasonal_ratings_additional_projects.csv rename to tests/test_workbook_table_cache/6.0/seasonal_ratings_additional_projects.csv diff --git a/tests/test_workbook_table_cache/seasonal_ratings_anticipated_projects.csv b/tests/test_workbook_table_cache/6.0/seasonal_ratings_anticipated_projects.csv similarity index 100% rename from tests/test_workbook_table_cache/seasonal_ratings_anticipated_projects.csv rename to tests/test_workbook_table_cache/6.0/seasonal_ratings_anticipated_projects.csv diff --git a/tests/test_workbook_table_cache/seasonal_ratings_committed_generators.csv b/tests/test_workbook_table_cache/6.0/seasonal_ratings_committed_generators.csv similarity index 100% rename from tests/test_workbook_table_cache/seasonal_ratings_committed_generators.csv rename to tests/test_workbook_table_cache/6.0/seasonal_ratings_committed_generators.csv diff --git a/tests/test_workbook_table_cache/seasonal_ratings_existing_committed_and_anticipated_batteries.csv b/tests/test_workbook_table_cache/6.0/seasonal_ratings_existing_committed_and_anticipated_batteries.csv similarity index 100% rename from tests/test_workbook_table_cache/seasonal_ratings_existing_committed_and_anticipated_batteries.csv rename to tests/test_workbook_table_cache/6.0/seasonal_ratings_existing_committed_and_anticipated_batteries.csv diff --git a/tests/test_workbook_table_cache/seasonal_ratings_existing_generators.csv b/tests/test_workbook_table_cache/6.0/seasonal_ratings_existing_generators.csv similarity index 100% rename from tests/test_workbook_table_cache/seasonal_ratings_existing_generators.csv rename to tests/test_workbook_table_cache/6.0/seasonal_ratings_existing_generators.csv diff --git a/tests/test_workbook_table_cache/seasonal_ratings_new_entrants.csv b/tests/test_workbook_table_cache/6.0/seasonal_ratings_new_entrants.csv similarity index 100% rename from tests/test_workbook_table_cache/seasonal_ratings_new_entrants.csv rename to tests/test_workbook_table_cache/6.0/seasonal_ratings_new_entrants.csv diff --git a/tests/test_workbook_table_cache/sub_regional_reference_nodes.csv b/tests/test_workbook_table_cache/6.0/sub_regional_reference_nodes.csv similarity index 100% rename from tests/test_workbook_table_cache/sub_regional_reference_nodes.csv rename to tests/test_workbook_table_cache/6.0/sub_regional_reference_nodes.csv diff --git a/tests/test_workbook_table_cache/tas_renewable_target_trajectory.csv b/tests/test_workbook_table_cache/6.0/tas_renewable_target_trajectory.csv similarity index 100% rename from tests/test_workbook_table_cache/tas_renewable_target_trajectory.csv rename to tests/test_workbook_table_cache/6.0/tas_renewable_target_trajectory.csv diff --git a/tests/test_workbook_table_cache/technology_cost_breakdown_ratios.csv b/tests/test_workbook_table_cache/6.0/technology_cost_breakdown_ratios.csv similarity index 100% rename from tests/test_workbook_table_cache/technology_cost_breakdown_ratios.csv rename to tests/test_workbook_table_cache/6.0/technology_cost_breakdown_ratios.csv diff --git a/tests/test_workbook_table_cache/technology_specific_lcfs.csv b/tests/test_workbook_table_cache/6.0/technology_specific_lcfs.csv similarity index 100% rename from tests/test_workbook_table_cache/technology_specific_lcfs.csv rename to tests/test_workbook_table_cache/6.0/technology_specific_lcfs.csv diff --git a/tests/test_workbook_table_cache/transmission_expansion_costs.csv b/tests/test_workbook_table_cache/6.0/transmission_expansion_costs.csv similarity index 100% rename from tests/test_workbook_table_cache/transmission_expansion_costs.csv rename to tests/test_workbook_table_cache/6.0/transmission_expansion_costs.csv diff --git a/tests/test_workbook_table_cache/variable_opex_existing_committed_anticipated_additional_generators.csv b/tests/test_workbook_table_cache/6.0/variable_opex_existing_committed_anticipated_additional_generators.csv similarity index 100% rename from tests/test_workbook_table_cache/variable_opex_existing_committed_anticipated_additional_generators.csv rename to tests/test_workbook_table_cache/6.0/variable_opex_existing_committed_anticipated_additional_generators.csv diff --git a/tests/test_workbook_table_cache/variable_opex_new_entrants.csv b/tests/test_workbook_table_cache/6.0/variable_opex_new_entrants.csv similarity index 100% rename from tests/test_workbook_table_cache/variable_opex_new_entrants.csv rename to tests/test_workbook_table_cache/6.0/variable_opex_new_entrants.csv diff --git a/tests/test_workbook_table_cache/vic_offshore_wind_target_trajectory.csv b/tests/test_workbook_table_cache/6.0/vic_offshore_wind_target_trajectory.csv similarity index 100% rename from tests/test_workbook_table_cache/vic_offshore_wind_target_trajectory.csv rename to tests/test_workbook_table_cache/6.0/vic_offshore_wind_target_trajectory.csv diff --git a/tests/test_workbook_table_cache/vic_renewable_target_trajectory.csv b/tests/test_workbook_table_cache/6.0/vic_renewable_target_trajectory.csv similarity index 100% rename from tests/test_workbook_table_cache/vic_renewable_target_trajectory.csv rename to tests/test_workbook_table_cache/6.0/vic_renewable_target_trajectory.csv diff --git a/tests/test_workbook_table_cache/vic_storage_target_trajectory.csv b/tests/test_workbook_table_cache/6.0/vic_storage_target_trajectory.csv similarity index 100% rename from tests/test_workbook_table_cache/vic_storage_target_trajectory.csv rename to tests/test_workbook_table_cache/6.0/vic_storage_target_trajectory.csv diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_cost_slower_growth_CNSW-NNSW.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_cost_slower_growth_CNSW-NNSW.csv new file mode 100644 index 00000000..daae4c7b --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_cost_slower_growth_CNSW-NNSW.csv @@ -0,0 +1,6 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +CNSW-NNSW,CNSW-NNSW Option 1,,2554497426.1175,2590471661.7229,2632280737.9989,2653828192.0615,2674234500.4487,2697806281.9597,2731325101.9764,2757131046.9253,2776769849.3646,2800811511.1544,2825967611.6655,2847619508.6859,2865046216.2849,2882059131.5691,2899467075.9723,2917210348.6021,2935283417.0346,2953818205.0897,2972842674.2671,2992331522.8667,3012301127.1891,3032764659.9631,3053736847.8433,3075232141.525,3097265657.6717,3119852481.3796,3143011497.0222,3166757392.5587,3191110248.8651,3216088124.4736,3241711488.2325 +CNSW-NNSW,CNSW-NNSW Option 2,,2212772406.937,2246845724.9076,2284644861.0345,2306204049.9863,2326640808.5984,2349906326.2014,2381951829.0461,2407309436.871,2427415065.7074,2451517771.5273,2476716453.2712,2499246940.5499,2518550018.6439,2537780654.8759,2557529841.0352,2577744735.4982,2598429823.8764,2619708443.6841,2641611997.2567,2664126780.3128,2687275466.3202,2711078254.2777,2735557177.1424,2760734334.0609,2786632846.553,2813276196.6167,2840691667.5639,2868903234.2498,2897940116.7929,2927830214.5766,2958604089.8388 +CNSW-NNSW,CNSW-NNSW Option 4,,3750181267.376547,3751429397.249217,3797860096.141744,3826113324.803489,3829735150.230483,3871577842.08781,3928713323.388601,3935792826.320373,3937665672.729012,3952242468.225016,3967416717.553026,3980054737.14767,3985587020.587225,3991926941.233014,3999420140.891461,4007119855.814695,4015168589.803344,4023886549.215348,4033164899.271652,4042956690.431274,4053263367.183472,4064081578.84138,4075410207.218445,4087246520.323449,4099588751.417441,4112434263.925988,4125784568.195302,4139635233.895445,4153988110.083066,4168841907.608383,4184197364.492523 +CNSW-NNSW,CNSW-NNSW Option 5,,5115181564.384226,5137913878.393918,5210044847.341941,5253242462.039553,5269594788.549301,5328193456.395189,5406981076.339495,5428554816.493731,5442266229.547935,5471702285.739648,5502270876.364658,5528556872.47177,5545390364.24637,5563166001.953165,5582474580.413565,5602258172.145376,5622686996.487969,5644164399.852581,5666588293.515643,5689904708.86147,5714128165.763337,5739266891.546385,5765332572.465856,5792335311.991529,5820286800.224448,5849198072.056143,5879086653.545326,5909961996.521826,5941843150.565839,5974745115.523675,6008686584.098121 +CNSW-NNSW,CNSW-NNSW Option 6,,443570697.8856544,444245338.1100779,446096527.3123531,446301782.8767481,446574192.205133,447142202.1036954,449901587.2456462,452287375.0344099,453345259.0209092,454850650.0693126,456601543.0969676,458084001.15328,459280937.7584902,460268988.494246,461255611.4008066,462268576.5210586,463289883.9496951,464338321.1975259,465421501.874555,466531853.0626044,467669945.3334888,468835658.9010245,470028982.3996686,471249664.976514,472497557.5112693,473772319.341252,475074052.9904019,476402276.6734784,477757017.4057646,479138038.4406245,480545234.6058707 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CNSW-NNSW.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CNSW-NNSW.csv new file mode 100644 index 00000000..6ecd9620 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CNSW-NNSW.csv @@ -0,0 +1,6 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +CNSW-NNSW,CNSW-NNSW Option 1,,2554497426.1175,2590011791.3331,2639763178.9048,2676099435.4347,2711756911.514,2751203796.548,2801105387.4429,2843266824.0313,2879893853.0713,2921596482.3751,2964872779.261,3004859258.4101,3040652723.3629,3076483491.6996,3113076242.725,3150350754.7651,3188330984.3457,3227152510.9837,3266846463.0918,3307390144.7996,3348805276.4461,3391110858.491,3434325320.1277,3478466399.1239,3523556529.6469,3569613524.8186,3616660838.1246,3664719928.2008,3713813376.868,3763967312.6859,3815204586.3065 +CNSW-NNSW,CNSW-NNSW Option 2,,2212772406.937,2246390656.8206,2290634702.2396,2324324584.4367,2357252030.8016,2393501962.9856,2438939994.6853,2477664506.864,2511656766.118,2550191509.9453,2590194324.663,2627707994.6411,2662025522.336,2696639206.2931,2732068929.3944,2768244999.1879,2805195797.7312,2843046525.0093,2881830941.7404,2921536700.0187,2962190197.2351,3003815794.1805,3046437664.2786,3090079742.6709,3134770373.7379,3180534189.1383,3227401182.8986,3275399919.3521,3324560360.958,3374915995.5301,3426497785.4982 +CNSW-NNSW,CNSW-NNSW Option 4,,3750181267.376547,3750669939.075455,3810198645.800797,3859725617.587552,3884030061.870852,3947013864.854668,4025913057.234413,4054853683.605188,4079266153.33766,4117206127.763956,4156341877.607235,4193249330.116143,4223088927.062937,4254246250.538256,4287000692.410505,4320395573.354,4354604909.764041,4389956538.491549,4426351843.775655,4463748231.390089,4502156628.145369,4541584057.182557,4582036351.98675,4623518696.316429,4666040967.659786,4709607089.551957,4754227782.626313,4799910344.686917,4846662983.699683,4894498012.829013,4943422803.312099 +CNSW-NNSW,CNSW-NNSW Option 5,,5115181564.384226,5136703633.109064,5226125554.580459,5299229507.369761,5345189308.086512,5434113691.544568,5544120901.898857,5597052913.721455,5643107671.032895,5706062839.897473,5771005705.624319,5832084702.901567,5883761962.723228,5937107490.18222,5992616718.141695,6049214333.525982,6107115547.102476,6166733007.889297,6227977583.562714,6290800311.747952,6355227867.051383,6421281747.798224,6488982259.590139,6558348857.760077,6629408485.099998,6702179703.027129,6776691288.587606,6852967588.973374,6931034789.244171,7010925342.429939,7092665111.51964 +CNSW-NNSW,CNSW-NNSW Option 6,,443570697.8856544,444434011.0951294,447766444.3181566,448996752.2316597,450052564.7722404,451540788.2391754,455287656.2214898,458530941.2464523,460529744.6883333,463080816.0299528,465901301.5776587,468480711.7635879,470785847.2927742,472976564.4125515,475216642.2375283,477525000.2716528,479888331.338811,482326371.6692484,484845569.9430073,487438815.0691036,490107062.0848959,492850747.0105901,495669963.8170949,498564820.5632613,501535740.3170805,504582663.953099,507706109.2842727,510906299.2122828,514183421.4032212,517538131.0082988,520970554.9064599 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CNSW-SNW.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CNSW-SNW.csv new file mode 100644 index 00000000..71d07663 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CNSW-SNW.csv @@ -0,0 +1,11 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +CNSW-SNW,CNSW-SNW H-Dapto,,1463080602.988509,1483259179.90564,1511670240.487128,1532667697.505098,1553237496.276105,1575942538.374301,1604675259.79618,1629050913.399713,1650265655.75324,1674379710.659495,1699410892.093863,1722664740.542421,1743629956.864482,1764656789.156538,1786140037.489316,1808035160.153727,1830356663.492017,1853182245.187224,1876530997.035255,1900390933.78806,1924775338.814093,1949695994.570949,1975164407.156824,2001191713.895875,2027791796.352135,2054975893.537927,2082758536.409735,2111153156.18837,2140173850.656259,2169836795.321898,2200156339.136666 +CNSW-SNW,CNSW-SNW H-Newcastle,,1663257468.317511,1689512151.773592,1723281923.025555,1749007768.530946,1774134648.641473,1801791260.997413,1836291143.538562,1865678121.755231,1891562621.385936,1920894572.523253,1951322584.073848,1979865284.448205,2006022864.137923,2032438968.637632,2059481684.961901,2087094762.74007,2115301915.64758,2144197573.854923,2173807089.656,2204121855.161428,2235162203.572141,2266946945.909536,2299494788.287888,2332824281.184247,2366957318.825139,2401913012.637755,2437714551.958269,2474384059.223466,2511944742.779335,2550422497.204228,2589841326.993093 +CNSW-SNW,CNSW-SNW Option 1,,1347751739.496,1366711663.7279,1393740056.4425,1414433838.0478,1434826974.7245,1457197155.1074,1485001171.6575,1508670299.5936,1529511114.5542,1553098729.6119,1577565835.1051,1600415048.2472,1621081827.5914,1641855091.5849,1663089603.7281,1684744499.642,1706838276.7461,1729444604.9722,1752582370.7304,1776242665.9323,1800439907.6693,1825187202.4807,1850497488.8863,1876383448.7943,1902860411.6929,1929941322.2117,1957642319.3874,1985978576.9083,2014966032.1877,2044622669.4219,2074964841.4906 +CNSW-SNW,CNSW-SNW Option 2,,509958368.5484657,513000000.0,521601852.2465571,528366847.8181018,535281447.7894948,542639278.6002519,552057855.115625,560330674.555272,567475717.0134672,575498386.7654245,583864077.6513131,591687047.8169999,598592484.091803,605419519.3414968,612364023.327724,619428278.6524154,626614791.9676682,633946541.9308696,641430735.3420876,649061976.0117642,656843462.4158183,664777853.673103,672867646.5054334,681115124.8408362,689523455.9049213,698094807.5613292,706832400.3123095,715739017.0506893,724817561.756192,734071563.6905216,743503872.0135354 +CNSW-SNW,CNSW-SNW Option 2d,,261294902.4782929,261000000.0,264025137.6840916,266239044.3358694,266272454.3117801,269396280.465736,274043033.6581024,274891789.8606434,275206711.9985705,276511604.8035097,277906314.636622,279240027.8438922,280218879.9645602,281274283.2224705,282443744.1057329,283654539.2354408,284911442.3200332,286241661.4828738,287637623.1399767,289095201.5959657,290614875.9922122,292196853.297275,293841206.163834,295547983.8003429,297317504.7796453,299149744.9248829,301045071.4068264,303003668.7266511,305025742.3876517,307111761.0301399,309261891.8163322 +CNSW-SNW,CNSW-SNW Option 3 Stage 1,,1728292419.028147,1780000000.0,1825865107.267087,1866562961.258356,1905889268.03333,1948561672.820451,1998303634.430255,2041601179.805772,2081907822.139329,2126935347.581804,2173532318.517349,2219211931.0699,2264018418.096774,2310502236.319482,2358456869.535117,2407788497.142724,2458575259.252633,2510962670.358227,2565005551.139804,2620733260.020567,2678207262.517106,2737488851.941245,2798640786.998927,2861727724.408257,2926819469.802092,2993984705.33866,3063298902.060332,3134837839.560461,3208680968.297371,3284913029.692692,3363618237.030303 +CNSW-SNW,CNSW-SNW Option 3 Stage 2,,577870518.7551959,580000000.0,588101972.3735684,594065152.4717133,600069312.6129467,606613745.1502153,615636904.848196,623514907.3483734,630043127.1197667,637480256.8520977,645292456.7607144,652597322.5628314,659044078.6364466,665380352.1691247,671825755.986375,678388890.0088555,685067542.2778319,691886819.1277875,698854670.5604938,705963965.7251846,713217312.6118157,720616690.3549167,728163818.7653406,735860223.5316527,743708261.4187067,751709263.1895614,759865617.2323215,768179232.372984,776652074.2723874,785286765.8123633,794085172.5976264 +CNSW-SNW,CNSW-SNW Option 4,,2428292889.190557,2490000000.0,2548685941.609533,2599677510.196596,2649124472.27401,2702764911.186611,2766523516.752154,2822136500.032667,2873217806.893429,2930404124.342861,2989689381.217471,3047556337.366056,3103857431.225932,3162013452.723959,3221950318.598719,3283569708.110172,3346957510.5994,3412301149.419423,3479670636.899619,3549094505.654708,3620645941.270447,3694397464.552343,3770423082.354224,3848798888.444478,3929607517.928449,4012929603.764004,4098854394.699604,4187471168.372638,4278873494.283485,4373161561.370858,4470434406.854718 +CNSW-SNW,CNSW-SNW Option 6a,,2148446480.22366,2184912967.88728,2230459175.198867,2265690502.893076,2300006327.702518,2337798363.3814,2384332383.546427,2423860202.24017,2458979564.307437,2498710070.559103,2539871551.189032,2578580342.023089,2614196113.924194,2650257706.686249,2687192921.769999,2724914233.343182,2763459846.23212,2802955187.659187,2843433654.826968,2884886753.345992,2927343261.170072,2970830075.822046,3015374105.291808,3061002102.55186,3107745362.626899,3155631560.275661,3204693863.205598,3254964115.837659,3306475728.105257,3359265725.854987,3413368754.747715 +CNSW-SNW,CNSW-SNW Option 6b,,1686116211.19434,1711519475.867808,1746268324.091787,1773118230.168245,1799451488.342447,1828364600.094538,1864088976.604234,1894475087.02384,1921365287.084757,1951769730.465701,1983285792.348242,2012821531.04522,2039720384.830049,2066837050.617071,2094574773.552736,2122874036.761384,2151761437.547242,2181331243.930524,2211608046.441551,2242582465.470705,2274274223.217938,2306701473.07367,2339882258.322505,2373834340.981926,2408578931.01987,2444134255.483118,2480522675.326804,2517765398.973901,2555884684.617238,2594905445.742575,2634850617.002784 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CQ-GG.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CQ-GG.csv new file mode 100644 index 00000000..7ecfc667 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CQ-GG.csv @@ -0,0 +1,5 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +CQ-GG,CQ-GG Option 1,,2672305582.761624,2707000000.0,2760848463.728662,2799730383.056314,2837038278.354192,2879726308.918725,2933014818.03439,2976110817.131029,3013651628.922786,3056769199.412988,3101360768.709034,3142044673.959396,3177558452.406652,3212937374.110564,3248999024.319022,3285598260.933375,3322767776.279933,3360645681.834104,3399249831.961967,3438548839.388575,3478556303.064999,3519282636.123851,3560737462.062706,3602929000.26447,3645870328.521085,3689568915.344322,3734037771.04822,3779287361.886296,3825328813.098398,3872176372.572029,3919840426.161499 +CQ-GG,CQ-GG Option 2,,2336908910.995213,2367000000.0,2413887230.308684,2447725631.848707,2480152096.868801,2517316526.080599,2563790535.91596,2601332628.242841,2633996022.479125,2671534649.283362,2710364828.129293,2745795985.479821,2776721193.575326,2807524589.8196,2838924476.95331,2870794156.912041,2903161426.047482,2936147371.832436,2969767601.815465,3003994560.213364,3038840104.379348,3074313309.091183,3110422552.814526,3147174991.125247,3184582013.604512,3222650122.283813,3261390647.938685,3300812706.778135,3340925984.356575,3381742894.007713,3423272479.77001 +CQ-GG,CQ-GG Option 3,,179525948.9270546,181156606.5041631,184606397.4011024,187273083.6995192,189928470.1409656,192834423.3420255,196444273.8661343,199498762.7175965,202175670.3136441,205198009.473468,208332249.7083322,211233812.2375995,213777613.5562252,216301571.1728675,218869819.8710365,221477480.4438845,224126568.18988,226825621.8904296,229576508.18083,232377246.106667,235228848.2634497,238132127.1865666,241087845.8659267,244096667.0640867,247159590.7434032,250277228.1967594,253450571.2462404,256680443.7172452,259967710.6630867,263313448.6605962,266718480.4390694 +CQ-GG,CQ-GG Option 4,,190409085.6749447,192222886.7594154,195904946.9332857,198733601.8203817,201544416.8951325,204626245.176674,208455656.7146165,211689736.2751894,214523242.840935,217725132.9247462,221044733.6973114,224114600.1753702,226806980.2287794,229479588.7896904,232199461.226082,234961048.3062645,237766493.7473653,240624909.158853,243538241.2839707,246504385.8839543,249524417.7591977,252599198.5978867,255729537.7247869,258916138.6095069,262160062.5211775,265461959.1319113,268822881.7495854,272243705.6146467,275725350.2729878,279268959.923833,282875409.31336 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CQ-NQ.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CQ-NQ.csv new file mode 100644 index 00000000..150695d8 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CQ-NQ.csv @@ -0,0 +1,5 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +CQ-NQ,CQ-NQ Option 1,,1822592119.200375,1858056217.411154,1897361749.379321,1926607869.741265,1954300201.590466,1985547562.896233,2024549642.392326,2056893463.779456,2085313286.765594,2117779371.519801,2151384868.686243,2182803404.137935,2211840855.053594,2241315574.845757,2271524420.887076,2302359612.001935,2333846913.517476,2366096810.820335,2399132731.954141,2432943994.857352,2467552205.565186,2502977214.159819,2539238719.970657,2576356143.955461,2614352606.367063,2653248032.72215,2693066770.895932,2733831916.937286,2775567687.979856,2818301133.008435,2862057107.790859 +CQ-NQ,CQ-NQ Option 2,,5334489139.047399,5432026860.91779,5544126171.488024,5625684060.472188,5703306592.782592,5790900771.252136,5901063039.227888,5992346286.621601,6071999415.89428,6163161966.77931,6257558404.077933,6345132187.804005,6425132339.65836,6505984684.238004,6588760574.41995,6673168280.679903,6759269564.80253,6847375930.143552,6937549885.337028,7029751061.236995,7124033494.171359,7220445715.079696,7319035423.427475,7419849124.648199,7522943691.012887,7628366409.242868,7736176899.744954,7846430824.168203,7959186630.222323,8074510545.930748,8192462078.626201 +CQ-NQ,CQ-NQ Option 3,,206934192.0427212,209445770.3956336,213386067.1843772,216158032.6163029,218818296.252006,221848721.2648399,225742549.2514112,228931406.7204878,231660657.8426468,234797941.5440937,238052339.8766013,241019311.2259496,243616708.3100796,246196145.7180656,248824795.4804315,251493430.6893838,254203269.3480159,256964763.7692202,259779599.3348026,262645171.1015925,265562425.9047403,268532065.9946854,271554723.3584398,274630919.0924526,277761541.145911,280947046.9098173,284188306.2726678,287486000.4438473,290840846.4187647,294253794.81617,297725504.0981321 +CQ-NQ,CQ-NQ Option 4,,1937332511.939551,1974060000.0,2015904675.967445,2047327663.138738,2077269896.043248,2110860551.645404,2152565486.747651,2187296329.098232,2217918370.965417,2252817175.817215,2288931397.994668,2322718094.564455,2353881245.485006,2385490933.817472,2417873172.239508,2450918418.88987,2484656103.935731,2519201855.771062,2554580728.342266,2590781511.311367,2627826999.988997,2665738121.551489,2704535649.876973,2744240038.667603,2784875681.625687,2826463535.1113,2869029270.788285,2912597199.476844,2957192818.543674,3002844626.967062,3049578770.158371 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CSA-NSA.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CSA-NSA.csv new file mode 100644 index 00000000..2126b723 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_CSA-NSA.csv @@ -0,0 +1,6 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +CSA-NSA,CSA-NSA Option 1,,2163438914.597084,2190000000.0,2233417891.423238,2266348110.168078,2297689191.990113,2332943342.807483,2377188104.272334,2413913303.4484,2446000405.118762,2482679722.700068,2520662246.751466,2556093888.32913,2588609483.82692,2621507907.047837,2655173779.29825,2689496864.192076,2724502658.532044,2760314161.562272,2796956100.806244,2834411870.321924,2872702314.278426,2911846049.937768,2951861290.285272,2992765773.279053,3034581245.949558,3077325590.869835,3121021581.684209,3165690297.265765,3211353862.786841,3258037452.901449,3305763441.844409 +CSA-NSA,CSA-NSA Option 2,,2503052773.057743,2530000000.0,2582317556.138493,2626439024.719168,2668203061.217703,2714410626.594965,2771158823.305109,2819188556.29816,2861974554.614258,2910502762.033836,2960739690.128043,3008924595.680532,3055163308.973766,3102661994.76367,3151441414.832413,3201368898.664418,3252489676.484017,3304967387.320007,3358844072.833416,3414117012.779986,3470827810.364776,3529016086.75341,3588721500.810239,3649984189.970356,3712849255.290008,3777358277.128474,3843559400.915853,3911499291.048067,3981226840.670887,4052795407.826737,4126255562.614941 +CSA-NSA,CSA-NSA Option 3,,3471153918.323982,3510000000.0,3581565809.223012,3640005532.012574,3695652549.733161,3757289033.98685,3833411445.968833,3897671122.515946,3954593291.734808,4019253742.65512,4086199623.675524,4149834868.714497,4210042949.456215,4271598080.955937,4334740375.988402,4399296620.865719,4465321716.980354,4533032442.915979,4602481457.034778,4673657376.727721,4746610042.828495,4821386250.156738,4898032589.417015,4976595879.410197,5057129628.697327,5139682086.527375,5224310182.173536,5311068555.945217,5400014508.68445,5491211118.971398,5584717369.893258 +CSA-NSA,CSA-NSA Option 4 Stage 1,,3267687553.905117,3310937943.487826,3377767207.429744,3427543096.258016,3475134936.164939,3528615440.87089,3595470067.900822,3650847959.065693,3699267972.158344,3754638515.94855,3811921279.802802,3864988541.938133,3913262534.063493,3962000586.617943,4011840356.111295,4062608777.408311,4114345295.487402,4167233365.679183,4221307118.396453,4276539002.123994,4332958004.78559,4390589595.717944,4449458564.791655,4509588823.152275,4571010318.254605,4633747005.477021,4697830131.003661,4763288256.025641,4830151437.708346,4898454217.514741,4968226774.04913 +CSA-NSA,CSA-NSA Option 4 Stage 2,,474020855.6678854,475103175.0261984,481497451.5642052,486296017.9462617,491198218.0729941,496457856.5574931,503804610.0367926,510322257.0732789,515684069.7729226,521766049.9263422,528170881.3936383,534178726.1064931,539470104.0712526,544649327.5657543,549914410.1430207,555276843.148795,560733202.832713,566303981.7870321,571996285.2942013,577804065.8825228,583729456.083569,589774078.1587512,595939331.733056,602226444.634532,608637333.1754822,615173061.6838365,621835555.0722996,628626350.2272358,635547020.4794202,642599671.129253,649785790.5576661 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_MEL-WNV.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_MEL-WNV.csv new file mode 100644 index 00000000..4bd09912 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_MEL-WNV.csv @@ -0,0 +1,5 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +MEL-WNV,MEL-WNV Option 1,,127658596.9637097,128000000,129540803.2014474,130581893.7916939,131623708.6910224,132780341.9617128,134521999.5325978,136047717.4326712,137250332.0534308,138641148.0826155,140115519.3593624,141487741.2579381,142695713.118963,143873479.6832242,145072397.0836352,146295762.1693694,147541922.9361302,148816568.643226,150121551.6272139,151455144.7740725,152817869.8935071,154210107.8827594,155632170.296677,157084339.2729934,158567057.4587158,160080567.1802691,161625326.369013,163201695.6724661,164810044.4303494,166450886.0553799,168124573.3429896 +MEL-WNV,MEL-WNV Option 2,,173228366.7750165,174000000,176481365.2436953,178271299.8974625,180101319.4698877,182048416.6647389,184774289.3758305,187223542.258434,189244039.0961032,191537835.4080206,193951700.3394272,196210256.7209176,198235815.4059065,200236006.8535658,202276859.1566361,204362240.4538638,206491022.2899126,208671516.1629079,210906859.508989,213195375.5734118,215538489.2682222,217937461.1940462,220393499.8240682,222907794.6286644,225481817.9892795,228116779.6480253,230814245.6461979,233575680.2449051,236402612.8686388,239296820.1945982,242259894.3449515 +MEL-WNV,MEL-WNV Option 3,,1320328295.178168,1330000000,1357938478.302029,1381156330.915534,1403917333.390748,1428895897.153644,1459421415.906524,1485816435.371238,1509604422.328517,1536408004.132707,1564280485.94079,1590909212.803874,1615957625.322005,1641549384.583328,1667925908.384865,1695047766.471388,1722952364.769572,1751735131.477844,1781433720.689481,1812060711.832854,1843653129.716955,1876247855.555078,1909882821.163114,1944597077.775939,1980433640.075017,2017434595.781482,2055646820.366967,2095117721.190213,2135897215.569849,2178039083.903432,2221597155.038372 +MEL-WNV,MEL-WNV Option 4,,69860252.71488313,70000000,70555203.41350256,70792286.96906202,71007945.74921097,71282264.50053544,71897003.47994576,72441784.83538604,72802542.39162074,73248954.5922087,73736719.92833841,74191393.2078266,74607095.36468343,75008869.99988991,75419153.75086233,75840986.69607364,76272672.53552711,76717100.79169178,77175319.85217781,77646301.47441106,78130214.08299014,78627146.62859198,79137138.92612933,79660233.12328753,80196523.57480623,80746024.88093205,81308847.7162074,81885054.83874558,82474703.70286414,83077927.20304723,83694774.88660719 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_NNSW-SQ.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_NNSW-SQ.csv new file mode 100644 index 00000000..4778cb78 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_NNSW-SQ.csv @@ -0,0 +1,5 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +NNSW–SQ,NNSW–SQ Option 1,,2353095914.780407,2399485887.956743,2451449334.762833,2491598666.532867,2530125087.088004,2572909396.952365,2625435425.286479,2669679137.898509,2709082579.213775,2753765400.662353,2800004357.368356,2843616141.134022,2884221494.019312,2925544704.601169,2967917056.702861,3011213379.051804,3055478588.960424,3100857305.443061,3147385721.566145,3195056557.669373,3243903741.34387,3293959178.229747,3345254856.91553,3397822695.685451,3451699674.071941,3506918860.823376,3563519471.627445,3621539302.796662,3681017984.119645,3741999198.978018,3804524025.351394 +NNSW–SQ,NNSW–SQ Option 4,,8980741113.231022,9020817175.260017,9175675319.52378,9301777595.461042,9375452086.404007,9530241803.077478,9723076618.942287,9809463317.619562,9883864339.95311,9989072180.166695,10097614553.02637,10199957887.80873,10286637505.4819,10376722042.13057,10470804745.65576,10566845241.77987,10665228927.07698,10766716750.61693,10871132852.97972,10978392095.24751,11088543067.81395,11201625375.46546,11317676481.20176,11436732873.40686,11558843752.84161,11684044336.15976,11812387596.77085,11943918955.01598,12078687215.65156,12216752295.21897,12358162741.42492 +NNSW-SQ,NNSW-SQ Option 2,,2935378197.527863,2989000000.0,3052693299.593379,3101387995.936979,3148475632.37419,3200641878.687944,3264730544.655786,3318695340.945882,3366628990.550887,3420990510.832932,3477238875.810564,3529954636.865084,3578443977.334396,3627585478.051236,3677909484.406311,3729271515.979602,3781723679.467472,3835438683.518342,3890457578.111236,3946766268.51046,4004401664.370749,4063397938.708538,4123789158.046627,4185609028.874826,4248897345.886422,4313688798.125746,4380025425.357092,4447947271.920393,4517496380.917184,4588719538.325329,4661660058.366806 +NNSW-SQ,NNSW-SQ Option 5,,5177956038.876501,5270663992.4,5382689566.636028,5466938097.866571,5548620322.707823,5639253725.063743,5750552764.154804,5843877076.150185,5926637360.786816,6020635419.870244,6117832387.038459,6208320728.362665,6290788504.223415,6374154326.706807,6459449650.502354,6546415960.081791,6635142392.169363,6725925317.894161,6818829338.112993,6913822790.445736,7010963336.77462,7110303465.760967,7211895196.702401,7315789573.636283,7422048046.091907,7530722782.438195,7641878483.864268,7755576000.133018,7871879342.658049,7990860468.321369,8112584868.961879 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_SESA-CSA.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_SESA-CSA.csv new file mode 100644 index 00000000..2f3f72f8 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_SESA-CSA.csv @@ -0,0 +1,5 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +SESA-CSA,SESA-CSA Option 1,,79616162.2482753,80500000.0,81946671.18825552,82958020.31666924,83967496.38045767,85064559.66980822,86516126.80533183,87764788.43314455,88813050.45619452,90005732.63488692,91248672.88718222,92380409.63179485,93366609.82282016,94336817.74805596,95323915.42060539,96326439.50550988,97344036.62758757,98380677.85616945,99437300.25548884,100512808.1992827,101607573.1959189,102721872.1630213,103855950.0875197,105010006.5145011,106184383.4963148,107379257.3581132,108594959.590213,109831751.8774635,111089907.7535847,112369789.2617347,113671647.3992387 +SESA-CSA,SESA-CSA Option 2,,3557410232.766072,3600292353.435222,3677477111.977856,3741416704.447128,3802214044.007983,3869524355.845341,3951353630.34713,4020210646.20474,4081827035.881294,4151693712.975337,4223896965.071292,4292626780.002538,4357848505.998372,4424696962.782813,4493286239.221586,4563406227.968473,4635128864.727743,4708681983.006215,4784119166.635312,4861433148.21232,4940678891.795062,5021908334.83175,5105173430.123493,5190526439.538616,5278026793.323032,5367728476.761796,5459694731.939393,5553986465.466113,5650667585.050179,5749808127.725307,5851473947.339548 +SESA-CSA,SESA-CSA Option 3,,2245299592.3728,2272112995.896439,2322957656.495063,2366965997.862772,2408511319.942022,2454440280.722383,2509541003.374491,2555976290.048268,2597980647.357413,2645482509.932943,2694528641.379015,2741728369.954655,2787279293.562288,2834254364.451312,2882518044.424952,2931917693.944571,2982510222.032446,3034449488.824571,3087773727.309412,3142485865.995178,3198628158.02624,3256241220.567708,3315365965.127705,3376043853.47374,3438321152.876979,3502240951.429047,3567852646.149622,3635204351.440751,3704346505.765882,3775333811.979755,3848218521.894646 +SESA-CSA,SESA-CSA Option 4,,4324444816.413323,4340754954.165462,4420771689.216513,4489993470.242025,4538155860.368304,4618828980.070903,4717415273.583937,4771905110.948613,4820258064.787096,4882721059.334468,4947133766.558716,5008860198.88776,5064448968.987124,5122255557.682113,5182244375.804894,5243574984.286272,5306428247.179018,5371160294.610755,5437722965.236472,5506091023.584519,5576305323.487604,5648402827.403036,5722419954.787274,5798393273.532159,5876366162.167549,5956375614.199902,6038468222.838247,6122687206.301283,6209078309.422132,6297693455.181043,6388579270.563316 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_SEV-MEL.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_SEV-MEL.csv new file mode 100644 index 00000000..46c04ed8 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_SEV-MEL.csv @@ -0,0 +1,6 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +SEV-MEL,SEV-MEL Option 1,,69869568.20672093,70000000,70794315.92713454,71320106.256044,71819865.46475795,72415167.69367476,73332551.57874852,74098280.20705546,74690149.4802256,75388483.11170934,76130990.03875689,76821896.7486418,77427064.92534761,78016744.33589195,78617859.4976031,79231510.35607302,79856829.84001854,80497019.17311874,81152939.03938702,81823608.77708048,82509265.20994624,83210067.18358247,83926132.70423023,84657565.27689691,85404548.8267898,86167161.34229116,86945593.19003716,87739980.76231974,88550462.22536877,89377251.61268437,90220474.38222295 +SEV-MEL,SEV-MEL Option 2,,351813199.4965204,350000000,352603673.3021722,354171036.1081928,351059150.1554283,354268960.4415793,359897327.8136863,358058783.7072068,355539447.0361583,354737902.2602502,353985709.2643501,353361615.2821842,352440326.0502322,351724563.9181728,351202323.7542625,350721797.6656201,350291399.245202,349959140.6650482,349706490.3678197,349527005.3833759,349420483.2707224,349386364.0757676,349423860.2996009,349532263.0825338,349711034.8697008,349959367.4477648,350276846.9727691,350662860.2140348,351116791.1457135,351638344.427433,352226871.0578059 +SEV-MEL,SEV-MEL Option 3,,89719179.03713162,90000000,91402858.4761445,92518377.2087997,93653842.91097084,94872367.32461472,96459524.56382325,97851726.22362997,99045248.14186864,100388948.038598,101793992.408455,103116031.6323065,104287312.5398653,105445096.1683438,106623771.4099219,107824278.9131217,109046974.8105019,110295896.8547706,111572407.4075486,112875625.3292521,114206169.3689121,115564570.1454547,116951332.7491867,118366933.6365271,119812003.1157524,121287006.9525997,122792598.1084043,124329361.0488534,125897905.2911417,127498956.9860647,129133132.701047 +SEV-MEL,SEV-MEL Option 4,,351813199.4965204,350000000,352603673.3021722,354171036.1081928,351059150.1554283,354268960.4415793,359897327.8136863,358058783.7072068,355539447.0361583,354737902.2602502,353985709.2643501,353361615.2821842,352440326.0502322,351724563.9181728,351202323.7542625,350721797.6656201,350291399.245202,349959140.6650482,349706490.3678197,349527005.383376,349420483.2707224,349386364.0757676,349423860.2996009,349532263.0825338,349711034.8697008,349959367.4477648,350276846.9727691,350662860.2140348,351116791.1457135,351638344.4274332,352226871.0578059 +SEV-MEL,SEV-MEL Option 5,,99498694.73050492,100000000,102088357.4708661,103901833.4486959,105691292.2969908,107657914.4515913,109998372.6512364,111991023.9196759,113809882.6671877,115850322.3953909,117966158.0367185,119985779.9457191,121842467.8927302,123726228.1057793,125659587.4283619,127639323.0780595,129668735.3734311,131754010.620073,133897319.054818,136099105.530208,138361480.3270075,140686516.5928182,143076340.3063106,145533113.2766349,148059268.1620135,150657110.1430866,153329267.8070969,156078362.2586789,158907153.0397964,161818636.9193213,164815766.4350303 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_SNSW-CNSW.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_SNSW-CNSW.csv new file mode 100644 index 00000000..61cce360 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_SNSW-CNSW.csv @@ -0,0 +1,5 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +SNSW-CNSW,SNSW-CNSW Option 2,,5241057625.770993,5264046277.140189,5356908179.223921,5433985129.874418,5482940838.69577,5576473988.704498,5691430729.748612,5747144504.474341,5796048434.438273,5862514529.848985,5931049217.815807,5995801563.934802,6050954582.626936,6107993441.75883,6167349477.243848,6227907800.373094,6289901306.042015,6353758909.555837,6419389979.238016,6486749127.798022,6555868017.948555,6626773167.984735,6699490071.414839,6774043589.94144,6850466415.200238,6928782838.228538,7009027930.445708,7091232332.402806,7175428869.322573,7261657071.495588,7349949844.971177 +SNSW-CNSW,SNSW-CNSW Option 3,,3964860119.588969,4040604288.052058,4128916982.750792,4196386675.291804,4261889770.619661,4334442534.696641,4422712592.242187,4496962129.778207,4563342177.488747,4638582566.861749,4716373461.558872,4789136022.254206,4855912375.037993,4923638111.319123,4993023040.399751,5063863975.698468,5136244106.237967,5210401304.586634,5286392414.785786,5364203114.589561,5443887921.28716,5525497776.290726,5609083725.710945,5694696606.681081,5782395745.164021,5872233848.333816,5964273922.747327,6058576473.814649,6155205138.994862,6254230357.00403,6355718090.926866 +SNSW-CNSW,SNSW-CNSW Option 4,,3115864339.53591,3179896665.250782,3250588676.737265,3305609722.282281,3358700473.778818,3417506252.932282,3488974614.96559,3549313241.830503,3603445996.205491,3664725538.180814,3728114527.802853,3787922211.504486,3843598855.182191,3900322722.152675,3958525376.585168,4018040073.998671,4078937571.947186,4141415174.738458,4205524671.035178,4271262328.033978,4338679206.00351,4407823894.860355,4478745389.581425,4551492920.239269,4626122757.96804,4702686310.012899,4781243570.104449,4861852923.457251,4944575664.953691,5029478923.626229,5116626672.164011 +SNSW-CNSW,SNSW-CNSW Option 5,,219378449.6520472,220241137.4150026,223529120.7133971,226062286.4806898,228635884.3570644,231403978.0475837,235131644.564139,238404915.9670279,241146461.3677966,244246306.2984406,247498628.0319443,250543320.1646904,253223408.1364829,255856202.0765696,258534770.8554487,261262080.8099256,264037264.0215309,266870398.1121539,269764727.3372504,272717606.020043,275730246.4443703,278803628.7023021,281938643.5832685,285136093.590152,288397136.1381025,291722516.3171943,295113402.6828611,298570785.5383298,302095689.3117924,305689395.3215556,309352900.124254 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_SQ-CQ.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_SQ-CQ.csv new file mode 100644 index 00000000..b9ead52f --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_SQ-CQ.csv @@ -0,0 +1,6 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +SQ-CQ,SQ-CQ Option 1,,1303573751.456141,1326494087.41776,1354812107.916243,1376066959.60586,1396606906.981347,1419456299.224709,1447504507.61803,1470917832.625502,1491668962.844129,1515247276.64643,1539613750.419854,1562261945.118961,1582839562.627934,1603619191.370538,1624866317.158884,1646510779.440042,1668574646.259145,1691131125.896359,1714195099.525169,1737757362.142917,1761830991.613379,1786427719.765697,1811559123.893881,1837236417.197817,1863473425.507571,1890281497.569472,1917675072.77098,1945667552.099912,1974273026.783045,2003507483.255768,2033385212.607322 +SQ-CQ,SQ-CQ Option 2,,59026518.13298518,59249886.96809282,60246471.79133368,61063565.49193759,61901193.70065811,62791258.14026043,63926009.44592486,64920717.53142406,65779171.91969628,66739769.89190397,67742385.7505951,68681649.33872958,69502703.32264093,70310281.99578367,71130943.23431413,71965007.8423772,72812658.86558741,73676581.90233603,74557609.27079013,75455056.32144973,76369260.77846912,77300498.20921116,78249024.39842421,79215062.04698235,80198942.16167054,81200869.81784563,82221171.70175563,83260122.11745161,84318005.83519194,85395175.87367581,86491904.93566437 +SQ-CQ,SQ-CQ Option 3,,3132594604.323902,3185358710.481363,3253733882.024005,3304641030.788558,3354252738.097596,3409307554.757279,3476406454.039534,3532293643.564607,3581940303.165202,3638326068.941791,3696535341.63694,3750247318.196894,3798394799.74711,3846836149.799301,3896298667.118406,3946615516.245852,3997842505.081614,4050148953.882898,4103565805.556017,4158067261.980402,4213680363.338579,4270428707.814468,4328335385.991226,4387422375.121035,4447717793.196621,4509243581.376035,4572028906.788103,4636100211.48797,4701485415.741685,4768216760.332855,4836322189.607257 +SQ-CQ,SQ-CQ Option 5,,3709364318.2648,3761400405.4668,3834300368.0512,3887360497.4469,3939258093.8123,3996846003.5293,4069358538.6042,4130253466.1633,4183250728.7719,4243649109.830101,4306248166.5124,4363961960.512,4415497524.7516,4467084107.8578,4519729827.8489,4573302318.9628,4627839298.0132,4683533344.8778,4740424359.6055,4798476368.7122,4857716856.1149,4918169171.4326,4979855691.8078,5042797566.3132,5107022569.0813,5172551502.9628,5239413147.1523,5307633114.9497,5377238397.4148,5448260851.0448,5520727298.88 +SQ-CQ,SQ-CQ Option 6,,799623339.1919147,801400859.320186,811215294.9112558,818114446.2026503,825085008.4007161,832702568.2746979,843967499.7615027,853921666.6256627,861855446.2136016,870961356.0176637,880602007.9262943,889616785.6465712,897558706.3343949,905303200.0436041,913180780.5894475,921213684.2127897,929392142.1748247,937751101.8635272,946302468.4963583,955035430.809367,963953190.5541338,973058073.114899,982351977.2889894,991836570.7839423,1001514566.940029,1011387352.725768,1021457681.560699,1031727678.501978,1042199503.123087,1052876198.904434,1063759787.161849 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_TAS-SEV.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_TAS-SEV.csv new file mode 100644 index 00000000..b19c9483 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_TAS-SEV.csv @@ -0,0 +1,3 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +TAS-SEV,TAS-SEV Option 1,,,,,,,,4758196417.704872,4810982709.043484,4857947456.863636,4918237471.549167,4980037721.777628,5036713286.4483,5087419534.549735,5140241538.284451,5195081038.03977,5251078213.479002,5308415320.392954,5367423981.953716,5428070927.47212,5490337013.499944,5554267396.610472,5619903674.61091,5687288056.316693,5756463085.308345,5827479877.605822,5900383390.709641,5975229193.020305,6052070798.374791,6130965109.890167,6211976359.809611,6295164975.969008 +TAS-SEV,TAS-SEV Option 2,,,,,,,,,,,,2625940880.155277,2653716009.284905,2678298112.135251,2703946207.102144,2730595685.106757,2757763560.920689,2785542266.050688,2814106224.941192,2843429293.597366,2873495496.209237,2904322504.044855,2935925810.462935,2968320907.366031,3001523142.311878,3035551988.553983,3070423360.549138,3106158302.763405,3142776415.013803,3180298617.477414,3218749207.530385,3258150065.80168 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_WNV-SESA.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_WNV-SESA.csv new file mode 100644 index 00000000..f04b3b7e --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_WNV-SESA.csv @@ -0,0 +1,4 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +WNV-SESA,WNV-SESA Option 1,,794836477.118288,802511850.0079163,818737237.4735444,832431846.5170991,845522782.3902963,859930520.5334146,877631188.7720888,892677259.2675701,906073017.9925754,921230520.2957898,936930178.2324401,951961990.9092921,966243011.1311896,980852785.0267962,995838891.3835306,1011165324.594449,1026846069.833404,1042930394.153078,1059431315.820637,1076347064.38284,1093689692.900109,1111470603.630943,1129701185.768464,1148392900.757423,1167558775.765456,1187210634.438268,1207362337.22237,1228027239.864623,1249219330.860277,1270953954.413273,1293245544.989074 +WNV-SESA,WNV-SESA Option 2,,1158409670.000161,1170432704.034134,1193969776.339192,1213218096.114408,1231696483.084548,1252076816.100077,1277212671.190855,1298494970.920254,1317356190.367583,1338738712.323433,1360882436.198122,1381898053.540627,1401615352.229507,1421707232.745679,1442296593.340888,1463331856.427627,1484831391.432742,1506864607.01761,1529448615.710752,1552578677.492843,1576270180.679551,1600537471.387218,1625394801.114257,1650856410.780375,1676938761.945358,1703656466.112825,1731026982.391824,1759066962.815235,1787793869.137652,1817227023.904822,1847384350.462978 +WNV-SESA,WNV-SESA Option 3,,3196143025.247633,3198030754.252031,3251338205.935575,3296864042.393157,3322429849.561764,3378639162.965602,3448166118.470303,3477640002.430744,3503206073.654137,3540053480.704054,3578037527.257391,3614179899.102509,3644746885.639493,3676649894.941442,3710010790.764573,3744062840.23593,3778955782.900668,3814964842.444307,3852019160.268184,3890088758.488063,3929189622.930408,3969334586.459262,4010535691.277185,4052804658.608835,4096157520.380244,4140605353.883046,4186165465.674048,4232852363.313414,4280681692.087415,4329672941.020247,4379841483.042185 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_WNV-SNSW.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_WNV-SNSW.csv new file mode 100644 index 00000000..1dba8144 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_accelerated_transition_WNV-SNSW.csv @@ -0,0 +1,2 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +VIC-SNSW,WNV-SNSW Option 1 - VNI West,,6915717496.948576,7035000000,7183372233.079115,7286637706.479803,7358144529.065771,7476838199.232468,7622942782.851526,7704439238.724419,7776576981.603372,7870192244.321531,7966087743.431219,8053683639.554437,8131665017.208628,8212958711.394955,8297388966.60189,8383537427.076982,8471690300.754935,8562377417.102938,8655533070.052217,8751118098.888632,8849195823.05334,8949823431.811579,9053058621.95062,9158959159.925251,9267595951.978546,9379029601.004904,9493337007.988718,9610591262.91134,9730870199.591202,9854262667.947412,9980850836.096386 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_CNSW-SNW.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_CNSW-SNW.csv new file mode 100644 index 00000000..5ddcd3a6 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_CNSW-SNW.csv @@ -0,0 +1,11 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +CNSW-SNW,CNSW-SNW H-Dapto,,1463080602.988509,1483530174.456707,1507477213.170674,1520152095.942971,1532146326.788415,1545927720.358215,1565446629.363637,1580623786.487733,1592284257.583349,1606461456.385452,1621295035.860822,1634220958.019134,1644826742.460489,1655231500.073395,1665879144.374187,1676736585.471621,1687801790.05424,1699150249.101911,1710799001.25056,1722734465.623261,1734966755.972603,1747504192.140705,1760356050.368213,1773531453.085509,1787039951.031904,1800891144.051426,1815096816.731234,1829666378.610244,1844612398.835373,1859946321.254742,1875681014.781803 +CNSW-SNW,CNSW-SNW H-Newcastle,,1663257468.317511,1689873650.427402,1718782917.407655,1735297408.020866,1750940584.023077,1768747293.122962,1793088157.886626,1812337420.097388,1827698698.508563,1846094919.413459,1865307841.236014,1882503218.971766,1897290006.009953,1912058404.090257,1927230434.439245,1942762689.598465,1958661248.925804,1975019098.012189,1991859806.494968,2009173879.39929,2026978915.55407,2045290668.894686,2064126317.976648,2083503117.565968,2103439118.280496,2123952666.780519,2145065006.784708,2166794911.286367,2189165141.920723,2212197487.909403,2235915788.805362 +CNSW-SNW,CNSW-SNW Option 1,,1347751739.496,1367007912.6554,1390019936.693,1402932078.4498,1415273480.3677,1429281442.2486,1448460640.0744,1463502123.5037,1475387067.3551,1489671824.5603,1504592214.8085,1517777987.0132,1528765597.7765,1539630741.672,1550767366.3841,1562144118.4558,1573764476.3999,1585700624.4485,1597969603.8521,1610561421.0145,1623487867.8497,1636759178.2727,1650386595.3338,1664381318.2964,1678755066.7752,1693519689.709,1708689240.6561,1724275632.7082,1740293890.8818,1756758101.3208,1773683838.9237 +CNSW-SNW,CNSW-SNW Option 2,,509891028.6477193,513000000.0,520065447.3679777,523974564.4859982,527942971.3825076,532222435.0950087,538452069.0542269,543534559.2045227,547356711.6035928,551914005.0803214,556713294.0904982,560906110.145788,564162665.9805771,567239140.7830462,570347621.645944,573493612.4446913,576673423.2207696,579908865.696153,583206004.8962208,586558416.6498116,589967750.9277278,593435003.9153348,596961402.5381525,600547990.4662849,604195891.9948908,607906179.8969394,611680536.621714,615519719.6678606,619425498.0790986,623399147.1941133,627442272.0161599 +CNSW-SNW,CNSW-SNW Option 2d,,261300304.3996183,261000000.0,263189155.3658786,264413814.7445634,263540910.4044279,265724416.6939741,269405883.0950802,269289533.4670928,268588905.2578048,268840792.7884912,269154698.9057178,269389841.0517147,269265716.9378317,269187601.7257087,269199244.5888865,269228759.8923824,269278260.3465416,269374798.7054707,269510457.2507442,269680677.8177291,269885393.8576371,270124188.0057727,270396749.0091785,270702660.6021299,271041561.9558749,271413030.9435108,271816911.0227503,272252685.5552004,272720201.4175938,273219126.3544197,273749243.5021031 +CNSW-SNW,CNSW-SNW Option 3 Stage 1,,1727556774.349135,1780000000.0,1822458011.195332,1855625684.555333,1887269216.217037,1922096082.321295,1963835435.715363,1999189931.832841,2031294502.442877,2067867564.052673,2105854089.98274,2142914603.62923,2179187797.592787,2217024626.338665,2256259362.035912,2296810332.429129,2338745987.427433,2382218869.939434,2427286583.773605,2473984858.927668,2522379240.639113,2572534855.302483,2624520881.102603,2678408518.74612,2734272196.181016,2792188463.298864,2852240110.689241,2914509143.685112,2979084750.139461,3046057501.193655,3115523414.119449 +CNSW-SNW,CNSW-SNW Option 3 Stage 2,,577879810.7518648,580000000.0,586306184.9994144,589531376.347092,592810941.0977775,596474510.3556353,602498029.5196058,607419356.4512475,610852908.8350841,615037379.5138546,619502566.3121111,623392443.8441229,626398409.9650784,629172049.314133,631962078.2983638,634782700.5199491,637624994.2227169,640512548.0298574,643452566.236921,646436757.8097578,649466147.3398722,652540968.8256893,655661671.8052297,658828434.310674,662041517.2263944,665301064.2010523,668607827.5221853,671961566.0381618,675363033.2101076,678812451.8968598,682310322.0016886 +CNSW-SNW,CNSW-SNW Option 4,,2427474288.84397,2490000000.0,2543425005.460405,2583892009.150067,2622678106.713736,2665350287.671545,2717877597.352423,2762373777.350626,2801938108.798848,2847204338.245409,2894328002.489804,2939978350.044825,2984145471.410054,3029947460.403236,3077381949.623356,3126369520.438625,3176979851.868925,3229407551.813211,3283725656.546168,3339969311.030299,3398215441.593724,3458539898.423849,3521023378.206332,3585748733.374203,3652802627.813434,3722274092.776244,3794259852.956311,3868855029.351944,3946163769.917802,4026291469.343706,4109350042.490184 +CNSW-SNW,CNSW-SNW Option 6a,,2148446480.22366,2185475094.212615,2224858776.733552,2247883286.316181,2269560329.799337,2294262493.531569,2327308916.23573,2353340958.684437,2374467571.561196,2399678213.43967,2425949596.793154,2449597398.667942,2470121335.714527,2490743290.823431,2511952080.292338,2533675063.759416,2555928020.194315,2578834867.006692,2602426265.346336,2626692791.786132,2651659738.5781,2677350120.885519,2703788957.877739,2731001497.098204,2759014116.60739,2787853724.461886,2817551145.101077,2848134051.083688,2879635517.417907,2912087437.275863,2945524569.322565 +CNSW-SNW,CNSW-SNW Option 6b,,1686116211.19434,1711936968.208944,1741761364.160729,1758842807.870397,1775041870.046753,1793448490.831823,1818340625.238195,1837876008.297704,1853509897.518638,1872230017.064105,1891755692.848338,1909152732.694438,1923884559.943779,1938550191.336787,1953599003.441593,1968982584.555722,1984709111.764137,2000871122.169346,2017490608.976177,2034556890.539375,2052086394.572362,2070093667.89106,2088594634.959376,2107605242.158211,2127142157.73624,2147222325.514771,2167865535.114383,2189088946.882263,2210913763.893064,2233360076.607629,2256449973.296405 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_CQ-GG.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_CQ-GG.csv new file mode 100644 index 00000000..e631ef11 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_CQ-GG.csv @@ -0,0 +1,5 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +CQ-GG,CQ-GG Option 1,,2671671242.474838,2707000000.0,2752135281.33867,2773609052.649938,2792749871.383034,2816610299.239581,2850478267.234034,2874056481.927609,2891373604.939554,2913511182.546579,2936560267.834032,2955434457.099755,2969072253.360991,2982073983.079731,2995321632.902289,3008686349.191591,3022168014.248177,3035898596.438735,3049889419.312554,3064104336.217122,3078548821.612697,3093224705.582349,3108134913.388271,3123281681.320208,3138667291.599399,3154293656.124392,3170165907.739939,3186284174.193014,3202653731.864297,3219276987.851285,3236158185.075978 +CQ-GG,CQ-GG Option 2,,2336362682.124016,2367000000.0,2406279278.524142,2424964863.805204,2441582314.961013,2462359798.314033,2491930549.9093,2512485602.186692,2527544396.321258,2546819379.591583,2566895730.980004,2583339317.164818,2595218746.431987,2606538537.092574,2618073564.840088,2629711380.84333,2641451041.759803,2653408303.464169,2665593107.129522,2677973711.819459,2690554887.693649,2703338208.771165,2716326211.12009,2729520816.166084,2742923994.773436,2756537389.106358,2770365451.313875,2784408268.247633,2798670417.657503,2813153973.293569,2827862609.648574 +CQ-GG,CQ-GG Option 3,,179525948.9270546,181200214.7717473,184098565.2291159,185620788.0530643,187074992.2597783,188735130.7173275,191058455.2469265,192815901.191232,194146636.8733265,195771556.8301403,197468363.990003,198909842.5188527,199986470.8822891,201008105.9392928,202042484.7773211,203085504.6608061,204136920.9285424,205204835.9907134,206290561.1861999,207391712.8202653,208508678.5355188,209641611.6213892,210790740.4575498,211956234.6979785,213138271.8186233,214337012.7086575,215552825.6129268,216785732.6469136,218036117.2922357,219304165.0926485,220590178.2696838 +CQ-GG,CQ-GG Option 4,,190409085.6749447,192269375.5845879,195364515.9734327,196976989.606391,198511543.842594,200269834.6807852,202732628.8417485,204589173.5863677,205993158.9248113,207711249.2599041,209504789.2755194,211024960.4455444,212160252.4573644,213238599.5503756,214330913.2622732,215432493.491674,216543091.132957,217671357.8304178,218818659.9288107,219982472.5249451,221163213.8246722,222361052.7740715,223576238.2858034,224808958.5847617,226059409.8474321,227327770.6728037,228614440.6860115,229919453.3818087,231243224.9655611,232585962.258525,233947997.1570446 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_CQ-NQ.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_CQ-NQ.csv new file mode 100644 index 00000000..d8b1067e --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_CQ-NQ.csv @@ -0,0 +1,5 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +CQ-NQ,CQ-NQ Option 1,,1822592119.200375,1858536407.165872,1892703164.99209,1911907103.689798,1929191570.418231,1949663255.666309,1977580603.882437,1998826285.272987,2015727288.756192,2036259234.00906,2057633867.48695,2076697494.212314,2093351617.143842,2110162525.960902,2127477345.626088,2145200894.013853,2163339438.511812,2182002648.635014,2201211794.378535,2220955243.946985,2241251660.0495,2262117584.523361,2283571067.244178,2305630276.575063,2328314096.284855,2351641697.412637,2375635372.17224,2400314608.526486,2425703167.34816,2451823604.378864,2478700704.426386 +CQ-NQ,CQ-NQ Option 2,,5334489139.047399,5433282614.100047,5529684263.678151,5581144125.214884,5627597255.807951,5682862310.299129,5759744546.412215,5817733119.894444,5862819653.308324,5918142385.907082,5975800847.639699,6026262249.376288,6069076375.075793,6111885252.449145,6155915973.081405,6200916251.528144,6246888432.216544,6294139854.245068,6342726736.092546,6392604831.887654,6443818580.681886,6496405875.461609,6550408415.502748,6605867882.557774,6662827574.118862,6721331158.936413,6781430853.194519,6843170355.615485,6906605166.659336,6971786830.25424,7038772725.552659 +CQ-NQ,CQ-NQ Option 3,,206934192.0427212,209484412.9243323,212762587.0114091,214267241.0392185,215608418.5069465,217267338.7262761,219745385.5303842,221512841.1595584,222765391.1152645,224369183.340854,226048159.8938285,227417949.9488643,228410339.5352811,229344656.0123204,230293853.6922352,231250047.4955312,232211838.86165,233189197.2777367,234183320.0662233,235191168.1317993,236213034.1178159,237248924.3728883,238298918.8803506,239363037.3413427,240441295.8991612,241533682.8390932,242640417.6581966,243761337.1499413,244896660.4973746,246046384.3956486,247210634.2087784 +CQ-NQ,CQ-NQ Option 4,,1936816395.671983,1974060000.0,2010411058.251824,2030982422.153637,2049668628.606248,2071609817.137272,2101325426.282218,2124049608.589242,2142218084.520888,2164211084.387144,2187096023.83018,2207515709.187678,2225281572.520968,2243191682.813458,2261624353.787481,2280483144.589492,2299776835.823105,2319619924.937933,2340034920.634248,2361009543.495233,2382563304.795723,2404713465.575566,2427478888.178625,2450878528.553078,2474932098.67488,2499659602.944013,2525084343.050869,2551226599.474138,2578111208.755167,2605761693.873894,2634203921.443284 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_CSA-NSA.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_CSA-NSA.csv new file mode 100644 index 00000000..58a7f7a4 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_CSA-NSA.csv @@ -0,0 +1,6 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +CSA-NSA,CSA-NSA Option 1,,2162943803.786598,2190000000.0,2227238119.233772,2248486460.42168,2267798732.051927,2290573954.449504,2321963239.675815,2345853694.273611,2364616236.568574,2387464553.888975,2411269344.352783,2432371414.206003,2450526937.091255,2468722648.980539,2487409806.841384,2506494185.755835,2525978270.387547,2545983329.398594,2566531533.287261,2587604821.142539,2609220235.288603,2631392128.189764,2654136383.406603,2677468727.523562,2701405529.12026,2725963193.825356,2751161487.718301,2777016655.362282,2803549599.255466,2830779551.756372,2858727965.202223 +CSA-NSA,CSA-NSA Option 2,,2502345378.405035,2530000000.0,2576591123.295566,2609986935.288734,2640886930.927183,2675862798.193094,2721090546.163557,2757708022.655647,2788632427.942434,2824865479.584936,2862539543.993982,2898079904.143717,2931707154.698949,2966319339.805416,3002015621.168067,3038682250.244245,3076343647.363227,3115166994.762341,3155194795.491374,3196426870.129522,3238904756.389034,3282667414.387343,3327756725.402223,3374215083.658258,3422086692.568986,3471416361.338211,3522254208.128862,3574646988.505881,3628647935.9497,3684309358.80776,3741687457.958413 +CSA-NSA,CSA-NSA Option 3,,3470247415.319744,3510000000.0,3572942311.182477,3615223894.587136,3654408075.530478,3698993730.809795,3757600360.404314,3804467085.452698,3843317780.269676,3889235155.332016,3937009068.667294,3981326141.334858,4022249088.560855,4064089484.909814,4107196239.749702,4151422835.050241,4196792585.769283,4243524967.729423,4291672211.211652,4341224866.399315,4392231051.794169,4444735057.922765,4498784695.744941,4554428191.620471,4611715820.386671,4670698394.262602,4731433515.470108,4793973805.731358,4858380370.071696,4924712597.733155,4993034695.856039 +CSA-NSA,CSA-NSA Option 4 Stage 1,,3267687553.905117,3311720090.626481,3368899405.486403,3400140614.682831,3428576287.293089,3462194146.60767,3508594542.382306,3543527488.938869,3570738028.814695,3604105925.416152,3638836263.765399,3669124013.74816,3694585454.147219,3719986340.401369,3746061433.840262,3772662105.903578,3799792064.67244,3827631666.705779,3856211005.396203,3885500160.489669,3915522066.827974,3946295493.136167,3977841351.47959,4010180285.576416,4043333741.042357,4077323091.718946,4112174688.939531,4147909432.300342,4184555123.807623,4222136881.063406,4260683049.010652 +CSA-NSA,CSA-NSA Option 4 Stage 2,,474020855.6678854,475089332.2580604,480055659.8922855,482674276.9693803,485396785.8319734,488345938.8396031,493286838.8016624,497428008.1867141,500295168.5089433,503755676.5454594,507460055.0458151,510708514.7984236,513218673.2583799,515517210.9158485,517824644.1427779,520156688.6734047,522504146.0903112,524886354.6921333,527309763.8506868,529767272.9723442,532259659.3023279,534787055.4587928,537349752.9175884,539947813.9669464,542581362.059446,545250426.4370309,547955526.3054117,550696355.1824439,553473424.2755067,556286802.0009781,559136772.6443162 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_MEL_WNV.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_MEL_WNV.csv new file mode 100644 index 00000000..ecd4507e --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_MEL_WNV.csv @@ -0,0 +1,5 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +MEL-WNV,MEL-WNV Option 1,,127676016.1851726,128000000,129140816.286119,129668164.6227721,130215099.0826814,130840362.2139417,132027006.0956434,133013839.6933926,133647752.9251622,134436966.5947715,135292566.3787261,136033082.84006,136605018.3594865,137120338.0197569,137638213.3449138,138163494.0062654,138693025.2378075,139232214.9435405,139782902.997728,140343138.6952652,140913167.5499367,141493055.6163081,142082910.3350266,142682780.3176244,143292736.6018927,143912817.6038352,144543198.7488593,145183851.7134272,145834950.4171565,146496565.5846612,147168825.9615124 +MEL-WNV,MEL-WNV Option 2,,173234778.7082777,174000000,175956067.062819,176970186.8641205,178028730.7651024,179156745.1733934,181030889.3401563,182643393.881901,183785435.4339638,185156229.9103364,186621245.7407068,187913579.1722998,188967687.6339944,189962145.8608609,190971965.4650255,192002867.9545509,193051695.1346686,194126461.5312026,195230243.0293642,196361117.8227795,197520165.9781094,198708258.9502964,199926368.0917977,201175431.7610084,202456454.5588567,203770444.6197264,205118654.6387819,206502088.627731,207922098.9814244,209379936.2306152,210877000.6725009 +MEL-WNV,MEL-WNV Option 3,,1319992040.400243,1330000000,1354335591.129232,1370470857.490359,1385913369.940917,1403312694.021288,1426041491.623,1444648291.599715,1460357429.230505,1478788234.834432,1498084708.61123,1516055617.374894,1532452954.386159,1549210013.082205,1566605245.991401,1584609361.267422,1603247505.081286,1622616456.473798,1642754175.094608,1663674753.352558,1685415334.712569,1708012787.830596,1731506508.466818,1755937342.093846,1781348262.259279,1807783955.319894,1835293220.835458,1863924462.424289,1893731193.174468,1924767992.799103,1957093206.47706 +MEL-WNV,MEL-WNV Option 4,,69887399.30197106,70000000,70318924.18369961,70381538.10424611,70462204.47862253,70580768.43991287,71027942.93837719,71426447.79227808,71628973.44884191,71899331.30346136,72207024.1710048,72476460.19600928,72703797.09067325,72901174.4760211,73098254.38709849,73299502.04556417,73502557.05178401,73710102.73751946,73923333.8237024,74141143.56338221,74363619.4735825,74590741.50405304,74822512.60634376,75058894.46403287,75299866.6690567,75545381.26391424,75795456.90826578,76050018.7928844,76309075.9936,76572594.61686115,76840561.18043749 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_NNSW-SQ.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_NNSW-SQ.csv new file mode 100644 index 00000000..6260eb55 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_NNSW-SQ.csv @@ -0,0 +1,5 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +NNSW–SQ,NNSW–SQ Option 1,,2353095914.780407,2400173023.601163,2445667664.949448,2472843744.635897,2497931938.471054,2526826628.549537,2565062667.757429,2595004532.070617,2619583757.009668,2648904767.031642,2679402309.930438,2707111384.367894,2731784718.169125,2756822209.234427,2782619138.226908,2809066260.884377,2836184894.340158,2864119111.436635,2892902484.364275,2922527376.914771,2953024562.808436,2984422341.731409,3016751371.96053,3050042692.928782,3084328658.963526,3119642284.328675,3156021058.071026,3193499077.786375,3232116478.926597,3271912180.125957,3312928442.338427 +NNSW–SQ,NNSW–SQ Option 4,,8980741113.231022,9022824334.865597,9147468106.660229,9223105803.706224,9247270954.770487,9351391253.17025,9492105512.726036,9526201197.556787,9546658626.193623,9595981602.152142,9647247527.469257,9691661744.081688,9720362901.927114,9751275036.116316,9785165486.837088,9820025794.747122,9856165108.012157,9894330725.790964,9934326548.656456,9976060405.67709,10019561824.2343,10064849314.12898,10111947702.76666,10160879237.07911,10211669242.49205,10264341907.43236,10318933115.37514,10375465083.50688,10433976703.32545,10494500227.52033,10557074629.77098 +NNSW-SQ,NNSW-SQ Option 2,,2934573816.482253,2989000000.0,3044264561.290341,3076094313.403977,3105687288.113445,3139752846.457292,3185204710.219359,3220511615.38192,3249110675.281825,3283426771.859245,3319126128.291814,3351078613.735284,3378774630.082631,3406661463.828455,3435348425.402223,3464711116.20234,3494770852.736877,3525698500.360878,3557531351.872412,3590254143.23669,3623899046.510413,3658494958.596277,3694073367.306912,3730665992.508317,3768305896.87027,3807026682.763352,3846867174.132815,3887861705.64702,3930051772.050427,3973477034.33419,4018180901.371754 +NNSW-SQ,NNSW-SQ Option 5,,5176567754.898054,5270663992.4,5367238762.322046,5420678495.3309,5470392653.898149,5527939404.255488,5605163766.243466,5664381767.165137,5711817523.919097,5769185575.323388,5828834145.900623,5881397769.581192,5925904578.026749,5970474621.103421,6016281210.014363,6063102912.670405,6110973280.027248,6160184000.563298,6210792837.252367,6262765520.616203,6316150647.145057,6370990733.594899,6427332418.586421,6485222472.987802,6544709622.839108,6605843132.628369,6668681044.062211,6733273156.344783,6799681358.141226,6867963887.65582,6938185072.066574 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_SESA-CSA.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_SESA-CSA.csv new file mode 100644 index 00000000..0223c5b4 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_SESA-CSA.csv @@ -0,0 +1,5 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +SESA-CSA,SESA-CSA Option 1,,79605099.11607836,80500000.0,81704094.44501828,82252271.84192652,82774921.02566078,83363302.43895051,84290133.02937178,85010752.78374778,85507732.92318687,86128359.449102,86782963.22286513,87317775.69886301,87704653.37036158,88060576.47868195,88420333.35214767,88782921.66467156,89146869.56564379,89516013.40341553,89891125.89110474,90270926.6553379,90655538.14010565,91044972.58553886,91439263.0598371,91838420.97451562,92242454.05842571,92651358.7632964,93065221.69093409,93483980.87281273,93907720.76265472,94336440.06512381,94770185.8458926 +SESA-CSA,SESA-CSA Option 2,,3557410232.766072,3601427343.75888,3670002044.6708,3716816061.818513,3760047694.574675,3809239838.662886,3872485067.792016,3922829852.287534,3965250238.906821,4015246842.340053,4067132157.790321,4115406536.024822,4160216534.02571,4206239324.701285,4253686298.880197,4302372198.662823,4352337798.06216,4403814525.079791,4456855008.280177,4511454708.712142,4567667190.19754,4625542225.078103,4685133479.132831,4746495245.171021,4809684067.678873,4874757214.969851,4941779229.843978,5010809565.571605,5081916748.594853,5155167625.139565,5230634331.713801 +SESA-CSA,SESA-CSA Option 3,,2245299592.3728,2272961952.856031,2319008882.078977,2353008663.468879,2384298712.164082,2419703132.655256,2464038762.418552,2499750141.152198,2530644671.634048,2566672132.63847,2604000883.595321,2639423951.734597,2673237171.388699,2708260106.611623,2744412049.818466,2781554416.179846,2819726896.643003,2859087642.084024,2899674805.471357,2941494459.448556,2984589294.1015,3028999858.559098,3074769672.115408,3121942950.810981,3170565740.558875,3220684853.488452,3272352242.40762,3325616893.650962,3380534055.596356,3437158274.581086,3495548012.235464 +SESA-CSA,SESA-CSA Option 4,,4324444816.413323,4341980110.698075,4409241087.779547,4456192499.041905,4482435865.910989,4540719752.35338,4616318770.83748,4647794727.811417,4672407529.586779,4710298859.450075,4749558381.580209,4785887376.161685,4816099689.672342,4848037656.638367,4881750782.534184,4916415273.355007,4952179053.644772,4989396632.05947,5028012759.797091,5068002358.914688,5109400588.648113,5152237702.014277,5196547962.461807,5242365038.85113,5289724839.580155,5338663242.766338,5389223066.835225,5441440819.618356,5495362219.591046,5551030383.649039,5608492913.819438 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_SEV_MEL.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_SEV_MEL.csv new file mode 100644 index 00000000..14e2f6c7 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_SEV_MEL.csv @@ -0,0 +1,6 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +SEV-MEL,SEV-MEL Option 1,,69881190.75599928,70000000,70572522.29286268,70830687.72925174,71077506.05776562,71400241.8883471,72032555.18730232,72523083.59914376,72824011.53827086,73213780.77826087,73639000.67396371,74005853.54717796,74284664.82070659,74533671.46885411,74784278.37604569,75038468.95921345,75294573.2907436,75555637.45579538,75822528.51917268,76094147.01019649,76370585.59730825,76651836.83986308,76937914.39931768,77228796.94838472,77524474.82535939,77824917.34768565,78130165.45472611,78440149.90447466,78754905.79185498,79074411.88979708,79398674.50471154 +SEV-MEL,SEV-MEL Option 2,,351878140.4421335,350000000,351412568.6578764,352185908.1704484,348541728.5023388,351200183.9913221,356269541.4384438,353894417.7547165,350793114.9910908,349386401.9164226,348019567.0618727,346772083.6137312,345224649.8624483,343855747.4371424,342665417.296912,341503361.8609884,340375186.2446303,339328956.244601,338346135.4481917,337419898.0803016,336549652.8154958,335734319.0794767,334972968.0926723,334264516.1363255,333607989.9982594,333002302.1603383,332446691.0962798,331940038.531049,331481571.380435,331070369.4021065,330705627.2842457 +SEV-MEL,SEV-MEL Option 3,,89711498.5423459,90000000,91132655.94679858,91774928.84132475,92427814.8091604,93140476.00555232,94202448.48896545,95071412.86205684,95719247.34280808,96492245.70469396,97309744.45937434,98032675.12697145,98600858.59306513,99137080.50229193,99679135.77597834,100228609.072599,100784802.691348,101351534.0132557,101929982.2483602,102519085.3687917,103119196.8129195,103730560.0328734,104353465.0376506,104988171.0561371,105634959.8886633,106294110.1916344,106966010.6642167,107650897.7935092,108349189.6700455,109061228.3662076,109787418.6096856 +SEV-MEL,SEV-MEL Option 4,,351878140.4421335,350000000,351412568.6578766,352185908.1704484,348541728.5023388,351200183.9913221,356269541.4384438,353894417.7547165,350793114.9910908,349386401.9164226,348019567.0618727,346772083.6137312,345224649.8624483,343855747.4371424,342665417.296912,341503361.8609884,340375186.2446303,339328956.2446008,338346135.4481917,337419898.0803016,336549652.8154958,335734319.0794767,334972968.0926723,334264516.1363255,333607989.9982594,333002302.1603383,332446691.0962799,331940038.531049,331481571.380435,331070369.4021065,330705627.2842457 +SEV-MEL,SEV-MEL Option 5,,99466256.73241228,100000000,101807459.6476684,103011736.2734889,104165681.4979848,105477062.5536684,107141859.5411992,108454605.2699271,109570436.4442991,110881895.492705,112249122.9187794,113509766.4630596,114605513.9198257,115711948.8468758,116853504.2450856,118027416.6413713,119236019.8058139,120485433.085061,121777639.2067272,123113067.6592879,124493673.6547581,125921362.796668,127398190.677777,128926269.9436933,130507826.9444677,132145176.2745928,133840876.5530482,135597396.5263653,137417542.4968403,139304134.5102846,141260204.8474846 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_SNSW-CNSW.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_SNSW-CNSW.csv new file mode 100644 index 00000000..a31104fe --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_SNSW-CNSW.csv @@ -0,0 +1,5 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +SNSW-CNSW,SNSW-CNSW Option 2,,5241057625.770993,5265357801.793276,5340617821.989651,5387037018.177846,5405670190.906187,5468177378.911659,5551198638.135002,5574839177.825273,5590685631.697116,5622895867.197213,5656307216.746759,5685515704.342807,5705088721.301779,5725821106.68908,5748239457.152644,5771246181.519311,5795029728.395072,5820010077.817952,5846083555.596605,5873200572.96836,5901381032.391798,5930638567.894682,5960990684.564217,5992453430.927415,6025044783.968316,6058782222.558665,6093690239.199157,6129785215.193707,6167093732.256639,6205638472.863995,6245446250.783499 +SNSW-CNSW,SNSW-CNSW Option 3,,3964860119.588969,4041761719.600004,4118394419.398349,4162251103.017395,4203249698.453537,4250471748.673709,4312675634.897709,4360834951.061645,4400209229.623705,4447463542.332386,4496580176.629127,4540403534.673676,4578239416.521831,4616414550.616951,4655744539.310362,4696054844.914172,4737387721.730908,4779979092.774915,4823881674.163501,4869080813.083302,4915625627.562393,4963561026.304871,5012935731.81367,5063799140.764,5116202797.223541,5170199199.390155,5225848427.625312,5283204798.130894,5342332733.141922,5403294554.871529,5466158162.768218 +SNSW-CNSW,SNSW-CNSW Option 4,,3115864339.53591,3180853981.227194,3242856628.449308,3280203066.224942,3314967117.022596,3354848144.988091,3406857123.4253,3447720642.461115,3481688071.399167,3522082491.655842,3564079872.295699,3602300969.872542,3636384391.338824,3671062506.155558,3706848729.361724,3743598076.799499,3781350702.256576,3820303989.877601,3860507084.531894,3901956947.537416,3944701456.30639,3988785496.609887,4034257461.723462,4081166643.962653,4129564484.251545,4179503614.838125,4231043175.615773,4284238167.504682,4339152127.142535,4395847428.063818,4454391461.873211 +SNSW-CNSW,SNSW-CNSW Option 5,,219378449.6520472,220250845.3707078,222895267.4699894,224335430.2146614,225791165.9249657,227382307.4196597,229889303.5876772,231944934.5050291,233410654.9396933,235177212.1210068,237056037.2243632,238699813.8228896,239970296.9219419,241149933.6840522,242339629.242078,243543846.5527979,244758917.9722765,245994484.2603987,247253396.084353,248532516.7496537,249832409.8370583,251153351.3601043,252495697.4316686,253859717.0721325,255245708.3366653,256653939.9247418,258084927.1654787,259538796.4267845,261016082.4065953,262517112.3742417,264042336.7705252 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_SQ-CQ.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_SQ-CQ.csv new file mode 100644 index 00000000..254b8e25 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_SQ-CQ.csv @@ -0,0 +1,6 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +SQ-CQ,SQ-CQ Option 1,,1303573751.456141,1326871463.540693,1351307866.113961,1364642442.191259,1376930089.028581,1391246997.899102,1410508176.127531,1425105399.286812,1436726757.774627,1450842529.537745,1465504528.990805,1478342432.031497,1489087650.076241,1499817756.716477,1510831004.718224,1522065620.273421,1533529366.094117,1545293905.51188,1557371799.790601,1569752742.156253,1582447047.858747,1595463450.346822,1608811632.777324,1622501229.06109,1636542250.619436,1650944799.251505,1665721035.413984,1680880935.883776,1696437435.168859,1712402414.720626,1728789160.401928 +SQ-CQ,SQ-CQ Option 2,,59026518.13298518,59260043.4792329,60088459.21787293,60564164.15176618,61042724.34602081,61558298.04317173,62305826.68711754,62909412.41116178,63359687.25049146,63896019.23623476,64461235.24831779,64954538.90585475,65327041.61148789,65674469.01422707,66024433.94677629,66377437.37315182,66732866.0063137,67093282.24661536,67459333.65067838,67830177.33863048,68205935.13335174,68586653.98522568,68972401.72388807,69363222.69816211,69759165.07162677,70160271.66694032,70566650.43065691,70978294.83396715,71395316.83604355,71817764.0184403,72245717.73474273 +SQ-CQ,SQ-CQ Option 3,,3132594604.323902,3186285025.813799,3244908474.731278,3275672099.020056,3304252066.726766,3337565913.505028,3382270884.529615,3415676740.88555,3442064172.003379,3474343528.85411,3507828068.493628,3536554477.968971,3559679896.792941,3582562677.6483,3606005238.128911,3629861011.236319,3654150478.070539,3679038185.854877,3704549013.759261,3730654160.557493,3757373416.054375,3784722616.572404,3812719616.967813,3841381988.889479,3870727971.265473,3900775773.592353,3931548319.332662,3963063043.024266,3995344234.358351,4028413375.754895,4062295026.252833 +SQ-CQ,SQ-CQ Option 5,,3709364318.2648,3762117174.6172,3823379823.5442,3854584341.9496,3883941408.5617,3918090851.5854,3966412408.4866,4003152622.5899,4031084486.705,4065424586.0377,4101289720.9811,4131955035.2803,4156387417.7618,4180207191.9816,4204544773.788001,4229297444.2051,4254460457.954899,4280220234.2001,4306611367.6466,4333593761.7136,4361186584.8803,4389404148.3349,4418262830.4146,4447778364.8727,4477967196.2359,4508845470.669,4540434541.923,4572749383.0811,4605812493.4818,4639643099.6474,4674263592.9766 +SQ-CQ,SQ-CQ Option 6,,799623339.1919147,801313384.8038919,808672992.6945382,812264183.4915679,816009599.7860886,820175567.5485209,827836806.4860681,834271246.0874257,838493984.0417976,843681022.368817,849286999.3150141,854177527.394489,857962015.1520144,861381440.2869217,864811819.9036306,868284165.110577,871779127.8414786,875329794.7483069,878947599.6356366,882620121.1923137,886348583.739319,890133092.9378994,893974001.3978504,897871268.0348365,901824967.0246444,905834976.6956867,909901995.2209378,914025394.2063261,918205831.1064527,922443268.7812606,926738007.5407531 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_TAS-SEV.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_TAS-SEV.csv new file mode 100644 index 00000000..664a49ee --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_TAS-SEV.csv @@ -0,0 +1,3 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +TAS-SEV,TAS-SEV Option 1,,,,,,,,4758196417.704872,4782716155.33938,4800447312.752652,4830815167.211724,4862024263.798799,4887729914.935706,4907174677.350707,4928117214.373827,4950578311.59971,4973703972.653053,4997645455.651491,5022735105.760161,5048929924.824503,5076208527.985629,5104609070.378649,5134165257.300837,5164915435.661387,5196898881.427257,5230157342.801582,5264734118.197736,5300680081.186997,5338041180.633592,5376873759.356364,5417232647.930758,5459178869.459803 +TAS-SEV,TAS-SEV Option 2,,,,,,,,,,,,2625940880.155277,2637600455.765524,2645822810.105817,2654796359.531283,2664520271.208206,2674502081.630073,2684819138.054089,2695649847.254858,2706961500.224804,2718735711.690042,2730986013.061446,2743723172.0928,2756960054.630282,2770709643.802926,2784985816.308649,2799802858.800431,2815178608.680976,2831127837.269469,2847670315.071234,2864824485.632106,2882611513.213153 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_WNV-SESA.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_WNV-SESA.csv new file mode 100644 index 00000000..426bfbb6 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_WNV-SESA.csv @@ -0,0 +1,4 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +WNV-SESA,WNV-SESA Option 1,,794836477.118288,802732351.1137534,817065188.2065552,827146512.311473,836557792.4900365,847158635.1307142,860946642.3770814,872103832.3513821,881458709.7697407,892423203.0876127,903831241.2282101,914530793.1058507,924480646.5183431,934659548.9629786,945139308.6622001,955889497.2632232,966917121.8865551,978272045.968721,989966977.4879658,1002000536.682385,1014384308.530108,1027129038.571852,1040246327.106078,1053747863.222632,1067645846.117093,1081952638.361895,1096682170.750568,1111847240.432631,1127462649.314775,1143542826.300678,1160103329.50347 +WNV-SESA,WNV-SESA Option 2,,1158409670.000161,1170735377.647438,1191312542.125175,1204919326.065307,1217628201.914327,1232032016.894756,1251020817.629234,1266184962.846342,1278691646.285847,1293479460.901164,1308870225.683643,1323068612.276623,1335970614.228554,1349091058.120756,1362588189.58733,1376418848.921002,1390590493.565437,1405172871.758399,1420182458.776047,1435614735.745637,1451484045.627051,1467803430.349046,1484587029.865717,1501849042.304957,1519604280.39975,1537867700.821993,1556656403.486093,1575985750.197959,1595873879.584168,1616338268.95049,1637397889.092939 +WNV-SESA,WNV-SESA Option 3,,3196143025.247633,3198784972.892317,3241476979.381652,3269339709.615916,3277692488.773823,3316327226.90739,3367774613.42651,3379102765.383202,3385968895.415273,3403440591.52388,3421563456.728269,3437604414.033821,3448050522.755776,3459421681.232426,3471896892.193518,3484718475.133692,3498010758.469036,3512043968.258884,3526739332.220067,3542064420.643876,3558028295.443279,3574636102.882299,3591895278.818056,3609812149.202301,3628394160.890992,3647648251.72093,3667585390.805991,3688211608.934859,3709538773.868634,3731576320.261024,3754335909.307354 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_WNV-SNSW.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_WNV-SNSW.csv new file mode 100644 index 00000000..e7adaef2 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_slower_growth_WNV-SNSW.csv @@ -0,0 +1,2 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +VIC-SNSW,WNV-SNSW Option 1 - VNI West,,6923644725.045819,7035000000,7181765686.311264,7288681688.628414,7391251061.627918,7505356982.902739,7646516286.304267,7764185784.264927,7868278820.555073,7988343521.022585,8113463605.972633,8233079328.505826,8346616156.259977,8464158142.254726,8586170558.704185,8712430263.459728,8843160641.339987,8978919314.652208,9119927432.617592,9266303852.982948,9418285733.100895,9576109387.045767,9740026613.260553,9910297802.72872,10087196257.48918,10271004845.83473,10462030617.11315,10660579044.32831,10866984406.42496,11081587694.19576,11304751820.63507 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CNSW-NNSW.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CNSW-NNSW.csv new file mode 100644 index 00000000..e9d73935 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CNSW-NNSW.csv @@ -0,0 +1,6 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +CNSW-NNSW,CNSW-NNSW Option 1,,2554497426.1175,2583135189.0305,2610280673.0072,2637532493.9797,2666692755.7874,2708821665.8372,2740683346.1842,2766210014.2117,2797830540.7527,2830323413.3364,2859436106.2779,2883934014.3278,2908618320.1561,2933762183.7561,2959372800.4356,2985404735.6852,3012046257.9004,3039292304.0936,3067122251.6532,3095553514.5275,3124602533.17,3154282401.9004,3184608140.6437,3215595234.688,3247260491.0748,3279620370.6236,3312692963.4339,3346497262.8373,3381051709.2285,3416377817.2499,3452496444.7404 +CNSW-NNSW,CNSW-NNSW Option 2,,2212772406.937,2241270834.8427,2267415385.9259,2293264488.4654,2320925901.2652,2359970740.0749,2390095838.0777,2414851995.154,2445036545.584,2476055021.5977,2504515199.1005,2529424505.4419,2554752156.9174,2580634530.3728,2607081483.9704,2634061839.4008,2661746700.5947,2690137991.1208,2719225315.1544,2749031209.7111,2779577905.2982,2810884910.5071,2842973789.8769,2875866898.1475,2909588070.667,2944161207.9547,2979612020.049,3015967427.747,3053254267.3269,3091502548.0897,3130742090.9509 +CNSW-NNSW,CNSW-NNSW Option 4,,3750181267.376547,3762610282.46868,3802024321.120346,3808948200.410828,3864942949.60337,3937581272.053545,3946534977.518597,3957917680.806791,3981408815.816318,4006415114.217877,4029292407.387027,4043812091.505154,4060348207.598185,4078157732.536877,4096231554.386321,4114856115.799567,4134369958.856196,4154617630.169986,4175565102.830087,4197215758.526772,4219572494.429605,4242633324.1339,4266398428.934459,4290868143.453363,4316043809.797736,4341925812.336588,4368516355.537535,4395817926.655129,4423831959.054397,4452563000.080445,4482014071.611648 +CNSW-NNSW,CNSW-NNSW Option 5,,5115181564.384226,5146677214.900535,5204016406.197523,5226894140.755706,5303369617.000785,5402676600.691742,5429075969.463704,5455997944.010648,5498573965.224549,5543184821.634607,5583890634.591812,5613703754.165851,5646038736.187366,5680040098.584028,5714627497.033747,5750110360.136243,5786931777.98627,5824926332.646976,5864055368.691856,5904335195.380222,5945781708.36389,5988404220.232448,6032215569.687755,6077229198.012747,6123460412.354882,6170923659.557148,6219636261.616391,6269616607.250427,6320881876.496249,6373454380.209703,6427354739.913347 +CNSW-NNSW,CNSW-NNSW Option 6,,443570697.8856544,443082826.4645693,444119453.8001245,445327893.2704594,446059606.3383123,449542780.2919317,452406077.7481922,453368840.8207759,455300121.3857737,457363615.7920827,459352005.323853,460905074.5551999,462276499.723672,463670951.2985738,465113751.0796763,466573912.4122943,468084752.5340786,469646830.3098586,471253489.7388421,472905632.6699378,474603672.7886775,476347505.8010891,478137064.9695982,479972322.5103026,481853384.1769846,483780103.3495616,485752624.7933937,487770966.7713853,489835153.7247133,491945402.8575861,494101797.8514387 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CNSW-SNW.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CNSW-SNW.csv new file mode 100644 index 00000000..c2fea8b6 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CNSW-SNW.csv @@ -0,0 +1,11 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +CNSW-SNW,CNSW-SNW H-Dapto,,1463080602.988509,1479618536.84496,1495372294.630409,1511223015.018007,1528137516.625759,1552512288.71089,1571098002.581538,1586064206.707279,1604508148.762608,1623463187.86801,1640593033.348246,1655184049.424546,1669914513.423023,1684925280.912847,1700222815.874559,1715781884.918931,1731710033.243993,1748005587.554281,1764657597.154017,1781676682.287902,1799073076.21654,1816855040.349283,1835032024.779044,1853613760.784538,1872610768.363607,1892033414.009904,1911893015.224578,1932201459.740105,1952970354.885632,1974213120.526741,1995942806.420634 +CNSW-SNW,CNSW-SNW H-Newcastle,,1663257468.317511,1685630070.342616,1705537333.350353,1725257033.426299,1746412006.642709,1776034485.083252,1798886151.181511,1817789564.102336,1840786436.739198,1864408689.620612,1886075900.642072,1905108063.214574,1924489270.449976,1944298291.891682,1964540671.54133,1985196053.32853,2006392848.463659,2028132527.600907,2050408038.373128,2073236782.493736,2096635990.30884,2120620861.467903,2145208175.707537,2170415331.638371,2196260860.105036,2222763371.419059,2249942861.426243,2277820267.295311,2306416480.522168,2335754823.27296,2365858499.885249 +CNSW-SNW,CNSW-SNW Option 1,,1347751739.496,1363475752.7565,1379296385.3759,1395138856.4571,1412064281.4419,1435727850.4783,1453895601.4631,1468892654.4268,1487133860.4821,1505868697.6454,1522955575.1135,1537610873.3593,1552475399.6695,1567637597.4723,1583105307.6777,1598861325.0889,1615006255.7093,1631539859.2201,1648454325.2603,1665761643.2941,1683473534.9728,1701599990.8377,1720152191.8228,1739141694.6148,1758580873.5953,1778482065.4688,1798858598.764,1819724460.8497,1841093459.8739,1862981246.0893,1885403242.6677 +CNSW-SNW,CNSW-SNW Option 2,,511053812.1495831,513000000.0,518040360.0629575,523496958.9349936,528884757.5378076,536835295.1203192,543218940.83698,548226319.9077897,554325909.7837219,560602880.4639415,566400783.653986,571097840.8770295,575762924.349494,580482212.5347315,585274427.5089288,590126507.816057,595071781.4297173,600110531.0631427,605237361.1755131,610454402.6004622,615763644.8875757,621166253.1400566,626663766.442233,632257708.9327137,637949803.7608509,643741635.8996564,649635018.2380085,655631881.730898,661733966.7885414,667943535.8027666,674262593.7533145 +CNSW-SNW,CNSW-SNW Option 2d,,260208971.2604623,261000000.0,263101678.657328,262187976.9915009,265119345.2181548,269719775.7873939,269452953.6821424,269103956.0947608,269720610.1920426,270441356.9380379,271119724.7558854,271361769.1044396,271707821.7127792,272156424.7439274,272623868.636907,273122217.360533,273681699.1748503,274289978.4613816,274943542.25739,275642490.7595279,276386770.2215328,277176012.9314173,278009949.7930742,278888336.5163636,279811011.4977037,280777718.5303628,281788339.4212018,282842748.3164156,283940783.2476287,285082450.7811269,286267667.2575687 +CNSW-SNW,CNSW-SNW Option 3 Stage 1,,1730416970.212276,1780000000.0,1816069773.071944,1849606754.244125,1886231777.674808,1931623945.92775,1968626365.71878,2002692610.003158,2042105145.308178,2082514915.475639,2121859742.6585,2160306244.776599,2200552891.137964,2242082582.344741,2284892776.024038,2329023241.749507,2374656475.873219,2421820399.377617,2470549057.314944,2520901929.765693,2572940246.953486,2626724830.72814,2682319848.807245,2739792454.803638,2799212807.524116,2860653088.271921,2924189306.378586,2989900698.142317,3057868579.293396,3128179641.811733,3200922831.522704 +CNSW-SNW,CNSW-SNW Option 3 Stage 2,,579132281.9905252,580000000.0,584419529.7381753,589281844.0499678,593955968.3285354,601679942.352815,607865497.4278849,612276093.1517148,617906028.0957278,623728158.5470631,629160778.3433938,633512948.685142,637770189.6597159,642072992.57523,646445895.5355107,650867999.6462846,655377265.6347878,659973929.7105433,664650924.5938518,669409853.1662028,674252074.4356492,679178031.3784828,684188496.4798138,689284208.1017613,694466094.0016869,699734864.5299257,705091487.1227399,710536964.1784292,716072118.1829132,721698244.2895316,727416337.4303244 +CNSW-SNW,CNSW-SNW Option 4,,2431790878.854579,2490000000.0,2534708848.89834,2576803294.427491,2622162315.005805,2680064222.553306,2727322441.746121,2769718116.591266,2819220204.828315,2870018073.352487,2919321482.243913,2966874953.536421,3016422061.771209,3067490364.124168,3120097987.799026,3174271212.355972,3230250955.293973,3288070286.946664,3347763275.647367,3409400219.712337,3473053201.817905,3538793197.111507,3606695269.912439,3676837942.717688,3749303371.527689,3824175889.050045,3901544479.842526,3981501881.640443,4064143142.761011,4149569876.532707,4237886116.011255 +CNSW-SNW,CNSW-SNW Option 6a,,2148446480.22366,2180191667.549747,2207562303.518389,2234434620.88196,2263623111.656653,2303626139.442353,2334346247.792084,2360283123.216065,2391582764.522805,2423713922.507396,2453236764.999702,2479384869.294074,2506117823.136703,2533460055.22774,2561407088.102825,2589942913.455949,2619235287.166118,2649286517.421783,2680090155.398506,2711670943.976247,2744053634.268628,2777260377.317516,2811315544.796947,2846244407.683203,2882073803.301047,2918830815.026436,2956544402.233423,2995244920.373888,3034962727.444505,3075731536.763266,3117585002.201715 +CNSW-SNW,CNSW-SNW Option 6b,,1686116211.19434,1707750862.656657,1728365607.736241,1748853159.502837,1770928055.986383,1801439350.064246,1824848851.862262,1844426913.879656,1868106457.449123,1892419946.257186,1914672483.593624,1934007838.386429,1953688329.579513,1973780667.670219,1994288176.677823,2015194029.893632,2036625474.449147,2058582958.385137,2081058421.302583,2104068332.963397,2127629026.326176,2151754656.509594,2176460999.988074,2201764363.782882,2227682149.783748,2254231806.863776,2281432080.205554,2309302654.886528,2337863048.686069,2367135214.614908,2397140875.81701 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CQ-GG.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CQ-GG.csv new file mode 100644 index 00000000..66385c5b --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CQ-GG.csv @@ -0,0 +1,5 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +CQ-GG,CQ-GG Option 1,,2678809324.204271,2707000000.0,2734728551.972381,2761663350.915957,2792898020.342315,2837219170.511519,2868015124.608441,2893093967.475813,2924499167.024745,2956746883.82008,2984808083.947422,3007269465.734566,3029834351.49129,3052740329.155435,3075928316.926074,3099370708.179768,3123253787.898167,3147557430.389365,3172251645.7243,3197344471.802668,3222842816.756701,3248749520.116585,3275069254.94594,3301806556.145734,3328966892.65399,3356555012.372421,3384576674.956278,3413038198.468167,3441944634.479783,3471303743.126335,3501121930.261275 +CQ-GG,CQ-GG Option 2,,2342552284.317338,2367000000.0,2391165832.096317,2414567755.05161,2441761433.919806,2480447415.703322,2507277401.041492,2529079811.989591,2556421212.299201,2584500913.020229,2608943828.489542,2628501316.439237,2648143705.064457,2668085220.799891,2688273506.085417,2708683560.423872,2729478817.481672,2750641619.76176,2772145619.009616,2793997829.994175,2816204264.034807,2838767380.855685,2861691234.446648,2884979756.883103,2908637704.167672,2932669190.57755,2957079222.642823,2981873286.512992,3007055771.107659,3032633423.251952,3058611805.459358 +CQ-GG,CQ-GG Option 3,,179525948.9270546,180783442.0612658,182714853.9143489,184705501.4840623,186838075.0955692,189843024.8778042,192097028.0560291,193943861.0818002,196187690.6326763,198492516.0128343,200562808.639604,202227736.8224061,203893663.1271597,205579790.3808848,207287210.0731052,209013327.0528041,210769867.6353593,212556203.7642358,214370355.1261868,216212901.0429114,218084377.5279441,219985019.3816853,221915201.0616958,223875279.1474351,225865673.9508876,227886758.7389384,229938968.0140317,232022781.8417992,234138590.3663202,236286970.8728814,238468396.6494803 +CQ-GG,CQ-GG Option 4,,190409085.6749447,191819437.7484891,193865110.6720314,195967545.7714882,198227621.0655339,201414177.0479957,203796782.1853985,205748513.3317442,208123361.1413477,210562560.9013937,212748095.7454176,214507898.3054043,216269442.1570511,218052746.4016592,219858616.0964122,221684329.0587399,223542385.2048926,225432079.7490795,227351315.8566441,229300712.409854,231280840.4959086,233291953.8801306,235334453.7947507,237408723.4137125,239515213.8217234,241654326.5704728,243826528.8073723,246032335.9622596,248272168.6542038,250546646.2108278,252856278.9092211 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CQ-NQ.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CQ-NQ.csv new file mode 100644 index 00000000..b8392253 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CQ-NQ.csv @@ -0,0 +1,5 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +CQ-NQ,CQ-NQ Option 1,,1822592119.200375,1854159150.594231,1877151097.428414,1898491185.837896,1922640022.361868,1956403954.432764,1981346160.140485,2002170182.276903,2027708100.230881,2053920735.307447,2077672865.651972,2098967600.926217,2120772366.022348,2143099270.416346,2165905886.39866,2189174216.061095,2213052170.751043,2237535938.858949,2262616770.237053,2288313043.356212,2314642877.330174,2341622127.187164,2369268337.543334,2397599691.085937,2426635551.41261,2456395322.021535,2486899809.22346,2518170805.994929,2550229928.031968,2583101397.830933,2616809209.167059 +CQ-NQ,CQ-NQ Option 2,,5334489139.047399,5419202649.105683,5482085899.033198,5541207786.469901,5607669783.150362,5702142767.610881,5771602190.232286,5828578058.100514,5899085460.292257,5971475053.749701,6036315115.106634,6093273881.608715,6151301627.517409,6210634565.004014,6271166000.393927,6332825329.786758,6396034665.584356,6460777676.92284,6527019377.869598,6594804702.463095,6664177066.24549,6735173128.686363,6807833982.531095,6882202153.581543,6958323255.027291,7036242579.461024,7116009114.907268,7197674214.80702,7281288325.383464,7366908893.976858,7454592325.695201 +CQ-NQ,CQ-NQ Option 3,,206934192.0427212,208948301.1104623,210917478.6822865,212845791.8993114,215023293.6371293,218267998.4738993,220569017.9992989,222370869.9538201,224651622.0396232,226998884.3111326,229039848.8641314,230679193.3214134,232313099.087948,233970508.4096758,235648340.3817197,237342613.4285526,239067772.7278895,240822548.584463,242604391.9890862,244413814.4649746,246251234.8276212,248116746.8260879,250010581.3875017,251932950.8460085,253884137.8768315,255864362.3972388,257873915.5580518,259913124.1111367,261982217.8822853,264081622.4275836,266211651.4748948 +CQ-NQ,CQ-NQ Option 4,,1941413192.588763,1974060000.0,1998709406.117879,2021871155.456359,2047876733.574505,2083960415.457457,2110789333.190012,2133298195.917127,2160779314.962115,2188976166.14071,2214572232.81412,2237424622.822247,2260817741.561977,2284754821.870865,2309197556.909171,2334128815.046577,2359703554.800162,2385918109.664691,2412763248.376447,2440258281.571383,2468422290.263412,2497271903.27478,2526825563.026903,2557102364.811784,2588122643.045168,2619906768.241689,2652476582.665209,2685854975.633482,2720064616.925682,2755130951.263416,2791079147.472023 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CSA-NSA.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CSA-NSA.csv new file mode 100644 index 00000000..28500ca0 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_CSA-NSA.csv @@ -0,0 +1,6 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +CSA-NSA,CSA-NSA Option 1,,2168134153.310009,2190000000.0,2214965104.447519,2239268200.998313,2266401202.800634,2304694447.906172,2333056642.691183,2356383509.430809,2385138711.091851,2414636782.250797,2441366459.324903,2464992626.194228,2489092248.718082,2513715108.552762,2538827329.653616,2564401339.800611,2590604710.333851,2617430711.151374,2644865003.267601,2672924842.485555,2701626948.731816,2730985216.736609,2761015268.876314,2791733258.263342,2823156488.4679,2855302047.682806,2888188459.690542,2921835099.801733,2956260912.375493,2991487562.970362,3027536181.715531 +CSA-NSA,CSA-NSA Option 2,,2507084674.023129,2530000000.0,2565975486.676586,2600662808.590408,2638770950.229487,2690027982.592487,2729896856.351163,2764079323.207534,2805123509.240443,2847137937.737847,2886911050.535938,2924664883.666616,2963750553.391454,3003873385.116655,3045002212.481317,3087121297.039061,3130450412.192812,3174994117.457923,3220754449.09209,3267770080.471466,3316079816.588179,3365719970.818155,3416729368.599894,3469148542.877562,3523020021.277184,3578386767.094543,3635294441.470257,3693790481.38975,3753922715.353241,3815743180.069514,3879304226.574433 +CSA-NSA,CSA-NSA Option 3,,3477761718.658784,3510000000.0,3556728689.25284,3602122861.464244,3651871037.829655,3719694817.23303,3771977024.339572,3816222172.516181,3869723378.261806,3924511806.865285,3975729013.174822,4023339455.426786,4072421014.8134,4122738344.677748,4174253797.764508,4226935958.418606,4281078326.446495,4336682196.763331,4393742049.692822,4452303400.385064,4512411462.147882,4574107738.131951,4637436916.778962,4702445601.657657,4769182866.969368,4837698066.04056,4908043870.097638,4980275040.218709,5054446492.669686,5130618502.734098,5208851406.109142 +CSA-NSA,CSA-NSA Option 4 Stage 1,,3267687553.905117,3302938001.577384,3340069215.873968,3376384903.486446,3416957173.218812,3474121238.109817,3516172837.377219,3550737650.404762,3593452604.40697,3637250899.306457,3676454747.004631,3710626173.909877,3745419085.650047,3780936534.033127,3817122225.144893,3853935853.848373,3891626900.209364,3930182184.933552,3969577719.340312,4009837086.962775,4050982790.365471,4093033091.254242,4136008725.749503,4179931114.879704,4224823320.281935,4270707984.620075,4317609795.385919,4365554614.809917,4414567503.744231,4464677508.230445,4515912786.833138 +CSA-NSA,CSA-NSA Option 4 Stage 2,,474020855.6678854,474114071.9838242,477737567.1834834,481740806.6556796,485466063.7576821,491770727.1616229,496933889.6479198,500568199.8920134,505191827.1744849,509977361.6644711,514476512.3682349,518064312.8517961,521556733.7782621,525083668.3699169,528668578.070482,532291846.9218283,535984932.7453826,539748523.4583606,543576536.537198,547470263.7205945,551430782.1543266,555458400.4792435,559553696.815632,563717213.2607129,567949648.4185333,572251515.0698986,576623527.5372027,581066430.8349216,585580814.387951,590167651.321535,594827657.2351351 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_MEL-WNV.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_MEL-WNV.csv new file mode 100644 index 00000000..95c127fa --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_MEL-WNV.csv @@ -0,0 +1,5 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +MEL-WNV,MEL-WNV Option 1,,127972939.9207022,128000000,128795218.7380137,129667489.4114208,130462073.5421479,131978568.2009743,133204954.458978,133984926.0551578,135038912.5325869,136135057.3414813,137162030.4271328,137975438.9640392,138756608.4795845,139547027.2433566,140352817.2356914,141167805.9918679,142000929.9314908,142852318.3619322,143720283.8523058,144605192.6622142,145507324.6800199,146426776.0374435,147363697.6063906,148318240.6235165,149290600.2673648,150280917.6183553,151289400.7419551,152316255.9364942,153361662.9538388,154425895.3169166,155509171.5376054 +MEL-WNV,MEL-WNV Option 2,,173679316.5976506,174000000,175351599.9853832,176863473.5113292,178245988.5180642,180598143.7490544,182569746.015605,183962072.1766603,185737105.4878149,187573520.3146894,189285990.7801137,190707713.5816357,192105033.2619103,193525091.6023272,194976514.2473992,196451953.7093516,197964060.4773607,199513569.7210523,201098853.2808879,202721084.1531563,204381362.8293344,206080562.9178761,207819680.3119012,209599747.7790113,211421897.1832948,213287232.4637227,215196985.7351553,217152443.3835716,219154888.5618474,221205798.8410221,223306621.6777057 +MEL-WNV,MEL-WNV Option 3,,1323127503.836176,1330000000,1347642521.633037,1365944379.859979,1385741301.563502,1412404822.741238,1433536103.687442,1451794263.954654,1473569830.025966,1496023313.723387,1517148344.570207,1536517767.092871,1556509754.887093,1577126130.577216,1598378287.914054,1620269279.659815,1642921959.150304,1666354285.27129,1690580208.254389,1715634340.590777,1741552264.911617,1768369103.728859,1796122449.087808,1824851753.507627,1854598725.282104,1885406548.244916,1917321063.525267,1950390476.252641,1984664579.358011,2020196975.915707,2057043002.068985 +MEL-WNV,MEL-WNV Option 4,,70063455.85729356,70000000,70174639.31613784,70412355.52871552,70565859.9710771,71130934.5086466,71614427.8584975,71811265.80132389,72155649.84794347,72520219.07095034,72877948.37904729,73170009.50649261,73437085.12986809,73707692.94372644,73986350.5061324,74268639.31618576,74559448.88107805,74858932.99583946,75166126.98196226,75481167.01514205,75804131.9774311,76135011.01176636,76473806.39093076,76820524.13285723,77175190.09262618,77537792.73760933,77908364.90224984,78286920.69769982,78673474.79199837,79068074.02456258,79470740.73506503 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_NNSW-SQ.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_NNSW-SQ.csv new file mode 100644 index 00000000..30956ec5 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_NNSW-SQ.csv @@ -0,0 +1,5 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +NNSW–SQ,NNSW–SQ Option 1,,2353095914.780407,2394685533.295062,2426544446.673381,2456816483.837844,2490369374.614054,2535982182.477316,2570650252.849625,2600238757.431925,2635924537.686542,2672531169.376047,2706221224.816718,2736743728.119459,2768107513.0083,2800237694.626196,2833101989.505556,2866688719.177261,2901189450.890121,2936605546.525395,2972932426.981616,3010199722.456795,3048437185.399551,3087671805.526334,3127933079.795334,3169251633.5333,3211659879.411758,3255190588.394246,3299878681.703343,3345760709.93693,3392873298.077998,3441256884.382001,3490951929.009632 +NNSW–SQ,NNSW–SQ Option 4,,8980741113.231022,9041463421.985046,9142387188.463133,9175801131.18691,9310954541.551641,9487060919.114304,9527307092.35255,9569596771.43695,9640347236.252193,9714732726.302338,9782779767.862804,9832699225.16834,9887463876.066786,9945417601.608263,10004474960.44039,10065216739.40643,10128455503.87512,10193879022.24555,10261422322.36388,10331116958.88,10402993554.23141,10477071751.86419,10553377195.28299,10631936985.85472,10712781631.87017,10795940221.41214,10881447255.55238,10969339093.18126,11059650387.96826,11152424799.69715,11247703423.93667 +NNSW-SQ,NNSW-SQ Option 2,,2941896151.161222,2989000000.0,3027001896.541083,3063677595.697117,3104070881.421622,3159270059.430604,3201061057.02578,3236442639.589334,3279268890.072858,3323194634.501754,3363264648.874459,3398823904.674047,3435222471.5358,3472448333.538644,3510470876.981053,3549270521.713923,3589078276.182434,3629892393.66183,3671701901.755053,3714538446.503198,3758433462.326576,3803414786.669145,3849513126.237228,3896760309.144281,3945190156.990959,3994836680.786735,4045736295.470103,4097927158.606085,4151447229.340371,4206338881.375284,4262644240.644312 +NNSW-SQ,NNSW-SQ Option 5,,5190646484.018465,5270663992.4,5335275572.360075,5398156601.965562,5467510291.814806,5562532665.121868,5633818398.706995,5693860394.338068,5766889616.741433,5841767495.078799,5909345101.217317,5968395762.741006,6028693978.850309,6090290957.060698,6153128713.162687,6217170660.302598,6282814711.592682,6350050779.902473,6418852836.015609,6489269495.698743,6561348431.081307,6635130881.050798,6710662739.744854,6787991528.859521,6867167954.599605,6948242712.861164,7031270384.040118,7116308201.211518,7203412666.98898,7292647591.186746,7384076021.488675 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_SESA-CSA.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_SESA-CSA.csv new file mode 100644 index 00000000..5a3f7785 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_SESA-CSA.csv @@ -0,0 +1,5 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +SESA-CSA,SESA-CSA Option 1,,79830763.97059375,80500000.0,81244477.33172868,81996096.63152589,82762160.46566086,83977301.66281533,84907880.59513219,85603158.06552587,86481477.89386217,87385954.39422992,88175164.40517382,88803780.80323711,89421474.81438617,90046768.90525313,90680278.5920196,91319103.43449003,91969072.53738564,92629944.55232552,93300619.26681048,93981315.44076908,94672199.55573782,95373313.31433646,96084747.26070918,96806585.06279525,97538939.51761387,98281896.16348691,99035568.02894878,99800082.15871803,100575527.4332249,101362067.5072502,102159823.0339036 +SESA-CSA,SESA-CSA Option 2,,3557410232.766072,3593793740.847263,3644735654.825071,3694060065.558674,3748710611.17837,3821444933.002885,3877251316.072607,3925503076.076447,3983383829.785407,4042597259.039476,4097943593.463603,4149713402.030776,4203272993.276897,4258199539.008869,4314430812.58919,4371956114.921305,4431078242.791797,4491797875.652256,4554114191.234847,4618077378.387714,4683737663.535599,4751141554.60071,4820339061.316173,4891382327.259388,4964326150.326789,5039225823.837086,5116140166.504878,5195130391.025108,5276257927.565615,5359590020.769001,5445194110.657111 +SESA-CSA,SESA-CSA Option 3,,2245299592.3728,2269020963.162949,2304844439.562068,2339168161.446457,2377488417.639986,2427235818.117459,2465705358.66868,2499760594.415406,2540152407.636442,2581440772.836627,2620582570.690786,2658126467.168249,2697194895.491902,2737321980.702374,2778455165.290216,2820602632.298793,2863965347.713458,2908547516.482814,2954356769.277873,3001432401.188931,3049814252.329303,3099540018.591899,3150649941.214823,3203186015.616432,3257192190.776767,3312713059.350249,3369795806.646738,3428489520.308959,3488843741.072379,3550912176.126873,3614748985.399382 +SESA-CSA,SESA-CSA Option 4,,4324444816.413323,4348281779.655095,4404318622.734026,4434539703.90174,4505173466.892662,4595685461.488761,4629917167.093082,4663460524.621539,4710547730.650852,4759393879.944336,4805437803.122087,4844437232.462514,4886261739.667683,4929877438.510191,4974476690.887715,5020297285.113963,5067733625.650512,5116671968.585517,5167097506.883606,5219043695.763317,5272544269.22302,5327628055.590115,5384327356.956366,5442676044.31379,5502710192.027989,5564465766.363708,5627982097.266258,5693300194.5428,5760460776.98518,5829509974.367213,5900493294.147141 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_SEV-MEL.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_SEV-MEL.csv new file mode 100644 index 00000000..a1ea91db --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_SEV-MEL.csv @@ -0,0 +1,6 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +SEV-MEL,SEV-MEL Option 1,,70022366.64190406,70000000,70406410.20389034,70821557.65721972,71235930.68556239,72043899.46660513,72652250.33219641,73024098.48633733,73547788.17454293,74094873.8900534,74609345.03831524,75010702.49630462,75394937.19945382,75784472.37868978,76181721.07475396,76583543.5557931,76994868.84728248,77415622.78573184,77844855.67517258,78282726.41356725,78729343.87300228,79184717.74997266,79648883.60026748,80121876.29396842,80603752.50683896,81094536.84714316,81594289.84232295,82103066.84783573,82620908.95304097,83147903.53475404,83684107.03555754 +SEV-MEL,SEV-MEL Option 2,,349148514.1217147,350000000,352113236.1584026,347797405.6107519,351503034.8885524,357722510.0533643,354471157.1959074,351525864.0973014,350182479.1330906,348985427.4342498,347944284.4787944,346503596.1607842,345290975.5939995,344273946.7798641,343272225.1738289,342315198.7379693,341453373.5860321,340661089.6542144,339933293.9570823,339269498.5868236,338668950.069205,338130581.4596189,337653372.1038324,337236377.8097816,336878754.2834938,336579511.5776815,336337888.1776193,336153045.1357006,336024178.8130504,335950623.6149833,335931647.2580673 +SEV-MEL,SEV-MEL Option 3,,89893514.1712287,90000000,90825991.2679145,91733670.95497666,92628667.82900974,93978438.70154645,95063106.98632899,95899429.84672363,96925570.9908079,97983869.55227168,98974735.52059014,99779194.24004121,100576889.9322883,101384551.7568584,102205875.3920814,103038468.4169537,103888194.0897708,104755209.4276241,105638627.4712183,106538877.9212086,107456374.3291545,108391387.8428349,109344259.6026015,110315332.819706,111304990.6007198,112313596.4380159,113341560.9936502,114389319.5934824,115457284.3191209,116545962.8409843,117655824.819178 +SEV-MEL,SEV-MEL Option 4,,349148514.1217147,350000000,352113236.1584026,347797405.6107519,351503034.8885524,357722510.0533643,354471157.1959074,351525864.0973014,350182479.1330906,348985427.4342498,347944284.4787944,346503596.1607842,345290975.5939995,344273946.7798641,343272225.1738289,342315198.7379693,341453373.5860321,340661089.6542143,339933293.9570823,339269498.5868236,338668950.069205,338130581.4596189,337653372.1038324,337236377.8097816,336878754.2834938,336579511.5776815,336337888.1776193,336153045.1357006,336024178.8130504,335950623.6149833,335931647.2580673 +SEV-MEL,SEV-MEL Option 5,,99646048.64652196,100000000,101348114.692644,102756681.958933,104309588.658848,106318560.6366,107864745.2618704,109238704.8776873,110854635.4478341,112517665.4375022,114083808.3887939,115460946.0167024,116877881.4459746,118330559.5830052,119819764.8674976,121346649.2420419,122918971.7023275,124537509.9036976,126202758.9631425,127916580.9739798,129680910.372554,131497590.2718136,133368627.7202962,135296116.6660784,137282275.7038701,139329394.5403326,141439905.2269032,143616374.0533977,145861427.1228234,148177924.5235756,150568789.1292489 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_SNSW-CNSW.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_SNSW-CNSW.csv new file mode 100644 index 00000000..5c70eabf --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_SNSW-CNSW.csv @@ -0,0 +1,5 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +SNSW-CNSW,SNSW-CNSW Option 2,,5241057625.770993,5274797529.707335,5335675851.174705,5360736002.99578,5441601696.819399,5545570904.673527,5573925835.223021,5603260462.323076,5648795392.435784,5696441902.351514,5740307922.090356,5773006533.25083,5808501828.419163,5845802782.082275,5883792749.295182,5922805894.232597,5963300448.812397,6005107492.007732,6048192750.423141,6092577279.819106,6138282026.491531,6185321360.087791,6233713469.025892,6283477410.779639,6334634330.5008,6387204709.586377,6441212241.162038,6496681953.823173,6553637857.163186,6612109540.322362,6672125104.013567 +SNSW-CNSW,SNSW-CNSW Option 3,,3964860119.588969,4030771864.065166,4082882762.760789,4133576595.906898,4189579224.984894,4265038245.655261,4322063961.469427,4370845489.953937,4429756810.352062,4490174152.730731,4545103457.578384,4593707431.787736,4643543073.385318,4694549710.166072,4746683854.702914,4799934402.319535,4854615691.231462,4910727148.942426,4968259415.707685,5027260150.77382,5087776756.963191,5149852235.171531,5213533624.436754,5278869820.516447,5345912685.844991,5414714639.248975,5485331731.280839,5557822680.087066,5632246262.445965,5708667630.043525,5787152064.948008 +SNSW-CNSW,SNSW-CNSW Option 4,,3115864339.53591,3173055449.115066,3216602719.916577,3258322163.909641,3304537610.779845,3366423579.426317,3413644318.486797,3454424259.136024,3503381227.285648,3553607422.199713,3599859599.850353,3641774637.292956,3684930858.91795,3729186862.806146,3774503442.307665,3820877661.121762,3868568146.658373,3917580695.76165,3967915648.001085,4019618595.091743,4072735454.656509,4127308898.61207,4183385184.152272,4241012457.662105,4300241576.857724,4361124233.953226,4423715411.063285,4488072652.730007,4554253992.431633,4622323024.993884,4692343874.610506 +SNSW-CNSW,SNSW-CNSW Option 5,,219378449.6520472,219802780.6136718,221740893.5465383,223791185.9212587,225784029.2486309,228971035.1224486,231525705.7857178,233411606.5026299,235768478.9098004,238203623.6077065,240469444.0427384,242287426.1694575,244072882.0165699,245879467.2477449,247715675.7737089,249573448.3933761,251467814.1722675,253398968.3325067,255364235.8596534,257364410.0940148,259400190.4403169,261471923.0426746,263580095.600077,265725185.8629896,267907754.6903778,270128289.9985294,272387375.2693172,274685630.2320375,277023597.7676619,279402023.5406275,281821540.1563628 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_SQ-CQ.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_SQ-CQ.csv new file mode 100644 index 00000000..9f7bfa90 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_SQ-CQ.csv @@ -0,0 +1,6 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +SQ-CQ,SQ-CQ Option 1,,1303573751.456141,1323419824.192998,1339520037.383383,1355146098.981304,1372525830.841149,1396343127.451582,1414035000.527999,1428962690.403882,1447117826.295518,1465727794.448944,1482448874.817423,1496981845.692961,1511808534.394285,1526938633.340602,1542352122.314997,1558040244.504776,1574100738.268041,1590529649.488372,1607318970.348472,1624479232.838332,1642020755.692352,1659952104.819944,1678283000.283248,1697023453.578777,1716184197.841065,1735775899.301938,1755810068.69926,1776298817.085193,1797253953.114169,1818689027.302102,1840617262.82379 +SQ-CQ,SQ-CQ Option 2,,59026518.13298518,59149628.74517392,59767573.1872445,60418352.1141694,61069100.5173519,62026302.43442111,62785966.36235482,63387102.65646017,64113165.35936157,64860954.98642699,65552856.23136206,66103193.02153188,66647915.12287043,67198198.69456074,67755997.64893928,68319695.15531643,68893160.43969381,69476400.41884975,70068701.52155489,70670258.53464085,71281250.05557123,71901750.60107188,72531880.01874013,73171750.77883725,73821496.81078286,74481234.11702214,75151098.19388136,75831239.19854619,76521778.06324494,77222895.28552772,77934734.7212545 +SQ-CQ,SQ-CQ Option 3,,3132594604.323902,3177133821.650429,3214787186.475494,3252005194.915471,3293318080.841201,3349547421.627913,3391004963.259784,3426031719.597412,3468673070.25783,3512353920.936313,3551135570.850295,3584025397.205354,3617479148.455509,3651550054.293146,3686193730.680397,3721393018.107832,3757373963.37775,3794123056.675751,3831617421.907495,3869878018.046601,3908924976.765103,3948774158.417875,3989443984.53726,4030953354.536485,4073322704.398252,4116572121.522589,4160723503.805987,4205799972.186727,4251823661.084045,4298820647.211236,4346816023.786098 +SQ-CQ,SQ-CQ Option 5,,3709364318.2648,3751431627.2744,3790748326.7266,3830175210.312,3872728572.241,3933757793.2041,3979453955.8074,4016223947.0393,4061790742.774,4108570533.395499,4150291323.061501,4185249834.9659,4220480864.316299,4256325737.1263,4292782541.028501,4329791494.6848,4367619327.524,4406253786.3422,4445662004.4886,4485865057.7183,4526882545.2514,4568728994.1557,4611421560.749599,4654977827.0009,4699417049.9809,4744757765.8045,4791020597.0833,4838227216.2962,4886398201.249599,4935558295.6152,4985730978.3361 +SQ-CQ,SQ-CQ Option 6,,799623339.1919147,799588497.1028677,804857856.4836051,810664036.3034402,815935093.4253541,825703247.624371,833687193.4219421,838912973.742341,845826055.110579,853006677.6441207,859769638.9782853,865138734.7806576,870309888.9053205,875535746.855353,880856542.5489676,886234229.6484888,891723549.2389327,897325584.4623741,903029623.7130253,908837717.2456459,914751438.4985342,920771137.0119586,926897537.3665416,933131328.2083237,939473458.4532712,945924533.5240405,952485533.6093608,959157435.3367645,965941005.0816814,972837595.6814755,979848163.4503478 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_TAS-SEV.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_TAS-SEV.csv new file mode 100644 index 00000000..9356e5c9 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_TAS-SEV.csv @@ -0,0 +1,3 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +TAS-SEV,TAS-SEV Option 1,,,,,,,,4758196417.704872,4788210856.880699,4831243521.878229,4875980483.959303,4914047754.694657,4946156005.70558,4980656711.172232,5016718783.29542,5053541081.480419,5091352459.399861,5130527234.059253,5170966598.225889,5212659024.855429,5255641136.837852,5299950560.07357,5345620649.397988,5392689453.451721,5441197006.214928,5491186605.810198,5542702710.53215,5595793849.360598,5650511444.528873,5706907736.584935,5765041706.315207,5824973146.481797 +TAS-SEV,TAS-SEV Option 2,,,,,,,,,,,,2625940880.155277,2640935615.440908,2657147004.860064,2674134475.072171,2691432326.865409,2709164309.288919,2727529071.282713,2746464644.931417,2765958887.421752,2786025061.155352,2806676606.480456,2827924395.792101,2849781438.796887,2872261423.541833,2895379398.313612,2919150626.830853,2943592112.084755,2968721921.25034,2994558118.047768,3021121802.798007,3048434011.350391 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_WNV-SESA.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_WNV-SESA.csv new file mode 100644 index 00000000..6ad32f8b --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_WNV-SESA.csv @@ -0,0 +1,4 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +WNV-SESA,WNV-SESA Option 1,,794836477.118288,801246015.258297,812236606.6010708,823012886.7623131,834737951.5024685,850554051.3886539,862893318.1147697,873433163.136615,886065945.7004389,899003182.0614123,911237590.3822867,922653258.8002019,934431623.1049408,946503071.3665743,958863437.5276592,971507084.1174122,984500248.4197131,997844257.3368069,1011538578.393296,1025594119.426629,1040021844.086936,1054831825.685234,1070034926.656755,1085642457.647662,1101666312.448186,1118118478.712752,1135011716.038031,1152359301.071766,1170174564.91356,1188472105.24284,1207266532.817154 +WNV-SESA,WNV-SESA Option 2,,1158409670.000161,1168226129.295103,1183406057.187636,1198357806.56097,1214626783.03309,1236807219.723162,1253935618.81493,1268409934.857992,1285879095.46135,1303772968.193141,1320480020.840012,1335781297.15811,1351512603.723199,1367617318.640475,1384088949.444876,1400916939.414115,1418195205.813387,1435923972.778069,1454100190.003934,1472737569.083425,1491849735.139019,1511448971.977679,1531548614.859401,1552162537.311743,1573305380.631211,1594991830.830332,1617237589.248855,1640059003.13535,1663472392.850569,1687495792.156282,1712147160.921145 +WNV-SESA,WNV-SESA Option 3,,3196143025.247633,3207260877.322573,3243663195.0563,3254783490.495832,3304701220.444223,3368714419.818884,3381686517.593555,3396251855.036319,3421050876.105334,3447152601.106779,3471460265.542459,3489198311.09958,3508839281.398595,3529656127.702137,3550858771.432628,3572680348.516515,3595408900.68228,3618925381.959203,3643207329.759158,3668264475.595424,3694106468.43322,3720738940.850715,3748169636.797222,3776406754.423029,3805459581.967345,3835336843.367788,3866049109.390613,3897607517.638284,3930022525.427263,3963307681.496004,3997475489.738503 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_WNV-SNSW.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_WNV-SNSW.csv new file mode 100644 index 00000000..6265d394 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_costs_step_change_WNV-SNSW.csv @@ -0,0 +1,2 @@ +Flow path,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +VIC-SNSW,WNV-SNSW Option 1 - VNI West,,6945764099.699804,7035000000,7128462719.992933,7204318390.856832,7316783861.342247,7461830909.096021,7547712098.124002,7627286376.374674,7727293319.284721,7830718062.806005,7926147724.846305,8013907614.009636,8106451746.733695,8202585621.570412,8301633977.661391,8403869465.966846,8509949564.35116,8619860199.278585,8733668921.953585,8851532707.788002,8973614015.003613,9100072713.965975,9231080671.725037,9366818572.716091,9507477568.193577,9653255783.570446,9804364082.564653,9961024179.015875,10123465131.98055,10291934209.97106,10466686661.57775 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CNSW-NNSW.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CNSW-NNSW.csv new file mode 100644 index 00000000..c268f0df --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CNSW-NNSW.csv @@ -0,0 +1,6 @@ +Flow path,Development path,Development driver,Option name,Augmentation description,Pre-requisite options,Forward direction power flow,"Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Forward direction","Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Reverse direction","Indicative cost estimate ($2025, $ million)",Cost estimate source,Cost estimate class,Easement length (km),Lead time or earliest in service date,Additional REZ transmission capacity provided,Notes +CNSW-NNSW,Near the existing CNSW-NNSW corridor,"Increase thermal capacity and, voltage and transient stability limits of 330 kV lines between Liddell and Armidale. Provide access to Renewable generation in N1 and N2 REZ",CNSW-NNSW Option 1,• A new 500 kV DCST line between Central (Hub 5) and Bayswater with Quad Orange conductor. • A new Central (Hub 5) 500/330 kV substation with 3 x 500/330/33 kV 1500 MVA transformers and cut into existing 330 kV lines between Tamworth and Armidale. • A new 4 x 330 kV 340 MVA phase shifting transformers at Central (Hub 5). • 4 x 500 kV 150 MVAr line shunt reactors (in total) are required for 500kV DCST line between Central Hub 5 and Bayswater.,• A new 500 kV DCST line between Central (Hub 5) and Bayswater with Quad Orange conductor. • A new Central (Hub 5) 500/330 kV substation with 3 x 500/330/33 kV 1500 MVA transformers and cut into existing 330 kV lines between Tamworth and Armidale. • A new 4 x 330 kV 340 MVA phase shifting transformers at Central (Hub 5). • 4 x 500 kV 150 MVAr line shunt reactors (in total) are required for 500kV DCST line between Central Hub 5 and Bayswater.,CNSW to NNSW,2400,2400,2583.4271,AEMO TCD,Class 5b(±50%),217,Medium: (6 years),Medium: (6 years),Medium: (6 years) +CNSW-NNSW,Near the existing CNSW-NNSW corridor,"Increase thermal capacity and, voltage and transient stability limits of 330 kV lines between Liddell and Armidale. Provide access to Renewable generation in N1 and N2 REZ",CNSW-NNSW Option 2,• Expand Northern (Hub 10) switching station to 500/330kV substation with 3 x 500/330/33kV 1500 MVA transformers and cut into the existing 330 kV lines between Armidale to Sapphire/Dumaresq • Expand Central South (Hub 1) switching station to 500/330 kV substation with 3 x 500/330/33 kV 1500 MVA transformers. • A new 500 kV DCST from Central South (Hub 1) to Bayswater with Quad Orange conductor • Operate line between Central Hub 5 and Central South Hub 1 from 330 kV to 500 kV. • Operate line between Central Hub 5 and Northern Hub 10 from 330 kV to 500 kV. • 4 x 500 kV 150 MVAr line shunt reactors (in total) for 500 kV double-circuit line between Central South (Hub 1) and Bayswater.,"CNSW-NNSW Option 1, N2 Option 1",CNSW to NNSW,3600,3600,2241.2783,AEMO TCD,Class 5b(±50%),215,Long: (8 years),N2: 3600,N2: 3600 +CNSW-NNSW,Near the existing CNSW-NNSW corridor,"Increase thermal capacity and, voltage and transient stability limits of 330 kV lines between Liddell and Armidale. Provide access to Renewable generation in N1 and N2 REZ",CNSW-NNSW Option 4,• A new 2000 MW bi-pole HVDC transmission system between locality Bayswater and locality of Hub 5. • A new 330 kV double-circuit line from a new substation in locality of Hub 5 to Armidale. • Cut into existing 330 kV lines between Tamworth and Armidale,• A new 2000 MW bi-pole HVDC transmission system between locality Bayswater and locality of Hub 5. • A new 330 kV double-circuit line from a new substation in locality of Hub 5 to Armidale. • Cut into existing 330 kV lines between Tamworth and Armidale,CNSW to NNSW,1750,2000,3762.61028246868,AEMO TCD,Class 5b(±50%),239,Medium: (6 years),N2: 2000,N2: 2000 +CNSW-NNSW,West of the existing CNSW-NNSW corridor,Increase trasnfer capabiltiy between NSW and QLD and access NWNSW REZ,CNSW-NNSW Option 5,• A new 2000 MW bi-pole HVDC transmission system between locality of Wollar and locality of Boggabri. • A new 330 kV AC line between locality of Boggabri and Tamworth.,NNSW-SQ Option 4.,CNSW to NNSW,1750,2000,5146.677214900535,AEMO TCD,Class 5b(±50%),307,Medium: (6 years),N1: 2000,N1: 2000 +CNSW-NNSW,Near the existing CNSW-NNSW corridor,Increase voltage and transient capability of CNSW-NNSW 500 kV options.,CNSW-NNSW Option 6,• Expand Bayswater Hub to accommodate 1900 MVAr capacitor banks and 1300 MVAr dynamic reactive plant (static VAR compensator [SVC]/STATCOM) at 330 kV,"CNSW-NNSW Option 1, N2 Option 1, CNSW-NNSW Option 2",CNSW to NNSW,1500,1360,442.9605,AEMO TCD,Class 5b(±50%),0,Long: (9 years),Long: (9 years),Long: (9 years) diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CNSW-SNW.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CNSW-SNW.csv new file mode 100644 index 00000000..e2a4202b --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CNSW-SNW.csv @@ -0,0 +1,11 @@ +Flow path,Development path,Development driver,Option name,Augmentation description,Pre-requisite options,Forward direction power flow,"Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Forward direction","Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Reverse direction","Indicative cost estimate ($2025, $ million)",Cost estimate source,Cost estimate class,Easement length (km),Lead time or earliest in service date,Additional REZ transmission capacity provided,Notes +CNSW-SNW,Northern side of SNW,Retirement of coal-powered generation in SNW.,CNSW-SNW Option 1,"Sydney Ring Northern 500 kV loop or the Hunter Transmission Project (HTP): • A new 500 kV double-circuit line between Olney substation and Bayswater South substation. • New switching stations at Bayswater South (near Bayswater substation) and Olney (near Eraring substation). • 500 kV connections between Bayswater and Bayswater South substations, and between Eraring and Olney substations. • Two 500/330 kV 1500 MVA transformers at Eraring substation. •Line reactors on 500 kV transmission lines between Olney and Bayswater South. (Note: When Central West Orana REZ exceeds 3 gigawatts (GW), this option should be considered to transfer this additional generation to SNW).","Sydney Ring Northern 500 kV loop or the Hunter Transmission Project (HTP): • A new 500 kV double-circuit line between Olney substation and Bayswater South substation. • New switching stations at Bayswater South (near Bayswater substation) and Olney (near Eraring substation). • 500 kV connections between Bayswater and Bayswater South substations, and between Eraring and Olney substations. • Two 500/330 kV 1500 MVA transformers at Eraring substation. •Line reactors on 500 kV transmission lines between Olney and Bayswater South. (Note: When Central West Orana REZ exceeds 3 gigawatts (GW), this option should be considered to transfer this additional generation to SNW).",CNSW to SNW,5000,5000,1363.5037,AEMO TCD,Class 5b(±50%),110,Short: (3 years),N10: 2000,N10: 2000 +CNSW-SNW,Southern side of SNW,Retirement of coal-powered generation in SNW,CNSW-SNW Option 2,"• Establish a new South Creek Substation • Establish a 500/330 kV South Creek substation with separate 500 kV and 330 kV yards connected of underground cable cutting into 330 kV lines Sydney West - Bayswater(#32), Sydney West - Reagentville (#38) and Banaby - Sydney West (#39) and 500 kV lines Erarring - Kemps creek ( #5A1, #5A2) with two 1500 MVA 500/330 kV transformers. • Rebuild approx. 7 km of existing single circuit 330 kV Banaby - Sydney West (#39) between South Creek and Sydney West as double circuit, including stringing with high temperature low sag (HTLS) conductor (twin olive equivalent). • One 330 kV transmission line switch bay at Sydney West.",CNSW-SNW Option 1,CNSW to SNW,0,0,513.0,Transgrid,Class 5(±50%),0,Short: (4 years),Short: (4 years),Short: (4 years) +CNSW-SNW,Southern side of SNW,Retirement of coal-powered generation in SNW,CNSW-SNW Option 2d,"(ISP candidate option) Power flow control on the 330 kV network • Install power flow control devices in the 330 kV network supplying Sydney from the south, which may include the establishment of a new switching station in greater southwest Sydney.",CNSW-SNW Option 1,CNSW to SNW,0,0,261.0,Transgrid,Class 5(±50%),0,Short: (4 years),Short: (4 years),Short: (4 years) +CNSW-SNW,Southern side of SNW,Retirement of coal-powered generation in SNW,CNSW-SNW Option 3 - Stage 1,"Sydney Ring South initially operated at 330 kV Stage 1: • Establish a new 330 kV South Creek switching station cutting into 330 kV Syndey West - Bayswater(#32), Sydney West - Reagentville (#38) and Banaby - Sydney West (#39). • Double circuit 500 kV transmission line built to a 500 kV design between Bannaby substation and the new South Creek switching station along a new 70 m wide greenfield easement. • Two new 330 kV transmission line switch bays at Bannaby. • Rebuild on centreline approx. 7 km of existing single circuit 330 kV between South Creek and Sydney West as double circuit, including stringing with high temperature low sag (HTLS) conductor (twin Olive equivalent). • Re-conductor approx. 7 km of existing double circuit 330 kV lines 32 and 38 with high temperature low sag (HTLS) conductor (twin Olive equivalent) between South Creek and Sydney West. • One new 330 kV transmission line switch bay at Sydney West.","Sydney Ring South initially operated at 330 kV Stage 1: • Establish a new 330 kV South Creek switching station cutting into 330 kV Syndey West - Bayswater(#32), Sydney West - Reagentville (#38) and Banaby - Sydney West (#39). • Double circuit 500 kV transmission line built to a 500 kV design between Bannaby substation and the new South Creek switching station along a new 70 m wide greenfield easement. • Two new 330 kV transmission line switch bays at Bannaby. • Rebuild on centreline approx. 7 km of existing single circuit 330 kV between South Creek and Sydney West as double circuit, including stringing with high temperature low sag (HTLS) conductor (twin Olive equivalent). • Re-conductor approx. 7 km of existing double circuit 330 kV lines 32 and 38 with high temperature low sag (HTLS) conductor (twin Olive equivalent) between South Creek and Sydney West. • One new 330 kV transmission line switch bay at Sydney West.","Sydney Ring South initially operated at 330 kV Stage 1: • Establish a new 330 kV South Creek switching station cutting into 330 kV Syndey West - Bayswater(#32), Sydney West - Reagentville (#38) and Banaby - Sydney West (#39). • Double circuit 500 kV transmission line built to a 500 kV design between Bannaby substation and the new South Creek switching station along a new 70 m wide greenfield easement. • Two new 330 kV transmission line switch bays at Bannaby. • Rebuild on centreline approx. 7 km of existing single circuit 330 kV between South Creek and Sydney West as double circuit, including stringing with high temperature low sag (HTLS) conductor (twin Olive equivalent). • Re-conductor approx. 7 km of existing double circuit 330 kV lines 32 and 38 with high temperature low sag (HTLS) conductor (twin Olive equivalent) between South Creek and Sydney West. • One new 330 kV transmission line switch bay at Sydney West.",1300,1300,1780.0,Transgrid,Class 5(±50%),114,Long: (7 years),Long: (7 years),Long: (7 years) +CNSW-SNW,Southern side of SNW,Retirement of coal-powered generation in SNW,CNSW-SNW Option 3 - Stage 2,"Sydney Ring South initially operated at 330 kV Stage 2: • Upgrade South Creek to a 330/500 kV substation with separate 500 kV and 330 kV yards connected by underground cable cutting into 500 kV Erarring - Kemps creek ( #5A1, #5A2) with three 1500 MVA 500/330 kV transformers. • Two new 500 kV transmission line switch bays at Bannaby. • Re-termination of 500 kV designed transmission lines at Bannaby and South Creek. • 4x 120 MVAr line shunt reactors on the 500kv lines between Bannaby and South Creek",CNSW-SNW Option 3 - Stage 1,CNSW-SNW Option 3 - Stage 1,2300,2300,580.0,Transgrid,Class 5(±50%),0,Long: (7 years),N11 + N12: 2000 SNW1: 3600,N11 + N12: 2000 SNW1: 3600 +CNSW-SNW,Southern side of SNW,Retirement of coal-powered generation in SNW,CNSW-SNW Option 4,"Staged 500 kV Sydney Ring South Stage 1: •Establish a 500/330 kV South Creek substation with separate 500 kV and 330 kV yards connected by underground cable cutting into 330 kV Syndey West - Bayswater(#32), Sydney West - Reagentville (#38) and Banaby - Sydney West (#39) and 500 kV Erarring - Kemps creek ( #5A1, #5A2) with two 1500 MVA 500/330 kV transformers. •Rebuild on centreline approx. 7km of existing single circuit 330 kV between South Creek and Sydney West as double circuit, including stringing with high temperature low sag (HTLS) conductor (twin olive equivalent). •One new 330 kV transmission line switch bay at Sydney West. Stage 2: •Upgrade the South Creek 330/500 kV substation with a third 500/330 kV transformer. •Two new 500 kV transmission line switch bays at South Creek. •Two new 500 kV transmission line switch bays at Bannaby. •Double circuit 500 kV transmission line (approx. 114km) between Bannaby substation and the new South Creek switching station along a new 70 m wide greenfield easement. •Re-conductor approx. 7km of existing double circuit 330 kV lines 32 and 38 with high temperature low sag (HTLS) conductor (twin Olive equivalent) between South Creek and Sydney West. • 4x 120 MVAr line shunt reactors on the 500 kV lines between Bannaby and South Creek","Staged 500 kV Sydney Ring South Stage 1: •Establish a 500/330 kV South Creek substation with separate 500 kV and 330 kV yards connected by underground cable cutting into 330 kV Syndey West - Bayswater(#32), Sydney West - Reagentville (#38) and Banaby - Sydney West (#39) and 500 kV Erarring - Kemps creek ( #5A1, #5A2) with two 1500 MVA 500/330 kV transformers. •Rebuild on centreline approx. 7km of existing single circuit 330 kV between South Creek and Sydney West as double circuit, including stringing with high temperature low sag (HTLS) conductor (twin olive equivalent). •One new 330 kV transmission line switch bay at Sydney West. Stage 2: •Upgrade the South Creek 330/500 kV substation with a third 500/330 kV transformer. •Two new 500 kV transmission line switch bays at South Creek. •Two new 500 kV transmission line switch bays at Bannaby. •Double circuit 500 kV transmission line (approx. 114km) between Bannaby substation and the new South Creek switching station along a new 70 m wide greenfield easement. •Re-conductor approx. 7km of existing double circuit 330 kV lines 32 and 38 with high temperature low sag (HTLS) conductor (twin Olive equivalent) between South Creek and Sydney West. • 4x 120 MVAr line shunt reactors on the 500 kV lines between Bannaby and South Creek","Staged 500 kV Sydney Ring South Stage 1: •Establish a 500/330 kV South Creek substation with separate 500 kV and 330 kV yards connected by underground cable cutting into 330 kV Syndey West - Bayswater(#32), Sydney West - Reagentville (#38) and Banaby - Sydney West (#39) and 500 kV Erarring - Kemps creek ( #5A1, #5A2) with two 1500 MVA 500/330 kV transformers. •Rebuild on centreline approx. 7km of existing single circuit 330 kV between South Creek and Sydney West as double circuit, including stringing with high temperature low sag (HTLS) conductor (twin olive equivalent). •One new 330 kV transmission line switch bay at Sydney West. Stage 2: •Upgrade the South Creek 330/500 kV substation with a third 500/330 kV transformer. •Two new 500 kV transmission line switch bays at South Creek. •Two new 500 kV transmission line switch bays at Bannaby. •Double circuit 500 kV transmission line (approx. 114km) between Bannaby substation and the new South Creek switching station along a new 70 m wide greenfield easement. •Re-conductor approx. 7km of existing double circuit 330 kV lines 32 and 38 with high temperature low sag (HTLS) conductor (twin Olive equivalent) between South Creek and Sydney West. • 4x 120 MVAr line shunt reactors on the 500 kV lines between Bannaby and South Creek",3600,3600,2490.0,Transgrid,Class 5(±50%),114,Long: (7 years),N11 + N12: 2000 SNW1: 3600,N11 + N12: 2000 SNW1: 3600 +CNSW-SNW,Bayswater to Newcastle,Hydrogen scenario - To provide access to port near Newcastle.,H-Newcastle,To provide access to port near Newcastle: • Three new 500 kV lines from Bayswater to Newcastle. • Four new 500/330 kV transformers at Newcastle. • Line shunt reactors at each of the new 500 kV lines.,To provide access to port near Newcastle: • Three new 500 kV lines from Bayswater to Newcastle. • Four new 500/330 kV transformers at Newcastle. • Line shunt reactors at each of the new 500 kV lines.,CNSW to SNW,5000,5000,1685.630070342615,AEMO TCD,Class 5b(±50%),180,Medium: (6 years),N10: 5000,N10: 5000 +CNSW-SNW,Bannaby to Dapto,Hydrogen scenario - To provide access to port near Dapto.,H-Dapto,To provide access to port near Dapto: • Three new 500 kV lines from Bannaby to Dapto. • Four new 500/330 kV transformers at Dapto. • Line shunt reactors at each of the new 500 kV lines.,To provide access to port near Dapto: • Three new 500 kV lines from Bannaby to Dapto. • Four new 500/330 kV transformers at Dapto. • Line shunt reactors at each of the new 500 kV lines.,CNSW to SNW,5000,5000,1479.618536844956,AEMO TCD,Class 5b(±50%),154,Medium: (6 years),N11 + N12: 5000 SNW1: 5000,N11 + N12: 5000 SNW1: 5000 +CNSW-SNW,Northern side of Sydney,Retirement of coal-powered generation in New South Wales.,CNSW-SNW Option 6a,• A new 500 kV double-circuit line between substation near Eraring and Bayswater substation. • Two 500/330 kV 1500 MVA transformers either at Eraring substation or new substation near Eraring • Two 500/330 kV 1500 MVA transformers at Kemps Creek • 1 x 330 kV SCST line between Vales Pt and Eraring • 1 x 330 kV SCST line between Vales Pt and Munmorah • Thermal upgrade for Vales Pt – Eraring (#24) and Newcastle – Vales Point (#92) 330 kV lines • 1 x 330 kV SCST line between Liddell – Newcastle • 1 x 330 kV SCST line between Eraring – Newcastle,CNSW-SNW Option 1,CNSW to SNW,4400,4400,2180.191667549745,AEMO TCD,Class 5b(±50%),354,Medium: (6 years),Medium: (6 years),Medium: (6 years) +CNSW-SNW,Northern side of Sydney,Retirement of coal-powered generation in New South Wales.,CNSW-SNW Option 6b,"• A new 500 kV double-circuit line between Eraring and Bayswater substation. • A new 500/330 kV substation in locality of Richmond Vale with two 500/330 kV 1500 MVA transformers, cut in Newcastle-Liddell (#81) and Tomago-Liddell (#82) 330 kV lines, and a new 5 km DCST cutting-in between Tomago-Newcastle 330 kV line (#95). • Two 500/330 kV 1500 MVA transformers (bringing the total to four transformers) near Eraring. • 1 x 330 kV single-circuit line between Vales Pt and new Eraring. • 1 x 330 kV single-circuit line between Vales Pt and Munmorah. • Thermal upgrade for 330 kV lines Vales Pt – Eraring (#24) and Newcastle – Vales Point (#92). • 1 x 330 kV single-circuit line between locality of Richmond Vale – Newcastle. • Line reactors on 500 kV transmission lines.",CNSW-SNW Option 1,CNSW to SNW,4400,4400,1707.75086265666,AEMO TCD,Class 5b(±50%),238,Medium: (6 years),Medium: (6 years),Medium: (6 years) diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CQ-GG.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CQ-GG.csv new file mode 100644 index 00000000..b2bb2907 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CQ-GG.csv @@ -0,0 +1,5 @@ +Flow path,Development path,Development driver,Option name,Augmentation description,Pre-requisite options,Forward direction power flow,"Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Forward direction","Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Reverse direction","Indicative cost estimate ($2025, $ million)",Cost estimate source,Cost estimate class,Easement length (km),Lead time or earliest in service date,Additional REZ transmission capacity provided,Notes +CQ-GG,Existing CQ-GG path,"Increase thermal capability of transmission lines to supply Boyne Island load and load supplied from Calliope River, Gladstone and Larcom Creek substations following retirement of generators in Gladstone and increased generation from NQ and CQ.",CQ-GG Option 1,"• A new 275 kV high-capacity double-circuit line between Calvale and Calliope River • Rebuild Larcom Creek to Bouldercombe 275 kV high-capacity double circuit line • Rebuild Calliope River to Larcom Creek 275 kV high-capacity double-circuit line • A new (third) 275/132 kV transformer at Calliope River • Retain the existing Bouldercombe - Calliope River 275 kV line (#812) until the rebuild of Calliope River to Larcom Creek (retire #812 after completion of project) • New 2 x synchronous condensers at Wurdong substation including a tee of Calliope River - Gin Gin 275 kV line (# 814) into Wurdong • New 200 megavolt amperes reactive (MVAr) capacitor bank at Calliope River, 200 MVAr capacitor bank at Larcom Creek, and 150 MVAr reactor at Calliope River • Install power flow controller at Wurdong substation on Calvale to Wurdong 275 kV line • Wide area monitoring, control and protection scheme Notes: (1) Retain the existing Larcom Creek-Raglan-Bouldercombe 275 kV line (#s 8875 and 811) in service (2) Decommission #812 from Bouldercombe to Calliope River and decommision #8859 from Larcom Creek to Calliope River","• A new 275 kV high-capacity double-circuit line between Calvale and Calliope River • Rebuild Larcom Creek to Bouldercombe 275 kV high-capacity double circuit line • Rebuild Calliope River to Larcom Creek 275 kV high-capacity double-circuit line • A new (third) 275/132 kV transformer at Calliope River • Retain the existing Bouldercombe - Calliope River 275 kV line (#812) until the rebuild of Calliope River to Larcom Creek (retire #812 after completion of project) • New 2 x synchronous condensers at Wurdong substation including a tee of Calliope River - Gin Gin 275 kV line (# 814) into Wurdong • New 200 megavolt amperes reactive (MVAr) capacitor bank at Calliope River, 200 MVAr capacitor bank at Larcom Creek, and 150 MVAr reactor at Calliope River • Install power flow controller at Wurdong substation on Calvale to Wurdong 275 kV line • Wide area monitoring, control and protection scheme Notes: (1) Retain the existing Larcom Creek-Raglan-Bouldercombe 275 kV line (#s 8875 and 811) in service (2) Decommission #812 from Bouldercombe to Calliope River and decommision #8859 from Larcom Creek to Calliope River",CQ to GG,2600,500,2707.0,Powerlink,Class 5(-20% to +30%),194,Short: (5 years),Short: (5 years),Short: (5 years) +CQ-GG,Existing CQ-GG path,"Increase thermal capability of transmission lines to supply Boyne Island load and load supplied from Calliope River, Gladstone and Larcom Creek substations following retirement of generators in Gladstone and increased generation from NQ and CQ.",CQ-GG Option 2,"• New Gladstone West 275 kV switching station • New 275 kV high capacity double-circuit line between Calvale and Calliope River (switched into Gladstone West) • A new (third) 275/132 kV transformer at Calliope River • Power flow control of Calvale -– Wurdong 275 kV line • 200 MVAr capacitor bank at Larcom Creek and Calliope River • 150 MVAr reactor at Gladstone West • 2 synchronous condensers at Gladstone West • Wide area monitoring, control and protection scheme • Rebuild Bouldercombe - Calliope River 275kV (#812) as a high capacity Bouldercombe - Larcom Creek 275kV double-circuit line (switched into Gladstone West) Notes: (1) Retain the existing Calliope River-Larcom Creek-Raglan-Bouldercombe 275 kV line (#s 8859, 8875 and 811) in service (2) Decommission #812 from Bouldercombe to Gladstone West but retain #812 from Gladstone West to Calliope River","• New Gladstone West 275 kV switching station • New 275 kV high capacity double-circuit line between Calvale and Calliope River (switched into Gladstone West) • A new (third) 275/132 kV transformer at Calliope River • Power flow control of Calvale -– Wurdong 275 kV line • 200 MVAr capacitor bank at Larcom Creek and Calliope River • 150 MVAr reactor at Gladstone West • 2 synchronous condensers at Gladstone West • Wide area monitoring, control and protection scheme • Rebuild Bouldercombe - Calliope River 275kV (#812) as a high capacity Bouldercombe - Larcom Creek 275kV double-circuit line (switched into Gladstone West) Notes: (1) Retain the existing Calliope River-Larcom Creek-Raglan-Bouldercombe 275 kV line (#s 8859, 8875 and 811) in service (2) Decommission #812 from Bouldercombe to Gladstone West but retain #812 from Gladstone West to Calliope River",CQ to GG,2600,500,2367.0,Powerlink,Class 5(-20% to +30%),180,Short: (3 years),Short: (3 years),Short: (3 years) +CQ-GG,Existing CQ-GG path,To access incresed generation from NQ and CQ to GG,CQ-GG Option 3,• Rebuild Calliope River to Larcom Creek 275 kV high-capacity double-circuit line • Decommission the section of Line 812 between Gladstone West and Calliope River.,CQ-GG Option 2,CQ to GG,600,0,180.78344204068,AEMO TCD,Class 5b(±50%),15,Medium: (6 years),Medium: (6 years),Medium: (6 years) +CQ-GG,Existing CQ-GG path,To access incresed generation from NQ and CQ to GG,CQ-GG Option 4,• Rebuild Calliope River to Wurdong 275 kV line (#818) as high-capacity double-circuit line,CQ-GG Option 1 or CQ-GG Option 2,CQ to GG,550,1950,191.8194377358,AEMO TCD,Class 5b(±50%),17,Medium: (6 years),Medium: (6 years),Medium: (6 years) diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CQ-NQ.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CQ-NQ.csv new file mode 100644 index 00000000..b0c3e0f2 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CQ-NQ.csv @@ -0,0 +1,5 @@ +Flow path,Development path,Development driver,Option name,Augmentation description,Pre-requisite options,Forward direction power flow,"Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Forward direction","Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Reverse direction","Indicative cost estimate ($2025, $ million)",Cost estimate source,Cost estimate class,Easement length (km),Lead time or earliest in service date,Additional REZ transmission capacity provided,Notes +CQ-NQ,North CQ-NQ path,Increase stability limits in NQ to increase the CQ-NQ flow path limit,CQ-NQ Option 1,"• A new 275 kV double-circuit line from Ross to Strathmore to Nebo, initially switching one side only",Assume BAU line refit of 275 kV and 132 kV network between Bouldercombe-Nebo-Strathmore-Ross,CQ to NQ,1100,1100,1854.1591510877,AEMO TCD,Class 5b(±50%),335,Long: (10 years),NQ1: 680 Q4_Hydrogen: 880,NQ1: 680 Q4_Hydrogen: 880 +CQ-NQ,CQ-NQ path,"To accommodate more renewable generation in REZ Q1, Q2 and Q4",CQ-NQ Option 2,• 500 kV substation works at Mulgrave (near Townsville 500 kV established as part of CopperString project) • A new 500 kV substation at locality of northern part of CQ (around 27 km south of Broadsound) • A new 500 kV substation at locality of southern part of NQ (around 80 km south of Nebo) • A new 500 kV double-circuit steel tower (DCST) line from CQ (west of Gladstone) to northern CQ substation • A new 500 kV DCST line from northern CQ to southern NQ substations • A new 500 kV DCST line from southern NQ substation to Mulgrave substation • 2 x 500/275 kV 1500 MVA transformers at northern CQ and southern NQ substations • Cut-in 275 kV circuits between Stanwell and Broadsound to northern CQ substation and between Broadsound and Nebo to southern NQ substation • Special protection scheme for transfer limit increase (similar to virtual transmission line) with the cost of this Network Service Agreement (NSA) excluded,"SQ-CQ Option 3, CopperString",CQ to NQ,3000,3000,5419.2026493729,AEMO TCD,Class 5b(±50%),623,Long: (10 years),NQ1: 3000 Q4_Hydrogen: 2400 Q2: 800,NQ1: 3000 Q4_Hydrogen: 2400 Q2: 800 +CQ-NQ,South of CQ-NQ path,Increase stability limits in NQ to increase the CQ-NQ flow path limit,CQ-NQ Option 3,• String the 2nd circuit between Stanwell and Broadsound 275 kV,• String the 2nd circuit between Stanwell and Broadsound 275 kV,CQ to NQ,350,110,208.94830113852,AEMO TCD,Class 5b(±50%),0,Short: (4 years),CQ1: 600,CQ1: 600 +CQ-NQ,CQ-NQ path,Increase stability limits in NQ to increase the CQ-NQ flow path limit,CQ-NQ Option 4,"• A new 275 kV high-capacity double-circuit line between Bouldercombe and Broadsound • A new 275 kV high-capacity double-circuit line between Broadsound and Nebo • Decommission the existing single circuits Bouldercombe-Broadsound (#820), Bouldercombe-Nebo (#821) and Broadsound-Nebo (#834).","• A new 275 kV high-capacity double-circuit line between Bouldercombe and Broadsound • A new 275 kV high-capacity double-circuit line between Broadsound and Nebo • Decommission the existing single circuits Bouldercombe-Broadsound (#820), Bouldercombe-Nebo (#821) and Broadsound-Nebo (#834).",CQ to NQ,1300,600,1974.06,Powerlink,Class 5b(±50%),307,Long: (7 years),CQ1: 1600,CQ1: 1600 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CSA-NSA.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CSA-NSA.csv new file mode 100644 index 00000000..6cc5f430 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_CSA-NSA.csv @@ -0,0 +1,6 @@ +Flow path,Development path,Development driver,Option name,Augmentation description,Pre-requisite options,Forward direction power flow,"Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Forward direction","Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Reverse direction","Indicative cost estimate ($2025, $ million)",Cost estimate source,Cost estimate class,Easement length (km),Lead time or earliest in service date,Additional REZ transmission capacity provided,Notes +CSA-NSA,North of existing CSA-NSA corridor,To increase transfer capability between CSA and NSA to accommodate increased renewable generation and/or increased load in NSA.,CSA-NSA Option 1,• A new 275 kV double-circuit line from Bundey to Yunta to Cultana East • A new 275 kV substation in locality of Yunta • A new 275 kV substation in locality of Cultana East • Modifications to existing line configurations to create 2x 275 kV new lines Cultana-Cultana East • A new single circuit line from Cultana to Cultana East • A 275 kV switching station in locality of Yunta • 4x275 kV 50 MVAr line-connected reactors at each end of Bundey - Yunta 275 kV lines. • 4x275 kV 50 MVAr line-connected reactors at each end of Yunta - Cultana East 275 kV lines. • Two +/-100 MVAr SVCs at Yunta and two +/-100 MVAr SVCs at Cultana East,• A new 275 kV double-circuit line from Bundey to Yunta to Cultana East • A new 275 kV substation in locality of Yunta • A new 275 kV substation in locality of Cultana East • Modifications to existing line configurations to create 2x 275 kV new lines Cultana-Cultana East • A new single circuit line from Cultana to Cultana East • A 275 kV switching station in locality of Yunta • 4x275 kV 50 MVAr line-connected reactors at each end of Bundey - Yunta 275 kV lines. • 4x275 kV 50 MVAr line-connected reactors at each end of Yunta - Cultana East 275 kV lines. • Two +/-100 MVAr SVCs at Yunta and two +/-100 MVAr SVCs at Cultana East,CSA to NSA,1100,1100,2190.0,ElectraNet,Class 5b(±50%),434,Medium: (6 years),MN1: 800,MN1: 800 +CSA-NSA,North of existing CSA-NSA corridor,To increase transfer capability between CSA and NSA to accommodate increased renewable generation and/or increased load in NSA.,CSA-NSA Option 2,• A new 330 kV double-circuit line from Bundey to Yunta to Cultana East • A new 330 kV substation in locality of Yunta • A new 330 kV substation at Cultana East with 3x700 MVA 330/275 kV transformers • Modifications to existing line configurations to create 2x 275 kV new lines Cultana-Cultana East • A new single circuit line from Cultana to Cultana East • 4x330 kV 50 MVAr line-connected reactors at each end of Bundey - Yunta 330 kV lines. • 4x330 kV 50 MVAr line-connected reactors at each end of Yunta - Cultana East 330 kV lines. • Two +/-100 MVAr SVCs at Yunta and two +/-100 MVAr SVCs at Cultana East,• A new 330 kV double-circuit line from Bundey to Yunta to Cultana East • A new 330 kV substation in locality of Yunta • A new 330 kV substation at Cultana East with 3x700 MVA 330/275 kV transformers • Modifications to existing line configurations to create 2x 275 kV new lines Cultana-Cultana East • A new single circuit line from Cultana to Cultana East • 4x330 kV 50 MVAr line-connected reactors at each end of Bundey - Yunta 330 kV lines. • 4x330 kV 50 MVAr line-connected reactors at each end of Yunta - Cultana East 330 kV lines. • Two +/-100 MVAr SVCs at Yunta and two +/-100 MVAr SVCs at Cultana East,CSA to NSA,1200,1200,2530.0,ElectraNet,Class 5b(±50%),434,Medium: (6 years),MN1: 1000,MN1: 1000 +CSA-NSA,North of existing CSA-NSA corridor,To increase transfer capability between CSA and NSA to accommodate increased renewable generation and/or increased load in NSA.,CSA-NSA Option 3,• Establish a new 500 kV switching substation at Yunta • A new 500 kV double-circuit line from Bundey North to Yunta to Cultana East. • A new 500 kV substation at Bundey North with 3x1500 MVA 500/330 kV transformers • A new 500/275 kV substation at Cultana East with 3x1500 MVA 500/275 kV transformers • 3 x new 275 kV circuits connecting Bundey with new Bundey North • Modifications to existing line configurations to create 2x 275 kV new lines Cultana-Cultana East • A new single circuit line from Cultana to Cultana East • 4x500 kV 50 MVAr line-connected reactors at each end of Bundey North - Yunta 500 kV lines. • 4x500 kV 50 MVAr line-connected reactors at each end of Yunta - Cultana East 500 kV lines. • Two +/-100 MVAr dynamic reactive plants at Yunta and two +/-100 MVAr dynamic reactive plants at Cultana East,• Establish a new 500 kV switching substation at Yunta • A new 500 kV double-circuit line from Bundey North to Yunta to Cultana East. • A new 500 kV substation at Bundey North with 3x1500 MVA 500/330 kV transformers • A new 500/275 kV substation at Cultana East with 3x1500 MVA 500/275 kV transformers • 3 x new 275 kV circuits connecting Bundey with new Bundey North • Modifications to existing line configurations to create 2x 275 kV new lines Cultana-Cultana East • A new single circuit line from Cultana to Cultana East • 4x500 kV 50 MVAr line-connected reactors at each end of Bundey North - Yunta 500 kV lines. • 4x500 kV 50 MVAr line-connected reactors at each end of Yunta - Cultana East 500 kV lines. • Two +/-100 MVAr dynamic reactive plants at Yunta and two +/-100 MVAr dynamic reactive plants at Cultana East,CSA to NSA,2000,2000,3510.0,ElectraNet,Class 5b(±50%),434,Long: (8 years),MN1: 1100,MN1: 1100 +CSA-NSA,North of existing CSA-NSA corridor,To increase transfer capability between CSA and NSA to accommodate increased renewable generation and/or increased load in NSA.,CSA-NSA Option 4 Stage 1,"•Bundey to Cultana East, the project will be carried out in a two-stage plan: in stage 1 conductor designed for 500 kV, but operated at 275kV; then in stage 2 the lines will be re-connected to enable 500kV operation. Stage 1: •A new 500 kV double-circuit line from Bundey to Yunta to Cultana East (to be operated at 275 kV in stage 1) •A new 275 kV substation in locality of Yunta •A new 275 kV substation in locality of Cultana East •Modifications to existing line configurations to create 2x 275 kV new lines Cultana-Cultana East •A new single circuit 275 kV line from Cultana to Cultana East •4x500 kV 160 MVAr line-connected reactors at each end of Bundey - Yunta lines (initially operated at 275 kV). •4x500 kV 160 MVAr line-connected reactors at each end of Yunta - Cultana East lines (initially operated at 275 kV). •Two +/-100 MVAr SVCs at Yunta and two +/-100 MVAr SVCs at Cultana East.","•Bundey to Cultana East, the project will be carried out in a two-stage plan: in stage 1 conductor designed for 500 kV, but operated at 275kV; then in stage 2 the lines will be re-connected to enable 500kV operation. Stage 1: •A new 500 kV double-circuit line from Bundey to Yunta to Cultana East (to be operated at 275 kV in stage 1) •A new 275 kV substation in locality of Yunta •A new 275 kV substation in locality of Cultana East •Modifications to existing line configurations to create 2x 275 kV new lines Cultana-Cultana East •A new single circuit 275 kV line from Cultana to Cultana East •4x500 kV 160 MVAr line-connected reactors at each end of Bundey - Yunta lines (initially operated at 275 kV). •4x500 kV 160 MVAr line-connected reactors at each end of Yunta - Cultana East lines (initially operated at 275 kV). •Two +/-100 MVAr SVCs at Yunta and two +/-100 MVAr SVCs at Cultana East.",CSA to NSA,1100,1100,3302.938001577383,AEMO TCD,Class 5b(±50%),434,Long: (8 years),MN1: 800,MN1: 800 +CSA-NSA,North of existing CSA-NSA corridor,To increase transfer capability between CSA and NSA to accommodate increased renewable generation and/or increased load in NSA.,CSA-NSA Option 4 Stage 2,"Stage 2: •A new 500 kV yard at Bundey North with 3x1000 MVA 500/275 kV transformers •A new 500 kV yard at Cultana East with 3x1000 MVA 500/275 kV transformers •A new 500 kV yard at Yunta with 2x1000 MVA 500/275 kV transformers •Swing connections for the Bundey – Yunta – Cultana East lines and associated reactors that were constructed in Stage 1 across from 275 kV to 500 kV yards at Bundey North , Yunta and Cultana East.",CSA-NSA Option 4 Stage 1,CSA to NSA,900,900,474.1140719838242,AEMO TCD,Class 5b(±50%),0,Long: (8 years),MN1: 300,MN1: 300 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_MEL-WNV.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_MEL-WNV.csv new file mode 100644 index 00000000..f973a6e3 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_MEL-WNV.csv @@ -0,0 +1,5 @@ +Flow path,Development path,Development driver,Option name,Augmentation description,Pre-requisite options,Forward direction power flow,"Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Forward direction","Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Reverse direction","Indicative cost estimate ($2025, $ million)",Cost estimate source,Cost estimate class,Easement length (km),Lead time or earliest in service date,Additional REZ transmission capacity provided,Notes +MEL-WNV,Existing 220 kV lines between Geelong and Keilor,To increase WNV to MEL transfer capability,MEL-WNV Option 1,"• Cut both existing Geelong to Keilor 220 kV lines into Deer Park. • Replace existing Keilor 500/220kV transformers with 1000 MVA units (expected to be completed as part of asset replacement project). • Operate the three Deer Park to Keilor 220kV circuits as normally-open, with supply to Deer Park provided from Geelong. • Install minor interplant replacements to increase rating on both existing Geelong to Moorabool 220kV lines.","• Cut both existing Geelong to Keilor 220 kV lines into Deer Park. • Replace existing Keilor 500/220kV transformers with 1000 MVA units (expected to be completed as part of asset replacement project). • Operate the three Deer Park to Keilor 220kV circuits as normally-open, with supply to Deer Park provided from Geelong. • Install minor interplant replacements to increase rating on both existing Geelong to Moorabool 220kV lines.",MEL-WNV,MEL-WNV,800,128,AEMO Victorian Planning,Class 5b(±50%),0,Short: (3 years),Short: (3 years),Short: (3 years) +MEL-WNV,Existing 220 kV lines between Geelong and Keilor,To increase WNV to MEL transfer capability,MEL-WNV Option 2,"• Cut both existing Geelong to Keilor 220 kV lines into Deer Park. • Replace existing Keilor 500/220kV transformers with 1000 MVA units (expected to be completed as part of asset replacement project). • Operate the three Deer Park to Keilor 220kV circuits as normally-open, with supply to Deer Park provided from Geelong. • Construct 3rd Geelong to Moorabool 220kV line.","• Cut both existing Geelong to Keilor 220 kV lines into Deer Park. • Replace existing Keilor 500/220kV transformers with 1000 MVA units (expected to be completed as part of asset replacement project). • Operate the three Deer Park to Keilor 220kV circuits as normally-open, with supply to Deer Park provided from Geelong. • Construct 3rd Geelong to Moorabool 220kV line.",MEL-WNV,MEL-WNV,800,174,AEMO Victorian Planning,Class 5b(±50%),7,Short: (5 years),Short: (5 years),Short: (5 years) +MEL-WNV,Existing 220 kV lines between Geelong and Keilor,To increase WNV to MEL transfer capability,MEL-WNV Option 3,"• A new 500 kV double circuit line from Moorabool to locality of Truganina. • A new 500 kV single circuit line from locality of Truganina to Sydenham. • A new 500 kV substation in locality of Truganina with two 500/220kV transformers, cut-in between Moorabool and Sydenham. • Two new 220 kV double circuit lines from locality of Truganina to Deer Park. • Operate the three Deer Park to Keilor 220 kV circuits as normally closed, and operate the three Geelong to Deer Park circuits as normally open. • Rebuild the three existing Deer Park to Keilor 220 kV lines as high capacity lines.",MEL-WNV Option 1 or 2,MEL-WNV,MEL-WNV,2000,1330,VicGrid,Class 5(-50% to +100%),90,Long: (7 years),Long: (7 years),"Note that further assessment of this option, considering a range of future load forecasts, load distribution and generation build is being undertaken by VicGrid for replacing the existing Deer Park to Keilor three 220kV lines (Post Deer Park Cut in) with higher capacity circuits which can help facilitate generation from South West & Western Victoria and provide an alternative flow path to supply Western Melbourne Metropolitan load in the future, which could alleviate emerging future constraints at Keilor Terminal Station." +MEL-WNV,Existing 220 kV lines between Geelong and Keilor,To increase WNV to MEL transfer capability,MEL-WNV Option 4,• Replacement of the existing 330/220 kV transformers at South Morang (H1 and H2) with higher rated units. • One transformer is to be in service and other is to be a hot spare to manage fault levels. • This project is to bring forward asset renewal of 330/220 kV transformers at South Morang.,• Replacement of the existing 330/220 kV transformers at South Morang (H1 and H2) with higher rated units. • One transformer is to be in service and other is to be a hot spare to manage fault levels. • This project is to bring forward asset renewal of 330/220 kV transformers at South Morang.,MEL-WNV,MEL-WNV,250,70,VicGrid,Class 5(-50% to +100%),0,Short: (4 years),Short: (4 years),There are three 330/220 kV transformers at South Morang and two transformers are in service during system normal operation. The replacement of the transformers at South Morang is also part of an active asset replacement Regulatory Investment Test for Transmission (RIT-T) being undertaken by AusNet Services. There will be further investigation to assess the differential cost and benefit of either replacing with higher capacity units or operation of 330kV/220kV transformers in parallel diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_NNSW-SQ.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_NNSW-SQ.csv new file mode 100644 index 00000000..452b2818 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_NNSW-SQ.csv @@ -0,0 +1,6 @@ +Flow path,Development path,Development driver,Option name,Augmentation description,Pre-requisite options,Forward direction power flow,"Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Forward direction","Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Reverse direction","Indicative cost estimate ($2025, $ million)",Cost estimate source,Cost estimate class,Easement length (km),Lead time or earliest in service date,Additional REZ transmission capacity provided,Notes +NNSW-SQ,Near Queensland-New South Wales Interconnector (QNI) path,"Increase transfer capability between NNSW and SQ by increasing thermal capacity and, voltage and transient stability limits of 330 kV and 275 kV lines between Armidale and Braemar.",NNSW–SQ Option 1,"• A new 330 kV single-circuit line from New England REZ North (Hub 10) to Dumaresq to Bulli Creek to Braemar. • A new 330/275 kV transformer at Braemar. • 330 kV Line shunt reactors at New England North (Hub 10) , Dumaresq, Bulli Creek, and Braemar, for the 330 kV lines between North (Hub 10) and Braemar (via Dumaresq and Bulli Creek).","CNSW-NNSW Option 1, N2 Option 1",NNSW to SQ,730,900,2394.6855330756,AEMO TCD,Class 5b(±50%),460,Long: (8 years),Long: (8 years),Long: (8 years) +NNSW-SQ,,"Increase transfer capability between NNSW and SQ by increasing thermal capacity and, voltage and transient stability limits of 330 kV and 275 kV lines between Armidale and Braemar.",NNSW–SQ Option 2,"(ISP candidate option) • A new 330 kV double-circuit line from New England North Hub (Hub 10) to Dumaresq to Bulli Creek to Braemar. • New 330/275 kV transformers at Braemar. • 330 kV Line shunt reactors at New England North (Hub 10) , Dumaresq, Bulli Creek, and Braemar, for the 330 kV lines between North (Hub 10) and Braemar (via Dumaresq and Bulli Creek).","CNSW-NNSW Option 1, N2 Option 1",NNSW to SQ,1260,1700,2989.0,Transgrid & Powerlink prepatory activity,Class 5b(±50%),460,Long: (8 years),Long: (8 years),Long: (8 years) +NNSW-SQ,,"Increase transfer capability between NNSW and SQ by increasing thermal capacity and, voltage and transient stability limits of 330 kV and 275 kV lines between Armidale and Braemar.",NNSW–SQ Option 3,• A Virtual Transmission Line option with a 200 MW energy storage system south of Armidale and north of Braemar.,• A Virtual Transmission Line option with a 200 MW energy storage system south of Armidale and north of Braemar.,NNSW to SQ,200,200,200.0,200,200,0,Short: (3 years),Short: (3 years),Short: (3 years) +NNSW-SQ,West of Queensland-New South Wales Interconnector (QNI) path,"Increase transfer capability between NNSW and SQ by increasing thermal capacity and, voltage and transient stability limits of 330 kV and 275 kV lines between Armidale and Braemar.",NNSW–SQ Option 4,• A 2000 MW HVDC bi-pole overhead transmission between a new substation in North West New South Wales (locality of Boggabri) and Halys. • A new 2000 HVDC bipole converter station in North West New South Wales • A new 2000 HVDC bipole converter station in locality of Halys. • AC network connection between HVDC converter station and 275 kV substation in Halys. • AC network connection between HVDC converter station and ac network in in NWNSW REZ. • A new 330 kV line between locality of Boggabri and Tamworth.,CNSW-NNSW Option 5,NNSW to SQ,1800,2000,9041.4634216326,AEMO TCD,Class 5b(±50%),601,Long: (8 years),Long: (8 years),Long: (8 years) +NNSW-SQ,,"Increase transfer capability between NNSW and SQ by increasing thermal capacity and, voltage and transient stability limits of 330 kV and 275 kV lines between Armidale and Braemar.",NNSW–SQ Option 5,• Establish a new substation in NNSW (new Dumaresq) and to New England REZ North (Hub 10). • A new 500kV substation at Halys with 2 x 500/275kV transformers. • A new 1x500 kV double-circuit line between Halys and new Dumaresq 500kV substation in NNSW. • Expand Northern (Hub 10) switching station to 500/330kV substation with 3 x 500/330/33kV 1500 MVA transformers • A new 1x500 kV double-circuit line between new Dumaresq and New England REZ Northern (Hub 10). • 2x 500/330 kV transformers connecting at new Dumaresq to 330kV Dumaresq 330 kV.,"CNSW-NNSW Option 1, N2 Option 1",NNSW to SQ,3000,2250,5270.663992399999,Transgrid & Powerlink prepatory activity,Class 5b(±50%),520,Long: (8 years),Long: (8 years),Long: (8 years) diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_SESA-CSA.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_SESA-CSA.csv new file mode 100644 index 00000000..6d2fb4f6 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_SESA-CSA.csv @@ -0,0 +1,5 @@ +Flow path,Development path,Development driver,Option name,Augmentation description,Pre-requisite options,Forward direction power flow,"Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Forward direction","Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Reverse direction","Indicative cost estimate ($2025, $ million)",Cost estimate source,Cost estimate class,Easement length (km),Lead time or earliest in service date,Additional REZ transmission capacity provided,Notes +SESA-CSA,Near existing SESA-CSA corridor,Increased power transfer capability with Victoria,SESA-CSA Option 1,(part of preparatory activities provided by ElectraNet): • String vacant circuit on the 275 kV Tungkillo – Tailem Bend line.,(part of preparatory activities provided by ElectraNet): • String vacant circuit on the 275 kV Tungkillo – Tailem Bend line.,SESA to CSA,120,120,80.5,ElectraNet,Class 5b(±50%),0,Short: (3 years),Short: (3 years),Short: (3 years) +SESA-CSA,East of existing SESA-CSA corridor,Increased power transfer capability with Victoria,SESA-CSA Option 2,• A new 500 kV double-circuit line from Bundey terminal station to a VRE collection node in South East SA (near Krongart). • 2x 1500 MVA 500/275 kV transformers at Bundey terminal station. • New VRE collection substation in SESA (near Krongart) that connects to the existing network. • 2x 1500 MVA 500/275 kV transformers at VRE collection substation.,SESA-CSA Option 1,SESA to CSA,1470,1470,3593.7937405796,AEMO TCD,Class 5b(±50%),421,Medium: (6 years),Medium: (6 years),Medium: (6 years) +SESA-CSA,East of existing SESA-CSA corridor,Increased power transfer capability with Victoria,SESA-CSA Option 3,• Build a 275 kV double-circuit line from Bundey terminal station to a VRE collection node in South East SA. • New VRE collection terminal station (near Krongart) that connects to the existing network,SESA-CSA Option 1,SESA to CSA,840,840,2269.0209629568,AEMO TCD,Class 5b(±50%),421,Long: (8 years),Long: (8 years),Long: (8 years) +SESA-CSA,East of existing SESA-CSA corridor,Increased power transfer capability with Victoria,SESA-CSA Option 4,• A 1500 MW HVDC bi-pole overhead transmission line from Bundey to near Krongart. • A new 1500 MW HVDC bipole converter station in locality of Krongart. • A new 1500 MW HVDC bipole converter station in locality of Bundey. • AC network connection between HVDC converter station and 275 kV substation in locality of Krongart • AC network connection between HVDC converter station and 275 kV AC network in Bundey.,• A 1500 MW HVDC bi-pole overhead transmission line from Bundey to near Krongart. • A new 1500 MW HVDC bipole converter station in locality of Krongart. • A new 1500 MW HVDC bipole converter station in locality of Bundey. • AC network connection between HVDC converter station and 275 kV substation in locality of Krongart • AC network connection between HVDC converter station and 275 kV AC network in Bundey.,SESA to CSA,1500,1500,4348.281779975,AEMO TCD,Class 5b(±50%),420,Long: (8 years),Long: (8 years),Long: (8 years) diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_SEV-MEL.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_SEV-MEL.csv new file mode 100644 index 00000000..48c03205 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_SEV-MEL.csv @@ -0,0 +1,6 @@ +Flow path,Development path,Development driver,Option name,Augmentation description,Pre-requisite options,Forward direction power flow,"Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Forward direction","Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Reverse direction","Indicative cost estimate ($2025, $ million)",Cost estimate source,Cost estimate class,Easement length (km),Lead time or earliest in service date,Additional REZ transmission capacity provided,Notes +SEV-MEL,Existing SEV-MEL path,To increase transfer capability from SEV to MEL,SEV-MEL Option 1,• Install a third 1000 MVA 500/220kV transformer at Rowville on bus 3-4 group.,Post Yallourn power station closure. Latrobe Valley modified parallel mode switching configuration and inter-trip protection scheme to prevent overloads on Hazelwood-Yallourn 220 kV lines or Hazelwood 500/220 kV transformers.,SEV-MEL,1000,1000,70,VicGrid,Class 5(-50% to +100%),0,Short: (5 years),Short: (5 years),Short: (5 years) +SEV-MEL,Existing SEV-MEL path,To increase transfer capability from SEV to MEL,SEV-MEL Option 2,• Install a third 1000 MVA 500/220kV transformer at Rowville on bus 3-4 group. • Install series impedance on the Hazelwood 500/220 kV transformers.,Post Yallourn power station closure. Latrobe Valley modified parallel mode switching configuration and inter-trip protection scheme to prevent overloads on Hazelwood-Yallourn 220 kV lines or Hazelwood 500/220 kV transformers.,SEV-MEL,2700,2700,350,VicGrid,Class 5(-50% to +100%),0,Short: (5 years),Short: (5 years),Short: (5 years) +SEV-MEL,Existing SEV-MEL path,To increase transfer capability from SEV to MEL,SEV-MEL Option 3,• Install 2nd 1000 MVA 500/220kV transformer at Cranbourne. • Transfer existing Rowville 500/220kV A2 transformer from bus group 1-2 to bus 3-4 group. • Tie in the existing Hazelwood to Rowville 500 kV (No.3) circuit at Cranbourne.,Post Yallourn power station closure. Latrobe Valley modified parallel mode switching configuration and inter-trip protection scheme to prevent overloads on Hazelwood-Yallourn 220 kV lines or Hazelwood 500/220 kV transformers.,SEV-MEL,650,650,90,VicGrid,Class 5(-50% to +100%),0,Short: (4 years),Short: (4 years),Short: (4 years) +SEV-MEL,Existing SEV-MEL path,To increase transfer capability from SEV to MEL,SEV-MEL Option 4,• Install 2nd 1000 MVA 500/220kV transformer at Cranbourne. • Transfer existing Rowville 500/220kV A2 transformer from bus group 1-2 to bus 3-4 group. • Series impedance on the Hazelwood 500/220 kV transformers.,Post Yallourn power station closure. Latrobe Valley modified parallel mode switching configuration and inter-trip protection scheme to prevent overloads on Hazelwood-Yallourn 220 kV lines or Hazelwood 500/220 kV transformers.,SEV-MEL,2500,2500,350,VicGrid,Class 5(-50% to +100%),0,Short: (5 years),Short: (5 years),Short: (5 years) +SEV-MEL,Existing SEV-MEL path,To increase transfer capability from SEV to MEL,SEV-MEL Option 5,Install a second Hazelwood to Yallourn 220 kV double circuit line,Post Yallourn power station closure. Latrobe Valley modified parallel mode switching configuration.,SEV-MEL,400,400,100,VicGrid,Class 5(-50% to +100%),10,Short: (2 years),Short: (2 years),Short: (2 years) diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_SNSW-CNSW.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_SNSW-CNSW.csv new file mode 100644 index 00000000..5cadcedb --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_SNSW-CNSW.csv @@ -0,0 +1,6 @@ +Flow path,Development path,Development driver,Option name,Augmentation description,Pre-requisite options,Forward direction power flow,"Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Forward direction","Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Reverse direction","Indicative cost estimate ($2025, $ million)",Cost estimate source,Cost estimate class,Easement length (km),Lead time or earliest in service date,Additional REZ transmission capacity provided,Notes +SNSW-CNSW,Wagga Wagga to Bannaby,To provide access to Snowy 2.0 generation to load centres in SNW.,SNSW-CNSW Option 1 (HumeLink),"• New Gugaa 500/330 kV substation. • A new 500 kV double circuit line between Gugaa and Wagga Wagga initially operated at 330 kV. • Three new 500 kV transmission circuits between: - Maragle and Bannaby 500 kV substations. - Maragle and Gugaa 500 kV substations. - Gugaa and Bannaby 500 kV substations. • Three 500/330 kV 1500 MVA transformers at Maragle substation. • Two 500/330 kV 1500 MVA transformers at new Gugaa substation. • 500 kV Line shunt reactors at the ends of Maragle – Bannaby, Maragle – Gugaa and Gugaa – Bannaby 500 kV lines. • Augmenting the substations at Maragle, Wagga Wagga and Bannaby to accommodate the additional transmission lines and transformers.","• New Gugaa 500/330 kV substation. • A new 500 kV double circuit line between Gugaa and Wagga Wagga initially operated at 330 kV. • Three new 500 kV transmission circuits between: - Maragle and Bannaby 500 kV substations. - Maragle and Gugaa 500 kV substations. - Gugaa and Bannaby 500 kV substations. • Three 500/330 kV 1500 MVA transformers at Maragle substation. • Two 500/330 kV 1500 MVA transformers at new Gugaa substation. • 500 kV Line shunt reactors at the ends of Maragle – Bannaby, Maragle – Gugaa and Gugaa – Bannaby 500 kV lines. • Augmenting the substations at Maragle, Wagga Wagga and Bannaby to accommodate the additional transmission lines and transformers.",SNSW to CNSW,2200,2200,2200.0,This project is considered to be commited and so is not included as an option here. The scope of the project is listed here for context so that the subsequent options can be understood.,This project is considered to be commited and so is not included as an option here. The scope of the project is listed here for context so that the subsequent options can be understood.,This project is considered to be commited and so is not included as an option here. The scope of the project is listed here for context so that the subsequent options can be understood.,This project is considered to be commited and so is not included as an option here. The scope of the project is listed here for context so that the subsequent options can be understood.,N6 + N7: 2200 N5: 400,N6 + N7: 2200 N5: 400 +SNSW-CNSW,Wagga Wagga to Bannaby,Increased import from Victoria and South Australia with high existing and Snowy 2.0 hydro generation,SNSW-CNSW Option 2,• A 2000 MW bi-pole overhead transmission line from locality of Bannaby to locality of Gugaa. • A new 2000 MW bipole converter station in locality of Bannaby. • A new 2000 MW bipole converter station in locality of Gugga. • AC network connection between new HVDC converter station in the locality of Bannaby and the existing Bannaby 500 kV substation. • AC network connection between HVDC converter station in the locality of Gugga and a future Gugaa 500 kV substation.,HumeLink,SNSW to CNSW,2000,2000,5274.7975294278,AEMO TCD,Class 5b(±50%),283,Long: (9 years),N6: 2000,N6: 2000 +SNSW-CNSW,Dinnawan-Wagga Wagga-Bannaby,Increased import from Victoria and South Australia and increased SWNSW REZ generation with high existing and Snowy 2.0 hydro generation,SNSW-CNSW Option 3,• An additional new 500 kV double-circuit line from Dinawan to Gugaa • An additional new 500 kV double-circuit line from Gugaa to Bannaby. • Four additional new 500/330/33 kV 1500 MVA transformers at Dinawan.,"HumeLink, WNV-SNSW Option 1 - VNI West, CNSW-SNW Option 3 or CNSW-SNW Option 4",SNSW to CNSW,6000,6000,4030.7718645318,AEMO TCD,Class 5b(±50%),450,Long: (9 years),N5+N6: 6000 SWNSW2: 6000,N5+N6: 6000 SWNSW2: 6000 +SNSW-CNSW,Dinnawan-Wagga Wagga-Bannaby,Increased import from Victoria and South Australia and increased SWNSW REZ generation with high existing and Snowy 2.0 hydro generation,SNSW-CNSW Option 4,• An additional new 500 kV single-circuit line from Dinawan to Gugaa • An additional new 500 kV single-circuit line from Gugaa to Bannaby. • Two additional new 500/330/33 kV 1500 MVA transformers at Dinawan.,"HumeLink, WNV-SNSW Option 1 - VNI West, CNSW-SNW Option 3 or CNSW-SNW Option 4",SNSW to CNSW,3000,3000,3173.0554487346,AEMO TCD,Class 5b(±50%),450,Long: (9 years),N5+N6: 3000 SWNSW2: 3000,N5+N6: 3000 SWNSW2: 3000 +SNSW-CNSW,HumeLink,Increased import from Victoria and South Australia and increased SWNSW REZ generation with high existing and Snowy 2.0 hydro generation,SNSW-CNSW Option 5,• A new Switching Station near Wondalga at the Y point connecting the 3 x 500 kV HumeLink lines: - Bannaby - Gugaa 500 kV line - Bannaby - Maragle 500 kV line - Gugaa - Maragle 500 kV line • 4x150 MVAr line reactors,HumeLink,SNSW to CNSW,450,450,219.80278058178,AEMO TCD,Class 5b(±50%),0,Short: (3 years),Short: (3 years),Short: (3 years) diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_SQ-CQ.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_SQ-CQ.csv new file mode 100644 index 00000000..e0a7d078 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_SQ-CQ.csv @@ -0,0 +1,7 @@ +Flow path,Development path,Development driver,Option name,Augmentation description,Pre-requisite options,Forward direction power flow,"Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Forward direction","Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Reverse direction","Indicative cost estimate ($2025, $ million)",Cost estimate source,Cost estimate class,Easement length (km),Lead time or earliest in service date,Additional REZ transmission capacity provided,Notes +SQ-CQ,West of the existing SQ-CQ path,Increase transfer capability between SQ and CQ.,SQ-CQ Option 1,• A new 275 kV double-circuit line between Calvale and Wandoan South • 275 kV line shunt reactors at both ends of Calvale to Wandoan South 275 kV circuits,• A new 275 kV double-circuit line between Calvale and Wandoan South • 275 kV line shunt reactors at both ends of Calvale to Wandoan South 275 kV circuits,SQ to CQ,900,900,1323.4198245291,AEMO TCD,Class 5b(±50%),247,Long: (9 years),Long: (9 years),Long: (9 years) +SQ-CQ,Existing SQ-CQ path,Increase transfer capability between SQ-CQ. Mid-point (Auburn River) switching substation.,SQ-CQ Option 2,• Mid-point switching substation (Auburn River) on the existing Calvale to Halys 275 kV double-circuit line,• Mid-point switching substation (Auburn River) on the existing Calvale to Halys 275 kV double-circuit line,SQ to CQ,0,300,59.149628750194,AEMO TCD,Class 5b(±50%),0,Short: (5 years),Short: (5 years),Short: (5 years) +SQ-CQ,Existing SQ-CQ path (500 kV operating at 275 kV),Increase transfer capability between SQ and CQ. Staging of the Central Queensland to Southern Queensland Expansion (formerly Queensland SuperGrid South) by building new 500 kV lines which operate at 275 kV.,SQ-CQ Option 3,"• A new 500 kV double circuit line between mid-point (Auburn River) and Calvale substations, operating at 275 kV. • A new 500 kV double circuit line between mid-point (Auburn River) and Halys substations, operating at 275 kV. • A new 500 kV double circuit line between Cavale and Gladstone West (CQ) 275 kV substations, operating at 275 kV","SQ-CQ Option 2, CQ-GG Option 2",SQ to CQ,2800,1400,3177.1338216986,AEMO TCD,Class 5b(±50%),366,Long: (10 years),Long: (10 years),Long: (10 years) +SQ-CQ,Existing SQ-CQ path,Increase transfer capability between SQ and CQ. Non-network option.,SQ-CQ Option 4,• Non-network option – virtual transmission line option with a 300 MW energy storage system north of Calvale and south of Halys,• Non-network option – virtual transmission line option with a 300 MW energy storage system north of Calvale and south of Halys,SQ to CQ,300,300,300.0,300,300,0,Short: (3 years),Short: (3 years),Short: (3 years) +SQ-CQ,Existing SQ-CQ path,Increase transfer capability between SQ and CQ. Central Queensland to Southern Queensland Expansion (formerly Queensland SuperGrid South).,SQ-CQ Option 5,• New 500 kV double-circuit line between Halys and Auburn River substations • New 500 kV double-circuit line between Auburn River and Gladstone West substations • Establish 500 KV Halys substation with 3 x 500/275 kV 1500 MVA transformers • New 500 kV substation west of Gladstone (CQ 500 kV substation) with 3 x 500/275 kV 1500 MVA transformers • Establish 500 kV substation at Auburn River with 2 x 500/275kV 1500 MVA transformers • New dynamic reactive support at Gladstone West (CQ) substation,"SQ-CQ Option 2, CQ-GG Option 2",SQ to CQ,3150,1900,3751.4172,AEMO TCD,Class 5b(±50%),331,Short: (5 years),Q7 Hydrogen: 950 SQ1: 1100,Q7 Hydrogen: 950 SQ1: 1100 +SQ-CQ,Existing SQ-CQ path (operating at 500 kV),Staging the Central Queensland to Southern Queensland Expansion (formerly Queensland SuperGrid South) by raising the 275 kV circuits to 500 kV.,SQ-CQ Option 6,• New 500 kV Halys substation with 3 x 500/275 kV 1500 MVA transformers • New 500 kV substations west of Gladstone (CQ 500 kV substation with 3 x 500/275 kV 1500 MVA transformers • New 500 kV substation at Auburn River with 2 x 500/275 kV 1500 MVA transformers • Raise the double-circuit line between Halys and Auburn River substations to 500 kV operation. • Raise the double-circuit line between Auburn River and Gladstone West substations to 500 kV operation • New dynamic reactive support at Gladstone (CQ) west substation,SQ-CQ Option 3,SQ to CQ,350,500,799.58849710968,AEMO TCD,Class 5b(±50%),0,Long: (10 years),SQ1: 1100,SQ1: 1100 diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_TAS-SEV.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_TAS-SEV.csv new file mode 100644 index 00000000..d710f423 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_TAS-SEV.csv @@ -0,0 +1,3 @@ +Flow path,Development path,Development driver,Option name,Augmentation description,Pre-requisite options,Forward direction power flow,"Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Forward direction","Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Reverse direction","Indicative cost estimate ($2025, $ million)",Cost estimate source,Cost estimate class,Easement length (km),Lead time or earliest in service date,Additional REZ transmission capacity provided,Notes +TAS-SEV,Proposed Marinus Link path (path between Burnie area and Latrobe Valley area),Access to high quality wind resources in Tasmania and deep storage capability of Tasmanian hydro generation.,TAS-SEV Option 1 (Project Marinus Stage 1),"•A 750 MW monopole HVDC link between Burnie area in Tasmania and Hazelwood area in Victoria. • A new 750 MW HVDC monopole converter station in Burnie area. • A new 750 MW HVDC monopole converter station in Hazelwood area. • Some enabling design, survey and civil works for Stage 2 HVDC are assumed to be included in Stage 1 • A new 220 kV switching station at Heybridge adjacent to the converter station. • A new double-circuit 220 kV transmission line between Sheffield, Heybridge and Burnie • A new 220 kV double-circuit line from Palmerston to Sheffield with decommissioning of existing the single-circuit line. • A new 500 kV connection from converter station in Hazelwood area. • Decommission existing Sheffield – Burnie 220 kV line. Note: HVDC interconnector components are referred to as Marinus Link 1","•A 750 MW monopole HVDC link between Burnie area in Tasmania and Hazelwood area in Victoria. • A new 750 MW HVDC monopole converter station in Burnie area. • A new 750 MW HVDC monopole converter station in Hazelwood area. • Some enabling design, survey and civil works for Stage 2 HVDC are assumed to be included in Stage 1 • A new 220 kV switching station at Heybridge adjacent to the converter station. • A new double-circuit 220 kV transmission line between Sheffield, Heybridge and Burnie • A new 220 kV double-circuit line from Palmerston to Sheffield with decommissioning of existing the single-circuit line. • A new 500 kV connection from converter station in Hazelwood area. • Decommission existing Sheffield – Burnie 220 kV line. Note: HVDC interconnector components are referred to as Marinus Link 1",TAS to SEV,750,750[footnote14],"4758$534 million, in $2023, of this amount relates to approved early works and other incurred costs that should be excluded from the cost estimate for the 2026 ISP in accordance with the AER’s CBA Guidelines. AEMO has removed this from the estimate of $5035 million in $2023, and has then adjusted to $2025. This cost reflects the cost to deliver the project at the proponents' expected timing.)",Marinus Link Pty Ltd & TasNetworks,Class 2(-15% to +20%),(90 underground cable) 0 (HVAC new easement),Short: (4 years),Short: (4 years),Short: (4 years) +TAS-SEV,Proposed Marinus Link path (path between Burnie area and Latrobe Valley area),Access to high quality wind resources in Tasmania and deep storage capability of Tasmanian hydro generation.,TAS-SEV Option 2 (Project Marinus Stage 2),• An additional 750 MW monopole HVDC link between Burnie area in Tasmania and Hazelwood area in Victoria. • An additional new 750 MW HVDC monopole converter station in Burnie area. • An additional new 750 MW HVDC monopole converter station in Hazelwood area. • A new 220 kV switching station at Staverton. • A new double-circuit 220 kV transmission line from Staverton to Burnie via Hampshire • Cut-in both Sheffield-Mersey Forth double-circuit 220 kV lines at Staverton. • Capacity increase of the four Sheffield–Staverton 220 kV transmission circuits. • A new 500 kV connection from converter station in Hazelwood area.,TAS-SEV Option 1,TAS to SEV,750,750[footnote15],"2626$51 million, in $2023, of this amount relates to approved early works and other incurred costs that should be excluded from the cost estimate for the 2026 ISP in accordance with the AER’s CBA Guidelines. AEMO has removed this from the estimate of $2535 million in $2023, and has then adjusted to $2025. This cost reflects the cost to deliver the project at the proponents' expected timing.)",Marinus Link Pty Ltd & TasNetworks,Class 2(±30%),(0 underground cable) 94 (HVAC new easement),Long: (8 years),Long: (8 years),Long: (8 years) diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_WNV-SESA.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_WNV-SESA.csv new file mode 100644 index 00000000..75b894d4 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_WNV-SESA.csv @@ -0,0 +1,4 @@ +Flow path,Development path,Development driver,Option name,Augmentation description,Pre-requisite options,Forward direction power flow,"Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Forward direction","Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Reverse direction","Indicative cost estimate ($2025, $ million)",Cost estimate source,Cost estimate class,Easement length (km),Lead time or earliest in service date,Additional REZ transmission capacity provided,Notes +WNV-SESA,Near existing VIC-SESA corridor,Increase transfer capability between WNV and SESA to access increased renewable generation.,WNV-SESA Option 1,• A new 275 kV double-circuit line from a VRE collection node in South East SA (near Krongart) to Heywood terminal station. • 2x1000 MVA 500/275 kV transformers at Heywood terminal station. • New VRE collection substation in SESA (near Krongart).,• A new 275 kV double-circuit line from a VRE collection node in South East SA (near Krongart) to Heywood terminal station. • 2x1000 MVA 500/275 kV transformers at Heywood terminal station. • New VRE collection substation in SESA (near Krongart).,WNV to SESA,890,890,801.24601528149,AEMO TCD,Class 5b(±50%),108,Short: (5 years),Short: (5 years),Short: (5 years) +WNV-SESA,Near existing VIC-SESA corridor,Increase transfer capability between WNV and SESA to access increased renewable generation.,WNV-SESA Option 2,• A new 500 kV double-circuit line from a VRE collection node in South East SA (near Krongart) to Heywood terminal station. • New VRE collection substation in SESA (near Krongart). • 2x 1500 MVA 500/275 kV transformers at VRE collection terminal station.,• A new 500 kV double-circuit line from a VRE collection node in South East SA (near Krongart) to Heywood terminal station. • New VRE collection substation in SESA (near Krongart). • 2x 1500 MVA 500/275 kV transformers at VRE collection terminal station.,WNV to SESA,1900,1900,1168.2261297204,AEMO TCD,Class 5b(±50%),108,Medium: (6 years),Medium: (6 years),Medium: (6 years) +WNV-SESA,Near existing VIC-SESA corridor,Increase transfer capability between WNV and SESA to access increased renewable generation.,WNV-SESA Option 3,• A 1500 MW HVDC bi-pole overhead transmission line from Heywood to South East SA (near Krongart). • A new 1500 MW HVDC bipole converter station in locality of Krongart. • A new 1500 MW HVDC bipole converter station in locality of Heywood. • AC network connection between HVDC converter station and 275 kV substation in the locality of Krogart. • AC network connection between HVDC converter station and 500 kV AC network in Heywood.,• A 1500 MW HVDC bi-pole overhead transmission line from Heywood to South East SA (near Krongart). • A new 1500 MW HVDC bipole converter station in locality of Krongart. • A new 1500 MW HVDC bipole converter station in locality of Heywood. • AC network connection between HVDC converter station and 275 kV substation in the locality of Krogart. • AC network connection between HVDC converter station and 500 kV AC network in Heywood.,WNV to SESA,1500,1500,3207.260876874,AEMO TCD,Class 5b(±50%),110,Medium: (6 years),Medium: (6 years),Medium: (6 years) diff --git a/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_WNV-SNSW.csv b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_WNV-SNSW.csv new file mode 100644 index 00000000..9c38ded1 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_augmentation_options_WNV-SNSW.csv @@ -0,0 +1,2 @@ +Flow path,Development path,Development driver,Option name,Augmentation description,Pre-requisite options,Forward direction power flow,"Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Forward direction","Notional transfer level increase (MW) Note: Same increase applies to all transfer limit conditions (Peak demand, Summer typical and Winter reference)_Reverse direction","Indicative cost estimate ($2025, $ million)",Cost estimate source,Cost estimate class,Easement length (km),Lead time or earliest in service date,Additional REZ transmission capacity provided,Notes +WNV-SNSW,West of VNI 330 kV path,"Increase thermal capacity and, voltage and stability limit of VIC-NSW interconnector. Provide route diversity of existing VNI 330 kV corridor",WNV-SNSW Option 1 - VNI West,"South West NSW REZ (N5 Option 1) Stage 1: • Upgrade Dinawan – Wagga Wagga – Gugaa double-circuit line from 330 kV to 500 kV operation and bypass at Wagga Wagga (lines built at 500 kV as part of Project EnergyConnect and HumeLink). • Establish Dinawan 500 kV switchyard with two 500/330 kV 1500 MVA transformers. • 500 kV line shunt reactors at both ends of the 500 kV double circuits Dinawan – Gugaa. • Bring forward the line shunt reactors for the Dinawan – Tragowel 500 kV double circuit for voltage support at Dinawan. • Cut-in Gugga substation between Lower Tumut - Wagga 330 kV single-circuit overhead line (line TL51). • Rebuild 330 kV line between Gugga and Wagga (section of TL51) as a new double circuit overhead line, using the Line TL51 easement. Victoria – New South Wales (Bulgana – Kerang – Dinawan) Stage 2: • A new 500 kV double-circuit overhead line from near Bulgana to Tragowel (near Kerang) to locality of Dinawan, including series compensation on the line near Tragowel. • Establish new Tragowel Terminal Station with two 500/220 kV 1000 MVA transformers. • 220 kV connections from the new Tragowel Terminal Station to the existing 220 kV lines near Kerang. • Eildon – Thomastown and Rowville - Thomastown 220 kV lines are to be cut into at South Morang creating normally operating direct connection between Eildon 220 kV and Rowville 220 kV, in place of previously proposed modular power flow controllers, to prevent overloading on the 220 kV lines between Dederang and Thomastown. South Morang - Thomastown sections of lines are to be bridged together with existing South Morang-Thomastown lines increasing the capacity of those lines. • 500 kV line shunt reactors at both ends of the two following 500 kV circuits: (i) near Bulgana – Tragowel (ii) Tragowel – Dinawan at Tragowel • Two new 500 kV bays and line exits with a total of two 500 kV line shunt reactors at the Terminal Station near Bulgana. • Up to +/- 400 MVAr dynamic reactive compensation at the new 220 kV Tragowel Terminal Station. • Series compensation capacitors on both of the 500 kV circuits between Tragowel and near Bulgana, to reduce impedance on the new 500 kV network and thereby improve network load sharing with, and manage network loading on, the existing 330 kV Victoria – New South Wales Interconnector and the existing 220 kV western Victoria network between Bendigo and Kerang.","Western Renewables Link, HumeLink, Project EnergyConnect",WNV to SNSW,1890,1670,7035$565 million of this amount relates to approved early works and other incurred costs that should be excluded from the total cost estimate of $7600 million for the 2026 ISP in accordance with the AER’s CBA Guidelines.),Transgrid and AEMO (Victorian Planning),Class 4(-30% to +50%),491,Short: (5 years),V1: 1580 WV1:200 N5: 600 Removes WNV1 constraint,V1: 1580 WV1:200 N5: 600 Removes WNV1 constraint diff --git a/tests/test_workbook_table_cache/7.5/flow_path_transfer_capability.csv b/tests/test_workbook_table_cache/7.5/flow_path_transfer_capability.csv new file mode 100644 index 00000000..f13fa58c --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/flow_path_transfer_capability.csv @@ -0,0 +1,19 @@ +Flow Paths,Forward direction capability approximation (MW)_Peak demand,Forward direction capability approximation (MW)_Summer typical,Forward direction capability approximation (MW)_Winter refernce,Reverse direction capability approximation (MW)_Peak demand,Reverse direction capability approximation (MW)_Summer typical,Reverse direction capability approximation (MW)_Winter refernce,Dominant constraints_Forward direction,Dominant constraints_Reverse direction,Notes +CQ-NQ,1200,1200,1400,1440,1440,1910,Voltage stability in NQ for the loss of NQ or CQ transmission network elements.,Thermal capability of Broadsound to Nebo 275 kV line 1 for the loss of second Broadsound to Nebo 275 kV line or thermal capability of Dysart to Peak Downs/Moranbah 132 kV line.,Limits were determined with the inclusion of a minor Strathmore to Ross line upgrade. AEMO is working with Powerlink to further investigate possible voltage or transient stability limits associated with CQ – NQ reverse flow capability. +CQ-GG,700,700,1050,750,750,1100,Thermal overload of Calvale to Wurdong 275 kV line,Thermal capacity of Calliope River-Woolooga for the loss of one of the parallel lines,"CQ-GG limits are heavily influenced by the amount of generation and northern and central QLD, particularly at Gladstone. The provided transfer limit is a representation with typical generation output from Stanwell and Calvale and reduced generation at Gladstone. This limit will be further reviewed with hourly simulation results." +SQ-CQ,1100,1100,1100,2100,2100,2100,Thermal capability of Blackwall -South Pine 275 kV line.,Transient stability or voltage stability for a contingency of the Calvale-Halys 275 kV circuit.,It is assumed Powerlink will establish a new substation at Karana Downs for teeing-in both Blackwall – Rocklea 275 kV lines to South Pine. +NNSW-SQ,950,950,950,1450,1450,1450,QNI forward direction maximum transfer capacity of 950 MW (design limit with QNI minor).,Thermal capacity of Sapphire-Armidale 330 kV line for an outage of Dumaresq-Armidale 330 kV line. This assumes no Sapphire wind and/or Tilbuster solar generation.,These transfer limits include the completion of the QNI minor project. QNI minor is currently undergoing inter-network testing to release the designed maximum capacity. QLD to NSW transfer limit influenced by generation output from Sapphire Wind Farm and Tilbuster Solar Farm. +NNSW-SQ (Terranora),0,50,50,130,150,200,Thermal capability of Lismore - Dunoon 132 kV lines.,Thermal capability of Mudgeeraba 275/110 kV transformers,Thermal capability of Mudgeeraba 275/110 kV transformers +CNSW-NNSW,910,910,910,930,930,1025,Voltage stability for an outage of Kogan Creek generator.,Thermal capability of Tamworth-Armidale 330 kV circuits.,Thermal capability of Tamworth-Armidale 330 kV circuits. +CNSW-SNW-NTH,4490,4490,4730,4490,4490,4730,Maximum transfer capability is limited by several 330 kV lines and the most limiting elements are Liddell-Newcastle and Liddell-Tomago 330 kV lines.,Maximum transfer capability is limited by several 330 kV lines and the most limiting elements are Liddell-Newcastle and Liddell-Tomago 330 kV lines.,"For long-term capacity outlook modelling, CNSW-SNW transfer limit is represented as two limits. One as CNSW-SNW_South and other as CNSW-SNW_North. AEMO has worked closely with EnergyCo and Transgrid to refine this limit to be used for the long-term capacity outlook model. The transfer limit for this flow path has been formulated for the long-term capacity outlook model and shouldn't be used for other applications. CNSW-SNW transfer limit improvement with Waratah Super Battery (WSB) with a System Integrity Protection Scheme (SIPS) and associated minor network augmentation, are provided in a table below titled 'Notional transfer capability uplift between the sub-regions for committed and anticipated projects'. Central West Orana REZ Network Infrastructure Project also improves CNSW-SNW transfer limit. Power is not expected to frequently flow from SNW to CNSW since the major load centre is SNW. Forward direction transfer limit will be assessed if material importance." +CNSW-SNW-STH,2540,2540,2720,2540,2540,2720,Maximum transfer capability is limited by several 330 kV lines and the most limiting element is Bannaby-Sydney West 330 kV line.,Maximum transfer capability is limited by several 330 kV lines and the most limiting element is Bannaby-Sydney West 330 kV line.,"For long-term capacity outlook modelling, CNSW-SNW transfer limit is represented as two limits. One as CNSW-SNW_South and other as CNSW-SNW_North. AEMO has worked closely with EnergyCo and Transgrid to refine this limit to be used for the long-term capacity outlook model. The forward limit for this flow path has been formulated for the detailed long-term capacity outlook model and shouldn't be used for other applications. CNSW-SNW transfer limit improvement with Waratah Super Battery (WSB) with a System Integrity Protection Scheme (SIPS) and associated minor network augmentation, are provided in a table below titled 'Notional transfer capability uplift between the sub-regions for committed and anticipated projects'. Central West Orana REZ Network Infrastructure Project also improves CNSW-SNW transfer limit. Power is not expected to frequently flow from SNW to CNSW since the major load centre is SNW. Forward direction transfer limit will be assessed if material importance." +SNSW-CNSW,2700,2700,2950,2320,2320,2590,"Thermal capability of Crookwell-Bannaby, Collector-Marula or Yass-Marulan 330 kV lines. Prior to HumeLink service, Snowy 2.0 generation or pump load is limited by a transient stability limit.","Thermal capability of Yass-Canberra, Collector -Yass or Gullen Range-Yass 330 kV line.","For all forward direction transfer limits - The limit of 660 MW of Snowy 2.0 generation or pumping load represents with Snowy 2.0 connection to the existing network and prior to HumeLink in service. With HumeLink in service, up to 2200 MW of Snowy 2.0 generation or pumping load is made available in the modelling." +SNSW-CSA,150,150,150,150,150,150,Project EnergyConnect Stage 1 design limit.,Project EnergyConnect Stage 1 design limit.,WNV - SESA and SNSW - CSA combined maximum transfer limit is 750 MW in forward direction (import into SA) and 700 MW in reverse direction (export from SA). This transfer limit will increase with full capacity release of Project EnergyConnect (Stage 2 completion). Additional transfer capacity is provided in a table below titled 'Notional transfer capability uplift between the sub-regions for committed and anticipated projects'. +WNV-SNSW,870,1000,1000,400,400,400,Transient stability for a fault on a Hazelwood-South 500 circuit or volage stability in Southern New South Wales for loss of largest load in Victoria.,"Voltage stability in SNSW for loss of the largest generator in Victoria. Prior to HumeLink service, Snowy 2.0 generation or pump load is limited by a transient stability limit.","The forward direction transfer limits include the completion of the VNI minor project. For peak demand limit in reverse direction - Victoria system integrity protection scheme (SIPS) with 250 MW battery storage in western side of Melbourne raises the thermal capacity in the reverse direction of Victoria-New South Wales interconnector. SSNW to WNV transfer limit during peak periods reduces to 250 MW on conclusion of the VNI SIPS agreement 31 March 2032. For all reverse direction transfer limits - The limit of 660 MW of Snowy 2.0 generation or pumping load represents with Snowy 2.0 connection to the existing network and prior to HumeLink in service. With HumeLink in service, up to 2200 MW of Snowy 2.0 generation or pumping load is made available in modelling.Access of Snowy 2.0 generation to Victoria is subject to NSW to VIC interconnetor transfer limit." +MEL-WNV,3000,3000,3000,2300,2550,4880,Thermal capability of 220kV line between Ballarat-Bendigo with loss of South Morang to Dederang 330kV line and 5000MW load in Victoria.,Thermal capability of 220 kV lines between Moorabool and Geelong for loss of a parallel 220 kV circuit.,New flow path added in this 2025 IASR. Generation from MEL is not expected to supply WNV (Forward direction) at times of high demand periods. For the forward direction transfer limits – a maximum transfer capacity of 3000 MW represents with demand in Victoria between 4000 MW to 6000 MW. These limits have been reviewed in collaboration with AEMO (Victorian Planning) and VicGrid. Transfer limits associated with post Western Renewables Link are available in the “Network Capability” worksheet in the 2025 Inputs and Assumptions Workbook. +SEV-MEL,7100,7430,8170,7100,7430,8170,Thermal capability of 220 kV lines between Rowville and Yallourn or 220 lines between Brunswick and Richmond.,,New flow path added in this 2025 IASR. This limit is applicable for the existing network before retirement of Yallourn Power Station. Power is not expected to frequently flow from MEL to SEV since the major load centre is MEL. Reverse direction transfer limit will be assessed if material importance. A transient or voltage stability limit lower than the thermal limit may be applicable for this flow path. This limit is applicable until Yallourn power station closure. AEMO will continue to engage with AEMO (Victorian Planning) and VicGrid to further refine this limit. Transfer limits with Western Renewables Link and post Yallourn power station closure are available in the “Network Capability” worksheet in the 2025 Inputs and Assumptions Workbook. +TAS-SEV,594,594,594,478,478,478,Basslink HVDC submarine cable transfer limit.,Basslink HVDC submarine cable transfer limit.,"The TAS - VIC (Basslink) allowable capability is limited by a daily energy throughput limit, as outlined in the table below. APA has advised AEMO of a new Cable Load Prediction System (CLPS) for Basslink that allows for this dynamic capacity on this existing cable between Tasmania and Victoria, increasing peak transfer capacity to its original design transfer capacity (594 MW towards Victoria and 478 MW towards Tasmania). Source: 2023 ESOO update, https://www.aemo.com.au/-/media/files/electricity/nem/planning_and_forecasting/nem_esoo/2023/may-2024-update-to-the-2023-electricity-statement-of-opportunities.pdf" +WNV-SESA,650,650,650,650,650,650,Thermal capability of Heywood-South East 275 kV line or transient stability limit for loss of the largest generator in South Australia or transient stability limit of loss of South East - Tailem Bend 275 kV line.,Oscillatory stability limit.,Heywood interconnector currently operates at 600 MW forward capability and 550 MW reverse capability. AEMO and ElectraNet work towards to release the transfer capability to its designed capability of 650 MW in both directions. +WNV-CSA (Murraylink),165,220,220,100,200,200,Murraylink thermal capacity. Assumes high renewable generation in North West Victoria during high ambient temperature.,Thermal capability of 132 kV lines between Robertstown and North West Bend,Thermal capability of 132 kV lines between Robertstown and North West Bend +SESA-CSA,750,750,800,790,790,820,Thermal capacity of South East -Tailem Bend 275 kV circuit or Tailem Bend -Tungkillo 275 kV for loss of parallel circuit.,Thermal capability of Tailem Bend - Tungkillo 275 kV circuit for loss of a parallel circuit..,This transfer limit considers Project EnergyConnect Stage 1 in service. Transient and oscillatory stability limits may also be applicable on this flow path. +CSA-NSA,1070,1070,1230,1150,1150,1200,Thermal capability of 275 kV line between Bungama and Davenport.,Thermal capability of 275 kV line between Brinkworth to Davenport.,A transient or voltage stability limit lower than the thermal limit may be applicable for this flow path. diff --git a/tests/test_workbook_table_cache/7.5/initial_transmission_limits.csv b/tests/test_workbook_table_cache/7.5/initial_transmission_limits.csv new file mode 100644 index 00000000..69831bd7 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/initial_transmission_limits.csv @@ -0,0 +1,48 @@ +REZ ID,REZ name,Additional constraint information,REZ transmission network limit_Peak demand,REZ transmission network limit_Summer typical,REZ transmission network limit_Winter reference,Electrolyser import limit,Indicative transmission expansion cost ($M/MW)_Tranche 1,Indicative transmission expansion cost ($M/MW)_Tranche 2,Indicative transmission expansion cost ($M/MW)_Tranche 2 conditions,Indicative transmission expansion cost ($M/MW)_Tranche 3,Indicative transmission expansion cost ($M/MW)_Tranche 3 conditions,Notes +Q1,Far North QLD,,750.0,750.0,750.0,92.0,3.230142325581395,,,,, +Q2,North Qld Clean Energy Hub,,700.0,700.0,700.0,,2.1876343598666,1.1373254964742,Apply after 500 MW,,, +Q3,Northern Qld,Modelled as part of Group Constraint NQ1,,,,,,,,,, +Q4,Isaac,Modelled as part of the Group Constraint CQ1,,,,,,,,,, +Q5,Barcaldine,,85.0,85.0,85.0,,3.2983242321192,,,,, +Q6,Fitzroy,Modelled as part of SQ-CQ sub-regional limit,,,,,,,,,,A REZ network limit of 3000 MW has also been modelled for the Accelerated Transition Exports scenario for Q6 to reflect changes in power flow direction associated with significant Hydrogen demand in the CQ sub-region +Q7,Wide Bay,Modelled as part of Group Constraint SQ1,,,,,,,,,, +Q8,Darling Downs,See Transmission Limit SWQLD1,,,,,,,,,, +Q9,Banana,,150.0,150.0,150.0,,Included in connection costs,,,,,Q9 expansion is considered in its connection costs +Q10,Collinsville,Modelled as part of CQ-NQ sub-regional limit,,,,,,,,,,High generation in Q10 may also result in northerly flow. +N1,North West NSW,,171.0,171.0,171.0,56.0,3.592798629037289,,,,,"For REZs in NNSW, distance to Armidale used, for REZs in CNSW distance to Bayswater used, and REZs in SNSW distance to Bannaby used. This is to allow for the NSW sub-regional modelling" +N2,New England,,577.0,577.0,577.0,,0.4539920833333333,0.46233018468968,Apply after 2400 MW,,, +N3,Central-West Orana,,900.0,900.0,900.0,900.0,0.57012414539296,0.4691846182812429,Apply after 1500 MW,0.5484140967896667,Apply after 2900 MW,Build limit does not initially include the capacity gained by the development of the Central-West Orana REZ Pilot project supported by NSW Government. +N4,Broken Hill,,250.0,250.0,250.0,,1.62029654467125,1.668901939714125,Apply after 1400 MW,,, +N5,South West NSW,Also see Secondary Transmission Limit SWNSW1,450.0,450.0,450.0,,1.9,0.06452211945691666,Apply after 350 MW,,, +N6,Wagga Wagga,,1100.0,1100.0,1100.0,,,,,,,Network upgrades modelled with SNSW-CNSW cutset options 3 and 4 +N7,Tumut,,0.0,0.0,0.0,,,,,,,Indicative transmission expansion cost is N/A as available wind and solar resource capacity is less than the existing transmission capacity. +N8,Cooma-Monaro,,350.0,350.0,350.0,135.0,1.3767416,1.9287016509198,Apply after 500 MW,,, +N9,Hunter-Central Coast,,400.0,400.0,400.0,,0.604,0.5877777777777777,Apply after 1000 MW,0.74125,After 900 MW, +N10,Hunter Coast,,5650.0,5650.0,5650.0,,,,,,,Expansion cost based on CNSW to SNW Option 1. +N11,Illawarra Coast,,1000.0,1000.0,1000.0,,0.5114530112100499,,,,, +N12,Illawarra,,1000.0,1000.0,1000.0,1000.0,0.5114530112100499,,,,, +N13,South Cobar,,106.0,106.0,119.0,,1.373357523917708,,,,, +V1,North West VIC,,440.0,440.0,650.0,370.0,3.75,2.39622641509434,Apply after 200 MW,,, +V2,Central Highlands VIC,,600.0,600.0,800.0,,0.9,,,,, +V3,Wimmera Grampians,See Group Constraint WV1,,,,,,,,,, +V4,Wimmera Southern Mallee,See Group Constraint WV1,,,,,,,,,, +V5,South West VIC,See Group Constraint Limit SWV1,,,,3180.0,,,,,, +V6,Gippsland Onshore,Modelled as part of SEV-MEL subregional limit,,,,,,,,,, +V7,Central North VIC,,650.0,650.0,1300.0,500.0,1.58,3.96,Apply after 500 MW,,, +V8,Gippsland Offshore,,0.0,0.0,0.0,,0.75,0.395,Apply after 2000 MW,,, +V9,Southern Ocean,See Group Constraint SWV1,,,,,,,,,, +S1,South East SA,Modelled as part of SESA-CSA sub-regional limit,,,,,,,,,, +S2,Riverland,,130.0,130.0,130.0,,0.2174971132525572,,,,, +S3,Mid-North SA,See Group Constraint MN1,,,,448.0,,,,,, +S4,Yorke Peninsula,,100.0,100.0,100.0,,0.9382884620485665,,,,, +S5,Northern SA,See Group Constraint NSA1,,,,,,,,,, +S6,Roxby Downs,,500.0,500.0,500.0,,1.437085391281474,,,,, +S7,Eastern Eyre Peninsula,,300.0,300.0,300.0,151.0,0.5966666666666667,,,,,The REZ transmission limit capacity assumes the completed Eyre Peninsula Reinforcement Project. +S8,Western Eyre Peninsula,,0.0,0.0,0.0,,1.551788509424105,1.36752480540128,Apply after 950 MW,,, +T1,North East Tasmania,,400.0,400.0,400.0,450.0,1.029837411172013,0.7898218092332874,Apply after 800 MW,,, +T2,North West Tasmania,,277.0,277.0,112.0,,0.306762875,1.031308486556562,Apply after 800 MW,,, +T3,Central Highlands,,702.0,702.0,843.0,550.0,0.4036036036036036,0.759253301577174,Apply after 555 MW,,, +T4,North Tasmania Coast,Included in Group Constraint NET1,,,,,0.280540300228375,0.4941038451760222,Apply after 1360 MW,,, +DN1,Dubbo,see Group Constraint CNSW1,0.0,0.0,0.0,,0.8671428571428571,0.25,After 700 MW,0.79,After 500 MW, +DN2,Yass,,0.0,0.0,0.0,,0.7306666666666667,,,,, +DN3,Marulan,,0.0,0.0,0.0,,0.77,,,,, diff --git a/tests/test_workbook_table_cache/7.5/renewable_energy_zones.csv b/tests/test_workbook_table_cache/7.5/renewable_energy_zones.csv new file mode 100644 index 00000000..dd143ddb --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/renewable_energy_zones.csv @@ -0,0 +1,48 @@ +ID,Name,NEM region,ISP sub-region +Q1,Far North QLD,QLD,NQ +Q2,North Qld Clean Energy Hub,QLD,NQ +Q3,Northern Qld,QLD,NQ +Q4,Isaac,QLD,CQ +Q5,Barcaldine,QLD,CQ +Q6,Fitzroy,QLD,CQ +Q7,Wide Bay,QLD,SQ +Q8,Darling Downs,QLD,SQ +Q9,Banana,QLD,CQ +Q10,Collinsville,QLD,NQ +N1,North West NSW,NSW,NNSW +N2,New England,NSW,NNSW +N3,Central-West Orana,NSW,CNSW +N4,Broken Hill,NSW,SNSW +N5,South West NSW,NSW,SNSW +N6,Wagga Wagga,NSW,SNSW +N7,Tumut,NSW,SNSW +N8,Cooma-Monaro,NSW,SNSW +N9,Hunter-Central Coast,NSW,CNSW +N10,Hunter Coast,NSW,SNW +N11,Illawarra Coast,NSW,SNW +N12,Illawarra,NSW,SNW +N13,South Cobar,NSW,SNSW +V1,North West VIC,VIC,WNV +V2,Central Highlands VIC,VIC,WNV +V3,Wimmera Grampians,VIC,WNV +V4,Wimmera Southern Mallee,VIC,WNV +V5,South West VIC,VIC,WNV +V6,Gippsland Onshore,VIC,SEV +V7,Central North VIC,VIC,WNV +V8,Gippsland Offshore,VIC,SEV +V9,Southern Ocean,VIC,WNV +S1,South East SA,SA,SESA +S2,Riverland,SA,CSA +S3,Mid-North SA,SA,CSA +S4,Yorke Peninsula,SA,CSA +S5,Northern SA,SA,NSA +S6,Roxby Downs,SA,NSA +S7,Eastern Eyre Peninsula,SA,NSA +S8,Western Eyre Peninsula,SA,NSA +T1,North East Tasmania,TAS,TAS +T2,North West Tasmania,TAS,TAS +T3,Central Highlands,TAS,TAS +T4,North Tasmania Coast,TAS,TAS +DN1,Dubbo,NSW,CNSW +DN2,Yass,NSW,SNSW +DN3,Marulan,NSW,CNSW diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_NSW.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_NSW.csv new file mode 100644 index 00000000..edf03c3d --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_NSW.csv @@ -0,0 +1,33 @@ +REZ / Constraint ID,REZ name,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +DN1,Dubbo,DN1 Option 1,,601000000.0,608433175.9869231,621466702.2311753,632270103.1431931,642912219.9272325,654590983.281091,668383566.5028553,679989681.1503072,690573679.5803894,702453253.5119927,714719149.0236409,726296400.1527994,736768019.7039995,747334709.9376106,758126279.6533042,769116445.3960114,780322973.653414,791776913.8884729,803485772.1795162,815446973.9808093,827667260.4767921,840152830.9494995,852909897.2438658,865944501.4359022,879263973.6384465,892874447.6027285,906783591.7910525,920998595.917356,935527013.8499198,950377322.1511264,965557251.2489374 +DN1,Dubbo,DN1 Option 2a,,125000000.0,126546001.6611737,129256801.6287802,131503765.2128106,133717183.8450983,136146211.1649524,139014884.8799616,141428802.2359208,143630133.0242074,146100926.2712131,148652069.2644844,151059983.3928452,153237940.8702162,155435671.7840288,157680174.6367105,159965982.8194699,162296791.5252525,164679058.6290501,167114345.2952405,169602116.052581,172143772.9777022,174740605.4387478,177393905.4167774,180104929.5831743,182875202.5038366,185705999.9173728,188598916.7618662,191555448.4021123,194577165.942163,197665832.394161,200823055.5842216 +DN1,Dubbo,DN1 Option 2b,,280000000.0,283463043.721029,289535235.6484677,294568434.0766957,299526491.8130202,304967513.0094933,311393342.1311139,316800517.0084625,321731497.9742247,327266074.8475174,332980635.152445,338374362.7999731,343252987.5492843,348175904.7962245,353203591.1862316,358323801.5156126,363544813.0165656,368881091.3290722,374336133.4613386,379908739.9577813,385602051.4700528,391418956.1827951,397362348.1335815,403435042.2663105,409640453.6085941,415981439.8149151,422461573.5465802,429084204.4207316,435852851.7104451,442771464.5629207,449843644.5086564 +DN1,Dubbo,DN1 Option 3,,943000000.0,954663036.5318943,975113311.487518,992064404.765443,1008762434.927421,1027087017.028401,1048728291.53443,1066938884.067787,1083545723.534621,1102185387.790032,1121431210.53127,1139596514.715624,1156027025.924911,1172606707.938713,1189539237.459344,1206783374.390081,1224366995.266505,1242338818.297554,1260710620.907294,1279478363.500671,1298652623.343785,1318243127.429914,1338259622.464169,1358711588.775467,1379610527.688943,1400966063.376661,1422790228.051518,1445094302.745536,1467890139.867678,1491191039.581551,1515009131.327368 +DN2,Yass,DN2 Option 1,,271000000.0,274351731.6014246,280228745.9311956,285100162.9813733,289898854.5761731,295164985.8056167,301384270.4197567,306617643.2474763,311390128.3964817,316746808.1559901,322277686.1654022,327498043.9956883,332219855.8066287,336984536.4277744,341850618.6123884,346806250.7526107,351859444.0267475,357024199.1077806,362303900.6000814,367697387.6019956,373207699.8156583,378837632.5912052,384589986.9435735,390467487.336322,396473439.0283178,402610607.8208643,408882451.5397258,415292212.1357796,421843295.7626094,428539524.6305411,435384384.5065925 +DN3,Marulan,DN3 Option 1,,306000000.0,309784612.0665532,316420650.387254,321921217.2409603,327339666.0528006,333285924.9318035,340308438.186146,346217707.8735341,351606565.6432598,357655067.5119298,363900265.5594578,369794839.3456849,375126479.2502893,380506524.5273025,386001067.5106674,391596725.9420623,397302545.6538181,403134335.5239147,409095917.2827486,415185980.0967182,421407956.2494149,427765002.1140547,434260280.4602712,440896867.6196108,447678495.7293921,454608287.7977287,461690148.2330484,468927737.688371,476324902.2264151,483885957.7009063,491614840.0701745 +N1,North West NSW,N1 Option 1,,5875680663.271611,5978494735.174475,6102003377.639079,6193923773.147688,6282805853.638752,6381710899.399384,6504882304.483905,6608447667.699392,6699615507.722722,6803336405.297952,6910781779.211209,7010930918.351762,7102471659.626374,7194985671.677017,7289717280.922497,7386399011.694947,7485116711.966603,7586211624.327625,7689764872.026043,7795742892.754064,7904215122.281147,8015245402.017544,8128897175.594891,8245233108.135345,8364327808.862752,8486245809.143162,8611065979.318256,8738863305.249275,8869716547.379879,9003713812.639076,9140936372.599398 +N11,Illawarra Coast,N11 Option 1,,1012045518.382449,1025249266.896814,1044932702.607426,1059946809.413164,1074711714.760752,1090955217.425144,1111297219.697345,1128596955.190671,1143767850.301328,1160959351.131012,1178805071.346172,1195483130.506087,1210560470.304844,1225701165.142003,1241174191.968348,1256951475.619927,1273045694.245539,1289510866.948158,1306360932.361368,1323588680.965737,1341204231.912786,1359216711.224511,1377635092.795424,1396468139.592521,1415726546.946831,1435419213.047185,1455557379.389657,1476151548.088312,1497212740.839625,1518753472.538839,1540785023.558838 +N12,Illawarra,N12 Option 1,,1012045518.382449,1025249266.896814,1044932702.607426,1059946809.413164,1074711714.760752,1090955217.425144,1111297219.697345,1128596955.190671,1143767850.301328,1160959351.131012,1178805071.346172,1195483130.506087,1210560470.304844,1225701165.142003,1241174191.968348,1256951475.619927,1273045694.245539,1289510866.948158,1306360932.361368,1323588680.965737,1341204231.912786,1359216711.224511,1377635092.795424,1396468139.592521,1415726546.946831,1435419213.047185,1455557379.389657,1476151548.088312,1497212740.839625,1518753472.538839,1540785023.558838 +N13,South Cobar,N13 Option 1,,2087785564.724367,2130902262.5243,2178279166.636194,2215255309.704358,2250881403.870379,2290343318.60086,2338391586.928754,2378993871.829546,2415389681.865125,2456582966.58626,2499207111.523502,2539480773.069212,2577052409.081264,2615344330.260875,2654642786.083467,2694835659.577833,2735969435.345182,2778177494.200777,2821495452.959201,2865921277.901326,2911489864.993646,2958234492.799032,3006188737.935304,3055386347.996087,3105865842.63293,3157662487.11248,3210817339.471623,3265370421.047272,3321363725.436514,3378843187.945131,3437852669.537124 +N13,South Cobar,N13 Option 2,,3244030455.865267,3303856000.68434,3374659602.195653,3428616236.510033,3480938875.775013,3538933388.419667,3610001808.386568,3669847638.385563,3723115030.436053,3783528247.824137,3846040894.357844,3904546671.15721,3958251771.340964,4012675983.596536,4068431132.205915,4125359638.775826,4183523188.900697,4243115016.59854,4304182185.586709,4366711582.598717,4430746638.053823,4496327853.01998,4563495748.387276,4632290623.487047,4702759651.647439,4774944565.731688,4848895411.485518,4924660195.697654,5002289369.393682,5081838863.370903,5163360953.626507 +N13,South Cobar,N13 Option 3,,3299132527.060919,3359184357.538098,3430828944.553365,3485441938.247061,3538439998.181203,3597145590.517861,3669184872.372439,3729899491.738619,3783886475.057808,3845108735.59124,3908472315.796426,3967773684.614648,4022177123.85071,4077283809.66878,4133733231.854514,4191368885.737829,4250251831.418684,4310578000.119254,4372395393.786708,4435690189.641937,4500506158.928125,4566884086.348578,4634864753.612014,4704488693.682032,4775803411.649919,4848850863.242558,4923681425.235086,5000343393.396049,5078887516.722496,5159370088.392869,5241843677.010888 +N13,South Cobar,N13 Option 4,,3247137779.175606,3306967149.656939,3377778268.667704,3431724887.758972,3484035333.315958,3542020090.072473,3613096718.731936,3672950241.68663,3726215370.639826,3786629238.645988,3849144332.396181,3907651864.75104,3961359329.896153,4015785021.221815,4071541823.904501,4128472371.631162,4186638189.352581,4246232648.05917,4307302863.069223,4369835663.572897,4433874481.719683,4499459816.55789,4566632183.868876,4635431878.84739,4705906071.24663,4778096488.561083,4852053174.003656,4927824130.242543,5005459803.448686,5085016122.67178,5166545358.837002 +N2,New England,N2 Option 1,,1074604918.9248,1092177825.8914,1115588473.647,1133236151.3277,1150539250.5446,1169648499.3068,1192905187.2305,1212401665.952,1229752943.9968,1249412842.5572,1269726343.0824,1288520165.2732,1305373313.3606,1322323102.1912,1339637886.4006,1357265491.3517,1375225722.9795,1393577556.1285,1412333178.8314,1431484868.301,1451043206.7109,1471017658.1413,1491417572.6228,1512251975.3483,1533532081.874,1555267044.6803,1577468585.4185,1600147565.2764,1623315440.129,1646985242.1797,1671168610.5975 +N2,New England,N2 Option 2,,228184592.8290697,231682821.9711112,236581119.2035155,240368177.9952492,244087479.7170849,248174598.790448,253150352.2143554,257352538.0347702,261099098.6634071,265331077.6538892,269708083.812943,273789730.0694519,277474868.9738525,281185016.4165081,284976294.3870773,288838793.4703241,292776816.4499665,296802863.1692722,300919854.433152,305126362.3288566,309424824.827403,313817456.594056,318306456.6237667,322893961.3115035,327582582.5124714,332374496.3576067,337272436.6547371,342278963.8892079,347396770.1811402,352628892.175739,357978082.2374341 +N2,New England,N2 Option 3,,905180840.917516,918970039.8274437,938156729.6107839,952985208.0142661,967586927.8945957,983567469.0132676,1003122645.813704,1019736894.609906,1034507423.419099,1051180498.342132,1068438723.50311,1084553452.474998,1099136390.634704,1113816655.004806,1128820187.108791,1144111642.025526,1159706717.120993,1175655124.694961,1191969178.221763,1208643330.146213,1225687512.174133,1243110781.591851,1260922131.818113,1279130331.359228,1297746028.206023,1316778174.090641,1336237934.00345,1356135805.605937,1376482818.448294,1397291384.198556,1418572805.105805 +N3,Central-West Orana,N3 Option 1,,853232977.1935666,857029005.2617911,869759325.4571096,879368918.3814787,889075682.5756384,899608184.9892689,913783127.3771409,926142308.8510754,936509505.7824875,948273360.507836,960604918.147267,972130932.4930371,982292961.0124309,992297049.1102397,1002476918.873121,1012841725.10432,1023389833.206131,1034159730.595644,1045163304.233688,1056390445.671322,1067845659.626849,1079532533.358257,1091454303.883573,1103613904.393303,1116015585.585727,1128662043.50949,1141557603.373265,1154705885.367048,1168110643.502068,1181776634.482328,1195707497.999907 +N3,Central-West Orana,N3 Option 2,,1137178264.300679,1154356860.014442,1177054736.992774,1194284927.164944,1211135991.132982,1229691839.068317,1252938295.346557,1272737054.691715,1290119775.972444,1309830502.802658,1330288375.047246,1349454253.703279,1366963177.296974,1384618084.713128,1402686053.04809,1421131368.369628,1439968826.81232,1459262240.360116,1479028623.182116,1499261427.487429,1519973918.513975,1541178299.725371,1562886668.928237,1585110995.275547,1607865490.331194,1631162454.181034,1655016924.285057,1679443189.953604,1704456243.189328,1730072873.3713,1756308558.211863 +N3,Central-West Orana,N3 Option 3,,647737888.6462379,658299974.8238063,672225521.8161314,683088911.5931919,693747627.7742314,705430236.8203552,719709380.655245,731845435.3005629,742653606.5715233,754854537.9258792,767488086.6024531,779331195.6607819,790131204.033607,801034832.2511661,812191742.1656269,823575625.5792785,835198256.9680854,847096948.5068479,859281308.4210835,871748277.0463353,884506065.3898154,897562295.9706194,910924580.8812941,924600431.6649905,938598744.4699255,952927262.0762126,967595371.053149,982612026.348998,997986632.36575,1013729649.745354,1029850789.162217 +N4,Broken Hill,N4 Option 1,,1281732102.524768,1299903160.111969,1327086058.732803,1346834783.914228,1366276788.038231,1387859875.115958,1414252847.144417,1436122157.28529,1455430720.166073,1477385316.24454,1500043289.959424,1520664240.797807,1538640565.644247,1556545629.573919,1574773520.261735,1593260542.194918,1612026457.425818,1631134822.945097,1650595111.371186,1670392900.058145,1690535048.858666,1711026867.140544,1731873324.401608,1753078687.608543,1774649632.239227,1796590078.023596,1818906678.932323,1841604827.780266,1864690285.175939,1888170339.151281,1912050382.829622 +N4,Broken Hill,N4 Option 2,,5569035215.262003,5619045641.004427,5723309935.151076,5802731308.77773,5860206691.837794,5953691683.24439,6070354179.542229,6137367277.254239,6195344263.029345,6269787315.764809,6346618375.422935,6417706622.987794,6478807481.724911,6541217101.53692,6605747769.965837,6671466467.888712,6738548257.794146,6807402032.038903,6877972493.513268,6950202791.990556,7024123800.88648,7099760406.183677,7177136126.143474,7256273087.135104,7337202272.071103,7419944963.034612,7504533747.854458,7590996407.188758,7679362686.657207,7769669205.160398,7861945237.394692 +N4,Broken Hill,N4 Option 3,,2632268903.156145,2676536511.68327,2731269537.59821,2772779628.362134,2813142366.211136,2857799847.713094,2913254561.227107,2960185780.750041,3001616346.322939,3048633643.315292,3097368843.594088,3143001775.284828,3184822689.522338,3227106599.985307,3270409464.85836,3314626567.459066,3359798594.929058,3406078389.370925,3453504914.952198,3502065210.071959,3551792340.889668,3602716959.459132,3654869593.991683,3708280558.972183,3762985530.673893,3819015806.663118,3876409210.087102,3935201889.991429,3995431803.12933,4057141216.631751,4120369412.347782 +N5,South West NSW,N5 Option 1,,620188945.3185148,624000000.0,634208461.358683,642193195.1274767,650244927.6744448,658957479.6258851,670193781.2536772,679947851.1915244,688348930.7681642,697832341.111361,707728892.2357196,717013916.7919431,725265423.3518308,733449829.2563708,741786412.2621859,750276118.115719,758922416.0881884,767754061.3662554,776779743.389538,785993331.5052679,795399082.8251227,805000614.979096,814801355.1199609,824804530.0762175,835014409.1919638,845434117.7937176,856068065.7631232,866920155.9425563,877994462.912726,889295852.082686,900828387.3692545 +N5,South West NSW,N5 Option 2,,116067927.9178305,116398628.2085778,118052263.5760844,119309793.5772086,120598177.9891879,121980788.1882002,123842632.8131922,125483368.7363645,126862340.7943287,128422495.2253503,130058536.6736777,131590997.4516602,132937713.7815605,134260646.3278016,135604925.9195565,136972818.6865286,138364220.4943535,139783979.423683,141233701.4554991,142711988.6879892,144219360.4305003,145756209.2501116,147322877.0160598,148919664.4955338,150547040.8733434,152205264.6609323,153894810.1352696,155616051.0069221,157369373.5330888,159155296.1058078,160974181.6517793 +N8,Cooma-Monaro,N8 Option 1,,281695855.7624419,289592105.174337,296735676.5539452,302903087.3792127,308770739.7306263,315234968.8802158,322901646.3739612,329485951.8335135,335551963.667662,342364536.6749671,349418587.1803913,356315578.506607,363072599.213647,370075470.6562762,377299340.1644148,384726912.1285245,392369073.3926845,400248596.2929772,408373528.9025956,416747577.5574629,425379621.054423,434278479.647984,443453174.2393703,452912970.9638427,462667939.9606863,472727908.0851867,483103736.8440055,493806308.9331828,504847022.5387468,516238064.4950349,527991506.449776 +N8,Cooma-Monaro,N8 Option 2,,671679252.55855,689160267.0130199,705467748.04778,719372746.86627,732711148.69758,747303709.1748899,764784448.79019,779913766.09331,793745377.0491,809273230.80191,825368294.66033,841050376.36343,856328224.94115,872113788.3268499,888385561.45015,905110064.6436499,922309488.90461,940035747.9816699,958307481.24535,977131799.17906,996528210.6796899,1016516022.30792,1037114938.6779,1058345174.9794,1080228772.9269,1102787145.3328,1126044052.191,1150023249.4222,1174749617.1503,1200249814.4693,1226550166.4708 +N9,Hunter-Central Coast,N9 Option 1,,596620983.7443216,604000000.0,616938561.14726,627663246.1387947,638227822.1534628,649821491.5063683,663513578.9774904,675035128.9582094,685542010.0818434,697335026.8631022,709511550.4016457,721004447.1699212,731399768.2315406,741889467.2699741,752602407.2698452,763512496.283035,774637371.3467458,786007855.6908215,797631400.702677,809505450.5952756,821636697.4353267,834031295.3355526,846695410.8800392,859635042.120922,872857465.7622483,886368770.863407,900176570.0126241,914288000.5380232,928710561.2687632,943452667.0051564,958521991.8495909 +N9,Hunter-Central Coast,N9 Option 2a,,593000000.0,600334231.880608,613194266.9269334,623853862.1695733,634354320.1611463,645877625.7665341,659486613.8705378,670938237.8072083,681381351.0668402,693102794.230635,705205416.5907139,716628561.2156574,726960791.4883057,737386826.9434327,748034748.4765546,758878622.4955653,769935978.9957979,781237454.1362138,792790454.0806208,804592438.5534441,816650059.006219,828969432.2014196,841556687.2971922,854417785.942579,867559960.678201,880989263.6080167,894713261.118293,908739047.219621,923074075.2296214,937726708.8779,952704575.6915473 +N9,Hunter-Central Coast,N9 Option 2b,,522000000.0,528456102.9370614,539776403.6017863,549159723.528697,558402959.7371304,568546577.8248411,580526159.2587196,590606678.1372052,599799435.5090902,610117468.108586,620771041.2484868,630826490.6485213,639921641.0740228,649099365.3701043,658472409.2829032,668017944.2541064,677751401.4094545,687699748.8349133,697869505.9529243,708258436.6355782,718872395.9548843,729716768.3122109,740796949.0204625,752118185.9393361,763686845.6560217,775508255.654949,787589076.3975531,799935552.5272212,812554244.9744726,825452516.0780165,838637080.1197094 +N9,Hunter-Central Coast,N9 Option 3,,218000000.0,220696226.8970869,225423862.0405927,229342566.5311416,233202768.6258514,237438992.2716769,242441959.230653,246651831.0994459,250490951.9942178,254800015.4169957,259249208.7972607,263448611.0371219,267246968.877657,271079811.5913463,274994224.5664232,278980674.0371556,283045604.4200404,287200278.2490634,291447418.1948994,295786090.3957012,300218740.0731126,304747615.8851762,309374971.0468599,314102997.193056,318934353.1666911,323871263.8558983,328916510.8326946,334072702.0132839,339342577.4031323,344729211.6954169,350235408.9388825 +N9,Hunter-Central Coast,N9 Option 4,,459000000.0,464676918.0998298,474630975.580881,482881825.8614404,491009499.0792009,499928887.3977051,510462657.279219,519326561.8103012,527409848.4648897,536482601.2678946,545850398.3391867,554692259.0185274,562689718.8754339,570759786.7909538,579001601.266001,587395088.9130936,595953818.4807272,604701503.285872,613643875.924123,622778970.1450773,632111934.3741224,641647503.171082,651390420.6904067,661345301.4294162,671517743.5940881,681912431.696593,692535222.3495725,703391606.5325564,714487353.3396226,725828936.5513593,737422260.1052617 +SWNSW1,Secondary Transmission Limit - South West NSW,SWNSW1 Option 1,,449425314.8180761,459573631.143883,469984929.3920213,478154428.3445243,485980509.2807828,494657702.6502984,505231748.9606017,514186234.2509652,522223420.6264371,531320227.6402497,540736020.3697209,549676303.3297503,558108771.2707646,566734131.4641249,575597867.3779978,584674401.4922789,593974100.372729,603527235.1107956,613342302.9052368,623419744.4698236,633768108.0424787,644395630.406522,655310649.4289709,666521594.5263404,678037964.5962273,689868609.724245,702023685.1772574,714513169.1106362,727347524.610897,740538126.308335,754095946.483417 diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_QLD.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_QLD.csv new file mode 100644 index 00000000..60cea889 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_QLD.csv @@ -0,0 +1,19 @@ +REZ / Constraint ID,REZ name,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +CQ1,,CQ1 Option 1,,206851966.2349,209358911.16399,213296323.20108,216065225.60151,218722606.84084,221749951.43918,225640333.90175,228826115.28794,231552400.00043,234686404.19201,237937411.86823,240900883.59907,243494592.06685,246070118.99179,248694717.18275,251359166.54421,254064677.83487,256821692.6011,259631891.44522,262492664.97348,265404953.99325,268369454.81807,271386792.98963,274457483.15675,277582406.55625,280762013.37856,283997166.22561,287288538.80468,290636840.15806,294043012.7224,297507706.37676 +CQ1,,CQ1 Option 2,,526339827.69993,534887581.58206,545387788.44735,552442630.1124101,559061239.38923,566689211.04695,576633746.0620999,584727739.76175,591596225.19505,599540029.72587,607773535.2097,615251902.9156,621905727.24668,628555168.5090699,635346237.68487,642248095.55858,649262542.6882601,656418034.5509399,663719030.6896399,671159086.99647,678741071.71704,686467236.21082,694339672.7788199,702360207.0292801,710531638.47256,718855684.2679499,727335133.94647,735972330.2091,744769726.54786,753730395.58117,762856690.60033 +NQ1,Group Constraint NQ1,NQ1 Option 1,,1767754969.4494,1802908493.9502,1840917376.4562,1868983579.7988,1895401481.2974,1925379136.5883,1962989288.4548,1994056850.6017,2021264172.8825,2052416953.5015,2084674094.7267,2114820433.4492,2142740161.4649,2171100890.7714,2200181841.2653,2229874948.914,2260203423.8294,2291276155.8854,2323115841.9707,2355712087.2789,2389086117.2552,2423257457.8021,2458245483.0954,2494069331.0653,2530751711.8384,2568312293.8792,2606775021.4939,2646162654.7058,2686499056.3571,2727810848.883,2770122551.9292 +NQ1,Group Constraint NQ1,NQ1 Option 2,,4755015634.2754,4828262580.5482,4921889664.8982,4984456067.7544,5043703226.0404,5111933929.7747,5200539850.1423,5272490167.531,5333548775.6138,5404234128.156899,5477489623.0582,5543617807.142,5601703658.4309,5659539460.045,5718548387.046,5778472113.0167,5839328578.3665,5901370059.7923,5964632568.4553,6029054913.6902,6094659795.440599,6161464120.5414,6229483143.1266,6298729733.4899,6369225158.8268,6440981072.5625,6514018553.507,6588354446.3789,6664006558.1903,6740998158.1145,6819345809.8193 +Q1,Far North QLD,Q1 Option 1,,4097011906.834,4176425364.2704,4265576252.3222,4332019332.4431,4395238590.8502,4466296912.0611,4554518254.1226,4627804247.1089,4692387507.1647,4766060607.9143,4842273620.75,4913420763.1784,4978960070.482,5045434720.9578,5113533552.8055,5183015160.699,5253941411.4548,5326557612.5246,5400915193.149899,5476989556.2942,5554828184.2682,5634474551.3538,5715971788.6658,5799362302.2894,5884696831.0587,5972018807.5053,6061381598.6956,6152835666.4861,6246433958.4036,6342235732.38,6440295230.2014 +Q2,North Qld Clean Energy Hub,Q2 Option 1,,1077270557.457,1096418640.108,1118858177.9222,1134828468.056,1149922351.1667,1167131910.3639,1188935170.5512,1206813540.0237,1222313318.5327,1240123598.3574,1258563703.8602,1275557216.4562,1290949791.3961,1306463215.1251,1322336736.2099,1338506890.1213,1354984295.6917,1371830817.701,1389057520.997,1406654702.199,1424631698.0997,1442996679.5383,1461757604.5293,1480922093.0116,1500499833.0914,1520498483.403,1540928105.7687,1561797924.9682,1583117624.0162,1604898367.5539,1627149919.0417 +Q2,North Qld Clean Energy Hub,Q2 Option 2,,1120604774.2286,1140055826.5871,1163561703.7221,1180483749.9875,1196609165.9067,1214853380.0202,1237775196.934,1256666028.4926,1273133257.1728,1291994388.9936,1311511329.4353,1329510069.0959,1345772931.0759,1362152191.874,1378901668.875,1395957838.4883,1413333512.9645,1431091853.3794,1449244374.6694,1467781116.8422,1486711688.5766,1506044484.7378,1525787687.3663,1545949107.8414,1566538716.3384,1587564344.6026,1609036335.5071,1630964136.8393,1653357679.0608,1676228421.1015,1699586352.4844 +Q5,Barcaldine,Q5 Option 1,,1627018049.1917,1653605919.2165,1686483803.9021,1708362038.4635,1728900454.9829,1752729675.9718,1783537983.0119,1808339533.8656,1829439219.0156,1853907426.3094,1879235113.4254,1902062801.7421,1922136606.6669,1942157396.8571,1962591361.254,1983336644.4001,2004401207.3648,2025872566.9233,2047761919.2841,2070048324.126,2092739471.6506,2115841063.3196,2139358265.9872,2163295382.9892,2187659663.6033,2212454992.644,2237688508.3943,2263365896.0231,2289493163.5004,2316078178.212,2343126508.2223 +Q9,Banana,Q9 Option 1,,1547032629.9564,1570239876.3602,1601651480.3268,1623635975.5115,1644876065.9021,1668808798.1043,1699024046.2061,1723924479.0813,1745481918.5937,1770188782.8219,1795750422.3263,1819004140.8872,1839482349.4008,1859910823.1241,1880739817.6583,1901891871.9407,1923381001.8525,1945287173.4744,1967623078.8976,1990370725.7794,2013538678.0228,2037133654.3712,2061161918.3879,2085628972.9661,2110543140.6717,2135909575.121,2161736636.557,2188031273.8589,2214800840.171,2242054541.9436,2269799383.0441 +Q9,Banana,Q9 Option 2,,854433594.90153,867304066.7021999,885122426.43191,897802827.54791,910066380.32898,923886001.41325,941082261.40879,955194865.73246,967524553.43265,981629921.3091999,996203367.8881899,1009473076.32163,1021136780.14,1032781737.1572,1044652751.6829,1056703158.083,1068943457.0671,1081417755.2814,1094132518.9309,1107078079.2571,1120259229.3981,1133679746.2286,1147343174.4509,1161252618.8617,1175412775.8606,1189826553.7124,1204498661.0363,1219433009.1226,1234633744.4889,1250106043.1541,1265853846.9575 +Q9,Banana,Q9 Option 3,,530297034.97987,537581256.05169,548106220.53939,555623481.09366,562892116.16751,571062078.81487,581407426.28204,589972163.98255,597383694.85514,605860644.50533,614641574.11845,622681854.4278699,629791139.4006,636883116.43006,644115053.2957,651462869.7482699,658931148.3414301,666547125.44345,674315618.83529,682230643.05138,690295290.97431,698512043.69203,706883230.87128,715410926.28001,724098176.5699899,732946941.15408,741960286.8463899,751140807.15519,760491232.34644,770014932.3821601,779714537.32759 +SQ1,Group Constraint - Wide Bay,SQ1 Option 1,,1015420584.45364,1035738946.5467,1058078434.3493,1075209841.0581,1091505241.7963,1109746770.6527,1132276550.2129,1151099466.253,1167775232.5902,1186745971.1681,1206379979.451,1224871474.4816,1242092785.8791,1259619417.2205,1277592135.2429,1295952270.5918,1314717014.2078,1333949501.7092,1353664303.9507,1373857252.0121,1394542191.7185,1415732053.4433,1437439749.2305,1459678119.8431,1482462137.346,1505805051.8588,1529722696.9282,1554230251.334,1579343628.0503,1605080416.173,1631457034.7713 +SQ1,Group Constraint - Wide Bay,SQ1 Option 2,,901393030.95413,920197595.29346,940244319.75172,955584460.3880199,970122912.78202,986436608.1961899,1006569889.6819,1023357748.4465,1038244305.6772,1055192727.9492,1072728866.1394,1089255343.5868,1104699003.5828,1120440698.6045,1136590033.3724,1153092152.0655,1169962840.3704,1187259041.6231,1204993795.1551,1223163805.7476,1241781805.2055,1260859726.9865,1280409503.53,1300443029.5983,1320974107.2296,1342015035.4513,1363580429.9233,1385684343.1856,1408341504.9477,1431568163.2044,1455379537.4675 +SWQLD1,Transmission Limit Constraint - Darling Downs,SWQLD1 Option 1,,26461391.615065,26507471.584103,26663014.230974,26687601.084474,26700703.591306,26734555.52882,26906537.091558,27061448.606272,27140849.48974,27249672.104925,27374092.011027,27488624.152848,27596092.653059,27697461.179865,27801428.84614,27909418.13552,28020510.439575,28135824.808907,28255780.579456,28379952.417495,28508387.826719,28641103.64981,28778095.294235,28919361.874073,29064916.830884,29214748.932819,29368878.943015,29527311.280894,29690046.822194,29857114.33389,30028512.34963 +SWQLD1,Transmission Limit Constraint - Darling Downs,SWQLD1 Option 2,,6752955.360533901,6728976.3160477,6841593.899087099,6939781.7851908,6987211.4925494,7115257.6005919,7262296.182825799,7304977.3363133,7346749.4900496,7414194.7922318,7482854.549543,7545919.5120792,7593989.3859524,7645266.487322601,7699366.931346,7754223.922372701,7810365.898022999,7868354.7063402,7927938.817041299,7989053.060962901,8051706.125222299,8115899.4639519,8181632.220761399,8248903.2134045,8317717.683071301,8388071.344755399,8459971.3835816,8533417.7903852,8608412.694431499,8684965.1759016,8763074.6726939 +SWQLD1,Transmission Limit Constraint - Darling Downs,SWQLD1 Option 3,,487944190.6789,489268819.1471199,494608647.69126,497935463.42379,501408395.22698,505079190.35742,511105894.0225199,516656681.4355699,520860603.05049,525711874.5737,530894455.9080499,535695228.40681,539919581.29476,543994555.37702,548136571.0727199,552367681.1958101,556676954.1939601,561085636.08203,565601903.91085,570218518.38206,574937232.49911,579759244.39378,584685445.89321,589716620.47742,594854120.34698,600098561.87888,605451334.84896,610913466.11094,616485988.11919,622170464.2696999,627967843.82173 +SWQLD1,Transmission Limit Constraint - Darling Downs,SWQLD1 Option 4,,263815090.24782,264648176.54866,268196694.82608,270798218.95002,273425519.0982,276279481.31959,280320227.38578,283876212.34795,286775728.01618,290081936.61527,293567227.83105,296829503.30226,299708265.40551,302527490.359,305396028.73025,308319336.26517,311295079.32565,314335092.18697,317443289.49982,320616274.11357,323855281.93893,327161264.27176,330535046.34238,333977364.58535,337489335.36296,341071613.23845,344725328.0156699,348451400.03416,352250773.35985,356124690.82789,360074056.17953 +SWQLD1,Transmission Limit Constraint - Darling Downs,SWQLD1 Option 5,,931517934.6652899,948538933.2148899,968545348.0639899,984283657.34002,999414302.6081699,1016181813.09119,1036807776.6293,1054217702.6443,1069696975.6462,1087234496.6878,1105398283.4307,1122591261.649,1138603028.1601,1154884165.5702,1171571899.9873,1188621965.9104,1206051060.4046,1223915601.3631,1242229848.0408,1260990450.2307,1280210338.3062,1299901630.0373,1320076431.9927,1340746806.9542,1361926750.437,1383628704.0305,1405867488.0729,1428657324.142,1452013113.0217,1475951312.4766,1500487310.038 diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_SA.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_SA.csv new file mode 100644 index 00000000..e891ecab --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_SA.csv @@ -0,0 +1,14 @@ +REZ / Constraint ID,REZ name,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +MN1,Group Constraint - facilitating power out of mid-north SA,MN1 Option 1,,614076712.3028148,620000000.0,632912491.2356435,643936899.649465,654511699.1659787,666143365.3551604,680231249.9495453,692161819.4256252,702873205.8625747,714969087.67978,727480247.8750566,739448322.7883943,750759457.7915233,762324562.652403,774181029.7526432,786298498.4181582,798690089.4422661,811393450.9452324,824418137.3821819,837762887.0108144,851436910.8447175,865448912.8421617,879807601.3834115,894521708.4326998,909601207.060587,925055088.6549562,940893940.9435391,957127935.9866284,973767735.2118565,990825039.9524547,1008310829.282628 +MN1,Group Constraint - facilitating power out of mid-north SA,MN1 Option 2,,792546850.9953803,800000000.0,814715292.5788563,826616666.8768483,837954595.8717889,850398900.7112935,866568261.7881752,880510766.7870907,892476845.2719618,906093700.6277808,920283086.6296486,933825723.1481744,946737070.9554297,959889315.8478122,973391489.7857788,987219993.6978635,1001376262.412176,1015911183.833395,1030839350.848,1046157067.276026,1061875803.184724,1078006354.72854,1094559404.673415,1111545708.525087,1128977505.110597,1146865910.06898,1165223938.118424,1184064160.406994,1203399711.459597,1223245029.412367,1243613682.376439 +MN1,Group Constraint - facilitating power out of mid-north SA,MN1 Option 3,,951351163.4554306,960000000.0,976910053.1396592,990275001.7767832,1003043558.608794,1017026147.386889,1035610168.056764,1051730525.698338,1065365948.359112,1080912516.798259,1097152097.154143,1112601260.966333,1127274349.440843,1142168407.766716,1157455327.460613,1173114016.646928,1189141237.631614,1205597365.622597,1222500145.574459,1239843861.521752,1257641388.962629,1275904766.480486,1294645835.607358,1313876494.702824,1333610367.617392,1353859732.790977,1374639060.583108,1395962289.978861,1417843973.99601,1440300179.331497,1463345919.52762 +MN1,Group Constraint - facilitating power out of mid-north SA,MN1 Option 4,,1892798604.6674,1909261242.8512,1942084402.0582,1967378740.8675,1991803520.7212,2018526519.156,2054284970.8816,2085278890.5908,2111328146.1051,2141039929.3758,2172100828.7858,2201400102.7997,2228714235.5858,2256237956.9145,2284440156.2587,2313288892.6023,2342774752.7801,2373011386.2002,2404031376.426,2435819487.6529,2468397122.5103,2501783882.2549,2535998849.8287,2571060967.6483,2606992522.2275,2643812889.7787,2681545593.0319,2720212964.3244,2759838318.653,2800447751.9918,2842065150.6039 +NSA1,Group Constraint - facilitating power out of north SA,NSA1 Option 1,,478024297.2743624,484000000.0,493826530.879846,501249800.5936878,508415480.5985969,516403241.4223906,526330257.6650731,534596547.5929708,541848149.5278987,550101647.6978279,558640376.9181623,566552814.4772524,573685026.6962887,580855831.0089167,588179047.8676683,595630739.0664679,603216922.1437546,610963435.0806013,618875236.5145708,626947988.3167719,635185536.5847815,643591211.6961435,652168246.5576168,660919687.6593125,669849499.7687335,678960696.0307226,688257355.8088524,697743149.7231113,707421934.7346928,717298196.6120589,727375772.0980053 +S2,Riverland,S2 Option 1,,152018773.8975,152565338.37793,154932330.19162,156797113.24726,158706782.9669,160739619.53376,163408151.15809,165761484.51388,167762959.27368,170015433.47669,172371859.10409,174579469.65668,176525078.54371,178441471.99642,180390066.0299,182372801.11663,184389683.16275,186447498.32312,188548437.87751,190690744.24012,192875263.41459,195102679.08754,197373615.68053,199688635.49882,202048547.88725,204453871.16052,206905422.70804,209403889.06767,211949983.45673,214544597.4987,217188419.25889 +S4,Yorke Peninsula,S4 Option 1,,640110849.53599,647734724.2673199,661341564.5403199,672203146.4224199,682661245.5644101,694245233.2947301,708358678.32688,720178570.62853,730711609.5224199,742652260.79911,754990278.80428,766581948.38614,777269847.59462,788115918.22197,799213543.77518,810528350.62128,822072230.67133,833881938.95468,845965280.23168,858318606.0352601,870949119.7177899,883863400.00642,897067963.1046801,910569201.69631,924374772.17535,938491166.81528,952926423.8726399,967688076.11985,982784035.8497399,998223172.25165,1014013527.34983 +S4,Yorke Peninsula,S4 Option 2,,196068224.42676,198553384.15114,202170461.41083,204614177.13985,206969539.66205,209638902.6265,213148738.23267,216052863.54134,218501461.10239,221324108.05303,224257231.28714,226915805.26126,229242714.34303,231548529.54396,233898189.28067,236284414.23561,238707430.57321,241177125.27366,243695238.30617,246259179.42103,248869800.93534,251527718.00413,254233469.91908,256987499.53886,259790580.66964,262643096.70137,265545809.01696,268499303.95355,271504199.11009,274561332.54748,277671266.3673199 +S6,Roxby Downs,S6 Option 1,,1350136028.8663,1368684928.5228,1396392506.9714,1416435842.3236,1435755945.3753,1457470230.5818,1484593436.1911,1506971161.1587,1526505948.3262,1548838064.6551,1571925034.5544,1593084515.2987,1611910479.1107,1630770875.7189,1650013424.0243,1669566996.7902,1689447439.7829,1709725379.2355,1730412414.6033,1751494293.7595,1772979647.8149,1794875548.863,1817188724.8119,1839925291.5714,1863093864.9778,1886700318.5855,1910753405.7013,1935260657.672,1960230028.4389,1985671135.8455,2011591700.6424 +S7,Eastern Eyre Peninsula,S7 Option 1,,178577962.0260116,179000000.0,181842170.9278326,184172479.2152838,186542442.8352273,189096182.1725501,192372870.646425,195215872.8866788,197665671.7660358,200418541.7113757,203293991.1511508,205996644.8053402,208361345.7012582,210688987.0510516,213054450.319384,215458902.6735774,217903194.8073001,220395132.4202985,222937075.0818608,225526976.4444655,228165757.3124671,230854150.531145,233592825.5990175,236382362.6527455,239223646.3356986,242117194.9986825,245063884.4399339,248064430.5949192,251119575.2841264,254230264.0262518,257397200.13944 +S8,Western Eyre Peninsula,S8 Option 1,,1457653807.6692,1477738603.1059,1508001651.228,1530376160.4042,1551817118.6162,1575876854.2127,1605881588.1372,1630723893.3935,1652464441.5753,1677300378.3834,1702979483.8843,1726695526.938,1748141162.2019,1769748455.6457,1791829032.5269,1814302579.5245,1837186952.529,1860562574.8378,1884443912.4207,1908817792.5489,1933696143.5886,1959089296.1933,1985007275.5265,2011459599.6383,2038458542.0986,2066013555.7863,2094137333.8109,2122841337.1389,2152137621.424,2182040186.2546,2212561051.6439 +S8,Western Eyre Peninsula,S8 Option 2,,676328487.25196,685150588.0578699,699130852.38243,709727000.3169899,719825291.91136,731152119.68713,745277911.81044,757006606.18239,767295218.55591,779028751.78763,791166605.92219,802475597.66431,812820575.59041,823276899.32635,833971060.7743399,844865460.93799,855968877.76696,867319222.8757399,878923989.93403,890777807.3075,902886902.00248,915256801.86052,927892925.1540899,940800479.1639,953985984.16668,967454663.43045,981213285.49348,995268075.1218399,1009625558.19291,1024293192.4304,1039277551.2663 +S8,Western Eyre Peninsula,S8 Option 3,,1701588667.3417,1724723889.3865,1760005096.4877,1786544616.6102,1811701710.9821,1840018972.1165,1875469814.7598,1904841375.8541,1930546715.8179,1959915791.2419,1990297716.7243,2018598963.0546,2044590862.8214,2070901667.6724,2097825562.441,2125263560.2208,2153236526.9971,2181841655.4317,2211097959.2222,2240992185.1941,2271540513.1161,2302757374.3358,2334656927.2964,2367252849.8035,2400562112.8449,2434598488.9281,2469379643.5215,2504921906.0839,2541242393.22,2578360595.1918,2616293797.6418 diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_TAS.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_TAS.csv new file mode 100644 index 00000000..0767bf3a --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_TAS.csv @@ -0,0 +1,11 @@ +REZ / Constraint ID,REZ name,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +T1,North East Tasmania,T1 Option 1,,796020974.91034,822033529.97617,844421713.6994101,863935972.5498899,882979122.74628,903868560.1062601,928357476.87265,950048163.18031,970514114.9259601,993371402.88157,1017204247.79651,1040805181.5054,1064172499.5777,1088550281.8315,1113920541.0156,1140260731.968,1167629759.2705,1196121426.6825,1225788329.399,1256671918.3398,1288830834.347,1322325453.4459,1357218784.9856,1393576764.9094,1431470031.67,1470970912.0615,1512157456.7423,1555110450.5063,1599915136.2648,1646662233.3465,1695445207.4352 +T1,North East Tasmania,T1 Option 2,,596049691.20431,616001453.38326,633225656.5491,648393510.2955899,663270752.52521,679512269.81708,698369791.86621,715126506.2308,731031261.42784,748756937.42632,767225509.81111,785526382.64576,803639298.68471,822542968.56239,842213319.87046,862634109.7056199,883852848.38182,905940756.81936,928938437.38865,952878656.6416,977806971.8945899,1003770312.31776,1030817678.8126,1059000354.2909,1088373249.3582,1118992624.0712,1150919164.0184,1184215686.0902,1218948482.6349,1255188090.2752,1293007199.3383 +T2,North West Tasmania,T2 Option 1,,240158121.32287,245473882.04102,251425092.20268,256500659.2699,261493303.92786,266970627.10571,273426440.45604,279038930.53563,284258748.24974,290099696.17459,296173100.09599,302075333.5917,307713333.00276,313521367.43501,319529818.68359,325731422.1963,332138895.42001,338773272.35952,345644693.85721,352759520.92769,360128675.75493,367763277.56395,375674891.18785,383875540.0002199,392378270.257,401196202.34637,410343688.59585,419835464.0101,429687078.03012,439915167.74314,450536709.73761 +T2,North West Tasmania,T2 Option 2,,806421132.37501,826459654.93592,847099440.67457,864594789.9418,881802006.43802,900642586.11358,922839983.28725,942242960.78628,960324889.6507399,980553375.66933,1001593954.00315,1022079135.326,1041787898.0302,1062145509.2748,1083232742.6524,1105025013.3461,1127567464.6315,1150935208.3532,1175165652.78,1200283649.5234,1226329844.0279,1253345722.8538,1281374471.0858,1310461063.98,1340654144.7091,1372002870.6873,1404560822.824,1438383127.808,1473527965.1915,1510057503.2078,1548035331.637 +T2,North West Tasmania,T2 Option 3,,980249858.3200899,1011246820.91335,1038500250.2907,1061988948.7047,1085047359.3622,1110208677.6425,1139714454.75,1165896525.0967,1190534703.9716,1218037458.5033,1246695465.2203,1274937050.3719,1302724093.8976,1331649746.5134,1361723005.9181,1392917765.9546,1425302350.4797,1458987021.0174,1494032717.7312,1530486000.352,1568414301.7241,1607886940.5834,1648976231.5044,1691757787.3353,1736312738.0737,1782723989.6324,1831081151.3931,1881476876.4362,1934008948.0375,1988781501.6282,2045901694.9539 +T3,Central Highlands,T3 Option 1A,,221570092.684955,224000000.0,228551077.8485512,232224472.1035821,235858581.6236017,239872129.0166728,244705828.618903,248778625.7031571,252451373.9851596,256589327.6143556,260876729.6432784,264909644.2917535,268530775.0718071,272172815.4325206,275898031.418296,279699326.0784835,283582592.2095352,287559950.6578588,291634947.4453818,295807114.8351154,300079597.2874328,304455387.9477358,308937528.3663028,313529061.6848059,318233555.9394447,323054221.1029466,327994888.454472,333059297.900688,338251397.157692,343575560.4349625,349035983.1754736 +T3,Central Highlands,T3 Option 1,,604516554.9229817,621000000.0,637246332.6505259,651311554.3369751,665185131.3575171,680300804.610768,697911417.0152404,713425820.9909351,728027674.4982225,744313316.8820513,761252462.6204157,777850644.9036008,793958819.2643121,810654578.7137088,827969662.0947492,845886849.2357273,864445871.1418012,883707376.8594049,903703497.9524248,924457612.1537111,946005113.0580659,968382262.2084996,991626863.2477335,1015778356.777202,1040879233.686249,1066972655.403157,1094105481.691914,1122326029.928782,1151685294.867853,1182237671.737003,1214038960.819364 +T3,Central Highlands,T3 Option 2,,506332096.39259,524574178.49138,539559822.93103,552777044.2111,565705336.30773,579814031.27587,596222116.1755999,610871185.4803,624794082.14325,640305839.32247,656478203.45402,672566238.4966899,688611708.49753,705395655.66634,722878345.5297999,741046097.12558,759941180.39217,779627483.3697399,800142335.30701,821516436.01421,843791655.74708,867011185.70012,891220143.0804499,916465776.80441,942798610.43748,970270508.23892,998937326.10216,1028856942.1626,1060090429.1664,1092702724.9192,1126760828.4695 +T4,North Tasmania Coast,T4 Option 1,,370540722.99223,382126852.20745,392380339.64626,401274941.07008,410015060.37593,419535397.4759,430707125.22926,440646551.7388,449999804.85098,460432289.98026,471306636.35469,482040501.62517,492613016.85333,503618590.53046,515061061.85122,526931580.46482,539256002.73937,552076092.51826,565415219.78649,579291201.02635,593729753.4043399,608757321.25499,624401492.87105,640691115.5713899,657657135.6966699,675331181.5430601,693747430.31346,712941226.99721,732949867.85011,753813067.5904601,775571701.08575 +T4,North Tasmania Coast,T4 Option 2,,430866400.17984,445276729.96601,457562097.27883,468361230.58964,478922707.64946,490468705.86534,503967118.36898,515978195.68099,527340176.19106,540011228.70208,553224912.3061199,566340240.1461,579359685.67272,592952210.88798,607101655.5745399,621796968.0206699,637071381.3633399,652976803.9542,669542974.83743,686793635.16838,704761898.02645,723481881.7567999,742989206.59526,763321154.64326,784517639.28943,806619565.33928,829671040.7628,853717738.24976,878807847.9311899,904992639.58281,932324962.46547 diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_VIC.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_VIC.csv new file mode 100644 index 00000000..7980d33b --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_accelerated_transition_VIC.csv @@ -0,0 +1,19 @@ +REZ / Constraint ID,REZ name,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +SEVIC1,Group Constraint - South East Victoria,SEVIC1 Option 1,,397059984.8086158,400000000.0,409626557.9998197,418075735.3474773,426252615.8443382,435279137.9230412,445971055.1152844,455219329.6099603,463788929.40128,473420929.8623983,483422358.2247609,493127133.0020812,502539488.6445753,512291509.5842903,522391494.6395024,532820347.21543,543597472.4790813,554758968.9931874,566320849.1003093,578293280.0415268,590694081.2291164,603541325.7828938,616853745.0177411,630650790.9814373,644953487.0823997,659782949.1671226,675162215.094706,691114853.3180301,707665687.5420467,724841217.4029307,742668364.3219717 +SWV1,Group Constraint - South West Victoria,SWV1 Option 1A,,1196025950.8745,1203858464.991,1232016305.1506,1256778434.5564,1280918808.3116,1307490641.1297,1338887974.6401,1365999362.8779,1391096450.8674,1419277291.3691,1448528060.6991,1476816144.4836,1503948112.5644,1531950387.033,1560903412.5711,1590756456.4544,1621565223.7661,1653430872.4282,1686396993.8271,1720489140.1647,1755755194.9619,1792243546.8164,1830004287.9418,1869089341.4551,1909555038.694,1951457639.7152,1994858808.6935,2039821447.0382,2086411821.6401,2134700806.1792,2184760164.3297 +SWV1,Group Constraint - South West Victoria,SWV1 Option 1C,,827557686.7057899,833132139.10535,852725766.5999199,869948145.17582,886803065.7162,905293669.22515,927057703.2744899,945860446.6897601,963286939.32563,982830596.8026,1003102936.6235,1022670932.5906,1041354347.6405,1060608811.0742,1080500666.155,1100994902.7106,1122130118.3842,1143974461.885,1166556975.129,1189894221.784,1214018008.4505,1238960430.9262,1264754706.1571,1291435225.1891,1319039375.925,1347604390.4677,1377171160.6903,1407781346.2641,1439478838.974,1472310615.0356,1506324171.0158 +SWV1,Group Constraint - South West Victoria,SWV1 Option 2B,,1300302756.86573,1310000000.0,1338885122.99748,1363345526.258496,1387223976.062426,1413550258.936806,1445145992.503444,1472274175.168278,1497034681.974729,1524910447.361778,1553847333.403765,1581570068.535786,1607743368.293329,1634574151.323837,1662245265.689095,1690705991.088519,1720003043.208738,1750233815.602319,1781436595.958656,1813627684.15993,1846847048.468171,1881134670.547304,1916531781.359678,1953080893.453044,1990828656.524063,2029820945.227316,2070108648.359426,2111743333.486658,2154779318.540107,2199274998.339051,2245288999.296743 +SWV1,Group Constraint - South West Victoria,SWV1 Option 3A,,1481759290.3932,1492065284.7404,1527387224.8599,1558375055.1351,1588619530.4835,1621791354.5922,1661069736.4337,1695195107.8637,1726768611.3473,1762204906.5568,1799002136.2954,1834622808.9761,1868956581.6109,1904442257.2423,1941160461.8094,1979050184.886,2018180716.6956,2058681905.7627,2100611347.1353,2144003776.0447,2188922264.9746,2235430669.4814,2283595117.9671,2333484235.7053,2385172303.6078,2438733765.5144,2494249992.7598,2551804126.4841,2611483755.7618,2673382461.3446,2737595171.1951 +SWV1,Group Constraint - South West Victoria,SWV1 Option 3B,,1767896440.8501,1781962648.4727,1822177525.1837,1856250274.9429,1889410106.5325,1925987173.7013,1969884843.357,2007676647.7239,2042229333.4744,2081141613.045,2121545852.824,2160342688.7419,2197272177.3211,2235247834.7347,2274468166.3481,2314859567.4007,2356488941.2208,2399496890.5992,2443940554.3855,2489847655.7972,2537278945.594,2586295460.6779,2636960238.9104,2689338446.4,2743501217.5115,2799519038.9709,2857469638.6355,2917432055.933,2979489547.0714,3043731405.7594,3110247646.6621 +SWV1,Group Constraint - South West Victoria,SWV1 Option 3C,,365061069.02751,370226274.29432,377496284.58232,382477332.33073,387350860.63338,392807261.00479,399739591.40417,405477770.76191,410409475.05271,416063945.66993,421917264.00501,427190325.87671,431758048.50636,436284163.7035,440891254.21847,445563437.32068,450302984.43011,455128208.8576199,460041863.2717699,465039154.02531,470121631.88731,475290387.86439,480546379.05672,485890365.72708,491323745.59405,496847161.61225,502461979.52564,508169213.86651,513969954.4195199,519865701.3442301,525857416.32316 +SWV1,Group Constraint - South West Victoria,SWV1 Option 4,,1914613304.204673,1930000000.0,1973276473.462752,2009782181.117699,2045327237.397244,2084539618.654799,2131688895.227737,2172253802.685762,2209273324.732568,2250977921.557765,2294283979.44307,2335811581.315147,2375253475.420678,2415776130.864762,2457614936.618544,2500691254.13649,2545075072.711156,2590916852.760381,2638277018.480157,2687183697.625475,2737700768.279729,2789892332.283565,2843824557.531463,2899565803.930792,2957190792.15392,3016773431.475121,3078395339.267481,3142139443.817694,3208093100.588507,3276350055.81549,3347004720.903356 +SWV1,Group Constraint - South West Victoria,SWV1 Option 5,,505977851.9544667,510000000.0,521449632.9830104,531129427.9615716,540577748.2471817,550994273.3321671,563462424.939916,574157739.4463053,583931261.6394166,594933806.4579415,606350913.8787217,617276852.8444482,627588657.33123,638162444.8692404,649068758.8642715,660286409.406637,671833968.4458276,683749925.6651982,696049287.5283841,708738624.6059551,721833796.0078386,735350674.5992872,749305635.3927717,763715561.7765323,778598975.176174,793974103.0395751,809861149.4001805,826280596.3532029,843254022.3295617,860804614.6302494,878955664.7414 +V1,North West VIC,V1 Option 1,,745440575.6779855,750000000.0,767267831.4426099,782534514.0449023,797382090.2057302,813754722.7010363,833117259.6123383,849776094.2040706,865183191.5808508,882475413.8664598,900420183.4372071,917787925.1987755,934391510.6120929,951498652.7456136,969169401.5868247,987371376.9000572,1006138315.853124,1025530442.734723,1045573283.538003,1066280959.380951,1087681126.143924,1109801680.255281,1132671489.590342,1156320407.740038,1180780947.561614,1206085399.246398,1232269283.499842,1259368765.698934,1287421925.036198,1316469533.574383,1346552785.526998 +V1,North West VIC,V1 Option 2,,1258081671.276707,1270000000.0,1298243058.204555,1321450429.014396,1343951205.510745,1368944445.008676,1398975419.248211,1424434161.886258,1447592269.285591,1473735974.2043,1500828144.329784,1526588062.373514,1550685685.501734,1575324211.932399,1600694628.774773,1626734898.488495,1653487120.463669,1681040044.48762,1709424784.59799,1738651652.704707,1768753261.287873,1799761956.147678,1831711032.866057,1864634626.069924,1898570622.497468,1933555722.936142,1969631098.672149,2006838218.75545,2045220764.046841,2084825891.082069,2125700589.250931 +V2,Central Highlands VIC,V2 Option 1,,357705805.0352287,360000000.0,368315246.7848175,375636646.2761419,382782453.6093541,390636230.4275939,399910931.7796971,407906764.0124976,415302538.1567309,423597435.4463409,432202626.0869949,440516736.6803294,448445798.266817,456608799.770978,465037327.9968501,473716247.4307413,482661620.387518,491901967.1300609,501449340.5832431,511310271.4120491,521497765.1336892,532024927.6743706,542905318.3748393,554152952.8689666,565783109.953405,577810944.1816933,590253143.9319369,603126688.6410809,616449459.0549952,630240608.5103967,644519472.9171532 +V7,Central North VIC,V7 Option 1,,983102294.1835973,990000000.0,1013216988.932384,1033545576.014629,1053247867.78364,1074969832.689112,1100846197.712408,1123250646.59474,1143918371.721422,1167146330.727364,1191277342.021783,1214673424.636904,1237287039.492316,1260669971.678567,1284871510.718384,1309848326.297236,1335644811.305144,1362347345.745985,1389994006.443006,1418607466.253142,1448229239.26719,1478901362.046543,1510667368.180109,1543572415.297429,1577665412.940775,1612995339.310119,1649615743.183453,1687581346.56004,1726949772.432071,1767782586.865711,1810142246.852951 +V7,Central North VIC,V7 Option 2,,785230719.659049,790000000.0,808326333.1428742,824575980.3656892,840412787.4548788,857795844.1680053,878410019.213423,896289744.3368176,912815858.0059897,931348272.3539703,950595346.603177,969263512.3971522,987218317.7512966,1005747441.299126,1024905169.572327,1044660051.634136,1065047785.924699,1086134624.525944,1107949900.982995,1130510530.404612,1153848107.660299,1177994585.998302,1202983048.286325,1228847767.170378,1255625938.982271,1283354690.31295,1312074706.260984,1341827503.141426,1372656793.476002,1404609315.176764,1437732410.764487 +V8,Gippsland Offshore,V8 Option 1,,1491790556.373425,1500000000.0,1532895651.219359,1561672397.138999,1589901081.160865,1620747836.654892,1657841876.896147,1690212612.827876,1719831872.856882,1753070966.643585,1787645763.330872,1821088710.58733,1853093976.615477,1886019379.56514,1920040389.381392,1955114635.270928,1991299122.87831,2028714245.264398,2067413325.371299,2107423316.719766,2148799299.329705,2191596806.462736,2235873215.152351,2281687946.401242,2329105601.261687,2378190497.820342,2429013297.351951,2481646000.207609,2536164416.406582,2592649734.902219,2651184017.999615 +V8,Gippsland Offshore,V8 Option 2,,785039108.2797093,790000000.0,807713205.2175337,823133343.0391728,838199664.902695,854720082.4506966,874544346.336226,891756173.9818542,907514066.9942906,925209976.7090287,943605482.8967273,961370605.382184,978354816.9414132,995828900.5078726,1013883964.252925,1032492502.744247,1051684909.220393,1071525219.472802,1092041071.921163,1113246529.945315,1135170532.497675,1157842251.121087,1181291834.703586,1205550476.444484,1230652132.755204,1256630567.39426,1283522892.890303,1311366918.631287,1340202454.214081,1370072129.979643,1401019025.969443 +V9,Southern Ocean,V9 Option 1,,10045686.40516562,10000000.0,10160076.9990994,10300161.75788869,10358178.52545973,10543764.69614595,10758836.68762016,10810651.57576988,10861451.1407557,10951516.60249005,11043192.85293995,11127680.09746751,11191114.27216439,11259784.49199945,11332823.08142994,11406964.6333779,11483004.86152231,11561813.84285262,11642991.73611499,11726440.61320535,11812171.39522749,11900184.54621892,11990476.98222943,12083045.5487782,12177896.03713081,12275020.75485635,12374428.56238548,12476117.99127714,12580090.53725593,12686357.89750865,12794917.84301741 +WV1,Group Constraint - South West Victoria,WV1 Option 1,,1338841574.778081,1350000000.0,1379057835.350565,1403083797.953927,1426553328.670367,1452481728.742833,1483727290.399776,1510303853.200945,1534387588.127115,1561530553.43787,1589673521.500265,1616400588.691042,1641188572.92667,1666426382.518112,1692373465.654427,1718974215.091821,1746269271.940511,1774347701.972024,1803240332.664351,1832954491.372127,1863520947.946064,1894970028.770295,1927332868.681305,1960641251.762377,1994930737.547096,2030235377.10467,2066593701.89027,2104044329.474287,2142627927.724947,2182388552.127489,2223369834.381741 diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_NSW.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_NSW.csv new file mode 100644 index 00000000..b9c5827b --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_NSW.csv @@ -0,0 +1,33 @@ +REZ / Constraint ID,REZ name,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +DN1,Dubbo,DN1 Option 1,,601000000.0,608651728.2660866,619901802.2525349,626746570.0135497,633252119.2616019,640672932.1661613,650070665.9096068,657249714.4544252,663264846.0147067,670404078.3142054,677800234.998834,684436916.9895128,689946347.6692802,695440434.8034512,701060495.4875284,706782688.3075322,712618680.5478907,718598249.3383627,724727008.0035411,731001660.7344168,737427251.9599175,744008177.252143,750749351.7609854,757655625.6148388,764732088.1465118,771983933.6060076,779417297.3573607,787037279.683475,794850478.0593966,802863001.7896303,811081624.229827 +DN1,Dubbo,DN1 Option 2a,,125000000.0,126591457.6260579,128931323.2638384,130354943.8464122,131708011.4936776,133251441.7982865,135206045.3222976,136699191.8582415,137950259.1544731,139435124.4413905,140973426.5804563,142353768.0926608,143499656.3372047,144642353.3285048,145811251.1413329,147001391.0789376,148215199.7811753,149458870.4946678,150733570.7162107,152038614.9614012,153375052.4043089,154743797.2654208,156145871.8304878,157582284.8616554,159054094.8724026,160562382.1975889,162108422.9112647,163693277.8043833,165318319.0639344,166984817.3439331,168694181.4121937 +DN1,Dubbo,DN1 Option 2b,,280000000.0,283564865.0823698,288806164.1109979,291995074.2159632,295025945.7458379,298483229.6281617,302861541.5219465,306206189.7624609,309008580.5060197,312334678.7487147,315780475.5402222,318872440.5275601,321439230.1953385,323998871.4558508,326617202.5565856,329283116.0168203,332002047.5098326,334787869.9080559,337643198.404312,340566497.5135386,343560117.3856521,346626105.8745425,349766752.9002927,352984318.090108,356281172.5141819,359659736.1225992,363122867.321233,366672942.2818187,370313034.7032131,374045990.8504102,377874966.3633138 +DN1,Dubbo,DN1 Option 3,,943000000.0,955005956.3309811,972657902.7023965,983397696.3773333,993605238.7083039,1005248876.926273,1019994405.911413,1031258703.378574,1040696755.061345,1051898578.78585,1063503530.122962,1073916826.491032,1082561407.407872,1091181913.510241,1100000078.610215,1108978494.299506,1118135467.149186,1127517719.011774,1137134057.483094,1146979311.268811,1157061395.338107,1167387206.570334,1177964457.0892,1188800756.996328,1199904091.717405,1211282611.298611,1222945942.442581,1234902087.756268,1247161399.018321,1259733462.042631,1272628904.573589 +DN2,Yass,DN2 Option 1,,271000000.0,274450280.1332936,279523108.8360015,282609518.2590216,285542968.9182931,288889125.8186851,293126706.2587411,296363847.9486676,299076161.8468977,302295349.7889346,305630388.8264294,308622969.2248885,311107254.9390598,313584622.0161985,316118792.4744096,318699015.8591368,321330553.1255879,324026831.2324398,326790381.3127449,329619717.2363178,332517113.6125419,335484552.4714322,338524250.1284975,341638393.5800688,344829277.6833689,348099244.6043727,351451060.8716219,354887026.2799031,358410115.7306098,362023084.0016469,365728985.3016358 +DN3,Marulan,DN3 Option 1,,306000000.0,309895888.2685899,315623879.3498763,319108902.5360169,322421212.1365228,326199529.5222052,330984398.9489844,334639621.6689752,337702234.4101501,341337184.6325239,345102948.2689571,348482024.2908335,351287158.7134771,354084480.9481798,356945942.7939829,359859405.3612393,362830809.064317,365875314.9709468,368995781.1132838,372190529.42551,375462128.2857484,378812815.70575,382245094.2410342,385761433.3413323,389364424.2476416,393056711.6196977,396841419.286776,400721144.0651304,404699245.0685114,408778832.8579482,412963356.0970501 +N1,North West NSW,N1 Option 1,,5875680663.271611,5979891728.426319,6085944988.319343,6144167360.305215,6198191769.980823,6260946671.611845,6346875983.929311,6413210618.049587,6465759256.918991,6529407273.539398,6595771503.173532,6654404431.76484,6704358801.884051,6754323966.378252,6805721496.202252,6858328541.273745,6912167282.567952,6967574080.846473,7024623493.145674,7083278766.824247,7143599490.293063,7205638586.321347,7269453836.783059,7335103434.215094,7402648095.177384,7472149517.479786,7543679572.922652,7617301294.546178,7693091652.893078,7771123984.040265,7851478863.224122 +N11,Illawarra Coast,N11 Option 1,,1012045518.382449,1025449964.135035,1042097051.240098,1051371572.617226,1060223701.217896,1070319473.327937,1084313698.613248,1095273226.167113,1103860819.580807,1114205336.227294,1125023084.656829,1134580747.845994,1142518395.073395,1150340782.657988,1158349348.184037,1166523496.709963,1174864723.871363,1183425649.528437,1192218747.643625,1201235830.310896,1210484906.448671,1219972790.954626,1229707024.17593,1239695059.423823,1249944712.940255,1260463871.569488,1271261999.411247,1282346939.88249,1293728807.296463,1305416983.069088,1317421894.772208 +N12,Illawarra,N12 Option 1,,1012045518.382449,1025449964.135035,1042097051.240098,1051371572.617226,1060223701.217896,1070319473.327937,1084313698.613248,1095273226.167113,1103860819.580807,1114205336.227294,1125023084.656829,1134580747.845994,1142518395.073395,1150340782.657988,1158349348.184037,1166523496.709963,1174864723.871363,1183425649.528437,1192218747.643625,1201235830.310896,1210484906.448671,1219972790.954626,1229707024.17593,1239695059.423823,1249944712.940255,1260463871.569488,1271261999.411247,1282346939.88249,1293728807.296463,1305416983.069088,1317421894.772208 +N13,South Cobar,N13 Option 1,,2087785564.724367,2131547923.360338,2173192054.57546,2198454064.199306,2221918552.533115,2248822976.727434,2283961507.792888,2311634550.928134,2334636954.106718,2361962766.340379,2390381164.919947,2416315644.589921,2439538221.472816,2463179694.881802,2487579418.507913,2512639298.307131,2538385206.822393,2564950753.048023,2592369686.076836,2620640356.09018,2649795495.48932,2679865863.417284,2710884598.123888,2742885469.234938,2775903709.238307,2809975402.381802,2845141016.602293,2881438271.553041,2918910658.588402,2957600918.822298,2997555200.181682 +N13,South Cobar,N13 Option 2,,3244030455.865267,3304749126.199083,3366056021.420569,3401060686.369591,3433733531.70782,3471395723.669462,3521533837.531324,3560433964.677919,3592002374.253242,3629919988.995831,3669377611.232285,3704600169.529679,3735005042.735928,3765620829.279462,3797148559.176629,3829454010.833336,3862564936.070187,3896672753.822895,3931820994.818913,3967995781.959482,4005235809.149311,4043576291.879503,4083055473.36566,4123712063.219068,4165586459.256887,4208719813.990203,4253159332.002266,4298947478.199286,4346134869.04961,4394770352.000982,4444907204.291311 +N13,South Cobar,N13 Option 3,,3299132527.060919,3360080998.155221,3422081134.180873,3457470737.750255,3490533613.081599,3528606238.248075,3579404578.22988,3618860076.578168,3650817988.553062,3689201480.073775,3729155921.095058,3764812665.868587,3795552425.365942,3826477077.680369,3858316458.949011,3890937631.486117,3924366913.326711,3958798362.504657,3994276331.401103,4030786084.910705,4068366481.674611,4107052831.814623,4146883488.892853,4187897255.223412,4230134625.615627,4273636845.82978,4318451277.365355,4364620441.90585,4412195119.703624,4461224268.137693,4511761307.868999 +N13,South Cobar,N13 Option 4,,3247137779.175606,3307857962.754152,3369161572.442228,3404155275.210278,3436817967.363074,3474471406.344097,3524618381.446926,3563528310.656682,3595096123.57142,3633015406.783517,3672476598.613131,3707701955.72337,3738110151.162233,3768727677.367759,3800257057.733733,3832564370.268229,3865677176.614648,3899787026.231296,3934937518.35267,3971114716.825964,4008357318.523753,4046700536.637393,4086182612.615576,4126842252.417685,4168719851.124874,4211856556.763895,4256299572.271743,4302091357.819738,4349282527.364236,4397921924.77523,4448062824.190153 +N2,New England,N2 Option 1,,1074604918.9248,1092494681.1377,1112581229.0687,1123306885.2119,1133369661.659,1144992904.447,1160539604.1834,1172289673.1815,1181623286.7489,1192975370.5031,1204765965.8046,1214944792.8112,1223172361.5042,1231313826.8224,1239661654.7088,1248170303.7325,1256847339.8625,1265750272.6096,1274889251.3699,1284255582.9163,1293857441.1429,1303701715.8675,1313796056.5597,1324148086.2133,1334765739.4219,1345657025.115,1356831665.0027,1368297574.3309,1380065134.6681,1392143861.0095,1404544431.2489 +N2,New England,N2 Option 2,,228184592.8290697,231750701.2805732,235966928.8760824,238322930.0551381,240545322.3520426,243084969.6631959,246466103.9660163,249065032.8998596,251151454.1820922,253662559.5288294,256273178.6795869,258566858.1787803,260459604.8063864,262338041.92901,264263306.2624319,266226761.2908227,268230154.0123913,270285670.9574857,272395748.9120234,274558728.6107639,276776513.9058271,279050747.0196574,281383243.6304167,283775813.633857,286230344.4972661,288748752.8596623,291333322.5098468,293985957.7145854,296709104.0227858,299505030.0188019,302376259.2569419 +N2,New England,N2 Option 3,,905180840.917516,919225007.4113299,935731592.7801889,945013662.1924074,953821881.5063167,963807174.4666367,977183667.3007141,987590908.0226543,995929563.5960221,1005933186.98103,1016345543.215143,1025530006.948821,1033165831.879425,1040743894.893819,1048511227.45138,1056437757.90691,1064529039.036662,1072833648.094279,1081362130.488166,1090108063.969659,1099079352.026771,1108282867.740191,1117726181.517819,1127416850.881893,1137362760.72352,1147571920.715556,1158053816.562985,1168816451.838166,1179869984.353561,1191223897.200105,1202888700.749664 +N3,Central-West Orana,N3 Option 1,,853232977.1935666,857053935.4234135,867184652.8796785,872551742.0827701,877972114.3092422,883989509.1920105,893475103.3069762,901182812.4879129,906685170.3281754,913353759.3187852,920441488.2042377,926623032.6547741,931408104.7523816,935862171.1965753,940355395.1860787,944904075.7176677,949496314.3674097,954168647.703,958931682.5522183,963773617.2993904,968696597.3557235,973701630.408705,978790060.5798551,983962879.8958126,989221212.1537902,994566041.2556535,999999312.170324,1005521484.560324,1011134569.876159,1016839794.150945,1022638855.824839 +N3,Central-West Orana,N3 Option 2,,1137178264.300679,1154587967.185013,1173940915.162998,1184900662.338485,1195302388.678321,1207153581.455331,1223483151.887391,1236382173.097015,1246599174.104971,1258860666.97966,1271677906.295404,1283111512.919252,1292872621.932349,1302588708.763212,1312564359.759162,1322772750.698187,1333216453.002888,1343958220.547496,1355013870.887343,1366376163.960152,1378056440.100473,1390064755.063019,1402412094.118481,1415109461.853252,1428168376.470865,1441600522.819147,1455419521.575422,1469637283.042904,1484268390.007476,1499326732.201583,1514827546.024042 +N3,Central-West Orana,N3 Option 3,,647737888.6462379,658485716.1179585,670547955.3764395,677551075.6414317,684178313.4013637,691690042.914837,701674597.1011719,709496888.6274675,715832773.8501415,723399322.6818539,731277507.4208362,738309958.5806862,744291814.1911846,750272841.6734828,756417228.3301799,762702420.6503972,769133061.8307912,775745987.873934,782549752.6171604,789540879.1808292,796726361.040393,804112493.874918,811706135.0133823,819514192.7928095,827543874.7388299,835802525.8516127,844298641.1219938,853039711.7626045,862034846.3643217,871292743.4037604,880822929.4036345 +N4,Broken Hill,N4 Option 1,,1281732102.524768,1300264394.265369,1323193975.926048,1334080892.10873,1344228483.102872,1356195489.739641,1372674342.470623,1384570309.442549,1393561143.949605,1404819239.177481,1416496860.612931,1426010308.579888,1432854986.688942,1439386712.056539,1446027754.029094,1452722161.946415,1459473969.047902,1466343666.330132,1473337446.290648,1480438766.729018,1487650577.69299,1494974085.562448,1502411047.601716,1509962922.177386,1517631189.306831,1525417150.887835,1533323712.545591,1541351333.683993,1549503016.977221,1557780358.273858,1566185885.585922 +N4,Broken Hill,N4 Option 2,,5569035215.262003,5620347655.353648,5705934979.285608,5751912726.353645,5775688021.137182,5834507346.073691,5915489330.305203,5946682683.304136,5967645852.127121,6003740887.438839,6041254188.938948,6072593553.844507,6093885560.691668,6115642547.236764,6138796246.139662,6162440409.665483,6186694794.276332,6211958702.875568,6238164641.301593,6265249840.145688,6293232002.56983,6322121728.607399,6351933005.415877,6382678517.606069,6414372218.766121,6447027438.211273,6480664749.807361,6515295688.794791,6550942355.083976,6587622176.373445,6625356860.710855 +N4,Broken Hill,N4 Option 3,,2632268903.156145,2677147725.319543,2724163772.572827,2750870779.062177,2775962063.469024,2804774861.324334,2843901631.500498,2874526850.539567,2899039649.542904,2928492427.192093,2959220584.610223,2986651412.941409,3010246826.225417,3033879652.01466,3058187150.979434,3083084756.844067,3108585246.004578,3134839618.405817,3161884234.434282,3189705084.861207,3218331208.833451,3247788746.184836,3278106142.544114,3309312066.183765,3341436477.024307,3374509834.823809,3408567308.668478,3443640194.689439,3479766175.712191,3516981442.355336,3555325550.311255 +N5,South West NSW,N5 Option 1,,620124451.3611771,624000000.0,632329193.8354137,637001974.8545014,641677523.9695653,646856275.9579815,654428229.679119,660533984.8394276,665134353.2885693,670646528.0798736,676458379.7719282,681586226.1079355,685659287.2240441,689542633.9343576,693478942.613932,697473831.3331501,701523619.0920907,705655690.1310414,709877622.7815077,714182221.433006,718572066.8412745,723048953.4223133,727614995.623597,732272099.1783118,737022312.543003,741867630.6615983,746810826.009909,751853598.2066511,756998881.4016306,762249063.713765,767606965.2701383 +N5,South West NSW,N5 Option 2,,116067927.9178305,116399366.3507984,117689163.4307057,118371298.4889538,119084631.6479829,119860617.8033552,121090796.3499974,122107980.3654974,122835618.9317518,123711413.6388048,124643162.6102168,125457082.4788927,126080343.264421,126655008.1986163,127231903.7523319,127814389.8736423,128401029.6683812,128996342.997747,129601761.7063833,130215656.4490839,130838216.8909415,131469474.5631552,132109505.3748563,132758327.7114819,133415977.2224277,134082464.2023827,134757921.4303725,135442277.0006108,136135662.3179383,136838098.7607546,137549662.0579173 +N8,Cooma-Monaro,N8 Option 1,,281695855.7624419,289705536.0417703,296270349.0607895,301204779.8488743,305812343.8573281,310987045.133092,317335586.191353,322607798.9983379,327316279.7256495,332727859.7898374,338352565.2614511,343813045.7201775,349138416.2930595,354684707.0170911,360434219.7119245,366371530.8029657,372505722.838831,378860429.1750446,385443915.6705976,392260625.7068764,399319830.3759446,406630692.3349465,414202964.5035249,422046672.7565013,430172293.9317612,438590616.5484917,447313333.9586644,456351965.997515,465719115.525086,475427540.7122439,485490790.2281713 +N8,Cooma-Monaro,N8 Option 2,,671679252.55855,689398438.42198,704260778.54391,715220297.56694,725553017.70679,737055861.2851399,751373530.25183,763359005.36341,773931328.2347,786089643.27482,798744375.28808,810965384.9207699,822793272.20121,835063161.45586,847772258.0622,860891879.76779,874439459.86863,888468706.45979,902998773.2551199,918038281.18242,933607482.3957499,949726305.22977,966415968.9180499,983698262.94216,1001595960.76696,1020132490.9297,1039333318.4658,1059223428.1804,1079830254.0938,1101181510.2588,1123306659.1493 +N9,Hunter-Central Coast,N9 Option 1,,596406751.4177897,604000000.0,615164093.310262,621956548.7254966,628412378.1651294,635776476.1972216,645102386.1017435,652226567.5008878,658195727.356492,665280396.8129995,672620027.0646739,679205987.0418015,684673310.9251319,690125408.5286216,695702516.9069265,701380976.858282,707172366.4978355,713106235.3783756,719188153.9236712,725414851.5135154,731791334.0238973,738321963.4329811,745011617.3257583,751865108.7626609,758887488.1803726,766083910.1309245,773460463.0877485,781022208.3539363,788775692.9821662,796726979.5855049,804882789.7530376 +N9,Hunter-Central Coast,N9 Option 2a,,593000000.0,600549874.9780189,611650197.5636492,618403853.6073793,624822806.5260066,632144839.891071,641417479.0089798,648500966.1754977,654436029.4288204,661480230.3499564,668777935.6976849,675326275.8315825,680762369.663699,686183324.190427,691728575.4144831,697374599.2784802,703132907.7618954,709032881.626704,715080059.4777036,721271189.3768872,727611248.6060417,734104574.227156,740756015.9638342,747570359.383693,754552626.0746781,761707941.1453618,769042358.2910397,776560909.9039946,784270105.6393048,792175973.4796185,800285196.6194466 +N9,Hunter-Central Coast,N9 Option 2b,,522000000.0,528645927.046418,538417205.9497889,544362245.5026171,550012655.9975977,556458020.9496442,564620445.2659147,570855825.2000165,576080282.2290797,582281079.6672467,588705029.3999857,594469335.5549513,599254564.8641669,604026467.4998361,608907784.766206,613877809.1456436,618946674.2861879,624140243.1857327,629463391.310896,634913256.0788113,640494218.8403941,646210097.3803971,652065160.7641171,658063621.5822728,664209900.1871533,670508508.0571313,676964774.0774415,683583128.1111047,690369300.41099,697328597.2282646,704466901.5773207 +N9,Hunter-Central Coast,N9 Option 3,,218000000.0,220775502.0998451,224856227.7721341,227339022.0681428,229698772.0449738,232390514.4962116,235799343.042087,238403390.6007732,240585251.9654011,243174857.025785,245857655.9563158,248264971.5536003,250263400.652085,252256264.2049125,254294821.9904845,256370426.0416673,258487308.4183697,260656270.1427006,262879347.3290715,265155344.4926836,267486091.3931148,269873182.4308938,272318400.4723707,274823504.7987269,277390341.4574702,280020794.5525951,282717089.5572456,285481076.4908445,288315148.4475016,291221521.4478193,294202652.3828657 +N9,Hunter-Central Coast,N9 Option 4,,459000000.0,464843832.4028848,473435819.0248145,478663353.8040255,483631818.2047842,489299294.2833079,496476598.4234767,501959432.5034628,506553351.6152252,512005776.9487858,517654422.4034356,522723036.4362503,526930738.0702156,531126721.4222697,535418914.1909743,539789108.041859,544246213.5964755,548812972.4564202,553493671.6699258,558285794.1382651,563193192.4286225,568219223.558625,573367641.3615513,578642150.0119984,584046636.3714625,589585067.4295465,595262128.930164,601081716.0976956,607048867.6027671,613168249.2869223,619445034.145575 +SWNSW1,Secondary Transmission Limit - South West NSW,SWNSW1 Option 1,,449425314.8180761,459716205.6929449,468946018.9926392,474706699.7604086,480034690.8490331,486134035.3035526,494061020.0029328,500366333.4361274,505657815.0209286,511914053.3942626,518421921.7878143,524429691.1106753,529929045.1067773,535561056.4317726,541382694.9811571,547371454.5034958,553533431.6075277,559899205.7701364,566477036.8784238,573267615.5753232,580279214.6076993,587519717.9433652,594997583.5229913,602721460.6871548,610700371.5996734,618943573.3472854,627461346.1846157,636263433.9171679,645360892.8247328,654764684.5344698,664486590.4207629 diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_QLD.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_QLD.csv new file mode 100644 index 00000000..9fcb3a00 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_QLD.csv @@ -0,0 +1,19 @@ +REZ / Constraint ID,REZ name,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +CQ1,,CQ1 Option 1,,206851966.2349,209397491.08877,212672719.23415,214174249.83327,215512450.9167,217168178.81528,219642652.80495,221406890.44604,222656325.50383,224256677.94292,225932090.49697,227298193.91687,228286694.18201,229216885.97817,230161802.49416,231113564.83739,232070766.73556,233043365.63522,234032553.35469,235035285.58429,236051847.95717,237082239.86235,238126534.00645,239184742.50724,240256873.51112,241342907.16124,242443054.44936,243557143.28278,244685383.73679,245827762.77715,246984395.87908 +CQ1,,CQ1 Option 2,,526339827.69993,534991075.8915799,543836353.71464,547746698.31943,551085248.7375,555304397.09415,561734410.4901899,566299878.0944899,569500954.0411899,573641060.83171,577969938.9561,581494448.06161,584171332.08803,586744404.40082,589374958.93397,592035812.27081,594722115.4704,597461263.34849,600256591.95771,603100605.6935899,605994605.94353,608939167.84337,611935077.21522,614983018.5603399,618083669.15006,621237674.8920699,624446299.80216,627709872.18025,631029710.01203,634406594.02811,637841686.3124499 +NQ1,Group Constraint NQ1,NQ1 Option 1,,1767754969.4494,1803357373.8281,1836406584.4338,1854914769.4014,1871439747.9112,1891169192.2884,1918240920.7961,1938763470.1649,1955019185.7155,1974827207.2122,1995460073.0932,2013868802.7364,2030026187.1658,2046357550.1868,2063191925.9137,2080433807.9895,2098087452.9082,2116261231.2107,2134976035.3581,2154220659.9772,2174013666.6404,2194371563.009,2215312325.1329,2236854078.7521,2259015656.3068,2281816182.4893,2305277837.9102,2329420131.1609,2354266703.0942,2379840070.3597,2406164937.9337 +NQ1,Group Constraint NQ1,NQ1 Option 2,,4755015634.2754,4829108542.4379,4907283264.4001,4940937414.4502,4970126453.4159,5007087301.5619,5063452729.9093,5103094166.2498,5130582003.7048,5166431906.9168,5203940312.2839,5233909603.2586,5255702899.3804,5276361259.4202,5297452236.0686,5318753852.1452,5340223695.455,5362104628.5114,5384424182.0732,5407112692.2008,5430179638.248899,5453627795.085,5477461644.2474,5501684656.1025,5526300203.2599,5551311003.5623,5576725422.3442,5602543296.6776,5628773129.3675,5655418524.1776,5682486346.4865 +Q1,Far North QLD,Q1 Option 1,,4097011906.834,4177549635.696499,4255011229.9491,4298277637.1054,4337432074.5258,4383590331.4861,4446195206.7346,4493817691.5211,4531783728.0363,4577882778.998,4625834204.215199,4668434412.0174,4705366379.1388,4742596191.8821,4780922223.9231,4820130946.9165,4860240241.192,4901493078.2211,4943935578.8474,4987540887.445,5032349546.6101,5078397298.6727,5125723219.877,5174366606.42,5224368287.0402,5275769679.0535,5328619156.8014,5382958678.3171,5438839786.8917,5496311204.107,5555426594.373 +Q2,North Qld Clean Energy Hub,Q2 Option 1,,1077270557.457,1096666724.4638,1115858783.4186,1125582167.6038,1134187161.0454,1144665746.0413,1159538395.3306,1170471779.5823,1178760684.5575,1189096227.9341,1199871105.6444,1209117075.1491,1216738988.5328,1224300740.7525,1232071979.6848,1239996921.8374,1248073681.3187,1256362897.8937,1264874025.4596,1273596177.3711,1282536364.6237,1291700223.5079,1301094057.3007,1310724105.1262,1320596827.0796,1330718712.7868,1341097839.4034,1351740501.0417,1362655268.7328,1373849816.3855,1385332878.9772 +Q2,North Qld Clean Energy Hub,Q2 Option 2,,1120604774.2286,1140329129.1424,1160435702.9612,1170706637.2394,1179914019.2839,1190987613.2626,1206524140.182,1218010394.1259,1226795818.1079,1237693309.3212,1249042419.6394,1258783715.7216,1266765007.5413,1274671780.167,1282788541.5272,1291059530.5322,1299484622.9494,1308125536.9235,1316991933.0666,1326072592.7676,1335374604.4128,1344903630.7685,1354666028.0633,1364668069.0252,1374916252.4448,1385417095.4421,1396178762.7465,1407207531.1592,1418512059.2851,1430100049.5454,1441980293.9423 +Q5,Barcaldine,Q5 Option 1,,1627018049.1917,1653933415.6978,1681516909.1999,1693286113.0733,1703279826.3778,1716156408.0803,1735677204.8241,1749148847.4427,1758484353.0115,1770755371.0517,1783567032.056,1793736052.8336,1801097972.843,1808103116.1729,1815263793.6265,1822489924.3492,1829768745.9871,1837184432.2365,1844744905.4714,1852426177.5987,1860231201.6884,1868160639.6355,1876215734.7843,1884397406.6597,1892706499.4324,1901143667.8693,1909711466.8851,1918409517.6722,1927240417.9139,1936205054.5495,1945305442.7947 +Q9,Banana,Q9 Option 1,,1547032629.9564,1570581915.1838,1596978901.8187,1609172189.965,1620209637.3486,1633553877.3993,1652850038.1814,1666797835.8434,1676997461.6275,1689919421.8329,1703386676.5968,1714404920.879,1722609412.8574,1730476031.8775,1738498366.2787,1746609969.9494,1754805875.6222,1763162823.4034,1771690359.8555,1780367967.2518,1789199879.6837,1798188211.142,1807335734.4576,1816644894.5688,1826118187.3289,1835757921.224,1845568335.437,1855550853.5513,1865709873.6046,1876048203.05,1886569786.7817 +Q9,Banana,Q9 Option 2,,854433594.90153,867522008.46153,882560096.47131,889631045.19845,896029298.3266399,903773711.5710601,914707281.3570199,922526567.3492,928337640.5923101,935684195.9821601,943320744.0679699,949573145.8835,954198882.28611,958647075.33431,963183620.16371,967767371.44634,972398389.16007,977118923.48837,981933464.6250899,986830933.7717199,991813636.66495,996882715.43006,1002039688.25052,1007285893.37619,1012622692.376,1018051350.18221,1023574202.3677,1029192001.558,1034907176.7041,1040721253.2194,1046636398.0463 +Q9,Banana,Q9 Option 3,,530297034.97987,537695934.96109,546543587.25609,550784254.7356601,554638896.59934,559264507.85288,565952989.00616,570847184.21646,574449574.53525,578972647.35748,583693542.77496,587621108.2583699,590600476.2631899,593462559.52891,596379184.26642,599329757.59848,602312368.99063,605353132.95003,608455683.1784,611613085.35823,614826881.19572,618097897.85596,621427197.12036,624815718.57433,628264428.38091,631774244.74121,635346737.36468,638982512.03799,642683209.03878,646449927.1127499,650284152.7742399 +SQ1,Group Constraint - Wide Bay,SQ1 Option 1,,1015420584.45364,1036031191.5186,1055625666.3406,1067273989.8576,1077883323.5552,1090246003.8699,1106732487.5848,1119502294.4225,1129896899.1991,1142363701.7071,1155333117.7474,1167093877.8772,1177573536.1613,1188210971.884,1199173062.0127,1210407720.5024,1221921692.5723,1233778075.1453,1245990340.3304,1258554098.2363,1271481824.0563,1284784878.9635,1298475578.2781,1312566368.681,1327070201.9299,1342000259.9183,1357371598.2117,1373197766.3099,1389494830.9503,1406278278.4393,1423564966.7334 +SQ1,Group Constraint - Wide Bay,SQ1 Option 2,,901393030.95413,920461261.98135,938085908.36363,948600394.54433,958139678.3377601,969286849.07381,984111014.45253,995584134.2612,1004956825.80391,1016197062.03186,1027886144.8393,1038510765.2565,1048044353.5962,1057747762.8086,1067754211.9912,1078014850.2381,1088536352.5058,1099375744.6126,1110545205.4265,1122041364.3745,1133875861.6439,1146059357.8174,1158603393.2889,1171519651.0143,1184820287.459,1198517682.0961,1212625918.0146,1227157762.6599,1242128248.1766,1257551919.9619,1273444581.0135 +SWQLD1,Transmission Limit Constraint - Darling Downs,SWQLD1 Option 1,,26461391.615065,26493664.525684,26558987.360737,26539529.409396,26527439.31679,26527870.495559,26662484.653876,26789717.511898,26837214.557399,26907839.049206,26993438.935754,27067659.767854,27133777.773011,27187765.584908,27241412.581978,27296757.146246,27352629.403757,27410078.64138,27469612.247456,27530781.263698,27593617.695275,27658111.349004,27724259.292181,27792042.839001,27861450.543772,27932458.995777,28005069.671551,28079252.093375,28155002.900859,28232305.230955,28311148.666454 +SWQLD1,Transmission Limit Constraint - Darling Downs,SWQLD1 Option 2,,6752955.360533901,6730696.1178262,6816423.6961393,6870659.254316499,6876020.1374351,6961392.0429059,7064624.787814699,7063413.9802363,7060271.7029682,7081259.5309181,7102385.3904513,7117625.6582602,7118141.423137,7121150.1483235,7126355.6521,7131712.421286601,7137704.259378,7144880.2490087,7152972.9886719,7161917.404924399,7171710.2952127,7182339.7688477,7193798.347434199,7206075.4437071,7219162.5803189,7233048.4368285,7247729.4471493,7263191.708431399,7279431.6474601,7296440.1484138,7314211.5098308 +SWQLD1,Transmission Limit Constraint - Darling Downs,SWQLD1 Option 3,,487944190.6789,489165529.5159,492995681.36641,494576876.22211,496395665.72165,498264276.36333,502403686.1275,506140538.17528,508413918.1791199,511213339.13238,514284839.05166,516928009.609,518980503.03174,520782842.3021,522583883.4436199,524412209.3226599,526250866.36435,528120169.65369,530028565.58186,531967955.71079,533939148.06153,535942242.02016,537977455.70654,540044775.88277,542144261.1011,544275820.631,546439876.55782,548636081.8449199,550864812.245,553126055.6402899,555419994.91747 +SWQLD1,Transmission Limit Constraint - Darling Downs,SWQLD1 Option 4,,263815090.24782,264636623.83333,267393249.91445,268816639.43013,270269546.20425,271876351.10129,274619069.03735,276894673.61937,278448060.22952,280339739.84672,282368327.455,284143008.57723,285523137.55218,286789723.12406,288064312.94126,289354797.40316,290655604.37216,291977995.22796,293325594.60941,294694448.86493,296085088.93614,297497685.99927,298932500.02631,300389672.05181,301869379.66729,303371749.24378,304897188.40677,306445654.69315,308017558.27416,309613071.54799,311232494.70948 +SWQLD1,Transmission Limit Constraint - Darling Downs,SWQLD1 Option 5,,931517934.6652899,948798166.32641,966307878.40965,977094833.0561199,987110886.94615,998586881.0084,1013767505.15336,1025730788.6567,1035558234.9555,1047235674.7244,1059392565.7738,1070512950.6375,1080442121.0331,1090502930.1246,1100857925.0678,1111468909.4297,1122343257.7389,1133537262.6377,1145064159.9895,1156920428.5129,1169117752.1821,1181666811.9458,1194579188.9299,1207866554.889,1221541080.5447,1235615146.3884,1250102861.9849,1265016945.9012,1280372458.7943,1296183935.8784,1312467167.9316 diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_SA.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_SA.csv new file mode 100644 index 00000000..f867e717 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_SA.csv @@ -0,0 +1,14 @@ +REZ / Constraint ID,REZ name,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +MN1,Group Constraint - facilitating power out of mid-north SA,MN1 Option 1,,613883210.6395311,620000000.0,631431144.7379472,639464374.1010038,646969264.7707138,655434117.0110112,666266854.546408,674949780.5413734,682294324.09073,690900070.303616,699837122.8510742,708196123.2199512,715898576.5731578,723776849.2225882,731884499.2498426,740194946.9095324,748715917.6433129,757485385.0736579,766512398.9068172,775795939.4575795,785344717.5194798,795166796.2680613,805270901.2321943,815665813.9350239,826360697.5448827,837364839.0069206,848688725.4593575,860341933.396685,872335605.6795493,884680564.6750513,897388496.9777148 +MN1,Group Constraint - facilitating power out of mid-north SA,MN1 Option 2,,792419534.8604755,800000000.0,812923319.4998438,821817476.050863,830106123.3158381,839355786.9886608,852248098.645007,862945128.7080632,871498061.3676172,881573824.3875172,892137652.9175687,902021593.4089445,911280940.6156739,920689068.8573494,930380515.1547168,940337683.5833405,950553816.1331797,961081075.9714206,971934439.3845061,983110429.6835816,994620264.8230656,1006474286.454956,1018683569.929535,1031259299.689249,1044213120.074884,1057556809.475117,1071303687.116321,1085465985.581347,1100057821.253695,1115092968.266933,1130586279.554927 +MN1,Group Constraint - facilitating power out of mid-north SA,MN1 Option 3,,951240978.3412315,960000000.0,974730951.4339454,984606803.8930093,993843334.172055,1004105934.46193,1018872550.274782,1031216851.5082,1040865771.369315,1052273034.400616,1064272232.404075,1075439348.64266,1085837960.609213,1096343679.354413,1107160344.551039,1118274357.540403,1129672056.939372,1141415328.156765,1153522515.508647,1165987961.98842,1178824156.401148,1192042506.477711,1205655216.180418,1219674587.616879,1234113428.379898,1248984668.559425,1264303021.833321,1280081889.831738,1296336848.140144,1313083036.962594,1330336819.260766 +MN1,Group Constraint - facilitating power out of mid-north SA,MN1 Option 4,,1892798604.6674,1909449310.6416,1937609133.4313,1955250573.0062,1971867540.6648,1990368566.9834,2017673072.7613,2040270877.8164,2057473294.6574,2077993458.1493,2099624597.1242,2119383266.7114,2137159433.4861,2154889371.4774,2173103739.2179,2191784997.5084,2210901513.8777,2230568615.8923,2250819185.4775,2271637070.3587,2293041824.9508,2315050734.8963,2337682386.2068,2360955368.9671,2384889035.9687,2409502830.6318,2434819404.0216,2460858602.8051,2487644356.014,2515199470.5134,2543548847.8115 +NSA1,Group Constraint - facilitating power out of north SA,NSA1 Option 1,,477897780.9866431,484000000.0,492413421.5648956,496969173.3914627,501140086.7546431,506027005.6729072,512758945.6463698,517814849.7098485,521737032.4043657,526539149.1434639,531535204.4867577,535861737.5703932,539396244.5836138,542887264.583931,546459844.2286599,550092804.392805,553786632.3013039,557566476.9064869,561436284.3532387,565391080.7235754,569433504.800606,573565586.9396434,577789638.8193766,582107902.8058456,586522700.6842631,591036348.0552533,595651829.5109563,600371284.4666317,605197863.3669952,610134271.517199,615183643.674221 +S2,Riverland,S2 Option 1,,152018773.8975,152577405.84391,154494027.70131,155566952.26638,156665577.90881,157847145.41003,159632895.2496,161105536.57589,162186863.43975,163477991.87457,164844550.67823,166043351.58316,166974607.80831,167846392.0549,168725481.99301,169614854.3172,170512640.75246,171425298.74641,172354725.59561,173298846.00466,174258056.49958,175232554.22325,176222595.99093,177228376.19609,178250110.20918,179287990.08158,180342381.38299,181413373.82564,182501344.18053,183606521.3615,184729220.12508 +S4,Yorke Peninsula,S4 Option 1,,640110849.53599,647932431.38735,659782835.11373,667035353.2479899,673747198.68379,681462722.9608699,691595664.96215,699426369.3558899,705827415.68098,713486433.2691,721435168.51035,728591279.09211,734837254.9254899,741145127.30973,747623916.6647899,754243124.9056699,761008142.60708,767955364.52383,775091620.80134,782412986.0967699,789925576.52358,797634755.26421,805546412.87867,813666424.7543,822000905.47711,830556020.54811,839339006.8217399,848356047.4156,857614814.9147,867122501.36828,876887034.03818 +S4,Yorke Peninsula,S4 Option 2,,196068224.42676,198579714.13058,201562310.55372,202858633.13318,204027749.47298,205459272.76174,207690787.29585,209316912.0933,210435713.61912,211875644.60366,213389050.71921,214609478.99235,215492305.78597,216316335.12295,217153180.17275,217997138.76086,218845949.54847,219709078.14323,220587932.0394,221479550.12241,222384230.14318,223301992.36588,224232921.81856,225177048.43924,226134400.333,227104971.39004,228088979.01741,229086287.37389,230097109.18235,231121454.52396,232159454.45393 +S6,Roxby Downs,S6 Option 1,,1350136028.8663,1369019739.453,1392476204.5988,1404074929.7777,1414596525.729,1427193799.9611,1444917366.4493,1457863567.2862,1467624644.8642,1479817874.9674,1492500665.0152,1503133685.3891,1511398414.904,1519452260.5987,1527679277.3731,1536017406.9703,1544466578.1093,1553094794.9007,1561910800.4683,1570898336.6343,1580062383.904,1589406111.227,1598933357.5943,1608647702.3304,1618552830.663,1628652313.7702,1638951474.3061,1649453194.0597,1660163044.1503,1671085243.3948,1682225081.8617 +S7,Eastern Eyre Peninsula,S7 Option 1,,178554863.5726039,179000000.0,181314031.6347606,182647672.3792952,183986739.5612854,185463312.6918155,187623248.4855899,189345322.6830947,190626392.5468785,192160248.1932216,193779331.2792208,195199961.2380146,196273962.7589206,197274154.8199582,198280388.6259703,199294689.5804633,200315672.1685362,201350678.8518184,202401554.9025728,203465801.2436545,204543705.9549946,205635326.1323448,206740787.0221941,207860130.3733725,208993415.2325113,210140677.4958007,211302140.8641351,212477689.7153661,213667553.3429108,214871771.1545429,216090473.9892741 +S8,Western Eyre Peninsula,S8 Option 1,,1457653807.6692,1478114718.3207,1504016379.3964,1517752849.2594,1530209130.6918,1544962819.1202,1565383247.2552,1580617472.4719,1592395677.099,1606903279.0762,1621989897.6347,1634998432.6878,1645709389.6705,1656337586.3573,1667233712.0303,1678327319.6772,1689619764.6553,1701189607.7913,1713048829.3847,1725182711.9456,1737599925.2802,1750307263.4861,1763312403.527,1776622862.4935,1790246421.2159,1804190826.9206,1818465932.6784,1833079076.3591,1848040648.6959,1863359738.0163,1879046795.1332 +S8,Western Eyre Peninsula,S8 Option 2,,676328487.25196,685333230.14221,697381267.16187,704121008.62068,710209400.18697,717386261.5843,727237451.48237,734678262.5531601,740519371.26758,747641886.91038,755049459.3453801,761571595.4911801,767110414.2133499,772647859.8598,778328230.22471,784118122.01318,790018891.39715,796067657.65188,802270641.16475,808621729.48818,815125624.52059,821786186.94277,828607736.28149,835594527.60513,842750973.41125,850081516.54275,857591595.12895,865285501.30435,873168994.9810699,881247259.6116,889526147.26421 +S8,Western Eyre Peninsula,S8 Option 3,,1701588667.3417,1725174991.195,1755628788.2914,1772649314.3498,1787923218.6443,1806009382.4148,1830925847.4052,1849739562.0865,1864490568.3127,1882504155.8056,1901241160.9296,1917764917.4794,1931934212.7025,1946144901.8206,1960737715.1418,1975624759.1199,1990808379.9181,2006384074.7287,2022368000.9178,2038745247.5185,2055528428.2129,2072728043.7106,2090355776.9675,2108423197.9082,2126942295.9969,2145925157.4363,2165386426.3987,2185337912.1092,2205795128.3683,2226772186.7774,2248284934.1211 diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_TAS.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_TAS.csv new file mode 100644 index 00000000..823df66d --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_TAS.csv @@ -0,0 +1,11 @@ +REZ / Constraint ID,REZ name,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +T1,North East Tasmania,T1 Option 1,,796020974.91034,822344049.86902,842948956.79607,858667637.01581,873818206.8509101,890721751.8272699,911140004.3643199,928782510.50664,945069276.36633,963621244.8735399,983069828.3636899,1002278315.85788,1021289349.9924,1041252446.3595,1062171428.0647,1084031265.0,1106887423.9664,1130838516.1176,1155940319.8544,1182239211.6137,1209797925.8036,1238681026.7173,1268957162.031,1300698256.3103,1333980199.381,1368882524.5463,1405490493.0469,1443891870.1232,1484181007.38,1526456165.6758,1570821723.8155 +T1,North East Tasmania,T1 Option 2,,596049691.20431,616252545.3899399,632139047.15216,644369506.71068,656231024.57058,669390502.64,685100374.7684,698726297.27059,711405494.65416,725808656.83029,740894690.78276,755808515.54171,770565249.70541,786071113.0660601,802317901.38422,819295033.40276,837047763.90113,855651023.26287,875147875.29315,895575020.23678,916981259.2047899,939416854.36505,962935246.2033899,987592429.3057,1013447490.83497,1040562347.5044,1069003360.6012,1098838865.2853,1130142297.2795,1162990151.2798,1197463670.3151 +T2,North West Tasmania,T2 Option 1,,240158121.32287,245560419.8226,250879159.27191,254586275.6359,258158862.14663,262175904.42908,267131249.98,271240013.49652,274906543.47741,279140768.68203,283569301.10664,287811406.62947,291791678.50624,295911430.70172,300206551.67196,304671444.94199,309317052.14531,314164945.35644,319225444.63856,324505562.82011,330016567.28876,335769922.98238,341777864.57181,348053168.05617,354609318.17138,361460432.93413,368621757.72104,376108781.1806,383938365.03702,392127947.06682,400696110.1248699 +T2,North West Tasmania,T2 Option 2,,806421132.37501,826753641.60814,845303700.2937,858303003.64266,870849943.20393,884899894.17618,902180865.1231,916664545.40036,929665674.8667101,944642904.78797,960313414.73353,975388697.98375,989703925.2707,1004574277.2752,1020100015.3061,1036262780.4327,1053102124.4453,1070695560.3399,1089081686.778,1108288103.7628,1128357215.3429,1149332288.067,1171259443.797,1194186898.0196,1218165533.1492,1243248622.5686,1269493597.3795,1296959012.8868,1325708390.6445,1355807546.4365,1387326564.7603 +T2,North West Tasmania,T2 Option 3,,980249858.3200899,1011624410.93204,1036585670.1248,1055171953.6109,1073182331.4222,1093167404.7399,1117381738.6424,1138295147.1917,1157493783.3462,1179389156.9149,1202332190.1092,1224844341.8781,1246946535.2317,1270108024.325,1294364069.8321,1319697724.1861,1346172437.66,1373903831.0907,1402956386.2891,1433382245.3067,1465253356.13,1498643662.6135,1533631802.9747,1570300154.6287,1608735631.5171,1649029289.0076,1691278845.2048,1735584738.0926,1782055082.6186,1830802383.6217,1881946201.7415 +T3,Central Highlands,T3 Option 1A,,221507385.5502038,224000000.0,227865577.1636066,230108456.279586,232253734.7652205,234728411.0694653,237972546.6076852,240447901.7142036,242468783.3194285,244890999.8748375,247415689.9858974,249660360.7686591,251486707.7182396,253292417.2226025,255144947.2463659,257038389.1604425,258976274.0624406,260970294.984416,263023456.1567437,265135060.0835717,267307704.7745396,269543804.3528113,271846011.4503967,274217023.2457049,276659694.5530633,279176989.5641193,281772298.0477268,284448724.0659229,287210001.0312126,290059787.3166309,293002083.2153419 +T3,Central Highlands,T3 Option 1,,604279994.3647635,621000000.0,635731666.2767627,646456717.1476034,656873223.5588092,668444328.8362018,682419699.8677319,694301209.2319183,705158203.934659,717575633.5231466,730562915.9401212,743184995.1443596,755334543.6001011,768008341.0345731,781252726.1088649,795055345.3025202,809452428.2623171,824506904.6827773,840252158.8553181,856714213.7947937,873930321.6866441,891938645.5422148,910779832.9624068,930496410.3959317,951133256.3168057,972737378.1483028,995359327.8348192,1019050844.574571,1043867855.10506,1069868422.91779,1097114312.003891 +T3,Central Highlands,T3 Option 2,,506332096.39259,524790191.59051,538696377.6449699,549553550.59356,560066042.12822,571709063.45895,585602884.29651,597756346.32249,609108182.1206399,621974513.0043601,635457599.9911699,648857230.4703699,662241268.8418,676333208.59991,691107570.96223,706555740.9071,722718417.1361101,739663031.6789199,757429322.6747301,776051669.76448,795575072.23615,816045936.46466,837513584.62515,860029715.50313,883648878.2076399,908428251.09832,934429056.4077699,961714435.15128,990352145.11268,1020412820.7733,1051971458.0952 +T4,North Tasmania Coast,T4 Option 1,,370540722.99223,382269103.42229,391670677.82254,398738703.72319,405598143.2921,413190015.60384,422390111.71184,430366049.10648,437691441.4729199,446033275.54369,454776471.64299,463372572.57618,471822988.79059,480676234.20017,489946032.94317,499626927.6444,509742950.48935,520337904.6708199,531436481.41806,543058600.30835,555231683.04056,567983919.51908,581345287.88493,595347189.25155,610022755.12957,625406700.68978,641536271.27298,658449754.7555101,676188361.9420301,694794980.98096,714315184.1576899 +T4,North Tasmania Coast,T4 Option 2,,430866400.17984,445449660.11593,456793352.9763,465565117.78759,474048384.66549,483468446.5059,494796536.36269,504650227.0019,513786023.26921,524164380.45833,535044247.13889,545822164.37286,556524403.1801101,567769768.7888199,579553920.6952399,591869900.7536399,604749253.8614199,618246630.75396,632393586.61349,647216674.12166,662751362.0930899,679034184.68786,696103980.07163,714001444.29841,732769518.67188,752453209.0989699,773100739.82376,794761784.8440399,817489712.7536601,841340122.93628,866372062.94302 diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_VIC.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_VIC.csv new file mode 100644 index 00000000..07fe986d --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_slower_growth_VIC.csv @@ -0,0 +1,19 @@ +REZ / Constraint ID,REZ name,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +SEVIC1,Group Constraint - South East Victoria,SEVIC1 Option 1,,396917286.2896697,400000000.0,408646703.4601024,415048703.234476,421113674.7755846,427971067.3746756,436441926.6836044,443475770.4693829,449758607.2967355,457030337.2255139,464623091.4433994,471910088.8004934,478917050.2702168,486224886.9855524,493852211.247394,501783267.7292391,510034834.9542828,518644328.1197706,527628493.6863307,536998899.328473,546774301.5306797,556973704.1248887,567617326.6855469,578726243.1123909,590322616.9731302,602429548.0734702,615071944.7300552,628275039.5641239,642066183.0147052,656473574.6828547,671527202.2860924 +SWV1,Group Constraint - South West Victoria,SWV1 Option 1A,,1196025950.8745,1204280241.7961,1229369308.6365,1247679074.7942,1265156170.9321,1284877138.9801,1309248401.059,1329344147.2939,1347195941.173,1367888516.0928,1389487213.048,1410078357.1414,1429545295.9982,1449751015.5782,1470806075.7673,1492669167.1894,1515387454.4456,1539065138.1383,1563747277.0242,1589462903.8546,1616261901.0733,1644194621.5787,1673314705.3416,1703677981.6778,1735343187.1496,1768371498.1661,1802829054.3306,1838782550.2199,1876304592.6606,1915469865.8113,1956357867.3347 +SWV1,Group Constraint - South West Victoria,SWV1 Option 1C,,827557686.7057899,833436520.78763,850879424.6517899,863473774.73361,875531496.09176,889092434.35383,905798489.51538,919541700.72804,931745642.4307699,945891631.82177,960645046.12381,974657596.97366,987804943.5260301,1001428237.69409,1015613105.26994,1030330647.3069,1045613367.0245,1061531251.3671,1078114041.8228,1095380495.4776,1113363531.9339,1132096333.5155,1151614274.9461,1171954152.4962,1193154680.9135,1215256179.7865,1238302286.3251,1262336907.5887,1287407945.4276,1313564609.1893,1340859310.7748 +SWV1,Group Constraint - South West Victoria,SWV1 Option 2B,,1299904716.572787,1310000000.0,1335343783.117319,1352550815.501694,1368921999.788435,1387502850.800076,1411135641.802277,1430300888.735949,1446823886.60664,1466170407.253834,1486375476.502498,1505290389.963977,1522666654.478679,1540526218.524651,1559085582.827526,1578303650.534647,1598215989.246725,1618921524.331276,1640458800.24444,1662846122.529707,1686123899.218604,1710332449.024612,1735514849.326771,1761715810.633015,1788982374.165822,1817363490.197298,1846912454.936898,1877682367.202303,1909731700.15097,1943120218.942804,1977911744.258233 +SWV1,Group Constraint - South West Victoria,SWV1 Option 3A,,1481759290.3932,1492583085.1989,1524174914.0093,1547374502.7971,1569578588.267,1594481457.9341,1625288307.7869,1650964528.4439,1673808151.119,1700228020.9915,1727818712.8563,1754191765.368,1779327893.9612,1805464879.0754,1832721656.114,1861049585.9775,1890507618.0529,1921230138.4095,1953277275.6257,1986688657.8643,2021530506.1926,2057869798.2748,2095777811.0377,2135328792.8075,2176600845.1576,2219675317.0201,2264640052.0445,2311583855.1555,2360603153.2533,2411797273.3565,2465271878.3463 +SWV1,Group Constraint - South West Victoria,SWV1 Option 3B,,1767896440.8501,1782517826.651,1818038988.0008,1842521947.4067,1865762240.7004,1892110493.5339,1925507982.0873,1952809117.2922,1976507003.0386,2004192045.4899,2033113690.0769,2060346749.8902,2085741162.132,2111964882.9853,2139262997.9124,2167575828.4235,2196955796.6026,2227546804.5325,2259407377.9874,2292568948.8334,2327093942.9337,2363044965.3723,2400488785.0619,2439494827.6599,2480136114.441,2522488662.5185,2566634972.5218,2612657740.5939,2660647494.6231,2710697061.8191,2762905429.0883 +SWV1,Group Constraint - South West Victoria,SWV1 Option 3C,,365061069.02751,370297678.30496,376349182.97205,378975541.49822,381393288.03149,384296763.05378,388596574.82297,391695026.80116,393887536.67756,396699542.18954,399635620.83574,401958955.37902,403571499.31303,405074117.55838,406599632.78838,408134896.50977,409677492.70397,411244955.98783,412839363.38786,414455303.35237,416093296.74181,417753344.47265,419435565.68599,421139989.19972,422866630.59383,424615431.31607,426386768.44293,428180337.8082,429996500.19557,431835220.57552,433696700.26596 +SWV1,Group Constraint - South West Victoria,SWV1 Option 4,,1914027393.352311,1930000000.0,1968150761.692633,1994221390.014061,2018966727.053971,2047036813.634321,2082744621.71218,2111876976.001847,2137064918.121418,2166529990.883234,2197315464.55642,2226231913.045321,2253093090.934491,2280796615.919676,2309627803.873167,2339522972.133876,2370536022.428771,2402820740.559691,2436438873.47232,2471422295.432351,2507836439.135403,2545746837.730101,2585223395.230177,2626338781.583054,2669169426.344934,2713794882.189074,2760301563.331966,2808775968.184879,2859312911.170849,2912009540.745122,2966969492.836639 +SWV1,Group Constraint - South West Victoria,SWV1 Option 5,,505815603.1303431,510000000.0,520076306.0118135,526892446.7801064,533366489.6986254,540716576.981796,550034535.3967274,557575543.6463941,564086386.4803809,571713868.7452074,579676081.611544,587119032.9463809,593954027.3009523,600985290.5859765,608295332.8140609,615866578.1586652,623713208.7175413,631874402.8031392,640365283.9011363,649193247.8697186,658374364.5951611,667924683.3972813,677861342.7551719,688202143.758607,698965808.6448085,710171821.4618081,721841389.3763126,733995657.2529241,746657891.7197344,759851880.9193642,773603026.2018646 +V1,North West VIC,V1 Option 1,,745171358.8533059,750000000.0,765356519.7956505,776522092.7471138,787120702.6087527,799127278.3089799,814004894.9901592,826173435.9824411,836944182.458062,849441201.3181386,862479066.5079573,874897675.4561954,886557033.0159308,898627551.7554122,911186696.4228629,924207138.9043443,937717065.5768484,951778036.6721083,966415820.4831346,981646168.5262771,997497403.7568294,1013998045.309767,1031178523.998161,1049070467.446256,1067707155.32867,1087123274.540087,1107356366.8429,1128444146.591798,1150427839.061496,1173349758.216147,1197254980.754756 +V1,North West VIC,V1 Option 2,,1257673272.840312,1270000000.0,1294687784.146109,1310443086.748708,1325188518.660851,1342188475.693654,1363996315.433825,1381208164.200279,1395841981.229478,1413161150.938954,1431212462.161213,1447842911.115928,1462802284.337862,1478116672.16282,1494007112.843042,1510419996.571934,1527385877.768941,1544993890.661458,1563274306.262598,1582238413.322642,1601918181.433491,1622345190.82935,1643553302.517309,1665577601.084147,1688454976.483531,1712223820.903786,1736926188.882984,1762603508.408555,1789301913.056672,1817068256.663451,1845952746.552073 +V2,Central Highlands VIC,V2 Option 1,,357575755.1640192,360000000.0,367386912.1763411,372707013.5375471,377777014.0749703,383497499.2803757,390580588.0562293,396381814.8409958,401512045.765049,407463644.5068939,413670798.7568098,419566459.6384315,425079967.611353,430782557.7110785,436714091.5410498,442861867.2636634,449239241.5364923,455875337.1272669,462782303.0779647,469967432.7675471,477444023.6234477,485225453.0623074,493325997.9424261,501760494.7762043,510544554.3588639,519694443.7825573,529227781.5836282,539162248.6762753,549517189.7693573,560312449.1569679,571569173.1448263 +V7,Central North VIC,V7 Option 1,,982765118.382567,990000000.0,1010784312.733994,1026057583.161212,1040538011.987347,1056889362.613027,1077261789.797002,1094172661.1513,1109160685.715852,1126522644.32738,1144661754.126517,1162033452.695219,1178645128.813024,1195922446.197663,1213939856.804601,1232661867.70248,1252125889.385564,1272421183.604406,1293587267.42557,1315649803.675888,1338652181.87056,1362638280.074919,1387654804.634523,1413750402.710421,1440976238.627901,1469385639.736953,1499036168.20154,1529986008.07114,1562298363.235855,1596038324.795578,1631275143.5599 +V7,Central North VIC,V7 Option 2,,784953511.7871965,790000000.0,806368923.6036471,818462019.8069428,829996612.7182901,842956640.3897738,859032247.4083326,872374156.468803,884211144.0428448,897896785.1948856,912187885.2825586,925863839.7053032,938838261.0759511,952297335.2657552,966314328.2880381,980863496.2989457,995974852.6075218,1011716557.217118,1028118659.270976,1045200157.453153,1062993779.301664,1081532575.105358,1100851758.2953,1120987966.966804,1141979745.488382,1163867269.699904,1186693943.718329,1210503533.091222,1235343698.955535,1261263460.567375,1288314989.750364 +V8,Gippsland Offshore,V8 Option 1,,1491358134.923465,1500000000.0,1529086255.458773,1550246436.94244,1570636263.204738,1593387320.562753,1622166118.971247,1646247691.159169,1667279846.106239,1691627910.584714,1717108681.452548,1741387195.218376,1764255025.892612,1787864801.007256,1812433770.771767,1837931504.231215,1864403284.378269,1891972789.462735,1920694970.359659,1950600281.265695,1981745687.374393,2014188511.996349,2047989831.137231,2083213133.362389,2119925232.548819,2158195696.793602,2198099852.635359,2239713450.949344,2283119164.001666,2328401924.947208,2375652177.372396 +V8,Gippsland Offshore,V8 Option 2,,784792336.9919555,790000000.0,805723936.25623,817031099.7077165,827835668.9333256,839961260.2663894,855275178.6587913,867976369.072584,879062421.5703095,891928057.6679341,905381676.1894101,918166727.9742932,930183384.1266497,942597466.7337495,955519101.9346116,968926491.771497,982843663.6038145,997336416.775533,1012433058.745366,1028149404.31991,1044515277.803517,1061560690.618413,1079317618.094333,1097819314.177369,1117100757.808974,1137198386.444362,1158151657.460991,1180000229.406534,1202787412.085726,1226557678.778871,1251358404.115678 +V9,Southern Ocean,V9 Option 1,,10043362.57007525,10000000.0,10120246.83867738,10197923.0741663,10196958.23117304,10322766.3761095,10476498.35283756,10466926.76722563,10454904.03660551,10479991.74343925,10505199.68575941,10522812.89091885,10519726.64914409,10520858.76094055,10525479.8821829,10530355.25175236,10536216.53752379,10543915.74817932,10553029.92127402,10563460.81276479,10575202.11238172,10588234.66312734,10602545.95538663,10618118.76386564,10634939.13953816,10652989.01714297,10672261.50884744,10692734.94256818,10714402.50835441,10737249.53243834,10761266.23479978 +WV1,Group Constraint - South West Victoria,WV1 Option 1,,1338425644.012764,1350000000.0,1375257270.046063,1391292558.638392,1406432769.604858,1423766164.170742,1446161510.171448,1463850994.427353,1478740362.527359,1496358701.151769,1514733743.216435,1531581514.720468,1546473253.759525,1561606192.363509,1577269971.732952,1593417058.546966,1610075092.873348,1627332972.606009,1645220018.174971,1663743917.646846,1682934084.842286,1702819338.672288,1723430651.055054,1744800017.609042,1766961093.25766,1789948880.635231,1813801924.083755,1838557807.234779,1864258797.663343,1890947596.169924,1918670060.775816 diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_NSW.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_NSW.csv new file mode 100644 index 00000000..9c56fdff --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_NSW.csv @@ -0,0 +1,33 @@ +REZ / Constraint ID,REZ name,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +DN1,Dubbo,DN1 Option 1,,601000000.0,607478761.40951,615510308.8511931,623711507.3125128,632784141.3755728,644422545.7328609,653187512.1584371,660982420.8188527,670158012.4343486,679561639.3664582,688256120.620797,695695666.677292,703311906.702127,711065348.1993197,718955904.7564884,726989319.7412215,735204989.3905206,743602321.2957247,752179036.2241426,760940293.3684945,769891435.696362,779036888.2347529,788381741.5897425,797931197.2265135,807690801.4109334,817666127.571898,827863132.9858402,838288123.4647943,848947261.3660537,859847590.9115883,870995973.2275836 +DN1,Dubbo,DN1 Option 2a,,125000000.0,126347496.1334255,128017951.0921783,129723691.2047655,131610678.3227065,134031311.5084985,135854307.8532523,137475545.0954353,139383946.0137996,141339775.2426078,143148111.6099827,144695438.1608344,146279514.7051013,147892127.3293094,149533258.0608337,151204101.4436817,152912851.3707406,154659384.6288945,156443227.1680829,158265452.0317168,160127170.4859322,162029302.8774444,163972907.9845554,165959067.6427857,167988935.4016084,170063670.4600453,172184511.8522962,174352771.1033266,176569729.9014255,178836853.3509959,181155568.474955 +DN1,Dubbo,DN1 Option 2b,,280000000.0,283018391.3388733,286760210.4464793,290581068.2986748,294807919.4428625,300230137.7790368,304313649.5912852,307945221.0137749,312220039.0709112,316601096.5434414,320651770.0063613,324117781.4802691,327666112.9394268,331278365.2176531,334954498.0562675,338697187.233847,342524787.0704588,346437021.5687237,350432828.8565057,354514612.5510457,358684861.8884881,362945638.4454756,367299313.8854042,371748311.5198399,376295215.2996029,380942621.8305016,385693306.5491436,390550207.2714515,395516194.9791931,400594551.5062308,405788473.3838992 +DN1,Dubbo,DN1 Option 3,,943000000.0,953165510.8305624,965767423.0393927,978635526.4487512,992870957.2664977,1011132214.020113,1024884898.444936,1037115512.199963,1051512488.728104,1066267264.430233,1079909353.98571,1091582385.485335,1103532658.935284,1115698208.57231,1128078898.810929,1140683741.291135,1153574550.740867,1166750397.64038,1180207705.756017,1193954570.127272,1207999374.145873,1222349060.907441,1237011617.835486,1251995206.297175,1267308528.669734,1282960329.950582,1298959957.413723,1315317305.203496,1332042042.376354,1349145221.679913,1366637608.575061 +DN2,Yass,DN2 Option 1,,271000000.0,273921371.6172666,277542917.9678425,281240962.5319317,285331950.6036277,290579883.3504248,294532139.425851,298046981.7669036,302184394.9579176,306424632.7259737,310345105.9704425,313699709.9326891,317133987.8806596,320630132.0499429,324188103.4758875,327810491.9299019,331515061.7717655,335301545.8754433,339168916.5004037,343119500.0047621,347155705.613501,351279528.6382996,355493264.5105162,359799258.6495594,364200011.9506871,368698037.5573783,373296021.6957783,377996807.7520121,382803174.4262904,387718298.0649591,392745272.4537024 +DN3,Marulan,DN3 Option 1,,306000000.0,309298670.5346257,313387944.2736524,317563596.0692661,322182940.5339854,328108650.5728045,332571345.6247616,336540134.3936254,341211899.8417816,345999769.7939038,350426577.2212377,354214432.6177227,358092251.9980879,362039927.7021495,366057415.7329209,370147640.3341327,374330660.1555729,378606173.5715337,382973020.1074669,387433826.5736428,391991313.349562,396647733.4439841,401405678.7461917,406267797.5895393,411236913.8631375,416315865.2861909,421507685.0144212,426815583.6609435,432242698.7986895,437792617.003238,443468831.6266899 +N1,North West NSW,N1 Option 1,,5875680663.271611,5964045724.511308,6034483792.301329,6102977066.979942,6178217943.816307,6283519026.664863,6362875554.27138,6428701059.616747,6509247377.212348,6591959576.557858,6666786208.164043,6732427632.168754,6799344737.554578,6867774721.556422,6937666354.471606,7008956355.294006,7082105090.135842,7157108209.911649,7233938031.721388,7312653687.479148,7393313344.976429,7475968095.665634,7560674498.58927,7647491213.671443,7736480833.135204,7827706181.574308,7921234820.264009,8017137574.54136,8115484918.763444,8216355841.506523,8319828866.663898 +N11,Illawarra Coast,N11 Option 1,,1012045518.382449,1022906022.114453,1034310801.629546,1045801709.865204,1058061069.021135,1075383759.869554,1088670408.728953,1099537274.936624,1112804742.785659,1126438621.539669,1138900537.493416,1149557176.283722,1160345614.808902,1171343500.945666,1182558796.593158,1193977267.687011,1205673028.471407,1217645775.391739,1229889034.544135,1242411051.265999,1255219886.127834,1268322249.458949,1281725724.036192,1295438130.228492,1309467868.432394,1323823275.252627,1338513393.424984,1353547713.425361,1368935570.206388,1384687619.569254,1400814299.578494 +N12,Illawarra,N12 Option 1,,1012045518.382449,1022906022.114453,1034310801.629546,1045801709.865204,1058061069.021135,1075383759.869554,1088670408.728953,1099537274.936624,1112804742.785659,1126438621.539669,1138900537.493416,1149557176.283722,1160345614.808902,1171343500.945666,1182558796.593158,1193977267.687011,1205673028.471407,1217645775.391739,1229889034.544135,1242411051.265999,1255219886.127834,1268322249.458949,1281725724.036192,1295438130.228492,1309467868.432394,1323823275.252627,1338513393.424984,1353547713.425361,1368935570.206388,1384687619.569254,1400814299.578494 +N13,South Cobar,N13 Option 1,,2087785564.724367,2126509141.001057,2155908603.573061,2183949794.885124,2215026152.379594,2256737845.666527,2288607124.165555,2316118748.548315,2349128198.190073,2383000481.61846,2414250150.453334,2442666069.803964,2471928875.866591,2501944680.371903,2532685843.015873,2564149146.992537,2596509441.211402,2629771298.226067,2663935292.396123,2699032572.699362,2735094566.224632,2772150508.503911,2810232087.795538,2849372279.178179,2889605908.692674,2930968393.824917,2973497374.128958,3017232252.93727,3062212787.692352,3108482507.233841,3156085312.422456 +N13,South Cobar,N13 Option 2,,3244030455.865267,3296058057.202763,3337786843.256805,3378338969.126274,3423019492.235196,3483887054.10904,3529953071.364255,3569031037.27867,3616347019.020166,3664897633.750702,3709096892.498635,3748188086.162717,3788211169.308173,3829169024.598534,3871030787.639676,3913779170.759809,3957671052.305583,4002706383.86399,4048875762.55711,4096216909.025334,4144767316.16356,4194560764.889448,4245634303.99448,4298026416.35136,4351777965.759068,4406930203.741303,4463527271.481054,4521615420.784426,4581240911.581934,4642455107.768503,4705309388.137176 +N13,South Cobar,N13 Option 3,,3299132527.060919,3351283143.012551,3393537573.940759,3434624472.608126,3479810592.742211,3541513726.640891,3588262511.443352,3627839078.262167,3675774817.897357,3724966355.456747,3769759011.456275,3809326238.415707,3849814496.040893,3891243358.952914,3933584092.788731,3976816785.42824,4021202405.137553,4066741022.783559,4113422493.162484,4161284768.03406,4210365540.829937,4260698702.273033,4312321448.414401,4365272406.765915,4419592609.641279,4475323459.266634,4532509269.90167,4591196480.06958,4651431514.682364,4713265957.104886,4776751376.665171 +N13,South Cobar,N13 Option 4,,3247137779.175606,3299157866.964792,3340880537.438919,3381427612.427479,3426096975.771362,3486975160.881652,3533051728.613607,3572123681.421775,3619440526.480179,3667992837.905317,3712194626.380805,3751287916.778138,3791311239.171752,3832269434.602792,3874131870.561594,3916880952.032145,3960773810.728453,4005810408.544655,4051981289.800166,4099324179.795811,4147876571.448116,4197672242.820591,4248748239.135598,4301143040.260787,4354897507.879307,4410052889.219759,4466653323.668214,4524745059.561496,4584374354.218152,4645592569.371964,4708451081.158842 +N2,New England,N2 Option 1,,1074604918.9248,1089384763.407,1102484886.3987,1115523252.5503,1129880909.8525,1149382711.2281,1163907467.4871,1176209936.7411,1191124249.7749,1206413551.7837,1220061816.5007,1231635559.7257,1243407471.2588,1255404982.0654,1267617473.3131,1280039156.9847,1292748626.4925,1305742780.0947,1319014828.7852,1332573242.7834,1346426263.1912,1360580714.6552,1375044372.9142,1389825244.8611,1404931943.2773,1420373035.1207,1436157787.9396,1452295985.5604,1468797149.0881,1485672260.8882,1502932054.861 +N2,New England,N2 Option 2,,228184592.8290697,231165092.382409,234009237.077001,236849186.7934693,239951285.159832,244153589.1674013,247327309.3161762,250026860.176178,253276029.9531984,256608428.6975598,259625663.4979421,262210840.2359338,264843053.6307284,267526400.3929581,270259812.2041478,273042095.2986199,275889871.7330446,278802814.5807435,281779653.6153279,284822341.3111822,287932813.8289345,291112694.8927569,294363827.466177,297688107.2940676,301087565.5717081,304564232.5338259,308120292.1080444,311758048.7884947,315479759.8719372,319288003.7339662,323185307.2991745 +N2,New England,N2 Option 3,,905180840.917516,916894986.2290466,928108446.8639827,939333435.3380569,951460854.2343587,968022482.9752889,980663923.7440875,991340993.8227087,1004200614.761781,1017392893.928762,1029375023.132303,1039680272.043846,1050164919.220853,1060855794.78593,1071752252.368967,1082847270.161405,1094207515.492987,1105832370.97636,1117716915.703228,1129869208.751222,1142297233.685107,1155007751.697526,1168008392.698347,1181307015.802062,1194912032.402107,1208831856.118571,1223075532.923988,1237652594.863289,1252572411.978492,1267845637.26026,1283482740.410266 +N3,Central-West Orana,N3 Option 1,,853232977.1935666,855186218.0624954,862397436.5997671,870148021.2970424,877733584.6580002,889816886.0533181,899439095.4244956,906521490.0401118,915431227.1271385,924633491.3036113,933183016.3284097,940052925.8739508,946808648.6516694,953644287.6409081,960592455.0949105,967624380.9934678,974797270.0380944,982111424.6342223,989556830.6165414,997136454.3250204,1004852905.620367,1012707457.398919,1020701907.64921,1028838027.664566,1037117898.113536,1045543312.087968,1054116455.104317,1062839622.492967,1071714835.483691,1080744880.780501,1089932123.54407 +N3,Central-West Orana,N3 Option 2,,1137178264.300679,1151669603.246198,1164980298.696652,1178193448.985883,1192327126.314741,1212266703.070725,1227637078.469753,1240259599.046547,1255662242.896696,1271488498.900063,1285989784.903538,1298649942.661827,1311518307.616595,1324665096.586714,1338095844.913168,1351794846.486194,1365849348.66304,1380260088.498154,1395021549.682817,1410145028.141971,1425641648.795407,1441521134.647763,1457794249.27129,1474472149.18098,1491566737.775314,1509089937.466397,1527054589.267091,1545474137.442308,1564361969.351184,1583733084.525482,1603602372.180952 +N3,Central-West Orana,N3 Option 3,,647737888.6462379,656858465.6165577,665248922.5279756,673513604.3008417,682479312.9311129,694671976.8683803,704005729.4491991,711931325.9765269,721459208.9281931,731236186.9893306,740172637.6215066,747971995.149099,755932642.1163641,764065025.9012649,772367535.6199968,780835695.6408256,789519325.5079483,798418653.5124669,807531157.48995,816863778.5471944,826423426.144446,836216195.4263558,846248838.7265713,856528342.6316618,867062143.0532578,877857727.6334715,888923107.0944917,900266699.8344113,911896872.1150938,923822983.1550825,936054334.1106801 +N4,Broken Hill,N4 Option 1,,1281732102.524768,1296237236.104426,1310074456.207728,1324193506.935922,1339847413.72904,1361458461.288094,1377082836.954428,1390067844.497873,1406018594.841174,1422362315.211193,1436511871.243693,1447834323.667553,1459217844.717544,1470751300.763716,1482418678.690734,1494209692.33267,1506209971.711247,1518411175.527985,1530799651.900716,1543379551.289108,1556154493.739836,1569126173.664398,1582297189.484602,1595670078.806149,1609247832.297693,1623033120.305542,1637029101.742287,1651239238.261734,1665666353.14581,1680314625.078106,1695187594.562085 +N4,Broken Hill,N4 Option 2,,5569035215.262003,5621188564.114655,5681755355.694358,5715098786.115136,5791721456.59174,5894623090.84898,5933784679.229844,5969316909.431225,6020990181.596956,6074722191.021258,6122265337.901711,6158736861.156369,6197215735.188236,6237237364.282244,6277919398.250807,6319466678.751142,6362346463.205256,6406420335.662816,6451640838.704387,6498028149.80615,6545601070.215364,6594371219.060089,6644353994.014696,6695565394.136905,6748023589.347971,6801745751.572772,6856752073.769128,6913064012.506984,6970701504.595694,7029690227.480721,7090054016.593223 +N4,Broken Hill,N4 Option 3,,2632268903.156145,2670243103.080515,2702399959.215463,2733886135.165265,2768104823.208328,2815691389.467541,2852011199.235866,2882249153.685968,2919062913.789097,2956869299.003888,2991399123.843347,3021785035.051667,3052783277.164644,3084487044.445336,3116889771.925684,3149964422.036776,3183917346.059241,3218749488.782931,3254450630.427231,3291049327.955064,3328573814.660344,3367049224.910269,3406503207.291425,3446964466.155064,3488463546.549381,3531031172.883603,3574700326.04088,3619505537.876357,3665481303.451886,3712666050.545881,3761098108.478881 +N5,South West NSW,N5 Option 1,,621480118.3969989,624000000.0,630002929.1512249,636407655.6027322,642858496.1134502,652424175.8467871,659998491.7310274,665907848.5973166,673167517.5561161,680645363.6360818,687599658.9337137,693299592.932276,698978063.1369355,704734489.012631,710589598.8111593,716528513.2743413,722592607.1148548,728782198.4850706,735091294.5140252,741522947.9953319,748080053.178646,754764547.3799046,761578820.84444,768525285.5393642,775606614.1361583,782825328.5252358,790184274.2869251,797686446.3682979,805334660.0861374,813132378.4738147,821082795.8241059 +N5,South West NSW,N5 Option 2,,116067927.9178305,116139815.0459348,117060774.8686918,118103783.6322945,119094121.097888,120672098.8768992,121955062.3127271,122893327.6713423,124070990.4869662,125286807.3513573,126425727.0513824,127330702.3889992,128217378.4942365,129112061.9733402,130020487.1274177,130938825.2463629,131874385.5138969,132827255.5233058,133796053.486241,134781087.9102392,135782623.4668035,136800738.1149451,137835577.5415606,138887278.7254254,139956014.8333729,141041915.2973064,142145159.6901101,143265934.8685276,144404388.3025228,145560763.4764615,146735241.0300378 +N8,Cooma-Monaro,N8 Option 1,,281695855.7624419,289305247.6856601,294686399.8051189,299624037.0014738,305121336.0205016,312100016.6672696,317661036.2547052,322715932.6617378,328616506.2134041,334672415.4138767,340536600.6750957,346259983.7773148,352241672.7733043,358412632.3653229,364769151.9010184,371316004.5622716,378081825.0703129,385070246.5054864,392285576.4865959,399736256.7385377,407430997.5348995,415378368.167452,423587452.7565996,432067745.6401086,440829179.7917556,449881967.2594672,459236864.0514557,468905092.3445169,478898152.6730846,489228338.2306486,499908230.7104419 +N8,Cooma-Monaro,N8 Option 2,,671679252.55855,688282952.37913,700363015.44294,711590598.1732601,723864198.31677,739711153.8893399,752466308.10285,763869140.87415,777235025.09501,790955557.2392199,804203821.3947899,817024343.03471,830380487.72522,844148548.00363,858326093.6969899,872919180.5335699,887994320.61081,903559726.1108899,919623838.9444699,936205179.2391399,953322777.49445,970995280.51451,989242469.0823101,1008085016.11347,1027544568.3239,1047643347.0562,1068404788.5867,1089853337.2069,1112014025.7857,1134913651.9059,1158579613.9473 +N9,Hunter-Central Coast,N9 Option 1,,597558339.5833222,604000000.0,611985554.332008,620139788.1675144,629160467.2796098,640732223.6575472,649446997.0082475,657197267.6843234,666320314.7566202,675670091.2884213,684314783.105195,691711726.1813561,699284351.3778758,706993392.3547792,714838763.1945298,722826174.3749973,730994796.5284085,739344040.6385647,747871640.5249288,756582725.8358132,765482608.9419937,774575689.5303115,783867029.0551986,793361799.195354,803065514.4556409,812983716.3483998,823122328.0353839,833487619.218039,844085716.964572,854923625.1578178,866008165.6333356 +N9,Hunter-Central Coast,N9 Option 2a,,593000000.0,599392521.6569709,607317159.9812937,615409191.0754077,624361057.9629195,635844541.796317,644492836.455829,652183985.9327449,661237439.8894655,670515893.7509313,679094641.477758,686435158.6349987,693950017.7610005,701600252.050244,709385776.2405951,717312257.2488259,725418566.9027933,733704120.6794755,742166669.6853852,750811304.4384646,759643296.7852623,768667012.8505965,777887475.4787309,787309816.8973752,796939509.5452305,806782052.6624551,816843324.2272933,827129546.1141814,837646798.6523625,848402032.2971246,859402016.8451866 +N9,Hunter-Central Coast,N9 Option 2b,,522000000.0,527627143.8531851,534602963.7609364,541726134.4711008,549606192.6756223,559714756.8594898,567327589.5951816,574097876.3185376,582067358.5536273,590234901.41313,597786514.083288,604248149.7596446,610863253.4085029,617597523.7271962,624450885.6620415,631428327.6288147,638564067.3242126,645857590.2102634,653306916.6539142,660916527.6844494,668691063.949253,676634368.816208,684750863.7435035,693045066.476273,701521794.2371168,710185887.8411493,719042521.4951891,728097172.1274918,737355192.0683527,746822699.593759,756505653.9514121 +N9,Hunter-Central Coast,N9 Option 3,,218000000.0,220350033.2566942,223263306.7047589,226238117.4611111,229529022.9948001,233750607.2708214,236929912.896072,239757350.6464391,243085601.8480666,246496568.0231079,249650306.6478099,252348844.1524953,255111473.6456966,257923870.0623156,260786002.058094,263699952.9177809,266680012.7905715,269725966.792792,272836988.1811365,276014948.3433141,279261785.3274658,282579104.2182631,285968751.5250647,289432613.9690182,292972703.3404051,296591041.2823191,300289788.6704046,304071232.8042015,307937608.948086,311891472.2441369,315935311.4203215 +N9,Hunter-Central Coast,N9 Option 4,,459000000.0,463948005.8019386,470081916.4104786,476345394.1038991,483274410.8009782,492162975.8592066,498857018.4371425,504810201.5904382,511817849.7626722,518999654.6908558,525639865.8318566,531321648.9265841,537138377.997132,543059891.5532242,549086123.5993813,555221460.5011991,561495990.2333595,567909260.3573006,574459530.1612004,581150739.8604642,587986970.024343,594971600.165976,602108518.1192876,609401696.384309,616855370.7947062,624473797.9292865,632261527.5216317,640223375.4914153,648364048.1980343,656688925.5048571,665203247.4400349 +SWNSW1,Secondary Transmission Limit - South West NSW,SWNSW1 Option 1,,449425314.8180761,458676172.0465652,465303626.4246219,471528923.6851296,478445984.8425751,487716186.8909131,494842932.526026,501021763.5532824,508421024.3910168,516015321.8297541,523066947.1636699,529597683.5444632,536343186.3679317,543273966.2992436,550382784.2254866,557669239.0147604,565172879.6483381,572895381.9829639,580837810.7785819,589007943.4944999,597413657.0887184,606062402.3475173,614962199.3587009,624121407.0587052,633548833.2822083,643253462.3882644,653244818.9497092,663532864.0490798,674127695.2805381,685040291.4905484,696281775.5525522 diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_QLD.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_QLD.csv new file mode 100644 index 00000000..a06fd96b --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_QLD.csv @@ -0,0 +1,19 @@ +REZ / Constraint ID,REZ name,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +CQ1,,CQ1 Option 1,,206851966.2349,208861269.6851,210827251.19108,212752819.83228,214927330.74703,218168588.81173,220466622.57138,222265574.87411,224543069.11544,226887002.03478,228924528.48412,230560225.60706,232190260.88017,233843662.57423,235517349.82259,237207335.4716,238928051.47984,240678224.87048,242455301.64529,244259787.39022,246092094.41494,247952310.29325,249840659.25481,251757346.48707,253702647.54201,255676774.93884,257680011.86679,259712676.95193,261774991.77634,263867373.13021,265990125.38341 +CQ1,,CQ1 Option 2,,526339827.69993,533575503.76317,538619141.62657,543363837.05714,548836458.8457199,557182968.74643,563043900.70695,567586677.53235,573403491.44171,579389099.8792,584519545.37368,588802012.74446,593091873.38056,597459328.68032,601889087.44362,606369547.87307,610939990.17836,615597033.39983,620334411.42843,625153895.08786,630057024.45504,635044536.7791699,640117540.27614,645277124.62878,650524587.45678,655861093.49168,661288009.4957399,666806820.45585,672418793.7481899,678125724.53383,683929155.8427601 +NQ1,Group Constraint NQ1,NQ1 Option 1,,1767754969.4494,1799130317.8628,1821328641.7913,1841676174.9208,1864868076.5619,1897527988.0227,1921517258.2775,1941447779.2276,1965996694.9428,1991203967.0655,2014021985.6054,2034564502.8189,2055605824.1044,2077166515.0487,2099200165.611,2121687483.0795,2144774438.7226,2168457109.0304,2192727051.2776,2217602482.8512,2243101315.6482,2269239316.0075,2296033877.5114,2323503041.381,2351666020.9007,2380542075.1784,2410151854.3198,2440516973.779,2471658914.5945,2503601691.3352,2536369138.3309 +NQ1,Group Constraint NQ1,NQ1 Option 2,,4755015634.2754,4814969641.4332,4859372481.5725,4901682013.6031,4950191982.4801,5023991556.0897,5075568484.6936,5115266630.1611,5166404230.5411,5219015893.4887,5263759130.952,5300132970.8983,5336420055.7578,5373315477.1105,5410701040.8754,5448473242.967299,5486982382.6594,5526194979.266,5566052473.408999,5606568793.3958,5647755077.3918,5689615555.4152,5732157385.0967,5775387567.2488,5819314846.0136,5863946573.5171,5909291963.3377,5955361049.8036,6002161831.6613,6049706860.4766,6098006466.903 +Q1,Far North QLD,Q1 Option 1,,4097011906.834,4167363791.5846,4219189395.1583,4267754431.6627,4322501371.9535,4398532557.1412,4454792128.1121,4501967224.8302,4559671888.752,4618873215.3916,4672386026.9974,4720102415.336699,4768946565.8345,4818929121.7624,4869959280.2911,4922001098.4855,4975382456.726,5030093918.4265,5086115214.3255,5143486443.0404,5202247104.4282,5262431554.9126,5324077931.8652,5387225726.9966,5451917027.6641,5518193970.1034,5586101768.871099,5655687814.630899,5726998995.0063,5800088022.2968,5875007016.151299 +Q2,North Qld Clean Energy Hub,Q2 Option 1,,1077270557.457,1093817179.9333,1105871439.5806,1117130947.6452,1130007317.5413,1148580206.3092,1161938017.244,1172774294.3711,1186314753.7037,1200225300.9334,1212517253.185,1223154996.4343,1233955122.8931,1244988427.8323,1256226936.5143,1267655022.1073,1279356550.781,1291326627.5673,1303556448.2444,1316053383.2677,1328824443.6327,1341875195.3672,1355212056.8161,1368841637.7647,1382771107.045,1397007507.2198,1411558523.3992,1426432250.0499,1441636508.7342,1457180437.6763,1473072873.6836 +Q2,North Qld Clean Energy Hub,Q2 Option 2,,1120604774.2286,1137325496.4742,1150016795.4368,1162069536.7988,1175720255.6188,1195168795.8312,1209266989.2751,1220804517.6789,1235124217.8486,1249825898.6411,1262841179.9317,1274046478.7958,1285422858.1697,1297033964.8583,1308854743.5901,1320870834.2985,1333167660.1339,1345740304.7439,1358579717.4781,1371693396.0794,1385088498.1785,1398770649.8829,1412746380.5322,1427022394.6136,1441605969.9172,1456504250.8358,1471725033.4742,1487276536.5317,1503166678.3091,1519404743.6658,1535999683.4588 +Q5,Barcaldine,Q5 Option 1,,1627018049.1917,1649162116.0596,1664578156.7047,1679063503.7354,1696038051.5122,1721665845.8944,1739279722.1249,1752968691.3478,1770602815.4555,1788740739.415,1804060584.314,1816561143.467,1829063018.2636,1841780668.7936,1854660531.4587,1867670792.5303,1880931658.2502,1894430359.1364,1908146783.7639,1922085441.1651,1936249945.2867,1950641504.8508,1965262372.337,1980114721.8158,1995201321.0266,2010524476.4189,2026087093.2026,2041892381.0593,2057942815.4763,2074242449.2876,2090794548.1813 +Q9,Banana,Q9 Option 1,,1547032629.9564,1565945389.5872,1581601112.5948,1597064442.0736,1614352173.1069,1639427944.0042,1657443243.2594,1671857693.1892,1689938144.2967,1708500871.4489,1724552284.4522,1737667000.7012,1750825157.6282,1764190051.8578,1777736131.1881,1791438788.3996,1805407849.1839,1819633887.1379,1834099844.7183,1848811271.6601,1863772988.5955,1878987554.5124,1894458567.0647,1910189610.6684,1926184854.2437,1942448072.6287,1958983684.2271,1975796449.5914,1992890466.3608,2010271422.7591,2027944297.255 +Q9,Banana,Q9 Option 2,,854433594.90153,864988736.50607,873986000.7974601,882875542.0849199,892923294.4319899,907149777.28126,917288054.97088,925572084.733,935877194.5848199,946449621.32271,955595945.48823,963044604.29163,970539927.40534,978150780.31993,985860211.1916399,993658578.34875,1001605554.78224,1009695469.17209,1017919164.76104,1026279680.8691,1034779699.8003,1043420631.0855,1052204488.9221,1061133268.1598,1070209281.3579,1079434636.3974,1088811784.3264,1098343378.8347,1108031688.6947,1117879876.7462,1127890705.6371 +Q9,Banana,Q9 Option 3,,530297034.97987,536257614.7234899,541668207.98953,547015659.32381,552960335.0543699,561598439.2332801,567859902.69685,572873639.7082,579130936.28817,585559682.10437,591192211.51332,595821811.04064,600467525.16546,605186441.72055,609971867.4200101,614815016.06595,619753313.74742,624783996.90005,629901309.68492,635107246.74807,640403599.07554,645791352.4835601,651271872.30877,656846513.70481,662516837.2164301,668284273.86062,674150473.38521,680117212.41821,686186044.88542,692359076.52941,698638160.65618 +SQ1,Group Constraint - Wide Bay,SQ1 Option 1,,1015420584.45364,1033738564.4228,1047480368.1412,1060236885.1456,1074558209.5038,1094201316.2972,1108934057.2763,1121434736.5887,1136596156.4103,1152150324.3589,1166423016.7457,1179375307.0166,1192682851.6085,1206318590.2172,1220261899.2128,1234505770.6547,1249134133.8472,1264146334.0234,1279539387.5643,1295325352.1602,1311516252.9158,1328122899.0856,1345157120.2607,1362631197.1391,1380558138.5033,1398951051.9109,1417823919.6392,1437191369.5677,1457068008.1916,1477470017.3162,1498413530.8867 +SQ1,Group Constraint - Wide Bay,SQ1 Option 2,,901393030.95413,918422088.73725,930776976.81669,942173306.62236,955028342.42065,972621772.91826,985791902.91483,996996329.40132,1010588612.87216,1024531446.118,1037329857.0027,1049017098.9274,1061042023.3883,1073370771.9104,1085982623.107,1098872146.3842,1112114824.2478,1125710121.072,1139655869.9144,1153963251.709,1168643432.1153,1183706527.9438,1199163574.5116,1215026037.8767,1231306049.047,1248015851.0434,1265168491.3438,1282777612.1133,1300856862.6451,1319421319.889,1338486050.6118 +SWQLD1,Transmission Limit Constraint - Darling Downs,SWQLD1 Option 1,,26461391.615065,26423269.823455,26445425.781012,26486683.834792,26487311.117775,26654927.666282,26804450.999291,26833043.213645,26918349.20863,27011091.644855,27105044.870329,27182318.677842,27247767.649716,27314389.835569,27384022.717019,27454631.435359,27528178.692558,27604739.710437,27683919.500609,27765766.798912,27850302.276836,27937516.128152,28027399.534382,28119946.395909,28215158.219817,28313020.811004,28413538.476879,28516705.861184,28622520.581097,28730989.387947,28842111.69112 +SWQLD1,Transmission Limit Constraint - Darling Downs,SWQLD1 Option 2,,6752955.360533901,6754057.1387313,6828796.9840851,6840866.0966562,6957342.5794789,7090074.3308185,7091354.002971,7109071.939278499,7146689.7273767,7187726.0717892,7222950.5015373,7241034.2010218,7263988.1198431,7289195.242275699,7314508.8687053,7340805.4855824,7368576.835068501,7397497.0519989,7427521.9380804,7458650.117589699,7490878.6995731,7524198.1975478,7558601.7848306,7594083.125558901,7630637.0253844,7668256.515061899,7706938.1659753,7746678.2725309,7787471.1607611,7829316.136185301,7872210.4931804 +SWQLD1,Transmission Limit Constraint - Darling Downs,SWQLD1 Option 3,,487944190.6789,487868753.48745,490494680.8654,493533537.5489,495873723.02241,501146936.31532,505748395.93678,508410166.04911,512111276.7851899,515968410.22531,519588119.48501,522444106.0867999,525129927.12134,527841679.26721,530611078.39438,533407332.12915,536265657.76604,539187517.38019,542165820.75236,545201867.23335,548296527.8769801,551449990.96692,554662604.8636,557934719.9640499,561266850.10245,564659272.76555,568112523.47732,571627099.9828,575203405.52879,578842163.92293,582543890.42502 +SWQLD1,Transmission Limit Constraint - Darling Downs,SWQLD1 Option 4,,263815090.24782,264086815.96557,266079867.34777,268222053.14366,270239692.39766,273725976.04862,276545545.39117,278499269.72188,281015445.84596,283622411.56144,286064119.20286,288020475.73724,289923928.53172,291849292.90194,293808256.48798,295789460.76432,297811037.68259,299873281.42966,301972798.72444,304110391.68184,306286725.45542,308502052.17626,310756767.6575699,313051256.61309,315385995.40356,317761358.45789,320177839.85524,322635951.90234,325136127.78401,327679016.05552,330265131.67118 +SWQLD1,Transmission Limit Constraint - Darling Downs,SWQLD1 Option 5,,931517934.6652899,946792829.4602,959478174.11721,971488594.6257199,984719592.69015,1002729786.08732,1016487290.05695,1028191705.102,1042291018.6759,1056754695.2643,1070173405.6306,1082313722.8292,1094778517.2496,1107540906.7901,1120592467.0548,1133927184.9822,1147620276.2835,1161672293.8956,1176080946.6435,1190857514.2363,1206013297.7674,1221558469.0355,1237504146.8583,1253861870.6114,1270643846.6569,1287862373.0039,1305530570.4479,1323662150.3984,1342270822.2283,1361371744.3514,1380980033.4312 diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_SA.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_SA.csv new file mode 100644 index 00000000..2a16ee28 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_SA.csv @@ -0,0 +1,14 @@ +REZ / Constraint ID,REZ name,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +MN1,Group Constraint - facilitating power out of mid-north SA,MN1 Option 1,,614998669.3588524,620000000.0,628775078.9530815,637411027.8212239,646884447.9626596,659407899.8981453,669104505.8020982,677523500.0682987,687549090.3770126,697810128.5213681,707494044.7676716,716460476.1733401,725720877.1438234,735204996.4199538,744908023.989516,754828864.7991667,765017488.8137615,775474507.1846676,786199583.3357697,797200956.7389412,808486948.0576626,820065159.7787476,831943822.5168029,844131494.6052855,856637171.336117,869469924.0260874,882639398.2380779,896155643.2786871,910028721.0023072,924269680.8485107,938889555.2804432 +MN1,Group Constraint - facilitating power out of mid-north SA,MN1 Option 2,,793989601.5553393,800000000.0,810005568.7853494,819506898.3124791,829507999.031139,844221892.7542987,855920165.8146416,865281621.4209647,876776410.2653637,888581722.6003672,899721360.8697709,910174765.1082411,920875233.2876326,931858092.7123392,943123898.4971379,954649746.6206015,966507693.4099119,978700023.6231879,991224124.5773652,1004090679.195567,1017310139.638917,1030892128.611324,1044846941.812991,1059185332.895951,1073918650.635287,1089058273.097851,1104616358.511806,1120605527.343745,1137038480.076807,1153929104.582494,1171291322.310682 +MN1,Group Constraint - facilitating power out of mid-north SA,MN1 Option 3,,953217554.9248923,960000000.0,971336201.0634471,982061443.360344,993151219.6898628,1010081897.268552,1023634892.337446,1034176808.699938,1047258662.861361,1060710636.996242,1073367036.798076,1085168622.750532,1097190665.541183,1109528206.026793,1122186238.573844,1135130395.670247,1148447718.608563,1162141071.348134,1176205909.118985,1190654243.098905,1205497685.152992,1220746839.99101,1236413056.227468,1252508193.449229,1269044802.645677,1286035419.277372,1303493478.737359,1321432920.73582,1339867758.190264,1358813356.505064,1378285092.916084 +MN1,Group Constraint - facilitating power out of mid-north SA,MN1 Option 4,,1892798604.6674,1905213025.8234,1926189135.1769,1946263565.3379,1966844222.9779,1998863227.62,2024321003.5793,2043774531.4251,2068088623.0871,2093114950.4279,2116406057.9099,2137473534.2309,2158776892.6188,2180593405.9806,2202940077.8897,2225745133.4706,2249173576.0187,2273228851.4612,2297897521.293,2323198937.2873,2349151469.5761,2375771293.8549,2403075938.1216,2431083671.6965,2459813969.5671,2489286106.1158,2519520887.2482,2550539935.5465,2582364785.0008,2615019406.3931,2648527556.6624 +NSA1,Group Constraint - facilitating power out of north SA,NSA1 Option 1,,479075583.1731188,484000000.0,489487297.6120945,494908441.5886497,500932309.4900709,509369049.3249575,515588346.8691818,520740178.3436778,527050160.9702021,533521661.5993662,539310035.8682464,544262315.265832,549287739.5159364,554406355.0166953,559611078.0829142,564896302.5550272,570297072.3740779,575811432.173789,581435342.6885209,587171681.698462,593023210.2455152,598991991.3613195,605080474.8108864,611291157.9920775,617626759.8333086,624089926.301567,630683549.6937191,637410692.2727357,644274251.0231603,651277692.6335385,658424298.9315951 +S2,Riverland,S2 Option 1,,152018773.8975,152247979.27679,153650559.01733,155174034.28694,156650975.28315,158917835.41758,160751388.73967,162144002.6836,163859884.0071,165628367.75553,167274480.66185,168600354.40914,169909125.7061,171232309.00296,172576247.49408,173936083.27748,175321868.39978,176733722.00208,178169884.66564,179630906.0688,181117279.06876,182629250.60327,184167167.50531,185731369.17427,187322249.48859,188940152.63367,190585488.06794,192258690.19818,193960136.30454,195690346.331,197449759.67401 +S4,Yorke Peninsula,S4 Option 1,,640110849.53599,646450076.70102,654712352.31658,662881368.9632399,671937020.94735,684128582.8714899,693302618.74772,701149458.00313,710606884.12178,720289878.45578,729159831.41895,737067693.5238199,745179966.31945,753467081.02142,761920050.0121,770536004.53673,779363864.44012,788402193.51195,797648074.73004,807107543.0493399,816786586.17568,826690356.91072,836824587.57065,847195204.7633,857808503.4156101,868670765.31845,879788727.23913,891169444.67286,902819854.2792399,914747783.8321999,926960925.26445 +S4,Yorke Peninsula,S4 Option 2,,196068224.42676,198009539.14269,199745161.33182,201463465.59834,203345646.61497,206271287.788,208385763.80795,209978008.23695,212027056.95445,214136883.51843,215956866.05825,217418228.28642,218865450.60445,220333554.5896,221820931.73519,223322387.59109,224851964.10698,226408586.87453,227989750.67208,229595953.04101,231227574.52003,232884703.9049,234567544.4483,236276287.79429,238011193.30388,239772455.16688,241560342.51998,243375150.16103,245217088.87813,247086547.0509,248983815.40399 +S6,Roxby Downs,S6 Option 1,,1350136028.8663,1365231121.7174,1379582907.5018,1393840768.3491,1409827797.2983,1432507674.2785,1448902624.0247,1462292767.0028,1478902837.7155,1495940831.6921,1510873363.1312,1523334182.1084,1535916150.2732,1548709852.5387,1561691707.1135,1574845110.6161,1588265983.8516,1601946662.0759,1615873790.2845,1630053288.8736,1644490595.5652,1659189166.4695,1674153441.3745,1689387891.6355,1704897530.3434,1720687078.337,1736761860.307,1753127556.3308,1769789305.7685,1786753706.1858,1804026766.571 +S7,Eastern Eyre Peninsula,S7 Option 1,,178866823.0664099,179000000.0,180738043.8646082,182598439.0779457,184478310.2077905,187252213.5356123,189429870.003527,191138888.5170565,193218918.9015311,195363193.3885015,197365374.4361626,198952746.9687698,200523326.8227679,202109179.3098999,203716617.1723794,205341289.1220623,206994422.0243495,208675970.148894,210383825.3397145,212118488.1551992,213880420.5891129,215669770.1250829,217486815.0537694,219331810.3446587,221205069.4656014,223106847.6466553,225037461.8733902,226997261.3119903,228986513.5696732,231005654.5830257,233055008.5033415 +S8,Western Eyre Peninsula,S8 Option 1,,1457653807.6692,1474199083.9529,1490666104.8999,1506812693.3127,1524900821.3839,1550366751.8896,1568999952.5299,1584356318.7584,1603303242.3542,1622729535.7665,1639990016.0735,1654874392.1056,1670001336.3624,1685425460.2729,1701118562.0186,1717063282.6394,1733368599.583,1750027828.7282,1767029074.2944,1784381554.9515,1802094044.3723,1820173305.0871,1838627226.8843,1857463906.2672,1876692129.1282,1896320470.5716,1916358308.1221,1936815529.4727,1957701567.1363,1979027592.8822,2000804286.6408 +S8,Western Eyre Peninsula,S8 Option 2,,676328487.25196,683762402.70064,691662764.10954,699371448.0582,708021456.36777,720137935.77435,729073219.60696,736500197.78506,745599834.3212,754931607.51501,763342162.9869,770737347.19142,778277953.49515,785974201.65872,793812862.33585,801786572.81022,809946386.16331,818289903.78947,826812272.98005,835518362.32918,844412939.41563,853499811.05212,862783363.36224,872268097.33382,881958858.44558,891860424.5611199,901977966.40418,912316928.3157101,922882572.25913,933681007.01614,944718121.21198 +S8,Western Eyre Peninsula,S8 Option 3,,1701588667.3417,1721176263.5472,1741048775.0012,1760276474.456,1781945787.4613,1812457040.0986,1834907125.4642,1853505460.5308,1876367868.8043,1899814313.8781,1920924212.5771,1939635374.2654,1958734283.2094,1978243843.0127,1998125943.7978,2018360668.635,2039079088.0088,2060275121.6499,2081936965.4247,2104077520.1759,2126709399.5856,2149842862.008,2173489617.8931,2197661718.8214,2222372107.3859,2247633580.5627,2273459966.8658,2299865800.4911,2326865203.223,2354474450.5504,2382709318.9952 diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_TAS.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_TAS.csv new file mode 100644 index 00000000..5938805a --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_TAS.csv @@ -0,0 +1,11 @@ +REZ / Constraint ID,REZ name,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +T1,North East Tasmania,T1 Option 1,,796020974.91034,820902863.5242399,837941082.7488,854019447.30186,871770554.73186,893890060.71291,912268376.79001,929431283.79467,949245299.61615,969770812.84893,989964623.20677,1009884790.08247,1030848643.279,1052694734.1826,1075440531.8316,1099125880.2684,1123860889.2903,1149684637.1781,1176639784.592,1204783047.7871,1234173802.8181,1264873092.6968,1296945626.315,1330459658.2851,1365487186.4903,1402103593.643,1440388647.2554,1480426387.6265,1522304718.4855,1566117202.2547,1611961676.1798 +T1,North East Tasmania,T1 Option 2,,596049691.20431,615128324.67518,628329231.56729,640901055.32566,654727686.38713,671720566.31334,685917911.73007,699292426.9599,714663408.8483,730577511.93751,746251293.1718199,761702784.9131199,777977193.60048,794933103.33055,812586152.23826,830969942.2888399,850167421.45088,870209137.0950999,891128830.3883399,912970588.83276,935780599.35963,959606382.56773,984498303.06591,1010509486.6853,1037695958.2553,1066116389.4725,1095832853.8683,1126910752.7785,1159418492.5422,1193428874.4813,1229018034.8502 +T2,North West Tasmania,T2 Option 1,,240158121.32287,245091321.90369,249253417.86441,253309972.52895,257782146.33849,263443179.49189,267981143.01685,272131511.01281,276962206.2570699,281952286.32648,286755446.84057,291254234.53159,295945273.80039,300802518.77323,305829630.84959,311033868.5737,316440490.36791,322055947.16272,327886820.1292,333943420.36949,340236527.3019,346777041.31878,353576595.68299,360647437.18314,368002505.86648,375655317.11976,383620192.82333,391912237.42109,400547183.7498699,409541872.65873,418913838.56086 +T2,North West Tasmania,T2 Option 2,,806421132.37501,825046789.24525,839553680.04173,853620250.58645,869076667.9466801,888621699.72133,904442793.5288,918943417.40159,935811499.5713,953242554.49666,970044730.3556,985968632.5457101,1002605227.83498,1019857829.9622,1037739524.1842,1056276521.9503,1075558875.6027,1095611327.7948,1116459613.0042,1138142407.2832,1160700112.7026,1184173791.1916,1208607168.5522,1234046311.6581,1260539871.8284,1288138698.8919,1316896660.9186,1346870549.5178,1378119587.9992,1410707072.8725,1444698997.1058 +T2,North West Tasmania,T2 Option 3,,980249858.3200899,1009575669.84297,1029857828.2143,1049200829.7781,1070368420.2636,1096829911.112,1118846411.4657,1139298446.6144,1162938261.7667,1187408015.8582,1211340472.1011,1234763042.1131,1259373058.8832,1284994798.4536,1311651428.1676,1339387048.5616,1368332030.548,1398530915.5871,1430031729.7618,1462899609.6499,1497202668.3201,1533010838.5432,1570398284.1265,1609443225.7845,1650228190.6224,1692839556.956,1737368751.8325,1783912103.377,1832570321.4595,1883450664.6373,1936665255.8868 +T3,Central Highlands,T3 Option 1A,,221982146.1380705,224000000.0,226715338.6696149,229502337.6482083,232572183.0375078,236641142.4489133,239702074.4764472,242352499.8720855,245514374.6221757,248766187.6065965,251762968.859344,254286058.0859839,256857161.2449036,259480143.1799685,262156536.4627344,264887320.1586365,267688056.7446125,270559265.1824743,273500551.0027852,276514501.5742907,279603782.787608,282770792.2835082,286018215.6162919,289348843.3018143,292765663.0242169,296271736.6050436,299870349.2080817,303564986.8855621,307359176.3457099,311256849.9266559,315261979.293898 +T3,Central Highlands,T3 Option 1,,605484198.55221,621000000.0,632815948.2139533,644304332.8965288,656886785.7406796,672499977.7360924,685323260.7689799,697256827.7354981,711030161.7536592,725265168.3894784,739101584.7039157,752374752.590501,766285671.644391,780728824.622854,795717680.8883628,811278109.6519331,827481814.9184351,844351349.5069553,861910886.5566013,880194337.8177035,899237207.931194,919075746.3342922,939748494.980104,961296070.1861951,983761337.7159926,1007189138.251146,1031626943.830066,1057124793.534692,1083734923.718564,1111513073.180324,1140517418.318623 +T3,Central Highlands,T3 Option 2,,506332096.39259,523884778.08825,535516146.4010999,546526524.21397,558626695.0369,573510225.77817,586045092.27281,597871989.05284,611449703.19643,625514975.40865,639422608.7729,653275883.04289,667885199.03572,683121007.3016,698997222.19722,715543996.90937,732835583.53196,750900544.15803,769770431.62772,789485845.4602,810089343.26371,831624777.82226,854138601.23244,877679818.87626,902300102.14696,928053579.69751,954997506.97286,983192200.42776,1012700783.56274,1043590387.8053,1075931249.5833 +T4,North Tasmania Coast,T4 Option 1,,370540722.99223,381534808.31059,389235866.1087199,396590290.30999,404614432.60101,414650670.52083,423034284.52413,430819751.14403,439808062.33816,449113168.59706,458235928.58777,467172029.40247,476559690.66799,486332678.18096,496500735.34127,507080451.17239,518121207.31818,529640163.9665801,541655664.67196,554192536.4029601,567276754.0578101,580934981.82201,595195499.7195,610088132.73898,625644345.8413,641897074.31068,658881174.04697,676633370.9561399,695192062.38178,714598139.78967,734894346.3223101 +T4,North Tasmania Coast,T4 Option 2,,430866400.17984,444693460.65842,454159556.37961,463118163.9664,472967081.22253,485183909.00261,495409941.6478,504991507.49749,516022667.5914,527450247.3947901,538726733.06614,549885018.13937,561634219.6477,573879928.5542101,586633349.01014,599917299.18372,613792517.8187101,628281383.89055,643408299.1258,659205309.93461,675705987.52955,692944869.28623,710958559.01645,729785666.99033,749466913.39559,770044941.17401,791564865.8016,814074217.95831,837622722.86242,862263290.1599699,888051255.3930899 diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_VIC.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_VIC.csv new file mode 100644 index 00000000..858eb9c5 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_costs_step_change_VIC.csv @@ -0,0 +1,19 @@ +REZ / Constraint ID,REZ name,Option,Status,2024-25,2025-26,2026-27,2027-28,2028-29,2029-30,2030-31,2031-32,2032-33,2033-34,2034-35,2035-36,2036-37,2037-38,2038-39,2039-40,2040-41,2041-42,2042-43,2043-44,2044-45,2045-46,2046-47,2047-48,2048-49,2049-50,2050-51,2051-52,2052-53,2053-54,2054-55 +SEVIC1,Group Constraint - South East Victoria,SEVIC1 Option 1,,397807629.3132317,400000000.0,406508709.9372162,413217714.2536209,420685295.4801652,430198805.1188813,437802862.000948,444730350.9418346,452849612.8066381,461224655.991574,469239357.7264129,476956900.3639663,485033095.9786865,493408107.9367819,502081028.2331133,511062329.6850265,520396108.4591467,530092180.7595168,540161411.0752884,550620916.9918066,561488466.6576587,572782044.6729807,584520736.7986444,596724615.2516893,609414821.399804,622613359.4941385,636343500.3418634,650629696.1185848,665497346.3456937,680973559.6041608,697086496.9927356 +SWV1,Group Constraint - South West Victoria,SWV1 Option 1A,,1196025950.8745,1201573436.4498,1220481104.5806,1240127886.4187,1261879866.0363,1289538512.115,1311551325.2044,1331549736.2155,1354982219.378,1379138865.5672,1402201874.8675,1424018483.9495,1446788309.4053,1470356039.1006,1494725113.8711,1519924524.7178,1546078075.5364,1573211219.7537,1601351367.9691,1630544122.7115,1660836785.0342,1692276983.8831,1724915364.4087,1758805160.2801,1794002464.5528,1830565605.4508,1868556311.3018,1908039456.9805,1949082337.8607,1991756914.1485,2036137834.362 +SWV1,Group Constraint - South West Victoria,SWV1 Option 1C,,827557686.7057899,831539226.1624,844617301.43165,858267920.2545899,873338462.80916,892416835.08608,907592232.60263,921410452.6079301,937569223.8601,954217419.41931,970070978.56555,984966740.7191,1000500480.14408,1016563064.91668,1033157551.9735,1050304236.2372,1068086431.3479,1086520738.6505,1105624935.6264,1125429175.1569,1145964745.5278,1167263071.4771,1189357610.2696,1212283514.6396,1236077829.3228,1260779068.4618,1286427991.5507,1313067448.6535,1340741850.8881,1369498734.5351,1399387374.1132 +SWV1,Group Constraint - South West Victoria,SWV1 Option 2B,,1302893715.909153,1310000000.0,1328481939.083768,1347632125.076857,1368733006.910807,1396314677.428516,1417968274.694827,1437159540.877062,1459872624.532657,1483278754.391774,1505352871.763477,1525725734.355628,1546849316.582762,1568648284.601041,1591126017.74068,1614298734.887063,1638288736.633706,1663115015.946923,1688795419.913404,1715367393.748613,1742869627.479702,1771340510.46816,1800821091.268042,1831354455.440568,1862986098.266472,1895763203.654762,1929735795.966159,1964956487.162501,2001479666.202156,2039363790.729167,2078669277.936321 +SWV1,Group Constraint - South West Victoria,SWV1 Option 3A,,1481759290.3932,1489034446.1511,1512816367.105,1537564086.5475,1564776335.3637,1599494659.8288,1627407581.5273,1652712740.7924,1682365132.7339,1712939810.1867,1742152001.2212,1770010009.0556,1799106426.5082,1829250022.9488,1860447362.3392,1892733035.3121,1926266506.6292,1961082517.6316,1997218280.0562,2034734212.6969,2073692926.7475,2114157688.1687,2156195660.9736,2199877473.4319,2245277531.7063,2292473235.7615,2341546478.3018,2392583307.7138,2445673053.3467,2500911128.8922,2558396608.8305 +SWV1,Group Constraint - South West Victoria,SWV1 Option 3B,,1767896440.8501,1778288380.7356,1804152952.2704,1830846416.9503,1860301210.8317,1898761849.9131,1929130502.8733,1956134021.5738,1988080326.724,2021014047.8535,2052133927.1995,2081259939.505,2111534825.3646,2142832999.8759,2175155302.1181,2208526570.4648,2243122406.6778,2278973115.3651,2316108780.1636,2354586814.8639,2394466539.5142,2435807267.0346,2478672220.6172,2523127818.8795,2569244146.319,2617093969.6354,2666754382.2851,2718306430.7651,2771834053.5444,2827427233.7208,2885179166.1103 +SWV1,Group Constraint - South West Victoria,SWV1 Option 3C,,365061069.02751,369081546.95233,372571164.1101699,376080987.08942,379930901.08803,385620324.3436,389719108.41829,392926209.95158,396987673.22944,401157688.61109,404706116.36164,407505850.23849,410288517.10185,413107310.09248,415958121.1845199,418833592.54949,421759349.91055,424732959.83619,427749859.12045,430810947.8387,433916885.34019,437067804.51307,440264047.30248,443505934.88024,446793908.98489,450128293.13034,453509546.87538,456938182.11942,460414534.6978,463939283.81662,467512929.05386 +SWV1,Group Constraint - South West Victoria,SWV1 Option 4,,1918619064.202385,1930000000.0,1957753659.546687,1986364958.281095,2017913068.087163,2059254698.941633,2091842730.768392,2120725015.891219,2154941697.110022,2190215294.217976,2223488461.448881,2254525797.971579,2286760220.818187,2320074091.716784,2354468268.411122,2389966876.712924,2426758841.061964,2464875628.508177,2504347922.770499,2545236129.722905,2587602605.605626,2631509605.571662,2677023518.73069,2724214087.612332,2773154919.596879,2823922414.491939,2876597535.261299,2931265402.462308,2988014136.390843,3046938263.816052,3108135643.13583 +SWV1,Group Constraint - South West Victoria,SWV1 Option 5,,507010836.0671532,510000000.0,517319724.1700734,524872160.2506443,533217964.9742511,544093085.1158675,552611456.633425,560186378.130177,569145521.4600762,578376536.801285,587060717.0433577,595080088.8024129,603399939.3843337,611988052.4481705,620844326.1889845,629975556.2537429,639429961.7349732,649214982.5033896,659337809.4323777,669813327.3908981,680656906.1844746,691883820.1637671,703510393.1405671,715553761.6709967,728032019.2224052,740963935.9488583,754369406.6250871,768269358.0051678,782685423.6046352,797640850.3738971,813159673.2385832 +V1,North West VIC,V1 Option 1,,746597656.7803818,750000000.0,761612260.7904102,773655094.3416232,787055695.1099856,804106433.3834594,817577652.6099048,829827636.8652583,844156630.2908278,858926319.7205582,873041310.2898182,886310510.225257,900141136.3795295,914436660.0093932,929198061.7853711,944443064.069797,960245234.7936273,976618927.6779082,993579184.210362,1011152040.938826,1029364604.712039,1048243984.752424,1067819108.86673,1088120343.025749,1109179699.325264,1131030455.544088,1153707817.583764,1177248814.090906,1201691802.476239,1227077869.94027,1253449558.618251 +V1,North West VIC,V1 Option 2,,1260567012.878616,1270000000.0,1287222165.922086,1304877547.662648,1324648039.779599,1350603068.384069,1370492600.629062,1388084122.200074,1409000114.932522,1430534376.46759,1450566517.681049,1468812821.984375,1487692310.876225,1507137432.900566,1527138094.539307,1547708501.259707,1568960089.417054,1590905410.084013,1613555998.332879,1636941746.167112,1661093541.60794,1686041606.270757,1711818474.788507,1738458235.860143,1765996947.16712,1794471949.411049,1823922861.539059,1854391407.197537,1885920560.211313,1918556748.476577,1952347779.876919 +V2,Central Highlands VIC,V2 Option 1,,358300903.1756525,360000000.0,365552226.7839736,371338105.9946942,377743942.3130103,385887004.9013564,392337262.2758113,398198724.0818386,405052156.4834676,412113691.365451,418846948.9555558,425155294.2889699,431726671.9025351,438515960.4198648,445524221.2248334,452759729.4394967,460257403.5362101,468023958.661508,476066371.4412394,484396877.3377625,493028206.4189825,501973079.698446,511245075.2862907,520858445.4691755,530828216.585761,541170005.9579047,551900338.4037846,563036595.1389203,574596774.4182057,586600164.1877304,599066730.8155663 +V7,Central North VIC,V7 Option 1,,984875535.543565,990000000.0,1005664244.085321,1021806455.450834,1039693951.569287,1062691355.808012,1081075163.717398,1097695548.105637,1117205191.68897,1137331850.706749,1156585416.895869,1175017934.720141,1194269259.561469,1214217312.50499,1234862181.843683,1256225470.384255,1278413445.553094,1301448907.85234,1325356047.998434,1350174561.607838,1375945644.869279,1402710859.063533,1430514366.230527,1459402590.970786,1489424450.427415,1520630833.054888,1553075566.701458,1586815223.42427,1621908529.658107,1658418220.430697,1696409411.222522 +V7,Central North VIC,V7 Option 2,,786535195.3960758,790000000.0,802466579.3241854,815424733.3781394,829709371.4067237,847957935.3437101,862572835.3279328,875825294.7936167,891321787.9948366,907301109.5674684,922614914.906461,937147757.7164962,952307579.6771989,967995011.0713621,984213788.735587,1000981682.748596,1018380002.535053,1036426101.975693,1055137966.432963,1074545600.456599,1094680200.040625,1115573120.136185,1137257737.75276,1159769114.596995,1183144199.019033,1207421417.577983,1232641413.920344,1258846918.403778,1286082248.839961,1314394797.646622,1343833702.117207 +V8,Gippsland Offshore,V8 Option 1,,1494628057.465048,1500000000.0,1522183547.864118,1545386970.051085,1570503585.366455,1603323253.532855,1629844463.002644,1653376752.131119,1681079973.441132,1709659729.521094,1737019400.231888,1762760873.369914,1789512328.340099,1817177500.211373,1845776636.014058,1875329061.064842,1905985966.676212,1937778125.430437,1970734473.637028,2004907412.098747,2040351173.90791,2077120138.735465,2115272180.776456,2154868111.901208,2195972058.52937,2238650625.277676,2282974348.698908,2329017353.382006,2376856496.497773,2426574035.634409,2478255219.323501 +V8,Gippsland Offshore,V8 Option 2,,786479838.9313046,790000000.0,801872614.7517794,814156429.949614,827590620.9571564,845105037.7509936,859122760.3653722,871614755.951213,886318142.3353771,901484346.9723523,915946198.314482,929550201.9260654,943695359.6490887,958324360.3019172,973442326.6731591,989060391.229964,1005258590.483825,1022052555.562163,1039457338.637742,1057500393.526316,1076210144.612869,1095615072.479362,1115745510.442631,1136633323.09775,1158312116.737947,1180816803.74773,1204184342.468776,1228453588.815737,1253664811.262852,1279861126.384963,1307087206.921708 +V9,Southern Ocean,V9 Option 1,,10002093.9268361,10000000.0,10107765.37709036,10114117.02121047,10285303.70467203,10481366.29487123,10472570.16331664,10489964.03926453,10537474.56860189,10590256.16621321,10635481.5496503,10656634.43904469,10685358.63335347,10717652.25534735,10750088.81919738,10784021.55510905,10820202.44902543,10858122.47414295,10897715.53789039,10938977.62488873,10981902.78683707,11026475.4159928,11072683.76175807,11120516.86542502,11169965.46362893,11221017.68718919,11273666.9570285,11327906.13749843,11383725.53428106,11441122.50265426,11500091.53106386 +WV1,Group Constraint - South West Victoria,WV1 Option 1,,1341379934.687546,1350000000.0,1367832344.505974,1386224393.199642,1406588451.404191,1433489428.530704,1454168080.935075,1472309745.015956,1493871798.6,1516068268.451684,1536726151.229823,1555241250.18623,1574323861.205817,1593937572.199665,1614080212.062218,1634761756.802051,1656095180.724373,1678091833.74441,1700760051.109999,1724127601.882625,1748223145.29792,1773074375.234646,1798711251.951859,1825165116.956058,1852469167.248204,1880657711.007643,1909767186.803894,1939835998.995573,1970903583.169572,2003012718.395302,2036207307.72001 diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_options_NSW.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_options_NSW.csv new file mode 100644 index 00000000..9abba9d8 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_options_NSW.csv @@ -0,0 +1,37 @@ +REZ / constraint ID,REZ name,Option,Augmentation description,Pre-requisite options,Additional network capacity (MW),Additional import capacity (MW),Expected cost ($2025 million),Cost estimate source,Cost estimate class,$M/MW,Easement length (km),Lead time,Notes +N1,North West NSW,Option 1,"• Two new 500 kV circuits from Central-West Orana REZ to locality of Gilgandra to locality of Boggabri to locality of Moree. • A new single 500 kV circuit from Central-West Orana REZ to Wollar. • New 500/330 kV substations in locality of Boggabri and Moree. • A new 500 kV switching station in locality of Gilgandra. • A new 330 kV single-circuit from Sapphire to locality of Moree. • A new 330 kV circuit from Tamworth to locality of Boggabri. • Line shunt reactors at both ends of Central-West Orana REZ-locality of Gilgandra, locality of Gilgandra-locality of Boggabri, locality of Boggabri-locality of Moree 500 kV circuits.",Central West Orana REZ Network Infrastructure project,1660,1660.0,5964.0457242019,AEMO TCD,Class 5b(±50%),3.592798629037289,796.0,Long: (7 years), +N2,New England,Option 1,"• New 330 kV Northern (Hub 10), Central South (Hub 1) and East (Hub 4) switching stations. • New 500 kV built and initially 330 kV operated DCST line from Central (Hub 5) to Central South (Hub1) with Quad Orange conductor. • New 500 kV built and initially 330 kV operated DCST line from Central (Hub 5) to Northern (Hub 10) with Quad Orange conductor. • New 330 kV DCST line between Central (Hub 5) and East (Hub 4) with Twin Olive conductor.",CNSW-NNSW Option 1,2400,,1089.581,AEMO TCD,Class 5b(±50%),0.4539920833333333,115.0,Medium: (6 years), +N2,New England,Option 2,• New South 330kV (Hub 2) switching station • New 330 kV DCST line from South (Hub 2) switching station to Central South (Hub 1) with Twin Olive conductor,"CNSW-NNSW Option 1, CNSW-NNSW Option 2",500,,231.16509234484,AEMO TCD,Class 5b(±50%),0.46233018468968,30.0,Long: (9 years), +N2,New England,Option 3,• New Hub 9 switching station. • Establish a new Lower Creek 330/132 kV substation with 1 x 330/132 kV 375 MVA transformer. • Rebuild part of Line 965 as 330 kV double-circuit from Armidale to Lower Creek. • Relocate existing 132 kV 200 MVA phase shift transformer on Line 965 from Armidale to Lower Creek. • New 330 kV double-circuit from Lower Creek to Hub 9. • Cut-in of Line 965 at new Lower Creek substation,,900,,916.89498618121,AEMO TCD,Class 5b(±50%),1.018772206868011,121.0,Medium: (6 years), +N3,Central-West Orana,Central West Orana REZ Network Infrastructure project,• New Merotherie 500/330 kV substation with 4 x 500/330/33 kV 1500 MVA transformers. • New 330 kV Elong Elong switching stations. • New 500 kV Barigan Creek switching station. • 2 x 500 kV double-circuit lines from Barigan Creek to Merotherie with Quad Orange conductor. • 2 x 500 kV double-circuit lines and initially operated at 330 kV from Merotherie to Elong Elong with Quad Orange conductor. • 3 x 250 MVAr synchronous condensers at Elong Elong switching station. • 4 x 250 MVAr synchronous condensers at Merotherie substation. • Provision of switch bays for future generator connections (cost estimation is not required) • An additional 330 kV single-circuit line from Bayswater to Liddell. • An additional 330 kV single-circuit line from Mt Piper to Wallerawang. *possible expansion to Uungula/Burrendong is subject to a separate and future project authorisation process,,4500,2000.0,This project is considered to be anticipated and so is not included as an option here. The scope of the project is listed here for context so that the subsequent options can be understood. Option 1 includes expansions and augmentations to this project.,,,,,, +N3,Central-West Orana,Option 1,"• Construct Merotherie-B 500/330kV substation with 3 x 500/330/33kV 1500 MVA transformers (at least 2 km away from Merotherie substation – re-named as Merotherie-A). • Terminate one of the existing 500 kV DCST transmission lines between Merotherie – Barigan Creek at Merotherie-B and Wollar 500 kV substations respectively • Construct a DCST 500 kV transmission line between Merotherie-A and Merotherie-B 500 kV substations • Expand Elong Elong as 500/330 KV substation with 3 x 500/330/33kV 1500MVA Txs, • Operate Merotherie – Elong Elong transmission lines at 500kV • Terminate one of the 500 kV DCST transmission line from Merotherie - Elong-Elong at Merotherie-B",Central West Orana REZ Network Infrastructure project,1500,,855.18621808944,AEMO TCD,Class 5b(±50%),0.57012414539296,13.0,Short: (5 years), +N3,Central-West Orana,Option 2,• New Tooraweenah 500/330 kV Hub with 3 x 500/330/33 kV 1500 MVA transformers • New 500 kV DCST line from Tooraweenah to Merotherie with Quad Orange conductor • Augment Merotherie 500 kV substation,N3 Option 1,2100,,1151.6696032583,AEMO TCD,Class 5b(±50%),0.5484140967896667,30.0,Long: (7 years), +N3,Central-West Orana,Option 3,• New 330 kV Burrendong A and Burrendong B substations • New 500kV built and 330 kV operated double circuit lines from Elong Elong to Burrendong A Energy Hub • New 330 kV DCST line between Burrendong A and Burrendong B with Twin Olive conductor,N3 Option 1,1400,,656.85846559374,AEMO TCD,Class 5b(±50%),0.4691846182812429,121.0,Long: (7 years), +N4,Broken Hill,Option 1,"• New 330 kV Western NSW switching station with 4x diameters, and cut in to both the Buronga - SA (PEC) lines • New 330 kV Broken Hill REZ Energy Hub 1 switching station with 2x diameters • New 139 km 500 kV constructed 330 kV energised DCST transmission line from Western NSW switching station to Broken Hill REZ Energy Hub 1 switching station",Project EnergyConnect,800,,1296.237235737,AEMO TCD,Class 5b(±50%),1.62029654467125,139.0,Long: (7 years), +N4,Broken Hill,Option 2,500 kV double-circuit HVDC line from Bannaby – Broken Hill (>850 km). • New HVDC converter stationss at Bannaby and Broken Hill,,1750,,5621.1885641729,AEMO TCD,Class 5b(±50%),3.212107750955943,932.0,Long: (9 years), +N4,Broken Hill,Option 3,"• New 500 kV Moulamein switching station with 4x diameters, and cut in to the Dinawan - VIC (VNI West) lines • Expansion of the Western NSW site to a 500/330 kV substation with 4x diameters of 500 kV, and 2x 1500 MVA 500/330 kV transformers • Expansion of the Broken Hill REZ Energy Hub 1 to a 500/330 kV substation with 1x additional diameter of 330 kV, 3x 1500 MVA 500/330 kV transformers, and a 3x diameter 500 kV switchyard • New 261 km 500 kV DCST transmission line from Moulamein 500 kV switching station to Western NSW 500/330 kV substation • Energisation of 139 km line developed under Option 1 to 500 kV operation","Project EnergyConnect, WNV-SNSW Option 1 - VNI West, N4 Option 1",1600,,2670.2431035426,AEMO TCD,Class 5b(±50%),1.668901939714125,261.0,Long: (9 years), +N5,South West NSW,Option 1,"(Stage 1 of VNI West) • Upgrade Dinawan – Wagga Wagga – Gugaa double-circuit line from 330 kV to 500 kV operation and bypass at Wagga Wagga (lines built at 500 kV as part of Project EnergyConnect and HumeLink). • Establish Dinawan 500 kV switchyard with two 500/330 kV 1500 MVA transformers. • 500 kV line shunt reactors at both ends of the 500 kV double circuits Dinawan – Gugaa. • Bring forward the line shunt reactors for the Dinawan – Tragowel 500 kV double circuit for voltage support at Dinawan. • Cut-in Gugga substation between Lower Tumut - Wagga 330 kV single-circuit overhead line (line TL51). • Rebuild 330 kV line between Gugga and Wagga (section of TL51) as a new double circuit overhead line, using the Line TL51 easement.","Project EnergyConnect, SNSW-CNSW Option 1 (HumeLink)",600,,1140,Transgrid,Class 4(-30% to +50%),1.9,11.0,Short: (4 years), +N5,South West NSW,Option 2,• Expand the existing Dinawan 500/330kV substation with an additional 500/330/33kV 1500MVA transformer,N5 Option 1 or WNV-SNSW Option 1 - VNI West,1800,,116.13981502245,AEMO TCD,Class 5b(±50%),0.06452211945691666,0.0,Short: (4 years), +N5,South West NSW,Option 3,"Non-network option – virtual transmission line option with a 250 MW energy storage system in the SNW load centre and south of Wagga Wagga, with a SIPS scheme based on: • 250 MW of generation runback for generators connecting to Dinawan • 250 MW BESS in the Sydney-Newcastle-Wollongong load centre","Project EnergyConnect, SNSW-CNSW Option 1 (HumeLink), N5 Option 1",250,,Non-network augmentation,,,,0.0,Short: (4 years), +SWNSW1,Secondary Transmission Limit - South West NSW,Option 1,• New 330 kV single circuit transmission line between Transgrid’s Darlington Point 330 kV Substation and Dinawan 330 kV Switching Station: • Expansion of Darlington Point 330 kV yard by one breaker and a half diameter with 2 x CBs; • Expansion of Dinawan 330 kV yard by one breaker and a half diameter with 2 x CBs.,"Project EnergyConnect, HumeLink",Removes limit,,458.67617205971,AEMO TCD,Class 5b(±50%),,85.0,Medium: (6 years), +N6,Wagga Wagga,Option 1,Refer to SNSW-CNSW Option 3 and 4 subregional augmentations,,,,,,,,,, +N7,Tumut,Option 1,Refer to SNSW-CNSW Option 1 subregional augmentations,,,,,,,,,, +N8,Cooma-Monaro,Option 1,• 132 kV single-circuit Williamsdale to Cooma-Monaro substation (located near generation interest),,150,150.0,289.30524763797,AEMO TCD,Class 5b(±50%),1.9287016509198,74.0,Medium: (6 years), +N8,Cooma-Monaro,Option 2,• 330 kV line Cooma-Williamdale-Stockdill • Two 330/132 kV transformers at Cooma,,500,500.0,688.3708,AEMO TCD,Class 5b(±50%),1.3767416,116.0,Short: (4 years), +N9,Hunter-Central Coast,Option 1,Component 1 • Minor augmentations of secondary systems to enable the connection of HCC REZ generation to the existing Ausgrid transmission and sub-transmission network Component 2 • New 132 kV Sandy Creek STSS • Singleton sub-transmission network is transferred to the Newcastle transmission network via Kurri STS (line 955 breakers are closed) Component 3 • New 132kV Antiene STSS • Two new 132kV lines from Antiene STSS to Kurri STS • A 7% series reactor installed at Rothbury Zone Substation • Opened breaker at 98N and 98R (Tomago to Beresfield) • Connections between Muswellbrook and Singleton networks are operated normally open,,1000,,604,Ausgrid,Class 3(±25%),0.604,82.0,Short: (2 years), +N9,Hunter-Central Coast,Option 2a,"• New Singleton Hub and Rothbury 132 kV switching stations • Beresfield 132 kV substation works • Multiple line augmentations for 132 kV lines between Singleton Hub, Kurri, Newcastle and Tomago. • Expand existing Tomago 330/132 kV substation with one 375 MVA transformer.",N9 Option 1,800,,593$593 in $2024),Transgrid and Ausgrid cost submission,Class 5b(±50%),0.74125,0.0,Short: (4 years), +N9,Hunter-Central Coast,Option 2b,"• New Denman Hub 132 kV switching station • New 132 kV lines from Denman Hub to Muswellbrook on existing easement • New 330 kV line from Muswellbrook to Liddell • Expand existing Muswellbrook 330/132 kV substation with one 375 MVA transformer and busbar reconfiguration, and connect three new 132 kV lines.",N9 Option 1,900,,529$522 in $2024),Transgrid and Ausgrid cost submission,Class 5b(±50%),0.5877777777777777,19.0,Short: (4 years), +N9,Hunter-Central Coast,Option 3,"• New Singleton 330/132 kV substation with 4 x 375 MVA transformers, connecting to Singleton Hub. • Cut-in existing Liddell-Tomago 330 kV (L82) circuit at Singleton substation • Cut-in existing Liddell-Newcastle 330 kV (L81) circuit at Singleton substation","N9 Option 2a, CNSW-SNW Option 1",1000,,221$218 in $2024),Transgrid and Ausgrid cost submission,Class 5b(±50%),0.221,10.0,Long: (7 years), +N9,Hunter-Central Coast,Option 4,"• New Plashett Hub 132 kV switching station • New 132 kV lines from Plashett Hub to Singleton Hub on existing easement • New Plashett 330/132 kV substation with 4 x 375 MVA transformers, connecting to Plashett Hub. • Cut-in existing Bayswater-Regentville 330 kV (L31) circuit at Plashett substation • Cut-in existing Bayswater-Sydney West 330 kV (L32) circuit at Plashett substation","N9 Option 3, CNSW-SNW Option 1",1000,,465$459 in $2024),Transgrid and Ausgrid cost submission,Class 5b(±50%),0.465,4.0,Long: (7 years), +N10,Hunter Coast,Option 1,Refer to CNSW-SNW Option 1 subregional augmentations,,,,,,,,,, +N11,Illawarra Coast,Option 1,• 500 kV double-circuit line from Dapto – Marulan. • Existing 500 kV constructed Marulan – Bannaby lines would be operated at 500 kV • Two 500/330 kV 1500 MVA transformers at Dapto.,CNSW-SNW Option 3 or CNSW-SNW Option 4,2000,,1022.9060224201,AEMO TCD,Class 5b(±50%),0.5114530112100499,75.0,Long: (7 years), +N12,Illawarra,Option 1,• 500 kV double-circuit line from Dapto – Marulan. • Existing 500 kV constructed Marulan – Bannaby lines would be operated at 500 kV • Two 500/330 kV 1500 MVA transformers at Dapto.,CNSW-SNW Option 3 or CNSW-SNW Option 4,2000,2000.0,1022.9060224201,AEMO TCD,Class 5b(±50%),0.5114530112100499,75.0,Long: (7 years), +N13,South Cobar,Option 1,"• New South Cobar 330 kV switching station with 2x diameters • Expansion of Dinawan 330 kV switchyard by 2x 330 kV diameters • New 357 km 330 kV DCST transmission line from Dinawan to South Cobar 330 kV switching station • 50 MVAr shunt reactor on each new circuit at South Cobar and Dinawan, including a switching station halfway between South Cobar and Dinawan for reactive line compensation.",Project EnergyConnect,1000,,2126.5091407076,AEMO TCD,Class 5b(±50%),2.1265091407076,363.0,Long: (7 years), +N13,South Cobar,Option 2,"• New South Cobar 500/330 kV substation with 3x 500 kV diameters, 3x 1500 MVA transformers, 3x 330 kV diameters • Expansion of Dinawan 500 kV switchyard by 2x 500 kV diameters • New 357 km 500 kV DCST transmission line from Dinawan to South Cobar 500/330 kV substation • 100 MVAr shunt reactor on each new circuit at South Cobar and Dinawan, including a switching station halfway between South Cobar and Dinawan for reactive line compensation.",VNI West,2400,,3296.0580574025,AEMO TCD,Class 5b(±50%),1.373357523917708,363.0,Long: (7 years), +N13,South Cobar,Option 3,"• New South Cobar 500/330 kV substation with 3x 500 kV diameters, 3x 1500 MVA transformers, 3x 330 kV diameters • New 500 kV switching station on VNI West line with 4x 500 kV diameters • New 355 km 500 kV DCST transmission line from new switching station on VNI West line to South Cobar 500/330 kV substation • 100 MVAr shunt reactor on each new circuit at South Cobar and VNI Switching station, including a switching station halfway between South Cobar and Dinawan for reactive line compensation.",VNI West,2400,,3351.2831435132,AEMO TCD,Class 5b(±50%),1.396367976463833,363.0,Long: (7 years), +DN1,Dubbo,Option 1,• New Forest Glen and Mendooran 132 kV Energy Hubs • Rebuild Geurie Zone substation and Narromine to 132 kV switching stations • Rebuild 132 kV lines: (i) Narromine switching station – Forrest Glen Energy Hub – Dubbo West Zone Substation (L9GG) (ii) Narromine switching station – Forrest Glen Energy Hub – New Energy Hub (L943) (iii) Wellington Substation – Geurie switching station – Dubbo Zone Substation (L94F) (iv) New Energy Hub – Mendooran – Dubbo Zone Substation (L94W/1) • Upgrade protection systems • Expand existing Wellington 330/132 kV substation with one 375 MVA transformer.,,700,,607$601 in $2024),Transgrid and Essential Energy cost submission,Class 5b(±50%),0.8671428571428571,0.0,Short: (4 years), +DN1,Dubbo,Option 2a,• Rebuild Wollar West-Wollar 330 kV line (L75) as double-circuit • Expand existing Wollar 500/330 kV substation with one 1500 MVA transformer • Upgrade Wollar substation,DN1 Option 1,500,,126$125 in $2024),Transgrid and Essential Energy cost submission,Class 5b(±50%),0.252,0.0,Short: (5 years), +DN1,Dubbo,Option 2b,• New 330 kV line from Stubbo Switching Station to Wollar Substation • Upgrade Wollar and Stubbo substations,DN1 Option 2a,100,,283$280 in $2024),Transgrid and Essential Energy cost submission,Class 5b(±50%),2.83,45.0,Medium: (6 years), +DN1,Dubbo,Option 3,• New 330/132 kV substation between Wellington and Mt Piper with 2 x 375 MVA transformers • Cut-in existing Wellington-Mt Piper 330 kV line (L72) at new substation • Rebuild section between new substation to Wellington as double-circuit • New 330 kV line from the new substation to Mt Piper,DN1 Option 1,1200,,953$943 in $2024),Transgrid and Essential Energy cost submission,Class 5b(±50%),0.7941666666666667,55.0,Medium: (6 years), +DN2,Marulan,Option 1,• New Marulan 132 kV Energy Hub • Rebuild Brisbane Grove 66 kV substation • Rebuild 132 kV lines: (i) Marulan Energy Hub – Goulburn Substation (972) (ii) Marulan Energy Hub – Taralga Substation (9UR) • Upgrade protection systems • Expand existing Marulan 330/132 kV substation with one 375 MVA transformer and upgrade the existing transformer to 375 MVA,,375,,274$271 in $2024),Transgrid and Essential Energy cost submission,Class 5b(±50%),0.7306666666666667,0.0,Short: (4 years), +DN3,Yass,Option 1,• New Gunning 132 kV Energy Hub • Rebuild Yass Substation – Goulburn Substation (971) 132 kV line • Rebuild Yass Substation – Yass Town Zone Substation (824) 66 kV line as 132 kV line • Upgrade protection systems • Expand existing Yass 330/132 kV substation with two 200 MVA transformer,,400,,309$306 in $2024),Transgrid and Essential Energy cost submission,Class 5b(±50%),0.7725,0.0,Short: (4 years), diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_options_QLD.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_options_QLD.csv new file mode 100644 index 00000000..6c31fd18 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_options_QLD.csv @@ -0,0 +1,27 @@ +REZ / constraint ID,REZ name,Option,Augmentation description,Pre-requisite options,Additional network capacity (MW),Additional import capacity (MW),Expected cost ($2025 million),Cost estimate source,Cost estimate class,$M/MW,Easement length (km),Lead time,Notes +Q1,Far North QLD,Option 1,• Establish a new 275 kV substation in the Lakeland area • Build a double-circuit 275 kV line from Walkamin to the new substation near Lakeland • Build a new 275 kV Chalumbin to Walkamin single-circuit line • Rebuild the double-circuit Chalumbin to Ross 275 kV line at a higher capacity (possibly timed with asset replacement) • Build additional Chalumbin to Ross 275 kV double-circuit tower but switch as a single-circuit line (energise second line as generation develops),,1290.0,1290.0,4166.8836,AEMO TCD,Class 5b(±50%),3.230142325581395,486.0,Long: (7 years), +Q2,North Qld Clean Energy Hub,CopperString 2032,"• Establish a new 500 kV substation south of Townsville (NQ 500 kV substation) • Install 2 x 500/275 kV 1500 MVA transformers at NQ 500 kV substation • Establish a new 275 kV substation • Cut-in the Strathmore to Ross 275 kV double-circuit line to the NQ substation • Establish a new 500 kV substation at Hughenden with associated switchgear, bays, and required 500/330 kV transformers • Establish a new 500 kV substation (mid-point between NQ 500 kV and Hughenden substations) with associated switchgear and bays • A new 500 kV transmission line from south of Townsville to Hughenden • A new 330 kV transmission line from Hughenden to Cloncurry • A new 220 kV transmission line from Cloncurry to Mount Isa • Up to six new substation sites • Associated static and dynamic reactive plant • (Only the 500 kV transmission line from south of Townsville to Hughenden to be modelled for the purpose of the 2024 Integrated System Plan and 2025 Electricity Network Options Report)",,1500.0,,This project is considered to be anticipated and so is not included as an option here. The scope of the project is listed here for context only.,AEMO TCD (2024 ISP),,,,, +Q2,North Qld Clean Energy Hub,Option 1,"• Establish a 275 kV yard at Kidston substation near Forsayth • Build a 275 kV double-circuit line from Kidston to Guybal Munjan substation (energise only a single line until generation in the REZ develops, then energise the second line)",,500.0,,1093.8171799333,AEMO TCD,Class 5b(±50%),2.1876343598666,190.0,Long: (10 years), +Q2,North Qld Clean Energy Hub,Option 2,• Establish a 275 kV yard at Kidston substation near Forsayth • Build a 275 kV double-circuit line from Kidston to Guybal Munjan substation,Q2 Option 1,1000.0,,1137.3254964742,AEMO TCD,Class 5b(±50%),1.1373254964742,190.0,Long: (10 years), +Q3,Northern Qld,See NQ1 group constraint augmentations,,,,,,,,,,, +Q4,Isaac,See CQ1 group constraint augmentations,,,,,,,,,,, +Q5,Barcaldine,Option 1,• Establish a 275 kV substation in the Barcaldine region • Build a 340 km 275 kV double-circuit line from Lilyvale to Barcaldine (energise only a single line until generation in the REZ develops),,500.0,,1649.1621160596,AEMO TCD,Class 5b(±50%),3.2983242321192,340.0,Long: (7 years), +Q5,Barcaldine,Option 2,• Energise the second circuit on the line established in Option 1 • Additional substation bays and reactors if required,Q5 Option 1,850.0,,,AEMO TCD,Class 5b(±50%),0.0,,Medium: (6 years), +Q6,Fitzroy,See CQ-GG and SQ-CQ flow path augmentations,,,,,,,,,,, +Q7,Wide Bay,See SQ1 group constraint augmentations,,,,,,,,,,, +Q8,Darling Downs,See SWQLD1 transmission limit constraint augmentations,,,,,,,,,,, +Q9,Banana,Option 1,• Establish a new 500 kV substation within the Banana REZ • 200 km double-circuit 500 kV line from the Banana REZ to CQ substation associated with SQ-CQ Option 5 or SQ-CQ Option 6 • Additional 500/275 kV 1500 MVA transformer at the CQ substation • Switchgear at CQ substation,SQ-CQ Option 5 or SQ-CQ Option 6,3000.0,,1565.9453895872,AEMO TCD,Class 5b(±50%),0.5219817965290666,220.0,Long: (7 years), +Q9,Banana,Option 2,• Establish a new 275 kV substation within the Banana REZ • 100 km high temperature conductor (HTC) double-circuit 275 kV line from Banana REZ to Calvale substation • Associated switchgear • Limit extension special protection scheme (similar to a virtual transmission line) – cost of non-network service agreement excluded,CQ-GG Option 1 or CQ-GG Option 2,1800.0,,864.9887365060699,AEMO TCD,Class 5b(±50%),0.4805492980589277,144.0,Medium: (6 years), +Q9,Banana,Option 3,• Establish a new 275 kV substation within the Banana REZ • 195 km double-circuit 275 kV line from Banana REZ to Wandoan South • Switchgear at Wandoan South,,1000.0,,536.25761472349,AEMO TCD,Class 5b(±50%),0.53625761472349,102.0,Medium: (6 years), +Q10,Collinsville,See CQ-NQ flow path augmentations,,,,,,,,,,, +NQ1,Group Constraint NQ1,Option 1,"• A new 275 kV double-circuit line from Ross to Strathmore to Nebo, initially switching one side only",Assume BAU line refit of 275 kV and 132 kV network between Bouldercombe-Nebo-Strathmore-Ross,680.0,,1799.1303178628,AEMO TCD,Class 5b(±50%),2.64577987921,335.0,Long: (10 years), +NQ1,Group Constraint NQ1,Option 2,• 500 kV substation works at Mulgrave (near Townsville 500 kV established as part of CopperString 2032 project) • A new 500 kV substation at locality of northern part of CQ (around 27 km south of Broadsound) • A new 500 kV substation at locality of southern part of NQ (around 80 km south of Nebo) • A new 500 kV double-circuit steel tower (DCST) line from CQ (west of Gladstone) to northern CQ substation • A new 500 kV DCST line from northern CQ to southern NQ substations • A new 500 kV DCST line from southern NQ substation to Mulgrave substation • 2 x 500/275 kV 1500 MVA transformers at northern CQ and southern NQ substations • Cut-in 275 kV circuits between Stanwell and Broadsound to northern CQ substation and between Broadsound and Nebo to southern NQ substation • Special protection scheme for transfer limit increase (similar to virtual transmission line) with the cost of this Network Service Agreement (NSA) excluded,"SQ-CQ Option 3 (QEJP), Q2 CopperString 2032 Project",3000.0,,4814.9696414332,AEMO TCD,Class 5b(±50%),1.604989880477733,623.0,Long: (10 years), +CQ1,Group Constraint NQ1,Option 1,• String and energise the second circuit between Broadsound and Stanwell 275 kV,,600.0,,208.8612697321398,AEMO TCD,Class 5b(±50%),0.3481021162202331,0.0,Short: (4 years), +CQ1,Group Constraint NQ1,Option 2,• Rebuild Broadsound to Bouldercombe 275 kV line (820) as a part of end-of-life refurbishment,,1600.0,,533.57550376317,AEMO TCD,Class 5b(±50%),0.3334846898519813,146.0,Long: (7 years), +SQ1,Group Constraint - Wide Bay,Option 1,• Rebuild Woolooga to Palmwood to South Pine 275 kV single-circuit line as a high-capacity double-circuit line • 100 MVAr reactor for voltage control,,1100.0,,1033.7385644228,AEMO TCD,Class 5b(±50%),0.9397623312934545,168.0,Long: (7 years), +SQ1,Group Constraint - Wide Bay,Option 2,• Rebuild Woolooga to South Pine 275 kV single-circuit line as a high-capacity double-circuit line • 100 MVAr reactor for voltage control,,1100.0,,918.42208873725,AEMO TCD,Class 5b(±50%),0.8349291715793181,158.0,Long: (7 years), +SWQLD1,Transmission Limit Constraint - Darling Downs,Option 1,• Replace existing 330/275 kV 1300 MVA transformer at Middle Ridge with 330/275 kV 1500 MVA transformer,,150.0,,26.423269823455,AEMO TCD,Class 5b(±50%),0.1761551321563667,0.0,Short: (2 years), +SWQLD1,Transmission Limit Constraint - Darling Downs,Option 2,• Implement a limit extension special protection scheme – run-back of generation in south-west Queensland with 300 MW battery energy storage system (BESS) response in south-east Queensland (similar to a virtual transmission line),,330.0,,6.7540571387313,AEMO TCD,Class 5b(±50%),0.02046683981433727,0.0,Short: (2 years), +SWQLD1,Transmission Limit Constraint - Darling Downs,Option 3,• Establish a second 330 kV substation to the east of the existing Tummaville substation • Install 8 x 330/330 kV 300 MVA phase-shifting transformers (PST) between the two 330 kV substations,,400.0,,487.86875348745,AEMO TCD,Class 5b(±50%),1.219671883718625,0.0,Long: (7 years), +SWQLD1,Transmission Limit Constraint - Darling Downs,Option 4,• New 2 x 500/275 kV 1500 MVA transformers at Western Downs with associated switchgear and bays • Cut-in 500 kV double-circuit single tower lines from Halys to NNSW and associated switchgear and bays,"NNSW–SQ Option 5, SQ-CQ Option 5 or SQ-CQ Option 6",1500.0,,264.08681596557,AEMO TCD,Class 5b(±50%),0.17605787731038,0.0,Long: (7 years), +SWQLD1,Transmission Limit Constraint - Darling Downs,Option 5,• Establish a REZ Hub substation 70 km from Wandoan South • Double-circuit 275 kV line between Wandoan South and REZ Hub (twin Sulphur) – 70 km • Double-circuit 275 kV line between REZ Hub and Auburn River (twin HTC) – 100 km • Second double-circuit HTC 275 kV line will be built between REZ Hub and Auburn River depending on variable renewable energy (VRE) development,SQ-CQ Option 2,0.0,,946.7928294602,AEMO TCD,Class 5b(±50%),0.0,156.0,Medium: (6 years), diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_options_SA.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_options_SA.csv new file mode 100644 index 00000000..08e8491d --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_options_SA.csv @@ -0,0 +1,17 @@ +REZ / constraint ID,REZ name,Option,Augmentation description,Pre-requisite options,Additional network capacity (MW),Additional import capacity (MW),Expected cost ($2025 million),Cost estimate source,Cost estimate class,$M/MW,Easement length (km),Lead time,Notes +S1,South East SA,See WNV-SESA and SESA-CSA sub-regional augmentations,,,,,,,,,,, +S2,Riverland,Option 1,• Co-ordinate new connections through turn in of Bundey – Buronga 330 kV No. 1 and No. 2 lines into a new substation at Riverland. • 2x 275/132 kV Tx at new Riverland substation,,700.0,,152.24797927679,AEMO TCD,Class 5b(±50%),0.2174971132525572,0.0,Short: (4 years), +S3,Mid-North SA,See MN1 group constraint augmentations,,,,,,,,,,, +S4,Yorke Peninsula,Option 1,• String first circuit of a 275 kV double-circuit line from Blythe West into new Yorke Peninsula substation.,MN1 Option 1,450.0,,646.45007670102,AEMO TCD,Class 5b(±50%),1.436555726002267,148.0,Medium: (6 years), +S4,Yorke Peninsula,Option 2,• String second circuit of a 275 kV double-circuit line from Blythe West into new Yorke Peninsula substation. • 2x 275/132 kV Tx at new Yorke Peninsula substation • Cut in of Templers West into Bundey-Para 275 kV line.,"MN1 Option 1, S4 Option 1",450.0,,198.00953914269,AEMO TCD,Class 5b(±50%),0.4400211980948666,0.0,Long: (7 years), +S5,Northern SA,See NSA1 group constraint augmentations,,,,,,,,,,, +S6,Roxby Downs,Option 1,• Build 275 kV double-circuit line from Davenport to new Roxby Downs substation. • 2x 275/132 kV Tx at new Roxby Downs substation,,950.0,,1365.2311217174,AEMO TCD,Class 5b(±50%),1.437085391281474,254.0,Short: (5 years), +S7,Eastern Eyre Peninsula,Option 1,• A new Yadnarie North substation with two new 275/132 kV transformers. • Operate the Cultana-Yadnarie 132 kV double-circuit line (built as part of the Eyre Peninsula Link RIT-T [footnote]) at 275 kV. • Reconnect 132 kV connections to 275 kV at both Yadnarie North and Cultana.,,300.0,300.0,179.0,ElectraNet,Class 4(-30% to +50%),0.5966666666666667,0.0,Short: (4 years), +S8,Western Eyre Peninsula,Option 1,• 275 kV double-circuit line from Cultana East to a new Elliston substation. • 2x 275/132 kV Tx at new Elliston substation,,950.0,,1474.1990839529,AEMO TCD,Class 5b(±50%),1.551788509424105,285.0,Long: (7 years), +S8,Western Eyre Peninsula,Option 2,• 275 kV single-circuit line from Yadnarie to a new Elliston substation. • 2x 275/132 kV Tx at new Elliston substation,S7 Option 1,500.0,,683.76240270064,AEMO TCD,Class 5b(±50%),1.36752480540128,160.0,Long: (7 years), +S8,Western Eyre Peninsula,Option 3,• New Elliston substation. • Single-circuit 275 kV line from Cultana/Corraberra Hill/Cultana East to Elliston. • Single-circuit 275 kV line from Yadnarie to Elliston. • 2x 275/132 kV Tx at new Elliston substation,S7 Option 1,1000.0,,1721.1762635472,AEMO TCD,Class 5b(±50%),1.7211762635472,445.0,Long: (7 years), +MN1,Group Constraint - facilitating power out of mid-north SA,Option 1,"(ISP Candidate Option) Build a 275 kV double-circuit line between Bundey and Para. 2x new line-connected reactors at Bundey 2x new line-connected reactors at Para Disconnect existing Waterloo-Templers 132 kV line at each end. Build a 132 kV single-circuit line from Templers West to Templers. 1 x 160 MVA, 275/132 kV transformer at Templers West.",,1200.0,,620.0,ElectraNet,Class 5b(±50%),0.5166666666666667,115.0,Short: (3 years), +MN1,Group Constraint - facilitating power out of mid-north SA,Option 2,"• Build a 275 kV double-circuit line from Bundey to Globe Derby (twin conductor Olive) • 2x new 275 kV line-connected reactors at Bundey • New 275 kV substation at Globe Derby • 2x new 275 kV line-connected reactors at Globe Derby • Connect Globe Derby to existing metropolitan 275 kV network. • Disconnect existing Waterloo-Templers 132 kV line at each end. • Build a 132 kV single-circuit line from Templers West to Templers. • 1 x 160 MVA, 275/132 kV transformer at Templers West",,1200.0,,800.0,ElectraNet,Class 5b(±50%),0.6666666666666666,151.0,Short: (3 years), +MN1,Group Constraint - facilitating power out of mid-north SA,Option 3,"• Build a 330 kV double-circuit line from Bundey to Globe Derby (triple conductor Mango) • 2x330 kV line-connected reactors at Bundey • New 275 kV substation at Globe Derby • 2x new 330 kV line-connected reactors at Globe Derby • Connect Globe Derby to existing metropolitan 275 kV network. • Disconnect existing Waterloo-Templers 132 kV line at each end. • Build a 132 kV single-circuit line from Templers West to Templers. • 1 x 160 MVA, 275/132 kV transformer at Templers West",,1250.0,,960.0,ElectraNet,Class 5b(±50%),0.768,151.0,Short: (3 years), +MN1,Group Constraint - facilitating power out of mid-north SA,Option 4,"Build a 500 kV double-circuit line from Bundey to Globe Derby 500 kV switchyard and 3x1000 MVA 500/275 kV transformers at Bundey and 2x500 kV exits 2x500 kV line-connected reactors at Bundey New 500 kV substation at Globe Derby, incl. 3x1000 MVA transformers 500/275 kV transformers, at least 4 x 500 kV exits and 8 x 275 kV exits 2x new 500 kV line-connected reactors at Globe Derby Connect Globe Derby to existing metropolitan 275 kV network. Disconnect existing Waterloo-Templers 132 kV line at each end. Build a 132 kV single-circuit line from Templers West to Templers. 1 x 160 MVA, 275/132 kV transformer at Templers West",,1300.0,,1905.2130258234,AEMO TCD,Class 5b(±50%),1.465548481402615,145.0,Short: (3 years), +NSA1,Group Constraint - facilitating power out of north SA,Option 1,• Build a new 275 kV switching station Carriewerloo • Build a 275 kV double-circuit line from Davenport-Carriewerloo-Cultana.,,900.0,900.0,484.0,ElectraNet,Class 4(-30% to +50%),0.5377777777777778,122.0,Short: (4 years), diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_options_TAS.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_options_TAS.csv new file mode 100644 index 00000000..516e9547 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_options_TAS.csv @@ -0,0 +1,11 @@ +REZ / constraint ID,REZ name,Option,Augmentation description,Pre-requisite options,Additional network capacity (MW),Additional import capacity (MW),Expected cost ($2025 million),Cost estimate source,Cost estimate class,$M/MW,Easement length (km),Lead time,Notes +T1,North East Tasmania,Option 1,"• Build new substation at Long Reach, cutting into transmission lines from George Town to Sheffield and Hadspen substations • Build new Far North East wind collector station • 220 kV double-circuit line between new Long Reach substation and new substation in far north-east Tasmania.",,800,,820.9028635175266,AEMO TCD,Class 5b(±50%),1.026128579396908,117,Long: (8 years), +T1,North East Tasmania,Option 2,"• Second 220 kV double-circuit line between the new substations in Long Reach and far north-east Tasmania, strung one side only. Prerequisite: T1 Option 1",T1 Option 1,800,,615.12832467518,AEMO TCD,Class 5b(±50%),0.768910405843975,112,Long: (8 years), +T2,North West Tasmania,Option 1,• Build a new double-circuit 220 kV Burnie-Hamsphire Hills 220 kV line • Build a new Hampshire Hills wind collector station.,TAS-SEV Option 1,800,,245.4103,AEMO TCD,Class 5b(±50%),0.306762875,30,Short: (4 years), +T2,North West Tasmania,Option 2,• Build new “Farrell 2” wind collector station on west coast Tasmania (nearby existing Farrell substation) • Build new double-circuit Farrell2-Hampshire Hills 220 kV line. • Build a second 220 kV double-circuit line from Hampshire Hills to Burnie to Heybridge.,"TAS-SEV Option 2, T2 Option 1",800,,825.04678924525,AEMO TCD,Class 5b(±50%),1.031308486556562,95,Long: (8 years), +T2,North West Tasmania,Option 3,• Build double-circuit West Montagu-Hampshire 220 kV line. • Build a second 220 kV double-circuit line from Hampshire Hills to Burnie to Heybridge.,"TAS-SEV Option 2, T2 Option 1",800,,1009.57566984297,AEMO TCD,Class 5b(±50%),1.261969587303712,132,Long: (8 years), +T3,Central Highlands,Option 1,(ISP Candidate Option) • Build a Palmerston-Waddamana 220 kV double-circuit line.,TAS-SEV Option 1,555,555.0,621.0,TasNetworks,Class 4(-30% to +50%),1.118918918918919,60,Medium: (6 years), +T3,Central Highlands,Option 1A,- Convert Waddamana-Palmerston 110 kV line to 220 kV operation (line did previously operate at 220 kV) - Re-string with HTLS conductor - Install 220/110 kV transformer at Waddamana Substation,TAS-SEV Option 1,555,555.0,224.0,TasNetworks,Class 4(-30% to +50%),0.4036036036036036,0,Short: (4 years), +T3,Central Highlands,Option 2,- Re-build Palmerston-Hadspen-George Town 220 kV transmission line,T3 Option 1 or T3 Option 1A,690,690.0,523.8847780882501,AEMO TCD,Class 5b(±50%),0.759253301577174,84,Long: (8 years), +T4,North Tasmania Coast,Option 1,•Build a second Burnie-Heybridge -Sheffield 220 kV double-circuit line,TAS-SEV Option 2,1360,,381.53480831059,AEMO TCD,Class 5b(±50%),0.280540300228375,51,Long: (8 years), +T4,North Tasmania Coast,Option 2,• Build a second George Town-Sheffield 220 kV double-circuit line. • Build 2 x power flow controllers on the 2 x 220 kV double-circuit line between George Town-Hadspen. • Build a new substation co-located to George Town,TAS-SEV Option 2,900,900.0,444.69346065842,AEMO TCD,Class 5b(±50%),0.4941038451760222,66,Long: (8 years), diff --git a/tests/test_workbook_table_cache/7.5/rez_augmentation_options_VIC.csv b/tests/test_workbook_table_cache/7.5/rez_augmentation_options_VIC.csv new file mode 100644 index 00000000..812c5536 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/rez_augmentation_options_VIC.csv @@ -0,0 +1,23 @@ +REZ / constraint ID,REZ name,Option,Augmentation description,Pre-requisite options,Additional network capacity (MW),Additional import capacity (MW),Expected cost ($2025 million),Cost estimate source,Cost estimate class,$M/MW,Easement length (km),Lead time,Notes +V1,North West VIC,Option 1,Rebuild existing single circuit to high-capacity 220 kV double circuit from Kerang/New Kerang – Bendigo.,"WNV-SNSW Option 1 - VNI West, Western Renewables Link",200,,750.0,VicGrid,Class 5(-50% to +100%),3.75,126.0,Long: (9 years),These are unadjusted cost estimates provided by VicGrid. AEMO understands these to be classified as Class 5 estimates under the AACE classification system. +V1,North West VIC,Option 2,Rebuild existing single circuit to high-capacity 220 kV double circuit between Red Cliffs-Wemen-Kerang.,"WNV-SNSW Option 1 - VNI West, Western Renewables Link, V1 Option 1",530,,1270.0,VicGrid,Class 5(-50% to +100%),2.39622641509434,248.0,Long: (9 years), +V3,Wimmera Grampians,Refer to WV1 group constraint augmentations,,,,,,,,,,, +V4,Wimmera Southern Mallee,Refer to WV1 group constraint augmentations,,,,,,,,,,, +WV1,Group Constraint - South West Victoria,Option 1,Rebuild existing single circuit to high-capacity 220 kV double circuit from Murra Warra to Horsham to Ballarat.,"WNV-SNSW Option 1 - VNI West, Western Renewables Link",600,,1350.0,VicGrid,Class 5(-50% to +100%),2.25,211.0,Long: (9 years), +V5,South West VIC,Refer to SWV1 group constraint augmentations,Refer to SWV1 group constraint augmentations,,,,,,,,,, +V6,Gippsland Onshore,Refer to SEV-MEL flow path options,Refer to SEV-MEL flow path options,,,,,,,,,,"AEMO is aware that some distribution networks have progressed RIT-Ds in sub-transmission networks to enable the connection of new generation, which may not be captured in the ISP due to model tractability and complexity. Connection Enablement: Morwell South area - https://www.ausnetservices.com.au/-/media/project/ausnet/corporate-website/files/about/regulatory-investment-test/2025/ce-mwts-south_fpar.pdf?rev=4de75e3c9f874ec3b3a7a2124ded0918&hash=C36AE9AC87C006EF8629C3FBAE734713 Connection Enablement: Morwell East area - https://www.aer.gov.au/system/files/2025-02/ASD%20-%20AusNet%20-%20MWTS-TGN%20FPAR%20-%20310125%20-%20PUBLIC.pdf Morwell East Stage 2 - https://www.aer.gov.au/system/files/2025-02/ASD%20-%20AusNet%20-%20MWTS%20East%20Stage%202%20Business%20case%20-%20310125%20-%20PUBLIC.pdf" +V7,Central North VIC,Option 1,Rebuild existing single circuit to high-capacity 220 kV double circuit from Shepparton to Dederang via Glenrowan.,,250,250.0,990.0,VicGrid,Class 5(-50% to +100%),3.96,155.0,Long: (8 years), +V7,Central North VIC,Option 2,Rebuild existing single circuit to high-capacity 220 kV double circuit from Shepparton – Near Bendigo.,,500,,790.0,VicGrid,Class 5(-50% to +100%),1.58,133.0,Long: (8 years), +V8,Gippsland Offshore,Option 1,500 kV double circuit radial line from Loy Yang to Giffard.,,2000,,1500.0,VicGrid,Class 5(-50% to +100%),0.75,55.0,Short: (5 years),"As advised by VicGrid, AEMO has used the upper bound of the range from the Draft ENOR for the purposes of use in the ISP modelling. VicGrid is undertaking further assessment of this project and will publish the updated costs later this year." +V8,Gippsland Offshore,Option 2,500 kV double circuit radial line from new terminal station near Woodside to new terminal station near Hazelwood.,V8 Option 1,2000,,790.0,VicGrid,Class 5(-50% to +100%),0.395,80.0,Long: (7 years),The Victorian Transmission Plan has identified a need for this project but has not yet identified a preferred route. VicGrid will consult publicly to determine a study area for this project before identifying a preferred corridor. +V9,Southern Ocean,Option 1,Uprating of Portland-Heywood 500 kV double circuit lines,,1000,,10.0,VicGrid,Class 5(-50% to +100%),0.01,0.0,Long: (12 years), +V2,Central Highlands VIC,Option 1,Rebuild existing single circuit to high-capacity 220kV double circuit from Ballarat (BATS) – Moorabool (MLTS).,Western Renewables Link,400,,360.0,VicGrid,Class 5(-50% to +100%),0.9,64.0,Short: (4 years), +SWV1,Group Constraint - South West Victoria,Option 1A,• New 500 kV double-circuit line strung on one side from Mortlake – Moorabool. • Sydenham line upratings.,MEL-WNV Option 1 or MEL-WNV Option 2,1500,1500.0,1201.5734364498,AEMO TCD,Class 5b(±50%),0.8010489576332,152.0,Long: (7 years), +SWV1,Group Constraint - South West Victoria,Option 1C,"• Heywood- Mortlake 500 kV double-circuit line, strung on one side.","MEL-WNV Option 1 or MEL-WNV Option 2, MEL-WNV Option 3, SWV1 Option 1A",1750,1750.0,831.5392261623999,AEMO TCD,Class 5b(±50%),0.4751652720928,99.0,Long: (7 years), +SWV1,Group Constraint - South West Victoria,Option 2B,• New Mortlake – Bulgana 500 kV double circuit,MEL-WNV Option 1 or MEL-WNV Option 2,2900,2900.0,1310.0,VicGrid,Class 5(-50% to +100%),0.4517241379310345,114.0,Long: (7 years), +SWV1,Group Constraint - South West Victoria,Option 3A,"• New Heywood - Bulgana 500 kV double-circuit, strung on one side. • New Alcoa Portland - Heywood 500 kV double circuit, strung on one side",MEL-WNV Option 1 or MEL-WNV Option 2,1800,,1488.7546,AEMO TCD,Class 5b(±50%),0.8270858888888889,203.0,Long: (7 years), +SWV1,Group Constraint - South West Victoria,Option 3C,• String other side of the New Heywood - Bulgana 500 kV.,SWV1 Option 3A,1000,,369.08154695233,AEMO TCD,Class 5b(±50%),0.36908154695233,178.0,Long: (7 years), +SWV1,Group Constraint - South West Victoria,Option 3B,• New Heywood - Bulgana 500 kV double-circuit • New Alcoa Portland - Heywood 500 kV single circuit,MEL-WNV Option 1 or MEL-WNV Option 2,2800,,1778.2883807356,AEMO TCD,Class 5b(±50%),0.6351029931198571,191.0,Long: (7 years), +SWV1,Group Constraint - South West Victoria,Option 4,"New 500kV double circuit line from Tarrone - Mortlake - Moorabool, and turn in of Heywood - Mortlake 500 kV at Tarrone.",MEL-WNV Option 1 or MEL-WNV Option 2,2750,2750.0,1930.0,VicGrid,Class 5(-50% to +100%),0.7018181818181818,201.0,Long: (7 years), +SWV1,Group Constraint - South West Victoria,Option 5,New Heywood – Tarrone 500 kV double circuit.,"SWV1 Option 1A, MEL-WNV Option 1 or MEL-WNV Option 2",1380,,510.0,VicGrid,Class 5(-50% to +100%),0.3695652173913043,50.0,Long: (7 years), +SEVIC1,Group Constraint - South East Victoria,Option 1,Tie-in loop between Giffard and new terminal station near Woodside (500 kV double circuit line linking the two Gippsland radial lines).,"V8 Option 1, V8 Option 2",4600: 3000),,400.0,VicGrid,Class 5(-50% to +100%),0.08695652173913043,40.0,Long: (12 years),The Victorian Transmission Plan has identified a need for this project but has not yet identified a preferred route. VicGrid will consult publicly to determine a study area for this project before identifying a preferred corridor. diff --git a/tests/test_workbook_table_cache/7.5/sub_regional_reference_nodes.csv b/tests/test_workbook_table_cache/7.5/sub_regional_reference_nodes.csv new file mode 100644 index 00000000..e01827b5 --- /dev/null +++ b/tests/test_workbook_table_cache/7.5/sub_regional_reference_nodes.csv @@ -0,0 +1,16 @@ +NEM region,ISP sub-region,Sub-regional reference node +Queensland,Northern Queensland (NQ),Ross 275 kV +Queensland,Central Queensland (CQ),Broadsound 275 kV +Queensland,Gladstone Grid (GG),Calliope River 275 kV +Queensland,Southern Queensland (SQ),South Pine 275 kV +New South Wales,Northern New South Wales (NNSW),Armidale 330 kV +New South Wales,Central New South Wales (CNSW),Wellington 330 kV +New South Wales,Southern NSW (SNSW),Canberra 330 kV +New South Wales,"Sydney, Newcastle, Wollongong (SNW)",Sydney West 330 kV +Victoria,West and North Victoria (WNV),Moorabool 220 kV +Victoria,South East Victoria (SEV),Hazelwood 500 kV +Victoria,Greater Melbourne and Geelong (MEL),Thomastown 66 kV +South Australia,Northern South Australia (NSA),Davenport 275 kV +South Australia,Central South Australia (CSA),Torrens Island 66 kV +South Australia,South East South Australia (SESA),South East 132 kV +Tasmania,Tasmania (TAS),George Town 220 kV From 9a322ab5e335ca07e8c8c99ecadf0f25f25e9408 Mon Sep 17 00:00:00 2001 From: nick-gorman Date: Thu, 7 May 2026 10:56:39 +1000 Subject: [PATCH 12/14] Merge non-numeric capacity skip + log tests The two tests had identical inputs and exercised the same code path; collapsing them follows the combined output-plus-log pattern already used elsewhere in this file. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../test_templater/test_network_expansion.py | 62 ++++--------------- 1 file changed, 12 insertions(+), 50 deletions(-) diff --git a/tests/test_templater/test_network_expansion.py b/tests/test_templater/test_network_expansion.py index 0eacf853..9c82eb92 100644 --- a/tests/test_templater/test_network_expansion.py +++ b/tests/test_templater/test_network_expansion.py @@ -152,8 +152,9 @@ def test_template_network_expansion_picks_least_cost_and_splits_directions( ) -def test_template_network_expansion_skips_non_numeric_capacity(csv_str_to_df): - # SWNSW1-style option with "Removes limit" should be skipped. +def test_template_network_expansion_skips_non_numeric_capacity(csv_str_to_df, caplog): + # SWNSW1-style option with "Removes limit" should be skipped, with an INFO log + # so the operator can audit silent filtering. flow_path_options = { "CQ-NQ": _fp_options( [ @@ -181,14 +182,15 @@ def test_template_network_expansion_skips_non_numeric_capacity(csv_str_to_df): CQ-NQ, CQ """) - options, costs = _template_network_expansion( - flow_path_options=flow_path_options, - flow_path_costs=flow_path_costs, - rez_options=rez_options, - rez_costs=rez_costs, - network_transmission_paths=network_transmission_paths, - rez_ids=set(), - ) + with caplog.at_level(logging.INFO): + options, costs = _template_network_expansion( + flow_path_options=flow_path_options, + flow_path_costs=flow_path_costs, + rez_options=rez_options, + rez_costs=rez_costs, + network_transmission_paths=network_transmission_paths, + rez_ids=set(), + ) # Only Option 1 survives (Option 2 has non-numeric capacity, skipped). expected_options = csv_str_to_df(""" @@ -204,46 +206,6 @@ def test_template_network_expansion_skips_non_numeric_capacity(csv_str_to_df): check_dtype=False, ) - -def test_template_network_expansion_logs_skipped_non_numeric_capacity_options( - csv_str_to_df, caplog -): - # Same shape as the skip test above, but asserts the INFO log fires for the - # dropped option so the operator can audit silent filtering. - flow_path_options = { - "CQ-NQ": _fp_options( - [ - ("CQ-NQ", "CQ-NQ Option 1", 1000, 1000), - ( - "CQ-NQ", - "CQ-NQ Option 2", - "Removes limit", - "Non-network augmentation", - ), - ] - ), - } - flow_path_costs = { - "CQ-NQ": csv_str_to_df(""" - Flow path, Option, 2024-25, 2025-26 - CQ-NQ, CQ-NQ Option 1, 1000000, 1010000 - CQ-NQ, CQ-NQ Option 2, 500000, 505000 - """), - } - - with caplog.at_level(logging.INFO): - _template_network_expansion( - flow_path_options=flow_path_options, - flow_path_costs=flow_path_costs, - rez_options={}, - rez_costs={}, - network_transmission_paths=csv_str_to_df(""" - path_id, geo_from - CQ-NQ, CQ - """), - rez_ids=set(), - ) - assert ( "Skipping option 'CQ-NQ Option 2' for 'CQ-NQ': " "no numeric capacity in forward or reverse direction." From 0dbd4c593b3850fc90b36e4ce79aa7b0664882d2 Mon Sep 17 00:00:00 2001 From: nick-gorman Date: Thu, 7 May 2026 13:37:14 +1000 Subject: [PATCH 13/14] Fix new-format doit target list and add new-format CLI mechanism test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit list_templater_output_files returned the old-format file names regardless of feature flag, so for new-format runs doit's target list pointed at files that don't exist. The task therefore re-ran on every invocation, silently masking the cache-skipping behaviour. Added a feature-flag branch returning _NEW_FORMAT_TEMPLATE_OUTPUTS for new-format runs. The bug was discovered by extending the new-format CLI test to do a second invocation and assert up-to-date detection. That assertion lives in a new mechanism test sibling to the existing 6.0 mechanism test — test_create_ispypsa_inputs_task_new_format — covering the same fresh-run / up-to-date / config_changed / extensive-trigger flow against the new-format CLI path. The new-format coverage is split into a parallel test file rather than parameterising the existing tests. Trades some duplication during the transition for a cleaner handover when 6.0 is dropped: the legacy file is deleted and the new-format file is renamed in place, no diffs inside test bodies. Helpers are split the same way — format-agnostic infrastructure (run_cli_command, build_mock_config, etc.) stays shared in cli_test_helpers.py; the 7.5-specific fixtures live in cli_test_helpers_new_table_formats.py. Step-by-step handover plan is documented in the new test file's module docstring. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/ispypsa/templater/create_template.py | 24 +- tests/test_cli/cli_test_helpers.py | 61 +++- .../cli_test_helpers_new_table_formats.py | 32 ++ tests/test_cli/test_create_ispypsa_inputs.py | 202 +---------- ...create_ispypsa_inputs_new_table_formats.py | 342 ++++++++++++++++++ 5 files changed, 439 insertions(+), 222 deletions(-) create mode 100644 tests/test_cli/cli_test_helpers_new_table_formats.py create mode 100644 tests/test_cli/test_create_ispypsa_inputs_new_table_formats.py diff --git a/src/ispypsa/templater/create_template.py b/src/ispypsa/templater/create_template.py index e499d19e..90fdc0aa 100644 --- a/src/ispypsa/templater/create_template.py +++ b/src/ispypsa/templater/create_template.py @@ -69,6 +69,17 @@ "custom_constraints_rhs", ] +# Outputs from the new-format templater branch. Granularity-invariant: the +# same five tables are emitted for sub_regions, nem_regions, and single_region +# (only their contents differ). +_NEW_FORMAT_TEMPLATE_OUTPUTS = [ + "network_geography", + "network_transmission_paths", + "network_transmission_path_limits", + "network_expansion_options", + "network_transmission_path_expansion_costs", +] + def create_ispypsa_inputs_template( scenario: str, @@ -272,11 +283,14 @@ def create_ispypsa_inputs_template( def list_templater_output_files(regional_granularity, output_path=None): - files = _BASE_TEMPLATE_OUTPUTS.copy() - if regional_granularity in ["sub_regions", "single_region"]: - files.remove("nem_regions") - if regional_granularity == "single_region": - files.remove("flow_paths") + if FEATURE_FLAGS["use_new_table_format"]: + files = _NEW_FORMAT_TEMPLATE_OUTPUTS.copy() + else: + files = _BASE_TEMPLATE_OUTPUTS.copy() + if regional_granularity in ["sub_regions", "single_region"]: + files.remove("nem_regions") + if regional_granularity == "single_region": + files.remove("flow_paths") if output_path is not None: files = [output_path / Path(file + ".csv") for file in files] return files diff --git a/tests/test_cli/cli_test_helpers.py b/tests/test_cli/cli_test_helpers.py index 922d1c13..31b0de9b 100644 --- a/tests/test_cli/cli_test_helpers.py +++ b/tests/test_cli/cli_test_helpers.py @@ -86,12 +86,6 @@ def prepare_test_cache(tmp_path, mock_workbook_file): return _populate_test_cache(tmp_path, mock_workbook_file, "6.0") -@pytest.fixture -def prepare_test_cache_new_format(tmp_path, mock_workbook_file): - """Prepare a 7.5 new-format test cache from test_workbook_table_cache/7.5.""" - return _populate_test_cache(tmp_path, mock_workbook_file, "7.5") - - @pytest.fixture def mock_workbook_file(tmp_path): """Create a minimal Excel workbook that passes basic validation. @@ -114,27 +108,42 @@ def mock_workbook_file(tmp_path): return workbook_path -@pytest.fixture -def mock_config(tmp_path, mock_workbook_file): - """Create a minimal valid ISPyPSA configuration. +def build_mock_config( + tmp_path, + mock_workbook_file, + *, + version="6.0", + granularity="sub_regions", + scenario="Step Change", + filter_by_isp_sub_regions=None, + filename="test_config.yaml", +): + """Write an ISPyPSA YAML config tuned for CLI tests. + + Single source of truth for config-shape across all CLI tests. Callers + override only the dimensions they care about (workbook version, network + granularity, scenario, sub-region filter). Args: tmp_path: pytest temporary directory mock_workbook_file: Path to mock Excel workbook - - Returns: - Path: Path to the created config YAML file + version: IASR workbook version string (e.g. "6.0", "7.5") + granularity: regional granularity for the network + scenario: ISP scenario name + filter_by_isp_sub_regions: optional sub-region whitelist; omitted from + the config when None + filename: yaml filename to write inside tmp_path """ - config_path = tmp_path / "test_config.yaml" + config_path = tmp_path / filename config_content = { - "scenario": "Step Change", + "scenario": scenario, "wacc": 0.07, "discount_rate": 0.05, "network": { "transmission_expansion": True, "rez_transmission_expansion": True, "annuitisation_lifetime": 30, - "nodes": {"regional_granularity": "sub_regions", "rezs": "discrete_nodes"}, + "nodes": {"regional_granularity": granularity, "rezs": "discrete_nodes"}, "transmission_expansion_limit_override": None, "rez_connection_expansion_limit_override": None, "rez_to_sub_region_transmission_default_limit": 1e6, @@ -158,7 +167,7 @@ def mock_config(tmp_path, mock_workbook_file): }, "unserved_energy": {"cost": 10000.0, "max_per_node": 1e5}, "solver": "highs", - "iasr_workbook_version": "6.0", + "iasr_workbook_version": version, "paths": { "ispypsa_run_name": "test_run", "parsed_traces_directory": "tests/trace_data", @@ -170,15 +179,31 @@ def mock_config(tmp_path, mock_workbook_file): "dataset_type": "example", "dateset_year": 2024, }, - "filter_by_isp_sub_regions": ["NNSW", "SQ"], } - # Write YAML config + if filter_by_isp_sub_regions is not None: + config_content["filter_by_isp_sub_regions"] = filter_by_isp_sub_regions + with open(config_path, "w") as f: yaml.dump(config_content, f) return config_path +@pytest.fixture +def mock_config(tmp_path, mock_workbook_file): + """Create a minimal valid ISPyPSA configuration (6.0 + sub_regions + filter). + + Defaults preserved for backwards compatibility with existing tests across + the CLI suite. Tests that need different dimensions should call + `build_mock_config` directly with explicit kwargs. + """ + return build_mock_config( + tmp_path, + mock_workbook_file, + filter_by_isp_sub_regions=["NNSW", "SQ"], + ) + + @pytest.fixture def run_cli_command(): """Fixture to run CLI commands and capture output. diff --git a/tests/test_cli/cli_test_helpers_new_table_formats.py b/tests/test_cli/cli_test_helpers_new_table_formats.py new file mode 100644 index 00000000..d046b2c7 --- /dev/null +++ b/tests/test_cli/cli_test_helpers_new_table_formats.py @@ -0,0 +1,32 @@ +"""New-format-specific fixtures for CLI tests. + +Lives separate from cli_test_helpers.py so that when use_new_table_format +becomes the only path, this file is renamed back to cli_test_helpers.py +(after the legacy file is removed) without needing to disentangle anything. +Format-agnostic infrastructure (run_cli_command, assert_task_ran, the +mock_workbook_file fixture, etc.) stays in the sibling shared module. +""" + +import pytest + +from .cli_test_helpers import ( + _populate_test_cache, + build_mock_config, +) + + +@pytest.fixture +def prepare_test_cache_new_format(tmp_path, mock_workbook_file): + """Prepare a 7.5 new-format test cache from test_workbook_table_cache/7.5.""" + return _populate_test_cache(tmp_path, mock_workbook_file, "7.5") + + +@pytest.fixture +def mock_config_new_format(tmp_path, mock_workbook_file): + """Create a 7.5 ISPyPSA configuration tuned for the new-format templater. + + Defaults to sub_regions granularity. Tests that need a different + granularity should call `build_mock_config` directly with explicit kwargs + rather than overriding via this fixture. + """ + return build_mock_config(tmp_path, mock_workbook_file, version="7.5") diff --git a/tests/test_cli/test_create_ispypsa_inputs.py b/tests/test_cli/test_create_ispypsa_inputs.py index a935abd3..67545eb2 100644 --- a/tests/test_cli/test_create_ispypsa_inputs.py +++ b/tests/test_cli/test_create_ispypsa_inputs.py @@ -8,7 +8,9 @@ - CLI flags and dependency chain execution (combined) - Config path variations (combined) - Single task mode failure -- New-format end-to-end row counts and structural relationships (per granularity) + +New-format (use_new_table_format=true) coverage lives in the sibling file +test_create_ispypsa_inputs_new_table_formats.py. """ import shutil @@ -30,7 +32,6 @@ mock_workbook_file, modify_config_value, prepare_test_cache, - prepare_test_cache_new_format, run_cli_command, run_extensive, verify_output_files, @@ -268,200 +269,3 @@ def test_single_task_mode_fails_without_deps(mock_config, tmp_path, run_cli_comm config_path = create_config_with_missing_cache(mock_config, tmp_path) result = run_cli_command([f"config={config_path}", "create_ispypsa_inputs", "-s"]) assert result.returncode != 0 - - -# ── New-format end-to-end row counts ─────────────────────────────────────────── -# -# Drives the new-format templater via the CLI for each regional granularity -# against a frozen 7.5 cache committed at tests/test_workbook_table_cache/7.5/. -# Per output table the assertions blend two kinds: -# -# - **Principled** — row counts derived from named entity constants below -# (e.g. paths = flow paths visible at granularity + REZs + parallel -# injections), plus referential-integrity invariants (every limit row -# references a path that exists; every cost row references an option). When -# these fire, the named constant tells you which structural quantity moved. -# - **Drift-detection** — pinned counts where a clean formula would just be -# templater logic in disguise. Currently only the expansion-cost row count -# falls in this bucket (per-option year coverage varies). Refresh by -# rerunning the test and pasting the failure value into the dict below. -# -# AEMO updates to the 7.5 workbook should force a deliberate review of every -# constant in this block. - -# Entity counts derived from the input cache. -_NUM_SUBREGIONS_75 = 15 -_NUM_REGIONS_75 = 5 -_NUM_REZS_75 = 47 -_NUM_FLOW_PATHS_75 = 18 - -# REZs whose row in `initial_transmission_limits` has all-NaN limit columns. -# Each collapses to a single placeholder row in network_transmission_path_limits -# instead of the usual `NUM_TIMESLICES × NUM_DIRECTIONS` rows. -_NUM_REZS_WITHOUT_LIMITS_75 = 15 - -# Flow paths in the 7.5 input whose augmentation key has no exact match in -# `flow_path_transfer_capability` and that therefore get a synthetic -# parallel-path row injected. Sub_regions only — at coarser granularities -# the parent path collapses, taking the injection with it. -_NUM_PARALLEL_PATHS_INJECTED_75_SUB_REGIONS = 1 - -# Flow paths whose endpoints sit in different NEM regions and therefore -# survive the nem_regions collapse. (The remaining 11 of 18 are intra-region.) -_NUM_INTER_REGIONAL_FLOW_PATHS_75 = 7 - -# REZ-only constraint relaxations (granularity-independent — they live on REZs -# and so survive every granularity collapse). One per REZ that has at least -# one augmentation option, capped at 8 in the 7.5 inputs. -_NUM_REZ_CONSTRAINT_OPTIONS_75 = 8 - -# Number of distinct flow-path expansion options surviving at each granularity -# (each emits a forward + reverse row in network_expansion_options, so they -# contribute 2× to the row count and 1× to the unique-id count). -_NUM_FLOW_PATH_OPTIONS_AT_GRANULARITY_75 = { - "sub_regions": 43, - "nem_regions": 34, - "single_region": 31, -} - -_NUM_TIMESLICES = 3 -_NUM_DIRECTIONS = 2 -_LIMIT_ROWS_PER_FULL_PATH = _NUM_TIMESLICES * _NUM_DIRECTIONS - -_GEOS_PER_GRANULARITY_75 = { - "sub_regions": _NUM_SUBREGIONS_75, - "nem_regions": _NUM_REGIONS_75, - "single_region": 1, -} - -_PATHS_PER_GRANULARITY_75 = { - "sub_regions": ( - _NUM_FLOW_PATHS_75 + _NUM_REZS_75 + _NUM_PARALLEL_PATHS_INJECTED_75_SUB_REGIONS - ), - "nem_regions": _NUM_INTER_REGIONAL_FLOW_PATHS_75 + _NUM_REZS_75, - "single_region": _NUM_REZS_75, -} - -# Drift-detection only — per-option year coverage varies. -_EXPECTED_EXPANSION_COST_ROWS_75 = { - "sub_regions": 1581, - "nem_regions": 1302, - "single_region": 1209, -} - - -def _write_new_format_config(tmp_path, mock_workbook_file, granularity): - """Write a 7.5 config tuned to drive the new-format templater for `granularity`.""" - config_path = tmp_path / f"new_format_config_{granularity}.yaml" - config_content = { - "scenario": "Step Change", - "wacc": 0.07, - "discount_rate": 0.05, - "network": { - "transmission_expansion": True, - "rez_transmission_expansion": True, - "annuitisation_lifetime": 30, - "nodes": {"regional_granularity": granularity, "rezs": "discrete_nodes"}, - "transmission_expansion_limit_override": None, - "rez_connection_expansion_limit_override": None, - "rez_to_sub_region_transmission_default_limit": 1e6, - }, - "temporal": { - "year_type": "fy", - "range": {"start_year": 2025, "end_year": 2026}, - "capacity_expansion": { - "resolution_min": 30, - "reference_year_cycle": [2018], - "investment_periods": [2025], - "aggregation": {"representative_weeks": [0]}, - }, - "operational": { - "resolution_min": 30, - "reference_year_cycle": [2018], - "horizon": 336, - "overlap": 48, - "aggregation": {"representative_weeks": [0]}, - }, - }, - "unserved_energy": {"cost": 10000.0, "max_per_node": 1e5}, - "solver": "highs", - "iasr_workbook_version": "7.5", - "paths": { - "ispypsa_run_name": "test_run", - "parsed_traces_directory": "tests/trace_data", - "parsed_workbook_cache": str(tmp_path / "cache"), - "workbook_path": str(mock_workbook_file), - "run_directory": str(tmp_path / "run_dir"), - }, - "trace_data": {"dataset_type": "example", "dateset_year": 2024}, - } - with open(config_path, "w") as f: - yaml.dump(config_content, f) - return config_path - - -@pytest.mark.parametrize("granularity", ["sub_regions", "nem_regions", "single_region"]) -def test_create_ispypsa_inputs_new_format( - granularity, - tmp_path, - mock_workbook_file, - prepare_test_cache_new_format, - run_cli_command, - monkeypatch, -): - monkeypatch.setenv("ISPYPSA_USE_NEW_TABLE_FORMAT", "true") - monkeypatch.setenv("ISPYPSA_TEST_MOCK_CACHE", "true") - - config_path = _write_new_format_config(tmp_path, mock_workbook_file, granularity) - - result = run_cli_command([f"config={config_path}", "create_ispypsa_inputs"]) - assert result.returncode == 0, ( - f"CLI failed for granularity={granularity}.\n" - f"STDOUT:\n{result.stdout}\nSTDERR:\n{result.stderr}" - ) - - output_dir = tmp_path / "run_dir" / "test_run" / "ispypsa_inputs" - geo = pd.read_csv(output_dir / "network_geography.csv") - paths = pd.read_csv(output_dir / "network_transmission_paths.csv") - limits = pd.read_csv(output_dir / "network_transmission_path_limits.csv") - options = pd.read_csv(output_dir / "network_expansion_options.csv") - costs = pd.read_csv(output_dir / "network_transmission_path_expansion_costs.csv") - - # network_geography — one row per (sub-)region or REZ; geo_ids are unique. - assert len(geo) == _GEOS_PER_GRANULARITY_75[granularity] + _NUM_REZS_75 - assert geo["geo_id"].is_unique - - # network_transmission_paths — derived from named structural quantities: - # sub_regions = flow paths + REZ connections + parallel-path injections; - # nem_regions drops intra-region flow paths; single_region drops them all. - expected_paths = _PATHS_PER_GRANULARITY_75[granularity] - assert len(paths) == expected_paths - assert paths["path_id"].is_unique - # Every geo participates in at least one path (no isolated nodes). - assert set(paths["geo_from"]) | set(paths["geo_to"]) == set(geo["geo_id"]) - - # network_transmission_path_limits — paths with full limit data emit - # NUM_TIMESLICES × NUM_DIRECTIONS rows; the REZs whose initial-limit row is - # all-NaN collapse to a single placeholder row. - expected_limits = ( - expected_paths - _NUM_REZS_WITHOUT_LIMITS_75 - ) * _LIMIT_ROWS_PER_FULL_PATH + _NUM_REZS_WITHOUT_LIMITS_75 - assert len(limits) == expected_limits - # Every path has at least one limit row; no orphan limits. - assert set(limits["path_id"]) == set(paths["path_id"]) - - # network_expansion_options — each surviving flow-path option emits paired - # forward + reverse rows sharing one expansion_id; REZ constraint - # relaxations contribute one row (and one id) each. - num_fp_options = _NUM_FLOW_PATH_OPTIONS_AT_GRANULARITY_75[granularity] - assert len(options) == 2 * num_fp_options + _NUM_REZ_CONSTRAINT_OPTIONS_75 - assert ( - options["expansion_id"].nunique() - == num_fp_options + _NUM_REZ_CONSTRAINT_OPTIONS_75 - ) - - # network_transmission_path_expansion_costs — every option has cost rows; - # no orphan costs. Total row count is drift-only (per-option year coverage - # is uneven). - assert set(costs["expansion_id"]) == set(options["expansion_id"]) - assert len(costs) == _EXPECTED_EXPANSION_COST_ROWS_75[granularity] diff --git a/tests/test_cli/test_create_ispypsa_inputs_new_table_formats.py b/tests/test_cli/test_create_ispypsa_inputs_new_table_formats.py new file mode 100644 index 00000000..c9821174 --- /dev/null +++ b/tests/test_cli/test_create_ispypsa_inputs_new_table_formats.py @@ -0,0 +1,342 @@ +"""End-to-end CLI tests for the new-format templater (use_new_table_format=true). + +Mirrors test_create_ispypsa_inputs.py for the new format. Lives separately so +that when the feature flag goes away and 6.0 is dropped, the test +restructuring becomes a sequence of file operations rather than a diff inside +test bodies. + +Coverage: +- Mechanism: fresh run, up-to-date detection, config_changed (irrelevant + + relevant), plus the extensive-only dependency-modified + missing-target-file + triggers. +- Content: per-granularity row counts and structural relationships against a + frozen 7.5 cache. + +Handover steps (when 6.0 support is dropped): + +1. Port the format-agnostic tests from the legacy file. None of these have + new-format coverage yet; all three need to be rewritten here, using + mock_config_new_format / prepare_test_cache_new_format in place of their + 6.0 equivalents: + - test_cli_flags_and_dependency_chain (covers cache + run_dir rebuild + from scratch — a code path nothing in this file currently exercises) + - test_single_task_mode_fails_without_deps (`-s` flag failure semantics) + - test_config_path_variations (relative + absolute config path handling, + extensive-only) + +2. Delete the legacy file and rename this one: + git rm tests/test_cli/test_create_ispypsa_inputs.py + git mv tests/test_cli/test_create_ispypsa_inputs_new_table_formats.py \\ + tests/test_cli/test_create_ispypsa_inputs.py + +3. Collapse the helpers. cli_test_helpers.py keeps the format-agnostic + infrastructure (run_cli_command, assert_task_ran, build_mock_config, the + shared cache-prep helper, etc.); the 6.0-only fixtures are removed and the + new-format ones move in under their unsuffixed names: + - delete `mock_config` and `prepare_test_cache` from cli_test_helpers.py + - move `mock_config_new_format` → `mock_config` and update + `build_mock_config` to default to version="7.5" + - move `prepare_test_cache_new_format` → `prepare_test_cache` + - git rm cli_test_helpers_new_table_formats.py + - update fixture references in this file accordingly +""" + +import time + +import pandas as pd +import pytest + +from .cli_test_helpers import ( + assert_task_ran, + assert_task_up_to_date, + build_mock_config, + get_file_timestamps, + mock_workbook_file, + modify_config_value, + run_cli_command, + run_extensive, + verify_output_files, +) +from .cli_test_helpers_new_table_formats import ( + mock_config_new_format, + prepare_test_cache_new_format, +) + +_NEW_FORMAT_OUTPUTS = [ + "network_geography", + "network_transmission_paths", + "network_transmission_path_limits", + "network_expansion_options", + "network_transmission_path_expansion_costs", +] + + +def test_create_ispypsa_inputs_task_new_format( + mock_config_new_format, + prepare_test_cache_new_format, + tmp_path, + run_cli_command, + monkeypatch, + run_extensive, +): + """Test fresh run, up-to-date detection, config_changed, and various triggers. + + Combines: + - test_fresh_run_creates_all_outputs + - test_up_to_date_skips_execution + - test_config_changed_irrelevant_does_not_trigger + - test_config_changed_relevant_triggers_rerun + - test_dependency_modified_triggers_rerun (extensive only) + - test_missing_some_target_files_triggers_rerun (extensive only) + + Runs: 4 (fresh + up-to-date + 2 config_changed), or 6 with extensive + """ + monkeypatch.setenv("ISPYPSA_USE_NEW_TABLE_FORMAT", "true") + monkeypatch.setenv("ISPYPSA_TEST_MOCK_CACHE", "true") + + # Test fresh run + cache_dir = tmp_path / "cache" + assert cache_dir.exists() + cache_files = list(cache_dir.glob("*.csv")) + assert len(cache_files) > 50 + + # Run command + result = run_cli_command( + [f"config={mock_config_new_format}", "create_ispypsa_inputs"] + ) + assert result.returncode == 0, result.stdout + + # Check outputs created + output_dir = tmp_path / "run_dir" / "test_run" / "ispypsa_inputs" + assert output_dir.exists() + verify_output_files(output_dir, _NEW_FORMAT_OUTPUTS) + + # Check log and config files + log_file = tmp_path / "run_dir" / "test_run" / "ISPyPSA.log" + assert log_file.exists() + saved_config = tmp_path / "run_dir" / "test_run" / "test_config.yaml" + assert saved_config.exists() + + # Get timestamps from first run + first_run_timestamps = get_file_timestamps(output_dir) + time.sleep(0.1) + + # Test up-to-date detection - second run + result = run_cli_command( + [f"config={mock_config_new_format}", "create_ispypsa_inputs"] + ) + assert result.returncode == 0 + assert_task_up_to_date(result.stdout, "create_ispypsa_inputs") + + # Verify timestamps haven't changed (files weren't regenerated) + second_run_timestamps = get_file_timestamps(output_dir) + assert first_run_timestamps == second_run_timestamps + + # Test config_changed: irrelevant change should NOT trigger rerun + time.sleep(0.1) + modify_config_value(mock_config_new_format, "solver", "gurobi") + result = run_cli_command( + [f"config={mock_config_new_format}", "create_ispypsa_inputs"] + ) + assert result.returncode == 0 + assert_task_up_to_date(result.stdout, "create_ispypsa_inputs") + + # Test config_changed: relevant change SHOULD trigger rerun. Switching + # regional_granularity is watched in the new-format templater branch. + time.sleep(0.1) + modify_config_value( + mock_config_new_format, "network.nodes.regional_granularity", "nem_regions" + ) + result = run_cli_command( + [f"config={mock_config_new_format}", "create_ispypsa_inputs"] + ) + assert result.returncode == 0 + assert_task_ran(result.stdout, "create_ispypsa_inputs") + + # Get new timestamps after config change rerun + config_change_timestamps = get_file_timestamps(output_dir) + + if not run_extensive: + return + + # Test dependency modification trigger (extensive only) + time.sleep(0.1) + cache_file = tmp_path / "cache" / "sub_regional_reference_nodes.csv" + df = pd.read_csv(cache_file) + if len(df) > 0: + new_row = df.iloc[0].copy() + df = pd.concat([df, new_row.to_frame().T], ignore_index=True) + df.to_csv(cache_file, index=False) + + result = run_cli_command( + [f"config={mock_config_new_format}", "create_ispypsa_inputs"] + ) + assert result.returncode == 0 + assert_task_ran(result.stdout, "create_ispypsa_inputs") + + # Verify timestamps changed + new_timestamps = get_file_timestamps(output_dir) + assert new_timestamps != config_change_timestamps + for filename, old_time in config_change_timestamps.items(): + assert new_timestamps[filename] > old_time + + # Test missing single file trigger (extensive only) + target_file = output_dir / "network_geography.csv" + target_file.unlink() + + result = run_cli_command( + [f"config={mock_config_new_format}", "create_ispypsa_inputs"] + ) + assert result.returncode == 0 + assert_task_ran(result.stdout, "create_ispypsa_inputs") + assert target_file.exists() + assert target_file.stat().st_size > 0 + + +# ── New-format end-to-end row counts ─────────────────────────────────────────── +# +# Drives the new-format templater via the CLI for each regional granularity +# against a frozen 7.5 cache committed at tests/test_workbook_table_cache/7.5/. +# Per output table the assertions blend two kinds: +# +# - **Principled** — row counts derived from named entity constants below +# (e.g. paths = flow paths visible at granularity + REZs + parallel +# injections), plus referential-integrity invariants (every limit row +# references a path that exists; every cost row references an option). When +# these fire, the named constant tells you which structural quantity moved. +# - **Drift-detection** — pinned counts where a clean formula would just be +# templater logic in disguise. Currently only the expansion-cost row count +# falls in this bucket (per-option year coverage varies). Refresh by +# rerunning the test and pasting the failure value into the dict below. +# +# AEMO updates to the 7.5 workbook should force a deliberate review of every +# constant in this block. + +# Entity counts derived from the input cache. +_NUM_SUBREGIONS_75 = 15 +_NUM_REGIONS_75 = 5 +_NUM_REZS_75 = 47 +_NUM_FLOW_PATHS_75 = 18 + +# REZs whose row in `initial_transmission_limits` has all-NaN limit columns. +# Each collapses to a single placeholder row in network_transmission_path_limits +# instead of the usual `NUM_TIMESLICES × NUM_DIRECTIONS` rows. +_NUM_REZS_WITHOUT_LIMITS_75 = 15 + +# Flow paths in the 7.5 input whose augmentation key has no exact match in +# `flow_path_transfer_capability` and that therefore get a synthetic +# parallel-path row injected. Sub_regions only — at coarser granularities +# the parent path collapses, taking the injection with it. +_NUM_PARALLEL_PATHS_INJECTED_75_SUB_REGIONS = 1 + +# Flow paths whose endpoints sit in different NEM regions and therefore +# survive the nem_regions collapse. (The remaining 11 of 18 are intra-region.) +_NUM_INTER_REGIONAL_FLOW_PATHS_75 = 7 + +# REZ-only constraint relaxations (granularity-independent — they live on REZs +# and so survive every granularity collapse). One per REZ that has at least +# one augmentation option, capped at 8 in the 7.5 inputs. +_NUM_REZ_CONSTRAINT_OPTIONS_75 = 8 + +# Number of distinct flow-path expansion options surviving at each granularity +# (each emits a forward + reverse row in network_expansion_options, so they +# contribute 2× to the row count and 1× to the unique-id count). +_NUM_FLOW_PATH_OPTIONS_AT_GRANULARITY_75 = { + "sub_regions": 43, + "nem_regions": 34, + "single_region": 31, +} + +_NUM_TIMESLICES = 3 +_NUM_DIRECTIONS = 2 +_LIMIT_ROWS_PER_FULL_PATH = _NUM_TIMESLICES * _NUM_DIRECTIONS + +_GEOS_PER_GRANULARITY_75 = { + "sub_regions": _NUM_SUBREGIONS_75, + "nem_regions": _NUM_REGIONS_75, + "single_region": 1, +} + +_PATHS_PER_GRANULARITY_75 = { + "sub_regions": ( + _NUM_FLOW_PATHS_75 + _NUM_REZS_75 + _NUM_PARALLEL_PATHS_INJECTED_75_SUB_REGIONS + ), + "nem_regions": _NUM_INTER_REGIONAL_FLOW_PATHS_75 + _NUM_REZS_75, + "single_region": _NUM_REZS_75, +} + +# Drift-detection only — per-option year coverage varies. +_EXPECTED_EXPANSION_COST_ROWS_75 = { + "sub_regions": 1581, + "nem_regions": 1302, + "single_region": 1209, +} + + +@pytest.mark.parametrize("granularity", ["sub_regions", "nem_regions", "single_region"]) +def test_create_ispypsa_inputs_new_format( + granularity, + tmp_path, + mock_workbook_file, + prepare_test_cache_new_format, + run_cli_command, + monkeypatch, +): + monkeypatch.setenv("ISPYPSA_USE_NEW_TABLE_FORMAT", "true") + monkeypatch.setenv("ISPYPSA_TEST_MOCK_CACHE", "true") + + config_path = build_mock_config( + tmp_path, mock_workbook_file, version="7.5", granularity=granularity + ) + + result = run_cli_command([f"config={config_path}", "create_ispypsa_inputs"]) + assert result.returncode == 0, ( + f"CLI failed for granularity={granularity}.\n" + f"STDOUT:\n{result.stdout}\nSTDERR:\n{result.stderr}" + ) + + output_dir = tmp_path / "run_dir" / "test_run" / "ispypsa_inputs" + geo = pd.read_csv(output_dir / "network_geography.csv") + paths = pd.read_csv(output_dir / "network_transmission_paths.csv") + limits = pd.read_csv(output_dir / "network_transmission_path_limits.csv") + options = pd.read_csv(output_dir / "network_expansion_options.csv") + costs = pd.read_csv(output_dir / "network_transmission_path_expansion_costs.csv") + + # network_geography — one row per (sub-)region or REZ; geo_ids are unique. + assert len(geo) == _GEOS_PER_GRANULARITY_75[granularity] + _NUM_REZS_75 + assert geo["geo_id"].is_unique + + # network_transmission_paths — derived from named structural quantities: + # sub_regions = flow paths + REZ connections + parallel-path injections; + # nem_regions drops intra-region flow paths; single_region drops them all. + expected_paths = _PATHS_PER_GRANULARITY_75[granularity] + assert len(paths) == expected_paths + assert paths["path_id"].is_unique + # Every geo participates in at least one path (no isolated nodes). + assert set(paths["geo_from"]) | set(paths["geo_to"]) == set(geo["geo_id"]) + + # network_transmission_path_limits — paths with full limit data emit + # NUM_TIMESLICES × NUM_DIRECTIONS rows; the REZs whose initial-limit row is + # all-NaN collapse to a single placeholder row. + expected_limits = ( + expected_paths - _NUM_REZS_WITHOUT_LIMITS_75 + ) * _LIMIT_ROWS_PER_FULL_PATH + _NUM_REZS_WITHOUT_LIMITS_75 + assert len(limits) == expected_limits + # Every path has at least one limit row; no orphan limits. + assert set(limits["path_id"]) == set(paths["path_id"]) + + # network_expansion_options — each surviving flow-path option emits paired + # forward + reverse rows sharing one expansion_id; REZ constraint + # relaxations contribute one row (and one id) each. + num_fp_options = _NUM_FLOW_PATH_OPTIONS_AT_GRANULARITY_75[granularity] + assert len(options) == 2 * num_fp_options + _NUM_REZ_CONSTRAINT_OPTIONS_75 + assert ( + options["expansion_id"].nunique() + == num_fp_options + _NUM_REZ_CONSTRAINT_OPTIONS_75 + ) + + # network_transmission_path_expansion_costs — every option has cost rows; + # no orphan costs. Total row count is drift-only (per-option year coverage + # is uneven). + assert set(costs["expansion_id"]) == set(options["expansion_id"]) + assert len(costs) == _EXPECTED_EXPANSION_COST_ROWS_75[granularity] From f35173b831b6719db862b12dccea15777c26b20b Mon Sep 17 00:00:00 2001 From: nick-gorman Date: Wed, 13 May 2026 14:09:15 +1000 Subject: [PATCH 14/14] Tag use_new_table_format cleanup sites Adds FEATURE_FLAG_CLEANUP[use_new_table_format] markers at every site that will need attention when the feature flag is retired. A single grep across the repo will surface the full removal checklist instead of relying on recall of where the gating lives. Co-Authored-By: Claude Opus 4.7 (1M context) --- src/ispypsa/feature_flags.py | 1 + src/ispypsa/feature_flags.yaml | 1 + src/ispypsa/iasr_table_caching/local_cache.py | 2 ++ src/ispypsa/templater/create_template.py | 6 ++++++ tests/test_cli/cli_test_helpers_new_table_formats.py | 3 +++ .../test_create_ispypsa_inputs_new_table_formats.py | 3 +++ 6 files changed, 16 insertions(+) diff --git a/src/ispypsa/feature_flags.py b/src/ispypsa/feature_flags.py index 3296c5bd..d2ee8ab6 100644 --- a/src/ispypsa/feature_flags.py +++ b/src/ispypsa/feature_flags.py @@ -12,6 +12,7 @@ # a flag for a subprocess CLI run, where monkeypatching the imported dict isn't # an option. _ENV_OVERRIDES = { + # FEATURE_FLAG_CLEANUP[use_new_table_format]: remove this entry. "use_new_table_format": "ISPYPSA_USE_NEW_TABLE_FORMAT", } for _flag, _env_var in _ENV_OVERRIDES.items(): diff --git a/src/ispypsa/feature_flags.yaml b/src/ispypsa/feature_flags.yaml index 4e57e1bc..abc63630 100644 --- a/src/ispypsa/feature_flags.yaml +++ b/src/ispypsa/feature_flags.yaml @@ -1 +1,2 @@ +# FEATURE_FLAG_CLEANUP[use_new_table_format]: remove this flag entry. use_new_table_format: false diff --git a/src/ispypsa/iasr_table_caching/local_cache.py b/src/ispypsa/iasr_table_caching/local_cache.py index c873b194..7d562248 100644 --- a/src/ispypsa/iasr_table_caching/local_cache.py +++ b/src/ispypsa/iasr_table_caching/local_cache.py @@ -36,6 +36,8 @@ def _load_known_tables() -> dict[str, list[str]]: def _build_required_tables(iasr_workbook_version: str) -> list[str]: + # FEATURE_FLAG_CLEANUP[use_new_table_format]: drop the else-branch (legacy + # required-tables list). if FEATURE_FLAGS["use_new_table_format"]: all_tables = _load_known_tables()[iasr_workbook_version] augmentation = [n for n in all_tables if n.startswith(_AUGMENTATION_PREFIXES)] diff --git a/src/ispypsa/templater/create_template.py b/src/ispypsa/templater/create_template.py index 90fdc0aa..d450b61b 100644 --- a/src/ispypsa/templater/create_template.py +++ b/src/ispypsa/templater/create_template.py @@ -72,6 +72,8 @@ # Outputs from the new-format templater branch. Granularity-invariant: the # same five tables are emitted for sub_regions, nem_regions, and single_region # (only their contents differ). +# FEATURE_FLAG_CLEANUP[use_new_table_format]: rename to _TEMPLATE_OUTPUTS and +# delete _BASE_TEMPLATE_OUTPUTS above. _NEW_FORMAT_TEMPLATE_OUTPUTS = [ "network_geography", "network_transmission_paths", @@ -146,6 +148,8 @@ def create_ispypsa_inputs_template( "Cannot specify both filter_to_nem_regions and filter_to_isp_sub_regions" ) + # FEATURE_FLAG_CLEANUP[use_new_table_format]: drop the else-branch (legacy + # templater path) and inline this branch. if FEATURE_FLAGS["use_new_table_format"]: template = {} sub_regional_geography = _template_network_geography( @@ -283,6 +287,8 @@ def create_ispypsa_inputs_template( def list_templater_output_files(regional_granularity, output_path=None): + # FEATURE_FLAG_CLEANUP[use_new_table_format]: drop the else-branch and the + # granularity-specific file removals. if FEATURE_FLAGS["use_new_table_format"]: files = _NEW_FORMAT_TEMPLATE_OUTPUTS.copy() else: diff --git a/tests/test_cli/cli_test_helpers_new_table_formats.py b/tests/test_cli/cli_test_helpers_new_table_formats.py index d046b2c7..111e2457 100644 --- a/tests/test_cli/cli_test_helpers_new_table_formats.py +++ b/tests/test_cli/cli_test_helpers_new_table_formats.py @@ -5,6 +5,9 @@ (after the legacy file is removed) without needing to disentangle anything. Format-agnostic infrastructure (run_cli_command, assert_task_ran, the mock_workbook_file fixture, etc.) stays in the sibling shared module. + +FEATURE_FLAG_CLEANUP[use_new_table_format]: merge this file into the sibling +cli_test_helpers.py and delete it. """ import pytest diff --git a/tests/test_cli/test_create_ispypsa_inputs_new_table_formats.py b/tests/test_cli/test_create_ispypsa_inputs_new_table_formats.py index c9821174..cf2a22db 100644 --- a/tests/test_cli/test_create_ispypsa_inputs_new_table_formats.py +++ b/tests/test_cli/test_create_ispypsa_inputs_new_table_formats.py @@ -5,6 +5,9 @@ restructuring becomes a sequence of file operations rather than a diff inside test bodies. +FEATURE_FLAG_CLEANUP[use_new_table_format]: merge this file into the sibling +test_create_ispypsa_inputs.py and delete it. + Coverage: - Mechanism: fresh run, up-to-date detection, config_changed (irrelevant + relevant), plus the extensive-only dependency-modified + missing-target-file