diff --git a/adaptive/tests/test_average_learner.py b/adaptive/tests/test_average_learner.py index b652cc8549c1f4cf9b2a0fb0609beea2a09e6ec0..abacd324b4cce9163d7d595f8c55e8d122c8f067 100644 --- a/adaptive/tests/test_average_learner.py +++ b/adaptive/tests/test_average_learner.py @@ -1,5 +1,9 @@ # -*- coding: utf-8 -*- +import random + +import numpy as np + from ..learner import AverageLearner @@ -17,3 +21,28 @@ def test_only_returns_new_points(): assert learner.ask(1)[0][0] == 3 assert learner.ask(1)[0][0] == 4 assert learner.ask(1)[0][0] == 10 + + +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