Example #1
0
    def generate(self, realnums, parameters, seedvalues, corrdict):
        """Generates parameter values by drawing from
        defined distributions.

        Args:
            realnums (list): list of intergers with realization numbers
            parameters (OrderedDict):
                dictionary of parameters and distributions
            seeds (str): default or None
            corrdict(OrderedDict): correlation info
        """
        self.sensvalues = pd.DataFrame(columns=parameters.keys(),
                                       index=realnums)
        numreals = len(realnums)
        if corrdict is None:
            for key in parameters.keys():
                dist_name = parameters[key][0].lower()
                dist_params = parameters[key][1]
                try:
                    self.sensvalues[key] = design_dist.draw_values(
                        dist_name, dist_params, numreals)
                except ValueError as error:
                    raise ValueError(
                        "Problem with parameter {} in sensitivity "
                        "with sensname {}: {}.".format(key, self.sensname,
                                                       error.args[0]))
        else:  # Some or all parameters are correlated
            df_params = pd.DataFrame.from_dict(
                parameters,
                orient="index",
                columns=["dist_name", "dist_params", "corr_sheet"],
            )
            df_params["corr_sheet"].fillna("nocorr", inplace=True)
            df_params.reset_index(inplace=True)
            df_params.rename(columns={"index": "param_name"}, inplace=True)
            param_groups = df_params.groupby(["corr_sheet"])

            for correl, group in param_groups:
                param_dict = OrderedDict()
                for index, row in group.iterrows():
                    param_dict[row["param_name"]] = [
                        row["dist_name"],
                        row["dist_params"],
                    ]
                if not correl == "nocorr":
                    if len(group) == 1:
                        _printwarning(correl)
                    df_correlations = design_dist.read_correlations(
                        corrdict, correl)
                    multivariate_parameters = df_correlations.index.values
                    cov_matrix = design_dist.make_covariance_matrix(
                        df_correlations)
                    normalscoremeans = len(multivariate_parameters) * [0]
                    normalscoresamples = numpy.random.multivariate_normal(
                        normalscoremeans, cov_matrix, size=numreals)
                    normalscoresamples_df = pd.DataFrame(
                        data=normalscoresamples,
                        columns=multivariate_parameters)
                    for key in param_dict.keys():
                        dist_name = param_dict[key][0].lower()
                        dist_parameters = param_dict[key][1]
                        if key in multivariate_parameters:
                            try:
                                self.sensvalues[key] = design_dist.draw_values(
                                    dist_name,
                                    dist_parameters,
                                    numreals,
                                    normalscoresamples_df[key],
                                )
                            except ValueError as error:
                                raise ValueError("Problem in sensitivity "
                                                 "with sensname {} for "
                                                 "parameter {}: {}.".format(
                                                     self.sensname, key,
                                                     error.args[0]))
                        else:
                            raise ValueError(
                                "Parameter{} specified with correlation "
                                "matrix {} but is not listed in "
                                "that sheet".format(key, correl))
                else:  # group nocorr where correlation matrix is not defined
                    for key in param_dict.keys():
                        dist_name = param_dict[key][0].lower()
                        dist_parameters = param_dict[key][1]
                        try:
                            self.sensvalues[key] = design_dist.draw_values(
                                dist_name, dist_parameters, numreals)
                        except ValueError as error:
                            raise ValueError("Problem in sensitivity "
                                             "with sensname {} for parameter "
                                             "{}: {}.".format(
                                                 self.sensname, key,
                                                 error.args[0]))

        if self.sensname != "background":
            self.sensvalues["REAL"] = realnums
            self.sensvalues["SENSNAME"] = self.sensname
            self.sensvalues["SENSCASE"] = "p10_p90"
            if "RMS_SEED" not in self.sensvalues.keys() and seedvalues:
                self.sensvalues["RMS_SEED"] = seedvalues[:len(realnums)]
Example #2
0
def test_draw_values():
    """Test the wrapper function for drawing values"""

    values = dists.draw_values("unif", [0, 1], 10)
    assert len(values) == 10
    assert all([isinstance(value, numbers.Number) for value in values])
    assert all([0 <= value <= 1 for value in values])

    values = dists.draw_values("UNIF", [0, 1], 10)
    assert len(values) == 10

    values = dists.draw_values("unifORM", [0, 1], 10)
    assert len(values) == 10

    values = dists.draw_values("UnifORMgarbagestillworks", [0, 1], 10)
    assert len(values) == 10

    with pytest.raises(ValueError):
        dists.draw_values("non-existing-distribution", [0, 10], 100)

    values = dists.draw_values("NORMAL", [0, 1], 10)
    assert len(values) == 10

    values = dists.draw_values("LOGNORMAL", [0.1, 1], 10)
    assert len(values) == 10

    values = dists.draw_values("Pert", [0.1, 1, 10], 10)
    assert len(values) == 10

    values = dists.draw_values("triangular", [0.1, 1, 10], 10)
    assert len(values) == 10

    values = dists.draw_values("logunif", [0.1, 1], 10)
    assert len(values) == 10