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,197 @@
1
+ {
2
+ "entity_classes": [
3
+ [
4
+ "settings",
5
+ [],
6
+ null,
7
+ 280959580696595,
8
+ true
9
+ ]
10
+ ],
11
+ "entities": [
12
+ [
13
+ "settings",
14
+ "default",
15
+ null
16
+ ]
17
+ ],
18
+ "parameter_definitions": [
19
+ [
20
+ "settings",
21
+ "active-output-configs",
22
+ null,
23
+ null,
24
+ null
25
+ ],
26
+ [
27
+ "settings",
28
+ "output-config-path",
29
+ null,
30
+ null,
31
+ null
32
+ ],
33
+ [
34
+ "settings",
35
+ "plot_duration",
36
+ null,
37
+ null,
38
+ null
39
+ ],
40
+ [
41
+ "settings",
42
+ "plot_first_timestep",
43
+ null,
44
+ null,
45
+ null
46
+ ],
47
+ [
48
+ "settings",
49
+ "show-plots",
50
+ false,
51
+ null,
52
+ null
53
+ ],
54
+ [
55
+ "settings",
56
+ "write-dispatch-to-excel",
57
+ true,
58
+ null,
59
+ null
60
+ ],
61
+ [
62
+ "settings",
63
+ "write-to-excel",
64
+ true,
65
+ null,
66
+ null
67
+ ],
68
+ [
69
+ "settings",
70
+ "write-to-ods",
71
+ false,
72
+ null,
73
+ null
74
+ ]
75
+ ],
76
+ "parameter_types": [
77
+ [
78
+ "settings",
79
+ "active-output-configs",
80
+ "array",
81
+ 1
82
+ ],
83
+ [
84
+ "settings",
85
+ "output-config-path",
86
+ "str",
87
+ 0
88
+ ],
89
+ [
90
+ "settings",
91
+ "plot_duration",
92
+ "float",
93
+ 0
94
+ ],
95
+ [
96
+ "settings",
97
+ "plot_first_timestep",
98
+ "float",
99
+ 0
100
+ ],
101
+ [
102
+ "settings",
103
+ "show-plots",
104
+ "bool",
105
+ 0
106
+ ],
107
+ [
108
+ "settings",
109
+ "write-dispatch-to-excel",
110
+ "bool",
111
+ 0
112
+ ],
113
+ [
114
+ "settings",
115
+ "write-to-excel",
116
+ "bool",
117
+ 0
118
+ ],
119
+ [
120
+ "settings",
121
+ "write-to-ods",
122
+ "bool",
123
+ 0
124
+ ]
125
+ ],
126
+ "parameter_values": [
127
+ [
128
+ "settings",
129
+ "default",
130
+ "active-output-configs",
131
+ {
132
+ "value_type": "str",
133
+ "data": [
134
+ "default",
135
+ "chunks"
136
+ ],
137
+ "type": "array"
138
+ },
139
+ "default"
140
+ ],
141
+ [
142
+ "settings",
143
+ "default",
144
+ "output-config-path",
145
+ "templates/comparison_plots.yaml",
146
+ "default"
147
+ ],
148
+ [
149
+ "settings",
150
+ "default",
151
+ "plot_duration",
152
+ 168,
153
+ "default"
154
+ ],
155
+ [
156
+ "settings",
157
+ "default",
158
+ "plot_first_timestep",
159
+ 0.0,
160
+ "default"
161
+ ],
162
+ [
163
+ "settings",
164
+ "default",
165
+ "write-dispatch-to-excel",
166
+ true,
167
+ "default"
168
+ ],
169
+ [
170
+ "settings",
171
+ "default",
172
+ "write-to-excel",
173
+ true,
174
+ "default"
175
+ ]
176
+ ],
177
+ "alternatives": [
178
+ [
179
+ "default",
180
+ ""
181
+ ]
182
+ ],
183
+ "scenarios": [
184
+ [
185
+ "default",
186
+ false,
187
+ ""
188
+ ]
189
+ ],
190
+ "scenario_alternatives": [
191
+ [
192
+ "default",
193
+ "default",
194
+ null
195
+ ]
196
+ ]
197
+ }
@@ -0,0 +1,260 @@
1
+ # Plot settings for this project.
2
+ #
3
+ # This file is this project's own starting point for how its results are
4
+ # plotted: which colors entities and result categories get, the stacking
5
+ # order, and the sign (positive vs negative side) coloring. You can edit
6
+ # it freely — it is yours to keep. Deleting it falls back to a built-in
7
+ # starting point.
8
+ #
9
+ # How it is read:
10
+ #
11
+ # categories: result / parameter names produced by the pipeline.
12
+ # Looked up by EXACT label match (casing is controlled by
13
+ # the pipeline, so it is stable).
14
+ #
15
+ # entities: entity names that come from your data (units,
16
+ # connections, nodes, and groups). Looked up
17
+ # CASE-INSENSITIVELY, so "Solar", "solar" and "SOLAR" all
18
+ # resolve to the same entry.
19
+ #
20
+ # scenarios: colors for comparison scenarios.
21
+ #
22
+ # Entry VALUES may be either a ``#RRGGBB`` hex string or an ``[r, g, b]``
23
+ # list. RGB components are accepted as floats in ``0..1`` or ints in
24
+ # ``0..255``. An entity entry may instead be a mapping with an optional
25
+ # negative-side color, e.g.::
26
+ #
27
+ # chp: { color: "#E64A19", neg_color: "#9c3010" }
28
+ #
29
+ # in which case ``neg_color`` colors the entity's negative-side part of a
30
+ # mixed (both-signs) stacked column and ``color`` is used for the positive
31
+ # side. A bare color uses the same color for both sides.
32
+ #
33
+ # Entry ORDER defines the stacking order: items listed here are placed in
34
+ # file order (positives top→bottom; negatives reversed), and any item not
35
+ # listed falls back to the default ordering and the tab10/tab20 matplotlib
36
+ # palette — so this file is purely additive and there is no penalty for an
37
+ # item that is not listed here.
38
+
39
+ scenarios:
40
+ # Colors for comparison scenarios, keyed by scenario name, e.g.
41
+ # S04_battery: "#1f77b4"
42
+ # (Left empty here — fill in per project.)
43
+
44
+ categories:
45
+ # Cost components produced by flextool/process_outputs/out_costs.py.
46
+ # Semantic grouping:
47
+ # - Investment / capex → saturated blues
48
+ # - Fixed O&M → teals / light blues
49
+ # - Fuel / commodities → warm browns / oranges / greens (sales)
50
+ # - Emissions (CO2) → dark gray / near-black
51
+ # - Variable O&M → purples
52
+ # - Startup → amber / yellow
53
+ # - Slack / penalties → reds / magentas (visually alarming)
54
+ costs:
55
+ # Investment / capex (saturated blues)
56
+ unit investment & retirement: '#1f4ea8' # strong blue
57
+ connection investment & retirement: '#3b6fc4' # medium blue
58
+ storage investment & retirement: '#6691d8' # lighter blue
59
+ # Fixed O&M (teal family — "keep the lights on, recurring")
60
+ fixed cost pre-existing: '#0f8a7a' # teal
61
+ fixed cost invested: '#3bb0a0' # brighter teal
62
+ fixed cost reduction of divestments: '#8ed2c9' # pale teal
63
+ # Commodity / fuel (warm browns / oranges for input, green for sales)
64
+ commodity_cost: '#a0522d' # sienna (fuel "energy input")
65
+ commodity_sales: '#2ca02c' # green (revenue / negative cost)
66
+ # Emissions (gray/near-black — instantly reads as "emissions")
67
+ co2: '#4d4d4d' # dark gray
68
+ # Variable O&M (purple)
69
+ other operational: '#8856a7' # purple
70
+ # Startup (amber/yellow — "ignition")
71
+ starts: '#e6a41a' # amber
72
+ # Slack / penalties (red / magenta family — alarming)
73
+ upward slack penalty: '#d62728' # strong red
74
+ downward slack penalty: '#ff7f7f' # light red
75
+ inertia slack penalty: '#b5179e' # magenta
76
+ non-synchronous slack penalty: '#e147b7' # pink-magenta
77
+ upward reserve slack penalty: '#c1272d' # dark red
78
+ downward reserve slack penalty: '#ff9896' # salmon
79
+ capacity margin penalty: '#7b0828' # deep wine red
80
+ # Node balance components produced by
81
+ # flextool/process_outputs/out_node.py::node_summary(). The plot shows
82
+ # stacked contributions to a node's energy balance: supply-side labels
83
+ # sit above the zero line (From units, From connections, Inflow, Loss
84
+ # of load), draw-side labels below it (To units, To connections, Self
85
+ # discharge, Excess load). Colors are chosen so:
86
+ # - supply / generation / imports → greens and teals
87
+ # - load / exports / storage charge → blues
88
+ # - storage self-discharge losses → neutral gray
89
+ # - slacks (infeasibility) → reds, matching the cost-slack hues so
90
+ # users learn a single "slack = red" vocabulary across plots
91
+ node_flows:
92
+ # Supply side (positive contributions to the node)
93
+ From units: '#2ca02c' # green — generation delivered to node
94
+ From connections: '#17a2b8' # teal — imports from neighbouring nodes
95
+ Inflow: '#7dd87a' # light green — exogenous inflow (wind, hydro)
96
+ # Draw side (negative contributions to the node)
97
+ To units: '#1f77b4' # strong blue — consumption / storage charge
98
+ To connections: '#5b8fbf' # steel blue — exports to neighbouring nodes
99
+ Self discharge: '#808080' # gray — storage self-discharge loss
100
+ # Slacks (infeasibility; red family matches costs-category slacks)
101
+ Loss of load: '#d62728' # strong red — upward slack (unmet demand)
102
+ Excess load: '#ff7f7f' # light red — downward slack (spill / dump)
103
+
104
+ # NodeGroup flow components emitted by
105
+ # flextool/process_outputs/out_group.py::nodeGroup_flows(). The column
106
+ # index there has two levels, ``type`` and ``item``; legend labels arrive
107
+ # as either ``"<type> | <item>"`` (bar plans, via _format_legend_labels)
108
+ # or Python tuple repr ``"('<type>', '<item>')"`` (time-series stacks).
109
+ #
110
+ # Coloring is split by ``type``:
111
+ #
112
+ # * The per-participant flow types — ``from_unitGroup`` / ``to_unitGroup``
113
+ # / ``from_unit`` / ``to_unit`` / ``from_connectionGroup`` /
114
+ # ``to_connectionGroup`` / ``from_connection`` / ``to_connection`` —
115
+ # are colored by their ``item`` (the participating entity), looked up
116
+ # in the ``entities`` section below: ``*unit*`` items in ``entities.unit``,
117
+ # ``*connection*`` items in ``entities.connection`` and the ``*Group``
118
+ # aggregates in ``entities.group``. The ``to_*`` (draw) side uses the
119
+ # entity's ``neg_color`` when one is set, else its ``color``. So a unit
120
+ # keeps the same color here as in its node-flow / dispatch plots, and an
121
+ # item with no ``entities`` entry falls back to the tab10/tab20 palette.
122
+ # These types are therefore NOT listed here.
123
+ #
124
+ # * The group-property aggregates below — ``inflow``, ``internal_losses``
125
+ # and ``slack`` — aren't entities, so they keep explicit category
126
+ # colors, looked up as ``<type>_<item>`` then ``<type>``. Reds match
127
+ # costs / node_flows slacks; grays read as "dissipated inside the
128
+ # group". ``internal_losses`` and ``slack`` have a CLOSED set of item
129
+ # subtypes (connections/units/storages; upward/downward — see
130
+ # out_group.py::nodeGroup_flows), so every series hits a ``<type>_<item>``
131
+ # key and no bare ``<type>`` fallback is needed. ``inflow`` keeps a
132
+ # bare key because its item is the node name (open set), resolved via
133
+ # the ``<type>`` step.
134
+ nodegroup_flows:
135
+ inflow: '#7dd87a' # light green — exogenous node inflow
136
+ # Internal losses (neutral grays — "energy dissipated inside the group")
137
+ internal_losses_connections: '#9e9e9e' # lighter gray — connection losses
138
+ internal_losses_units: '#6b6b6b' # darker gray — unit losses
139
+ internal_losses_storages: '#5c5c5c' # darkest gray — storage self-discharge
140
+ # Slacks (red family; aligned with costs.upward/downward slack penalty
141
+ # and node_flows.Loss of load / Excess load)
142
+ slack_upward: '#d62728' # strong red — upward slack (unmet demand)
143
+ slack_downward: '#ff7f7f' # light red — downward slack (spill)
144
+
145
+ # Dispatch special tokens. These are the fixed-name columns that the
146
+ # dispatch stacked-area plots add alongside the per-entity flows: loss of
147
+ # load / discharge / import on the POSITIVE side (top of the stack) and
148
+ # charge / export / internal losses on the NEGATIVE side (bottom). Their
149
+ # color is configurable, and their KEY ORDER here is honored by the engine:
150
+ # this list is read TOP-TO-BOTTOM as the visual stack order. A positive
151
+ # special always stacks above the zero axis and a negative special always
152
+ # below it (they never cross), but WITHIN each sign group the order of these
153
+ # keys sets the top-to-bottom stacking (and matches the picker's
154
+ # "Colors, order..." dialog, where they are reorderable within each group).
155
+ # Looked up by EXACT label match. The values below are the historical
156
+ # dispatch defaults (DEFAULT_SPECIAL_COLORS) in the historical stack order,
157
+ # so a project with no per-entity dispatch colors renders exactly as before.
158
+ # (The dashed ``Curtailed`` line and the solid ``Demand`` line are drawn
159
+ # with fixed red / black and are not configured here.)
160
+ dispatch:
161
+ # Positive side, visual top-to-bottom (top of the stacked area / legend)
162
+ LossOfLoad: crimson # upward slack — unmet demand
163
+ Discharge: aqua # storage discharge into the group
164
+ Import: indigo # imports into the group
165
+ # Negative side, visual top-to-bottom (nearest the zero axis downward)
166
+ internal_losses: darkgray # losses dissipated inside the group
167
+ Export: purple # exports out of the group
168
+ Charge: lime # storage charge drawn from the group
169
+
170
+ entities:
171
+ # Colors for entities, keyed by entity name (case-insensitive). The
172
+ # subsections below correspond to entity classes. Entry order within a
173
+ # subsection defines stacking order; an optional ``neg_color`` colors an
174
+ # entity's negative-side part of a mixed (both-signs) stacked column.
175
+ #
176
+ # ``group`` entities are split by their membership into two subsections:
177
+ # * ``nodeGroup`` — a group whose membership is ``group__node`` (a
178
+ # collection of nodes, e.g. the balance/dispatch group being plotted).
179
+ # * ``flowGroup`` — a group whose membership is ``group__unit__node`` /
180
+ # ``group__connection`` (it aggregates FLOWS, e.g. "Battery", "Coal").
181
+ # These are the per-participant items colored in nodeGroup-dispatch
182
+ # plots, so they ship with recommended technology/fuel colors below.
183
+ # The ``unit`` / ``connection`` / ``node`` / ``nodeGroup`` subsections
184
+ # start empty — per-project entity colors are filled in by you (or
185
+ # auto-populated from the entities present in your results); leaving them
186
+ # empty means no change from the palette fallback. (Projects seeded
187
+ # before the split keep a legacy ``group`` subsection, which the dispatch
188
+ # resolver still reads; a "Refresh from DB" re-buckets into
189
+ # nodeGroup/flowGroup.)
190
+ nodeGroup:
191
+ # Per-project nodeGroup colors, keyed by group name (case-insensitive).
192
+ # (Left empty here — fill in per project.)
193
+ flowGroup:
194
+ # Recommended colors for user-named flowGroup entities. A flowGroup is a
195
+ # ``group`` entity whose membership is ``group__unit__node`` or
196
+ # ``group__connection__node`` (i.e. it aggregates flows, not nodes) and
197
+ # that carries ``output_flowGroup_indicators = yes``. The labels below
198
+ # are a *convention*: if different projects happen to name a flow group
199
+ # "solar" or "Wind", they get the same color across dashboards.
200
+ #
201
+ # Lookup is case-insensitive (see color_template.resolve_label_color), so
202
+ # "Solar", "solar", and "SOLAR" all resolve to the same entry. Labels
203
+ # that aren't listed fall back to the tab10/tab20 palette, so this list
204
+ # is purely additive — there's no penalty for a project using a name
205
+ # that isn't here.
206
+ #
207
+ # Palette rationale: semantic colors users already associate with the
208
+ # technology / fuel (yellow for solar, sky blue for wind, black for
209
+ # coal, …), paired across related pairs (coal/lignite both dark, two
210
+ # blues for hydro vs pumped hydro) so stacked plots read naturally.
211
+ # Renewables — bright, warm-to-cool gradient
212
+ solar: '#F4B400' # gold / sun
213
+ pv: '#F4B400' # gold / sun (alias for solar PV)
214
+ wind: '#4FC3F7' # sky blue
215
+ hydro: '#1565C0' # deep blue (flowing water)
216
+ biomass: '#33691E' # forest green
217
+ geothermal: '#8D6E63' # burnt-orange brown (earth heat)
218
+ ocean: '#006064' # teal (deep sea — tidal / wave)
219
+ # Conventional — dark, muted (carbon-heavy "reads as dirty")
220
+ coal: '#212121' # near-black
221
+ lignite: '#4E342E' # dark brown (lower-grade coal)
222
+ gas: '#FB8C00' # orange-red (flame)
223
+ oil: '#6A1B9A' # dark purple (heavy fuel)
224
+ nuclear: '#7B1FA2' # purple (convention in energy atlases)
225
+ # Storage — greens / teals (shifts energy in time, not a generator)
226
+ battery: '#43A047' # bright green (electrochemistry)
227
+ pumped_hydro: '#00838F' # teal (water-based storage)
228
+ h2_storage: '#BA68C8' # light purple (hydrogen)
229
+ # Other flows
230
+ chp: '#E64A19' # orange-red (combined heat & power)
231
+ import: '#90CAF9' # light blue (external supply)
232
+ export: '#EF9A9A' # light red (outbound)
233
+ demand_response: '#FFB300' # amber (flexible load)
234
+ unit:
235
+ # Per-project unit colors, keyed by unit name (case-insensitive).
236
+ # Entry order defines stacking order; an optional ``neg_color`` colors
237
+ # the unit's negative-side part of a mixed column. These colors apply
238
+ # to the unit's stacked/line flow and online time-series plots (e.g.
239
+ # "Flows: unit to node", "Flows: node to unit", "Unit online").
240
+ # (Left empty here — fill in per project.) Accepted formats, e.g.:
241
+ # <unit_name>: "#1f77b4" # bare color (both sides)
242
+ # <unit_name>: { color: "#1f77b4", neg_color: "#0d3a6b" } # distinct negative side
243
+ connection:
244
+ # Per-project connection colors, keyed by connection name
245
+ # (case-insensitive). Entry order defines stacking order; an optional
246
+ # ``neg_color`` colors the negative side. These colors apply to the
247
+ # connection's stacked/line flow time-series plots (e.g. "Flows
248
+ # connection", "Connection leftward", "Connection rightward").
249
+ # (Left empty here — fill in per project.) Accepted formats, e.g.:
250
+ # <connection_name>: "#888888" # bare color (both sides)
251
+ # <connection_name>: { color: "#5b8fbf", neg_color: "#3c5e8a" } # distinct negative side
252
+ node:
253
+ # Per-project node colors, keyed by node name (case-insensitive).
254
+ # Entry order defines stacking order; an optional ``neg_color`` colors
255
+ # the negative side. These colors apply to the node's state time-series
256
+ # plot ("Node state"). The node *balance* plot ("Node") stays
257
+ # category-coloured (see categories.node_flows above), by design.
258
+ # (Left empty here — fill in per project.) Accepted formats, e.g.:
259
+ # <node_name>: "#4FC3F7" # bare color (both sides)
260
+ # <node_name>: { color: "#43A047", neg_color: "#2e7d32" } # distinct negative side