def test_pnormdistance():
    abc = MockABC([{
        's1': -1,
        's2': -1,
        's3': -1
    }, {
        's1': -1,
        's2': 0,
        's3': 1
    }])
    x_0 = {'s1': 0, 's2': 0, 's3': 1}

    # first test that for PNormDistance, the weights stay constant
    dist_f = PNormDistance()
    dist_f.initialize(0, abc.sample_from_prior, x_0=x_0)

    # call distance function, also to initialize w
    d = dist_f(abc.sample_from_prior()[0], abc.sample_from_prior()[1], t=0)

    expected = pow(1**2 + 2**2, 1 / 2)
    assert expected == d

    assert sum(
        abs(a - b)
        for a, b in zip(list(dist_f.weights[0].values()), [1, 1, 1])) < 0.01
Beispiel #2
0
def test_pnormdistance():
    abc = MockABC([{
        's1': -1,
        's2': -1,
        's3': -1
    }, {
        's1': -1,
        's2': 0,
        's3': 1
    }])
    x_0 = {'s1': 0, 's2': 0, 's3': 1}

    # first test that for PNormDistance, the weights stay constant
    dist_f = PNormDistance(p=2)
    dist_f.initialize(0, abc.sample_from_prior, x_0=x_0, total_sims=0)

    # call distance function, also to initialize w
    d = dist_f(abc.sumstats[0], abc.sumstats[1], t=0)

    expected = pow(0**2 + 1**2 + 2**2, 1 / 2)
    assert expected == d

    assert dist_f.fixed_weights[0] == 1

    # maximum norm
    dist_f = PNormDistance(p=np.inf)
    dist_f.initialize(0, abc.sample_from_prior, x_0=x_0, total_sims=0)
    d = dist_f(abc.sumstats[0], abc.sumstats[1], t=0)
    assert d == 2
Beispiel #3
0
    def __init__(
            self,
            models: Union[List[Model], Model, Callable],
            parameter_priors: Union[List[Distribution],
                                    Distribution, Callable],
            distance_function: Union[Distance, Callable] = None,
            population_size: Union[PopulationStrategy, int] = 100,
            summary_statistics: Callable[[model_output], dict] = identity,
            model_prior: RV = None,
            model_perturbation_kernel: ModelPerturbationKernel = None,
            transitions: Union[List[Transition], Transition] = None,
            eps: Epsilon = None,
            sampler: Sampler = None,
            acceptor: Acceptor = None,
            stop_if_only_single_model_alive: bool = False,
            max_nr_recorded_particles: int = np.inf):
        if not isinstance(models, list):
            models = [models]
        models = list(map(SimpleModel.assert_model, models))
        self.models = models

        if not isinstance(parameter_priors, list):
            parameter_priors = [parameter_priors]
        self.parameter_priors = parameter_priors

        # sanity checks
        if len(self.models) != len(self.parameter_priors):
            raise AssertionError(
                "Number models and number parameter priors have to agree.")

        if distance_function is None:
            distance_function = PNormDistance()
        self.distance_function = to_distance(distance_function)

        self.summary_statistics = summary_statistics

        if model_prior is None:
            model_prior = RV("randint", 0, len(self.models))
        self.model_prior = model_prior

        if model_perturbation_kernel is None:
            model_perturbation_kernel = ModelPerturbationKernel(
                len(self.models), probability_to_stay=.7)
        self.model_perturbation_kernel = model_perturbation_kernel

        if transitions is None:
            transitions = [MultivariateNormalTransition()
                           for _ in self.models]
        if not isinstance(transitions, list):
            transitions = [transitions]
        self.transitions = transitions  # type: List[Transition]

        if eps is None:
            eps = MedianEpsilon(median_multiplier=1)
        self.eps = eps

        if isinstance(population_size, int):
            population_size = ConstantPopulationSize(
                population_size)
        self.population_size = population_size

        if sampler is None:
            sampler = DefaultSampler()
        self.sampler = sampler

        if acceptor is None:
            acceptor = UniformAcceptor()
        self.acceptor = SimpleFunctionAcceptor.assert_acceptor(acceptor)

        self.stop_if_only_single_model_alive = stop_if_only_single_model_alive
        self.max_nr_recorded_particles = max_nr_recorded_particles

        # will be set later
        self.x_0 = None
        self.history = None
        self._initial_population = None
        self.minimum_epsilon = None
        self.max_nr_populations = None
        self.min_acceptance_rate = None

        self._sanity_check()