def save_disagg_results(self, results): """ Save the computed PMFs in the datastore :param results: a dict s, m, k -> 6D-matrix of shape (T, Ma, Lo, La, P, Z) or (T, Ma, D, E, P, Z) depending if k is 0 or k is 1 """ oq = self.oqparam out = output_dict(self.shapedic, oq.disagg_outputs) count = numpy.zeros(len(self.sitecol), U16) _disagg_trt = numpy.zeros(self.N, [(trt, float) for trt in self.trts]) vcurves = [] # hazard curves with a vertical section for large poes for (s, m, k), mat6 in sorted(results.items()): # NB: k is an index with value 0 (MagDistEps) or 1 (MagLonLat) imt = self.imts[m] for p, poe in enumerate(self.poes_disagg): mat5 = mat6[..., p, :] if k == 0 and m == 0 and poe == self.poes_disagg[-1]: # mat5 has shape (T, Ma, D, E, Z) _disagg_trt[s] = tuple(pprod(mat5[..., 0], axis=(1, 2, 3))) poe2 = pprod(mat5, axis=(0, 1, 2, 3)) self.datastore['poe4'][s, m, p] = poe2 # shape Z poe_agg = poe2.mean() if (poe and abs(1 - poe_agg / poe) > .1 and not count[s] and self.hmap4[s, m, p].any()): logging.warning( 'Site #%d, IMT=%s: poe_agg=%s is quite different from ' 'the expected poe=%s, perhaps not enough levels', s, imt, poe_agg, poe) vcurves.append(self.curves[s]) count[s] += 1 mat4 = agg_probs(*mat5) # shape (Ma D E Z) or (Ma Lo La Z) for key in oq.disagg_outputs: if key == 'Mag' and k == 0: out[key][s, m, p, :] = pprod(mat4, axis=(1, 2)) elif key == 'Dist' and k == 0: out[key][s, m, p, :] = pprod(mat4, axis=(0, 2)) elif key == 'TRT' and k == 0: out[key][s, m, p, :] = pprod(mat5, axis=(1, 2, 3)) elif key == 'Mag_Dist' and k == 0: out[key][s, m, p, :] = pprod(mat4, axis=2) elif key == 'Mag_Dist_Eps' and k == 0: out[key][s, m, p, :] = mat4 elif key == 'Lon_Lat' and k == 1: out[key][s, m, p, :] = pprod(mat4, axis=0) elif key == 'Mag_Lon_Lat' and k == 1: out[key][s, m, p, :] = mat4 elif key == 'Lon_Lat_TRT' and k == 1: out[key][s, m, p, :] = pprod(mat5, axis=1).transpose( 1, 2, 0, 3) # T Lo La Z -> Lo La T Z # shape NMP..Z self.datastore['disagg'] = out # below a dataset useful for debugging, at minimum IMT and maximum RP self.datastore['_disagg_trt'] = _disagg_trt if len(vcurves): NML1 = len(vcurves), self.M, oq.imtls.size // self.M self.datastore['_vcurves'] = numpy.array(vcurves).reshape(NML1) self.datastore['_vcurves'].attrs['sids'] = numpy.where(count)[0]
def save_disagg_results(self, results, out): """ Save the computed PMFs in the datastore :param results: a dict s -> 9D-matrix of shape (T, Ma, D, Lo, La, E, M, P, Z) :para out: a dict kind -> PMF matrix to be populated """ outputs = self.oqparam.disagg_outputs for s, mat9 in results.items(): if s not in self.ok_sites: continue for p, poe in enumerate(self.poes_disagg): mat8 = mat9[..., p, :] poe2 = pprod(mat8, axis=(0, 1, 2, 3, 4, 5)) self.datastore['poe4'][s, :, p] = poe2 # shape (M, Z) poe_agg = poe2.mean() if poe and abs(1 - poe_agg / poe) > .1: logging.warning( 'Site #%d: poe_agg=%s is quite different from the ' 'expected poe=%s; perhaps the number of intensity ' 'measure levels is too small?', s, poe_agg, poe) for m, imt in enumerate(self.imts): mat7 = mat8[..., m, :] mat6 = agg_probs(*mat7) # 6D for key in outputs: pmf = disagg.pmf_map[key]( mat7 if key.endswith('TRT') else mat6) out[key][s, m, p, :] = pmf
def check_disagg_by_src(dstore): """ Make sure that by composing disagg_by_src one gets the hazard curves """ mean = dstore.sel('hcurves-stats', stat='mean')[:, 0] # N, M, L dbs = dstore.sel('disagg_by_src') # N, R, M, L, Ns poes = general.pprod(dbs, axis=4) # N, R, M, L weights = dstore['weights'][:] mean2 = numpy.einsum('sr...,r->s...', poes, weights) # N, M, L aac(mean, mean2, atol=1E-6)
def output(mat6): """ :param mat6: a 6D matrix with axis (D, Lo, La, E, P, Z) :returns: two matrices of shape (D, E, P, Z) and (Lo, La, P, Z) """ return pprod(mat6, axis=(1, 2)), pprod(mat6, axis=(0, 3))