Skip to content

Commit 0e24659

Browse files
refactor: address review comments - use parameterized tests, named params, numpy methods
1 parent 6daf53e commit 0e24659

7 files changed

Lines changed: 77 additions & 47 deletions

File tree

smart_control/reward/setpoint_energy_carbon_regret_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,8 +282,8 @@ def _get_test_reward_info(
282282

283283
def test_invalid_productivity_bounds(self):
284284
"""ValueError if max_productivity <= min_productivity."""
285-
electricity_cost = TestEnergyCost(0.05, 0.01)
286-
natural_gas_cost = TestEnergyCost(0.05, 0.01)
285+
electricity_cost = TestEnergyCost(usd_per_kwh=0.05, kg_per_kwh=0.01)
286+
natural_gas_cost = TestEnergyCost(usd_per_kwh=0.05, kg_per_kwh=0.01)
287287

288288
with self.assertRaisesRegex(
289289
ValueError,

smart_control/simulator/randomized_arrival_departure_occupancy_test.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,12 @@ def test_get_event_probability_invalid_hours(self):
164164
random_state = np.random.RandomState(seed=55213)
165165
step_size = pd.Timedelta(5, unit='minute')
166166
occupant = randomized_arrival_departure_occupancy.ZoneOccupant(
167-
8, 12, 13, 18, step_size, random_state
167+
earliest_expected_arrival_hour=8,
168+
latest_expected_arrival_hour=12,
169+
earliest_expected_departure_hour=13,
170+
latest_expected_departure_hour=18,
171+
step_size=step_size,
172+
random_state=random_state,
168173
)
169174

170175
with self.assertRaisesRegex(

smart_control/simulator/vav.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,17 @@ def compute_zone_supply_temp(
166166
input_water_temp: Temperature in K of input water.
167167
"""
168168

169+
# Ensure damper_setting and max_air_flow_rate are positive
170+
if self.damper_setting <= 0:
171+
raise ValueError(
172+
f'Damper setting must be greater than 0, got {self.damper_setting}.'
173+
)
174+
if self._max_air_flow_rate <= 0:
175+
raise ValueError(
176+
'Maximum air flow rate must be greater than 0, '
177+
f'got {self._max_air_flow_rate}.'
178+
)
179+
169180
reheat_flow_rate = (
170181
self._reheat_valve_setting * self._reheat_max_water_flow_rate
171182
)

smart_control/simulator/vav_test.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -131,21 +131,22 @@ def test_setters_raise_error(self):
131131
with self.assertRaises(ValueError):
132132
v.damper_setting = -0.1
133133

134-
def test_max_air_flow_rate_setter_raises_value_error(self):
134+
@parameterized.parameters(0.0, -0.5)
135+
def test_max_air_flow_rate_setter_raises_value_error(self, invalid_value):
135136
"""ValueError when max_air_flow_rate is set to 0 or negative."""
136137
t = _get_default_thermostat()
137138
b = _get_default_boiler()
138-
v = vav.Vav(0.6, 0.4, t, b)
139-
140-
with self.assertRaisesRegex(
141-
ValueError, 'Maximum air flow rate must be greater than 0'
142-
):
143-
v.max_air_flow_rate = 0.0
139+
v = vav.Vav(
140+
max_air_flow_rate=0.6,
141+
reheat_max_water_flow_rate=0.4,
142+
therm=t,
143+
boiler=b,
144+
)
144145

145146
with self.assertRaisesRegex(
146147
ValueError, 'Maximum air flow rate must be greater than 0'
147148
):
148-
v.max_air_flow_rate = -0.5
149+
v.max_air_flow_rate = invalid_value
149150

150151
@parameterized.parameters(
151152
(pd.Timestamp('2021-05-09 14:00'), 293, 0.1, 0.0),

smart_control/utils/conversion_utils_test.py

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -46,33 +46,25 @@ def test_normalize_hod(self):
4646
self.assertEqual(conversion_utils.normalize_hod(0), -1.0)
4747
self.assertEqual(conversion_utils.normalize_hod(23), 1.0)
4848

49-
def test_normalize_hod_invalid(self):
49+
@parameterized.parameters(24, -1)
50+
def test_normalize_hod_invalid_raises_error(self, invalid_hod):
5051
"""ValueError when hour of day is outside [0, 23]."""
5152
with self.assertRaisesRegex(
5253
ValueError, r'Hour of day \(hod\) must be within the range \[0, 23\]'
5354
):
54-
conversion_utils.normalize_hod(24)
55-
56-
with self.assertRaisesRegex(
57-
ValueError, r'Hour of day \(hod\) must be within the range \[0, 23\]'
58-
):
59-
conversion_utils.normalize_hod(-1)
55+
conversion_utils.normalize_hod(invalid_hod)
6056

6157
def test_normalize_dow(self):
6258
self.assertEqual(conversion_utils.normalize_dow(0), -1.0)
6359
self.assertEqual(conversion_utils.normalize_dow(6), 1.0)
6460

65-
def test_normalize_dow_invalid(self):
61+
@parameterized.parameters(7, -1)
62+
def test_normalize_dow_invalid_raises_error(self, invalid_dow):
6663
"""ValueError when day of week is outside [0, 6]."""
6764
with self.assertRaisesRegex(
6865
ValueError, r'Day of week \(dow\) must be within the range \[0, 6\]'
6966
):
70-
conversion_utils.normalize_dow(7)
71-
72-
with self.assertRaisesRegex(
73-
ValueError, r'Day of week \(dow\) must be within the range \[0, 6\]'
74-
):
75-
conversion_utils.normalize_dow(-1)
67+
conversion_utils.normalize_dow(invalid_dow)
7668

7769
@parameterized.parameters(
7870
(pd.Timestamp('2021-09-27 10:00:00-08:00'), 0),

smart_control/utils/energy_utils.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,20 +63,32 @@ def get_humidity_ratio(
6363
6464
Returns: water mass to air mass ratio in kg Water / kg Air
6565
"""
66-
if len(temps) != len(relative_humidities) or len(temps) != len(pressures):
66+
if not (len(temps) == len(relative_humidities) == len(pressures)): # pylint: disable=superfluous-parens
6767
raise ValueError(
6868
f'Input arrays must have equal length. Got: temps={len(temps)}, '
6969
f'relative_humidities={len(relative_humidities)}, '
7070
f'pressures={len(pressures)}.'
7171
)
7272

73-
# Sanity-check each RH and pressure
74-
for i, rh in enumerate(relative_humidities):
75-
if rh <= 0.0 or rh > 1.0:
76-
raise ValueError(f'relative_humidities[{i}] must be in [0,1], got {rh}.')
77-
for i, p in enumerate(pressures):
78-
if p <= 0.0:
79-
raise ValueError(f'pressures[{i}] must be greater than 0 (bar), got {p}.')
73+
# Sanity-check each RH and pressure using numpy
74+
relative_humidities_array = np.array(relative_humidities)
75+
pressures_array = np.array(pressures)
76+
77+
invalid_rh_indices = np.where(
78+
(relative_humidities_array <= 0.0) | (relative_humidities_array > 1.0)
79+
)[0]
80+
if len(invalid_rh_indices) > 0:
81+
i = invalid_rh_indices[0]
82+
raise ValueError(
83+
f'Relative humidities must be in (0,1], got {relative_humidities[i]}.'
84+
)
85+
86+
invalid_p_indices = np.where(pressures_array <= 0.0)[0]
87+
if len(invalid_p_indices) > 0:
88+
i = invalid_p_indices[0]
89+
raise ValueError(
90+
f'Pressures must be greater than 0 (bar), got {pressures[i]}.'
91+
)
8092

8193
psat = [p / 1000.0 for p in get_water_vapor_partial_pressure(temps)]
8294
return [

smart_control/utils/energy_utils_test.py

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -44,30 +44,39 @@ def test_get_humidity_ratio_mismatched_lengths(self):
4444
pressures=[1.02], # 1 element
4545
)
4646

47-
def test_get_humidity_ratio_invalid_relative_humidity(self):
47+
@parameterized.parameters(
48+
(1.5, r'Relative humidities must be in \(0,1\]'),
49+
(0.0, r'Relative humidities must be in \(0,1\]'),
50+
(-0.1, r'Relative humidities must be in \(0,1\]'),
51+
)
52+
def test_get_humidity_ratio_invalid_relative_humidity(
53+
self, invalid_rh, expected_pattern
54+
): # pylint: disable=line-too-long
4855
"""ValueError when relative_humidity is outside (0, 1]."""
49-
with self.assertRaisesRegex(
50-
ValueError, r'relative_humidities\[0\] must be in \[0,1\]'
51-
):
56+
with self.assertRaisesRegex(ValueError, expected_pattern):
5257
energy_utils.get_humidity_ratio(
53-
temps=[293], relative_humidities=[1.5], pressures=[1.02]
58+
temps=[293], relative_humidities=[invalid_rh], pressures=[1.02]
5459
)
5560

56-
def test_get_humidity_ratio_invalid_pressure(self):
61+
@parameterized.parameters(
62+
(-1.0, r'Pressures must be greater than 0'),
63+
(0.0, r'Pressures must be greater than 0'),
64+
)
65+
def test_get_humidity_ratio_invalid_pressure(
66+
self, invalid_pressure, expected_pattern
67+
):
5768
"""ValueError when pressure <= 0."""
58-
with self.assertRaisesRegex(
59-
ValueError, r'pressures\[0\] must be greater than 0'
60-
):
69+
with self.assertRaisesRegex(ValueError, expected_pattern):
6170
energy_utils.get_humidity_ratio(
62-
temps=[293], relative_humidities=[0.6], pressures=[-1.0]
71+
temps=[293], relative_humidities=[0.6], pressures=[invalid_pressure]
6372
)
6473

6574
def test_get_air_conditioning_energy_rate(self):
6675
power = energy_utils.get_air_conditioning_energy_rate(
6776
air_flow_rates=[0.170],
68-
outside_temps=[15 + 273.0],
77+
outside_temps=[288],
6978
outside_relative_humidities=[0.75],
70-
supply_temps=[120 + 273.0],
79+
supply_temps=[393],
7180
ambient_pressures=[1.025],
7281
)
7382
self.assertAlmostEqual(18230.6705, power[0], 4)
@@ -79,9 +88,9 @@ def test_get_air_conditioning_energy_rate_mismatched_lengths(self):
7988
):
8089
energy_utils.get_air_conditioning_energy_rate(
8190
air_flow_rates=[0.170, 0.180], # 2 elements
82-
outside_temps=[15 + 273.0], # 1 element
91+
outside_temps=[288], # 1 element
8392
outside_relative_humidities=[0.75],
84-
supply_temps=[120 + 273.0],
93+
supply_temps=[393],
8594
ambient_pressures=[1.025],
8695
)
8796

0 commit comments

Comments
 (0)