From 212da2041f12689e9b657bb00b1f78a9bd1be676 Mon Sep 17 00:00:00 2001 From: thomashopkins32 Date: Mon, 3 Aug 2026 15:05:02 -0400 Subject: [PATCH] Rename StoppingConditions to SupportsStoppingCriteria --- src/blop/plans.py | 4 ++-- src/blop/protocols.py | 4 ++-- src/blop/tests/test_plans.py | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/blop/plans.py b/src/blop/plans.py index 6e39ae61..9bb7f711 100644 --- a/src/blop/plans.py +++ b/src/blop/plans.py @@ -17,7 +17,7 @@ CanRegisterSuggestions, OptimizationProblem, Sensor, - StoppingConditions, + SupportsStoppingCriteria, TrialFaultAware, ) from .utils import InferredReadable, _maybe_checkpoint, collect_optimization_metadata, route_suggestions @@ -219,7 +219,7 @@ def _optimize() -> MsgGenerator[None]: # Perform a single step of the optimization uid, suggestions, outcomes = yield from optimize_step(optimization_problem, n_points, **kwargs) - if isinstance(optimization_problem.optimizer, StoppingConditions): + if isinstance(optimization_problem.optimizer, SupportsStoppingCriteria): stop_now, stop_reason = optimization_problem.optimizer.should_stop() if stop_now: reason = stop_reason if stop_reason is not None else "No reason provided" diff --git a/src/blop/protocols.py b/src/blop/protocols.py index 8861a274..a6908403 100644 --- a/src/blop/protocols.py +++ b/src/blop/protocols.py @@ -82,9 +82,9 @@ def register_failures(self, suggestions: list[dict]) -> None: @runtime_checkable -class StoppingConditions(Protocol): +class SupportsStoppingCriteria(Protocol): """ - A protocol for optimizers that can evaluate global stopping criteria. + A protocol for optimizers that can evaluate stopping criteria. This allows optimization plans to terminate early through tolerance, max_iterations etc. """ diff --git a/src/blop/tests/test_plans.py b/src/blop/tests/test_plans.py index 6c49970a..7c843752 100644 --- a/src/blop/tests/test_plans.py +++ b/src/blop/tests/test_plans.py @@ -11,7 +11,7 @@ EvaluationFunction, OptimizationProblem, Optimizer, - StoppingConditions, + SupportsStoppingCriteria, TrialFaultAware, ) @@ -483,7 +483,7 @@ def test_acquire_baseline_from_current(RE): def test_optimize_max_number_of_iterations_before_stop(RE): """Tests that the optimization stops at a set number of iterations""" - class StoppingOptimizer(Optimizer, StoppingConditions): ... + class StoppingOptimizer(Optimizer, SupportsStoppingCriteria): ... optimizer = MagicMock(spec=StoppingOptimizer) optimizer.suggest.return_value = [{"x1": 0.0, "_id": 0}] @@ -510,7 +510,7 @@ class StoppingOptimizer(Optimizer, StoppingConditions): ... def test_optimize_stop_condition_not_hit(RE): """Tests that optimization stops before stop condition is met""" - class StoppingOptimizer(Optimizer, StoppingConditions): ... + class StoppingOptimizer(Optimizer, SupportsStoppingCriteria): ... optimizer = MagicMock(spec=StoppingOptimizer) optimizer.suggest.return_value = [{"x1": 0.0, "_id": 0}] @@ -535,7 +535,7 @@ class StoppingOptimizer(Optimizer, StoppingConditions): ... def test_optimize_stops_when_change_is_within_tolerance(RE): """Tests that the optimization stops when the change in objective value is within a specified tolerance.""" - class ToleranceStopOptimizer(Optimizer, StoppingConditions): + class ToleranceStopOptimizer(Optimizer, SupportsStoppingCriteria): def __init__(self, tolerance: float): self.tolerance = tolerance self._last_value: float | None = None