diff --git a/src/pyrecest/_backend/_shared_numpy/linalg.py b/src/pyrecest/_backend/_shared_numpy/linalg.py index 81da7fec..8b87f34f 100644 --- a/src/pyrecest/_backend/_shared_numpy/linalg.py +++ b/src/pyrecest/_backend/_shared_numpy/linalg.py @@ -110,12 +110,10 @@ def fractional_matrix_power(A, t): def polar(a, side="right"): """Polar decomposition of a square or rectangular matrix.""" - signature = ( - "(m,n)->(m,n),(m,m)" if side == "left" else "(m,n)->(m,n),(n,n)" + signature = "(m,n)->(m,n),(m,m)" if side == "left" else "(m,n)->(m,n),(n,n)" + return _np.vectorize(_scipy.linalg.polar, signature=signature, excluded=["side"])( + a, side=side ) - return _np.vectorize( - _scipy.linalg.polar, signature=signature, excluded=["side"] - )(a, side=side) def solve(a, b): diff --git a/src/pyrecest/_backend/pytorch/linalg.py b/src/pyrecest/_backend/pytorch/linalg.py index b8c106c9..717783d6 100644 --- a/src/pyrecest/_backend/pytorch/linalg.py +++ b/src/pyrecest/_backend/pytorch/linalg.py @@ -255,12 +255,8 @@ def fractional_matrix_power(A, t): def polar(a, side="right"): """Polar decomposition of a square or rectangular matrix.""" a = _as_linalg_tensor(a) - signature = ( - "(m,n)->(m,n),(m,m)" if side == "left" else "(m,n)->(m,n),(n,n)" - ) - func = _np.vectorize( - _scipy.linalg.polar, signature=signature, excluded=["side"] - ) + signature = "(m,n)->(m,n),(m,m)" if side == "left" else "(m,n)->(m,n),(n,n)" + func = _np.vectorize(_scipy.linalg.polar, signature=signature, excluded=["side"]) unitary, hermitian = func(_as_numpy_no_grad(a), side=side) return _torch_as_like(unitary, a), _torch_as_like(hermitian, a) diff --git a/src/pyrecest/distributions/abstract_grid_distribution.py b/src/pyrecest/distributions/abstract_grid_distribution.py index f052e72a..fcc4527b 100644 --- a/src/pyrecest/distributions/abstract_grid_distribution.py +++ b/src/pyrecest/distributions/abstract_grid_distribution.py @@ -121,7 +121,9 @@ def multiply(self, other): if self.grid_type != other.grid_type: raise ValueError("Grid types must match before multiplication.") if (self.grid is None) != (other.grid is None): - raise ValueError("Both grid distributions must either store grids or omit them.") + raise ValueError( + "Both grid distributions must either store grids or omit them." + ) if self.grid is not None and not allclose(self.grid, other.grid): raise ValueError("Grid coordinates must match before multiplication.") gd = copy.deepcopy(self) diff --git a/src/pyrecest/distributions/hypersphere_subset/complex_angular_central_gaussian_distribution.py b/src/pyrecest/distributions/hypersphere_subset/complex_angular_central_gaussian_distribution.py index 1c328063..8bdb08ac 100644 --- a/src/pyrecest/distributions/hypersphere_subset/complex_angular_central_gaussian_distribution.py +++ b/src/pyrecest/distributions/hypersphere_subset/complex_angular_central_gaussian_distribution.py @@ -101,7 +101,9 @@ def pdf(self, za): """ za = array(za) if za.ndim == 0 or za.shape[-1] != self.dim: - raise ValueError(f"za must have trailing dimension {self.dim}, got {za.shape}.") + raise ValueError( + f"za must have trailing dimension {self.dim}, got {za.shape}." + ) single = za.ndim == 1 if single: za = za.reshape(1, -1) diff --git a/src/pyrecest/distributions/hypersphere_subset/complex_watson_distribution.py b/src/pyrecest/distributions/hypersphere_subset/complex_watson_distribution.py index e2ca06fb..221f8be7 100644 --- a/src/pyrecest/distributions/hypersphere_subset/complex_watson_distribution.py +++ b/src/pyrecest/distributions/hypersphere_subset/complex_watson_distribution.py @@ -148,7 +148,9 @@ def pdf(self, za): """ za = asarray(za, dtype=complex128) if za.ndim == 0 or za.shape[-1] != self.dim: - raise ValueError(f"za must have trailing dimension {self.dim}, got {za.shape}.") + raise ValueError( + f"za must have trailing dimension {self.dim}, got {za.shape}." + ) inner = za @ conj(self.mu) # complex inner product, shape (N,) or scalar return real(exp(self.log_norm_const + self.kappa * abs(inner) ** 2)) diff --git a/tests/distributions/test_abstract_grid_distribution.py b/tests/distributions/test_abstract_grid_distribution.py index a50919e1..2294b7e3 100644 --- a/tests/distributions/test_abstract_grid_distribution.py +++ b/tests/distributions/test_abstract_grid_distribution.py @@ -3,7 +3,6 @@ from pyrecest.backend import array from pyrecest.distributions.abstract_grid_distribution import AbstractGridDistribution - _DEFAULT_GRID = object() @@ -62,9 +61,7 @@ def test_multiply_rejects_incompatible_grids(self): with self.assertRaisesRegex(ValueError, "enforce_pdf_nonnegative"): dist.multiply( - DummyGridDistribution( - array([1.0, 1.0]), enforce_pdf_nonnegative=False - ) + DummyGridDistribution(array([1.0, 1.0]), enforce_pdf_nonnegative=False) ) with self.assertRaisesRegex(ValueError, "Grid value shapes"): @@ -72,16 +69,12 @@ def test_multiply_rejects_incompatible_grids(self): with self.assertRaisesRegex(ValueError, "Grid types"): dist.multiply( - DummyGridDistribution( - array([1.0, 1.0]), grid_type="cartesian_prod" - ) + DummyGridDistribution(array([1.0, 1.0]), grid_type="cartesian_prod") ) with self.assertRaisesRegex(ValueError, "Grid coordinates"): dist.multiply( - DummyGridDistribution( - array([1.0, 1.0]), grid=array([[0.0], [2.0]]) - ) + DummyGridDistribution(array([1.0, 1.0]), grid=array([[0.0], [2.0]])) ) def test_multiply_combines_compatible_values(self): diff --git a/tests/distributions/test_abstract_sphere_subset_distribution.py b/tests/distributions/test_abstract_sphere_subset_distribution.py index c257c900..8374e025 100644 --- a/tests/distributions/test_abstract_sphere_subset_distribution.py +++ b/tests/distributions/test_abstract_sphere_subset_distribution.py @@ -144,9 +144,7 @@ def test_elevation_helpers_reject_matrix_inputs(self): z = array([[0.0, 0.0]]) with self.assertRaisesRegex(ValueError, "1-dimensional"): - AbstractSphereSubsetDistribution._sph_to_cart_elevation( - azimuth, elevation - ) + AbstractSphereSubsetDistribution._sph_to_cart_elevation(azimuth, elevation) with self.assertRaisesRegex(ValueError, "1-dimensional"): AbstractSphereSubsetDistribution._cart_to_sph_elevation(x, y, z) diff --git a/tests/distributions/test_complex_angular_central_gaussian_distribution.py b/tests/distributions/test_complex_angular_central_gaussian_distribution.py index 96fbeb6f..40e8ed1a 100644 --- a/tests/distributions/test_complex_angular_central_gaussian_distribution.py +++ b/tests/distributions/test_complex_angular_central_gaussian_distribution.py @@ -54,7 +54,9 @@ def test_constructor_rejects_invalid_shape_or_nonfinite_matrix(self): ] for C_bad, message in invalid_matrices: - with self.subTest(message=message), self.assertRaisesRegex(ValueError, message): + with self.subTest(message=message), self.assertRaisesRegex( + ValueError, message + ): ComplexAngularCentralGaussianDistribution(C_bad) def test_constructor_rejects_non_positive_definite_matrix(self): @@ -142,7 +144,9 @@ def test_pdf_batch_vs_single(self): def test_pdf_accepts_list_and_rejects_wrong_dimension(self): z = [[1.0 + 0j, 0.0 + 0j]] - npt.assert_allclose(self.dist_identity_2d.pdf(z), self.dist_identity_2d.pdf(array(z))) + npt.assert_allclose( + self.dist_identity_2d.pdf(z), self.dist_identity_2d.pdf(array(z)) + ) for invalid_z in (1.0 + 0j, [1.0 + 0j], [[1.0 + 0j, 0.0 + 0j, 0.0 + 0j]]): with self.subTest(invalid_z=invalid_z): diff --git a/tests/distributions/test_complex_watson_distribution.py b/tests/distributions/test_complex_watson_distribution.py index c55c04cb..74da6725 100644 --- a/tests/distributions/test_complex_watson_distribution.py +++ b/tests/distributions/test_complex_watson_distribution.py @@ -276,9 +276,7 @@ def test_fit_with_weights(self): self.assertIsInstance(cw_fit, ComplexWatsonDistribution) def test_estimate_parameters_rejects_invalid_inputs(self): - valid_Z = array( - [[1.0 + 0j, 0.0 + 0j], [0.0 + 0j, 1.0 + 0j]], dtype=complex128 - ) + valid_Z = array([[1.0 + 0j, 0.0 + 0j], [0.0 + 0j, 1.0 + 0j]], dtype=complex128) invalid_cases = [ ([1.0 + 0j, 0.0 + 0j], None, "two-dimensional"), (array([[float("nan") + 0j, 0.0 + 0j]], dtype=complex128), None, "finite"), diff --git a/tests/distributions/test_custom_hyperrectangular_distribution.py b/tests/distributions/test_custom_hyperrectangular_distribution.py index 98e44981..72759cac 100644 --- a/tests/distributions/test_custom_hyperrectangular_distribution.py +++ b/tests/distributions/test_custom_hyperrectangular_distribution.py @@ -143,7 +143,9 @@ def test_normalize_rejects_non_numpy_backend(self): with self.assertRaisesRegex(NotImplementedError, "numpy backend"): dist.normalize() finally: - backend.__backend_name__ = original_backend_name # pylint: disable=no-member + backend.__backend_name__ = ( + original_backend_name # pylint: disable=no-member + ) if __name__ == "__main__": diff --git a/tests/distributions/test_hypercylindrical_dirac_distribution.py b/tests/distributions/test_hypercylindrical_dirac_distribution.py index b37c95c2..d60aefc6 100644 --- a/tests/distributions/test_hypercylindrical_dirac_distribution.py +++ b/tests/distributions/test_hypercylindrical_dirac_distribution.py @@ -168,9 +168,7 @@ def test_plot(self, name, dist, dim): ) def test_plot_rejects_unsupported_dimension(self): - dist = HypercylindricalDiracDistribution( - 1, array([[0.1, 1.0, 2.0, 3.0]]) - ) + dist = HypercylindricalDiracDistribution(1, array([[0.1, 1.0, 2.0, 3.0]])) with self.assertRaisesRegex(ValueError, "Plotting"): dist.plot() diff --git a/tests/distributions/test_hyperhemispherical_watson_distribution.py b/tests/distributions/test_hyperhemispherical_watson_distribution.py index 6264de17..98ed46cd 100644 --- a/tests/distributions/test_hyperhemispherical_watson_distribution.py +++ b/tests/distributions/test_hyperhemispherical_watson_distribution.py @@ -1,7 +1,6 @@ import unittest import numpy.testing as npt - from pyrecest.backend import array from pyrecest.distributions.hypersphere_subset.hyperhemispherical_watson_distribution import ( HyperhemisphericalWatsonDistribution, diff --git a/tests/evaluation/test_pareto_objective_validation.py b/tests/evaluation/test_pareto_objective_validation.py index d8c97987..25ff7de8 100644 --- a/tests/evaluation/test_pareto_objective_validation.py +++ b/tests/evaluation/test_pareto_objective_validation.py @@ -1,13 +1,14 @@ import pandas as pd import pytest - from pyrecest.evaluation.pareto import is_pareto_front, pareto_front_indices def test_pareto_front_indices_reject_missing_objective_column(): table = pd.DataFrame({"cost": [1.0, 2.0]}) - with pytest.raises(ValueError, match="Pareto objective columns are missing: quality"): + with pytest.raises( + ValueError, match="Pareto objective columns are missing: quality" + ): pareto_front_indices( table, ["cost", "quality"], @@ -18,7 +19,9 @@ def test_pareto_front_indices_reject_missing_objective_column(): def test_is_pareto_front_rejects_missing_objective_column(): table = pd.DataFrame({"cost": [1.0, 2.0]}) - with pytest.raises(ValueError, match="Pareto objective columns are missing: quality"): + with pytest.raises( + ValueError, match="Pareto objective columns are missing: quality" + ): is_pareto_front( table, ["cost", "quality"], diff --git a/tests/filters/test_measurement_reliability_zero_noise.py b/tests/filters/test_measurement_reliability_zero_noise.py index 7f306d21..56b73c3b 100644 --- a/tests/filters/test_measurement_reliability_zero_noise.py +++ b/tests/filters/test_measurement_reliability_zero_noise.py @@ -1,12 +1,15 @@ import numpy as np - -from pyrecest.filters.measurement_reliability import normalize_measurement_noise_covariances +from pyrecest.filters.measurement_reliability import ( + normalize_measurement_noise_covariances, +) def _as_covariance_matrix(value, measurement_dim, name): covariance = np.asarray(value, dtype=float) if covariance.shape != (measurement_dim, measurement_dim): - raise ValueError(f"{name} must have shape ({measurement_dim}, {measurement_dim})") + raise ValueError( + f"{name} must have shape ({measurement_dim}, {measurement_dim})" + ) return covariance