Skip to content

Commit 261415c

Browse files
author
Chahan Kropf
committed
Make method for uncertainty computation step
1 parent 6e7d24f commit 261415c

File tree

2 files changed

+74
-82
lines changed

2 files changed

+74
-82
lines changed

climada/engine/unsequa/calc_cost_benefit.py

Lines changed: 35 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ def uncertainty(self,
193193
data corruption issues. The computational cost should be
194194
minimal as only a list of floats.'''
195195
samples_df = unc_sample.samples_df.copy(deep=True)
196+
196197
if chunksize is None:
197198
chunksize = _multiprocess_chunksize(samples_df, processes)
198199
unit = self.value_unit
@@ -201,55 +202,19 @@ def uncertainty(self,
201202
"change the risk_func (see climada.engine.cost_benefit) "
202203
"if return period information is needed")
203204

204-
start = time.time()
205205
one_sample = samples_df.iloc[0:1]
206-
p_iterator = _sample_parallel_iterator(
207-
samples=one_sample,
208-
chunksize=chunksize,
209-
ent_input_var=self.ent_input_var,
210-
haz_input_var=self.haz_input_var,
211-
ent_fut_input_var=self.ent_fut_input_var,
212-
haz_fut_input_var=self.haz_fut_input_var,
213-
cost_benefit_kwargs=cost_benefit_kwargs
214-
)
215-
cb_metrics = itertools.starmap(_map_costben_calc, p_iterator)
216-
[imp_meas_present,
217-
imp_meas_future,
218-
tot_climate_risk,
219-
benefit,
220-
cost_ben_ratio] = _transpose_chunked_data(cb_metrics)
206+
start = time.time()
207+
self._compute_cb_metrics(one_sample, cost_benefit_kwargs, chunksize=1, processes=1)
221208
elapsed_time = (time.time() - start)
222209
self.est_comp_time(unc_sample.n_samples, elapsed_time, processes)
223210

224211
#Compute impact distributions
225-
with log_level(level='ERROR', name_prefix='climada'):
226-
p_iterator = _sample_parallel_iterator(
227-
samples=samples_df,
228-
chunksize=chunksize,
229-
ent_input_var=self.ent_input_var,
230-
haz_input_var=self.haz_input_var,
231-
ent_fut_input_var=self.ent_fut_input_var,
232-
haz_fut_input_var=self.haz_fut_input_var,
233-
cost_benefit_kwargs=cost_benefit_kwargs
234-
)
235-
if processes>1:
236-
with mp.Pool(processes=processes) as pool:
237-
LOGGER.info('Using %s CPUs.', processes)
238-
cb_metrics = pool.starmap(
239-
_map_costben_calc, p_iterator
240-
)
241-
else:
242-
cb_metrics = itertools.starmap(
243-
_map_costben_calc, p_iterator
244-
)
212+
[imp_meas_present,
213+
imp_meas_future,
214+
tot_climate_risk,
215+
benefit,
216+
cost_ben_ratio] = self._compute_cb_metrics(samples_df, cost_benefit_kwargs, chunksize, processes)
245217

246-
#Perform the actual computation
247-
with log_level(level='ERROR', name_prefix='climada'):
248-
[imp_meas_present,
249-
imp_meas_future,
250-
tot_climate_risk,
251-
benefit,
252-
cost_ben_ratio] = _transpose_chunked_data(cb_metrics)
253218
# Assign computed impact distribution data to self
254219
tot_climate_risk_unc_df = \
255220
pd.DataFrame(tot_climate_risk, columns = ['tot_climate_risk'])
@@ -303,6 +268,33 @@ def uncertainty(self,
303268
unit=unit,
304269
cost_benefit_kwargs=cost_benefit_kwargs)
305270

271+
def _compute_cb_metrics(
272+
self, samples_df, cost_benefit_kwargs, chunksize, processes
273+
):
274+
with log_level(level='ERROR', name_prefix='climada'):
275+
p_iterator = _sample_parallel_iterator(
276+
samples=samples_df,
277+
chunksize=chunksize,
278+
ent_input_var=self.ent_input_var,
279+
haz_input_var=self.haz_input_var,
280+
ent_fut_input_var=self.ent_fut_input_var,
281+
haz_fut_input_var=self.haz_fut_input_var,
282+
cost_benefit_kwargs=cost_benefit_kwargs
283+
)
284+
if processes>1:
285+
with mp.Pool(processes=processes) as pool:
286+
LOGGER.info('Using %s CPUs.', processes)
287+
cb_metrics = pool.starmap(
288+
_map_costben_calc, p_iterator
289+
)
290+
else:
291+
cb_metrics = itertools.starmap(
292+
_map_costben_calc, p_iterator
293+
)
294+
295+
#Perform the actual computation
296+
with log_level(level='ERROR', name_prefix='climada'):
297+
return _transpose_chunked_data(cb_metrics)
306298

307299

308300
def _map_costben_calc(

climada/engine/unsequa/calc_impact.py

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -207,51 +207,21 @@ def uncertainty(self,
207207
self.calc_eai_exp = calc_eai_exp
208208
self.calc_at_event = calc_at_event
209209

210-
start = time.time()
211210
one_sample = samples_df.iloc[0:1]
212-
p_iterator = _sample_parallel_iterator(
213-
samples=one_sample,
214-
chunksize=chunksize,
215-
exp_input_var=self.exp_input_var,
216-
impf_input_var=self.impf_input_var,
217-
haz_input_var=self.haz_input_var,
218-
rp=rp,
219-
calc_eai_exp=calc_eai_exp,
220-
calc_at_event=calc_at_event
211+
start = time.time()
212+
self._compute_imp_metrics(
213+
one_sample, rp, calc_eai_exp, calc_at_event, chunksize=1, processes=1
221214
)
222-
imp_metrics = itertools.starmap(_map_impact_calc, p_iterator)
223-
[aai_agg_list, freq_curve_list,
224-
eai_exp_list, at_event_list] = _transpose_chunked_data(imp_metrics)
225215
elapsed_time = (time.time() - start)
226216
self.est_comp_time(unc_sample.n_samples, elapsed_time, processes)
227217

228-
#Compute impact distributions
229-
with log_level(level='ERROR', name_prefix='climada'):
230-
p_iterator = _sample_parallel_iterator(
231-
samples=samples_df,
232-
chunksize=chunksize,
233-
exp_input_var=self.exp_input_var,
234-
impf_input_var=self.impf_input_var,
235-
haz_input_var=self.haz_input_var,
236-
rp=rp,
237-
calc_eai_exp=calc_eai_exp,
238-
calc_at_event=calc_at_event,
218+
[aai_agg_list,
219+
freq_curve_list,
220+
eai_exp_list,
221+
at_event_list] = self._compute_imp_metrics(
222+
samples_df, rp, calc_eai_exp, calc_at_event,
223+
chunksize=chunksize, processes=processes
239224
)
240-
if processes > 1:
241-
with mp.Pool(processes=processes) as pool:
242-
LOGGER.info('Using %s CPUs.', processes)
243-
imp_metrics = pool.starmap(
244-
_map_impact_calc, p_iterator
245-
)
246-
else:
247-
imp_metrics = itertools.starmap(
248-
_map_impact_calc, p_iterator
249-
)
250-
251-
#Perform the actual computation
252-
with log_level(level='ERROR', name_prefix='climada'):
253-
[aai_agg_list, freq_curve_list,
254-
eai_exp_list, at_event_list] = _transpose_chunked_data(imp_metrics)
255225

256226
# Assign computed impact distribution data to self
257227
aai_agg_unc_df = pd.DataFrame(aai_agg_list,
@@ -280,6 +250,36 @@ def uncertainty(self,
280250
coord_df=coord_df
281251
)
282252

253+
def _compute_imp_metrics(
254+
self, samples_df, rp, calc_eai_exp, calc_at_event, chunksize, processes
255+
):
256+
#Compute impact distributions
257+
with log_level(level='ERROR', name_prefix='climada'):
258+
p_iterator = _sample_parallel_iterator(
259+
samples=samples_df,
260+
chunksize=chunksize,
261+
exp_input_var=self.exp_input_var,
262+
impf_input_var=self.impf_input_var,
263+
haz_input_var=self.haz_input_var,
264+
rp=rp,
265+
calc_eai_exp=calc_eai_exp,
266+
calc_at_event=calc_at_event,
267+
)
268+
if processes > 1:
269+
with mp.Pool(processes=processes) as pool:
270+
LOGGER.info('Using %s CPUs.', processes)
271+
imp_metrics = pool.starmap(
272+
_map_impact_calc, p_iterator
273+
)
274+
else:
275+
imp_metrics = itertools.starmap(
276+
_map_impact_calc, p_iterator
277+
)
278+
279+
#Perform the actual computation
280+
with log_level(level='ERROR', name_prefix='climada'):
281+
return _transpose_chunked_data(imp_metrics)
282+
283283

284284
def _map_impact_calc(
285285
sample_chunks, exp_input_var, impf_input_var, haz_input_var,

0 commit comments

Comments
 (0)