def pre_execute(self): """ Associate the assets to the sites and build the riskinputs. """ if 'hazard_curves' in self.oqparam.inputs: # read hazard from file haz_sitecol, haz_curves = readinput.get_hcurves(self.oqparam) self.read_exposure() # define .assets_by_site self.load_riskmodel() self.sitecol, self.assets_by_site = self.assoc_assets_sites( haz_sitecol) curves_by_trt_gsim = {(0, 'FromFile'): haz_curves} self.rlzs_assoc = logictree.trivial_rlzs_assoc() self.save_mesh() else: # compute hazard super(ClassicalRiskCalculator, self).pre_execute() logging.info('Preparing the risk input') curves_by_trt_gsim = {} for dset in self.datastore['curves_by_sm'].values(): for key, curves in dset.items(): trt_id, gsim = key.split('-') curves_by_trt_gsim[int(trt_id), gsim] = curves.value self.assetcol = riskinput.build_asset_collection( self.assets_by_site, self.oqparam.time_event) self.riskinputs = self.build_riskinputs(curves_by_trt_gsim) self.monitor.oqparam = self.oqparam self.N = sum(len(assets) for assets in self.assets_by_site) self.L = len(self.riskmodel.loss_types) self.R = len(self.rlzs_assoc.realizations) self.I = self.oqparam.insured_losses self.Q1 = len(self.oqparam.quantile_loss_curves) + 1
def build_riskinputs(self, hazards_by_key, eps=numpy.zeros(0)): """ :param hazards_by_key: a dictionary key -> IMT -> array of length num_sites :param eps: a matrix of epsilons (possibly empty) :returns: a list of RiskInputs objects, sorted by IMT. """ # add asset.idx as side effect riskinput.build_asset_collection(self.assets_by_site, self.oqparam.time_event) imtls = self.oqparam.imtls with self.monitor('building riskinputs', autoflush=True): riskinputs = [] idx_weight_pairs = [(i, len(assets)) for i, assets in enumerate(self.assets_by_site) ] blocks = general.split_in_blocks(idx_weight_pairs, self.oqparam.concurrent_tasks or 1, weight=operator.itemgetter(1)) for block in blocks: indices = numpy.array([idx for idx, _weight in block]) reduced_assets = self.assets_by_site[indices] reduced_eps = {} # for the assets belonging to the indices if len(eps): for assets in reduced_assets: for asset in assets: reduced_eps[asset.idx] = eps[asset.idx] # collect the hazards by key into hazards by imt hdata = collections.defaultdict(lambda: [{} for _ in indices]) for key, hazards_by_imt in hazards_by_key.items(): for imt in imtls: hazards_by_site = hazards_by_imt[imt] for i, haz in enumerate(hazards_by_site[indices]): hdata[imt][i][key] = haz # build the riskinputs for imt in hdata: ri = self.riskmodel.build_input(imt, hdata[imt], reduced_assets, reduced_eps) if ri.weight > 0: riskinputs.append(ri) logging.info('Built %d risk inputs', len(riskinputs)) return sorted(riskinputs, key=self.riskinput_key)
def build_riskinputs(self, hazards_by_key, eps=numpy.zeros(0)): """ :param hazards_by_key: a dictionary key -> IMT -> array of length num_sites :param eps: a matrix of epsilons (possibly empty) :returns: a list of RiskInputs objects, sorted by IMT. """ # add asset.idx as side effect riskinput.build_asset_collection( self.assets_by_site, self.oqparam.time_event) imtls = self.oqparam.imtls with self.monitor('building riskinputs', autoflush=True): riskinputs = [] idx_weight_pairs = [ (i, len(assets)) for i, assets in enumerate(self.assets_by_site)] blocks = general.split_in_blocks( idx_weight_pairs, self.oqparam.concurrent_tasks or 1, weight=operator.itemgetter(1)) for block in blocks: indices = numpy.array([idx for idx, _weight in block]) reduced_assets = self.assets_by_site[indices] reduced_eps = {} # for the assets belonging to the indices if len(eps): for assets in reduced_assets: for asset in assets: reduced_eps[asset.idx] = eps[asset.idx] # collect the hazards by key into hazards by imt hdata = collections.defaultdict(lambda: [{} for _ in indices]) for key, hazards_by_imt in hazards_by_key.items(): for imt in imtls: hazards_by_site = hazards_by_imt[imt] for i, haz in enumerate(hazards_by_site[indices]): hdata[imt][i][key] = haz # build the riskinputs for imt in hdata: ri = self.riskmodel.build_input( imt, hdata[imt], reduced_assets, reduced_eps) if ri.weight > 0: riskinputs.append(ri) logging.info('Built %d risk inputs', len(riskinputs)) return sorted(riskinputs, key=self.riskinput_key)
def pre_execute(self): """ Read the precomputed ruptures (or compute them on the fly) and prepare some datasets in the datastore. """ super(EventBasedRiskCalculator, self).pre_execute() if not self.riskmodel: # there is no riskmodel, exit early self.execute = lambda: None self.post_execute = lambda result: None return oq = self.oqparam if self.riskmodel.covs: epsilon_sampling = oq.epsilon_sampling else: epsilon_sampling = 1 # only one ignored epsilon correl_model = readinput.get_correl_model(oq) gsims_by_col = self.rlzs_assoc.get_gsims_by_col() assets_by_site = self.assets_by_site # the following is needed to set the asset idx attribute self.assetcol = riskinput.build_asset_collection( assets_by_site, oq.time_event) self.spec_indices = numpy.array([a['asset_ref'] in oq.specific_assets for a in self.assetcol]) logging.info('Populating the risk inputs') rup_by_tag = sum(self.datastore['sescollection'], AccumDict()) all_ruptures = [rup_by_tag[tag] for tag in sorted(rup_by_tag)] for i, rup in enumerate(all_ruptures): rup.ordinal = i num_samples = min(len(all_ruptures), epsilon_sampling) self.epsilon_matrix = eps = riskinput.make_eps( assets_by_site, num_samples, oq.master_seed, oq.asset_correlation) logging.info('Generated %d epsilons', num_samples * len(eps)) self.riskinputs = list(self.riskmodel.build_inputs_from_ruptures( self.sitecol.complete, all_ruptures, gsims_by_col, oq.truncation_level, correl_model, eps, oq.concurrent_tasks or 1)) logging.info('Built %d risk inputs', len(self.riskinputs)) # preparing empty datasets loss_types = self.riskmodel.loss_types self.L = len(loss_types) self.R = len(self.rlzs_assoc.realizations) self.outs = OUTPUTS self.datasets = {} # ugly: attaching an attribute needed in the task function self.monitor.num_outputs = len(self.outs) self.monitor.num_assets = self.count_assets() for o, out in enumerate(self.outs): self.datastore.hdf5.create_group(out) for l, loss_type in enumerate(loss_types): for r, rlz in enumerate(self.rlzs_assoc.realizations): key = '/%s/%s' % (loss_type, rlz.uid) if o == AGGLOSS: # loss tables dset = self.datastore.create_dset(out + key, elt_dt) elif o == SPECLOSS: # specific losses dset = self.datastore.create_dset(out + key, ela_dt) self.datasets[o, l, r] = dset
def execute(self): """ Parallelize on the riskinputs and returns a dictionary of results. Require a `.core_func` to be defined with signature (riskinputs, riskmodel, rlzs_assoc, monitor). """ # add fatalities as side effect riskinput.build_asset_collection( self.assets_by_site, self.oqparam.time_event) self.monitor.oqparam = self.oqparam if self.pre_calculator == 'event_based_rupture': self.monitor.assets_by_site = self.assets_by_site self.monitor.num_assets = self.count_assets() res = apply_reduce( self.core_func.__func__, (self.riskinputs, self.riskmodel, self.rlzs_assoc, self.monitor), concurrent_tasks=self.oqparam.concurrent_tasks, weight=get_weight, key=self.riskinput_key) return res
def execute(self): """ Parallelize on the riskinputs and returns a dictionary of results. Require a `.core_func` to be defined with signature (riskinputs, riskmodel, rlzs_assoc, monitor). """ # add fatalities as side effect riskinput.build_asset_collection( self.assets_by_site, self.oqparam.time_event) self.monitor.oqparam = self.oqparam if self.pre_calculator == 'event_based_rupture': self.monitor.assets_by_site = self.assets_by_site self.monitor.num_assets = self.count_assets() res = apply_reduce( self.core_func.__func__, (self.riskinputs, self.riskmodel, self.rlzs_assoc, self.monitor), concurrent_tasks=self.oqparam.concurrent_tasks, weight=get_weight, key=self.riskinput_key) return res
def test_assetcol(self): expected = writetmp('''\ asset_ref:|S100:,site_id:uint32:,taxonomy:uint32:,fatalities:float64:,structural:float64:,deductible~structural:float64:,insurance_limit~structural:float64: a0,0,1,10,3000,.25,1.0 a1,1,0,20,2000,0.25,0.5 a2,2,2,30,1000,0.2,0.8 a3,2,1,0,5000,2.0,6.0 a4,3,1,50,500000,2.0,6.0 ''') assetcol = riskinput.build_asset_collection(self.assets_by_site) numpy.testing.assert_equal(assetcol, readers.read_composite_array(expected))
def test_assetcol(self): expected = writetmp('''\ asset_ref:|S20:,site_id:uint32:,structural:float64:,deductible~structural:float64:,insurance_limit~structural:float64: a0,0,3000,25,100 a1,1,2000,0.1,0.2 a2,2,1000,0.02,0.08 a3,2,5000,1000,3000 a4,3,500000,1000,3000 ''') assetcol = riskinput.build_asset_collection(self.assets_by_site) numpy.testing.assert_equal( assetcol, readers.read_composite_array(expected))
def test_assetcol(self): expected = writetmp('''\ asset_ref:|S100:,site_id:uint32:,taxonomy:uint32:,fatalities:float64:,structural:float64:,deductible~structural:float64:,insurance_limit~structural:float64: a0,0,1,10,3000,.25,1.0 a1,1,0,20,2000,0.25,0.5 a2,2,2,30,1000,0.2,0.8 a3,2,1,0,5000,2.0,6.0 a4,3,1,50,500000,2.0,6.0 ''') assetcol = riskinput.build_asset_collection(self.assets_by_site) numpy.testing.assert_equal( assetcol, readers.read_composite_array(expected))
def read_exposure_sitecol(self): """ Read the exposure (if any) and then the site collection, possibly extracted from the exposure. """ inputs = self.oqparam.inputs if 'gmfs' in inputs and self.oqparam.sites: haz_sitecol = self.sitecol = readinput.get_site_collection( self.oqparam) if 'scenario_' in self.oqparam.calculation_mode: self.gmfs = get_gmfs(self) haz_sitecol = self.sitecol if 'exposure' in inputs: logging.info('Reading the exposure') with self.monitor('reading exposure', autoflush=True): self.exposure = readinput.get_exposure(self.oqparam) self.sitecol, self.assets_by_site = ( readinput.get_sitecol_assets(self.oqparam, self.exposure)) self.cost_types = self.exposure.cost_types self.taxonomies = numpy.array( sorted(self.exposure.taxonomies), '|S100') num_assets = self.count_assets() if self.datastore.parent: haz_sitecol = self.datastore.parent['sitecol'] elif 'gmfs' in inputs: pass # haz_sitecol is already defined # TODO: think about the case hazard_curves in inputs else: haz_sitecol = None if haz_sitecol is not None and haz_sitecol != self.sitecol: with self.monitor('assoc_assets_sites'): self.sitecol, self.assets_by_site = \ self.assoc_assets_sites(haz_sitecol.complete) ok_assets = self.count_assets() num_sites = len(self.sitecol) logging.warn('Associated %d assets to %d sites, %d discarded', ok_assets, num_sites, num_assets - ok_assets) elif (self.datastore.parent and 'exposure' in OqParam.from_(self.datastore.parent.attrs).inputs): logging.info('Re-using the already imported exposure') else: # no exposure logging.info('Reading the site collection') with self.monitor('reading site collection', autoflush=True): self.sitecol = readinput.get_site_collection(self.oqparam) # save mesh and asset collection self.save_mesh() if hasattr(self, 'assets_by_site'): self.assetcol = riskinput.build_asset_collection( self.assets_by_site, self.oqparam.time_event)
def read_exposure_sitecol(self): """ Read the exposure (if any) and then the site collection, possibly extracted from the exposure. """ logging.info('Reading the site collection') with self.monitor('reading site collection', autoflush=True): haz_sitecol = readinput.get_site_collection(self.oqparam) inputs = self.oqparam.inputs if 'exposure' in inputs: logging.info('Reading the exposure') with self.monitor('reading exposure', autoflush=True): self.exposure = readinput.get_exposure(self.oqparam) self.sitecol, self.assets_by_site = ( readinput.get_sitecol_assets(self.oqparam, self.exposure)) if len(self.exposure.cost_types): self.cost_types = self.exposure.cost_types self.taxonomies = numpy.array( sorted(self.exposure.taxonomies), '|S100') num_assets = self.count_assets() if self.datastore.parent: haz_sitecol = self.datastore.parent['sitecol'] if haz_sitecol is not None and haz_sitecol != self.sitecol: with self.monitor('assoc_assets_sites'): self.sitecol, self.assets_by_site = \ self.assoc_assets_sites(haz_sitecol.complete) ok_assets = self.count_assets() num_sites = len(self.sitecol) logging.warn('Associated %d assets to %d sites, %d discarded', ok_assets, num_sites, num_assets - ok_assets) elif (self.datastore.parent and 'exposure' in OqParam.from_(self.datastore.parent.attrs).inputs): logging.info('Re-using the already imported exposure') else: # no exposure self.sitecol = haz_sitecol # save mesh and asset collection self.save_mesh() if hasattr(self, 'assets_by_site'): self.assetcol = riskinput.build_asset_collection( self.assets_by_site, self.oqparam.time_event) spec = set(self.oqparam.specific_assets) unknown = spec - set(self.assetcol['asset_ref']) if unknown: raise ValueError('The specific asset(s) %s are not in the ' 'exposure' % ', '.join(unknown))
def read_exposure_sitecol(self): """ Read the exposure (if any) and then the site collection, possibly extracted from the exposure. """ if 'exposure' in self.oqparam.inputs: logging.info('Reading the exposure') with self.monitor('reading exposure', autoflush=True): self.exposure = readinput.get_exposure(self.oqparam) self.sitecol, self.assets_by_site = ( readinput.get_sitecol_assets(self.oqparam, self.exposure)) self.cost_types = self.exposure.cost_types self.taxonomies = numpy.array( sorted(self.exposure.taxonomies), '|S100') num_assets = self.count_assets() mesh = readinput.get_mesh(self.oqparam) if self.datastore.parent: parent_mesh = self.datastore.parent['sitemesh'].value if mesh is None: mesh = Mesh(parent_mesh['lon'], parent_mesh['lat']) if mesh is not None: sites = readinput.get_site_collection(self.oqparam, mesh) with self.monitor('assoc_assets_sites'): self.sitecol, self.assets_by_site = \ self.assoc_assets_sites(sites) ok_assets = self.count_assets() num_sites = len(self.sitecol) logging.warn('Associated %d assets to %d sites, %d discarded', ok_assets, num_sites, num_assets - ok_assets) if (self.is_stochastic and self.datastore.parent and self.datastore.parent['sitecol'] != self.sitecol): logging.warn( 'The hazard sites are different from the risk sites %s!=%s' % (self.datastore.parent['sitecol'], self.sitecol)) else: # no exposure logging.info('Reading the site collection') with self.monitor('reading site collection', autoflush=True): self.sitecol = readinput.get_site_collection(self.oqparam) # save mesh and asset collection self.save_mesh() if hasattr(self, 'assets_by_site'): self.assetcol = riskinput.build_asset_collection( self.assets_by_site, self.oqparam.time_event)
def read_exposure_sitecol(self): """ Read the exposure (if any) and then the site collection, possibly extracted from the exposure. """ inputs = self.oqparam.inputs if 'exposure' in inputs: logging.info('Reading the exposure') with self.monitor('reading exposure', autoflush=True): self.exposure = readinput.get_exposure(self.oqparam) self.sitecol, self.assets_by_site = ( readinput.get_sitecol_assets(self.oqparam, self.exposure)) self.cost_types = self.exposure.cost_types self.taxonomies = numpy.array( sorted(self.exposure.taxonomies), '|S100') num_assets = self.count_assets() if self.datastore.parent: haz_sitecol = self.datastore.parent['sitecol'] elif 'gmfs' in inputs: haz_sitecol = readinput.get_site_collection(self.oqparam) # TODO: think about the case hazard_curves in inputs else: haz_sitecol = None if haz_sitecol is not None and haz_sitecol != self.sitecol: with self.monitor('assoc_assets_sites'): self.sitecol, self.assets_by_site = \ self.assoc_assets_sites(haz_sitecol.complete) ok_assets = self.count_assets() num_sites = len(self.sitecol) logging.warn('Associated %d assets to %d sites, %d discarded', ok_assets, num_sites, num_assets - ok_assets) elif (self.datastore.parent and 'exposure' in self.datastore.parent['oqparam'].inputs): logging.info('Re-using the already imported exposure') else: # no exposure logging.info('Reading the site collection') with self.monitor('reading site collection', autoflush=True): self.sitecol = readinput.get_site_collection(self.oqparam) # save mesh and asset collection self.save_mesh() if hasattr(self, 'assets_by_site'): self.assetcol = riskinput.build_asset_collection( self.assets_by_site, self.oqparam.time_event)
def _info(name, filtersources, weightsources): if name in base.calculators: print(textwrap.dedent(base.calculators[name].__doc__.strip())) elif name == 'gsims': for gs in gsim.get_available_gsims(): print(gs) elif name.endswith('.xml'): print(nrml.read(name).to_str()) elif name.endswith(('.ini', '.zip')): oqparam = readinput.get_oqparam(name) if 'exposure' in oqparam.inputs: expo = readinput.get_exposure(oqparam) sitecol, assets_by_site = readinput.get_sitecol_assets( oqparam, expo) elif filtersources or weightsources: sitecol, assets_by_site = readinput.get_site_collection( oqparam), [] else: sitecol, assets_by_site = None, [] if 'source_model_logic_tree' in oqparam.inputs: print('Reading the source model...') if weightsources: sp = source.SourceFilterWeighter elif filtersources: sp = source.SourceFilter else: sp = source.BaseSourceProcessor # do nothing csm = readinput.get_composite_source_model(oqparam, sitecol, sp) assoc = csm.get_rlzs_assoc() dstore = datastore.Fake(vars(oqparam), rlzs_assoc=assoc, composite_source_model=csm, sitecol=sitecol) _print_info(dstore, filtersources, weightsources) if len(assets_by_site): assetcol = riskinput.build_asset_collection(assets_by_site) dic = groupby(assetcol, operator.attrgetter('taxonomy')) for taxo, num in dic.items(): print('taxonomy #%d, %d assets' % (taxo, num)) print('total assets = %d' % len(assetcol)) else: print("No info for '%s'" % name)
def _info(name, filtersources, weightsources): if name in base.calculators: print(textwrap.dedent(base.calculators[name].__doc__.strip())) elif name == 'gsims': for gs in gsim.get_available_gsims(): print(gs) elif name.endswith('.xml'): print(nrml.read(name).to_str()) elif name.endswith(('.ini', '.zip')): oqparam = readinput.get_oqparam(name) if 'exposure' in oqparam.inputs: expo = readinput.get_exposure(oqparam) sitecol, assets_by_site = readinput.get_sitecol_assets( oqparam, expo) elif filtersources or weightsources: sitecol, assets_by_site = readinput.get_site_collection( oqparam), [] else: sitecol, assets_by_site = None, [] if 'source_model_logic_tree' in oqparam.inputs: print('Reading the source model...') if weightsources: sp = source.SourceFilterWeighter elif filtersources: sp = source.SourceFilter else: sp = source.BaseSourceProcessor # do nothing csm = readinput.get_composite_source_model(oqparam, sitecol, sp) assoc = csm.get_rlzs_assoc() _print_info( dict(rlzs_assoc=assoc, oqparam=oqparam, composite_source_model=csm, sitecol=sitecol), filtersources, weightsources) if len(assets_by_site): assetcol = riskinput.build_asset_collection(assets_by_site) dic = groupby(assetcol, operator.attrgetter('taxonomy')) for taxo, num in dic.items(): print('taxonomy #%d, %d assets' % (taxo, num)) print('total assets = %d' % len(assetcol)) else: print("No info for '%s'" % name)
def _info(name, filtersources, weightsources): if name in base.calculators: print(textwrap.dedent(base.calculators[name].__doc__.strip())) elif name == "gsims": for gs in gsim.get_available_gsims(): print(gs) elif name.endswith(".xml"): print(nrml.read(name).to_str()) elif name.endswith((".ini", ".zip")): oqparam = readinput.get_oqparam(name) if "exposure" in oqparam.inputs: expo = readinput.get_exposure(oqparam) sitecol, assets_by_site = readinput.get_sitecol_assets(oqparam, expo) elif filtersources or weightsources: sitecol, assets_by_site = readinput.get_site_collection(oqparam), [] else: sitecol, assets_by_site = None, [] if "source_model_logic_tree" in oqparam.inputs: print("Reading the source model...") if weightsources: sp = source.SourceFilterWeighter elif filtersources: sp = source.SourceFilter else: sp = source.BaseSourceProcessor # do nothing csm = readinput.get_composite_source_model(oqparam, sitecol, sp) assoc = csm.get_rlzs_assoc() dstore = datastore.Fake(vars(oqparam), rlzs_assoc=assoc, composite_source_model=csm, sitecol=sitecol) _print_info(dstore, filtersources, weightsources) if len(assets_by_site): assetcol = riskinput.build_asset_collection(assets_by_site) dic = groupby(assetcol, operator.attrgetter("taxonomy")) for taxo, num in dic.items(): print("taxonomy #%d, %d assets" % (taxo, num)) print("total assets = %d" % len(assetcol)) else: print("No info for '%s'" % name)
def pre_execute(self): """ Read the precomputed ruptures (or compute them on the fly) and prepare some datasets in the datastore. """ super(EventBasedRiskCalculator, self).pre_execute() if not self.riskmodel: # there is no riskmodel, exit early self.execute = lambda: None self.post_execute = lambda result: None return oq = self.oqparam epsilon_sampling = oq.epsilon_sampling correl_model = readinput.get_correl_model(oq) gsims_by_col = self.rlzs_assoc.get_gsims_by_col() assets_by_site = self.assets_by_site # the following is needed to set the asset idx attribute self.assetcol = riskinput.build_asset_collection( assets_by_site, oq.time_event) logging.info('Populating the risk inputs') rup_by_tag = sum(self.datastore['sescollection'], AccumDict()) all_ruptures = [rup_by_tag[tag] for tag in sorted(rup_by_tag)] num_samples = min(len(all_ruptures), epsilon_sampling) eps_dict = riskinput.make_eps_dict( assets_by_site, num_samples, oq.master_seed, oq.asset_correlation) logging.info('Generated %d epsilons', num_samples * len(eps_dict)) self.epsilon_matrix = numpy.array( [eps_dict[a['asset_ref']] for a in self.assetcol]) self.riskinputs = list(self.riskmodel.build_inputs_from_ruptures( self.sitecol.complete, all_ruptures, gsims_by_col, oq.truncation_level, correl_model, eps_dict, oq.concurrent_tasks or 1)) logging.info('Built %d risk inputs', len(self.riskinputs)) # preparing empty datasets loss_types = self.riskmodel.loss_types self.L = len(loss_types) self.R = len(self.rlzs_assoc.realizations) self.outs = OUTPUTS self.datasets = {} self.monitor.oqparam = self.oqparam # ugly: attaching an attribute needed in the task function self.monitor.num_outputs = len(self.outs) # attaching two other attributes used in riskinput.gen_outputs self.monitor.assets_by_site = self.assets_by_site self.monitor.num_assets = N = self.count_assets() for o, out in enumerate(self.outs): self.datastore.hdf5.create_group(out) for l, loss_type in enumerate(loss_types): cb = self.riskmodel.curve_builders[l] build_curves = len(cb.ratios) for r, rlz in enumerate(self.rlzs_assoc.realizations): key = '/%s/rlz-%03d' % (loss_type, rlz.ordinal) if o in (ELT, ILT): # loss tables dset = self.datastore.create_dset(out + key, elt_dt) else: # risk curves if not build_curves: continue dset = self.datastore.create_dset( out + key, cb.poes_dt, N) self.datasets[o, l, r] = dset if o in (FRC, IRC) and build_curves: grp = self.datastore['%s/%s' % (out, loss_type)] grp.attrs['loss_ratios'] = cb.ratios
def pre_execute(self): """ Read the precomputed ruptures (or compute them on the fly) and prepare some datasets in the datastore. """ super(EventBasedRiskCalculator, self).pre_execute() if not self.riskmodel: # there is no riskmodel, exit early self.execute = lambda: None self.post_execute = lambda result: None return oq = self.oqparam epsilon_sampling = oq.epsilon_sampling correl_model = readinput.get_correl_model(oq) gsims_by_col = self.rlzs_assoc.get_gsims_by_col() assets_by_site = self.assets_by_site # the following is needed to set the asset idx attribute self.assetcol = riskinput.build_asset_collection( assets_by_site, oq.time_event) logging.info('Populating the risk inputs') rup_by_tag = sum(self.datastore['sescollection'], AccumDict()) all_ruptures = [rup_by_tag[tag] for tag in sorted(rup_by_tag)] num_samples = min(len(all_ruptures), epsilon_sampling) eps_dict = riskinput.make_eps_dict(assets_by_site, num_samples, oq.master_seed, oq.asset_correlation) logging.info('Generated %d epsilons', num_samples * len(eps_dict)) self.epsilon_matrix = numpy.array( [eps_dict[a['asset_ref']] for a in self.assetcol]) self.riskinputs = list( self.riskmodel.build_inputs_from_ruptures( self.sitecol.complete, all_ruptures, gsims_by_col, oq.truncation_level, correl_model, eps_dict, oq.concurrent_tasks or 1)) logging.info('Built %d risk inputs', len(self.riskinputs)) # preparing empty datasets loss_types = self.riskmodel.loss_types self.L = len(loss_types) self.R = len(self.rlzs_assoc.realizations) self.outs = OUTPUTS self.datasets = {} self.monitor.oqparam = self.oqparam # ugly: attaching an attribute needed in the task function self.monitor.num_outputs = len(self.outs) # attaching two other attributes used in riskinput.gen_outputs self.monitor.assets_by_site = self.assets_by_site self.monitor.num_assets = N = self.count_assets() for o, out in enumerate(self.outs): self.datastore.hdf5.create_group(out) for l, loss_type in enumerate(loss_types): cb = self.riskmodel.curve_builders[l] build_curves = len(cb.ratios) for r, rlz in enumerate(self.rlzs_assoc.realizations): key = '/%s/rlz-%03d' % (loss_type, rlz.ordinal) if o in (ELT, ILT): # loss tables dset = self.datastore.create_dset(out + key, elt_dt) else: # risk curves if not build_curves: continue dset = self.datastore.create_dset( out + key, cb.poes_dt, N) self.datasets[o, l, r] = dset if o in (FRC, IRC) and build_curves: grp = self.datastore['%s/%s' % (out, loss_type)] grp.attrs['loss_ratios'] = cb.ratios
def pre_execute(self): """ Read the precomputed ruptures (or compute them on the fly) and prepare some datasets in the datastore. """ super(EventBasedRiskCalculator, self).pre_execute() if not self.riskmodel: # there is no riskmodel, exit early self.execute = lambda: None self.post_execute = lambda result: None return oq = self.oqparam if self.riskmodel.covs: epsilon_sampling = oq.epsilon_sampling else: epsilon_sampling = 1 # only one ignored epsilon correl_model = readinput.get_correl_model(oq) gsims_by_col = self.rlzs_assoc.get_gsims_by_col() assets_by_site = self.assets_by_site # the following is needed to set the asset idx attribute self.assetcol = riskinput.build_asset_collection( assets_by_site, oq.time_event) self.spec_indices = numpy.array( [a['asset_ref'] in oq.specific_assets for a in self.assetcol]) logging.info('Populating the risk inputs') rup_by_tag = sum(self.datastore['sescollection'], AccumDict()) all_ruptures = [rup_by_tag[tag] for tag in sorted(rup_by_tag)] for i, rup in enumerate(all_ruptures): rup.ordinal = i num_samples = min(len(all_ruptures), epsilon_sampling) self.epsilon_matrix = eps = riskinput.make_eps(assets_by_site, num_samples, oq.master_seed, oq.asset_correlation) logging.info('Generated %d epsilons', num_samples * len(eps)) self.riskinputs = list( self.riskmodel.build_inputs_from_ruptures( self.sitecol.complete, all_ruptures, gsims_by_col, oq.truncation_level, correl_model, eps, oq.concurrent_tasks or 1)) logging.info('Built %d risk inputs', len(self.riskinputs)) # preparing empty datasets loss_types = self.riskmodel.loss_types self.L = len(loss_types) self.R = len(self.rlzs_assoc.realizations) self.outs = OUTPUTS self.datasets = {} # ugly: attaching an attribute needed in the task function self.monitor.num_outputs = len(self.outs) self.monitor.num_assets = self.count_assets() for o, out in enumerate(self.outs): self.datastore.hdf5.create_group(out) for l, loss_type in enumerate(loss_types): for r, rlz in enumerate(self.rlzs_assoc.realizations): key = '/%s/%s' % (loss_type, rlz.uid) if o == AGGLOSS: # loss tables dset = self.datastore.create_dset(out + key, elt_dt) elif o == SPECLOSS: # specific losses dset = self.datastore.create_dset(out + key, ela_dt) self.datasets[o, l, r] = dset