From c6d04a1043888e9ace8f5fecb9ff7a85dd853949 Mon Sep 17 00:00:00 2001 From: Joey Tan Date: Wed, 28 Oct 2026 16:31:18 -0400 Subject: [PATCH 1/2] Process bounds via get_internal_bounds on the converter fast path When params is a 1d numpy array and no constraints or scaling are used, get_converter took a fast path that called .astype(float) directly on bounds.lower and bounds.upper. Bounds given as a list or tuple therefore raised AttributeError, while the same bounds worked on the slow path. Delegate to get_internal_bounds, which already has its own fast path for 1d array bounds and handles other pytrees, so both paths behave the same. Co-Authored-By: Claude Opus 5.5 --- src/optimagic/parameters/conversion.py | 11 ++--------- tests/optimagic/parameters/test_conversion.py | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/optimagic/parameters/conversion.py b/src/optimagic/parameters/conversion.py index d087afcfd..602b545b7 100644 --- a/src/optimagic/parameters/conversion.py +++ b/src/optimagic/parameters/conversion.py @@ -5,6 +5,7 @@ import numpy as np +from optimagic.parameters.bounds import get_internal_bounds from optimagic.parameters.constraints import resolve_constraints, to_legacy_dicts from optimagic.parameters.scale_conversion import get_scale_converter from optimagic.parameters.space_conversion import InternalParams, get_space_converter @@ -185,15 +186,7 @@ def _fast_derivative_to_internal( has_transforming_constraints=False, ) - if bounds is None or bounds.lower is None: - lower_bounds = None - else: - lower_bounds = bounds.lower.astype(float) - - if bounds is None or bounds.upper is None: - upper_bounds = None - else: - upper_bounds = bounds.upper.astype(float) + lower_bounds, upper_bounds = get_internal_bounds(params=params, bounds=bounds) internal_params = InternalParams( values=params.astype(float), diff --git a/tests/optimagic/parameters/test_conversion.py b/tests/optimagic/parameters/test_conversion.py index 68bc47828..6b723016d 100644 --- a/tests/optimagic/parameters/test_conversion.py +++ b/tests/optimagic/parameters/test_conversion.py @@ -35,6 +35,21 @@ def test_get_converter_fast_case(): ) +@pytest.mark.parametrize("container", [list, tuple, np.array]) +def test_get_converter_fast_case_with_sequence_bounds(container): + converter, internal = get_converter( + params=np.arange(3), + constraints=None, + bounds=Bounds(lower=container([-1, -2, -3]), upper=container([1, 2, 3])), + func_eval=3, + derivative_eval=None, + solver_type=AggregationLevel.SCALAR, + ) + + aaae(internal.lower_bounds, np.array([-1, -2, -3])) + aaae(internal.upper_bounds, np.array([1, 2, 3])) + + def test_get_converter_with_constraints_and_bounds(): bounds = Bounds( lower=np.array([-1, -np.inf, -np.inf]), From 6864b7e4d0d1c15f251c5763fa56b44a649be417 Mon Sep 17 00:00:00 2001 From: Joey Tan Date: Tue, 3 Nov 2026 11:10:45 -0500 Subject: [PATCH 2/2] Rename fast_case tests to fast_path for consistency --- tests/optimagic/parameters/test_conversion.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/optimagic/parameters/test_conversion.py b/tests/optimagic/parameters/test_conversion.py index 6b723016d..dc8a6fd3c 100644 --- a/tests/optimagic/parameters/test_conversion.py +++ b/tests/optimagic/parameters/test_conversion.py @@ -13,7 +13,7 @@ from optimagic.typing import AggregationLevel -def test_get_converter_fast_case(): +def test_get_converter_fast_path(): converter, internal = get_converter( params=np.arange(3), constraints=None, @@ -36,7 +36,7 @@ def test_get_converter_fast_case(): @pytest.mark.parametrize("container", [list, tuple, np.array]) -def test_get_converter_fast_case_with_sequence_bounds(container): +def test_get_converter_fast_path_with_sequence_bounds(container): converter, internal = get_converter( params=np.arange(3), constraints=None,