Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/echo/models/thermal/storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class ThermalStorage(Node):
discharging_power_limit: NegativeFloat = (
None # Maximum energy flow out of the storage at each interval, in energy_flow_units
)
ambient_temp: dict = None # Ambient temp, formatted as dict with expansion-time keys
ambient_temp: dict | None = None # Ambient temp, formatted as dict with expansion-time keys
ambient_temp_ref: str | None # Ambient temp by column name reference in profile dataframe
ins_transmittance: NonNegativeFloat = (
0 # Thermal transmittance U-value of Thermal Energy Storage insulation in W/sqm*C
Expand Down
32 changes: 32 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
import os

import pyomo.environ as en
import pytest

from echo.models.scenario import EchoConcreteModel, ScenarioSettings, engine_settings_from_environment


@pytest.fixture
def can_optimiser_do_non_linear_optimisation() -> bool:
Expand All @@ -13,3 +16,32 @@ def can_optimiser_do_non_linear_optimisation() -> bool:
return False

return True


@pytest.fixture
def empty_model():
DEFAULT_NUMBER_OF_INTERVALS = 6

def _empty_model(number_of_intervals: int = DEFAULT_NUMBER_OF_INTERVALS) -> EchoConcreteModel:
model = EchoConcreteModel()
engine_settings = engine_settings_from_environment()
scenario_settings = ScenarioSettings(
interval_duration=30,
number_of_intervals=number_of_intervals,
number_of_expansion_intervals=1,
)
model.small_m = en.Param(initialize=engine_settings.small_m)
model.big_m = en.Param(initialize=engine_settings.big_m)
model.scenario_settings = scenario_settings
model.Time = en.RangeSet(0, scenario_settings.number_of_intervals - 1)
if scenario_settings.number_of_expansion_intervals == 0:
model.Expansion = en.RangeSet(0, 0)
else:
model.Expansion = en.RangeSet(0, scenario_settings.number_of_expansion_intervals - 1)
discount_rates = {}
for ep in range(0, scenario_settings.number_of_expansion_intervals):
discount_rates[ep] = 1 / ((1 + scenario_settings.discount_rate) ** ep)
model.discount_rates = en.Param(model.Expansion, initialize=discount_rates)
return model

return _empty_model
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,39 +1,15 @@
import numpy as np
import pyomo.environ as en

from echo.configuration import Units
from echo.models.agnostic import FlexPort
from echo.models.base import Node, OptimisationGraph
from echo.models.electrical import ElectricalDemand, ElectricalGeneration
from echo.models.scenario import EchoConcreteModel, ScenarioSettings, engine_settings_from_environment
from echo.models.scenario import ScenarioSettings, engine_settings_from_environment
from echo.objectives.base import ObjectiveSet
from echo.objectives.tariff import DemandCharge, DemandTariffObjective, ExportDemandCharge, ImportDemandCharge
from echo.optimiser import optimise


def empty_model(number_of_intervals: int = 6):
model = EchoConcreteModel()
engine_settings = engine_settings_from_environment()
scenario_settings = ScenarioSettings(
interval_duration=30,
number_of_intervals=number_of_intervals,
number_of_expansion_intervals=1,
)
model.small_m = en.Param(initialize=engine_settings.small_m)
model.big_m = en.Param(initialize=engine_settings.big_m)
model.scenario_settings = scenario_settings
model.Time = en.RangeSet(0, scenario_settings.number_of_intervals - 1)
if scenario_settings.number_of_expansion_intervals == 0:
model.Expansion = en.RangeSet(0, 0)
else:
model.Expansion = en.RangeSet(0, scenario_settings.number_of_expansion_intervals - 1)
discount_rates = {}
for ep in range(0, scenario_settings.number_of_expansion_intervals):
discount_rates[ep] = 1 / ((1 + scenario_settings.discount_rate) ** ep)
model.discount_rates = en.Param(model.Expansion, initialize=discount_rates)
return model


def test_system_import_demand_tariff():
"""Test that we correctly calculate the max import demand"""

Expand Down Expand Up @@ -261,7 +237,7 @@ def test_demand_tariff_read_and_implemented_correctly():
assert round(max_demand_3[0]) == max_in_window_3 == round(optimise_results.objective.args[2].value)


def test_demand_tariff_objective_apply_constraints_for_closure_issues():
def test_demand_tariff_objective_apply_constraints_for_closure_issues(empty_model):
model = empty_model(number_of_intervals=9)

expansion_periods = 1
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import numpy as np
import pytest

from echo.configuration import Units
from echo.models.agnostic import FlexPort, TellegenNode
from echo.models.base import Node, OptimisationGraph, Port
from echo.models.base import Node, OptimisationGraph
from echo.models.electrical import EVV0G, EVV1G, EVV2G, ElectricalGeneration, Inverter
from echo.models.prebuilt import FlexElectricalNode
from echo.models.scenario import ScenarioSettings, engine_settings_from_environment
Expand All @@ -12,37 +11,6 @@
from echo.optimiser import optimise


def test_port_proccess_initial_value_types():
port = Port(port_name="port_name")

# Assert the initial value is None before it's set
assert port.initial_value is None

# Assert list of ints is processed
port.process_initial_value(initial_val=[1, 2, 3])
assert port.initial_value == {(0, 0): 1, (0, 1): 2, (0, 2): 3}

# Assert list of floats is processed
port.process_initial_value(initial_val=[1.0, 2.0, 3.0])
assert port.initial_value == {(0, 0): 1.0, (0, 1): 2.0, (0, 2): 3.0}

# Assert a dict of ints is processed
port.process_initial_value(initial_val={(0, 0): 1, (0, 1): 2, (0, 2): 3})
assert port.initial_value == {(0, 0): 1, (0, 1): 2, (0, 2): 3}

# Assert a dict of ints is processed
port.process_initial_value(initial_val={(0, 0): 1.0, (0, 1): 2.0, (0, 2): 3.0})
assert port.initial_value == {(0, 0): 1.0, (0, 1): 2.0, (0, 2): 3.0}

# Assert a numpy array of ints is processed
port.process_initial_value(initial_val=np.array([1, 2, 3]))
assert port.initial_value == {(0, 0): 1, (0, 1): 2, (0, 2): 3}

# Assert a numpy array of floats is processed
port.process_initial_value(initial_val=np.array([1.0, 2.0, 3.0]))
assert port.initial_value == {(0, 0): 1.0, (0, 1): 2.0, (0, 2): 3.0}


def test_port_reference_is_made_in_edge():
"""This test whether a port on a node and on an edge are references or copies.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@
from echo.objectives.base import ObjectiveSet, TotalFlow, TotalImportFlow
from echo.optimiser import optimise

N_INTERVALS = 48


def test_solar_generation_limited_by_inverter_size():
expansion_periods = 1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@
from echo.objectives.base import ObjectiveSet, TotalFlow
from echo.optimiser import optimise

N_INTERVALS = 48


def test_export_slack_var_is_minimised():
"""Connect curtailable solar to a connection pt with a flow constraint and slack vars enabled.
Expand Down
File renamed without changes.
118 changes: 0 additions & 118 deletions tests/test_agnostic_models.py

This file was deleted.

77 changes: 0 additions & 77 deletions tests/test_thermal_models.py

This file was deleted.

Loading
Loading