Пример #1
0
def test_store_weights():
    """Test whether storing distance weights works."""
    abc = MockABC([{'s1': -1, 's2': -1, 's3': -1},
                   {'s1': -1, 's2': 0, 's3': 1}])
    x_0 = {'s1': 0, 's2': 0, 's3': 1}

    weights_file = tempfile.mkstemp(suffix=".json")[1]
    print(weights_file)

    def distance0(x, x_0):
        return abs(x['s1'] - x_0['s1'])

    def distance1(x, x_0):
        return np.sqrt((x['s2'] - x_0['s2'])**2)

    for distance in [AdaptivePNormDistance(log_file=weights_file),
                     AdaptiveAggregatedDistance(
                         [distance0, distance1], log_file=weights_file)]:
        distance.initialize(0, abc.sample_from_prior, x_0=x_0)
        distance.update(1, abc.sample_from_prior)
        distance.update(2, abc.sample_from_prior)

        weights = load_dict_from_json(weights_file)
        assert set(weights.keys()) == {0, 1, 2}

        expected = distance.weights
        for key, val in expected.items():
            if isinstance(val, np.ndarray):
                expected[key] = val.tolist()
        assert weights == expected
Пример #2
0
def test_adaptiveaggregateddistance():
    abc = MockABC([{'s0': -1, 's1': -1}, {'s0': -1, 's1': 0}])
    x_0 = {'s0': 0, 's1': 0}

    def distance0(x, x_0):
        return abs(x['s0'] - x_0['s0'])

    def distance1(x, x_0):
        return np.sqrt((x['s1'] - x_0['s1'])**2)

    scale_functions = [span, mean, median]
    for scale_function in scale_functions:
        distance = AdaptiveAggregatedDistance([distance0, distance1],
                                              scale_function=scale_function)
        distance.initialize(0, abc.sample_from_prior, x_0=x_0, total_sims=0)
        val = distance(abc.sumstats[0], abc.sumstats[1], t=0)
        assert isinstance(val, float)
        assert (distance.weights[0] != [1, 1]).any()
Пример #3
0
def test_adaptiveaggregateddistance_calibration():
    abc = MockABC([{'s0': -1, 's1': -1}, {'s0': -1, 's1': 0}])
    x_0 = {'s0': 0, 's1': 0}

    def distance0(x, x_0):
        return abs(x['s0'] - x_0['s0'])

    def distance1(x, x_0):
        return np.sqrt((x['s1'] - x_0['s1'])**2)

    scale_functions = [span, mean, median]
    initial_weights = np.array([2, 3])
    for scale_function in scale_functions:
        distance = AdaptiveAggregatedDistance(
            [distance0, distance1],
            scale_function=scale_function,
            initial_weights=initial_weights,
        )
        distance.initialize(0, abc.sample_from_prior, x_0=x_0, total_sims=0)
        val = distance(abc.sumstats[0], abc.sumstats[1], t=0)
        assert isinstance(val, float)
        assert (distance.weights[0] == initial_weights).all()
        distance.update(1, abc.sample_from_prior, total_sims=0)
        assert (distance.weights[1] != distance.weights[0]).all()