diff --git a/adaptive/learner/learner1D.py b/adaptive/learner/learner1D.py index 48cff21dc05309bf15ad6d6dd44e22e279aa9aa4..dc7f8d93e3de33dd53f7aef1510c020a3a1d7995 100644 --- a/adaptive/learner/learner1D.py +++ b/adaptive/learner/learner1D.py @@ -152,6 +152,7 @@ class Learner1D(BaseLearner): self.update_interpolated_loss_in_interval(x_left, x) self.update_interpolated_loss_in_interval(x, x_right) self.losses.pop((x_left, x_right), None) + self.losses_combined.pop((x_left, x_right), None) else: losses_combined = self.losses_combined x_left, x_right = self.find_neighbors(x, self.neighbors) @@ -212,8 +213,11 @@ class Learner1D(BaseLearner): self._scale[1] = self._bbox[1][1] - self._bbox[1][0] def tell(self, x, y): - real = y is not None + if x in self.data: + # The point is already evaluated before + return + real = y is not None if real: # Add point to the real data dict self.data[x] = y diff --git a/adaptive/tests/test_learner.py b/adaptive/tests/test_learner.py index b32527a80ef9f30e4b2f2b3a6ce13b1d395abc72..4867952e61a4499afb0efbc0fb0fd5bcd4a2aeec 100644 --- a/adaptive/tests/test_learner.py +++ b/adaptive/tests/test_learner.py @@ -438,6 +438,24 @@ def test_termination_on_discontinuities(): assert smallest_interval >= 0.5E3 * np.finfo(float).eps +def test_order_adding_points(): + # and https://gitlab.kwant-project.org/qt/adaptive/issues/98 + l = Learner1D(lambda x: x, (0, 1)) + l.tell_many([1, 0, 0.5], [0, 0, 0]) + assert l.losses_combined == {(0, 0.5): 0.5, (0.5, 1): 0.5} + assert l.losses == {(0, 0.5): 0.5, (0.5, 1): 0.5} + l.ask(1) + + +def test_adding_existing_point_passes_silently(): + # See https://gitlab.kwant-project.org/qt/adaptive/issues/97 + l = Learner1D(lambda x: x, (0, 4)) + l.tell(0, 0) + l.tell(1, 0) + l.tell(2, 0) + l.tell(1, None) + + def test_loss_at_machine_precision_interval_is_zero(): """The loss of an interval smaller than _dx_eps should be set to zero."""