import numpy as np
import pytest
import scipy.optimize
import scirs2
class TestScalarMinimization:
def test_minimize_scalar_quadratic(self):
def f(x):
return (x - 2.0) ** 2
result_scipy = scipy.optimize.minimize_scalar(f, bounds=(0, 4), method='bounded')
try:
result_scirs2 = scirs2.minimize_scalar_py(f, bounds=(0.0, 4.0))
if isinstance(result_scirs2, dict):
x_scirs2 = result_scirs2.get('x', result_scirs2.get('solution', None))
else:
x_scirs2 = result_scirs2
if x_scirs2 is not None:
assert np.allclose(x_scirs2, 2.0, atol=1e-4)
except TypeError:
pytest.skip("minimize_scalar_py does not support Python callables")
class TestRootFinding:
def test_brentq_simple(self):
def f(x):
return x**2 - 4.0
root_scipy = scipy.optimize.brentq(f, 0, 3)
try:
root_scirs2 = scirs2.brentq_py(f, 0.0, 3.0)
assert np.allclose(root_scirs2, 2.0, atol=1e-6)
assert np.allclose(root_scipy, root_scirs2, atol=1e-6)
except TypeError:
pytest.skip("brentq_py does not support Python callables")
class TestCurveFitting:
def test_curve_fit_linear(self):
np.random.seed(42)
x_data = np.ascontiguousarray(np.linspace(0, 10, 50))
y_data = np.ascontiguousarray(2.5 * x_data + 1.5 + np.random.randn(50) * 0.5)
def model(x, a, b):
return a * x + b
popt_scipy, _ = scipy.optimize.curve_fit(model, x_data, y_data)
try:
result_scirs2 = scirs2.curve_fit_py(model, x_data, y_data, p0=np.array([1.0, 0.0]))
if isinstance(result_scirs2, dict):
popt_scirs2 = result_scirs2.get('params', result_scirs2.get('x', None))
else:
popt_scirs2 = result_scirs2
if popt_scirs2 is not None:
assert np.allclose(popt_scirs2[0], 2.5, atol=0.2) assert np.allclose(popt_scirs2[1], 1.5, atol=0.5) except (TypeError, NotImplementedError):
pytest.skip("curve_fit_py may not support Python callables")
class TestArrayBasedOptimization:
def test_minimize_rosenbrock(self):
pytest.skip("Waiting for Python callable support in minimize_py")
if __name__ == "__main__":
pytest.main([__file__, "-v"])