Source code for openquake.calculators.classical_bcr
# -*- coding: utf-8 -*-# vim: tabstop=4 shiftwidth=4 softtabstop=4## Copyright (C) 2014-2025 GEM Foundation## OpenQuake is free software: you can redistribute it and/or modify it# under the terms of the GNU Affero General Public License as published# by the Free Software Foundation, either version 3 of the License, or# (at your option) any later version.## OpenQuake is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# GNU Affero General Public License for more details.## You should have received a copy of the GNU Affero General Public License# along with OpenQuake. If not, see <http://www.gnu.org/licenses/>.importnumpyfromopenquake.baselib.generalimportAccumDictfromopenquake.hazardlibimportstatsfromopenquake.calculatorsimportbase,classical_riskF32=numpy.float32bcr_dt=numpy.dtype([('annual_loss_orig',F32),('annual_loss_retro',F32),('bcr',F32)])
[docs]defclassical_bcr(riskinputs,param,monitor):""" Compute and return the average losses for each asset. :param riskinputs: :class:`openquake.risklib.riskinput.RiskInput` objects :param param: dictionary of extra parameters :param monitor: :class:`openquake.baselib.performance.Monitor` instance """R=riskinputs[0].hazard_getter.Rresult=AccumDict(accum=numpy.zeros((R,3),F32))crmodel=monitor.read('crmodel')mon=monitor('getting hazard',measuremem=False)forriinriskinputs:withmon:haz=ri.hazard_getter.get_hazard()fortaxo,assetsinri.asset_df.groupby('taxonomy'):forrlzinrange(R):hcurve=haz[:,rlz][out]=crmodel.get_outputs(assets,hcurve)forasset,(eal_orig,eal_retro,bcr)inzip(assets.to_records(),out['structural']):aval=asset['value-structural']result[asset['ordinal']][rlz]=numpy.array([eal_orig*aval,eal_retro*aval,bcr])return{'bcr_data':result}
[docs]defpre_execute(self):super().pre_execute()forasset_ref,retrofittedinzip(self.assetcol['id'],self.assetcol.array['retrofitted']):ifnumpy.isnan(retrofitted):raiseValueError('The asset %s has no retrofitted value!'%asset_ref.decode('utf8'))
[docs]defpost_execute(self,result):# NB: defined only for loss_type = 'structural'bcr_data=numpy.zeros((self.A,self.R),bcr_dt)foraid,datainresult['bcr_data'].items():bcr_data[aid]['annual_loss_orig']=data[:,0]bcr_data[aid]['annual_loss_retro']=data[:,1]bcr_data[aid]['bcr']=data[:,2]self.datastore['bcr-rlzs']=bcr_datastats.set_rlzs_stats(self.datastore,'bcr-rlzs',assets=self.assetcol['id'])