Skip to content

Restructure models - #120

Merged
mikejturner merged 10 commits into
mainfrom
restructure-models
Aug 27, 2026
Merged

Restructure models#120
mikejturner merged 10 commits into
mainfrom
restructure-models

Conversation

@mikejturner

@mikejturner mikejturner commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Decompose the big model files into individual models.

One breaking change: NewSolar node is renamed ScaledSolar

Note: all existing imports still work without any code changes except for uses of NewSolar

@mikejturner

Copy link
Copy Markdown
Contributor Author

✅ Code coverage on restructure-models is at 81% (compared to main being at 81%)

🎉 No files have reduced coverage 🎉

Coverage for new files

File Details
src/echo/models/electrical/__init__.py ✅ Coverage at 100%
src/echo/models/electrical/base.py ✅ Coverage at 100%
src/echo/models/electrical/ev/__init__.py ✅ Coverage at 100%
src/echo/models/electrical/ev/base.py ✅ Coverage at 94%
src/echo/models/electrical/ev/deprecated.py ⚠️ Coverage at 33%
src/echo/models/electrical/ev/ev_with_profile.py ⚠️ Coverage at 68%
src/echo/models/electrical/ev/v0g.py ✅ Coverage at 100%
src/echo/models/electrical/ev/v1g.py ✅ Coverage at 100%
src/echo/models/electrical/ev/v2g.py ✅ Coverage at 100%
src/echo/models/electrical/generation.py ✅ Coverage at 94%
src/echo/models/electrical/inverter.py ✅ Coverage at 92%

Full Coverage Report

File Details
src/echo/__init__.py ✅ 100% → 100%
src/echo/configuration.py ✅ 100% → 100%
src/echo/constants.py ✅ 100% → 100%
src/echo/exceptions.py ✅ 88% → 88%
src/echo/functional.py ✅ 100% → 100%
src/echo/models/__init__.py ✅ 100% → 100%
src/echo/models/agnostic.py ✅ 86% → 86%
src/echo/models/base.py ✅ 83% → 83%
src/echo/models/carbon.py ✅ 100% → 100%
src/echo/models/electrical/__init__.py 🆕 100%
src/echo/models/electrical/base.py 🆕 100%
src/echo/models/electrical/ev/__init__.py 🆕 100%
src/echo/models/electrical/ev/base.py 🆕 94%
src/echo/models/electrical/ev/deprecated.py 🆕 33%
src/echo/models/electrical/ev/ev_with_profile.py 🆕 68%
src/echo/models/electrical/ev/v0g.py 🆕 100%
src/echo/models/electrical/ev/v1g.py 🆕 100%
src/echo/models/electrical/ev/v2g.py 🆕 100%
src/echo/models/electrical/generation.py 🆕 94%
src/echo/models/electrical/inverter.py 🆕 92%
src/echo/models/gas.py ✅ 73% → 73%
src/echo/models/prebuilt.py ✅ 56% → 56%
src/echo/models/scenario.py ✅ 100% → 100%
src/echo/models/thermal.py ✅ 81% → 81%
src/echo/objectives/__init__.py ✅ 100% → 100%
src/echo/objectives/base.py ✅ 98% → 98%
src/echo/objectives/contingency.py ✅ 93% → 93%
src/echo/objectives/power.py ✅ 86% → 86%
src/echo/objectives/tariff.py ✅ 80% → 80%
src/echo/optimiser.py ✅ 73% → 73%
src/echo/tracker.py ✅ 43% → 43%
src/echo/utils.py ✅ 61% → 61%
src/echo/validators.py ✅ 89% → 89%
src/echo/visualization.py ✅ 91% → 91%
TOTAL ✅ 81% → 81%

@mikejturner

Copy link
Copy Markdown
Contributor Author

✅ Code coverage on restructure-models is at 81% (compared to main being at 81%)

🎉 No files have reduced coverage 🎉

Coverage for new files

File Details
src/echo/models/electrical/__init__.py ✅ Coverage at 100%
src/echo/models/electrical/base.py ✅ Coverage at 100%
src/echo/models/electrical/ev/__init__.py ✅ Coverage at 100%
src/echo/models/electrical/ev/base.py ✅ Coverage at 94%
src/echo/models/electrical/ev/deprecated.py ⚠️ Coverage at 33%
src/echo/models/electrical/ev/ev_with_profile.py ⚠️ Coverage at 68%
src/echo/models/electrical/ev/v0g.py ✅ Coverage at 100%
src/echo/models/electrical/ev/v1g.py ✅ Coverage at 100%
src/echo/models/electrical/ev/v2g.py ✅ Coverage at 100%
src/echo/models/electrical/generation.py ✅ Coverage at 94%
src/echo/models/electrical/inverter.py ✅ Coverage at 92%
src/echo/models/gas/__init__.py ✅ Coverage at 100%
src/echo/models/gas/base.py ✅ Coverage at 100%
src/echo/models/gas/boiler_fixedcop.py ✅ Coverage at 86%
src/echo/models/gas/boiler_tempcontrolled.py ⚠️ Coverage at 62%

Full Coverage Report

File Details
src/echo/__init__.py ✅ 100% → 100%
src/echo/configuration.py ✅ 100% → 100%
src/echo/constants.py ✅ 100% → 100%
src/echo/exceptions.py ✅ 88% → 88%
src/echo/functional.py ✅ 100% → 100%
src/echo/models/__init__.py ✅ 100% → 100%
src/echo/models/agnostic.py ✅ 86% → 86%
src/echo/models/base.py ✅ 83% → 83%
src/echo/models/carbon.py ✅ 100% → 100%
src/echo/models/electrical/__init__.py 🆕 100%
src/echo/models/electrical/base.py 🆕 100%
src/echo/models/electrical/ev/__init__.py 🆕 100%
src/echo/models/electrical/ev/base.py 🆕 94%
src/echo/models/electrical/ev/deprecated.py 🆕 33%
src/echo/models/electrical/ev/ev_with_profile.py 🆕 68%
src/echo/models/electrical/ev/v0g.py 🆕 100%
src/echo/models/electrical/ev/v1g.py 🆕 100%
src/echo/models/electrical/ev/v2g.py 🆕 100%
src/echo/models/electrical/generation.py 🆕 94%
src/echo/models/electrical/inverter.py 🆕 92%
src/echo/models/gas/__init__.py 🆕 100%
src/echo/models/gas/base.py 🆕 100%
src/echo/models/gas/boiler_fixedcop.py 🆕 86%
src/echo/models/gas/boiler_tempcontrolled.py 🆕 62%
src/echo/models/prebuilt.py ✅ 56% → 56%
src/echo/models/scenario.py ✅ 100% → 100%
src/echo/models/thermal.py ✅ 81% → 81%
src/echo/objectives/__init__.py ✅ 100% → 100%
src/echo/objectives/base.py ✅ 98% → 98%
src/echo/objectives/contingency.py ✅ 93% → 93%
src/echo/objectives/power.py ✅ 86% → 86%
src/echo/objectives/tariff.py ✅ 80% → 80%
src/echo/optimiser.py ✅ 73% → 73%
src/echo/tracker.py ✅ 43% → 43%
src/echo/utils.py ✅ 61% → 61%
src/echo/validators.py ✅ 89% → 89%
src/echo/visualization.py ✅ 91% → 91%
TOTAL ✅ 81% → 81%

@mikejturner

Copy link
Copy Markdown
Contributor Author

✅ Code coverage on restructure-models is at 82% (compared to main being at 81%)

🎉 No files have reduced coverage 🎉

Coverage for new files

File Details
src/echo/models/agnostic/__init__.py ✅ Coverage at 100%
src/echo/models/agnostic/aggregation.py ✅ Coverage at 95%
src/echo/models/agnostic/base.py ✅ Coverage at 96%
src/echo/models/agnostic/bounded.py ✅ Coverage at 100%
src/echo/models/agnostic/controlled.py ✅ Coverage at 100%
src/echo/models/agnostic/flex.py ✅ Coverage at 100%
src/echo/models/agnostic/input_output.py ✅ Coverage at 100%
src/echo/models/agnostic/storage.py ✅ Coverage at 82%
src/echo/models/agnostic/tellegen/__init__.py ✅ Coverage at 100%
src/echo/models/agnostic/tellegen/base.py ✅ Coverage at 100%
src/echo/models/agnostic/tellegen/multi_commodity.py ⚠️ Coverage at 38%
src/echo/models/agnostic/tellegen/partitioned_multi_commodity.py ✅ Coverage at 96%
src/echo/models/agnostic/tellegen/three_way_valve.py ✅ Coverage at 90%
src/echo/models/agnostic/time_delay.py ✅ Coverage at 100%
src/echo/models/agnostic/time_varying.py ⚠️ Coverage at 76%
src/echo/models/base/__init__.py ✅ Coverage at 100%
src/echo/models/base/base_model.py ✅ Coverage at 100%
src/echo/models/base/edge.py ⚠️ Coverage at 69%
src/echo/models/base/node.py ✅ Coverage at 86%
src/echo/models/base/optimisation_graph.py ⚠️ Coverage at 76%
src/echo/models/base/path.py ✅ Coverage at 92%
src/echo/models/base/port.py ✅ Coverage at 96%
src/echo/models/base/transform.py ✅ Coverage at 90%
src/echo/models/base/types.py ✅ Coverage at 100%
src/echo/models/carbon/__init__.py ✅ Coverage at 100%
src/echo/models/carbon/aggregation.py ✅ Coverage at 100%
src/echo/models/carbon/base.py ✅ Coverage at 100%
src/echo/models/electrical/__init__.py ✅ Coverage at 100%
src/echo/models/electrical/base.py ✅ Coverage at 100%
src/echo/models/electrical/ev/__init__.py ✅ Coverage at 100%
src/echo/models/electrical/ev/base.py ✅ Coverage at 94%
src/echo/models/electrical/ev/deprecated.py ⚠️ Coverage at 33%
src/echo/models/electrical/ev/ev_with_profile.py ⚠️ Coverage at 68%
src/echo/models/electrical/ev/v0g.py ✅ Coverage at 100%
src/echo/models/electrical/ev/v1g.py ✅ Coverage at 100%
src/echo/models/electrical/ev/v2g.py ✅ Coverage at 100%
src/echo/models/electrical/generation.py ✅ Coverage at 94%
src/echo/models/electrical/inverter.py ✅ Coverage at 92%
src/echo/models/gas/__init__.py ✅ Coverage at 100%
src/echo/models/gas/base.py ✅ Coverage at 100%
src/echo/models/gas/boiler_fixedcop.py ✅ Coverage at 86%
src/echo/models/gas/boiler_tempcontrolled.py ⚠️ Coverage at 62%
src/echo/models/prebuilt/__init__.py ✅ Coverage at 100%
src/echo/models/prebuilt/battery.py ⚠️ Coverage at 71%
src/echo/models/prebuilt/diesel_generator.py ⚠️ Coverage at 45%
src/echo/models/prebuilt/flex.py ⚠️ Coverage at 79%
src/echo/models/prebuilt/load.py ✅ Coverage at 91%
src/echo/models/prebuilt/scaled_solar.py ⚠️ Coverage at 67%
src/echo/models/prebuilt/solar.py ⚠️ Coverage at 50%
src/echo/models/thermal/__init__.py ✅ Coverage at 100%
src/echo/models/thermal/base.py ⚠️ Coverage at 0%
src/echo/models/thermal/parameterised_chiller.py ✅ Coverage at 85%
src/echo/models/thermal/parameterised_heatpump.py ✅ Coverage at 88%
src/echo/models/thermal/simple_chiller.py ✅ Coverage at 85%
src/echo/models/thermal/simple_heatpump.py ✅ Coverage at 92%
src/echo/models/thermal/simple_heatpump_dualoutput.py ✅ Coverage at 92%
src/echo/models/thermal/storage.py ⚠️ Coverage at 78%

Full Coverage Report

File Details
src/echo/__init__.py ✅ 100% → 100%
src/echo/configuration.py ✅ 100% → 100%
src/echo/constants.py ✅ 100% → 100%
src/echo/exceptions.py ✅ 88% → 88%
src/echo/functional.py ✅ 100% → 100%
src/echo/models/__init__.py ✅ 100% → 100%
src/echo/models/agnostic/__init__.py 🆕 100%
src/echo/models/agnostic/aggregation.py 🆕 95%
src/echo/models/agnostic/base.py 🆕 96%
src/echo/models/agnostic/bounded.py 🆕 100%
src/echo/models/agnostic/controlled.py 🆕 100%
src/echo/models/agnostic/flex.py 🆕 100%
src/echo/models/agnostic/input_output.py 🆕 100%
src/echo/models/agnostic/storage.py 🆕 82%
src/echo/models/agnostic/tellegen/__init__.py 🆕 100%
src/echo/models/agnostic/tellegen/base.py 🆕 100%
src/echo/models/agnostic/tellegen/multi_commodity.py 🆕 38%
src/echo/models/agnostic/tellegen/partitioned_multi_commodity.py 🆕 96%
src/echo/models/agnostic/tellegen/three_way_valve.py 🆕 90%
src/echo/models/agnostic/time_delay.py 🆕 100%
src/echo/models/agnostic/time_varying.py 🆕 76%
src/echo/models/base/__init__.py 🆕 100%
src/echo/models/base/base_model.py 🆕 100%
src/echo/models/base/edge.py 🆕 69%
src/echo/models/base/node.py 🆕 86%
src/echo/models/base/optimisation_graph.py 🆕 76%
src/echo/models/base/path.py 🆕 92%
src/echo/models/base/port.py 🆕 96%
src/echo/models/base/transform.py 🆕 90%
src/echo/models/base/types.py 🆕 100%
src/echo/models/carbon/__init__.py 🆕 100%
src/echo/models/carbon/aggregation.py 🆕 100%
src/echo/models/carbon/base.py 🆕 100%
src/echo/models/electrical/__init__.py 🆕 100%
src/echo/models/electrical/base.py 🆕 100%
src/echo/models/electrical/ev/__init__.py 🆕 100%
src/echo/models/electrical/ev/base.py 🆕 94%
src/echo/models/electrical/ev/deprecated.py 🆕 33%
src/echo/models/electrical/ev/ev_with_profile.py 🆕 68%
src/echo/models/electrical/ev/v0g.py 🆕 100%
src/echo/models/electrical/ev/v1g.py 🆕 100%
src/echo/models/electrical/ev/v2g.py 🆕 100%
src/echo/models/electrical/generation.py 🆕 94%
src/echo/models/electrical/inverter.py 🆕 92%
src/echo/models/gas/__init__.py 🆕 100%
src/echo/models/gas/base.py 🆕 100%
src/echo/models/gas/boiler_fixedcop.py 🆕 86%
src/echo/models/gas/boiler_tempcontrolled.py 🆕 62%
src/echo/models/prebuilt/__init__.py 🆕 100%
src/echo/models/prebuilt/battery.py 🆕 71%
src/echo/models/prebuilt/diesel_generator.py 🆕 45%
src/echo/models/prebuilt/flex.py 🆕 79%
src/echo/models/prebuilt/load.py 🆕 91%
src/echo/models/prebuilt/scaled_solar.py 🆕 67%
src/echo/models/prebuilt/solar.py 🆕 50%
src/echo/models/scenario.py ✅ 100% → 100%
src/echo/models/thermal/__init__.py 🆕 100%
src/echo/models/thermal/base.py 🆕 0%
src/echo/models/thermal/parameterised_chiller.py 🆕 85%
src/echo/models/thermal/parameterised_heatpump.py 🆕 88%
src/echo/models/thermal/simple_chiller.py 🆕 85%
src/echo/models/thermal/simple_heatpump.py 🆕 92%
src/echo/models/thermal/simple_heatpump_dualoutput.py 🆕 92%
src/echo/models/thermal/storage.py 🆕 78%
src/echo/objectives/__init__.py ✅ 100% → 100%
src/echo/objectives/base.py ✅ 98% → 98%
src/echo/objectives/contingency.py ✅ 93% → 93%
src/echo/objectives/power.py ✅ 86% → 86%
src/echo/objectives/tariff.py ✅ 80% → 80%
src/echo/optimiser.py ✅ 73% → 73%
src/echo/tracker.py ✅ 43% → 43%
src/echo/utils.py ✅ 61% → 61%
src/echo/validators.py ✅ 89% → 89%
src/echo/visualization.py ✅ 91% → 91%
TOTAL ✅ 81% → 82%

@mikejturner

Copy link
Copy Markdown
Contributor Author

✅ Code coverage on restructure-models is at 82% (compared to main being at 81%)

🎉 No files have reduced coverage 🎉

Coverage for new files

File Details
src/echo/models/agnostic/__init__.py ✅ Coverage at 100%
src/echo/models/agnostic/aggregation.py ✅ Coverage at 95%
src/echo/models/agnostic/base.py ✅ Coverage at 96%
src/echo/models/agnostic/bounded.py ✅ Coverage at 100%
src/echo/models/agnostic/controlled.py ✅ Coverage at 100%
src/echo/models/agnostic/flex.py ✅ Coverage at 100%
src/echo/models/agnostic/input_output.py ✅ Coverage at 100%
src/echo/models/agnostic/storage.py ✅ Coverage at 82%
src/echo/models/agnostic/tellegen/__init__.py ✅ Coverage at 100%
src/echo/models/agnostic/tellegen/base.py ✅ Coverage at 100%
src/echo/models/agnostic/tellegen/multi_commodity.py ⚠️ Coverage at 38%
src/echo/models/agnostic/tellegen/partitioned_multi_commodity.py ✅ Coverage at 96%
src/echo/models/agnostic/tellegen/three_way_valve.py ✅ Coverage at 90%
src/echo/models/agnostic/time_delay.py ✅ Coverage at 100%
src/echo/models/agnostic/time_varying.py ⚠️ Coverage at 76%
src/echo/models/base/__init__.py ✅ Coverage at 100%
src/echo/models/base/base_model.py ✅ Coverage at 100%
src/echo/models/base/edge.py ⚠️ Coverage at 69%
src/echo/models/base/node.py ✅ Coverage at 86%
src/echo/models/base/optimisation_graph.py ⚠️ Coverage at 76%
src/echo/models/base/path.py ✅ Coverage at 92%
src/echo/models/base/port.py ✅ Coverage at 96%
src/echo/models/base/transform.py ✅ Coverage at 90%
src/echo/models/base/types.py ✅ Coverage at 100%
src/echo/models/carbon/__init__.py ✅ Coverage at 100%
src/echo/models/carbon/aggregation.py ✅ Coverage at 100%
src/echo/models/carbon/base.py ✅ Coverage at 100%
src/echo/models/electrical/__init__.py ✅ Coverage at 100%
src/echo/models/electrical/base.py ✅ Coverage at 100%
src/echo/models/electrical/ev/__init__.py ✅ Coverage at 100%
src/echo/models/electrical/ev/base.py ✅ Coverage at 94%
src/echo/models/electrical/ev/deprecated.py ⚠️ Coverage at 33%
src/echo/models/electrical/ev/ev_with_profile.py ⚠️ Coverage at 68%
src/echo/models/electrical/ev/v0g.py ✅ Coverage at 100%
src/echo/models/electrical/ev/v1g.py ✅ Coverage at 100%
src/echo/models/electrical/ev/v2g.py ✅ Coverage at 100%
src/echo/models/electrical/generation.py ✅ Coverage at 94%
src/echo/models/electrical/inverter.py ✅ Coverage at 92%
src/echo/models/gas/__init__.py ✅ Coverage at 100%
src/echo/models/gas/base.py ✅ Coverage at 100%
src/echo/models/gas/boiler_fixedcop.py ✅ Coverage at 86%
src/echo/models/gas/boiler_tempcontrolled.py ⚠️ Coverage at 62%
src/echo/models/prebuilt/__init__.py ✅ Coverage at 100%
src/echo/models/prebuilt/battery.py ⚠️ Coverage at 71%
src/echo/models/prebuilt/diesel_generator.py ⚠️ Coverage at 45%
src/echo/models/prebuilt/flex.py ⚠️ Coverage at 79%
src/echo/models/prebuilt/load.py ✅ Coverage at 91%
src/echo/models/prebuilt/scaled_solar.py ⚠️ Coverage at 67%
src/echo/models/prebuilt/solar.py ⚠️ Coverage at 50%
src/echo/models/thermal/__init__.py ✅ Coverage at 100%
src/echo/models/thermal/base.py ⚠️ Coverage at 0%
src/echo/models/thermal/parameterised_chiller.py ✅ Coverage at 85%
src/echo/models/thermal/parameterised_heatpump.py ✅ Coverage at 88%
src/echo/models/thermal/simple_chiller.py ✅ Coverage at 85%
src/echo/models/thermal/simple_heatpump.py ✅ Coverage at 92%
src/echo/models/thermal/simple_heatpump_dualoutput.py ✅ Coverage at 92%
src/echo/models/thermal/storage.py ⚠️ Coverage at 78%

Full Coverage Report

File Details
src/echo/__init__.py ✅ 100% → 100%
src/echo/configuration.py ✅ 100% → 100%
src/echo/constants.py ✅ 100% → 100%
src/echo/exceptions.py ✅ 88% → 88%
src/echo/functional.py ✅ 100% → 100%
src/echo/models/__init__.py ✅ 100% → 100%
src/echo/models/agnostic/__init__.py 🆕 100%
src/echo/models/agnostic/aggregation.py 🆕 95%
src/echo/models/agnostic/base.py 🆕 96%
src/echo/models/agnostic/bounded.py 🆕 100%
src/echo/models/agnostic/controlled.py 🆕 100%
src/echo/models/agnostic/flex.py 🆕 100%
src/echo/models/agnostic/input_output.py 🆕 100%
src/echo/models/agnostic/storage.py 🆕 82%
src/echo/models/agnostic/tellegen/__init__.py 🆕 100%
src/echo/models/agnostic/tellegen/base.py 🆕 100%
src/echo/models/agnostic/tellegen/multi_commodity.py 🆕 38%
src/echo/models/agnostic/tellegen/partitioned_multi_commodity.py 🆕 96%
src/echo/models/agnostic/tellegen/three_way_valve.py 🆕 90%
src/echo/models/agnostic/time_delay.py 🆕 100%
src/echo/models/agnostic/time_varying.py 🆕 76%
src/echo/models/base/__init__.py 🆕 100%
src/echo/models/base/base_model.py 🆕 100%
src/echo/models/base/edge.py 🆕 69%
src/echo/models/base/node.py 🆕 86%
src/echo/models/base/optimisation_graph.py 🆕 76%
src/echo/models/base/path.py 🆕 92%
src/echo/models/base/port.py 🆕 96%
src/echo/models/base/transform.py 🆕 90%
src/echo/models/base/types.py 🆕 100%
src/echo/models/carbon/__init__.py 🆕 100%
src/echo/models/carbon/aggregation.py 🆕 100%
src/echo/models/carbon/base.py 🆕 100%
src/echo/models/electrical/__init__.py 🆕 100%
src/echo/models/electrical/base.py 🆕 100%
src/echo/models/electrical/ev/__init__.py 🆕 100%
src/echo/models/electrical/ev/base.py 🆕 94%
src/echo/models/electrical/ev/deprecated.py 🆕 33%
src/echo/models/electrical/ev/ev_with_profile.py 🆕 68%
src/echo/models/electrical/ev/v0g.py 🆕 100%
src/echo/models/electrical/ev/v1g.py 🆕 100%
src/echo/models/electrical/ev/v2g.py 🆕 100%
src/echo/models/electrical/generation.py 🆕 94%
src/echo/models/electrical/inverter.py 🆕 92%
src/echo/models/gas/__init__.py 🆕 100%
src/echo/models/gas/base.py 🆕 100%
src/echo/models/gas/boiler_fixedcop.py 🆕 86%
src/echo/models/gas/boiler_tempcontrolled.py 🆕 62%
src/echo/models/prebuilt/__init__.py 🆕 100%
src/echo/models/prebuilt/battery.py 🆕 71%
src/echo/models/prebuilt/diesel_generator.py 🆕 45%
src/echo/models/prebuilt/flex.py 🆕 79%
src/echo/models/prebuilt/load.py 🆕 91%
src/echo/models/prebuilt/scaled_solar.py 🆕 67%
src/echo/models/prebuilt/solar.py 🆕 50%
src/echo/models/scenario.py ✅ 100% → 100%
src/echo/models/thermal/__init__.py 🆕 100%
src/echo/models/thermal/base.py 🆕 0%
src/echo/models/thermal/parameterised_chiller.py 🆕 85%
src/echo/models/thermal/parameterised_heatpump.py 🆕 88%
src/echo/models/thermal/simple_chiller.py 🆕 85%
src/echo/models/thermal/simple_heatpump.py 🆕 92%
src/echo/models/thermal/simple_heatpump_dualoutput.py 🆕 92%
src/echo/models/thermal/storage.py 🆕 78%
src/echo/objectives/__init__.py ✅ 100% → 100%
src/echo/objectives/base.py ✅ 98% → 98%
src/echo/objectives/contingency.py ✅ 93% → 93%
src/echo/objectives/power.py ✅ 86% → 86%
src/echo/objectives/tariff.py ✅ 80% → 80%
src/echo/optimiser.py ✅ 73% → 73%
src/echo/tracker.py ✅ 43% → 43%
src/echo/utils.py ✅ 61% → 61%
src/echo/validators.py ✅ 89% → 89%
src/echo/visualization.py ✅ 91% → 91%
TOTAL ✅ 81% → 82%

@explodingdinosaurs explodingdinosaurs left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So much cleaner!

@mikejturner
mikejturner merged commit 917cac6 into main Aug 27, 2026
11 checks passed
@mikejturner
mikejturner deleted the restructure-models branch August 27, 2026 02:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants