Skip to content

Commit b12c403

Browse files
committed
Merge branch 'bugfix/first-iteration'
correct point choosing in the first few steps of the 1DLearner Closes #55 See merge request qt/adaptive!59
2 parents 8deb715 + bf2123d commit b12c403

2 files changed

Lines changed: 33 additions & 8 deletions

File tree

adaptive/learner/learner1D.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -278,13 +278,14 @@ def choose_points(self, n, add_data=True):
278278
if bound not in self.data and bound not in self.data_interp:
279279
points.append(bound)
280280

281-
# Ensure we return exactly 'n' points.
282-
if points:
283-
loss_improvements = [float('inf')] * n
284-
if n <= 2:
285-
points = points[:n]
286-
else:
287-
points = np.linspace(*self.bounds, n)
281+
if len(points) == 2:
282+
# First time
283+
loss_improvements = [np.inf] * n
284+
points = np.linspace(*self.bounds, n)
285+
elif len(points) == 1:
286+
# Second time, if we previously returned just self.bounds[0]
287+
loss_improvements = [np.inf] * n
288+
points = np.linspace(*self.bounds, n + 1)[1:]
288289
else:
289290
def xs(x, n):
290291
if n == 1:

adaptive/tests/test_learner.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,30 @@ def test_learner_performance_is_invariant_under_scaling(learner_type, f, learner
321321
assert abs(learner.loss() - control.loss()) / learner.loss() < 1e-11
322322

323323

324+
def test_learner1d_first_iteration():
325+
"""Edge cases where we ask for a few points at the start."""
326+
learner = Learner1D(lambda x: None, (-1, 1))
327+
points, loss_improvements = learner.choose_points(2)
328+
assert set(points) == set([-1, 1])
329+
330+
learner = Learner1D(lambda x: None, (-1, 1))
331+
points, loss_improvements = learner.choose_points(3)
332+
assert set(points) == set([-1, 0, 1])
333+
334+
learner = Learner1D(lambda x: None, (-1, 1))
335+
points, loss_improvements = learner.choose_points(1)
336+
assert len(points) == 1 and points[0] in [-1, 1]
337+
rest = set([-1, 0, 1]) - set(points)
338+
points, loss_improvements = learner.choose_points(2)
339+
assert set(points) == set(rest)
340+
341+
learner = Learner1D(lambda x: None, (-1, 1))
342+
points, loss_improvements = learner.choose_points(1)
343+
to_see = set([-1, 1]) - set(points)
344+
points, loss_improvements = learner.choose_points(1)
345+
assert set(points) == set(to_see)
346+
347+
324348
@pytest.mark.xfail
325349
@run_with(Learner1D, Learner2D)
326350
def test_convergence_for_arbitrary_ordering(learner_type, f, learner_kwargs):
@@ -339,4 +363,4 @@ def test_learner_subdomain(learner_type, f, learner_kwargs):
339363
"""Learners that never receive data outside of a subdomain should
340364
perform 'similarly' to learners defined on that subdomain only."""
341365
# XXX: not sure how to implement this. How do we measure "performance"?
342-
raise NotImplementedError()
366+
raise NotImplementedError()

0 commit comments

Comments
 (0)