From 75093631ccf9a6f0411924040e7e5d6d4a421540 Mon Sep 17 00:00:00 2001
From: Bas Nijholt <bas@nijho.lt>
Date: Wed, 30 Nov 2022 14:01:00 -0800
Subject: [PATCH] Add learner1D.all_intervals_between

---
 adaptive/learner/learner1D.py | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/adaptive/learner/learner1D.py b/adaptive/learner/learner1D.py
index 9987da468..811cfbe70 100644
--- a/adaptive/learner/learner1D.py
+++ b/adaptive/learner/learner1D.py
@@ -862,6 +862,29 @@ def __setstate__(self, state):
         self.losses_combined.update(losses_combined)
 
 
+def all_intervals_between(
+    learner: Learner1D,
+    x_min: float | None = None,
+    x_max: float | None = None,
+    real: bool = True,
+) -> list[list[float]]:
+    """Returns all intervals between the given bounds."""
+    neighbors = learner.neighbors if real else learner.neighbors_combined
+    if x_min is None:
+        x_left = learner.bounds[0]
+    elif x_min in neighbors:
+        x_left = x_min
+    else:
+        _, x_left = learner._find_neighbors(x_min, neighbors)
+    if x_max is None:
+        x_right = learner.bounds[1]
+    elif x_max in neighbors:
+        x_right = x_max
+    else:
+        x_right, _ = learner._find_neighbors(x_max, neighbors)
+    return [ival for x, ival in neighbors.items() if x > x_left and x < x_right]
+
+
 def loss_manager(x_scale: float) -> dict[Interval, float]:
     def sort_key(ival, loss):
         loss, ival = finite_loss(ival, loss, x_scale)