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
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()
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]