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
Beispiel #2
0
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)