def test_disttype(self, bmds3_complete_continuous):

        data = deepcopy(bmds3_complete_continuous)
        data["models"] = {
            "frequentist_restricted": ["Hill", "Linear", "Power"],
        }

        # normal
        data["options"][0]["dist_type"] = 1
        session = AnalysisSession.create(data, 0, 0)
        assert len(session.frequentist.models) == 3
        names = [model.name() for model in session.frequentist.models]
        assert names == ["Hill", "Linear", "Power"]

        data["options"][0]["dist_type"] = 2
        session = AnalysisSession.create(data, 0, 0)
        assert len(session.frequentist.models) == 3
        names = [model.name() for model in session.frequentist.models]
        assert names == ["Hill", "Linear", "Power"]

        # lognormal
        data["options"][0]["dist_type"] = 3
        session = AnalysisSession.create(data, 0, 0)
        assert len(session.frequentist.models) == 1
        names = [model.name() for model in session.frequentist.models]
        assert names == ["Hill"]
 def test_default_continuous_individual(
         self, bmds3_complete_continuous_individual):
     # assure a default dataset can be created
     data = deepcopy(bmds3_complete_continuous_individual)
     session = AnalysisSession.create(data, 0, 0)
     assert len(session.frequentist.models) == 1
     assert len(session.bayesian.models) == 1
    def test_polynomial_unpacking(self, bmds3_complete_continuous):
        # test linear; degree 0
        data = deepcopy(bmds3_complete_continuous)
        data["models"] = {"frequentist_unrestricted": ["Linear"]}
        data["dataset_options"][0]["degree"] = 0
        session = AnalysisSession.create(data, 0, 0)
        assert len(session.frequentist.models) == 1
        assert session.frequentist.models[0].settings.degree == 1
        assert session.bayesian is None

        # test polynomial; degree 2
        data = deepcopy(bmds3_complete_continuous)
        data["models"] = {"frequentist_unrestricted": ["Polynomial"]}
        data["dataset_options"][0]["degree"] = 2
        session = AnalysisSession.create(data, 0, 0)
        assert len(session.frequentist.models) == 1
        assert session.frequentist.models[0].settings.degree == 2
        assert session.bayesian is None

        # test polynomial; degree 3
        data = deepcopy(bmds3_complete_continuous)
        data["models"] = {"frequentist_unrestricted": ["Polynomial"]}
        data["dataset_options"][0]["degree"] = 3
        session = AnalysisSession.create(data, 0, 0)
        assert len(session.frequentist.models) == 2
        assert session.frequentist.models[0].settings.degree == 2
        assert session.frequentist.models[1].settings.degree == 3
        assert session.bayesian is None

        # test linear + polynomial; degree 3
        data = deepcopy(bmds3_complete_continuous)
        data["models"] = {"frequentist_unrestricted": ["Linear", "Polynomial"]}
        data["dataset_options"][0]["degree"] = 3
        session = AnalysisSession.create(data, 0, 0)
        assert len(session.frequentist.models) == 3
        assert session.frequentist.models[0].settings.degree == 1
        assert session.frequentist.models[1].settings.degree == 2
        assert session.frequentist.models[2].settings.degree == 3
        assert session.bayesian is None
 def test_exponential_unpacking(self, bmds3_complete_continuous):
     data = deepcopy(bmds3_complete_continuous)
     data["models"] = {
         "frequentist_restricted": ["Exponential"],
         "bayesian": [{
             "model": "Exponential",
             "prior_weight": 1
         }],
     }
     session = AnalysisSession.create(data, 0, 0)
     assert len(session.frequentist.models) == 2
     assert session.frequentist.models[
         0].bmd_model_class.id == ContinuousModelIds.c_exp_m3
     assert session.frequentist.models[
         1].bmd_model_class.id == ContinuousModelIds.c_exp_m5
     assert len(session.bayesian.models) == 2
     assert session.bayesian.models[
         0].bmd_model_class.id == ContinuousModelIds.c_exp_m3
     assert session.bayesian.models[
         1].bmd_model_class.id == ContinuousModelIds.c_exp_m5
    def test_prior_classes(self, bmds3_complete_dichotomous):
        # assure a default dataset can be created
        data = deepcopy(bmds3_complete_dichotomous)
        data["models"] = {
            "frequentist_restricted": ["Gamma"],
            "frequentist_unrestricted": ["Gamma"],
            "bayesian": [{
                "model": "Gamma",
                "prior_weight": 1
            }],
        }
        session = AnalysisSession.create(data, 0, 0)
        assert len(session.frequentist.models) == 2
        assert len(session.bayesian.models) == 1

        assert (session.frequentist.models[0].settings.priors.prior_class is
                PriorClass.frequentist_restricted)
        assert (session.frequentist.models[1].settings.priors.prior_class is
                PriorClass.frequentist_unrestricted)
        assert session.bayesian.models[
            0].settings.priors.prior_class is PriorClass.bayesian
 def test_default_dichotomous(self, bmds3_complete_dichotomous):
     # assure a default dataset can be created
     data = deepcopy(bmds3_complete_dichotomous)
     session = AnalysisSession.create(data, 0, 0)
     assert len(session.frequentist.models) == 1
     assert len(session.bayesian.models) == 1
    def test_multistage_permutations(self, bmds3_complete_dichotomous):
        def _expected_degree(session, n: int):
            assert session.bayesian is None
            assert len(session.frequentist.models) == n
            model_classes = set([
                model.bmd_model_class.id
                for model in session.frequentist.models
            ])
            assert model_classes == {DichotomousModelIds.d_multistage}
            degrees = set([
                model.settings.degree for model in session.frequentist.models
            ])
            assert degrees == set(list(range(1, n + 1)))

        # degree = 1
        data = deepcopy(bmds3_complete_dichotomous)
        data["models"] = {"frequentist_restricted": ["Multistage"]}
        data["dataset_options"][0]["degree"] = 1
        session = AnalysisSession.create(data, 0, 0)
        _expected_degree(session, 1)

        # degree = 2
        data = deepcopy(bmds3_complete_dichotomous)
        data["models"] = {"frequentist_restricted": ["Multistage"]}
        data["dataset_options"][0]["degree"] = 2
        session = AnalysisSession.create(data, 0, 0)
        _expected_degree(session, 2)

        # 3 dose-groups; degree = N-1; expected 2
        for num_doses in range(3, 8):
            expected_degree = min(max(num_doses - 1, 2), 8)
            data = deepcopy(bmds3_complete_dichotomous)
            data["datasets"] = [{
                "dtype": "D",
                "metadata": {
                    "id": 123
                },
                "doses": list(range(num_doses)),
                "ns": [10] * num_doses,
                "incidences": list(range(1, num_doses + 1)),
            }]
            assert len(data["datasets"][0]["doses"]) == num_doses
            data["models"] = {"frequentist_restricted": ["Multistage"]}
            data["dataset_options"][0]["degree"] = 0  # n-1
            session = AnalysisSession.create(data, 0, 0)
            print(f"{num_doses=} {expected_degree=}")
            _expected_degree(session, expected_degree)

        # degree = N -1, bayesian, fixed at degree == 2
        data = deepcopy(bmds3_complete_dichotomous)
        data["models"] = {
            "bayesian": [{
                "model": "Multistage",
                "prior_weight": 1
            }]
        }
        data["dataset_options"][0]["degree"] = 0
        session = AnalysisSession.create(data, 0, 0)
        assert session.frequentist is None
        assert len(session.bayesian.models) == 1
        model = session.bayesian.models[0]
        assert model.bmd_model_class.id == DichotomousModelIds.d_multistage
        assert model.settings.degree == 2