コード例 #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['s0'] - x_0['s0'])

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

    for distance in [
            AdaptivePNormDistance(log_file=weights_file),
            AdaptiveAggregatedDistance([distance0, distance1],
                                       log_file=weights_file)
    ]:
        distance = AdaptivePNormDistance(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}
        assert weights == distance.weights
コード例 #2
0
ファイル: test_distance.py プロジェクト: ICB-DCM/pyABC
def test_adaptivepnormdistance_initial_weights():
    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
    initial_weights = {'s1': 1, 's2': 2, 's3': 3}
    dist_f = AdaptivePNormDistance(p=2, initial_scale_weights=initial_weights)
    dist_f.initialize(0, abc.sample_from_prior, x_0=x_0, total_sims=0)
    assert (dist_f.scale_weights[0] == np.array([1, 2, 3])).all()

    # call distance function
    d = dist_f(abc.sumstats[0], abc.sumstats[1], t=0)
    expected = pow(sum([(2 * 1)**2, (3 * 2)**2]), 1 / 2)
    assert expected == d

    # check updating works
    dist_f.update(1, abc.sample_from_prior, total_sims=0)
    assert (dist_f.scale_weights[1] != dist_f.scale_weights[0]).any()
コード例 #3
0
def test_adaptivepnormdistance_initial_weights():
    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
    initial_weights = {'s1': 1, 's2': 2, 's3': 3}
    dist_f = AdaptivePNormDistance(initial_weights=initial_weights)
    dist_f.initialize(0, abc.sample_from_prior, x_0=x_0)
    assert dist_f.weights[0] == initial_weights

    # call distance function
    d = dist_f(abc.sample_from_prior()[0], abc.sample_from_prior()[1], t=0)
    expected = pow(sum([(2 * 1)**2, (3 * 2)**2]), 1 / 2)
    assert expected == d

    # check updating works
    dist_f.update(1, abc.sample_from_prior)
    assert dist_f.weights[1] != dist_f.weights[0]