Beispiel #1
0
def test_SmoothingPrior__global_eta():
    # Non-log distributions shouldn't get the global eta
    f = DummyForm({
        "eta": {
            "priors": 0.001,
            "data": 0.001
        },
        "prior": {
            "prior_type": "value",
            "density": "uniform",
            "min": 0,
            "max": 10
        },
    })
    f.validate_and_normalize()
    assert f.prior.prior_object == priors.Uniform(0, 10)

    # But log distributions which don't have their own eta should
    f = DummyForm({
        "eta": {
            "priors": 0.001,
            "data": 0.001
        },
        "prior": {
            "prior_type": "value",
            "density": "log_gaussian",
            "mean": 0,
            "std": 0.01
        },
    })
    f.validate_and_normalize()
    assert f.prior.prior_object == priors.LogGaussian(0, 0.01, eta=0.001)

    # But if they do have their own eta, they shouldn't
    f = DummyForm({
        "eta": {
            "priors": 0.001,
            "data": 0.001
        },
        "prior": {
            "prior_type": "value",
            "density": "log_gaussian",
            "mean": 0,
            "std": 0.01,
            "eta": 0.002
        },
    })
    f.validate_and_normalize()
    assert f.prior.prior_object == priors.LogGaussian(0, 0.01, eta=0.002)
Beispiel #2
0
def test_SmoothingPrior__full_form_validation__success():
    f = DummyForm({
        "prior": {
            "prior_type": "value",
            "density": "uniform",
            "min": 0,
            "max": 10
        }
    })
    assert not f.validate_and_normalize()
    assert f.prior.prior_object == priors.Uniform(0, 10)

    f = DummyForm({
        "prior": {
            "prior_type": "value",
            "density": "log_gaussian",
            "mean": 0,
            "std": 1,
            "eta": 1
        }
    })
    assert not f.validate_and_normalize()
    assert f.prior.prior_object == priors.LogGaussian(0, 1, 1)
    def _full_form_validation(self, root):
        errors = []

        if not self.is_field_unset("age_lower") and not self.is_field_unset(
                "age_lower"):
            if self.age_lower > self.age_upper:
                errors.append(
                    "age_lower must be less than or equal to age_upper")
        if not self.is_field_unset("time_lower") and not self.is_field_unset(
                "time_lower"):
            if self.time_lower > self.time_upper:
                errors.append(
                    "time_lower must be less than or equal to time_upper")

        try:
            lower = self.min
            upper = self.max
            mean = self.mean
            if mean is None and (np.isinf(lower) or np.isinf(upper)):
                mean = max(lower, 0)
            std = self.std

            if self.nu is None:
                if self.density == "students" and not root.is_field_unset(
                        "students_dof"):
                    nu = root.students_dof.priors
                elif self.density == "log_students" and not root.is_field_unset(
                        "log_students_dof"):
                    nu = root.log_students_dof.priors
                else:
                    nu = None
            else:
                nu = self.nu

            if self.eta is None:
                if not root.is_field_unset("eta"):
                    eta = root.eta.priors
                else:
                    eta = None
            else:
                eta = self.eta

            if self.density == "uniform":
                self.prior_object = priors.Uniform(lower, upper, mean)
            elif self.density == "gaussian":
                self.prior_object = priors.Gaussian(mean, std, lower, upper)
            elif self.density == "laplace":
                self.prior_object = priors.Laplace(mean, std, lower, upper)
            elif self.density == "students":
                self.prior_object = priors.StudentsT(mean, std, nu, lower,
                                                     upper)
            elif self.density == "log_gaussian":
                self.prior_object = priors.LogGaussian(mean, std, eta, lower,
                                                       upper)
            elif self.density == "log_laplace":
                self.prior_object = priors.LogLaplace(mean, std, eta, lower,
                                                      upper)
            elif self.density == "log_students":
                self.prior_object = priors.LogStudentsT(
                    mean, std, nu, eta, lower, upper)
            else:
                errors.append(f"Unknown density '{self.density}'")
        except priors.PriorError as e:
            errors.append(f"Parameters incompatible with density '"
                          f"{self.density}': {str(e)}")

        return errors