From 6d464d2f8258605c67081c8b8142813b6929e05b Mon Sep 17 00:00:00 2001 From: Henrik Jacobsen Date: Fri, 24 Apr 2026 08:49:05 +0200 Subject: [PATCH] fix bounds when creating parameters (#164) --- src/easydynamics/sample_model/components/mixins.py | 8 +++++--- .../sample_model/components/test_gaussian.py | 14 +++++++++++++- .../sample_model/test_component_collection.py | 10 +++++++++- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/easydynamics/sample_model/components/mixins.py b/src/easydynamics/sample_model/components/mixins.py index a80a7200..0d760865 100644 --- a/src/easydynamics/sample_model/components/mixins.py +++ b/src/easydynamics/sample_model/components/mixins.py @@ -74,7 +74,8 @@ def _create_area_parameter( stacklevel=3, ) else: - area.min = minimum_area + if area.min < minimum_area: + area.min = minimum_area return area @@ -130,7 +131,7 @@ def _create_center_parameter( raise ValueError('center must be None, a finite number or a Parameter') center = Parameter(name=name + ' center', value=float(center), unit=unit) - if enforce_minimum_center: + if enforce_minimum_center and center.min < DHO_MINIMUM_CENTER: center.min = DHO_MINIMUM_CENTER return center @@ -192,6 +193,7 @@ def _create_width_parameter( raise ValueError( f'The {param_name} of a {self.__class__.__name__} must be greater than zero.' ) - width.min = minimum_width + if width.min < minimum_width: + width.min = minimum_width return width diff --git a/tests/unit/easydynamics/sample_model/components/test_gaussian.py b/tests/unit/easydynamics/sample_model/components/test_gaussian.py index 7119852a..ef339cc2 100644 --- a/tests/unit/easydynamics/sample_model/components/test_gaussian.py +++ b/tests/unit/easydynamics/sample_model/components/test_gaussian.py @@ -197,7 +197,13 @@ def test_convert_unit(self, gaussian: Gaussian): assert gaussian.width.value == pytest.approx(0.6 * 1e3) def test_copy(self, gaussian: Gaussian): - # WHEN THEN + # WHEN + gaussian.area.min = 0.5 + gaussian.width.min = 0.1 + gaussian.area.fixed = True + gaussian.area.max = 5.0 + + # THEN gaussian_copy = copy(gaussian) # EXPECT assert gaussian_copy is not gaussian @@ -205,12 +211,18 @@ def test_copy(self, gaussian: Gaussian): assert gaussian_copy.area.value == gaussian.area.value assert gaussian_copy.area.fixed == gaussian.area.fixed + assert gaussian_copy.area.min == gaussian.area.min + assert gaussian_copy.area.max == gaussian.area.max assert gaussian_copy.center.value == gaussian.center.value assert gaussian_copy.center.fixed == gaussian.center.fixed + assert gaussian_copy.center.min == gaussian.center.min + assert gaussian_copy.center.max == gaussian.center.max assert gaussian_copy.width.value == gaussian.width.value assert gaussian_copy.width.fixed == gaussian.width.fixed + assert gaussian_copy.width.min == gaussian.width.min + assert gaussian_copy.width.max == gaussian.width.max assert gaussian_copy.unit == gaussian.unit diff --git a/tests/unit/easydynamics/sample_model/test_component_collection.py b/tests/unit/easydynamics/sample_model/test_component_collection.py index c7d41aa1..692486ff 100644 --- a/tests/unit/easydynamics/sample_model/test_component_collection.py +++ b/tests/unit/easydynamics/sample_model/test_component_collection.py @@ -475,9 +475,17 @@ def test_from_dict(self, component_collection): def test_copy(self, component_collection): # WHEN component_collection.temperature = 300 + component_collection.components[0].area.min = 0.5 + component_collection.components[0].area.fixed = True + component_collection.components[0].area.max = 5.0 + component_collection.components[1].width.min = 0.1 + component_collection.components[1].width.fixed = True + component_collection.components[1].width.max = 2.0 + + # THEN model_copy = copy(component_collection) - # THEN: collection-level checks + # EXPECT collection-level checks assert model_copy is not component_collection assert model_copy.display_name == component_collection.display_name assert len(model_copy.components) == len(component_collection.components)