pyerrors/tests/roots_test.py
Fabian Joswig 229ea45ac7
[feat] Relax strict autograd.numpy requirement (#285)
* [feat] Relax strict autograd.numpy requirement

* [Fix] Re-impose --Werror for python 3.14 runs after new autograd release
2026-06-30 08:55:49 +02:00

67 lines
1.8 KiB
Python

import numpy as np
import autograd.numpy as anp
import pyerrors as pe
import pytest
np.random.seed(0)
def test_root_linear():
def root_function(x, d):
return x - d
value = np.random.normal(0, 100)
my_obs = pe.pseudo_Obs(value, 0.1, 't')
my_root = pe.roots.find_root(my_obs, root_function)
assert np.isclose(my_root.value, value)
assert np.isclose(my_root.value, my_root.r_values['t'])
difference = my_obs - my_root
assert difference.is_zero()
def test_root_linear_idl():
def root_function(x, d):
return x - d
my_obs = pe.Obs([np.random.rand(50)], ['t'], idl=[range(20, 120, 2)])
my_root = pe.roots.find_root(my_obs, root_function)
difference = my_obs - my_root
assert difference.is_zero()
def test_root_no_autograd():
def root_function(x, d):
return x - np.log(np.exp(d))
def root_function_autograd(x, d):
return x - anp.log(anp.exp(d))
value = np.random.normal(0, 100)
my_obs = pe.pseudo_Obs(value, 0.1, 't')
# Since autograd 1.9.0 plain numpy ufuncs are dispatched to the autograd
# wrappers, so a root function using numpy now yields the same result as
# one using autograd.numpy.
assert pe.roots.find_root(my_obs, root_function) == pe.roots.find_root(my_obs, root_function_autograd)
# A function that genuinely cannot be traced by autograd must still raise.
def root_invalid(x, d):
return x - np.float64(d)
with pytest.raises(Exception):
pe.roots.find_root(my_obs, root_invalid)
def test_root_multi_parameter():
o1 = pe.pseudo_Obs(1.1, 0.1, "test")
o2 = pe.pseudo_Obs(1.3, 0.12, "test")
f2 = lambda x, d: d[0] + d[1] * x
assert f2(-o1 / o2, [o1, o2]) == 0
assert pe.find_root([o1, o2], f2) == -o1 / o2