Skip to content

Commit db0c92f

Browse files
committed
improve performance of impact computation
1 parent f7f9475 commit db0c92f

File tree

1 file changed

+30
-32
lines changed

1 file changed

+30
-32
lines changed

climada/engine/test/test_impact.py

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def test_ref_value_pass(self):
6161

6262
class TestOneExposure(unittest.TestCase):
6363
'''Test one_exposure function'''
64-
def test_ref_value_pass(self):
64+
def test_ref_value_insure_pass(self):
6565
''' Test result against reference value'''
6666
# Read demo entity values
6767
# Set the entity default file to the demo one
@@ -72,6 +72,9 @@ def test_ref_value_pass(self):
7272
hazard = Hazard('TC', HAZ_TEST_MAT)
7373
# Create impact object
7474
impact = Impact()
75+
impact.at_event = np.zeros(hazard.intensity.shape[0])
76+
impact.eai_exp = np.zeros(len(ent.exposures.value))
77+
impact.tot_value = 0
7578

7679
# Assign centroids to exposures
7780
ent.exposures.assign(hazard)
@@ -82,40 +85,34 @@ def test_ref_value_pass(self):
8285
imp_id = ent.exposures.impact_id[iexp]
8386
imp_fun = ent.impact_funcs.get_func(hazard.tag.haz_type, imp_id)[0]
8487
# Compute
85-
event_row, result = impact._one_exposure(iexp, ent.exposures, \
86-
hazard, imp_fun)
87-
# Check sizes
88-
num_res = 1280
89-
self.assertEqual(num_res, len(event_row))
90-
self.assertEqual(num_res, len(result))
88+
insure_flag = True
89+
impact._exp_impact(np.array([iexp]), ent.exposures, hazard, imp_fun, insure_flag)
90+
91+
self.assertEqual(impact.eai_exp.size, ent.exposures.size)
92+
self.assertEqual(impact.at_event.size, hazard.intensity.shape[0])
93+
94+
events_pos = hazard.intensity[:, ent.exposures.assigned['TC'][iexp]].nonzero()[0]
95+
res_exp = np.zeros((ent.exposures.size))
96+
res_exp[iexp] = np.sum(impact.at_event[events_pos] * hazard.frequency[events_pos])
97+
self.assertTrue(np.array_equal(res_exp, impact.eai_exp))
9198

99+
self.assertEqual(0, impact.at_event[12])
92100
# Check first 3 values
93-
self.assertEqual(0, result[0])
94-
self.assertEqual(0, result[1])
95-
self.assertEqual(1.0626600695059455e+06, result[2])
96-
self.assertEqual(12, event_row[0])
97-
self.assertEqual(41, event_row[1])
98-
self.assertEqual(44, event_row[2])
101+
self.assertEqual(0, impact.at_event[12])
102+
self.assertEqual(0, impact.at_event[41])
103+
self.assertEqual(1.0626600695059455e+06, impact.at_event[44])
99104

100105
# Check intermediate values
101-
self.assertEqual(0, result[678])
102-
self.assertEqual(0, result[543])
103-
self.assertEqual(0, result[982])
104-
self.assertEqual(1.3318063850487845e+08, result[750])
105-
self.assertEqual(4.667108555054083e+06, result[917])
106-
self.assertEqual(6281, event_row[678])
107-
self.assertEqual(4998, event_row[543])
108-
self.assertEqual(9527, event_row[982])
109-
self.assertEqual(7192, event_row[750])
110-
self.assertEqual(8624, event_row[917])
106+
self.assertEqual(0, impact.at_event[6281])
107+
self.assertEqual(0, impact.at_event[4998])
108+
self.assertEqual(0, impact.at_event[9527])
109+
self.assertEqual(1.3318063850487845e+08, impact.at_event[7192])
110+
self.assertEqual(4.667108555054083e+06, impact.at_event[8624])
111111

112112
# Check last 3 values
113-
self.assertEqual(0, result[num_res-1])
114-
self.assertEqual(0, result[num_res-2])
115-
self.assertEqual(0, result[num_res-3])
116-
self.assertEqual(14349, event_row[num_res-1])
117-
self.assertEqual(14347, event_row[num_res-2])
118-
self.assertEqual(14309, event_row[num_res-3])
113+
self.assertEqual(0, impact.at_event[14349])
114+
self.assertEqual(0, impact.at_event[14347])
115+
self.assertEqual(0, impact.at_event[14309])
119116

120117
class TestCalc(unittest.TestCase):
121118
''' Test impact calc method.'''
@@ -145,7 +142,7 @@ def test_ref_value_pass(self):
145142
self.assertEqual(0, impact.at_event[0])
146143
self.assertEqual(0, impact.at_event[int(num_events/2)])
147144
self.assertAlmostEqual(1.472482938320243e+08, impact.at_event[13809])
148-
self.assertEqual(7.076504723057620e+10, impact.at_event[12147])
145+
self.assertEqual(7.076504723057619e+10, impact.at_event[12147])
149146
self.assertEqual(0, impact.at_event[num_events-1])
150147
# impact.eai_exp == EDS.ED_at_centroid in MATLAB
151148
self.assertEqual(num_exp, len(impact.eai_exp))
@@ -160,10 +157,11 @@ def test_ref_value_pass(self):
160157
impact.eai_exp[int(num_exp-1)]))
161158
# impact.tot_value == EDS.Value in MATLAB
162159
# impact.aai_agg == EDS.ED in MATLAB
163-
self.assertAlmostEqual(6.570532945599104e+11, impact.tot_value)
160+
self.assertAlmostEqual(6.570532945599105e+11, impact.tot_value)
164161
self.assertAlmostEqual(6.512201157564421e+09, impact.aai_agg, 5)
165162
self.assertTrue(np.isclose(6.512201157564421e+09, impact.aai_agg))
166-
163+
164+
167165
# Execute Tests
168166
TESTS = unittest.TestLoader().loadTestsFromTestCase(TestOneExposure)
169167
TESTS.addTests(unittest.TestLoader().loadTestsFromTestCase(TestCalc))

0 commit comments

Comments
 (0)