Skip to content

Commit 3a046c7

Browse files
committed
Add tests for OutputEvaluator
1 parent 677fba9 commit 3a046c7

File tree

2 files changed

+62
-11
lines changed

2 files changed

+62
-11
lines changed

climada/test/test_util_calibrate.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@
77
import numpy.testing as npt
88
from scipy.optimize import NonlinearConstraint
99
from sklearn.metrics import mean_squared_error
10+
from matplotlib.axes import Axes
1011

1112
from climada.entity import ImpactFuncSet, ImpactFunc
1213

13-
from climada.util.calibrate import Input, ScipyMinimizeOptimizer, BayesianOptimizer
14+
from climada.util.calibrate import Input, ScipyMinimizeOptimizer, BayesianOptimizer, OutputEvaluator
1415

1516
from climada.util.calibrate.test.test_base import hazard, exposure
1617

@@ -201,3 +202,17 @@ def test_multiple_constrained(self):
201202
(p_allowed["intensity_1"] < p_allowed["intensity_2"]).to_numpy(),
202203
np.full_like(p_allowed["intensity_1"].to_numpy(), True),
203204
)
205+
206+
def test_plots(self):
207+
"""Check if executing the default plots works"""
208+
self.input.bounds = {"slope": (-1, 3)}
209+
optimizer = BayesianOptimizer(self.input)
210+
output = optimizer.run(init_points=10, n_iter=20, random_state=1)
211+
212+
output_eval = OutputEvaluator(self.input, output)
213+
output_eval.impf_set.plot()
214+
output_eval.plot_at_event()
215+
output_eval.plot_at_region()
216+
ax = output_eval.plot_impf_variability()
217+
self.assertIsInstance(ax, Axes)
218+
output_eval.plot_event_region_heatmap()

climada/util/calibrate/test/test_base.py

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""Tests for calibration module"""
22

33
import unittest
4-
from unittest.mock import create_autospec
4+
from unittest.mock import patch, create_autospec, MagicMock
55

66
import numpy as np
77
import numpy.testing as npt
@@ -10,9 +10,10 @@
1010

1111
from climada.entity import Exposures, ImpactFunc, ImpactFuncSet
1212
from climada.hazard import Hazard, Centroids
13+
from climada.engine import ImpactCalc
1314

14-
from climada.util.calibrate import Input
15-
from climada.util.calibrate.base import Optimizer
15+
from climada.util.calibrate import Input, OutputEvaluator
16+
from climada.util.calibrate.base import Optimizer, Output
1617

1718

1819
class ConcreteOptimizer(Optimizer):
@@ -138,14 +139,11 @@ def test_align_impact(self):
138139
)
139140
pd.testing.assert_frame_equal(data_aligned, data_aligned_test)
140141
impact_df_aligned_test = pd.DataFrame(
141-
data={"col1": [0, 0, 0], "col2": [0, 1, 0], "col3": [0, 0, 0]},
142-
index=[0, 1, 2],
143-
dtype="float",
144-
)
145-
pd.testing.assert_frame_equal(
146-
impact_df_aligned,
147-
impact_df_aligned_test
142+
data={"col1": [0, 0, 0], "col2": [0, 1, 0], "col3": [0, 0, 0]},
143+
index=[0, 1, 2],
144+
dtype="float",
148145
)
146+
pd.testing.assert_frame_equal(impact_df_aligned, impact_df_aligned_test)
149147

150148
# Check fillna
151149
data_aligned, impact_df_aligned = input.impact_to_aligned_df(None, fillna=0)
@@ -189,8 +187,46 @@ def setUp(self):
189187
self.optimizer = ConcreteOptimizer(self.input)
190188

191189

190+
class TestOutputEvaluator(unittest.TestCase):
191+
"""Test the output evaluator"""
192+
193+
def setUp(self):
194+
"""Create Input and Output"""
195+
self.input = Input(
196+
hazard=hazard(),
197+
exposure=exposure(),
198+
data=pd.DataFrame(),
199+
impact_func_creator=MagicMock(),
200+
# Should not be called
201+
impact_to_dataframe=lambda _: None,
202+
cost_func=lambda _: None,
203+
)
204+
self.output = Output(params={"p1": 1, "p2": 2.0}, target=0.0)
205+
206+
@patch("climada.util.calibrate.base.ImpactCalc", autospec=True)
207+
def test_init(self, mock):
208+
"""Test initialization"""
209+
self.input.exposure.value_unit = "my_unit"
210+
self.input.impact_func_creator.return_value = "impact_func"
211+
impact_calc_mock = MagicMock(ImpactCalc)
212+
mock.return_value = impact_calc_mock
213+
impact_calc_mock.impact = MagicMock()
214+
impact_calc_mock.impact.return_value = "impact"
215+
216+
out_eval = OutputEvaluator(self.input, self.output)
217+
self.assertEqual(out_eval.impf_set, "impact_func")
218+
self.assertEqual(out_eval.impact, "impact")
219+
self.assertEqual(out_eval._impact_label, "Impact [my_unit]")
220+
221+
self.input.impact_func_creator.assert_called_with(p1=1, p2=2.0)
222+
mock.assert_called_with(
223+
self.input.exposure, "impact_func", self.input.hazard
224+
)
225+
226+
192227
# Execute Tests
193228
if __name__ == "__main__":
194229
TESTS = unittest.TestLoader().loadTestsFromTestCase(TestInputPostInit)
195230
TESTS.addTests(unittest.TestLoader().loadTestsFromTestCase(TestOptimizer))
231+
TESTS.addTests(unittest.TestLoader().loadTestsFromTestCase(TestOutputEvaluator))
196232
unittest.TextTestRunner(verbosity=2).run(TESTS)

0 commit comments

Comments
 (0)