def test_only_returns_new_points(): learner = AverageLearner(lambda x: x, atol=None, rtol=0.01) # Only tell it n = 5...10 for i in range(5, 10): learner.tell(i, 1) learner.tell_pending(0) # This means it shouldn't return 0 anymore assert learner.ask(1)[0][0] == 1 assert learner.ask(1)[0][0] == 2 assert learner.ask(1)[0][0] == 3 assert learner.ask(1)[0][0] == 4 assert learner.ask(1)[0][0] == 10
def test_min_npoints(): def constant_function(seed): return 0.1 for min_npoints in [1, 2, 3]: learner = AverageLearner(constant_function, atol=0.01, rtol=0.01, min_npoints=min_npoints) simple(learner, lambda l: l.loss() < 1) assert learner.npoints >= max(2, min_npoints)
def test_avg_std_and_npoints(): learner = AverageLearner(lambda x: x, atol=None, rtol=0.01) for i in range(300): # This will add 5000 points at random values of n. # It could try to readd already evaluated points. n = random.randint(0, 2 * 300) value = random.random() # With 10% chance None is added to simulate asking that point. if value < 0.9: learner.tell(n, value) else: learner.tell_pending(n) if i > 2 and i % 10 == 0: # We need more than two points for 'learner.std' to be defined. values = np.array(list(learner.data.values())) std = np.sqrt(sum((values - values.mean())**2) / (len(values) - 1)) assert learner.npoints == len(learner.data) assert abs(learner.sum_f - values.sum()) < 1e-13 assert abs(learner.std - std) < 1e-13
def test_zero_mean(): # see https://github.com/python-adaptive/adaptive/issues/275 learner = AverageLearner(None, rtol=0.01) learner.tell(0, -1) learner.tell(1, 1) learner.loss()