def sample_damage_interval(self, dmg, damage_interval_keys, num_samples, seed): """ Dylan Sanderson code to calculate the Monte Carlo simulations of damage state. Args: dmg (dict): Damage results that contains dmg interval values. damage_interval_keys (list): Keys of the damage states. num_samples (int): Number of simulation. seed (int): Random number generator seed for reproducibility. Returns: dict: A dictionary of damage states. """ ds = {} random_generator = np.random.RandomState(seed) for i in range(num_samples): # each sample should have a unique seed rnd_num = random_generator.uniform(0, 1) prob_val = 0 flag = True for ds_name in damage_interval_keys: if rnd_num < prob_val + AnalysisUtil.float_to_decimal( dmg[ds_name]): ds['sample_{}'.format(i)] = ds_name flag = False break else: prob_val += AnalysisUtil.float_to_decimal(dmg[ds_name]) if flag: print("cannot determine MC damage state!") return ds
def test_fragility_set_small_overlap(): fragility_set = get_fragility_set("fragility_curve.json") # Test Case 1 - single overlap limit_states = collections.OrderedDict([("LS_0", 0.9692754643), ("LS_1", 0.0001444974), ("LS_2", 0.0004277083)]) limit_states = AnalysisUtil.float_dict_to_decimal(limit_states) damage_states = fragility_set._3ls_to_4ds(limit_states) assert damage_states['DS_0'] == AnalysisUtil.float_to_decimal(0.0307245357) and \ damage_states['DS_1'] == AnalysisUtil.float_to_decimal(0.968847756) and \ damage_states['DS_2'] == AnalysisUtil.float_to_decimal(0.0) and \ damage_states['DS_3'] == AnalysisUtil.float_to_decimal(0.0004277083) # Test Case 2 - double overlap limit_states = collections.OrderedDict([("LS_0", 0.12), ("LS_1", 0.64), ("LS_2", 0.8)]) limit_states = AnalysisUtil.float_dict_to_decimal(limit_states) damage_states = fragility_set._3ls_to_4ds(limit_states) assert damage_states['DS_0'] == AnalysisUtil.float_to_decimal(0.2) and \ damage_states['DS_1'] == AnalysisUtil.float_to_decimal(0.0) and \ damage_states['DS_2'] == AnalysisUtil.float_to_decimal(0.0) and \ damage_states['DS_3'] == AnalysisUtil.float_to_decimal(0.8)