|
16 | 16 |
|
17 | 17 | import unittest |
18 | 18 |
|
| 19 | +import numpy as np |
| 20 | +import pytest |
| 21 | + |
19 | 22 | from diffpy.srfit.fitbase.parameter import ( |
20 | 23 | Parameter, |
21 | 24 | ParameterAdapter, |
@@ -121,5 +124,95 @@ def testWrapper(self): |
121 | 124 | return |
122 | 125 |
|
123 | 126 |
|
| 127 | +@pytest.mark.parametrize( |
| 128 | + "lower, upper, expected", |
| 129 | + [ |
| 130 | + # User sets both lower and upper bounds explicitly. |
| 131 | + (1, 10, [1, 10]), |
| 132 | + # User sets only a lower bound. |
| 133 | + (2, None, [2, np.inf]), |
| 134 | + # User sets only an upper bound. |
| 135 | + (None, 8, [-np.inf, 8]), |
| 136 | + # User overwrites existing bounds. |
| 137 | + (2, 6, [2, 6]), |
| 138 | + ], |
| 139 | +) |
| 140 | +def test_bound_range(lower, upper, expected): |
| 141 | + p = Parameter("a", value=5) |
| 142 | + # If testing overwrite, pre-set bounds to see overwrite effect |
| 143 | + if expected == [2, 6]: |
| 144 | + p.bound_range(0, 10) |
| 145 | + p.bound_range(lower_bound=lower, upper_bound=upper) |
| 146 | + actual = p.bounds |
| 147 | + assert actual == expected |
| 148 | + |
| 149 | + |
| 150 | +@pytest.mark.parametrize( |
| 151 | + "lower, upper, expected", |
| 152 | + [ |
| 153 | + # User sets both lower and upper bounds explicitly. |
| 154 | + (1, 10, [1, 10]), |
| 155 | + # User sets only a lower bound. |
| 156 | + (2, None, [2, np.inf]), |
| 157 | + # User sets only an upper bound. |
| 158 | + (None, 8, [-np.inf, 8]), |
| 159 | + # User overwrites existing bounds. |
| 160 | + (2, 6, [2, 6]), |
| 161 | + ], |
| 162 | +) |
| 163 | +def test_boundRange(lower, upper, expected): |
| 164 | + p = Parameter("a", value=5) |
| 165 | + # If testing overwrite, pre-set bounds to see overwrite effect |
| 166 | + if expected == [2, 6]: |
| 167 | + p.boundRange(0, 10) |
| 168 | + p.boundRange(lower_bound=lower, upper_bound=upper) |
| 169 | + actual = p.bounds |
| 170 | + assert actual == expected |
| 171 | + |
| 172 | + |
| 173 | +@pytest.mark.parametrize( |
| 174 | + "value, lower_radius, upper_radius, expected", |
| 175 | + [ |
| 176 | + # Symmetric radius (upper_radius None, uses lower_radius) |
| 177 | + (10, 2, None, [8, 12]), |
| 178 | + # Asymmetric radius |
| 179 | + (10, 3, 5, [7, 15]), |
| 180 | + # Zero radius |
| 181 | + (4, 0, None, [4, 4]), |
| 182 | + # Current value updated before bounding |
| 183 | + (20, 2, None, [18, 22]), |
| 184 | + ], |
| 185 | +) |
| 186 | +def test_bound_window(value, lower_radius, upper_radius, expected): |
| 187 | + p = Parameter("a", value=5) |
| 188 | + if value != 5: |
| 189 | + p.set_value(value) |
| 190 | + p.bound_window(lower_radius=lower_radius, upper_radius=upper_radius) |
| 191 | + actual = p.bounds |
| 192 | + assert actual == expected |
| 193 | + |
| 194 | + |
| 195 | +@pytest.mark.parametrize( |
| 196 | + "value, lower_radius, upper_radius, expected", |
| 197 | + [ |
| 198 | + # Symmetric radius (upper_radius None, uses lower_radius) |
| 199 | + (10, 2, None, [8, 12]), |
| 200 | + # Asymmetric radius |
| 201 | + (10, 3, 5, [7, 15]), |
| 202 | + # Zero radius |
| 203 | + (4, 0, None, [4, 4]), |
| 204 | + # Current value updated before bounding |
| 205 | + (20, 2, None, [18, 22]), |
| 206 | + ], |
| 207 | +) |
| 208 | +def test_boundWindow(value, lower_radius, upper_radius, expected): |
| 209 | + p = Parameter("a", value=5) |
| 210 | + if value != 5: |
| 211 | + p.set_value(value) |
| 212 | + p.boundWindow(lr=lower_radius, ur=upper_radius) |
| 213 | + actual = p.bounds |
| 214 | + assert actual == expected |
| 215 | + |
| 216 | + |
124 | 217 | if __name__ == "__main__": |
125 | 218 | unittest.main() |
0 commit comments