[chore] Stricter ruff rules (#282)

* [chore] Stricter ruff rules

* [chore] Furture lint rules and removal of flake8

* [ci] Bump github action versions

* [chore] Add additional test coverage

* Revert RNG switch to np.random.default_rng()

Restore use of the global np.random state in pseudo_Obs (misc.py) and the
prior id generation (fits.py), keeping seed behavior unchanged. The switch
to a module-local generator is out of scope for this lint-focused PR.

* Silence NPY002 on intentional legacy np.random calls

The RNG migration was reverted to keep np.random.seed() behavior, so add
per-line noqa: NPY002 on the three legacy np.random calls instead of the
Generator API.

* [Fix] Fix exception messages
This commit is contained in:
Fabian Joswig 2026-07-06 11:04:28 +02:00 committed by GitHub
commit e72949b69b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
33 changed files with 569 additions and 382 deletions

View file

@ -49,3 +49,24 @@ def test_integration():
assert r1 == -r2
iamzero, _ = pe.integrate.quad(F, pobs, 1, 1)
assert iamzero == 0
def test_integrate_per_parameter_derivatives():
# \int_0^1 p0*x + p1*x^2 dx = p0/2 + p1/3
# If the lambda closure in integrate.quad failed to bind `i` per-iteration,
# all per-parameter derivatives would collapse to a single value.
def f(p, x):
return p[0] * x + p[1] * x ** 2
p = [pe.cov_Obs(1.0, 0.1 ** 2, "p0"), pe.cov_Obs(2.0, 0.2 ** 2, "p1")]
res, _ = pe.integrate.quad(f, p, 0.0, 1.0)
res.gm()
ana_val = p[0].value / 2 + p[1].value / 3
assert np.isclose(res.value, ana_val)
grad0 = res.covobs["p0"].grad.item()
grad1 = res.covobs["p1"].grad.item()
assert np.isclose(grad0, 0.5)
assert np.isclose(grad1, 1.0 / 3.0)
assert not np.isclose(grad0, grad1)