flextool 4.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (322) hide show
  1. flextool/__init__.py +41 -0
  2. flextool/_mem_sampler.py +193 -0
  3. flextool/_resources.py +43 -0
  4. flextool/calibrate/__init__.py +51 -0
  5. flextool/calibrate/__main__.py +11 -0
  6. flextool/calibrate/_cli.py +316 -0
  7. flextool/calibrate/_db_alt.py +166 -0
  8. flextool/calibrate/_final_outputs.py +110 -0
  9. flextool/calibrate/_guard.py +151 -0
  10. flextool/calibrate/_loop.py +558 -0
  11. flextool/calibrate/_readers.py +223 -0
  12. flextool/calibrate/_report.py +263 -0
  13. flextool/calibrate/_sizing.py +699 -0
  14. flextool/calibrate/_solve.py +134 -0
  15. flextool/calibrate/_solve_status.py +495 -0
  16. flextool/cli/__init__.py +9 -0
  17. flextool/cli/_console.py +51 -0
  18. flextool/cli/_timing.py +147 -0
  19. flextool/cli/cmd_execute_flextool_workflow.py +187 -0
  20. flextool/cli/cmd_export_to_tabular.py +56 -0
  21. flextool/cli/cmd_import_sensitivities.py +75 -0
  22. flextool/cli/cmd_migrate_database.py +13 -0
  23. flextool/cli/cmd_open_results_db.py +269 -0
  24. flextool/cli/cmd_read_matpower.py +66 -0
  25. flextool/cli/cmd_read_old_flextool.py +63 -0
  26. flextool/cli/cmd_read_self_describing_tabular_input.py +50 -0
  27. flextool/cli/cmd_read_tabular_input.py +81 -0
  28. flextool/cli/cmd_run_flextool.py +1095 -0
  29. flextool/cli/cmd_scenario_results.py +284 -0
  30. flextool/cli/cmd_solve_mps.py +169 -0
  31. flextool/cli/cmd_update_flextool.py +17 -0
  32. flextool/cli/cmd_write_outputs.py +125 -0
  33. flextool/common_utils/__init__.py +1 -0
  34. flextool/common_utils/plot_mem_shape.py +77 -0
  35. flextool/common_utils/precision.py +451 -0
  36. flextool/decomposition/__init__.py +0 -0
  37. flextool/decomposition/region_decomposition.py +128 -0
  38. flextool/decomposition/region_filter.py +1261 -0
  39. flextool/engine_polars/__init__.py +110 -0
  40. flextool/engine_polars/_axis_enums.py +742 -0
  41. flextool/engine_polars/_benders.py +3462 -0
  42. flextool/engine_polars/_block_layout.py +1479 -0
  43. flextool/engine_polars/_blocks.py +1515 -0
  44. flextool/engine_polars/_commodity_ladder.py +660 -0
  45. flextool/engine_polars/_cumulative_invest.py +1165 -0
  46. flextool/engine_polars/_db_loader.py +153 -0
  47. flextool/engine_polars/_db_reader.py +127 -0
  48. flextool/engine_polars/_dc_power_flow.py +445 -0
  49. flextool/engine_polars/_delay.py +442 -0
  50. flextool/engine_polars/_derived_arithmetic.py +432 -0
  51. flextool/engine_polars/_derived_block.py +990 -0
  52. flextool/engine_polars/_derived_branch.py +769 -0
  53. flextool/engine_polars/_derived_existing.py +1353 -0
  54. flextool/engine_polars/_derived_npv.py +1297 -0
  55. flextool/engine_polars/_derived_params.py +9850 -0
  56. flextool/engine_polars/_derived_profile.py +881 -0
  57. flextool/engine_polars/_derived_walks.py +276 -0
  58. flextool/engine_polars/_determinism.py +70 -0
  59. flextool/engine_polars/_direct_params.py +2186 -0
  60. flextool/engine_polars/_dump_csvs.py +1009 -0
  61. flextool/engine_polars/_emit_arc_unions.py +1631 -0
  62. flextool/engine_polars/_emit_calc_params.py +729 -0
  63. flextool/engine_polars/_emit_chain_params.py +709 -0
  64. flextool/engine_polars/_emit_co2_accumulators.py +400 -0
  65. flextool/engine_polars/_emit_dispatchers.py +690 -0
  66. flextool/engine_polars/_emit_energy_margin.py +125 -0
  67. flextool/engine_polars/_emit_energy_margin_adder.py +290 -0
  68. flextool/engine_polars/_emit_entity_annual.py +428 -0
  69. flextool/engine_polars/_emit_inflow_scaling.py +1420 -0
  70. flextool/engine_polars/_emit_leaf_sets.py +550 -0
  71. flextool/engine_polars/_emit_lp_scaling.py +665 -0
  72. flextool/engine_polars/_emit_mid_sets.py +859 -0
  73. flextool/engine_polars/_emit_pdt_params.py +759 -0
  74. flextool/engine_polars/_emit_per_solve.py +774 -0
  75. flextool/engine_polars/_emit_period_calc.py +504 -0
  76. flextool/engine_polars/_emit_period_params.py +2398 -0
  77. flextool/engine_polars/_emit_provider_io.py +141 -0
  78. flextool/engine_polars/_emit_reserve.py +574 -0
  79. flextool/engine_polars/_emit_solve_time.py +311 -0
  80. flextool/engine_polars/_emit_solve_writers.py +1249 -0
  81. flextool/engine_polars/_flex_data_accumulator.py +388 -0
  82. flextool/engine_polars/_flex_data_provider.py +478 -0
  83. flextool/engine_polars/_group_slack.py +1253 -0
  84. flextool/engine_polars/_inmemory_reader.py +140 -0
  85. flextool/engine_polars/_input_source.py +336 -0
  86. flextool/engine_polars/_invest_seeds.py +191 -0
  87. flextool/engine_polars/_native_input_writer.py +100 -0
  88. flextool/engine_polars/_native_run_model.py +1348 -0
  89. flextool/engine_polars/_orchestration.py +4314 -0
  90. flextool/engine_polars/_output_writer.py +439 -0
  91. flextool/engine_polars/_param_shapes.py +1595 -0
  92. flextool/engine_polars/_parquet_bundle.py +723 -0
  93. flextool/engine_polars/_pdt_join.py +167 -0
  94. flextool/engine_polars/_pdt_lookup.py +547 -0
  95. flextool/engine_polars/_per_solve_sets.py +335 -0
  96. flextool/engine_polars/_projection_params.py +2056 -0
  97. flextool/engine_polars/_provider_keys.py +173 -0
  98. flextool/engine_polars/_provider_translators.py +225 -0
  99. flextool/engine_polars/_recursive_solve.py +703 -0
  100. flextool/engine_polars/_region_filter.py +2508 -0
  101. flextool/engine_polars/_reserve.py +649 -0
  102. flextool/engine_polars/_solve_acceptance.py +331 -0
  103. flextool/engine_polars/_solve_config.py +1001 -0
  104. flextool/engine_polars/_solve_context.py +885 -0
  105. flextool/engine_polars/_solve_handoff.py +164 -0
  106. flextool/engine_polars/_solve_state.py +232 -0
  107. flextool/engine_polars/_solver_base.py +36 -0
  108. flextool/engine_polars/_solver_dispatch.py +511 -0
  109. flextool/engine_polars/_spinedb_reader.py +1165 -0
  110. flextool/engine_polars/_stochastic.py +593 -0
  111. flextool/engine_polars/_subprocess_solve.py +1838 -0
  112. flextool/engine_polars/_timeline.py +1416 -0
  113. flextool/engine_polars/_vectorize.py +438 -0
  114. flextool/engine_polars/_warm.py +858 -0
  115. flextool/engine_polars/autoscale/__init__.py +107 -0
  116. flextool/engine_polars/autoscale/_config.py +218 -0
  117. flextool/engine_polars/autoscale/_layer2.py +1253 -0
  118. flextool/engine_polars/autoscale/_layer2_types.py +584 -0
  119. flextool/engine_polars/autoscale/_quantity_types.py +621 -0
  120. flextool/engine_polars/autoscale/_report.py +336 -0
  121. flextool/engine_polars/chain.py +259 -0
  122. flextool/engine_polars/input.py +6638 -0
  123. flextool/engine_polars/model.py +4754 -0
  124. flextool/env_check.py +388 -0
  125. flextool/export_to_tabular/__init__.py +5 -0
  126. flextool/export_to_tabular/db_reader.py +224 -0
  127. flextool/export_to_tabular/excel_writer.py +3559 -0
  128. flextool/export_to_tabular/export_settings.yaml +377 -0
  129. flextool/export_to_tabular/export_to_excel.py +227 -0
  130. flextool/export_to_tabular/formatting.py +543 -0
  131. flextool/export_to_tabular/sheet_config.py +876 -0
  132. flextool/gui/__init__.py +0 -0
  133. flextool/gui/__main__.py +118 -0
  134. flextool/gui/calibrate_commands.py +184 -0
  135. flextool/gui/calibrate_jobs.py +424 -0
  136. flextool/gui/check_tree.py +142 -0
  137. flextool/gui/cli_format.py +83 -0
  138. flextool/gui/config_parser.py +68 -0
  139. flextool/gui/data_models.py +362 -0
  140. flextool/gui/db_editor_integration.py +202 -0
  141. flextool/gui/db_version_check.py +269 -0
  142. flextool/gui/dialogs/__init__.py +0 -0
  143. flextool/gui/dialogs/add_dialog.py +1098 -0
  144. flextool/gui/dialogs/calibrate_dialog.py +1259 -0
  145. flextool/gui/dialogs/file_picker.py +473 -0
  146. flextool/gui/dialogs/group_picker.py +299 -0
  147. flextool/gui/dialogs/migration_consent_dialog.py +106 -0
  148. flextool/gui/dialogs/migration_progress_dialog.py +237 -0
  149. flextool/gui/dialogs/plot_dialog.py +459 -0
  150. flextool/gui/dialogs/plot_settings_picker.py +2184 -0
  151. flextool/gui/dialogs/project_dialog.py +426 -0
  152. flextool/gui/dialogs/update_dialog.py +212 -0
  153. flextool/gui/downsampling.py +88 -0
  154. flextool/gui/error_handling.py +50 -0
  155. flextool/gui/execution_manager.py +1715 -0
  156. flextool/gui/execution_window.py +1377 -0
  157. flextool/gui/hover_tooltip.py +111 -0
  158. flextool/gui/input_sources.py +730 -0
  159. flextool/gui/main_window.py +6181 -0
  160. flextool/gui/network_graph.py +215 -0
  161. flextool/gui/output_actions.py +393 -0
  162. flextool/gui/output_log_window.py +159 -0
  163. flextool/gui/platform_utils.py +421 -0
  164. flextool/gui/plot_cache.py +88 -0
  165. flextool/gui/plot_canvas.py +543 -0
  166. flextool/gui/plot_config_reader.py +272 -0
  167. flextool/gui/project_utils.py +100 -0
  168. flextool/gui/result_viewer.py +4394 -0
  169. flextool/gui/scenario_key.py +162 -0
  170. flextool/gui/scenario_lists.py +516 -0
  171. flextool/gui/settings_io.py +360 -0
  172. flextool/gui/solve_reader.py +103 -0
  173. flextool/gui/tree_reorder.py +88 -0
  174. flextool/gui/ui_metrics.py +420 -0
  175. flextool/input_derivation/__init__.py +281 -0
  176. flextool/input_derivation/_commodity_ladder.py +375 -0
  177. flextool/input_derivation/_commodity_ladder_sets.py +70 -0
  178. flextool/input_derivation/_dc_power_flow.py +377 -0
  179. flextool/input_derivation/_method_constants.py +77 -0
  180. flextool/input_derivation/_process_method.py +258 -0
  181. flextool/input_derivation/_specs.py +1026 -0
  182. flextool/input_derivation/_validators.py +321 -0
  183. flextool/lean_parquet.py +159 -0
  184. flextool/model_builder/__init__.py +5 -0
  185. flextool/model_builder/build_model.py +589 -0
  186. flextool/model_builder/encoding.py +67 -0
  187. flextool/model_builder/names.py +34 -0
  188. flextool/model_builder/profiles.py +129 -0
  189. flextool/plot_outputs/__init__.py +14 -0
  190. flextool/plot_outputs/axis_helpers.py +355 -0
  191. flextool/plot_outputs/color_template.py +888 -0
  192. flextool/plot_outputs/config.py +171 -0
  193. flextool/plot_outputs/format_helpers.py +345 -0
  194. flextool/plot_outputs/legend_helpers.py +143 -0
  195. flextool/plot_outputs/orchestrator.py +1141 -0
  196. flextool/plot_outputs/perf.py +37 -0
  197. flextool/plot_outputs/plan.py +1787 -0
  198. flextool/plot_outputs/plot_bars.py +1510 -0
  199. flextool/plot_outputs/plot_bars_detail.py +753 -0
  200. flextool/plot_outputs/plot_lines.py +951 -0
  201. flextool/plot_outputs/shared_manifest.py +564 -0
  202. flextool/plot_outputs/subplot_helpers.py +137 -0
  203. flextool/process_inputs/__init__.py +188 -0
  204. flextool/process_inputs/import_old_excel_input.json +4159 -0
  205. flextool/process_inputs/read_matpower.py +451 -0
  206. flextool/process_inputs/read_old_flextool.py +1288 -0
  207. flextool/process_inputs/read_self_describing_excel.py +1423 -0
  208. flextool/process_inputs/read_tabular_with_specification.py +1114 -0
  209. flextool/process_inputs/write_old_flextool_to_db.py +3077 -0
  210. flextool/process_inputs/write_self_describing_to_db.py +977 -0
  211. flextool/process_inputs/write_to_input_db.py +269 -0
  212. flextool/process_outputs/__init__.py +7 -0
  213. flextool/process_outputs/_annualize.py +55 -0
  214. flextool/process_outputs/_inmemory_helpers.py +292 -0
  215. flextool/process_outputs/_output_meta.py +672 -0
  216. flextool/process_outputs/calc_capacity_flows.py +107 -0
  217. flextool/process_outputs/calc_connections.py +136 -0
  218. flextool/process_outputs/calc_costs.py +260 -0
  219. flextool/process_outputs/calc_group_flows.py +192 -0
  220. flextool/process_outputs/calc_slacks.py +103 -0
  221. flextool/process_outputs/calc_storage_vre.py +160 -0
  222. flextool/process_outputs/drop_levels.py +208 -0
  223. flextool/process_outputs/handoff_writers.py +1315 -0
  224. flextool/process_outputs/out_ancillary.py +544 -0
  225. flextool/process_outputs/out_capacity.py +179 -0
  226. flextool/process_outputs/out_costs.py +334 -0
  227. flextool/process_outputs/out_flowgroup.py +189 -0
  228. flextool/process_outputs/out_flows.py +301 -0
  229. flextool/process_outputs/out_group.py +475 -0
  230. flextool/process_outputs/out_node.py +190 -0
  231. flextool/process_outputs/persist_realized_slice.py +601 -0
  232. flextool/process_outputs/process_results.py +24 -0
  233. flextool/process_outputs/read_highs_solution.py +2256 -0
  234. flextool/process_outputs/read_parameters.py +1799 -0
  235. flextool/process_outputs/read_sets.py +1095 -0
  236. flextool/process_outputs/read_variables.py +553 -0
  237. flextool/process_outputs/solve_order.py +81 -0
  238. flextool/process_outputs/spinedb_replay.py +412 -0
  239. flextool/process_outputs/union_realized_slice.py +224 -0
  240. flextool/process_outputs/write_outputs.py +1286 -0
  241. flextool/process_outputs/write_spinedb.py +1267 -0
  242. flextool/representative_periods/__init__.py +5 -0
  243. flextool/representative_periods/clustering.py +165 -0
  244. flextool/representative_periods/force_include.py +563 -0
  245. flextool/representative_periods/netload.py +365 -0
  246. flextool/representative_periods/netload_inputs.py +345 -0
  247. flextool/representative_periods/netload_iterate.py +722 -0
  248. flextool/representative_periods/preprocess.py +948 -0
  249. flextool/representative_periods/scenario_stack.py +195 -0
  250. flextool/representative_periods/weights.py +124 -0
  251. flextool/scenario_comparison/__init__.py +13 -0
  252. flextool/scenario_comparison/config_builder.py +158 -0
  253. flextool/scenario_comparison/constants.py +20 -0
  254. flextool/scenario_comparison/data_models.py +222 -0
  255. flextool/scenario_comparison/db_reader.py +399 -0
  256. flextool/scenario_comparison/dispatch_data.py +1002 -0
  257. flextool/scenario_comparison/dispatch_mappings.py +205 -0
  258. flextool/scenario_comparison/dispatch_plots.py +691 -0
  259. flextool/scenario_comparison/input_entity_colors.py +319 -0
  260. flextool/scenario_comparison/orchestrator.py +453 -0
  261. flextool/scenario_comparison/plan_union.py +244 -0
  262. flextool/scenario_comparison/plot_settings_seed.py +205 -0
  263. flextool/schemas/AXIS_CONTRACT.md +71 -0
  264. flextool/schemas/canonical_databases/howto_aggregate_output.json +6225 -0
  265. flextool/schemas/canonical_databases/howto_connections.json +5606 -0
  266. flextool/schemas/canonical_databases/howto_demand.json +5518 -0
  267. flextool/schemas/canonical_databases/howto_hydro_reservoir.json +6239 -0
  268. flextool/schemas/canonical_databases/howto_hydro_reservoir_with_pump.json +5933 -0
  269. flextool/schemas/canonical_databases/howto_non_sync_and_curtailment.json +5794 -0
  270. flextool/schemas/canonical_databases/howto_ramp_and_start_up.json +5707 -0
  271. flextool/schemas/canonical_databases/howto_stochastics.json +6032 -0
  272. flextool/schemas/canonical_databases/templates_examples.json +13532 -0
  273. flextool/schemas/canonical_databases/templates_time_settings_only.json +5340 -0
  274. flextool/schemas/comparison_settings_template.json +197 -0
  275. flextool/schemas/default_plot_settings.yaml +260 -0
  276. flextool/schemas/default_plots.yaml +2293 -0
  277. flextool/schemas/flextool_axis_contract.json +303 -0
  278. flextool/schemas/flextool_axis_contract.schema.json +247 -0
  279. flextool/schemas/old_flextool_import_template.json +4443 -0
  280. flextool/schemas/output_info_template.json +48 -0
  281. flextool/schemas/output_settings_template.json +256 -0
  282. flextool/schemas/pre_v26/flextool_template_constant_default.json +2105 -0
  283. flextool/schemas/pre_v26/flextool_template_default_optional_output.json +2152 -0
  284. flextool/schemas/pre_v26/flextool_template_default_value.json +2094 -0
  285. flextool/schemas/pre_v26/flextool_template_drop_down.json +2080 -0
  286. flextool/schemas/pre_v26/flextool_template_lifetime_method.json +1990 -0
  287. flextool/schemas/pre_v26/flextool_template_optional_outputs.json +2094 -0
  288. flextool/schemas/pre_v26/flextool_template_output_node_flows.json +2105 -0
  289. flextool/schemas/pre_v26/flextool_template_results_master.json +493 -0
  290. flextool/schemas/pre_v26/flextool_template_rolling_start_remove.json +2087 -0
  291. flextool/schemas/pre_v26/flextool_template_rolling_window.json +2059 -0
  292. flextool/schemas/pre_v26/flextool_template_storage_binding_defaults.json +46 -0
  293. flextool/schemas/pre_v26/flextool_template_v2.json +1990 -0
  294. flextool/schemas/pre_v26/flextool_template_v25.json +3864 -0
  295. flextool/schemas/spinedb_results_schema.json +581 -0
  296. flextool/schemas/spinedb_schema.json +4636 -0
  297. flextool/solver_config/copt.opt.template +18 -0
  298. flextool/solver_config/cplex.opt.template +25 -0
  299. flextool/solver_config/gurobi.opt.template +18 -0
  300. flextool/solver_config/highs.opt.template +18 -0
  301. flextool/solver_config/xpress.opt.template +26 -0
  302. flextool/spinedb_backend/__init__.py +26 -0
  303. flextool/spinedb_backend/_axis_enums.py +1119 -0
  304. flextool/spinedb_backend/_backend.py +1139 -0
  305. flextool/update_flextool/__init__.py +12 -0
  306. flextool/update_flextool/canonical_databases.py +251 -0
  307. flextool/update_flextool/db_migration.py +7108 -0
  308. flextool/update_flextool/ensure_settings_db.py +138 -0
  309. flextool/update_flextool/export_database.py +103 -0
  310. flextool/update_flextool/extend_tests_fixture.py +772 -0
  311. flextool/update_flextool/generate_canonical.py +274 -0
  312. flextool/update_flextool/initialize_database.py +42 -0
  313. flextool/update_flextool/install_info.py +225 -0
  314. flextool/update_flextool/self_update.py +464 -0
  315. flextool/update_flextool/sync_master_json_template.py +125 -0
  316. flextool/update_flextool/test_fixtures.py +187 -0
  317. flextool-4.0.0.dist-info/METADATA +217 -0
  318. flextool-4.0.0.dist-info/RECORD +322 -0
  319. flextool-4.0.0.dist-info/WHEEL +5 -0
  320. flextool-4.0.0.dist-info/entry_points.txt +17 -0
  321. flextool-4.0.0.dist-info/licenses/LICENSE.txt +19 -0
  322. flextool-4.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,2293 @@
1
+ # FlexTool Output Configuration
2
+ #
3
+ # Each result can have multiple configurations (user can choose which ones to plot).
4
+ # Each result is mapped to a dict with named parameters (only non-default values need to be specified):
5
+ #
6
+ # - plot_name: Name used for plot titles
7
+ # - map_dimensions_for_plots: [index_types, plot_type] tuple that maps index_types, i.e. dataframe dimensions
8
+ # (first row indexes and then column indexes), to plot_type roles.
9
+ # Omit for no plot. The first element describes the dataframe dimensions, the second how to plot them.
10
+ # Each character in index_types maps 1:1 to a character in plot_type. An underscore separates
11
+ # row index dimensions from column index dimensions in both strings (underscore is obligatory only for index_types).
12
+ # index_types characters: 'd' period, 't' time, 'e' entity, 'p' parameter, 'g' group, 's' scenario, 'm' method
13
+ # - please not that 'e' and 'g' will be automatically sorted - others will not be - and they are not really used in other ways, they just help to map correctly
14
+ # plot_type characters:
15
+ # - 't' marks the dimension as x-axis for line plots
16
+ # - 'i' average the dimension in chunks of 'time_average_duration' and make the dimension x-axis for line plots
17
+ # - 'l' turns that dimension into a separate line in a line plot
18
+ # - 'b' for bars in the bar plot (cannot combine b with t or l)
19
+ # - 'g' groups the bars (and gives each member of the group an entry in the legend with separate color for each entry)
20
+ # - 'e' expands the name of the bar on the y-axis with this additional dimension
21
+ # - 's' stacks the dimension in bar plots or area plots
22
+ # - 'u' sub-plots the dimension
23
+ # - 'f' splits the dimension into separate files (member name appended to filename)
24
+ # - 'm' sums the dimension
25
+ # - 'a' averages the dimension
26
+ # - 'x' no specific role
27
+ # - subplots_per_row: Number of subplots per row (default 2)
28
+ # - legend: Legend placement ('right', 'all', or default)
29
+ # - bar_orientation: Orientation for bar charts only (default 'horizontal', also 'vertical')
30
+ # - base_length: "Length" of each subplot in the orientation of the bars or height for time plots (in inches, default 4)
31
+ # - max_subplots_per_file: Maximum subplots per file before splitting (default 6). When exceeded, creates multiple files with _1, _2, etc. suffixes
32
+ # - max_items_per_plot: Maximum items (bars, lines, or stacks) per plot/subplot (default 10).
33
+ # With subplots: splits each subplot and appends _1, _2, etc. to subplot names. Without subplots: creates multiple files
34
+ # - time_average_duration: Duration of time blocks that are averaged (in time steps)
35
+ # - xlabel: Label for x axis (string or list of strings for per-subplot labels)
36
+ # - ylabel: Label for y axis (string or list of strings for per-subplot labels)
37
+ # - axis_bounds: Fix value-axis limits. Options:
38
+ # 'shared' — compute global min/max across all subplots and apply to all (for visual comparability)
39
+ # 'independent' — each subplot auto-scales independently (default)
40
+ # Single pair [min, max] applies to all subplots
41
+ # List of pairs [[0,1],[],[0,100]] applies per subplot (empty entry = auto-scale)
42
+ # - axis_tick_format: Python format spec for value-axis tick labels (default 'dynamic').
43
+ # 'dynamic' adapts to data range: commas for thousands, decimals for small values,
44
+ # engineering notation (×10⁹) for values > 990M. Shows ~2 significant digits.
45
+ # Single string applies to all subplots; list applies per subplot, e.g. [',.0f', '.2%']
46
+ # - value_label: Show value labels on bar charts. Options:
47
+ # true or 'dynamic' — show labels using dynamic formatting (adapts to data range)
48
+ # A Python format spec string (e.g. '.2f') — show labels with that format
49
+ # false or omitted — no value labels (default)
50
+ # When enabled, the axis is extended by 10% to make room for labels within the plot area.
51
+ # - always_include_zero_in_axis: true/false (default true). Zero will always be within the axis bounds (preventing automatic behaviour where it can be hard to see the scale of the plot)
52
+ # - skip_data_with_only_zeroes: true/false (default false). Drops all-zero columns (and all-zero rows for bar charts) before plotting
53
+ #
54
+ # --- Comparison-mode add-ons -------------------------------------------------
55
+ # These two optional fields drive the comparison view (multiple scenarios shown
56
+ # side by side). When `scenario_rule` is set, comparison-mode rendering reads
57
+ # this single config and folds the scenario dim in on the fly — there is no
58
+ # separate comparison YAML.
59
+ #
60
+ # - scenario_rule: How the 'scenario' dim is handled in comparison mode.
61
+ # Common choices: 'g' (grouped/coloured bars), 'l' (line series),
62
+ # 'u' (subplot panel per scenario), 'f' (file per scenario).
63
+ # For pure-derivation configs, this is the ONLY thing you need.
64
+ # Example: single map_dimensions_for_plots [d_e, t_l] + scenario_rule 'l'
65
+ # produces comparison-effective rules [d_se, t_gl] at view time.
66
+ #
67
+ # - comparison_overrides: Optional dict of plot settings that take effect only
68
+ # in comparison mode. Any field listed above is allowed. Two common uses:
69
+ # * tighter layouts in comparison view (scenarios multiply bar count):
70
+ # comparison_overrides:
71
+ # max_subplots_per_file: 2
72
+ # legend: shared
73
+ # * preserving a custom comparison rule layout that *isn't* just
74
+ # "single + scenario_rule prepended" (rare — needed when the chart
75
+ # author wanted a different visual treatment of an existing dim
76
+ # in comparison mode):
77
+ # comparison_overrides:
78
+ # map_dimensions_for_plots: [ed_sp, eb_gu]
79
+ # If `map_dimensions_for_plots` is absent from `comparison_overrides`, the
80
+ # runtime auto-derives it as: prepend 's' to col_idx and `scenario_rule`
81
+ # to col_rules.
82
+ # -----------------------------------------------------------------------------
83
+ #
84
+ # There is also filename configuration section after the plot rules (used by csv and parquet)
85
+
86
+ # Default time-range duration per variant letter, used the first time the
87
+ # user views that variant. After that, the user's last setting persists in
88
+ # the project's settings.yaml. The value 'all' means "show the full
89
+ # timeline" (resolved at view time to the available data length).
90
+ default_duration:
91
+ h: 168
92
+ w: all
93
+
94
+ order_of_variants: [p, a, h, w]
95
+ max_items_per_subplot_column: 40
96
+
97
+ plots:
98
+
99
+ # Infeasibilities
100
+ 'Loss of load (upward slack)':
101
+ group: 0
102
+ order: 0
103
+ node_slack_up_d_e:
104
+ default:
105
+ variant: p
106
+ value_label: dynamic
107
+ map_dimensions_for_plots: [d_e, s_b]
108
+ xlabel: MWh (annualized)
109
+ ylabel: Node
110
+ skip_data_with_only_zeroes: true
111
+ comparison_overrides:
112
+ map_dimensions_for_plots: [d_se, b_ge]
113
+ legend: shared
114
+ max_items_per_plot: 40
115
+ max_subplots_per_file: 2
116
+ subplots_per_row: 2
117
+ sum_periods:
118
+ plot_name: 'Loss of load (upward slack) total'
119
+ variant: a
120
+ value_label: dynamic
121
+ map_dimensions_for_plots: [d_e, y_b]
122
+ color_entity_class: node
123
+ xlabel: MWh (horizon total)
124
+ ylabel: Node
125
+ skip_data_with_only_zeroes: true
126
+ comparison_overrides:
127
+ map_dimensions_for_plots: [d_se, y_ge]
128
+ legend: shared
129
+ max_items_per_plot: 40
130
+ max_subplots_per_file: 2
131
+ subplots_per_row: 2
132
+ node_slack_up_dt_e:
133
+ default:
134
+ variant: h
135
+ map_dimensions_for_plots: [dt_e, tt_l]
136
+ max_items_per_plot: 5
137
+ max_subplots_per_file: 6
138
+ subplots_per_row: 2
139
+ ylabel: Node
140
+ xlabel: MWh
141
+ skip_data_with_only_zeroes: true
142
+ comparison_overrides:
143
+ map_dimensions_for_plots: [dt_se, tt_lu]
144
+ max_items_per_plot: 10
145
+ legend: shared
146
+ ylabel: MWh
147
+ chunks:
148
+ plot_name: 'Loss of load (upward slack) weekly avg'
149
+ variant: w
150
+ map_dimensions_for_plots: [dt_e, ti_l]
151
+ time_average_duration: 168
152
+ max_items_per_plot: 5
153
+ max_subplots_per_file: 6
154
+ subplots_per_row: 2
155
+ ylabel: Node
156
+ xlabel: MWh
157
+ skip_data_with_only_zeroes: true
158
+ comparison_overrides:
159
+ map_dimensions_for_plots: [dt_sp, ti_lu]
160
+ max_items_per_plot: 10
161
+ legend: shared
162
+ ylabel: MWh
163
+ 'Excess load + spill (downward slack)':
164
+ group: 0
165
+ order: 1
166
+ node_slack_down_d_e:
167
+ default:
168
+ variant: p
169
+ value_label: dynamic
170
+ map_dimensions_for_plots: [d_e, s_b]
171
+ xlabel: MWh (annualized)
172
+ ylabel: Node
173
+ skip_data_with_only_zeroes: true
174
+ comparison_overrides:
175
+ map_dimensions_for_plots: [d_se, b_ge]
176
+ legend: shared
177
+ max_items_per_plot: 40
178
+ max_subplots_per_file: 2
179
+ subplots_per_row: 2
180
+ sum_periods:
181
+ plot_name: 'Excess load + spill (downward slack) total'
182
+ variant: a
183
+ value_label: dynamic
184
+ map_dimensions_for_plots: [d_e, y_b]
185
+ color_entity_class: node
186
+ xlabel: MWh (horizon total)
187
+ ylabel: Node
188
+ skip_data_with_only_zeroes: true
189
+ comparison_overrides:
190
+ map_dimensions_for_plots: [d_se, y_ge]
191
+ legend: shared
192
+ max_items_per_plot: 40
193
+ max_subplots_per_file: 2
194
+ subplots_per_row: 2
195
+ node_slack_down_dt_e:
196
+ default:
197
+ variant: h
198
+ map_dimensions_for_plots: [dt_e, tt_u]
199
+ max_items_per_plot: 5
200
+ max_subplots_per_file: 6
201
+ subplots_per_row: 2
202
+ xlabel: MWh
203
+ ylabel: Node
204
+ skip_data_with_only_zeroes: true
205
+ scenario_rule: l
206
+ comparison_overrides:
207
+ max_items_per_plot: 10
208
+ legend: shared
209
+ ylabel: MWh
210
+ chunks:
211
+ plot_name: 'Excess load + spill (downward slack) weekly avg'
212
+ variant: w
213
+ map_dimensions_for_plots: [dt_e, ti_u]
214
+ time_average_duration: 168
215
+ max_items_per_plot: 5
216
+ max_subplots_per_file: 6
217
+ subplots_per_row: 2
218
+ xlabel: MWh
219
+ ylabel: Node
220
+ skip_data_with_only_zeroes: true
221
+ comparison_overrides:
222
+ map_dimensions_for_plots: [dt_sp, ti_lu]
223
+ legend: shared
224
+ max_items_per_plot: 10
225
+ ylabel: MWh
226
+ 'Lack of reserves':
227
+ group: 0
228
+ order: 2
229
+ nodeGroup_slack_reserve_dt_eeg:
230
+ default:
231
+ variant: h
232
+ map_dimensions_for_plots: [dt_eeg, tt_ssu]
233
+ max_subplots_per_file: 6
234
+ subplots_per_row: 2
235
+ xlabel: MWh/h
236
+ ylabel: NodeGroup
237
+ skip_data_with_only_zeroes: true
238
+ comparison_overrides:
239
+ map_dimensions_for_plots: [dt_seeg, tt_luuu]
240
+ max_items_per_plot: 10
241
+ legend: shared
242
+ ylabel: MWh/h
243
+ chunks:
244
+ plot_name: 'Lack of reserves weekly avg'
245
+ variant: w
246
+ map_dimensions_for_plots: [dt_eeg, ti_ssu]
247
+ time_average_duration: 168
248
+ max_subplots_per_file: 6
249
+ subplots_per_row: 2
250
+ xlabel: MWh/h
251
+ ylabel: NodeGroup
252
+ skip_data_with_only_zeroes: true
253
+ comparison_overrides:
254
+ map_dimensions_for_plots: [dt_seeg, ti_luuu]
255
+ max_items_per_plot: 10
256
+ legend: shared
257
+ ylabel: MWh/h
258
+ nodeGroup_slack_reserve_d_eeg:
259
+ default:
260
+ variant: p
261
+ map_dimensions_for_plots: [d_eeg, s_bbu]
262
+ max_subplots_per_file: 6
263
+ subplots_per_row: 2
264
+ xlabel: MWh (annualized)
265
+ ylabel: NodeGroup
266
+ skip_data_with_only_zeroes: true
267
+ comparison_overrides:
268
+ map_dimensions_for_plots: [d_seeg, b_essu]
269
+ max_items_per_plot: 40
270
+ ylabel: MWh
271
+ sum_periods:
272
+ plot_name: 'Lack of reserves total'
273
+ variant: a
274
+ map_dimensions_for_plots: [d_eeg, y_bbu]
275
+ color_entity_class: group
276
+ max_subplots_per_file: 6
277
+ subplots_per_row: 2
278
+ xlabel: MWh (horizon total)
279
+ ylabel: NodeGroup
280
+ skip_data_with_only_zeroes: true
281
+ comparison_overrides:
282
+ map_dimensions_for_plots: [d_seeg, y_essu]
283
+ max_items_per_plot: 40
284
+ ylabel: MWh (horizon total)
285
+ 'Lack of inertia':
286
+ group: 0
287
+ order: 3
288
+ nodeGroup_slack_inertia_dt_g:
289
+ default:
290
+ variant: h
291
+ map_dimensions_for_plots: [dt_g, tt_u]
292
+ max_subplots_per_file: 6
293
+ subplots_per_row: 2
294
+ xlabel: MWs
295
+ ylabel: NodeGroup
296
+ skip_data_with_only_zeroes: true
297
+ scenario_rule: l
298
+ comparison_overrides:
299
+ max_items_per_plot: 10
300
+ legend: shared
301
+ ylabel: MWs
302
+ chunks:
303
+ plot_name: 'Lack of inertia weekly avg'
304
+ variant: w
305
+ map_dimensions_for_plots: [dt_g, ti_u]
306
+ time_average_duration: 168
307
+ max_subplots_per_file: 6
308
+ subplots_per_row: 2
309
+ xlabel: MWs
310
+ ylabel: NodeGroup
311
+ skip_data_with_only_zeroes: true
312
+ scenario_rule: l
313
+ comparison_overrides:
314
+ max_items_per_plot: 10
315
+ legend: shared
316
+ ylabel: MWs
317
+ nodeGroup_slack_inertia_d_g:
318
+ default:
319
+ variant: p
320
+ map_dimensions_for_plots: [d_g, s_b]
321
+ ylabel: NodeGroup
322
+ xlabel: MWs (annualized)
323
+ skip_data_with_only_zeroes: true
324
+ comparison_overrides:
325
+ map_dimensions_for_plots: [d_sg, b_eu]
326
+ max_items_per_plot: 40
327
+ ylabel: MWs (annualized)
328
+ sum_periods:
329
+ plot_name: 'Lack of inertia total'
330
+ variant: a
331
+ map_dimensions_for_plots: [d_g, y_b]
332
+ color_entity_class: group
333
+ ylabel: NodeGroup
334
+ xlabel: MWs (horizon total)
335
+ skip_data_with_only_zeroes: true
336
+ comparison_overrides:
337
+ map_dimensions_for_plots: [d_sg, y_eu]
338
+ max_items_per_plot: 40
339
+ ylabel: MWs (horizon total)
340
+ 'Lack of nonsynchronous sources':
341
+ group: 0
342
+ order: 4
343
+ nodeGroup_slack_nonsync_dt_g:
344
+ default:
345
+ variant: h
346
+ map_dimensions_for_plots: [dt_g, tt_u]
347
+ max_subplots_per_file: 6
348
+ subplots_per_row: 2
349
+ ylabel: NodeGroup
350
+ xlabel: MWh
351
+ skip_data_with_only_zeroes: true
352
+ scenario_rule: l
353
+ comparison_overrides:
354
+ max_items_per_plot: 10
355
+ legend: shared
356
+ ylabel: MWh
357
+ chunks:
358
+ plot_name: 'Lack of nonsynchronous sources weekly avg'
359
+ variant: w
360
+ map_dimensions_for_plots: [dt_g, ti_u]
361
+ time_average_duration: 168
362
+ max_subplots_per_file: 6
363
+ subplots_per_row: 2
364
+ ylabel: NodeGroup
365
+ xlabel: MWh
366
+ skip_data_with_only_zeroes: true
367
+ scenario_rule: l
368
+ comparison_overrides:
369
+ max_items_per_plot: 10
370
+ legend: shared
371
+ ylabel: MWh
372
+ nodeGroup_slack_nonsync_d_g:
373
+ default:
374
+ variant: p
375
+ map_dimensions_for_plots: [d_g, s_b]
376
+ ylabel: NodeGroup
377
+ xlabel: MWh (annualized)
378
+ skip_data_with_only_zeroes: true
379
+ comparison_overrides:
380
+ map_dimensions_for_plots: [d_sg, b_eu]
381
+ max_items_per_plot: 40
382
+ ylabel: MWh (annualized)
383
+ sum_periods:
384
+ plot_name: 'Lack of nonsynchronous sources total'
385
+ variant: a
386
+ map_dimensions_for_plots: [d_g, y_b]
387
+ color_entity_class: group
388
+ ylabel: NodeGroup
389
+ xlabel: MWh (horizon total)
390
+ skip_data_with_only_zeroes: true
391
+ comparison_overrides:
392
+ map_dimensions_for_plots: [d_sg, y_eu]
393
+ max_items_per_plot: 40
394
+ ylabel: MWh (horizon total)
395
+ 'Violation of capacity margin':
396
+ group: 0
397
+ order: 5
398
+ nodeGroup_slack_capacity_margin_d_g:
399
+ default:
400
+ variant: p
401
+ map_dimensions_for_plots: [d_g, s_b]
402
+ ylabel: NodeGroup
403
+ xlabel: MW
404
+ skip_data_with_only_zeroes: true
405
+ comparison_overrides:
406
+ map_dimensions_for_plots: [d_sg, b_eu]
407
+ max_items_per_plot: 40
408
+ xlabel: MWh
409
+ sum_periods:
410
+ plot_name: 'Violation of capacity margin average'
411
+ variant: a
412
+ map_dimensions_for_plots: [d_g, z_b]
413
+ color_entity_class: group
414
+ ylabel: NodeGroup
415
+ xlabel: MW (weighted average)
416
+ skip_data_with_only_zeroes: true
417
+ comparison_overrides:
418
+ map_dimensions_for_plots: [d_sg, z_eu]
419
+ max_items_per_plot: 40
420
+
421
+ # Curtailments
422
+ 'Curtailment amount':
423
+ group: 1
424
+ order: 0
425
+ unit_curtailment_outputNode_d_ee:
426
+ default:
427
+ variant: p
428
+ map_dimensions_for_plots: [d_ee, g_bb]
429
+ value_label: dynamic
430
+ skip_data_with_only_zeroes: true
431
+ axis_tick_format: '1,.0f'
432
+ xlabel: MWh (annualized)
433
+ comparison_overrides:
434
+ map_dimensions_for_plots: [d_see, b_gee]
435
+ max_items_per_plot: 40
436
+ legend: shared
437
+ axis_bounds: shared
438
+ sum_periods:
439
+ plot_name: 'Curtail. amount total'
440
+ variant: a
441
+ map_dimensions_for_plots: [d_ee, y_bb]
442
+ color_entity_class: unit
443
+ value_label: dynamic
444
+ skip_data_with_only_zeroes: true
445
+ axis_tick_format: '1,.0f'
446
+ xlabel: MWh (horizon total)
447
+ scenario_rule: g
448
+ comparison_overrides:
449
+ max_items_per_plot: 40
450
+ legend: shared
451
+ axis_bounds: shared
452
+ unit_curtailment_outputNode_dt_ee:
453
+ default:
454
+ variant: h
455
+ map_dimensions_for_plots: [dt_ee, tt_lu]
456
+ color_entity_class: unit
457
+ legend: all
458
+ subplots_per_row: 2
459
+ max_subplots_per_file: 6
460
+ max_items_per_plot: 10
461
+ skip_data_with_only_zeroes: true
462
+ ylabel: MWh/h
463
+ axis_tick_format: '1,.0f'
464
+ scenario_rule: l
465
+ chunks:
466
+ plot_name: 'Curtail. amount weekly avg'
467
+ variant: w
468
+ map_dimensions_for_plots: [dt_ee, ti_lu]
469
+ color_entity_class: unit
470
+ time_average_duration: 168
471
+ legend: all
472
+ subplots_per_row: 2
473
+ max_subplots_per_file: 6
474
+ max_items_per_plot: 10
475
+ skip_data_with_only_zeroes: true
476
+ ylabel: MWh/h
477
+ axis_tick_format: '1,.0f'
478
+ comparison_overrides:
479
+ map_dimensions_for_plots: [dt_see, ti_luu]
480
+ plot_name: 'Unit curtailment weekly avg'
481
+ legend: shared
482
+ ylabel: MWh
483
+ debug:
484
+ variant: l
485
+ map_dimensions_for_plots: [dt_ee, tt_uu]
486
+ legend: shared
487
+ max_items_per_plot: 10
488
+ ylabel: MWh
489
+ skip_data_with_only_zeroes: true
490
+ scenario_rule: l
491
+
492
+ 'Curtailment share of VRE':
493
+ group: 1
494
+ order: 1
495
+ unit_curtailment_share_outputNode_d_ee:
496
+ default:
497
+ variant: p
498
+ value_label: '.0%'
499
+ map_dimensions_for_plots: [d_ee, b_eu]
500
+ color_entity_class: unit
501
+ skip_data_with_only_zeroes: true
502
+ subplots_per_row: 2
503
+ max_subplots_per_file: 4
504
+ max_items_per_plot: 40
505
+ axis_bounds: shared
506
+ axis_tick_format: '.0%'
507
+ comparison_overrides:
508
+ map_dimensions_for_plots: [d_see, b_gee]
509
+ legend: shared
510
+ sum_periods:
511
+ plot_name: 'Curtail. share of VRE average'
512
+ variant: a
513
+ map_dimensions_for_plots: [d_ee, z_eu]
514
+ skip_data_with_only_zeroes: true
515
+ subplots_per_row: 2
516
+ max_subplots_per_file: 4
517
+ max_items_per_plot: 40
518
+ axis_bounds: shared
519
+ axis_tick_format: '.0%'
520
+ xlabel: percent (weighted average)
521
+ comparison_overrides:
522
+ map_dimensions_for_plots: [d_see, z_gbu]
523
+ legend: shared
524
+ unit_curtailment_share_outputNode_dt_ee:
525
+ default:
526
+ variant: h
527
+ map_dimensions_for_plots: [dt_ee, tt_lu]
528
+ subplots_per_row: 2
529
+ max_subplots_per_file: 6
530
+ max_items_per_plot: 10
531
+ legend: all
532
+ skip_data_with_only_zeroes: true
533
+ axis_tick_format: '.0%'
534
+ comparison_overrides:
535
+ map_dimensions_for_plots: [dt_see, tt_luu]
536
+ chunks:
537
+ plot_name: 'Curtail. share of VRE weekly avg'
538
+ variant: w
539
+ map_dimensions_for_plots: [dt_ee, ti_lu]
540
+ time_average_duration: 168
541
+ subplots_per_row: 2
542
+ max_subplots_per_file: 6
543
+ max_items_per_plot: 10
544
+ legend: all
545
+ skip_data_with_only_zeroes: true
546
+ axis_tick_format: '.0%'
547
+
548
+ # Flows for units and connections
549
+ comparison_overrides:
550
+ map_dimensions_for_plots: [dt_see, ti_luu]
551
+ 'Flows: unit to node':
552
+ group: 2
553
+ order: 0
554
+ unit_outputNode_d_ee:
555
+ default:
556
+ variant: p
557
+ map_dimensions_for_plots: [d_ee, b_eu]
558
+ color_entity_class: unit
559
+ ylabel: Node
560
+ value_label: dynamic
561
+ xlabel: MWh (annualized)
562
+ max_items_per_plot: 40
563
+ max_subplots_per_file: 6
564
+ skip_data_with_only_zeroes: true
565
+ scenario_rule: g
566
+ comparison_overrides:
567
+ legend: shared
568
+ sum_periods:
569
+ plot_name: 'Flows: unit to node total'
570
+ variant: a
571
+ map_dimensions_for_plots: [d_ee, y_be]
572
+ color_entity_class: unit
573
+ ylabel: Node
574
+ value_label: dynamic
575
+ xlabel: MWh (horizon total)
576
+ axis_bounds: shared
577
+ max_items_per_plot: 40
578
+ max_subplots_per_file: 6
579
+ skip_data_with_only_zeroes: true
580
+ comparison_overrides:
581
+ map_dimensions_for_plots: [d_see, y_gbu]
582
+ legend: shared
583
+ unit_outputNode_dt_ee:
584
+ default:
585
+ variant: h
586
+ legend: all
587
+ map_dimensions_for_plots: [dt_ee, tt_su]
588
+ color_entity_class: unit
589
+ max_items_per_plot: 12
590
+ max_subplots_per_file: 6
591
+ base_length: 5
592
+ skip_data_with_only_zeroes: true
593
+ ylabel: MWh/h
594
+ comparison_overrides:
595
+ map_dimensions_for_plots: [dt_see, tt_luu]
596
+ legend: shared
597
+ ylabel: MWh
598
+ chunks:
599
+ plot_name: 'Flows: unit to node weekly avg'
600
+ variant: w
601
+ legend: all
602
+ map_dimensions_for_plots: [dt_ee, ti_su]
603
+ color_entity_class: unit
604
+ time_average_duration: 168
605
+ max_items_per_plot: 30
606
+ max_subplots_per_file: 6
607
+ base_length: 5
608
+ skip_data_with_only_zeroes: true
609
+ ylabel: MWh/h
610
+ comparison_overrides:
611
+ map_dimensions_for_plots: [dt_see, ti_luu]
612
+ plot_name: 'Flows unit to node weekly avg'
613
+ legend: shared
614
+ ylabel: MWh
615
+ time_plots:
616
+ variant: l
617
+ map_dimensions_for_plots: [dt_ee, tt_lu]
618
+ color_entity_class: unit
619
+ max_items_per_plot: 10
620
+ subplots_per_row: 2
621
+ max_subplots_per_file: 6
622
+ skip_data_with_only_zeroes: true
623
+ ylabel: MWh/h
624
+ comparison_overrides:
625
+ map_dimensions_for_plots: [dt_see, tt_luu]
626
+ legend: shared
627
+ 'Flows: node to unit':
628
+ group: 2
629
+ order: 1
630
+ unit_inputNode_d_ee:
631
+ default:
632
+ variant: p
633
+ map_dimensions_for_plots: [d_ee, b_eu]
634
+ color_entity_class: unit
635
+ ylabel: Node
636
+ xlabel: MWh (annualized)
637
+ max_items_per_plot: 40
638
+ max_subplots_per_file: 6
639
+ scenario_rule: g
640
+ skip_data_with_only_zeroes: true
641
+ comparison_overrides:
642
+ max_subplots_per_file: 8
643
+ sum_periods:
644
+ plot_name: 'Flows: node to unit total'
645
+ variant: a
646
+ map_dimensions_for_plots: [d_ee, y_be]
647
+ color_entity_class: unit
648
+ ylabel: Node
649
+ xlabel: MWh (horizon total)
650
+ axis_bounds: shared
651
+ max_items_per_plot: 40
652
+ max_subplots_per_file: 6
653
+ skip_data_with_only_zeroes: true
654
+ comparison_overrides:
655
+ map_dimensions_for_plots: [d_see, y_gbu]
656
+ max_subplots_per_file: 8
657
+ skip_data_with_only_zeroes: true
658
+ unit_inputNode_dt_ee:
659
+ default:
660
+ variant: h
661
+ legend: all
662
+ map_dimensions_for_plots: [dt_ee, tt_su]
663
+ color_entity_class: unit
664
+ max_items_per_plot: 30
665
+ max_subplots_per_file: 6
666
+ base_length: 5
667
+ skip_data_with_only_zeroes: true
668
+ ylabel: MWh/h
669
+ comparison_overrides:
670
+ map_dimensions_for_plots: [dt_see, tt_luu]
671
+ legend: shared
672
+ max_items_per_plot: 10
673
+ subplots_per_row: 2
674
+ ylabel: MWh
675
+ chunks:
676
+ plot_name: 'Flows node to unit weekly avg'
677
+ variant: w
678
+ legend: all
679
+ map_dimensions_for_plots: [dt_ee, ti_su]
680
+ color_entity_class: unit
681
+ max_items_per_plot: 30
682
+ time_average_duration: 168
683
+ max_subplots_per_file: 6
684
+ base_length: 5
685
+ skip_data_with_only_zeroes: true
686
+ ylabel: MWh/h
687
+ comparison_overrides:
688
+ map_dimensions_for_plots: [dt_see, ti_luu]
689
+ plot_name: 'Flows node to unit weekly avg'
690
+ legend: shared
691
+ time_plots:
692
+ variant: l
693
+ map_dimensions_for_plots: [dt_ee, tt_lu]
694
+ color_entity_class: unit
695
+ max_items_per_plot: 10
696
+ subplots_per_row: 2
697
+ max_subplots_per_file: 6
698
+ skip_data_with_only_zeroes: true
699
+ ylabel: MWh/h
700
+ comparison_overrides:
701
+ map_dimensions_for_plots: [dt_see, tt_luu]
702
+ legend: shared
703
+ 'Flows connection':
704
+ group: 2
705
+ order: 2
706
+ connection_d_eee:
707
+ default:
708
+ variant: p
709
+ xlabel: MWh (annualized)
710
+ ylabel: Connection
711
+ map_dimensions_for_plots: [d_e, b_e]
712
+ color_entity_class: connection
713
+ max_items_per_plot: 40
714
+ max_subplots_per_file: 6
715
+ subplots_per_row: 2
716
+ skip_data_with_only_zeroes: true
717
+ comparison_overrides:
718
+ map_dimensions_for_plots: [d_se, u_gb]
719
+ legend: shared
720
+ axis_bounds: shared
721
+ sum_periods:
722
+ plot_name: 'Flows connection total'
723
+ variant: a
724
+ xlabel: MWh (horizon total)
725
+ ylabel: Connection
726
+ map_dimensions_for_plots: [d_e, y_b]
727
+ color_entity_class: connection
728
+ max_items_per_plot: 40
729
+ max_subplots_per_file: 6
730
+ subplots_per_row: 2
731
+ skip_data_with_only_zeroes: true
732
+ axis_bounds: shared
733
+ scenario_rule: g
734
+ comparison_overrides:
735
+ legend: shared
736
+ skip_data_with_only_zeroes: true
737
+ connection_dt_eee:
738
+ default:
739
+ variant: h
740
+ map_dimensions_for_plots: [dt_e, tt_s]
741
+ color_entity_class: connection
742
+ max_items_per_plot: 10
743
+ max_subplots_per_file: 6
744
+ base_length: 5
745
+ legend: all
746
+ skip_data_with_only_zeroes: true
747
+ ylabel: MWh/h
748
+ comparison_overrides:
749
+ map_dimensions_for_plots: [dt_se, tt_lu]
750
+ legend: shared
751
+ chunks:
752
+ plot_name: 'Flows connection weekly avg'
753
+ variant: w
754
+ map_dimensions_for_plots: [dt_e, ti_s]
755
+ color_entity_class: connection
756
+ time_average_duration: 168
757
+ max_items_per_plot: 10
758
+ max_subplots_per_file: 6
759
+ base_length: 5
760
+ legend: all
761
+ skip_data_with_only_zeroes: true
762
+ ylabel: MWh/h
763
+ comparison_overrides:
764
+ map_dimensions_for_plots: [dt_se, ti_lu]
765
+ legend: shared
766
+ time_plots:
767
+ variant: l
768
+ map_dimensions_for_plots: [dt_e, tt_l]
769
+ color_entity_class: connection
770
+ max_items_per_plot: 10
771
+ subplots_per_row: 2
772
+ max_subplots_per_file: 6
773
+ skip_data_with_only_zeroes: true
774
+ ylabel: MWh/h
775
+ comparison_overrides:
776
+ map_dimensions_for_plots: [dt_se, tt_lu]
777
+ legend: shared
778
+
779
+ 'Connection leftward':
780
+ group: 2
781
+ order: 3
782
+ connection_leftward_d_eee:
783
+ debug:
784
+ variant: p
785
+ map_dimensions_for_plots: [d_ee, b_eu]
786
+ color_entity_class: connection
787
+ max_items_per_plot: 40
788
+ max_subplots_per_file: 6
789
+ subplots_per_row: 2
790
+ skip_data_with_only_zeroes: true
791
+ xlabel: MWh (annualized)
792
+ scenario_rule: g
793
+ sum_periods:
794
+ plot_name: 'Connection leftward total'
795
+ variant: a
796
+ map_dimensions_for_plots: [d_ee, y_eu]
797
+ max_items_per_plot: 40
798
+ max_subplots_per_file: 6
799
+ skip_data_with_only_zeroes: true
800
+ subplots_per_row: 2
801
+ xlabel: MWh (horizon total)
802
+ scenario_rule: g
803
+ connection_leftward_dt_eee:
804
+ debug:
805
+ variant: h
806
+ map_dimensions_for_plots: [dt_ee, tt_su]
807
+ color_entity_class: connection
808
+ max_items_per_plot: 10
809
+ max_subplots_per_file: 6
810
+ skip_data_with_only_zeroes: true
811
+ base_length: 5
812
+ legend: all
813
+ ylabel: MWh/h
814
+ comparison_overrides:
815
+ map_dimensions_for_plots: [dt_see, tt_luu]
816
+ legend: shared
817
+ chunks:
818
+ plot_name: 'Connection leftward weekly avg'
819
+ variant: w
820
+ map_dimensions_for_plots: [dt_ee, ti_su]
821
+ color_entity_class: connection
822
+ time_average_duration: 168
823
+ max_items_per_plot: 10
824
+ max_subplots_per_file: 6
825
+ skip_data_with_only_zeroes: true
826
+ base_length: 5
827
+ legend: all
828
+ ylabel: MWh/h
829
+ comparison_overrides:
830
+ map_dimensions_for_plots: [dt_see, ti_luu]
831
+ legend: shared
832
+ time_plots:
833
+ variant: l
834
+ map_dimensions_for_plots: [dt_ee, tt_lu]
835
+ color_entity_class: connection
836
+ max_items_per_plot: 10
837
+ subplots_per_row: 2
838
+ max_subplots_per_file: 6
839
+ skip_data_with_only_zeroes: true
840
+ ylabel: MWh/h
841
+ comparison_overrides:
842
+ map_dimensions_for_plots: [dt_see, tt_luu]
843
+ legend: shared
844
+
845
+ 'Connection rightward':
846
+ group: 2
847
+ order: 4
848
+ connection_rightward_d_eee:
849
+ debug:
850
+ variant: p
851
+ map_dimensions_for_plots: [d_ee, b_eu]
852
+ color_entity_class: connection
853
+ max_items_per_plot: 40
854
+ max_subplots_per_file: 8
855
+ skip_data_with_only_zeroes: true
856
+ subplots_per_row: 2
857
+ xlabel: MWh (annualized)
858
+ scenario_rule: l
859
+ sum_periods:
860
+ plot_name: 'Connection rightward total'
861
+ variant: a
862
+ map_dimensions_for_plots: [d_ee, y_eu]
863
+ max_items_per_plot: 40
864
+ max_subplots_per_file: 8
865
+ skip_data_with_only_zeroes: true
866
+ subplots_per_row: 2
867
+ xlabel: MWh (horizon total)
868
+ scenario_rule: l
869
+ connection_rightward_dt_eee:
870
+ debug:
871
+ variant: h
872
+ map_dimensions_for_plots: [dt_ee, tt_lu]
873
+ color_entity_class: connection
874
+ max_items_per_plot: 10
875
+ max_subplots_per_file: 6
876
+ base_length: 5
877
+ skip_data_with_only_zeroes: true
878
+ legend: all
879
+ ylabel: MWh/h
880
+ comparison_overrides:
881
+ map_dimensions_for_plots: [dt_see, tt_luu]
882
+ legend: shared
883
+ chunks:
884
+ plot_name: 'Connection rightward weekly avg'
885
+ variant: w
886
+ map_dimensions_for_plots: [dt_ee, ti_lu]
887
+ color_entity_class: connection
888
+ time_average_duration: 168
889
+ max_items_per_plot: 10
890
+ max_subplots_per_file: 6
891
+ base_length: 5
892
+ skip_data_with_only_zeroes: true
893
+ legend: all
894
+ ylabel: MWh/h
895
+ comparison_overrides:
896
+ map_dimensions_for_plots: [dt_see, ti_luu]
897
+ legend: shared
898
+ time_plots:
899
+ variant: l
900
+ map_dimensions_for_plots: [dt_ee, tt_lu]
901
+ color_entity_class: connection
902
+ max_items_per_plot: 10
903
+ subplots_per_row: 2
904
+ max_subplots_per_file: 6
905
+ skip_data_with_only_zeroes: true
906
+ ylabel: MWh/h
907
+ comparison_overrides:
908
+ map_dimensions_for_plots: [dt_see, tt_luu]
909
+ legend: shared
910
+
911
+ # Costs
912
+ 'Costs':
913
+ group: 3
914
+ order: 0
915
+ annualized_costs_d_p:
916
+ default:
917
+ variant: p
918
+ bar_orientation: vertical
919
+ base_length: 6
920
+ ylabel: Currency
921
+ max_items_per_plot: 40
922
+ max_subplots_per_file: 2
923
+ subplots_per_row: 2
924
+ map_dimensions_for_plots: [d_p, b_s]
925
+ skip_data_with_only_zeroes: true
926
+ color_category: costs
927
+ scenario_rule: e
928
+ comparison_overrides:
929
+ base_length: 10
930
+ max_subplots_per_file: 1
931
+ xlabel: Millions of Currency
932
+ sum_periods:
933
+ plot_name: 'Costs total'
934
+ variant: a
935
+ bar_orientation: vertical
936
+ base_length: 6
937
+ map_dimensions_for_plots: [d_p, y_s]
938
+ skip_data_with_only_zeroes: true
939
+ ylabel: Currency (horizon total)
940
+ color_category: costs
941
+ scenario_rule: b
942
+ comparison_overrides:
943
+ base_length: 10
944
+ max_items_per_plot: 40
945
+ max_subplots_per_file: 1
946
+ legend: shared
947
+ xlabel: Millions of Currency (horizon total)
948
+ costs_dt_p:
949
+ default:
950
+ plot_name: 'Costs stack'
951
+ variant: h
952
+ max_items_per_plot: 15
953
+ skip_data_with_only_zeroes: true
954
+ map_dimensions_for_plots: [dt_p, tt_s]
955
+ ylabel: Currency
956
+ color_category: costs
957
+ scenario_rule: u
958
+ comparison_overrides:
959
+ max_items_per_plot: 20
960
+ max_subplots_per_file: 9
961
+ subplots_per_row: 3
962
+ axis_bounds: shared
963
+ ylabel: Currency
964
+ chunks:
965
+ plot_name: 'Costs time chunks'
966
+ variant: w
967
+ map_dimensions_for_plots: [dt_p, ui_s]
968
+ max_items_per_plot: 15
969
+ time_average_duration: 168
970
+ subplots_per_row: 2
971
+ max_subplots_per_file: 6
972
+ color_category: costs
973
+ comparison_overrides:
974
+ map_dimensions_for_plots: [dt_sp, ti_us]
975
+ plot_name: 'Costs weekly chunks'
976
+ legend: shared
977
+ max_items_per_plot: 20
978
+ max_subplots_per_file: 9
979
+ subplots_per_row: 3
980
+ ylabel: Currency
981
+ 'Costs line-plot':
982
+ group: 3
983
+ order: 1
984
+ costs_dt_p:
985
+ lines:
986
+ variant: h
987
+ map_dimensions_for_plots: [dt_p, ti_l]
988
+ max_items_per_plot: 20
989
+ subplots_per_row: 3
990
+ max_subplots_per_file: 12
991
+ ylabel: Currency
992
+ color_category: costs
993
+ comparison_overrides:
994
+ map_dimensions_for_plots: [dt_sp, tt_lu]
995
+ legend: shared
996
+ axis_bounds: shared
997
+ always_include_zero_in_axis: false
998
+ # Renamed from 'chunks' (which originally collided with the duplicate
999
+ # 'lines' key in the legacy comparison YAML) to make it unambiguous:
1000
+ # weekly-averaged version of the line plot.
1001
+ lines_weekly:
1002
+ variant: w
1003
+ map_dimensions_for_plots: [dt_p, ti_l]
1004
+ max_items_per_plot: 20
1005
+ max_subplots_per_file: 12
1006
+ subplots_per_row: 3
1007
+ legend: shared
1008
+ axis_bounds: shared
1009
+ ylabel: Currency
1010
+ time_average_duration: 168
1011
+ color_category: costs
1012
+ comparison_overrides:
1013
+ map_dimensions_for_plots: [dt_sp, ti_lu]
1014
+ always_include_zero_in_axis: false
1015
+ 'Costs discounted':
1016
+ group: 3
1017
+ order: 2
1018
+ costs_discounted_d_p:
1019
+ default:
1020
+ variant: p
1021
+ bar_orientation: vertical
1022
+ base_length: 6
1023
+ map_dimensions_for_plots: [d_p, b_s]
1024
+ ylabel: Currency
1025
+ skip_data_with_only_zeroes: true
1026
+ color_category: costs
1027
+ scenario_rule: e
1028
+ comparison_overrides:
1029
+ max_items_per_plot: 40
1030
+ base_length: 8
1031
+ ylabel: Millions of Currency
1032
+ sum_periods:
1033
+ plot_name: 'Costs discounted total'
1034
+ variant: a
1035
+ bar_orientation: vertical
1036
+ base_length: 6
1037
+ map_dimensions_for_plots: [d_p, m_s]
1038
+ ylabel: Currency
1039
+ skip_data_with_only_zeroes: true
1040
+ color_category: costs
1041
+ scenario_rule: e
1042
+ # `costs_discounted_p_` is a per-category-vs-scenario table (no period
1043
+ # or entity dim). Single mode: one stacked bar with categories shown
1044
+ # as stacks. Comparison: one stacked bar per scenario, side by side.
1045
+ # The rules ``[d_s, s_b]`` already name 'scenario' in the column part
1046
+ # (the ``s`` after ``_``); ``derive_comparison_config`` detects this
1047
+ # and skips the auto-prepend, so the same rules drive both modes.
1048
+ costs_discounted_p_:
1049
+ default:
1050
+ variant: a
1051
+ bar_orientation: vertical
1052
+ base_length: 6
1053
+ map_dimensions_for_plots: [d_s, s_b]
1054
+ ylabel: Currency
1055
+ xlabel: Cost category
1056
+ skip_data_with_only_zeroes: true
1057
+ color_category: costs
1058
+ scenario_rule: b
1059
+ comparison_overrides:
1060
+ base_length: 10
1061
+ legend: shared
1062
+
1063
+ # Per-entity cost break-downs (period level). Index = (period, entity)
1064
+ # with the entity level named 'unit'/'connection'/'node'; columns = single
1065
+ # level named 'category'. Modelled on costs_discounted_d_p ([d_p, b_s] —
1066
+ # period bars, categories stacked) with the extra entity level sub-plotted
1067
+ # ('u'), so each panel is one entity and bars are periods with cost
1068
+ # categories stacked. index_types: d=period, e=entity, p=category-column.
1069
+ 'Cost by unit':
1070
+ group: 3
1071
+ order: 3
1072
+ cost_unit_annualized_d_ec:
1073
+ default:
1074
+ variant: p
1075
+ bar_orientation: vertical
1076
+ base_length: 6
1077
+ map_dimensions_for_plots: [de_p, bu_s]
1078
+ subplots_per_row: 2
1079
+ max_items_per_plot: 40
1080
+ max_subplots_per_file: 8
1081
+ ylabel: M CUR/a
1082
+ skip_data_with_only_zeroes: true
1083
+ color_category: costs
1084
+ comparison_overrides:
1085
+ # Single mode already stacks the cost parameter ('s'); grouped+stacked
1086
+ # on one axis is unsupported, so fold scenario in as an 'expand' bar
1087
+ # dimension ('e') instead of grouped — one bar per (period × scenario),
1088
+ # stacked by cost component.
1089
+ map_dimensions_for_plots: [de_sp, bu_es]
1090
+ legend: shared
1091
+ max_subplots_per_file: 2
1092
+ base_length: 8
1093
+ cost_unit_discounted_d_ec:
1094
+ default:
1095
+ plot_name: 'Cost by unit discounted'
1096
+ variant: p
1097
+ bar_orientation: vertical
1098
+ base_length: 6
1099
+ map_dimensions_for_plots: [de_p, bu_s]
1100
+ subplots_per_row: 2
1101
+ max_items_per_plot: 40
1102
+ max_subplots_per_file: 8
1103
+ ylabel: M CUR
1104
+ skip_data_with_only_zeroes: true
1105
+ color_category: costs
1106
+ comparison_overrides:
1107
+ # Single mode already stacks the cost parameter ('s'); grouped+stacked
1108
+ # on one axis is unsupported, so fold scenario in as an 'expand' bar
1109
+ # dimension ('e') instead of grouped — one bar per (period × scenario),
1110
+ # stacked by cost component.
1111
+ map_dimensions_for_plots: [de_sp, bu_es]
1112
+ legend: shared
1113
+ max_subplots_per_file: 2
1114
+ base_length: 8
1115
+ 'Cost by connection':
1116
+ group: 3
1117
+ order: 4
1118
+ cost_connection_annualized_d_ec:
1119
+ default:
1120
+ variant: p
1121
+ bar_orientation: vertical
1122
+ base_length: 6
1123
+ map_dimensions_for_plots: [de_p, bu_s]
1124
+ subplots_per_row: 2
1125
+ max_items_per_plot: 40
1126
+ max_subplots_per_file: 8
1127
+ ylabel: M CUR/a
1128
+ skip_data_with_only_zeroes: true
1129
+ color_category: costs
1130
+ comparison_overrides:
1131
+ # Single mode already stacks the cost parameter ('s'); grouped+stacked
1132
+ # on one axis is unsupported, so fold scenario in as an 'expand' bar
1133
+ # dimension ('e') instead of grouped — one bar per (period × scenario),
1134
+ # stacked by cost component.
1135
+ map_dimensions_for_plots: [de_sp, bu_es]
1136
+ legend: shared
1137
+ max_subplots_per_file: 2
1138
+ base_length: 8
1139
+ cost_connection_discounted_d_ec:
1140
+ default:
1141
+ plot_name: 'Cost by connection discounted'
1142
+ variant: p
1143
+ bar_orientation: vertical
1144
+ base_length: 6
1145
+ map_dimensions_for_plots: [de_p, bu_s]
1146
+ subplots_per_row: 2
1147
+ max_items_per_plot: 40
1148
+ max_subplots_per_file: 8
1149
+ ylabel: M CUR
1150
+ skip_data_with_only_zeroes: true
1151
+ color_category: costs
1152
+ comparison_overrides:
1153
+ # Single mode already stacks the cost parameter ('s'); grouped+stacked
1154
+ # on one axis is unsupported, so fold scenario in as an 'expand' bar
1155
+ # dimension ('e') instead of grouped — one bar per (period × scenario),
1156
+ # stacked by cost component.
1157
+ map_dimensions_for_plots: [de_sp, bu_es]
1158
+ legend: shared
1159
+ max_subplots_per_file: 2
1160
+ base_length: 8
1161
+ 'Cost by node':
1162
+ group: 3
1163
+ order: 5
1164
+ cost_node_annualized_d_ec:
1165
+ default:
1166
+ variant: p
1167
+ bar_orientation: vertical
1168
+ base_length: 6
1169
+ map_dimensions_for_plots: [de_p, bu_s]
1170
+ subplots_per_row: 2
1171
+ max_items_per_plot: 40
1172
+ max_subplots_per_file: 8
1173
+ ylabel: M CUR/a
1174
+ skip_data_with_only_zeroes: true
1175
+ color_category: costs
1176
+ comparison_overrides:
1177
+ # Single mode already stacks the cost parameter ('s'); grouped+stacked
1178
+ # on one axis is unsupported, so fold scenario in as an 'expand' bar
1179
+ # dimension ('e') instead of grouped — one bar per (period × scenario),
1180
+ # stacked by cost component.
1181
+ map_dimensions_for_plots: [de_sp, bu_es]
1182
+ legend: shared
1183
+ max_subplots_per_file: 2
1184
+ base_length: 8
1185
+ cost_node_discounted_d_ec:
1186
+ default:
1187
+ plot_name: 'Cost by node discounted'
1188
+ variant: p
1189
+ bar_orientation: vertical
1190
+ base_length: 6
1191
+ map_dimensions_for_plots: [de_p, bu_s]
1192
+ subplots_per_row: 2
1193
+ max_items_per_plot: 40
1194
+ max_subplots_per_file: 8
1195
+ ylabel: M CUR
1196
+ skip_data_with_only_zeroes: true
1197
+ color_category: costs
1198
+ comparison_overrides:
1199
+ # Single mode already stacks the cost parameter ('s'); grouped+stacked
1200
+ # on one axis is unsupported, so fold scenario in as an 'expand' bar
1201
+ # dimension ('e') instead of grouped — one bar per (period × scenario),
1202
+ # stacked by cost component.
1203
+ map_dimensions_for_plots: [de_sp, bu_es]
1204
+ legend: shared
1205
+ max_subplots_per_file: 2
1206
+ base_length: 8
1207
+
1208
+ # Capacities for units, nodes and connections
1209
+ 'Capacity nodes':
1210
+ group: 4
1211
+ order: 0
1212
+ node_capacity_ed_p:
1213
+ default:
1214
+ variant: p
1215
+ map_dimensions_for_plots: [ed_p, bg_u]
1216
+ subplots_per_row: 2
1217
+ max_items_per_plot: 40
1218
+ max_subplots_per_file: 8
1219
+ xlabel: MWh
1220
+ skip_data_with_only_zeroes: true
1221
+ axis_bounds: shared
1222
+ value_label: dynamic
1223
+ comparison_overrides:
1224
+ map_dimensions_for_plots: [ed_sp, eb_gu]
1225
+ max_subplots_per_file: 2
1226
+ base_length: 4
1227
+ legend: shared
1228
+ 'Capacity units':
1229
+ group: 4
1230
+ order: 1
1231
+ unit_capacity_ed_p:
1232
+ default:
1233
+ variant: p
1234
+ map_dimensions_for_plots: [ed_p, bg_u]
1235
+ subplots_per_row: 2
1236
+ max_items_per_plot: 40
1237
+ max_subplots_per_file: 8
1238
+ xlabel: MW
1239
+ skip_data_with_only_zeroes: true
1240
+ axis_bounds: shared
1241
+ value_label: dynamic
1242
+ # In the comparison view, the unioned plan parquet has 'scenario'
1243
+ # prepended as the outermost column level. 'g' renders each scenario
1244
+ # as a separate colour group on the bars (side-by-side per unit).
1245
+ scenario_rule: g
1246
+ comparison_overrides:
1247
+ max_subplots_per_file: 2
1248
+ base_length: 4
1249
+ legend: shared
1250
+ 'Capacity connections':
1251
+ group: 4
1252
+ order: 2
1253
+ connection_capacity_ed_p:
1254
+ default:
1255
+ variant: p
1256
+ map_dimensions_for_plots: [ed_p, bg_u]
1257
+ subplots_per_row: 2
1258
+ max_items_per_plot: 40
1259
+ max_subplots_per_file: 8
1260
+ xlabel: MW
1261
+ skip_data_with_only_zeroes: true
1262
+ axis_bounds: shared
1263
+ value_label: dynamic
1264
+ comparison_overrides:
1265
+ map_dimensions_for_plots: [ed_sp, eb_gu]
1266
+ legend: shared
1267
+ max_subplots_per_file: 2
1268
+ base_length: 4
1269
+ 'Node marginal investment value':
1270
+ group: 4
1271
+ order: 3
1272
+ dual_invest_effective_node_d_e:
1273
+ default:
1274
+ variant: p
1275
+ map_dimensions_for_plots: [d_e, b_e]
1276
+ color_entity_class: node
1277
+ subplots_per_row: 2
1278
+ max_items_per_plot: 40
1279
+ max_subplots_per_file: 8
1280
+ base_length: 4
1281
+ skip_data_with_only_zeroes: false
1282
+ xlabel: CUR/kWh (+ = more investment here would lower total cost)
1283
+ scenario_rule: g
1284
+ comparison_overrides:
1285
+ max_subplots_per_file: 2
1286
+ 'Unit marginal investment value':
1287
+ group: 4
1288
+ order: 4
1289
+ dual_invest_effective_unit_d_e:
1290
+ default:
1291
+ variant: p
1292
+ map_dimensions_for_plots: [d_e, b_e]
1293
+ color_entity_class: unit
1294
+ subplots_per_row: 2
1295
+ max_items_per_plot: 40
1296
+ max_subplots_per_file: 8
1297
+ base_length: 4
1298
+ skip_data_with_only_zeroes: false
1299
+ xlabel: CUR/kW (+ = more investment here would lower total cost)
1300
+ scenario_rule: g
1301
+ comparison_overrides:
1302
+ max_subplots_per_file: 2
1303
+ 'Connection marginal investment value':
1304
+ group: 4
1305
+ order: 5
1306
+ dual_invest_effective_connection_d_e:
1307
+ default:
1308
+ variant: p
1309
+ map_dimensions_for_plots: [d_e, b_e]
1310
+ color_entity_class: connection
1311
+ subplots_per_row: 2
1312
+ max_items_per_plot: 40
1313
+ max_subplots_per_file: 8
1314
+ base_length: 4
1315
+ skip_data_with_only_zeroes: false
1316
+ xlabel: CUR/kW (+ = more investment here would lower total cost)
1317
+
1318
+ # Emissions
1319
+ scenario_rule: g
1320
+ comparison_overrides:
1321
+ max_subplots_per_file: 2
1322
+ 'Emissions CO2 whole model':
1323
+ group: 5
1324
+ order: 0
1325
+ CO2__:
1326
+ default:
1327
+ variant: a
1328
+ map_dimensions_for_plots: [x_x, m_b]
1329
+ xlabel: Mt CO2
1330
+ # Single mode: one bar (model-wide CO2 for the chosen scenario).
1331
+ # Comparison: one coloured bar per scenario, all in the same plot.
1332
+ scenario_rule: g
1333
+ comparison_overrides:
1334
+ base_length: 8
1335
+ 'Emissions CO2 per nodeGroup':
1336
+ group: 5
1337
+ order: 1
1338
+ CO2_d_g:
1339
+ default:
1340
+ variant: p
1341
+ map_dimensions_for_plots: [d_g, s_b]
1342
+ subplots_per_row: 2
1343
+ max_items_per_plot: 40
1344
+ max_subplots_per_file: 8
1345
+ xlabel: t CO2 (annualized)
1346
+ comparison_overrides:
1347
+ map_dimensions_for_plots: [d_sg, b_gu]
1348
+ legend: shared
1349
+ sum_periods:
1350
+ plot_name: 'Emissions CO2 per nodeGroup total'
1351
+ variant: a
1352
+ map_dimensions_for_plots: [d_g, y_b]
1353
+ color_entity_class: group
1354
+ subplots_per_row: 2
1355
+ max_items_per_plot: 40
1356
+ max_subplots_per_file: 8
1357
+ xlabel: t CO2 (horizon total)
1358
+ scenario_rule: g
1359
+ 'Process CO2 emissions':
1360
+ group: 5
1361
+ order: 2
1362
+ process_co2_d_eee:
1363
+ default:
1364
+ variant: p
1365
+ map_dimensions_for_plots: [d_eeee, b_xbxx]
1366
+ color_entity_class: process
1367
+ subplots_per_row: 2
1368
+ max_items_per_plot: 40
1369
+ max_subplots_per_file: 8
1370
+ xlabel: t CO2 (annualized)
1371
+ comparison_overrides:
1372
+ map_dimensions_for_plots: [d_seeee, u_gxbxe]
1373
+ legend: shared
1374
+ sum_periods:
1375
+ plot_name: 'Process CO2 emissions total'
1376
+ variant: a
1377
+ map_dimensions_for_plots: [d_eeee, y_xbxx]
1378
+ color_entity_class: process
1379
+ subplots_per_row: 2
1380
+ max_items_per_plot: 40
1381
+ max_subplots_per_file: 8
1382
+ xlabel: t CO2 (horizon total)
1383
+ comparison_overrides:
1384
+ map_dimensions_for_plots: [d_seeee, y_gxbxe]
1385
+ legend: shared
1386
+ 'CO2 period limited shadow price':
1387
+ group: 5
1388
+ order: 3
1389
+ co2_price_period_d_g:
1390
+ default:
1391
+ variant: p
1392
+ map_dimensions_for_plots: [d_g, s_b]
1393
+ subplots_per_row: 2
1394
+ max_items_per_plot: 40
1395
+ max_subplots_per_file: 8
1396
+ xlabel: Currency / tCO2
1397
+ comparison_overrides:
1398
+ map_dimensions_for_plots: [d_sg, u_gb]
1399
+ legend: shared
1400
+ 'CO2 cumulative limit shadow price':
1401
+ group: 5
1402
+ order: 4
1403
+ co2_price_total_d_g:
1404
+ default:
1405
+ variant: p
1406
+ map_dimensions_for_plots: [d_g, s_b]
1407
+ subplots_per_row: 2
1408
+ max_items_per_plot: 40
1409
+ max_subplots_per_file: 8
1410
+ xlabel: Currency / tCO2
1411
+
1412
+ # NodeGroups
1413
+ comparison_overrides:
1414
+ map_dimensions_for_plots: [d_sg, u_gb]
1415
+ legend: shared
1416
+ 'NodeGroup dispatch':
1417
+ group: 6
1418
+ order: 0
1419
+ nodeGroup_flows_d_gpe:
1420
+ default:
1421
+ variant: p
1422
+ legend: all
1423
+ bar_orientation: vertical
1424
+ max_items_per_plot: 50
1425
+ base_length: 6
1426
+ subplots_per_row: 1
1427
+ max_subplots_per_file: 2
1428
+ map_dimensions_for_plots: [d_gpe, b_uss]
1429
+ ylabel: MWh (annualized)
1430
+ skip_data_with_only_zeroes: true
1431
+ color_category: nodegroup_flows
1432
+ comparison_overrides:
1433
+ map_dimensions_for_plots: [d_sgpe, u_buss]
1434
+ sum_periods:
1435
+ plot_name: 'NodeGroup dispatch total'
1436
+ variant: a
1437
+ legend: all
1438
+ bar_orientation: vertical
1439
+ base_length: 12
1440
+ max_items_per_plot: 50
1441
+ subplots_per_row: 1
1442
+ max_subplots_per_file: 1
1443
+ map_dimensions_for_plots: [d_gpe, y_uss]
1444
+ ylabel: MWh (horizon total)
1445
+ skip_data_with_only_zeroes: true
1446
+ color_category: nodegroup_flows
1447
+ scenario_rule: b
1448
+ nodeGroup_flows_dt_gpe:
1449
+ default:
1450
+ variant: h
1451
+ subplots_per_row: 2
1452
+ max_subplots_per_file: 4
1453
+ max_items_per_plot: 30
1454
+ legend: all
1455
+ map_dimensions_for_plots: [dt_gpe, tt_uss]
1456
+ ylabel: MWh
1457
+ skip_data_with_only_zeroes: true
1458
+ color_category: nodegroup_flows
1459
+ comparison_overrides:
1460
+ map_dimensions_for_plots: [dt_sgpe, tt_luuu]
1461
+ max_subplots_per_file: 6
1462
+ base_length: 6
1463
+ ylabel: MWh
1464
+ chunks:
1465
+ plot_name: 'NodeGroup dispatch weekly avg'
1466
+ variant: w
1467
+ subplots_per_row: 2
1468
+ max_subplots_per_file: 4
1469
+ max_items_per_plot: 30
1470
+ legend: all
1471
+ map_dimensions_for_plots: [dt_gpe, ti_uss]
1472
+ time_average_duration: 168
1473
+ ylabel: MWh
1474
+ skip_data_with_only_zeroes: true
1475
+ color_category: nodegroup_flows
1476
+ comparison_overrides:
1477
+ map_dimensions_for_plots: [dt_sgpe, ti_luuu]
1478
+ max_subplots_per_file: 6
1479
+ base_length: 6
1480
+ ylabel: MWh
1481
+ 'NodeGroup indicators':
1482
+ group: 6
1483
+ order: 1
1484
+ nodeGroup_gdt_p:
1485
+ debug:
1486
+ variant: h
1487
+ map_dimensions_for_plots: [gdt_p, ltt_u]
1488
+ max_items_per_plot: 10
1489
+ subplots_per_row: 3
1490
+ max_subplots_per_file: 9
1491
+ axis_bounds: [[], [], [], [], [], [0, 1], [], [0, 1]]
1492
+ axis_tick_format: ['1,.0f', '1,.0f', '1,.0f', '1,.0f', '1,.0f', '.0%', '1,.0f', '.0%']
1493
+ ylabel: [MWh, MWh, MWh, MWh, MWh, percent, MWh, percent]
1494
+ scenario_rule: l
1495
+ chunks:
1496
+ variant: w
1497
+ map_dimensions_for_plots: [gdt_p, lti_u]
1498
+ time_average_duration: 168
1499
+ max_items_per_plot: 10
1500
+ subplots_per_row: 3
1501
+ max_subplots_per_file: 9
1502
+ axis_bounds: [[], [], [], [], [], [0, 1], [], [0, 1]]
1503
+ axis_tick_format: ['1,.0f', '1,.0f', '1,.0f', '1,.0f', '1,.0f', '.0%', '1,.0f', '.0%']
1504
+ ylabel: [MWh, MWh, MWh, MWh, MWh, percent, MWh, percent]
1505
+ scenario_rule: l
1506
+ nodeGroup_gd_p:
1507
+ default:
1508
+ variant: p
1509
+ map_dimensions_for_plots: [gd_p, fb_u]
1510
+ color_entity_class: group
1511
+ max_items_per_plot: 10
1512
+ subplots_per_row: 2
1513
+ max_subplots_per_file: 8
1514
+ axis_bounds: [[0, 1], [0, 1], [0, 1], [0, 1], [], [0, 1]]
1515
+ axis_tick_format: ['.0%', '.0%', '.0%', '.0%', '1,.0f', '.0%']
1516
+ xlabel: [percent, percent, percent, percent, MWh, percent]
1517
+ comparison_overrides:
1518
+ map_dimensions_for_plots: [gd_sp, fg_bu]
1519
+ max_items_per_plot: 40
1520
+ axis_tick_format: ['.0%', '.0%', '.0%', '.0%', dynamic, '.0%']
1521
+ sum_periods:
1522
+ variant: a
1523
+ map_dimensions_for_plots: [gd_p, fz_u]
1524
+ max_items_per_plot: 10
1525
+ subplots_per_row: 2
1526
+ max_subplots_per_file: 8
1527
+ axis_bounds: [[0, 1], [0, 1], [0, 1], [0, 1], [], [0, 1]]
1528
+ axis_tick_format: ['.0%', '.0%', '.0%', '.0%', '1,.0f', '.0%']
1529
+ xlabel: [percent, percent, percent, percent, MWh, percent]
1530
+ scenario_rule: b
1531
+ comparison_overrides:
1532
+ max_items_per_plot: 40
1533
+ axis_tick_format: ['.0%', '.0%', '.0%', '.0%', dynamic, '.0%']
1534
+ 'NodeGroup VRE share':
1535
+ group: 6
1536
+ order: 2
1537
+ nodeGroup_VRE_share_d_g:
1538
+ default:
1539
+ variant: p
1540
+ map_dimensions_for_plots: [d_g, g_b]
1541
+ subplots_per_row: 2
1542
+ max_items_per_plot: 40
1543
+ max_subplots_per_file: 8
1544
+ axis_tick_format: '.0%'
1545
+ xlabel: share
1546
+ comparison_overrides:
1547
+ map_dimensions_for_plots: [d_sg, b_ge]
1548
+ legend: shared
1549
+ subplots_per_row: 1
1550
+ max_subplots_per_file: 1
1551
+ base_length: 8
1552
+ skip_data_with_only_zeroes: true
1553
+ sum_periods:
1554
+ plot_name: 'NodeGroup VRE share average'
1555
+ variant: a
1556
+ map_dimensions_for_plots: [d_g, z_b]
1557
+ color_entity_class: group
1558
+ legend: shared
1559
+ subplots_per_row: 1
1560
+ max_items_per_plot: 40
1561
+ max_subplots_per_file: 1
1562
+ base_length: 8
1563
+ skip_data_with_only_zeroes: true
1564
+ axis_tick_format: '.0%'
1565
+ xlabel: percent (weighted average)
1566
+ scenario_rule: g
1567
+ nodeGroup_VRE_share_dt_g:
1568
+ default:
1569
+ variant: h
1570
+ map_dimensions_for_plots: [dt_g, tt_l]
1571
+ subplots_per_row: 2
1572
+ max_items_per_plot: 10
1573
+ max_subplots_per_file: 4
1574
+ axis_tick_format: '.0%'
1575
+ ylabel: share
1576
+ comparison_overrides:
1577
+ map_dimensions_for_plots: [dt_sg, tt_lu]
1578
+ legend: shared
1579
+ axis_bounds: shared
1580
+ chunks:
1581
+ plot_name: 'NodeGroup VRE share weekly avg'
1582
+ variant: w
1583
+ map_dimensions_for_plots: [dt_g, ui_l]
1584
+ time_average_duration: 168
1585
+ subplots_per_row: 2
1586
+ max_items_per_plot: 10
1587
+ max_subplots_per_file: 4
1588
+ axis_tick_format: '.0%'
1589
+ ylabel: share
1590
+ comparison_overrides:
1591
+ map_dimensions_for_plots: [dt_sg, ti_lu]
1592
+ legend: shared
1593
+ axis_bounds: shared
1594
+ 'NodeGroup inertia':
1595
+ group: 6
1596
+ order: 3
1597
+ nodeGroup_inertia_dt_g:
1598
+ default:
1599
+ variant: h
1600
+ map_dimensions_for_plots: [dt_g, tt_l]
1601
+ subplots_per_row: 2
1602
+ max_items_per_plot: 10
1603
+ max_subplots_per_file: 4
1604
+ ylabel: MWs
1605
+ comparison_overrides:
1606
+ map_dimensions_for_plots: [dt_sg, tt_lu]
1607
+ legend: shared
1608
+ chunks:
1609
+ plot_name: 'NodeGroup inertia weekly avg'
1610
+ variant: w
1611
+ map_dimensions_for_plots: [dt_g, ti_l]
1612
+ time_average_duration: 168
1613
+ subplots_per_row: 2
1614
+ max_items_per_plot: 10
1615
+ max_subplots_per_file: 4
1616
+ ylabel: MWs
1617
+ comparison_overrides:
1618
+ map_dimensions_for_plots: [dt_sg, ti_lu]
1619
+ legend: shared
1620
+ 'NodeGroup inertia of largest flow':
1621
+ group: 6
1622
+ order: 4
1623
+ nodeGroup_inertia_largest_flow_dt_g:
1624
+ default:
1625
+ variant: h
1626
+ map_dimensions_for_plots: [dt_g, tt_l]
1627
+ subplots_per_row: 2
1628
+ max_items_per_plot: 10
1629
+ max_subplots_per_file: 4
1630
+ ylabel: MW
1631
+ scenario_rule: l
1632
+ chunks:
1633
+ plot_name: 'NodeGroup inertia of largest flow weekly avg'
1634
+ variant: w
1635
+ map_dimensions_for_plots: [dt_g, ti_l]
1636
+ time_average_duration: 168
1637
+ subplots_per_row: 2
1638
+ max_items_per_plot: 10
1639
+ max_subplots_per_file: 4
1640
+ ylabel: MW
1641
+ scenario_rule: l
1642
+ 'NodeGroup inertia of unit flows':
1643
+ group: 6
1644
+ order: 5
1645
+ nodeGroup_unit_node_inertia_dt_gee:
1646
+ default:
1647
+ variant: h
1648
+ map_dimensions_for_plots: [dt_gee, tt_uss]
1649
+ subplots_per_row: 2
1650
+ max_items_per_plot: 10
1651
+ max_subplots_per_file: 4
1652
+ ylabel: MWs
1653
+ scenario_rule: l
1654
+ chunks:
1655
+ plot_name: 'NodeGroup inertia of unit flows weekly avg'
1656
+ variant: w
1657
+ map_dimensions_for_plots: [dt_gee, ti_uss]
1658
+ time_average_duration: 168
1659
+ subplots_per_row: 2
1660
+ max_items_per_plot: 10
1661
+ max_subplots_per_file: 4
1662
+ ylabel: MWs
1663
+ scenario_rule: l
1664
+ 'NodeGroup inflow':
1665
+ group: 6
1666
+ order: 6
1667
+ nodeGroup_flows_d_g:
1668
+ default:
1669
+ variant: p
1670
+ bar_orientation: vertical
1671
+ base_length: 8
1672
+ map_dimensions_for_plots: [d_g, b_s]
1673
+ max_items_per_plot: 40
1674
+ ylabel: MWh (annualized)
1675
+ comparison_overrides:
1676
+ map_dimensions_for_plots: [d_sg, g_bu]
1677
+ legend: shared
1678
+ subplots_per_row: 2
1679
+ max_subplots_per_file: 8
1680
+ sum_periods:
1681
+ plot_name: 'NodeGroup inflow cumulative'
1682
+ variant: a
1683
+ bar_orientation: vertical
1684
+ base_length: 8
1685
+ map_dimensions_for_plots: [d_g, y_s]
1686
+ max_items_per_plot: 40
1687
+ ylabel: MWh (horizon total)
1688
+ comparison_overrides:
1689
+ map_dimensions_for_plots: [d_sg, y_gb]
1690
+ plot_name: 'NodeGroup inflows total'
1691
+ subplots_per_row: 2
1692
+ max_subplots_per_file: 8
1693
+ legend: shared
1694
+ ylabel: MWh
1695
+ nodeGroup_flows_dt_g:
1696
+ default:
1697
+ variant: h
1698
+ map_dimensions_for_plots: [dt_g, tt_l]
1699
+ subplots_per_row: 2
1700
+ max_items_per_plot: 10
1701
+ max_subplots_per_file: 4
1702
+ ylabel: MWh/h
1703
+ comparison_overrides:
1704
+ map_dimensions_for_plots: [dt_sg, tt_lu]
1705
+ chunks:
1706
+ plot_name: 'NodeGroup inflow weekly avg'
1707
+ variant: w
1708
+ map_dimensions_for_plots: [dt_g, ti_l]
1709
+ time_average_duration: 168
1710
+ subplots_per_row: 2
1711
+ max_items_per_plot: 10
1712
+ max_subplots_per_file: 4
1713
+ ylabel: MWh/h
1714
+
1715
+ # Node details
1716
+ comparison_overrides:
1717
+ map_dimensions_for_plots: [dt_sg, ti_lu]
1718
+ max_subplots_per_file: 6
1719
+ 'Node':
1720
+ group: 7
1721
+ order: 0
1722
+ node_d_ep:
1723
+ default:
1724
+ variant: p
1725
+ map_dimensions_for_plots: [d_ep, b_es]
1726
+ max_items_per_plot: 40
1727
+ max_subplots_per_file: 8
1728
+ subplots_per_row: 2
1729
+ ylabel: MWh (annualized)
1730
+ color_category: node_flows
1731
+ comparison_overrides:
1732
+ map_dimensions_for_plots: [d_sep, u_bes]
1733
+ base_length: 6
1734
+ axis_bounds: shared
1735
+ xlabel: MWh (annualized)
1736
+ sum_periods:
1737
+ plot_name: 'Node total'
1738
+ variant: a
1739
+ map_dimensions_for_plots: [d_ep, y_es]
1740
+ max_items_per_plot: 40
1741
+ max_subplots_per_file: 8
1742
+ subplots_per_row: 2
1743
+ ylabel: MWh (horizon total)
1744
+ color_category: node_flows
1745
+ scenario_rule: b
1746
+ comparison_overrides:
1747
+ base_length: 6
1748
+ axis_bounds: shared
1749
+ xlabel: MWh (horizon total)
1750
+ node_dt_ep:
1751
+ default:
1752
+ variant: h
1753
+ map_dimensions_for_plots: [dt_ep, tt_us]
1754
+ max_items_per_plot: 30
1755
+ max_subplots_per_file: 6
1756
+ legend: all
1757
+ ylabel: MWh/h
1758
+ color_category: node_flows
1759
+ comparison_overrides:
1760
+ map_dimensions_for_plots: [dt_sep, tt_luu]
1761
+ max_items_per_plot: 10
1762
+ subplots_per_row: 2
1763
+ ylabel: MWh
1764
+ chunks:
1765
+ plot_name: 'Node weekly avg'
1766
+ variant: w
1767
+ map_dimensions_for_plots: [dt_ep, ti_us]
1768
+ time_average_duration: 168
1769
+ max_items_per_plot: 30
1770
+ max_subplots_per_file: 6
1771
+ legend: all
1772
+ ylabel: MWh/h
1773
+ color_category: node_flows
1774
+ comparison_overrides:
1775
+ map_dimensions_for_plots: [dt_sep, ti_luu]
1776
+ plot_name: 'Node flows weekly avg'
1777
+ max_items_per_plot: 10
1778
+ subplots_per_row: 2
1779
+ ylabel: MWh
1780
+ 'Node prices':
1781
+ group: 7
1782
+ order: 1
1783
+ node_prices_dt_e:
1784
+ default:
1785
+ variant: h
1786
+ map_dimensions_for_plots: [sdt_e, mtt_l]
1787
+ max_items_per_plot: 10
1788
+ max_subplots_per_file: 6
1789
+ ylabel: Currency/MWh
1790
+ comparison_overrides:
1791
+ map_dimensions_for_plots: [sdt_se, mtt_lu]
1792
+ legend: shared
1793
+ ylabel: Currency / MWh
1794
+ chunks:
1795
+ plot_name: 'Node prices weekly avg'
1796
+ variant: w
1797
+ map_dimensions_for_plots: [sdt_e, mti_l]
1798
+ time_average_duration: 168
1799
+ max_items_per_plot: 10
1800
+ max_subplots_per_file: 6
1801
+ ylabel: Currency/MWh
1802
+ comparison_overrides:
1803
+ map_dimensions_for_plots: [sdt_se, mti_lu]
1804
+ legend: shared
1805
+ ylabel: Currency / MWh
1806
+ 'Node state':
1807
+ group: 7
1808
+ order: 2
1809
+ node_state_dt_e:
1810
+ default:
1811
+ variant: h
1812
+ map_dimensions_for_plots: [dt_e, tt_l]
1813
+ color_entity_class: node
1814
+ max_items_per_plot: 10
1815
+ max_subplots_per_file: 6
1816
+ ylabel: MWh
1817
+ comparison_overrides:
1818
+ map_dimensions_for_plots: [dt_se, tt_lu]
1819
+ skip_data_with_only_zeroes: true
1820
+ legend: shared
1821
+ chunks:
1822
+ plot_name: 'Node state weekly avg'
1823
+ variant: w
1824
+ map_dimensions_for_plots: [dt_e, ui_l]
1825
+ color_entity_class: node
1826
+ time_average_duration: 168
1827
+ max_items_per_plot: 10
1828
+ max_subplots_per_file: 6
1829
+ ylabel: MWh
1830
+
1831
+ # Unit and connection (process) details
1832
+ comparison_overrides:
1833
+ map_dimensions_for_plots: [dt_se, ti_lu]
1834
+ skip_data_with_only_zeroes: true
1835
+ legend: shared
1836
+ 'Unit cf for inputs':
1837
+ group: 8
1838
+ order: 0
1839
+ unit_inputs_cf_d_ee:
1840
+ default:
1841
+ variant: p
1842
+ map_dimensions_for_plots: [d_ee, b_ee]
1843
+ color_entity_class: unit
1844
+ max_items_per_plot: 40
1845
+ max_subplots_per_file: 8
1846
+ subplots_per_row: 2
1847
+ axis_bounds: [0, 1]
1848
+ axis_tick_format: '.0%'
1849
+ xlabel: percent
1850
+ scenario_rule: g
1851
+ sum_periods:
1852
+ variant: a
1853
+ map_dimensions_for_plots: [d_ee, z_eb]
1854
+ color_entity_class: unit
1855
+ max_items_per_plot: 40
1856
+ max_subplots_per_file: 8
1857
+ subplots_per_row: 2
1858
+ axis_bounds: [0, 1]
1859
+ axis_tick_format: '.0%'
1860
+ xlabel: percent (weighted average)
1861
+ scenario_rule: g
1862
+ 'Unit cf for outputs':
1863
+ group: 8
1864
+ order: 1
1865
+ unit_outputs_cf_d_ee:
1866
+ default:
1867
+ variant: p
1868
+ map_dimensions_for_plots: [d_ee, b_ee]
1869
+ color_entity_class: unit
1870
+ max_items_per_plot: 40
1871
+ max_subplots_per_file: 8
1872
+ subplots_per_row: 2
1873
+ axis_bounds: [0, 1]
1874
+ axis_tick_format: '.0%'
1875
+ xlabel: percent
1876
+ scenario_rule: g
1877
+ sum_periods:
1878
+ variant: a
1879
+ map_dimensions_for_plots: [d_ee, z_eb]
1880
+ color_entity_class: unit
1881
+ max_items_per_plot: 40
1882
+ max_subplots_per_file: 8
1883
+ subplots_per_row: 2
1884
+ axis_bounds: [0, 1]
1885
+ axis_tick_format: '.0%'
1886
+ xlabel: percent (weighted average)
1887
+ scenario_rule: g
1888
+ 'Unit online':
1889
+ group: 8
1890
+ order: 2
1891
+ unit_online_dt_e:
1892
+ default:
1893
+ variant: h
1894
+ map_dimensions_for_plots: [dt_e, tt_l]
1895
+ color_entity_class: unit
1896
+ max_items_per_plot: 10
1897
+ max_subplots_per_file: 6
1898
+ ylabel: units online
1899
+ scenario_rule: l
1900
+ chunks:
1901
+ plot_name: 'Unit online weekly avg'
1902
+ variant: w
1903
+ map_dimensions_for_plots: [dt_e, ti_l]
1904
+ color_entity_class: unit
1905
+ time_average_duration: 168
1906
+ max_items_per_plot: 10
1907
+ max_subplots_per_file: 6
1908
+ ylabel: units online
1909
+ comparison_overrides:
1910
+ map_dimensions_for_plots: [dt_se, ti_lu]
1911
+ legend: shared
1912
+ ylabel: number of units online
1913
+ unit_online_average_d_e:
1914
+ default:
1915
+ variant: p
1916
+ map_dimensions_for_plots: [d_e, g_b]
1917
+ max_items_per_plot: 40
1918
+ xlabel: units online (period average)
1919
+ scenario_rule: g
1920
+ sum_periods:
1921
+ plot_name: 'Unit online average'
1922
+ variant: a
1923
+ map_dimensions_for_plots: [d_e, z_b]
1924
+ color_entity_class: unit
1925
+ max_items_per_plot: 40
1926
+ xlabel: units online (weighted average)
1927
+ scenario_rule: g
1928
+ comparison_overrides:
1929
+ max_subplots_per_file: 8
1930
+ xlabel: unit online (weighted average)
1931
+ subplots_per_row: 2
1932
+ legend: shared
1933
+ 'Unit ramp inputs':
1934
+ group: 8
1935
+ order: 3
1936
+ unit_ramp_inputs_dt_ee:
1937
+ debug:
1938
+ variant: h
1939
+ map_dimensions_for_plots: [dt_ee, tt_lu]
1940
+ subplots_per_row: 2
1941
+ max_items_per_plot: 10
1942
+ max_subplots_per_file: 4
1943
+ legend: all
1944
+ ylabel: MW/h
1945
+ scenario_rule: l
1946
+ chunks:
1947
+ plot_name: 'Unit ramp inputs weekly avg'
1948
+ variant: w
1949
+ map_dimensions_for_plots: [dt_ee, ti_lu]
1950
+ time_average_duration: 168
1951
+ subplots_per_row: 2
1952
+ max_items_per_plot: 10
1953
+ max_subplots_per_file: 4
1954
+ legend: all
1955
+ ylabel: MW/h
1956
+ scenario_rule: l
1957
+ 'Unit ramp outputs':
1958
+ group: 8
1959
+ order: 4
1960
+ unit_ramp_outputs_dt_ee:
1961
+ debug:
1962
+ variant: h
1963
+ map_dimensions_for_plots: [dt_ee, tt_lu]
1964
+ subplots_per_row: 2
1965
+ max_items_per_plot: 10
1966
+ max_subplots_per_file: 4
1967
+ legend: all
1968
+ ylabel: MW/h
1969
+ chunks:
1970
+ plot_name: 'Unit ramp outputs weekly avg'
1971
+ variant: w
1972
+ map_dimensions_for_plots: [dt_ee, ti_lu]
1973
+ time_average_duration: 168
1974
+ subplots_per_row: 2
1975
+ max_items_per_plot: 10
1976
+ max_subplots_per_file: 4
1977
+ legend: all
1978
+ ylabel: MW/h
1979
+ scenario_rule: l
1980
+ 'Unit startup':
1981
+ group: 8
1982
+ order: 5
1983
+ unit_startup_d_e:
1984
+ default:
1985
+ variant: p
1986
+ map_dimensions_for_plots: [d_e, g_b]
1987
+ max_items_per_plot: 40
1988
+ xlabel: number of starts (annualized)
1989
+ sum_periods:
1990
+ plot_name: 'Unit startup total'
1991
+ variant: a
1992
+ map_dimensions_for_plots: [d_e, y_b]
1993
+ color_entity_class: unit
1994
+ max_items_per_plot: 40
1995
+ xlabel: starts (horizon total)
1996
+ scenario_rule: g
1997
+ comparison_overrides:
1998
+ plot_name: 'Unit startup cumulative'
1999
+ legend: shared
2000
+ subplots_per_row: 1
2001
+ max_subplots_per_file: 1
2002
+ base_length: 8
2003
+ 'Connection losses':
2004
+ group: 8
2005
+ order: 6
2006
+ connection_losses_d_eee:
2007
+ default:
2008
+ variant: p
2009
+ xlabel: MWh (annualized)
2010
+ map_dimensions_for_plots: [d_e, g_b]
2011
+ max_items_per_plot: 40
2012
+ scenario_rule: g
2013
+ sum_periods:
2014
+ plot_name: 'Connection losses total'
2015
+ variant: a
2016
+ xlabel: MWh (horizon total)
2017
+ map_dimensions_for_plots: [d_e, y_b]
2018
+ color_entity_class: connection
2019
+ max_items_per_plot: 40
2020
+ scenario_rule: g
2021
+ comparison_overrides:
2022
+ legend: shared
2023
+ ylabel: MWh (horizon total)
2024
+ connection_losses_dt_eee:
2025
+ default:
2026
+ variant: h
2027
+ map_dimensions_for_plots: [dt_e, tt_l]
2028
+ color_entity_class: connection
2029
+ max_items_per_plot: 10
2030
+ max_subplots_per_file: 6
2031
+ ylabel: MWh/h
2032
+ scenario_rule: l
2033
+ chunks:
2034
+ plot_name: 'Connection losses weekly avg'
2035
+ variant: w
2036
+ map_dimensions_for_plots: [dt_e, ti_l]
2037
+ color_entity_class: connection
2038
+ time_average_duration: 168
2039
+ max_items_per_plot: 10
2040
+ max_subplots_per_file: 6
2041
+ ylabel: MWh/h
2042
+ comparison_overrides:
2043
+ map_dimensions_for_plots: [dt_se, ti_lu]
2044
+ legend: shared
2045
+ ylabel: MWh
2046
+ 'Connection cf':
2047
+ group: 8
2048
+ order: 7
2049
+ connection_cf_d_e:
2050
+ default:
2051
+ variant: p
2052
+ map_dimensions_for_plots: [d_e, g_b]
2053
+ max_items_per_plot: 40
2054
+ axis_bounds: [0, 1]
2055
+ axis_tick_format: '.0%'
2056
+ xlabel: percent
2057
+ scenario_rule: g
2058
+ sum_periods:
2059
+ plot_name: 'Connection cf average'
2060
+ variant: a
2061
+ map_dimensions_for_plots: [d_e, z_b]
2062
+ color_entity_class: connection
2063
+ max_items_per_plot: 40
2064
+ axis_bounds: [0, 1]
2065
+ axis_tick_format: '.0%'
2066
+ xlabel: percent (weighted average)
2067
+ scenario_rule: g
2068
+ comparison_overrides:
2069
+ max_subplots_per_file: 4
2070
+ legend: shared
2071
+ 'Reserve from process to node':
2072
+ group: 9
2073
+ order: 0
2074
+ process_reserve_upDown_node_dt_eppe:
2075
+ reserve:
2076
+ variant: h
2077
+ map_dimensions_for_plots: [dt_eppe, tt_ussu]
2078
+ subplots_per_row: 2
2079
+ max_items_per_plot: 10
2080
+ max_subplots_per_file: 6
2081
+ legend: all
2082
+ ylabel: MWh/h
2083
+ scenario_rule: l
2084
+ chunks:
2085
+ plot_name: 'Reserve from process to node weekly avg'
2086
+ variant: w
2087
+ map_dimensions_for_plots: [dt_eppe, ti_ussu]
2088
+ time_average_duration: 168
2089
+ subplots_per_row: 2
2090
+ max_items_per_plot: 10
2091
+ max_subplots_per_file: 6
2092
+ legend: all
2093
+ ylabel: MWh/h
2094
+ comparison_overrides:
2095
+ map_dimensions_for_plots: [dt_seppe, ti_gullu]
2096
+ process_reserve_average_d_eppe:
2097
+ default:
2098
+ variant: p
2099
+ map_dimensions_for_plots: [d_eppe, z_esse]
2100
+ max_items_per_plot: 40
2101
+ xlabel: MW (weighted average)
2102
+ scenario_rule: u
2103
+ sum_periods:
2104
+ plot_name: 'Reserve from process to node average'
2105
+ variant: a
2106
+ map_dimensions_for_plots: [d_eppe, z_bssb]
2107
+ max_items_per_plot: 40
2108
+ xlabel: MW (weighted average)
2109
+ comparison_overrides:
2110
+ map_dimensions_for_plots: [d_seppe, z_uesse]
2111
+ 'Reserve price in NodeGroups':
2112
+ group: 9
2113
+ order: 1
2114
+ reserve_prices_dt_ppg:
2115
+ chunks:
2116
+ plot_name: 'Reserve price in NodeGroups weekly avg'
2117
+ variant: w
2118
+ map_dimensions_for_plots: [sdt_ppg, mui_llu]
2119
+ time_average_duration: 168
2120
+ subplots_per_row: 2
2121
+ max_items_per_plot: 10
2122
+ max_subplots_per_file: 6
2123
+ legend: all
2124
+ ylabel: CUR/MW
2125
+ scenario_rule: l
2126
+ default:
2127
+ variant: h
2128
+ map_dimensions_for_plots: [sdt_ppg, mtt_llu]
2129
+ subplots_per_row: 2
2130
+ max_items_per_plot: 10
2131
+ max_subplots_per_file: 6
2132
+ legend: all
2133
+ ylabel: CUR/MW
2134
+ scenario_rule: l
2135
+ 'Extras VRE potential':
2136
+ group: 9
2137
+ order: 2
2138
+ unit_VRE_potential_outputNode_d_ee:
2139
+ debug:
2140
+ variant: p
2141
+ map_dimensions_for_plots: [d_ee, e_bu]
2142
+ color_entity_class: unit
2143
+ subplots_per_row: 2
2144
+ max_items_per_plot: 40
2145
+ max_subplots_per_file: 8
2146
+ scenario_rule: g
2147
+ unit_VRE_potential_outputNode_dt_ee:
2148
+ debug:
2149
+ variant: h
2150
+ map_dimensions_for_plots: [dt_ee, tt_ll]
2151
+ subplots_per_row: 2
2152
+ max_items_per_plot: 10
2153
+ max_subplots_per_file: 6
2154
+ legend: all
2155
+ ylabel: MWh/h
2156
+ scenario_rule: l
2157
+ chunks:
2158
+ plot_name: 'Extras VRE potential weekly avg'
2159
+ variant: w
2160
+ map_dimensions_for_plots: [dt_ee, ti_ll]
2161
+ time_average_duration: 168
2162
+ subplots_per_row: 2
2163
+ max_items_per_plot: 10
2164
+ max_subplots_per_file: 6
2165
+ legend: all
2166
+ ylabel: MWh/h
2167
+ scenario_rule: g
2168
+ 'Extras discount factors':
2169
+ group: 9
2170
+ order: 3
2171
+ discountFactors_d_p:
2172
+ debug:
2173
+ variant: p
2174
+ map_dimensions_for_plots: [d_p, b_s]
2175
+ max_items_per_plot: 40
2176
+ scenario_rule: e
2177
+ 'Extras annuity of entities':
2178
+ group: 9
2179
+ order: 4
2180
+ entity_annuity_d_p:
2181
+ debug:
2182
+ variant: p
2183
+ map_dimensions_for_plots: [d_p, b_e]
2184
+ max_items_per_plot: 40
2185
+ xlabel: CUR/MW/a
2186
+ scenario_rule: g
2187
+
2188
+ rename:
2189
+ # [display_name, export_to_excel]
2190
+ # display_name: used for CSV filenames and Excel sheet names
2191
+ # export_to_excel: true/false — controls whether the sheet is included in Excel output
2192
+ group_node: [group_node, true]
2193
+ group_process: [group_process, true]
2194
+ group_process_node: [group_process_node, true]
2195
+ outputNodeGroup_does_specified_flows: [outputNodeGroup_does_specified_flows, false]
2196
+ outputNodeGroup_does_generic_flows: [outputNodeGroup_does_generic_flows, false]
2197
+ outputNodeGroup__connection_Not_in_aggregate: [outputNodeGroup__connection_Not_in_aggregate, false]
2198
+ outputNodeGroup__process__unit__to_node_Not_in_aggregate: [outputNodeGroup__process__unit__to_node_Not_in_aggregate, false]
2199
+ outputNodeGroup__process__node__to_unit_Not_in_aggregate: [outputNodeGroup__process__node__to_unit_Not_in_aggregate, false]
2200
+ outputNodeGroup__process__connection__to_node_Not_in_aggregate: [outputNodeGroup__process__connection__to_node_Not_in_aggregate, false]
2201
+ outputNodeGroup__process__node__to_connection_Not_in_aggregate: [outputNodeGroup__process__node__to_connection_Not_in_aggregate, false]
2202
+ outputNodeGroup__processGroup_Unit_to_group: [outputNodeGroup__processGroup_Unit_to_group, false]
2203
+ outputNodeGroup__processGroup__process__unit__to_node: [outputNodeGroup__processGroup__process__unit__to_node, false]
2204
+ outputNodeGroup__processGroup_Group_to_unit: [outputNodeGroup__processGroup_Group_to_unit, false]
2205
+ outputNodeGroup__processGroup__process__node__to_unit: [outputNodeGroup__processGroup__process__node__to_unit, false]
2206
+ outputNodeGroup__processGroup_Connection: [outputNodeGroup__processGroup_Connection, false]
2207
+ outputNodeGroup__processGroup__process__connection__to_node: [outputNodeGroup__processGroup__process__connection__to_node, false]
2208
+ outputNodeGroup__processGroup__process__node__to_connection: [outputNodeGroup__processGroup__process__node__to_connection, false]
2209
+ outputNodeGroup__process_fully_inside: [outputNodeGroup__process_fully_inside, false]
2210
+ node_inflow__dt: [node_inflow__dt, true]
2211
+ annualized_costs_d_p: [annualized_costs__d, true]
2212
+ CO2__: [co2, false]
2213
+ connection_d_eee: [connection__d, true]
2214
+ connection_losses_d_eee: [connection_losses__d, true]
2215
+ connection_dt_eee: [connection__dt, true]
2216
+ connection_losses_dt_eee: [connection__dt_losses, true]
2217
+ connection_leftward_dt_eee: [connection_leftward__dt, true]
2218
+ connection_leftward_d_eee: [connection_leftward__d, true]
2219
+ connection_rightward_dt_eee: [connection_rightward__dt, true]
2220
+ connection_rightward_d_eee: [connection_rightward__d, true]
2221
+ connection_capacity_ed_p: [connection_capacity__d, true]
2222
+ connection_cf_d_e: [connection_cf__d, true]
2223
+ costs_dt_p: [costs__dt, true]
2224
+ costs_discounted_d_p: [costs_discounted, true]
2225
+ costs_discounted_p_: [costs_discounted, true]
2226
+ cost_unit_annualized_d_ec: [cost_unit_annualized__d, true]
2227
+ cost_connection_annualized_d_ec: [cost_connection_annualized__d, true]
2228
+ cost_node_annualized_d_ec: [cost_node_annualized__d, true]
2229
+ cost_unit_discounted_d_ec: [cost_unit_discounted__d, true]
2230
+ cost_connection_discounted_d_ec: [cost_connection_discounted__d, true]
2231
+ cost_node_discounted_d_ec: [cost_node_discounted__d, true]
2232
+ discountFactors_d_p: [discount_factors__d, true]
2233
+ dual_invest_effective_connection_d_e: [connection_invest_marginal__d, true]
2234
+ dual_invest_effective_node_d_e: [node_invest_marginal__d, true]
2235
+ dual_invest_effective_unit_d_e: [unit_invest_marginal__d, true]
2236
+ entity_annuity_d_p: [entity_annuity, true]
2237
+ nodeGroup_unit_node_inertia_dt_gee: [group__unit__node_inertia__dt, true]
2238
+ nodeGroup_flows_d_g: [group_total_inflow__d, true]
2239
+ nodeGroup_flows_dt_g: [group_total_inflow__dt, true]
2240
+ nodeGroup_flows_d_gpe: [group_flows__d, true]
2241
+ nodeGroup_flows_dt_gpe: [group_flows__dt, true]
2242
+ nodeGroup_inertia_dt_g: [group_inertia__dt, true]
2243
+ nodeGroup_inertia_largest_flow_dt_g: [group_inertia_largest_flow__dt, true]
2244
+ nodeGroup_gdt_p: [group_node__dt, true]
2245
+ nodeGroup_gd_p: [group_node__d, true]
2246
+ flowGroup_gd_p: [group_flow__d, true]
2247
+ flowGroup_gd_t: [group_flow__dt, true]
2248
+ nodeGroup_VRE_share_d_g: [group_node_VRE_share__dt, true]
2249
+ nodeGroup_VRE_share_dt_g: [group_node_VRE_share, true]
2250
+ CO2_d_g: [group_CO2__d, true]
2251
+ co2_price_period_d_g: [group_CO2_price_period__d, true]
2252
+ co2_price_total_d_g: [group_CO2_price_total__d, true]
2253
+ node_d_ep: [node__d, true]
2254
+ node_dt_ep: [node__dt, true]
2255
+ node_capacity_ed_p: [node_capacity__d, true]
2256
+ node_prices_dt_e: [node_prices__dt, true]
2257
+ node_state_dt_e: [node_state__dt, true]
2258
+ process_co2_d_eee: [process__d_co2, true]
2259
+ years_represented__d: [years_represented__d, false]
2260
+ process_reserve_upDown_node_dt_eppe: [process__reserve__upDown__node__dt, true]
2261
+ process_reserve_average_d_eppe: [process__reserve__upDown__node__d_average, true]
2262
+ reserve_prices_dt_ppg: [reserve_price__upDown__group__dt, true]
2263
+ nodeGroup_slack_capacity_margin_d_g: [slack__capacity_margin__d, true]
2264
+ node_slack_down_dt_e: [slack__downward__node_state__dt, true]
2265
+ node_slack_down_d_e: [slack__downward__node_state__d, true]
2266
+ nodeGroup_slack_inertia_d_g: [slack__inertia_group__d, true]
2267
+ nodeGroup_slack_inertia_dt_g: [slack__inertia_group__dt, true]
2268
+ nodeGroup_slack_nonsync_d_g: [slack__nonsync_group__d, true]
2269
+ nodeGroup_slack_nonsync_dt_g: [slack__nonsync_group__dt, true]
2270
+ nodeGroup_slack_reserve_d_eeg: [slack__reserve__upDown__group__d, true]
2271
+ nodeGroup_slack_reserve_dt_eeg: [slack__reserve__upDown__group__dt, true]
2272
+ node_slack_up_dt_e: [slack__upward__node_state__dt, true]
2273
+ node_slack_up_d_e: [slack__upward__node_state__d, true]
2274
+ unit_inputNode_d_ee: [unit__inputNode__d, true]
2275
+ unit_inputNode_dt_ee: [unit__inputNode__dt, true]
2276
+ unit_outputNode_d_ee: [unit__outputNode__d, true]
2277
+ unit_outputNode_dt_ee: [unit__outputNode__dt, true]
2278
+ unit_capacity_ed_p: [unit_capacity__d, true]
2279
+ unit_inputs_cf_d_ee: [unit_cf__inputNode__d, true]
2280
+ unit_outputs_cf_d_ee: [unit_cf__outputNode__d, true]
2281
+ unit_curtailment_outputNode_d_ee: [unit_curtailment__outputNode__d, true]
2282
+ unit_curtailment_outputNode_dt_ee: [unit_curtailment__outputNode__dt, true]
2283
+ unit_online_dt_e: [unit_online__dt, true]
2284
+ unit_online_average_d_e: [unit_online__d_average, true]
2285
+ unit_ramp_inputs_dt_ee: [unit_ramp__inputNode__dt, true]
2286
+ unit_ramp_outputs_dt_ee: [unit_ramp__outputNode__dt, true]
2287
+ unit_startup_d_e: [unit_startup__d, true]
2288
+ unit_VRE_potential_outputNode_dt_ee: [unit_outputNode_VRE_potential__dt, true]
2289
+ unit_VRE_curtailment_outputNode_dt_ee: [unit_outputNode_VRE_curtailment__dt, true]
2290
+ unit_curtailment_share_outputNode_dt_ee: [unit_outputNode_VRE_curtailment_share__dt, true]
2291
+ unit_VRE_potential_outputNode_d_ee: [unit_outputNode_VRE_potential__d, true]
2292
+ unit_VRE_curtailment_outputNode_d_ee: [unit_outputNode_VRE_curtailment__d, true]
2293
+ unit_curtailment_share_outputNode_d_ee: [unit_outputNode_VRE_curtailment_share__d, true]