From 6e2052072e6ecda7e1aac22fc42d4e08d06ae60a Mon Sep 17 00:00:00 2001 From: FlorianPfaff <6773539+FlorianPfaff@users.noreply.github.com> Date: Fri, 7 Aug 2026 18:30:59 +0000 Subject: [PATCH] [MegaLinter] Apply linters automatic fixes --- src/pyrecest/_backend/jax/random/__init__.py | 4 +-- src/pyrecest/_backend/numpy/linalg.py | 10 ++++-- src/pyrecest/_backend/pytorch/random.py | 4 +-- .../_backend/pytorch/random/__init__.py | 32 +++++-------------- .../_pytorch_one_hot_scalar_contract.py | 4 +-- src/pyrecest/calibration/__init__.py | 10 ++---- .../_time_offset_grid_extreme_range.py | 4 +-- .../abstract_custom_distribution.py | 1 - .../abstract_dirac_distribution.py | 8 +++-- .../cart_prod/gauss_von_mises_distribution.py | 1 - ...al_state_space_subdivision_distribution.py | 4 ++- .../von_mises_fisher_distribution.py | 1 - .../hypersphere_subset/watson_distribution.py | 1 - .../evaluation/check_and_fix_config.py | 7 ++-- .../evaluation/get_distance_function.py | 8 ++--- .../evaluation/summarize_filter_results.py | 6 ++-- .../evaluation/tracking_metrics/_data.py | 8 ++--- .../experimental/dvs/vectorized_flow.py | 4 +-- src/pyrecest/filters/block_particle_filter.py | 4 +-- .../filters/daum_huang_particle_filter.py | 9 ++---- .../dirichlet_process_birth_tracker.py | 4 +-- .../filters/gaussian_hypothesis_mixture.py | 4 +-- .../filters/global_nearest_neighbor.py | 1 - ...ormation_form_distributed_kalman_filter.py | 8 ++--- ...t_probabilistic_data_association_filter.py | 4 +-- src/pyrecest/filters/kernel_sme_filter.py | 2 +- .../filters/mode_rbpf_manifold_ukf_tracker.py | 4 +-- .../filters/multisensor_hdp_association.py | 15 +++------ src/pyrecest/filters/out_of_sequence.py | 4 ++- src/pyrecest/filters/sequence_association.py | 5 ++- .../filters/state_space_subdivision_filter.py | 4 +-- src/pyrecest/filters/track_manager.py | 3 +- src/pyrecest/models/linear_gaussian.py | 2 +- src/pyrecest/models/motion_models.py | 22 +++++++------ src/pyrecest/numerics.py | 8 ++--- src/pyrecest/sampling/support_points.py | 8 ++--- .../_record_smoother_numeric_contract.py | 1 - .../_urts_transition_call_contract.py | 14 ++++---- src/pyrecest/smoothers/abstract_smoother.py | 4 +-- src/pyrecest/tracking/nis_consistency.py | 17 +++++++--- .../utils/_point_set_registration_common.py | 5 +-- .../utils/_roi_assignment_extreme_range.py | 3 +- src/pyrecest/utils/_roi_assignment_otsu.py | 13 ++++---- src/pyrecest/utils/metrics.py | 10 ++---- src/pyrecest/utils/point_set_registration.py | 6 ++-- .../test_jax_fftshift_axis_normalization.py | 1 - ...jax_random_singular_multivariate_normal.py | 4 +-- ...tional_matrix_power_exponent_validation.py | 5 +-- ...py_linalg_zero_by_zero_matrix_functions.py | 1 - .../test_numpy_random_masked_parameters.py | 1 - .../backend/test_numpy_random_masked_size.py | 1 - .../test_pytorch_randint_array_precision.py | 1 - .../test_pytorch_randint_dtype_bounds.py | 5 +-- ...rch_random_multivariate_normal_keywords.py | 1 - ...rch_random_singular_multivariate_normal.py | 1 - .../test_time_offset_grid_extreme_range.py | 1 - .../test_abstract_mixture_temporal_weights.py | 1 - ...test_complex_acg_sample_count_precision.py | 1 - ...st_complex_watson_temporal_sample_count.py | 4 +-- .../test_dirac_reweight_underflow.py | 1 - ..._ellipsoidal_ball_temporal_sample_count.py | 1 - .../test_gauss_von_mises_scalar_validation.py | 4 +-- ...est_gaussian_marginalize_out_validation.py | 1 - .../test_gaussian_mixture_complex_mean.py | 8 ++--- .../test_hypercylindrical_zero_marginals.py | 1 - ...toroidal_mixed_boolean_input_validation.py | 4 +-- ...t_hypertoroidal_python_scalar_integrand.py | 1 - ...test_linear_box_particle_temporal_count.py | 1 - ...t_linear_dirac_apply_function_dimension.py | 1 - .../test_mixture_masked_weights.py | 5 +-- ...ally_wrapped_normal_hybrid_moment_order.py | 1 - ...wise_constant_interval_index_validation.py | 1 - .../test_se2_dirac_temporal_particle_count.py | 9 ++++-- .../test_so3_conversion_validation.py | 1 - .../test_so3_product_dirac_extreme_norms.py | 1 - .../test_von_mises_temporal_sample_count.py | 1 - .../test_wrapped_exponential_extreme_rate.py | 1 - ...t_wrapped_normal_temporal_sample_counts.py | 1 - .../test_euclidean_mtt_extreme_coordinates.py | 1 - .../test_integer_estimate_history.py | 1 - tests/evaluation/test_tracking_metrics.py | 5 +-- tests/filters/test_block_particle_filter.py | 4 +-- .../test_daum_huang_extreme_normalization.py | 1 - ...est_daum_huang_particle_flow_validation.py | 1 - ...crete_state_extreme_gaussian_transition.py | 1 - ...test_discrete_state_nonfinite_emissions.py | 1 - ...particle_filter_zero_support_likelihood.py | 1 - ..._gaussian_hypothesis_impossible_weights.py | 1 - ...est_gnn_pairwise_cost_weight_validation.py | 12 +++---- ...est_gnn_pairwise_object_cost_validation.py | 10 +++--- ...ioned_replay_imm_probability_validation.py | 8 ++--- ...here_cart_prod_deterministic_prediction.py | 1 - ...erical_ukf_extreme_vector_normalization.py | 3 +- ...st_imm_positive_infinite_log_likelihood.py | 5 +-- ...orm_distributed_kalman_filter_atomicity.py | 7 ++-- ...ing_multiple_model_prediction_atomicity.py | 21 +++--------- .../test_kernel_sme_clutter_moments.py | 8 ++--- tests/filters/test_linear_update_planning.py | 4 +-- ...measurement_reliability_temporal_counts.py | 1 - .../test_mode_rbpf_manifold_ukf_tracker.py | 1 - ...rbpf_probability_normalization_overflow.py | 1 - .../test_nonadditive_arraylike_samples.py | 5 +-- .../test_particle_filter_count_precision.py | 4 +-- .../test_particle_filter_prediction_shape.py | 1 - ...st_relaxed_s3f_process_noise_validation.py | 8 +++-- ...test_replay_grid_zero_likelihood_update.py | 1 - tests/filters/test_se2_ukf_real_inputs.py | 4 +-- ...equence_association_temporal_validation.py | 1 - .../test_so3_product_particle_filter.py | 4 +-- ...ate_space_subdivision_update_validation.py | 5 +-- ...est_von_mises_fisher_filter_real_inputs.py | 4 +-- ...ive_noise_positional_only_function_args.py | 1 - .../test_linear_gaussian_finite_inputs.py | 24 ++++---------- .../models/test_singer_transition_numerics.py | 3 +- .../test_mem_rbpf_ffbsi_option_validation.py | 1 - ...est_mem_rbpf_ffbsi_weight_normalization.py | 10 +++--- ...t_record_smoother_covariance_validation.py | 1 - .../test_so3_chordal_mean_weight_stability.py | 1 - tests/test_deprecation_helper.py | 6 ++-- tests/test_evidence_support_masked_flags.py | 1 - ..._evidence_terminal_posterior_validation.py | 1 - tests/test_gaussian_sampler_zero_samples.py | 1 - tests/test_group_results_by_filter.py | 4 +-- tests/test_history_recorder_masked_flags.py | 1 - tests/test_history_recorder_masked_values.py | 3 +- ...t_hypertoroidal_sampler_masked_controls.py | 1 - ...est_leopardi_small_symmetric_partitions.py | 1 - tests/test_metrics_covariance_validation.py | 5 +-- tests/test_metrics_temporal_counts.py | 2 -- .../test_model_comparison_comparable_flags.py | 1 - .../test_numerics_symmetrization_overflow.py | 5 +-- ...wise_covariance_symmetrization_overflow.py | 9 ++---- ...t_point_set_registration_rmse_stability.py | 4 +-- .../test_pytorch_array_equal_mixed_dtypes.py | 4 +-- tests/test_pytorch_split_index_contract.py | 1 - tests/test_sigma_points_masked_parameters.py | 1 - ...test_sigma_points_merwe_scale_stability.py | 1 - .../test_sigma_points_temporal_parameters.py | 2 -- ...d_order_grid_extreme_transition_weights.py | 1 - ...t_hypothesis_replay_temporal_validation.py | 5 +-- .../test_association_model_failed_refit.py | 5 +-- ...librated_association_feature_validation.py | 1 - .../test_history_recorder_empty_steps.py | 4 +-- 143 files changed, 199 insertions(+), 421 deletions(-) diff --git a/src/pyrecest/_backend/jax/random/__init__.py b/src/pyrecest/_backend/jax/random/__init__.py index 9c346a6d6a..7a3b23c4c3 100644 --- a/src/pyrecest/_backend/jax/random/__init__.py +++ b/src/pyrecest/_backend/jax/random/__init__.py @@ -70,9 +70,7 @@ def _validate_and_classify_multivariate_normal_cov(cov, mean_dim): raise ValueError("cov must be positive semidefinite") scale = _LEGACY._jnp.max(_LEGACY._jnp.abs(eigenvalues)) - rank_tolerance = ( - _LEGACY._jnp.finfo(cov_float.dtype).eps * max(mean_dim, 1) * scale - ) + rank_tolerance = _LEGACY._jnp.finfo(cov_float.dtype).eps * max(mean_dim, 1) * scale requires_svd = bool(_LEGACY._jnp.any(eigenvalues <= rank_tolerance)) return cov, requires_svd diff --git a/src/pyrecest/_backend/numpy/linalg.py b/src/pyrecest/_backend/numpy/linalg.py index fe9b33ad29..cd1312f9e7 100644 --- a/src/pyrecest/_backend/numpy/linalg.py +++ b/src/pyrecest/_backend/numpy/linalg.py @@ -22,16 +22,20 @@ from .._shared_numpy.linalg import ( _normalize_fractional_matrix_power_exponent, - fractional_matrix_power as _fractional_matrix_power, +) +from .._shared_numpy.linalg import fractional_matrix_power as _fractional_matrix_power +from .._shared_numpy.linalg import ( is_single_matrix_pd, - logm as _logm, +) +from .._shared_numpy.linalg import logm as _logm +from .._shared_numpy.linalg import ( polar, qr, quadratic_assignment, solve, solve_sylvester, - sqrtm as _sqrtm, ) +from .._shared_numpy.linalg import sqrtm as _sqrtm def _empty_zero_by_zero_matrix_result(value): diff --git a/src/pyrecest/_backend/pytorch/random.py b/src/pyrecest/_backend/pytorch/random.py index 54340db9d7..eaf5728a57 100644 --- a/src/pyrecest/_backend/pytorch/random.py +++ b/src/pyrecest/_backend/pytorch/random.py @@ -267,9 +267,7 @@ def _validate_randint_array_dtype_bounds(low, high, dtype): # representable by the output dtype, as in randint(255, 256, dtype=uint8). # For int64, input tensors cannot represent max + 1, so every accepted high # value is already within the valid endpoint range. - if dtype != _torch.int64 and bool( - _torch.any(high_int64 > dtype_info.max + 1) - ): + if dtype != _torch.int64 and bool(_torch.any(high_int64 > dtype_info.max + 1)): raise ValueError(f"high is out of bounds for {dtype_name}") diff --git a/src/pyrecest/_backend/pytorch/random/__init__.py b/src/pyrecest/_backend/pytorch/random/__init__.py index 819e7039d9..53dbbbb51b 100644 --- a/src/pyrecest/_backend/pytorch/random/__init__.py +++ b/src/pyrecest/_backend/pytorch/random/__init__.py @@ -182,9 +182,7 @@ def _sample_array_randint_exactly(low, high, dtype, generator): bounds = torch.stack((flat_low, flat_high), dim=1) unique_bounds, inverse = torch.unique(bounds, dim=0, return_inverse=True) order = torch.argsort(inverse) - counts = torch.bincount( - inverse, minlength=unique_bounds.shape[0] - ).tolist() + counts = torch.bincount(inverse, minlength=unique_bounds.shape[0]).tolist() offset = 0 for bound_pair, count in zip(unique_bounds, counts): @@ -234,9 +232,7 @@ def _randint_array_with_wide_arithmetic(low, high, size, *args, **kwargs): unexpected = ", ".join(sorted(sampling_kwargs)) raise TypeError(f"Unexpected keyword argument(s): {unexpected}") - result = _sample_array_randint_exactly( - low, high, requested_dtype, generator - ) + result = _sample_array_randint_exactly(low, high, requested_dtype, generator) if out is not None: out.copy_(result) return out @@ -284,9 +280,7 @@ def uniform(low=0.0, high=1.0, size=None, dtype=None): span = high - low if bool(torch.any(~torch.isfinite(span))): raise OverflowError(_UNIFORM_RANGE_ERROR) - return span * torch.rand( - size, dtype=arithmetic_dtype, device=device - ) + low + return span * torch.rand(size, dtype=arithmetic_dtype, device=device) + low def _singular_multivariate_normal_factor(mean, cov, tol): @@ -321,15 +315,11 @@ def _singular_multivariate_normal_factor(mean, cov, tol): return None scale = torch.max(torch.abs(eigenvalues)) - rank_tolerance = ( - torch.finfo(cov.dtype).eps * max(mean.shape[0], 1) * scale - ) + rank_tolerance = torch.finfo(cov.dtype).eps * max(mean.shape[0], 1) * scale if bool(torch.all(eigenvalues > rank_tolerance)): return None - factor = eigenvectors * torch.sqrt( - torch.clamp(eigenvalues, min=0.0) - ).unsqueeze(0) + factor = eigenvectors * torch.sqrt(torch.clamp(eigenvalues, min=0.0)).unsqueeze(0) return mean, factor @@ -355,21 +345,15 @@ def multivariate_normal(mean, cov, size=None, *args, **kwargs): tol = _validate_multivariate_normal_tol(tol) try: - return _LEGACY.multivariate_normal( - mean, cov, size=size, *args, **kwargs - ) + return _LEGACY.multivariate_normal(mean, cov, size=size, *args, **kwargs) except ValueError: if args or kwargs: raise - singular_parameters = _singular_multivariate_normal_factor( - mean, cov, tol - ) + singular_parameters = _singular_multivariate_normal_factor(mean, cov, tol) if singular_parameters is None: raise singular_mean, factor = singular_parameters - return _sample_singular_multivariate_normal( - singular_mean, factor, size - ) + return _sample_singular_multivariate_normal(singular_mean, factor, size) __all__ = sorted( diff --git a/src/pyrecest/backend_support/_pytorch_one_hot_scalar_contract.py b/src/pyrecest/backend_support/_pytorch_one_hot_scalar_contract.py index 4e5b06bd89..94cea6bc0c 100644 --- a/src/pyrecest/backend_support/_pytorch_one_hot_scalar_contract.py +++ b/src/pyrecest/backend_support/_pytorch_one_hot_scalar_contract.py @@ -277,9 +277,7 @@ def array_equal(a, b, equal_nan=False): comparison = torch_module.eq(a, b) if dtype.is_floating_point or dtype.is_complex: - comparison = comparison | ( - torch_module.isnan(a) & torch_module.isnan(b) - ) + comparison = comparison | (torch_module.isnan(a) & torch_module.isnan(b)) return bool(torch_module.all(comparison)) array_equal.__name__ = getattr(original_array_equal, "__name__", "array_equal") diff --git a/src/pyrecest/calibration/__init__.py b/src/pyrecest/calibration/__init__.py index 7edb4205df..bffe5675ef 100644 --- a/src/pyrecest/calibration/__init__.py +++ b/src/pyrecest/calibration/__init__.py @@ -27,9 +27,7 @@ "times_s", } ) -_ORIGINAL_AGGREGATE_SUMMARY_METRIC_ATTR = ( - "_pyrecest_original_aggregate_summary_metric" -) +_ORIGINAL_AGGREGATE_SUMMARY_METRIC_ATTR = "_pyrecest_original_aggregate_summary_metric" _ORIGINAL_AGGREGATE_TIME_OFFSET_SWEEPS_ATTR = ( "_pyrecest_original_aggregate_time_offset_sweeps" ) @@ -190,9 +188,7 @@ def _aggregate_summary_metric( _bias_module._as_nonnegative_finite_float, ) -_base_bias_as_numeric_array = getattr( - _bias_module, _ORIGINAL_BIAS_NUMERIC_ARRAY_ATTR -) +_base_bias_as_numeric_array = getattr(_bias_module, _ORIGINAL_BIAS_NUMERIC_ARRAY_ATTR) _base_bias_as_nonnegative_int = getattr( _bias_module, _ORIGINAL_BIAS_NONNEGATIVE_INT_ATTR ) @@ -244,8 +240,6 @@ def _as_numeric_vector(value: Any, name: str) -> np.ndarray: TimeOffsetFitResult, _aggregate_std_metric, _validate_error_metric, -) -from .time_offset import ( # noqa: E402 apply_time_offset, fit_time_offset, interpolate_reference_values, diff --git a/src/pyrecest/calibration/_time_offset_grid_extreme_range.py b/src/pyrecest/calibration/_time_offset_grid_extreme_range.py index 2633975574..a8facd1dac 100644 --- a/src/pyrecest/calibration/_time_offset_grid_extreme_range.py +++ b/src/pyrecest/calibration/_time_offset_grid_extreme_range.py @@ -11,9 +11,7 @@ _ORIGINAL_ATTR = "_pyrecest_original_make_offset_grid" -def _extreme_range_grid( - min_s: float, max_s: float, step_s: float -) -> np.ndarray: +def _extreme_range_grid(min_s: float, max_s: float, step_s: float) -> np.ndarray: original = getattr(_time_offset, _ORIGINAL_ATTR) min_s = _time_offset._as_finite_float(min_s, "min_s") max_s = _time_offset._as_finite_float(max_s, "max_s") diff --git a/src/pyrecest/distributions/abstract_custom_distribution.py b/src/pyrecest/distributions/abstract_custom_distribution.py index 7fa21201e4..d3a596f8bd 100644 --- a/src/pyrecest/distributions/abstract_custom_distribution.py +++ b/src/pyrecest/distributions/abstract_custom_distribution.py @@ -10,7 +10,6 @@ from .abstract_distribution_type import AbstractDistributionType - _INVALID_INTEGRAL_TYPES = ( bool, np.bool_, diff --git a/src/pyrecest/distributions/abstract_dirac_distribution.py b/src/pyrecest/distributions/abstract_dirac_distribution.py index d9e8e6a1ad..041eff2c71 100644 --- a/src/pyrecest/distributions/abstract_dirac_distribution.py +++ b/src/pyrecest/distributions/abstract_dirac_distribution.py @@ -11,14 +11,15 @@ # pylint: disable=redefined-builtin,no-name-in-module,no-member from pyrecest.backend import ( all, +) +from pyrecest.backend import any as backend_any +from pyrecest.backend import ( apply_along_axis, arange, argmax, asarray, ) -from pyrecest.backend import any as backend_any from pyrecest.backend import copy as backend_copy -from pyrecest.backend import max as backend_max from pyrecest.backend import ( exp, int32, @@ -26,6 +27,9 @@ isclose, isfinite, log, +) +from pyrecest.backend import max as backend_max +from pyrecest.backend import ( ones, random, reshape, diff --git a/src/pyrecest/distributions/cart_prod/gauss_von_mises_distribution.py b/src/pyrecest/distributions/cart_prod/gauss_von_mises_distribution.py index 3f2359e890..0f1962eca3 100644 --- a/src/pyrecest/distributions/cart_prod/gauss_von_mises_distribution.py +++ b/src/pyrecest/distributions/cart_prod/gauss_von_mises_distribution.py @@ -37,7 +37,6 @@ from ..nonperiodic.gaussian_distribution import GaussianDistribution from .abstract_hypercylindrical_distribution import AbstractHypercylindricalDistribution - _INVALID_SCALAR_TYPES = ( str, bytes, diff --git a/src/pyrecest/distributions/cart_prod/hypercylindrical_state_space_subdivision_distribution.py b/src/pyrecest/distributions/cart_prod/hypercylindrical_state_space_subdivision_distribution.py index 82cd2a09e2..3c63bbe58c 100644 --- a/src/pyrecest/distributions/cart_prod/hypercylindrical_state_space_subdivision_distribution.py +++ b/src/pyrecest/distributions/cart_prod/hypercylindrical_state_space_subdivision_distribution.py @@ -38,7 +38,9 @@ from pyrecest.distributions.nonperiodic.custom_linear_distribution import ( CustomLinearDistribution, ) -from pyrecest.distributions.nonperiodic.gaussian_distribution import GaussianDistribution +from pyrecest.distributions.nonperiodic.gaussian_distribution import ( + GaussianDistribution, +) from pyrecest.distributions.nonperiodic.linear_mixture import LinearMixture diff --git a/src/pyrecest/distributions/hypersphere_subset/von_mises_fisher_distribution.py b/src/pyrecest/distributions/hypersphere_subset/von_mises_fisher_distribution.py index e5b96943be..fabc78a7bc 100644 --- a/src/pyrecest/distributions/hypersphere_subset/von_mises_fisher_distribution.py +++ b/src/pyrecest/distributions/hypersphere_subset/von_mises_fisher_distribution.py @@ -33,7 +33,6 @@ from .abstract_hyperspherical_distribution import AbstractHypersphericalDistribution - _INVALID_REAL_SCALAR_TYPES = ( bool, np.bool_, diff --git a/src/pyrecest/distributions/hypersphere_subset/watson_distribution.py b/src/pyrecest/distributions/hypersphere_subset/watson_distribution.py index f4dcebb91c..36e2886120 100644 --- a/src/pyrecest/distributions/hypersphere_subset/watson_distribution.py +++ b/src/pyrecest/distributions/hypersphere_subset/watson_distribution.py @@ -29,7 +29,6 @@ from .abstract_hyperspherical_distribution import AbstractHypersphericalDistribution from .bingham_distribution import BinghamDistribution - _INVALID_REAL_SCALAR_TYPES = ( bool, np.bool_, diff --git a/src/pyrecest/evaluation/check_and_fix_config.py b/src/pyrecest/evaluation/check_and_fix_config.py index d90cb058a1..b4429a4c0f 100644 --- a/src/pyrecest/evaluation/check_and_fix_config.py +++ b/src/pyrecest/evaluation/check_and_fix_config.py @@ -1,7 +1,6 @@ from numbers import Integral, Real import numpy as np - from pyrecest.distributions import AbstractManifoldSpecificDistribution @@ -12,9 +11,9 @@ def _is_integer_count(value): def _validate_probability(value, name): - if isinstance(value, (bool, np.bool_, np.datetime64, np.timedelta64)) or not isinstance( - value, Real - ): + if isinstance( + value, (bool, np.bool_, np.datetime64, np.timedelta64) + ) or not isinstance(value, Real): raise TypeError(f"{name} must be a real scalar") value = float(value) if not np.isfinite(value) or not 0.0 <= value <= 1.0: diff --git a/src/pyrecest/evaluation/get_distance_function.py b/src/pyrecest/evaluation/get_distance_function.py index 72117a32fd..2219254ef7 100644 --- a/src/pyrecest/evaluation/get_distance_function.py +++ b/src/pyrecest/evaluation/get_distance_function.py @@ -164,9 +164,7 @@ def distance_function(xest, xtrue): return distance_function -def _target_matrix_candidates( - value, name: str -) -> list[tuple[numpy.ndarray, int]]: +def _target_matrix_candidates(value, name: str) -> list[tuple[numpy.ndarray, int]]: value = _as_real_numeric_array(value, name) if value.ndim not in (1, 2): raise ValueError(f"{name} must be a one- or two-dimensional target set") @@ -272,9 +270,7 @@ def _capped_pairwise_euclidean_distances( where=same_sign, ) absolute_difference = numpy.abs(same_sign_difference) - same_sign_below_cutoff = same_sign & ( - absolute_difference < cutoff_distance - ) + same_sign_below_cutoff = same_sign & (absolute_difference < cutoff_distance) numpy.divide( absolute_difference, cutoff_distance, diff --git a/src/pyrecest/evaluation/summarize_filter_results.py b/src/pyrecest/evaluation/summarize_filter_results.py index 546d5371bb..84808730bd 100644 --- a/src/pyrecest/evaluation/summarize_filter_results.py +++ b/src/pyrecest/evaluation/summarize_filter_results.py @@ -26,9 +26,7 @@ def _validate_summary_filter_counts( name: count for name, count in summary_counts.items() if count != expected_count } if mismatched: - details = ", ".join( - f"{name}={count}" for name, count in mismatched.items() - ) + details = ", ".join(f"{name}={count}" for name, count in mismatched.items()) raise ValueError( "filter_configs and computed summaries must describe the same number " f"of filters; filter_configs={expected_count}, {details}" @@ -44,7 +42,7 @@ def summarize_filter_results( run_failed, last_filter_states=None, last_estimates=None, - **_ + **_, ): if pyrecest.backend.__backend_name__ == "jax": # pylint: disable=no-member raise NotImplementedError("Not supported for the JAX backend.") diff --git a/src/pyrecest/evaluation/tracking_metrics/_data.py b/src/pyrecest/evaluation/tracking_metrics/_data.py index 8cb3ecd1bf..58e5b7f6c8 100644 --- a/src/pyrecest/evaluation/tracking_metrics/_data.py +++ b/src/pyrecest/evaluation/tracking_metrics/_data.py @@ -24,9 +24,7 @@ class TrackingSequence: def __post_init__(self) -> None: num_gt_ids = _nonnegative_int(self.num_gt_ids, name="num_gt_ids") - num_tracker_ids = _nonnegative_int( - self.num_tracker_ids, name="num_tracker_ids" - ) + num_tracker_ids = _nonnegative_int(self.num_tracker_ids, name="num_tracker_ids") gt_frames = tuple( _identity_array(values, num_gt_ids, f"gt_ids[{index}]") for index, values in enumerate(self.gt_ids) @@ -36,7 +34,9 @@ def __post_init__(self) -> None: for index, values in enumerate(self.tracker_ids) ) if len(gt_frames) != len(tracker_frames): - raise ValueError("gt_ids and tracker_ids must contain the same number of frames") + raise ValueError( + "gt_ids and tracker_ids must contain the same number of frames" + ) if len(self.similarity_scores) != len(gt_frames): raise ValueError("similarity_scores must contain one matrix per frame") similarities = tuple( diff --git a/src/pyrecest/experimental/dvs/vectorized_flow.py b/src/pyrecest/experimental/dvs/vectorized_flow.py index 6e1eea314a..2d80d4ca9a 100644 --- a/src/pyrecest/experimental/dvs/vectorized_flow.py +++ b/src/pyrecest/experimental/dvs/vectorized_flow.py @@ -48,9 +48,7 @@ def tracker_signed_normal_flows_vectorized( except Exception: # pragma: no cover - backend-specific safety fallback return np.asarray( [ - tracker.signed_normal_flow_for_measurement( - measurement, unit_velocity - ) + tracker.signed_normal_flow_for_measurement(measurement, unit_velocity) for measurement in measurements ], dtype=float, diff --git a/src/pyrecest/filters/block_particle_filter.py b/src/pyrecest/filters/block_particle_filter.py index 723df9ba96..b38142a638 100644 --- a/src/pyrecest/filters/block_particle_filter.py +++ b/src/pyrecest/filters/block_particle_filter.py @@ -309,9 +309,7 @@ def set_particles(self, particles, weights=None, block_weights=None): normalized_block_weights = None if hasattr(self, "_block_weights"): if block_weights is not None: - normalized_block_weights = self._normalize_block_weights( - block_weights - ) + normalized_block_weights = self._normalize_block_weights(block_weights) elif normalized_weights is not None: normalized_block_weights = self._normalize_block_weights( normalized_weights diff --git a/src/pyrecest/filters/daum_huang_particle_filter.py b/src/pyrecest/filters/daum_huang_particle_filter.py index 6bacf1a80e..3c142ddcce 100644 --- a/src/pyrecest/filters/daum_huang_particle_filter.py +++ b/src/pyrecest/filters/daum_huang_particle_filter.py @@ -261,9 +261,7 @@ def __init__( self.flow_type if flow_type is None else flow_type ) self.n_steps = _validate_positive_int(n_steps, "n_steps") - self.step_schedule = ( - None if step_schedule is None else tuple(step_schedule) - ) + self.step_schedule = None if step_schedule is None else tuple(step_schedule) self.jitter = _validate_nonnegative_float(jitter, "jitter") def update_identity(self, meas_noise, measurement, **kwargs): @@ -744,10 +742,7 @@ def _regularize_cov_np(covariance, jitter): eigenvalues = np.linalg.eigvalsh(covariance) spectral_scale = max(float(np.max(np.abs(eigenvalues))), 1.0) tolerance = ( - 10.0 - * np.finfo(float).eps - * max(covariance.shape[0], 1) - * spectral_scale + 10.0 * np.finfo(float).eps * max(covariance.shape[0], 1) * spectral_scale ) min_eigenvalue = float(eigenvalues[0]) if min_eigenvalue < -tolerance: diff --git a/src/pyrecest/filters/dirichlet_process_birth_tracker.py b/src/pyrecest/filters/dirichlet_process_birth_tracker.py index d676d02e3c..c3b5cf28e9 100644 --- a/src/pyrecest/filters/dirichlet_process_birth_tracker.py +++ b/src/pyrecest/filters/dirichlet_process_birth_tracker.py @@ -171,9 +171,7 @@ def predict_linear( """Predict targets and decay DP birth-atom counts.""" survival_probability = self._normalize_birth_atom_survival_probability() pruning_threshold = self._normalize_birth_atom_pruning_threshold() - maximum_number_of_birth_atoms = ( - self._normalize_maximum_number_of_birth_atoms() - ) + maximum_number_of_birth_atoms = self._normalize_maximum_number_of_birth_atoms() super().predict_linear( system_matrices, diff --git a/src/pyrecest/filters/gaussian_hypothesis_mixture.py b/src/pyrecest/filters/gaussian_hypothesis_mixture.py index f2311d598c..c42d815963 100644 --- a/src/pyrecest/filters/gaussian_hypothesis_mixture.py +++ b/src/pyrecest/filters/gaussian_hypothesis_mixture.py @@ -83,9 +83,7 @@ def moment_match_gaussian_hypotheses( continue probability = float(weight) sqrt_probability = np.sqrt(probability) - scaled_diff = ( - sqrt_probability * hypothesis.mean - sqrt_probability * mean - ) + scaled_diff = sqrt_probability * hypothesis.mean - sqrt_probability * mean covariance += probability * hypothesis.covariance + np.outer( scaled_diff, scaled_diff, diff --git a/src/pyrecest/filters/global_nearest_neighbor.py b/src/pyrecest/filters/global_nearest_neighbor.py index 82f7b0f9e1..7fd108c49f 100644 --- a/src/pyrecest/filters/global_nearest_neighbor.py +++ b/src/pyrecest/filters/global_nearest_neighbor.py @@ -22,7 +22,6 @@ from .abstract_nearest_neighbor_tracker import AbstractNearestNeighborTracker - _INVALID_PAIRWISE_COST_SCALAR_TYPES = ( type(None), bool, diff --git a/src/pyrecest/filters/information_form_distributed_kalman_filter.py b/src/pyrecest/filters/information_form_distributed_kalman_filter.py index c0817cdbe7..9d236ba179 100644 --- a/src/pyrecest/filters/information_form_distributed_kalman_filter.py +++ b/src/pyrecest/filters/information_form_distributed_kalman_filter.py @@ -391,9 +391,7 @@ def update_linear( raise ValueError("Cannot update a stale IDKF contribution") H, R = self._resolve_measurement_model(measurement_matrix, meas_noise) - information_vector_increment = H.T @ linalg.solve( - R, atleast_1d(measurement) - ) + information_vector_increment = H.T @ linalg.solve(R, atleast_1d(measurement)) all_models = ( measurement_models @@ -408,9 +406,7 @@ def update_linear( updated_y = contribution.y + information_vector_increment updated_Y = state.Y + information_matrix_increment updated_operation_count = state.operation_count + 1 - updated_operation_hash = _extend_hash( - state.operation_hash, "update_linear" - ) + updated_operation_hash = _extend_hash(state.operation_hash, "update_linear") contribution.y = updated_y state.Y = updated_Y diff --git a/src/pyrecest/filters/joint_probabilistic_data_association_filter.py b/src/pyrecest/filters/joint_probabilistic_data_association_filter.py index e46e51a04f..a4426127e9 100644 --- a/src/pyrecest/filters/joint_probabilistic_data_association_filter.py +++ b/src/pyrecest/filters/joint_probabilistic_data_association_filter.py @@ -91,9 +91,7 @@ def _get_measurement_covariance(cov_mats_meas, measurement_index): ) @staticmethod - def _validate_measurement_covariance_shape( - cov_mats_meas, measurement_dim, n_meas - ): + def _validate_measurement_covariance_shape(cov_mats_meas, measurement_dim, n_meas): shared_shape = (measurement_dim, measurement_dim) per_measurement_shape = (measurement_dim, measurement_dim, n_meas) if cov_mats_meas.shape not in (shared_shape, per_measurement_shape): diff --git a/src/pyrecest/filters/kernel_sme_filter.py b/src/pyrecest/filters/kernel_sme_filter.py index ce39fb98ab..282283825f 100644 --- a/src/pyrecest/filters/kernel_sme_filter.py +++ b/src/pyrecest/filters/kernel_sme_filter.py @@ -444,4 +444,4 @@ def calc_moments( sigma_xs[:, i] += x_prior * lam_c * clutter_pdf[i] sigma_xs[:, i] -= x_prior * mu_s[i] - return mu_s, sigma_s, sigma_xs \ No newline at end of file + return mu_s, sigma_s, sigma_xs diff --git a/src/pyrecest/filters/mode_rbpf_manifold_ukf_tracker.py b/src/pyrecest/filters/mode_rbpf_manifold_ukf_tracker.py index 9774ac96d5..78e4e198c9 100644 --- a/src/pyrecest/filters/mode_rbpf_manifold_ukf_tracker.py +++ b/src/pyrecest/filters/mode_rbpf_manifold_ukf_tracker.py @@ -877,9 +877,7 @@ def _normalize_probs(probs): ) scale = float(np.max(probs)) if scale <= 0.0: - raise ValueError( - "initial_mode_probs must have positive total probability" - ) + raise ValueError("initial_mode_probs must have positive total probability") scaled = probs / scale return scaled / np.sum(scaled) diff --git a/src/pyrecest/filters/multisensor_hdp_association.py b/src/pyrecest/filters/multisensor_hdp_association.py index 6c03018ada..1722a0912b 100644 --- a/src/pyrecest/filters/multisensor_hdp_association.py +++ b/src/pyrecest/filters/multisensor_hdp_association.py @@ -337,19 +337,14 @@ def multisensor_hdp_association( ) log_concentration = np.log(concentration) - target_log_priors = ( - np.logaddexp( - _safe_log(counts), - log_concentration + _safe_log(base_target_weights), - ) - + _safe_log(detection) - ) + target_log_priors = np.logaddexp( + _safe_log(counts), + log_concentration + _safe_log(base_target_weights), + ) + _safe_log(detection) existing_log_weights = log_likelihoods + target_log_priors[None, :] birth_log_weights = ( - birth_log_likelihood - + log_concentration - + _safe_log(base_birth_weight) + birth_log_likelihood + log_concentration + _safe_log(base_birth_weight) ) clutter_log_weights = clutter_log_likelihood + _safe_log(clutter_weight) log_weights = np.concatenate( diff --git a/src/pyrecest/filters/out_of_sequence.py b/src/pyrecest/filters/out_of_sequence.py index fe0528faed..b14d2059e9 100644 --- a/src/pyrecest/filters/out_of_sequence.py +++ b/src/pyrecest/filters/out_of_sequence.py @@ -17,7 +17,9 @@ atleast_1d, atleast_2d, float64, - isfinite as backend_isfinite, +) +from pyrecest.backend import isfinite as backend_isfinite +from pyrecest.backend import ( linalg, maximum, minimum, diff --git a/src/pyrecest/filters/sequence_association.py b/src/pyrecest/filters/sequence_association.py index 6f62962c7a..dc55ec4676 100644 --- a/src/pyrecest/filters/sequence_association.py +++ b/src/pyrecest/filters/sequence_association.py @@ -360,9 +360,8 @@ def _validate_integer(value: object, name: str) -> int: raise ValueError(message) from exc if value_array.ndim != 0 or value_array.dtype == np.bool_: raise ValueError(message) - if ( - value_array.dtype.kind in {"S", "U", "c"} - or _is_temporal_scalar_array(value_array) + if value_array.dtype.kind in {"S", "U", "c"} or _is_temporal_scalar_array( + value_array ): raise ValueError(message) diff --git a/src/pyrecest/filters/state_space_subdivision_filter.py b/src/pyrecest/filters/state_space_subdivision_filter.py index f545141e91..abc0cdacca 100644 --- a/src/pyrecest/filters/state_space_subdivision_filter.py +++ b/src/pyrecest/filters/state_space_subdivision_filter.py @@ -304,9 +304,7 @@ def update( ) if periodic_likelihood_values is not None: - state.gd.grid_values = ( - state.gd.grid_values * periodic_likelihood_values - ) + state.gd.grid_values = state.gd.grid_values * periodic_likelihood_values if likelihoods_linear is not None: if n_likelihoods == 1: diff --git a/src/pyrecest/filters/track_manager.py b/src/pyrecest/filters/track_manager.py index 1479ce25c5..682994cdd7 100644 --- a/src/pyrecest/filters/track_manager.py +++ b/src/pyrecest/filters/track_manager.py @@ -217,8 +217,7 @@ def filter_state(self): @filter_state.setter def filter_state(self, new_state): replacement_filters = [ - self._normalize_filter(filter_or_state) - for filter_or_state in new_state + self._normalize_filter(filter_or_state) for filter_or_state in new_state ] self.tracks = [] diff --git a/src/pyrecest/models/linear_gaussian.py b/src/pyrecest/models/linear_gaussian.py index 7ed22d4ae5..c784cc2bc6 100644 --- a/src/pyrecest/models/linear_gaussian.py +++ b/src/pyrecest/models/linear_gaussian.py @@ -2,8 +2,8 @@ from numbers import Complex, Integral, Real +from pyrecest.backend import all as backend_all from pyrecest.backend import ( - all as backend_all, asarray, ) from pyrecest.backend import copy as backend_copy diff --git a/src/pyrecest/models/motion_models.py b/src/pyrecest/models/motion_models.py index 75fd50a999..8a5685f8f7 100644 --- a/src/pyrecest/models/motion_models.py +++ b/src/pyrecest/models/motion_models.py @@ -375,18 +375,20 @@ def singer_transition_matrix(dt: float, spatial_dim: int = 2, tau: float = 20.0) decay = decay_minus_one + 1.0 velocity_from_acceleration = -decay_minus_one / alpha if abs(scaled_time) < 1.0e-4: - position_from_acceleration = dt * dt * ( - 0.5 - - scaled_time / 6.0 - + scaled_time**2 / 24.0 - - scaled_time**3 / 120.0 - + scaled_time**4 / 720.0 - - scaled_time**5 / 5040.0 + position_from_acceleration = ( + dt + * dt + * ( + 0.5 + - scaled_time / 6.0 + + scaled_time**2 / 24.0 + - scaled_time**3 / 120.0 + + scaled_time**4 / 720.0 + - scaled_time**5 / 5040.0 + ) ) else: - position_from_acceleration = ( - scaled_time + decay_minus_one - ) / alpha**2 + position_from_acceleration = (scaled_time + decay_minus_one) / alpha**2 block = np.array( [ [1.0, dt, position_from_acceleration], diff --git a/src/pyrecest/numerics.py b/src/pyrecest/numerics.py index 2b28e179d4..f39ea1aa67 100644 --- a/src/pyrecest/numerics.py +++ b/src/pyrecest/numerics.py @@ -189,16 +189,12 @@ def _stable_symmetric_average(matrix: np.ndarray) -> np.ndarray: opposite_sign = finite & ~same_sign if np.any(opposite_sign): - result[opposite_sign] = 0.5 * ( - matrix[opposite_sign] + transpose[opposite_sign] - ) + result[opposite_sign] = 0.5 * (matrix[opposite_sign] + transpose[opposite_sign]) nonfinite = ~finite if np.any(nonfinite): with np.errstate(invalid="ignore", over="ignore"): - result[nonfinite] = 0.5 * ( - matrix[nonfinite] + transpose[nonfinite] - ) + result[nonfinite] = 0.5 * (matrix[nonfinite] + transpose[nonfinite]) return result diff --git a/src/pyrecest/sampling/support_points.py b/src/pyrecest/sampling/support_points.py index 8bcfa564a4..8821cadeea 100644 --- a/src/pyrecest/sampling/support_points.py +++ b/src/pyrecest/sampling/support_points.py @@ -382,15 +382,11 @@ def mahalanobis_support_points( eigenvalues, eigenvectors = np.linalg.eigh(covariances) eigenvalues = np.clip(eigenvalues, 0.0, None) positive_eigenvalues = eigenvalues > 0.0 - direction_components = np.einsum( - "mi,bij->bmj", directions_array, eigenvectors - ) + direction_components = np.einsum("mi,bij->bmj", directions_array, eigenvectors) supported_components = np.where( positive_eigenvalues[:, None, :], direction_components, 0.0 ) - supported_directions = np.einsum( - "bmj,bij->bmi", supported_components, eigenvectors - ) + supported_directions = np.einsum("bmj,bij->bmi", supported_components, eigenvectors) inverse_eigenvalues = np.zeros_like(eigenvalues) np.divide( diff --git a/src/pyrecest/smoothers/_record_smoother_numeric_contract.py b/src/pyrecest/smoothers/_record_smoother_numeric_contract.py index 645cd1a332..1b9514c718 100644 --- a/src/pyrecest/smoothers/_record_smoother_numeric_contract.py +++ b/src/pyrecest/smoothers/_record_smoother_numeric_contract.py @@ -6,7 +6,6 @@ from typing import Any import numpy as np - from pyrecest.numerics import is_positive_semidefinite, is_symmetric from . import record_smoother as _record_smoother diff --git a/src/pyrecest/smoothers/_urts_transition_call_contract.py b/src/pyrecest/smoothers/_urts_transition_call_contract.py index e0c586dc5e..c8daf9fd33 100644 --- a/src/pyrecest/smoothers/_urts_transition_call_contract.py +++ b/src/pyrecest/smoothers/_urts_transition_call_contract.py @@ -32,9 +32,7 @@ def _time_step_call_mode(function: Callable) -> tuple[str, str | None] | None: return "positional", None return "keyword", parameter_name - if any( - parameter.kind == inspect.Parameter.VAR_KEYWORD for parameter in parameters - ): + if any(parameter.kind == inspect.Parameter.VAR_KEYWORD for parameter in parameters): return "keyword", "dt" positional_parameters = [ @@ -46,9 +44,13 @@ def _time_step_call_mode(function: Callable) -> tuple[str, str | None] | None: inspect.Parameter.POSITIONAL_OR_KEYWORD, ) ] - if any( - parameter.kind == inspect.Parameter.VAR_POSITIONAL for parameter in parameters - ) or len(positional_parameters) >= 2: + if ( + any( + parameter.kind == inspect.Parameter.VAR_POSITIONAL + for parameter in parameters + ) + or len(positional_parameters) >= 2 + ): return "positional", None return None diff --git a/src/pyrecest/smoothers/abstract_smoother.py b/src/pyrecest/smoothers/abstract_smoother.py index 867352fa36..64978d4d46 100644 --- a/src/pyrecest/smoothers/abstract_smoother.py +++ b/src/pyrecest/smoothers/abstract_smoother.py @@ -161,9 +161,7 @@ def _normalize_vector_sequence( # pylint: disable=too-many-return-statements expected_shape = (vector_dim,) shape_error = f"{name} must contain vectors with shape {expected_shape}." - if isinstance(values, (list, tuple)) and any( - value is None for value in values - ): + if isinstance(values, (list, tuple)) and any(value is None for value in values): values_arr = None else: try: diff --git a/src/pyrecest/tracking/nis_consistency.py b/src/pyrecest/tracking/nis_consistency.py index 4661b67d74..1eddac90d9 100644 --- a/src/pyrecest/tracking/nis_consistency.py +++ b/src/pyrecest/tracking/nis_consistency.py @@ -208,8 +208,7 @@ def estimate_innovation_covariance_scale( parsed_method = str(method).strip().lower() if parsed_method not in INNOVATION_COVARIANCE_SCALE_METHODS: raise ValueError( - "method must be one of " - f"{INNOVATION_COVARIANCE_SCALE_METHODS}" + "method must be one of " f"{INNOVATION_COVARIANCE_SCALE_METHODS}" ) if parsed_method == "mean": @@ -237,7 +236,9 @@ def _as_nis_values(values: Iterable[float]) -> np.ndarray: if isinstance(values, (str, bytes, bytearray)) or _contains_masked_values(values): raise ValueError(message) try: - raw_values = np.asarray(list(values) if not isinstance(values, np.ndarray) else values) + raw_values = np.asarray( + list(values) if not isinstance(values, np.ndarray) else values + ) except (TypeError, ValueError) as exc: raise ValueError(message) from exc if raw_values.ndim == 0: @@ -307,14 +308,20 @@ def _positive_integer(value: Any, name: str) -> int: parsed_float = float(array.item()) except (TypeError, ValueError, OverflowError) as exc: raise ValueError(message) from exc - if not np.isfinite(parsed_float) or not parsed_float.is_integer() or parsed_float <= 0.0: + if ( + not np.isfinite(parsed_float) + or not parsed_float.is_integer() + or parsed_float <= 0.0 + ): raise ValueError(message) return int(parsed_float) def _validate_probability(value: Any, name: str) -> float: message = f"{name} must be a finite scalar in (0, 1)" - if isinstance(value, (bool, np.bool_, str, bytes, bytearray, np.datetime64, np.timedelta64)): + if isinstance( + value, (bool, np.bool_, str, bytes, bytearray, np.datetime64, np.timedelta64) + ): raise ValueError(message) try: array = np.asarray(value) diff --git a/src/pyrecest/utils/_point_set_registration_common.py b/src/pyrecest/utils/_point_set_registration_common.py index 215800556d..08b0f55821 100644 --- a/src/pyrecest/utils/_point_set_registration_common.py +++ b/src/pyrecest/utils/_point_set_registration_common.py @@ -11,7 +11,6 @@ # pylint: disable=no-name-in-module,no-member from pyrecest.backend import abs as backend_abs from pyrecest.backend import all as backend_all -from pyrecest.backend import max as backend_max from pyrecest.backend import ( array_equal, asarray, @@ -19,6 +18,9 @@ empty, int64, isfinite, +) +from pyrecest.backend import max as backend_max +from pyrecest.backend import ( mean, sqrt, to_numpy, @@ -28,7 +30,6 @@ from scipy.optimize import linear_sum_assignment from scipy.spatial.distance import cdist - _INVALID_REAL_SCALAR_TYPES = ( type(None), bool, diff --git a/src/pyrecest/utils/_roi_assignment_extreme_range.py b/src/pyrecest/utils/_roi_assignment_extreme_range.py index abed064058..de721ce304 100644 --- a/src/pyrecest/utils/_roi_assignment_extreme_range.py +++ b/src/pyrecest/utils/_roi_assignment_extreme_range.py @@ -15,8 +15,7 @@ def _cost_conversion_is_finite( threshold_cost = max_similarity - min_similarity dummy_penalty = max( 1e-12, - sys.float_info.epsilon - * max(1.0, abs(max_similarity), abs(min_similarity)), + sys.float_info.epsilon * max(1.0, abs(max_similarity), abs(min_similarity)), ) return math.isfinite(threshold_cost) and math.isfinite( threshold_cost + dummy_penalty diff --git a/src/pyrecest/utils/_roi_assignment_otsu.py b/src/pyrecest/utils/_roi_assignment_otsu.py index d2c1fa1b63..d6d3bc2bf0 100644 --- a/src/pyrecest/utils/_roi_assignment_otsu.py +++ b/src/pyrecest/utils/_roi_assignment_otsu.py @@ -56,13 +56,12 @@ def _patch_minimum_similarity_threshold(roi_assignment_module) -> None: """Validate histogram inputs before minimum-threshold early returns.""" original_minimum = roi_assignment_module.minimum_similarity_threshold - if ( - getattr(original_minimum, "_pyrecest_positive_nbins_validation", False) - and getattr( - original_minimum, - "_pyrecest_masked_similarity_validation", - False, - ) + if getattr( + original_minimum, "_pyrecest_positive_nbins_validation", False + ) and getattr( + original_minimum, + "_pyrecest_masked_similarity_validation", + False, ): return diff --git a/src/pyrecest/utils/metrics.py b/src/pyrecest/utils/metrics.py index 2c9135720e..322c9ffa55 100644 --- a/src/pyrecest/utils/metrics.py +++ b/src/pyrecest/utils/metrics.py @@ -569,9 +569,7 @@ def _as_covariance_stack( if covariance_array.ndim == 2: if covariance_array.shape != (dim, dim): raise ValueError(f"{name} must have shape ({dim}, {dim})") - covariance_stack = np.broadcast_to( - covariance_array, (n_samples, dim, dim) - ) + covariance_stack = np.broadcast_to(covariance_array, (n_samples, dim, dim)) elif covariance_array.ndim == 3: if covariance_array.shape != (n_samples, dim, dim): raise ValueError(f"{name} must have shape ({n_samples}, {dim}, {dim})") @@ -604,11 +602,7 @@ def _as_covariance_stack( def _as_positive_int(value: Any, name: str) -> int: array = np.asarray(value) - if ( - array.ndim != 0 - or array.dtype == np.bool_ - or array.dtype.kind in {"M", "m"} - ): + if array.ndim != 0 or array.dtype == np.bool_ or array.dtype.kind in {"M", "m"}: raise ValueError(f"{name} must be a positive integer") scalar = array.item() if isinstance(scalar, (int, np.integer)) and not isinstance(scalar, bool): diff --git a/src/pyrecest/utils/point_set_registration.py b/src/pyrecest/utils/point_set_registration.py index 1a7d60b724..f291b54715 100644 --- a/src/pyrecest/utils/point_set_registration.py +++ b/src/pyrecest/utils/point_set_registration.py @@ -214,8 +214,10 @@ def _validate_positive_integer(value, name: str, *, minimum: int = 1) -> int: except TypeError: pass - if isinstance(value, np.ndarray) and value.shape == () and isinstance( - value.item(), temporal_types + if ( + isinstance(value, np.ndarray) + and value.shape == () + and isinstance(value.item(), temporal_types) ): raise ValueError(error_message) diff --git a/tests/backend/test_jax_fftshift_axis_normalization.py b/tests/backend/test_jax_fftshift_axis_normalization.py index 624261de0e..8360daf339 100644 --- a/tests/backend/test_jax_fftshift_axis_normalization.py +++ b/tests/backend/test_jax_fftshift_axis_normalization.py @@ -3,7 +3,6 @@ jax = pytest.importorskip("jax") import jax.numpy as jnp # noqa: E402 - from pyrecest._backend.jax import fft # noqa: E402 diff --git a/tests/backend/test_jax_random_singular_multivariate_normal.py b/tests/backend/test_jax_random_singular_multivariate_normal.py index 949ab0fe8f..c6741ef255 100644 --- a/tests/backend/test_jax_random_singular_multivariate_normal.py +++ b/tests/backend/test_jax_random_singular_multivariate_normal.py @@ -9,9 +9,7 @@ def test_multivariate_normal_zero_covariance_returns_mean(): random.seed(0) mean = np.array([1.5, -2.0]) - sample = np.asarray( - random.multivariate_normal(mean, np.zeros((2, 2)), size=8) - ) + sample = np.asarray(random.multivariate_normal(mean, np.zeros((2, 2)), size=8)) assert np.isfinite(sample).all() np.testing.assert_allclose( diff --git a/tests/backend/test_numpy_fractional_matrix_power_exponent_validation.py b/tests/backend/test_numpy_fractional_matrix_power_exponent_validation.py index e554d48271..ee5b57c7e4 100644 --- a/tests/backend/test_numpy_fractional_matrix_power_exponent_validation.py +++ b/tests/backend/test_numpy_fractional_matrix_power_exponent_validation.py @@ -2,7 +2,6 @@ import pytest from pyrecest._backend.numpy import linalg - _MATRIX = np.diag([4.0, 9.0]) @@ -16,9 +15,7 @@ np.timedelta64(2, "ns"), np.datetime64("1970-01-01T00:00:00.000000002"), np.array(np.timedelta64(2, "ns"), dtype=object), - np.array( - np.datetime64("1970-01-01T00:00:00.000000002"), dtype=object - ), + np.array(np.datetime64("1970-01-01T00:00:00.000000002"), dtype=object), "0.5", 0.5 + 0.0j, ], diff --git a/tests/backend/test_numpy_linalg_zero_by_zero_matrix_functions.py b/tests/backend/test_numpy_linalg_zero_by_zero_matrix_functions.py index 92668c9444..c96767d251 100644 --- a/tests/backend/test_numpy_linalg_zero_by_zero_matrix_functions.py +++ b/tests/backend/test_numpy_linalg_zero_by_zero_matrix_functions.py @@ -1,6 +1,5 @@ import numpy as np import pytest - from pyrecest._backend.numpy import linalg diff --git a/tests/backend/test_numpy_random_masked_parameters.py b/tests/backend/test_numpy_random_masked_parameters.py index b950f833b1..354b4d9255 100644 --- a/tests/backend/test_numpy_random_masked_parameters.py +++ b/tests/backend/test_numpy_random_masked_parameters.py @@ -1,6 +1,5 @@ import numpy as np import pytest - from pyrecest._backend.numpy import random diff --git a/tests/backend/test_numpy_random_masked_size.py b/tests/backend/test_numpy_random_masked_size.py index a1a9a3a8bc..f283db127e 100644 --- a/tests/backend/test_numpy_random_masked_size.py +++ b/tests/backend/test_numpy_random_masked_size.py @@ -2,7 +2,6 @@ import pytest from pyrecest._backend.numpy import random - _MASKED_SIZE_ARGUMENTS = ( np.ma.masked, np.ma.array(3, mask=True), diff --git a/tests/backend/test_pytorch_randint_array_precision.py b/tests/backend/test_pytorch_randint_array_precision.py index edace15274..8e39fae3b5 100644 --- a/tests/backend/test_pytorch_randint_array_precision.py +++ b/tests/backend/test_pytorch_randint_array_precision.py @@ -2,7 +2,6 @@ import pytest - torch = pytest.importorskip("torch") from pyrecest._backend.pytorch import random # noqa: E402 diff --git a/tests/backend/test_pytorch_randint_dtype_bounds.py b/tests/backend/test_pytorch_randint_dtype_bounds.py index d633ecfa4b..3de40b1f37 100644 --- a/tests/backend/test_pytorch_randint_dtype_bounds.py +++ b/tests/backend/test_pytorch_randint_dtype_bounds.py @@ -1,7 +1,6 @@ import numpy as np import pytest - torch = pytest.importorskip("torch") from pyrecest._backend.pytorch import random # noqa: E402 @@ -16,9 +15,7 @@ ([0], [129], np.int8, "high is out of bounds for int8"), ], ) -def test_array_randint_rejects_bounds_outside_output_dtype( - low, high, dtype, message -): +def test_array_randint_rejects_bounds_outside_output_dtype(low, high, dtype, message): with pytest.raises(ValueError, match=message): random.randint(low, high, dtype=dtype) diff --git a/tests/backend/test_pytorch_random_multivariate_normal_keywords.py b/tests/backend/test_pytorch_random_multivariate_normal_keywords.py index f4d1982ee3..4f4fd0e773 100644 --- a/tests/backend/test_pytorch_random_multivariate_normal_keywords.py +++ b/tests/backend/test_pytorch_random_multivariate_normal_keywords.py @@ -1,7 +1,6 @@ import numpy as np import pytest - torch = pytest.importorskip("torch") from pyrecest._backend.pytorch import random # noqa: E402 diff --git a/tests/backend/test_pytorch_random_singular_multivariate_normal.py b/tests/backend/test_pytorch_random_singular_multivariate_normal.py index 131d272305..2514f1092d 100644 --- a/tests/backend/test_pytorch_random_singular_multivariate_normal.py +++ b/tests/backend/test_pytorch_random_singular_multivariate_normal.py @@ -1,7 +1,6 @@ import numpy as np import pytest - torch = pytest.importorskip("torch") from pyrecest._backend.pytorch import random # noqa: E402 diff --git a/tests/calibration/test_time_offset_grid_extreme_range.py b/tests/calibration/test_time_offset_grid_extreme_range.py index 25043041d9..6fca99c1d9 100644 --- a/tests/calibration/test_time_offset_grid_extreme_range.py +++ b/tests/calibration/test_time_offset_grid_extreme_range.py @@ -1,6 +1,5 @@ import numpy as np import numpy.testing as npt - from pyrecest.calibration.time_offset import make_offset_grid diff --git a/tests/distributions/test_abstract_mixture_temporal_weights.py b/tests/distributions/test_abstract_mixture_temporal_weights.py index e18ba4cb95..a6a3ccaf71 100644 --- a/tests/distributions/test_abstract_mixture_temporal_weights.py +++ b/tests/distributions/test_abstract_mixture_temporal_weights.py @@ -1,7 +1,6 @@ import unittest import numpy as np - from pyrecest.distributions.abstract_mixture import _validate_mixture_weight_values diff --git a/tests/distributions/test_complex_acg_sample_count_precision.py b/tests/distributions/test_complex_acg_sample_count_precision.py index be98466cb2..53b99159ab 100644 --- a/tests/distributions/test_complex_acg_sample_count_precision.py +++ b/tests/distributions/test_complex_acg_sample_count_precision.py @@ -2,7 +2,6 @@ from fractions import Fraction import numpy as np - from pyrecest.distributions.hypersphere_subset.complex_angular_central_gaussian_distribution import ( _validate_positive_sample_count, ) diff --git a/tests/distributions/test_complex_watson_temporal_sample_count.py b/tests/distributions/test_complex_watson_temporal_sample_count.py index 12dd3e549b..ef8688604a 100644 --- a/tests/distributions/test_complex_watson_temporal_sample_count.py +++ b/tests/distributions/test_complex_watson_temporal_sample_count.py @@ -1,11 +1,9 @@ import numpy as np -import pytest - import pyrecest.backend +import pytest from pyrecest.backend import array, complex128 from pyrecest.distributions import ComplexWatsonDistribution - pytestmark = pytest.mark.skipif( pyrecest.backend.__backend_name__ == "jax", reason="Complex Watson sampling is not supported on the JAX backend", diff --git a/tests/distributions/test_dirac_reweight_underflow.py b/tests/distributions/test_dirac_reweight_underflow.py index 33fd6cdb55..2bcf732dbe 100644 --- a/tests/distributions/test_dirac_reweight_underflow.py +++ b/tests/distributions/test_dirac_reweight_underflow.py @@ -5,7 +5,6 @@ import numpy as np import numpy.testing as npt import pyrecest.backend - from pyrecest.backend import array from pyrecest.distributions import LinearDiracDistribution diff --git a/tests/distributions/test_ellipsoidal_ball_temporal_sample_count.py b/tests/distributions/test_ellipsoidal_ball_temporal_sample_count.py index 0e5cd24c2e..8a4eda0594 100644 --- a/tests/distributions/test_ellipsoidal_ball_temporal_sample_count.py +++ b/tests/distributions/test_ellipsoidal_ball_temporal_sample_count.py @@ -1,6 +1,5 @@ import numpy as np import pytest - from pyrecest.backend import array, diag from pyrecest.distributions import EllipsoidalBallUniformDistribution diff --git a/tests/distributions/test_gauss_von_mises_scalar_validation.py b/tests/distributions/test_gauss_von_mises_scalar_validation.py index 4f7a6c0b2e..db93e5af25 100644 --- a/tests/distributions/test_gauss_von_mises_scalar_validation.py +++ b/tests/distributions/test_gauss_von_mises_scalar_validation.py @@ -49,9 +49,7 @@ def test_rejects_nonreal_or_masked_sample_counts(invalid_count): 0.5 + 0.0j, ], ) -def test_constructor_rejects_nonreal_or_masked_scalars( - parameter_name, invalid_value -): +def test_constructor_rejects_nonreal_or_masked_scalars(parameter_name, invalid_value): with pytest.raises(ValueError, match=parameter_name): _make_distribution(**{parameter_name: invalid_value}) diff --git a/tests/distributions/test_gaussian_marginalize_out_validation.py b/tests/distributions/test_gaussian_marginalize_out_validation.py index 9da6cbc212..510256396e 100644 --- a/tests/distributions/test_gaussian_marginalize_out_validation.py +++ b/tests/distributions/test_gaussian_marginalize_out_validation.py @@ -1,7 +1,6 @@ import unittest import numpy as np - from pyrecest.backend import array from pyrecest.distributions import GaussianDistribution diff --git a/tests/distributions/test_gaussian_mixture_complex_mean.py b/tests/distributions/test_gaussian_mixture_complex_mean.py index 4604d27a14..48c3ba18df 100644 --- a/tests/distributions/test_gaussian_mixture_complex_mean.py +++ b/tests/distributions/test_gaussian_mixture_complex_mean.py @@ -11,12 +11,8 @@ class GaussianMixtureComplexMeanTest(unittest.TestCase): def test_set_mean_rejects_complex_target_without_mutating_components(self): - component_1 = GaussianDistribution( - array([0.0, 1.0]), diag(array([1.0, 2.0])) - ) - component_2 = GaussianDistribution( - array([2.0, 3.0]), diag(array([3.0, 4.0])) - ) + component_1 = GaussianDistribution(array([0.0, 1.0]), diag(array([1.0, 2.0]))) + component_2 = GaussianDistribution(array([2.0, 3.0]), diag(array([3.0, 4.0]))) mixture = GaussianMixture([component_1, component_2], array([0.25, 0.75])) original_means = [to_numpy(dist.mu).copy() for dist in mixture.dists] diff --git a/tests/distributions/test_hypercylindrical_zero_marginals.py b/tests/distributions/test_hypercylindrical_zero_marginals.py index d782d86cc5..673982ab36 100644 --- a/tests/distributions/test_hypercylindrical_zero_marginals.py +++ b/tests/distributions/test_hypercylindrical_zero_marginals.py @@ -2,7 +2,6 @@ from math import pi import numpy as np - from pyrecest.backend import __backend_name__ as backend_name from pyrecest.backend import array from pyrecest.distributions.cart_prod.hypercylindrical_state_space_subdivision_distribution import ( diff --git a/tests/distributions/test_hypertoroidal_mixed_boolean_input_validation.py b/tests/distributions/test_hypertoroidal_mixed_boolean_input_validation.py index decf71c831..2061319113 100644 --- a/tests/distributions/test_hypertoroidal_mixed_boolean_input_validation.py +++ b/tests/distributions/test_hypertoroidal_mixed_boolean_input_validation.py @@ -23,9 +23,7 @@ def test_rejects_mixed_boolean_evaluation_points(self): def test_numeric_python_sequences_remain_valid(self): npt.assert_allclose(as_shift_vector([0.0, 1.0], 2), [0.0, 1.0]) - npt.assert_allclose( - as_hypertoroidal_points([[0.0, 1.0]], 2), [[0.0, 1.0]] - ) + npt.assert_allclose(as_hypertoroidal_points([[0.0, 1.0]], 2), [[0.0, 1.0]]) if __name__ == "__main__": diff --git a/tests/distributions/test_hypertoroidal_python_scalar_integrand.py b/tests/distributions/test_hypertoroidal_python_scalar_integrand.py index a94be22f9e..1c2077135b 100644 --- a/tests/distributions/test_hypertoroidal_python_scalar_integrand.py +++ b/tests/distributions/test_hypertoroidal_python_scalar_integrand.py @@ -1,7 +1,6 @@ import numpy as np import numpy.testing as npt import pytest - from pyrecest import backend from pyrecest.distributions import AbstractHypertoroidalDistribution diff --git a/tests/distributions/test_linear_box_particle_temporal_count.py b/tests/distributions/test_linear_box_particle_temporal_count.py index e75c61e84a..31e9ef6859 100644 --- a/tests/distributions/test_linear_box_particle_temporal_count.py +++ b/tests/distributions/test_linear_box_particle_temporal_count.py @@ -1,6 +1,5 @@ import numpy as np import pytest - from pyrecest.backend import array from pyrecest.distributions.nonperiodic.linear_box_particle_distribution import ( LinearBoxParticleDistribution, diff --git a/tests/distributions/test_linear_dirac_apply_function_dimension.py b/tests/distributions/test_linear_dirac_apply_function_dimension.py index ebe9f35443..3e732f03fd 100644 --- a/tests/distributions/test_linear_dirac_apply_function_dimension.py +++ b/tests/distributions/test_linear_dirac_apply_function_dimension.py @@ -1,5 +1,4 @@ import numpy.testing as npt - from pyrecest.backend import array from pyrecest.distributions import LinearDiracDistribution diff --git a/tests/distributions/test_mixture_masked_weights.py b/tests/distributions/test_mixture_masked_weights.py index 3c878f1add..40203ab172 100644 --- a/tests/distributions/test_mixture_masked_weights.py +++ b/tests/distributions/test_mixture_masked_weights.py @@ -2,7 +2,6 @@ import numpy as np import pytest - from pyrecest.backend import array, to_numpy from pyrecest.distributions.nonperiodic.gaussian_distribution import ( GaussianDistribution, @@ -30,8 +29,6 @@ def test_mixture_rejects_masked_weights(weights): def test_unmasked_masked_array_weights_remain_supported(): - mixture = GaussianMixture( - _components(), np.ma.array([0.25, 0.75], mask=False) - ) + mixture = GaussianMixture(_components(), np.ma.array([0.25, 0.75], mask=False)) np.testing.assert_allclose(to_numpy(mixture.w), [0.25, 0.75]) diff --git a/tests/distributions/test_partially_wrapped_normal_hybrid_moment_order.py b/tests/distributions/test_partially_wrapped_normal_hybrid_moment_order.py index d1d045a31a..15c01efee8 100644 --- a/tests/distributions/test_partially_wrapped_normal_hybrid_moment_order.py +++ b/tests/distributions/test_partially_wrapped_normal_hybrid_moment_order.py @@ -2,7 +2,6 @@ import numpy as np import numpy.testing as npt - from pyrecest.backend import array from pyrecest.distributions.cart_prod.partially_wrapped_normal_distribution import ( PartiallyWrappedNormalDistribution, diff --git a/tests/distributions/test_piecewise_constant_interval_index_validation.py b/tests/distributions/test_piecewise_constant_interval_index_validation.py index 521852682a..675aa59025 100644 --- a/tests/distributions/test_piecewise_constant_interval_index_validation.py +++ b/tests/distributions/test_piecewise_constant_interval_index_validation.py @@ -1,6 +1,5 @@ import numpy as np import pytest - from pyrecest.distributions.circle.piecewise_constant_distribution import ( PiecewiseConstantDistribution, ) diff --git a/tests/distributions/test_se2_dirac_temporal_particle_count.py b/tests/distributions/test_se2_dirac_temporal_particle_count.py index 20704ce014..8be4cda233 100644 --- a/tests/distributions/test_se2_dirac_temporal_particle_count.py +++ b/tests/distributions/test_se2_dirac_temporal_particle_count.py @@ -1,6 +1,5 @@ import numpy as np import pytest - from pyrecest.distributions import SE2DiracDistribution from pyrecest.distributions.cart_prod.abstract_hypercylindrical_distribution import ( AbstractHypercylindricalDistribution, @@ -18,10 +17,14 @@ def sample(self, n): raise AssertionError("invalid temporal counts must not reach sampling") def marginalize_linear(self): - raise AssertionError("marginalization must not be evaluated for count validation") + raise AssertionError( + "marginalization must not be evaluated for count validation" + ) def marginalize_periodic(self): - raise AssertionError("marginalization must not be evaluated for count validation") + raise AssertionError( + "marginalization must not be evaluated for count validation" + ) @pytest.mark.parametrize( diff --git a/tests/distributions/test_so3_conversion_validation.py b/tests/distributions/test_so3_conversion_validation.py index 09ebb67f14..d3b6f9e697 100644 --- a/tests/distributions/test_so3_conversion_validation.py +++ b/tests/distributions/test_so3_conversion_validation.py @@ -16,7 +16,6 @@ SO3TangentGaussianDistribution, ) - _TEMPORAL_VALUES = ( np.timedelta64(3, "ns"), np.timedelta64(3, "us"), diff --git a/tests/distributions/test_so3_product_dirac_extreme_norms.py b/tests/distributions/test_so3_product_dirac_extreme_norms.py index 62d64a4a96..bda39834f3 100644 --- a/tests/distributions/test_so3_product_dirac_extreme_norms.py +++ b/tests/distributions/test_so3_product_dirac_extreme_norms.py @@ -2,7 +2,6 @@ import numpy as np import numpy.testing as npt - from pyrecest.backend import array, to_numpy from pyrecest.distributions import SO3ProductDiracDistribution diff --git a/tests/distributions/test_von_mises_temporal_sample_count.py b/tests/distributions/test_von_mises_temporal_sample_count.py index 467b42c503..66d58a2ad4 100644 --- a/tests/distributions/test_von_mises_temporal_sample_count.py +++ b/tests/distributions/test_von_mises_temporal_sample_count.py @@ -1,6 +1,5 @@ import numpy as np import pytest - from pyrecest.distributions import VonMisesDistribution diff --git a/tests/distributions/test_wrapped_exponential_extreme_rate.py b/tests/distributions/test_wrapped_exponential_extreme_rate.py index 0f24e350e6..98ec27b1e4 100644 --- a/tests/distributions/test_wrapped_exponential_extreme_rate.py +++ b/tests/distributions/test_wrapped_exponential_extreme_rate.py @@ -2,7 +2,6 @@ import numpy as np import numpy.testing as npt - import pyrecest.backend from pyrecest.backend import array from pyrecest.distributions.circle.wrapped_exponential_distribution import ( diff --git a/tests/distributions/test_wrapped_normal_temporal_sample_counts.py b/tests/distributions/test_wrapped_normal_temporal_sample_counts.py index 1a697b5480..fc39951a19 100644 --- a/tests/distributions/test_wrapped_normal_temporal_sample_counts.py +++ b/tests/distributions/test_wrapped_normal_temporal_sample_counts.py @@ -1,6 +1,5 @@ import numpy as np import pytest - from pyrecest.distributions import WrappedNormalDistribution diff --git a/tests/evaluation/test_euclidean_mtt_extreme_coordinates.py b/tests/evaluation/test_euclidean_mtt_extreme_coordinates.py index 78eacc6169..4d841ca17d 100644 --- a/tests/evaluation/test_euclidean_mtt_extreme_coordinates.py +++ b/tests/evaluation/test_euclidean_mtt_extreme_coordinates.py @@ -4,7 +4,6 @@ import numpy as np import numpy.testing as npt - from pyrecest.evaluation.get_distance_function import get_distance_function diff --git a/tests/evaluation/test_integer_estimate_history.py b/tests/evaluation/test_integer_estimate_history.py index 82f48dde1a..385f8379e0 100644 --- a/tests/evaluation/test_integer_estimate_history.py +++ b/tests/evaluation/test_integer_estimate_history.py @@ -1,7 +1,6 @@ import numpy as np import numpy.testing as npt import pytest - from pyrecest.backend import array, get_backend_name from pyrecest.evaluation import perform_predict_update_cycles from pyrecest.evaluation.configure_for_filter import register_filter_factory diff --git a/tests/evaluation/test_tracking_metrics.py b/tests/evaluation/test_tracking_metrics.py index c98d471193..ef7767541b 100644 --- a/tests/evaluation/test_tracking_metrics.py +++ b/tests/evaluation/test_tracking_metrics.py @@ -4,7 +4,6 @@ import numpy as np import pytest - from pyrecest.evaluation.tracking_metrics import ( HOTA_ALPHAS, TrackingSequence, @@ -31,7 +30,9 @@ def _sequence( return TrackingSequence( gt_ids=tuple(np.asarray(values, dtype=int) for values in gt_ids), tracker_ids=tuple(np.asarray(values, dtype=int) for values in tracker_ids), - similarity_scores=tuple(np.asarray(values, dtype=float) for values in similarities), + similarity_scores=tuple( + np.asarray(values, dtype=float) for values in similarities + ), num_gt_ids=num_gt_ids, num_tracker_ids=num_tracker_ids, ) diff --git a/tests/filters/test_block_particle_filter.py b/tests/filters/test_block_particle_filter.py index 4d3bc1d094..2bfe6be226 100644 --- a/tests/filters/test_block_particle_filter.py +++ b/tests/filters/test_block_particle_filter.py @@ -142,9 +142,7 @@ def test_normalizes_extreme_finite_weights_without_overflow(self): expected = np.array([2.0 / 3.0, 1.0 / 3.0]) npt.assert_allclose(to_numpy(filt.weights), expected) - npt.assert_allclose( - to_numpy(filt.block_weights), np.tile(expected, (2, 1)) - ) + npt.assert_allclose(to_numpy(filt.block_weights), np.tile(expected, (2, 1))) def test_rejects_nonfinite_weights(self): for invalid_weight in (float("nan"), float("inf"), -float("inf")): diff --git a/tests/filters/test_daum_huang_extreme_normalization.py b/tests/filters/test_daum_huang_extreme_normalization.py index 27765b7780..97ca10b073 100644 --- a/tests/filters/test_daum_huang_extreme_normalization.py +++ b/tests/filters/test_daum_huang_extreme_normalization.py @@ -3,7 +3,6 @@ import numpy as np import numpy.testing as npt import pytest - from pyrecest import backend from pyrecest.filters.daum_huang_particle_filter import gaussian_particle_flow_update diff --git a/tests/filters/test_daum_huang_particle_flow_validation.py b/tests/filters/test_daum_huang_particle_flow_validation.py index 228fbd8c1f..8e4659c4ac 100644 --- a/tests/filters/test_daum_huang_particle_flow_validation.py +++ b/tests/filters/test_daum_huang_particle_flow_validation.py @@ -1,6 +1,5 @@ import numpy as np import pytest - from pyrecest.backend import array, to_numpy from pyrecest.filters.daum_huang_particle_filter import ( gaussian_bridge_moments, diff --git a/tests/filters/test_discrete_state_extreme_gaussian_transition.py b/tests/filters/test_discrete_state_extreme_gaussian_transition.py index f772ecaaca..4be13111eb 100644 --- a/tests/filters/test_discrete_state_extreme_gaussian_transition.py +++ b/tests/filters/test_discrete_state_extreme_gaussian_transition.py @@ -1,7 +1,6 @@ """Regression tests for scale-safe sparse Gaussian grid transitions.""" import numpy as np - from pyrecest.filters.discrete_state import sparse_gaussian_transition_matrix diff --git a/tests/filters/test_discrete_state_nonfinite_emissions.py b/tests/filters/test_discrete_state_nonfinite_emissions.py index 00b2d32da2..ec559a58fc 100644 --- a/tests/filters/test_discrete_state_nonfinite_emissions.py +++ b/tests/filters/test_discrete_state_nonfinite_emissions.py @@ -2,7 +2,6 @@ import numpy as np import pytest - from pyrecest.filters.discrete_state import ( discrete_forward_backward, discrete_forward_backward_time_varying, diff --git a/tests/filters/test_euclidean_boxed_particle_filter_zero_support_likelihood.py b/tests/filters/test_euclidean_boxed_particle_filter_zero_support_likelihood.py index f1de6cd213..b4144dcfe4 100644 --- a/tests/filters/test_euclidean_boxed_particle_filter_zero_support_likelihood.py +++ b/tests/filters/test_euclidean_boxed_particle_filter_zero_support_likelihood.py @@ -2,7 +2,6 @@ import numpy as np import numpy.testing as npt - from pyrecest.backend import array, to_numpy from pyrecest.distributions.nonperiodic.linear_dirac_distribution import ( LinearDiracDistribution, diff --git a/tests/filters/test_gaussian_hypothesis_impossible_weights.py b/tests/filters/test_gaussian_hypothesis_impossible_weights.py index 1b367d9af0..18ffe49287 100644 --- a/tests/filters/test_gaussian_hypothesis_impossible_weights.py +++ b/tests/filters/test_gaussian_hypothesis_impossible_weights.py @@ -2,7 +2,6 @@ import numpy as np import pytest - from pyrecest.filters import ( WeightedGaussianHypothesis, moment_match_gaussian_hypotheses, diff --git a/tests/filters/test_gnn_pairwise_cost_weight_validation.py b/tests/filters/test_gnn_pairwise_cost_weight_validation.py index a3be13f890..d2f3f2e6fe 100644 --- a/tests/filters/test_gnn_pairwise_cost_weight_validation.py +++ b/tests/filters/test_gnn_pairwise_cost_weight_validation.py @@ -36,15 +36,13 @@ def test_rejects_invalid_pairwise_cost_weights(self): def test_accepts_finite_nonnegative_scalar_weights(self): for valid_weight in (0, 0.5, np.float64(2.0)): with self.subTest(pairwise_cost_weight=valid_weight): - validated_weight = ( - GlobalNearestNeighbor._validate_pairwise_cost_weight(valid_weight) + validated_weight = GlobalNearestNeighbor._validate_pairwise_cost_weight( + valid_weight ) self.assertEqual(validated_weight, float(valid_weight)) def test_zero_weight_ignores_positive_infinite_pairwise_gate(self): - tracker = GlobalNearestNeighbor( - association_param={"pairwise_cost_weight": 0.0} - ) + tracker = GlobalNearestNeighbor(association_param={"pairwise_cost_weight": 0.0}) geometric_costs = np.array([[1.25]]) combined_costs = tracker._apply_pairwise_cost_matrix( @@ -54,9 +52,7 @@ def test_zero_weight_ignores_positive_infinite_pairwise_gate(self): npt.assert_array_equal(combined_costs, geometric_costs) def test_positive_weight_scales_pairwise_costs(self): - tracker = GlobalNearestNeighbor( - association_param={"pairwise_cost_weight": 2.0} - ) + tracker = GlobalNearestNeighbor(association_param={"pairwise_cost_weight": 2.0}) combined_costs = tracker._apply_pairwise_cost_matrix( np.array([[1.0, 2.0]]), np.array([[3.0, 4.0]]) diff --git a/tests/filters/test_gnn_pairwise_object_cost_validation.py b/tests/filters/test_gnn_pairwise_object_cost_validation.py index 1956a965ac..53222d0fb1 100644 --- a/tests/filters/test_gnn_pairwise_object_cost_validation.py +++ b/tests/filters/test_gnn_pairwise_object_cost_validation.py @@ -78,12 +78,10 @@ def test_rejects_native_temporal_dtypes(self): ) def test_accepts_real_numeric_values(self): - pairwise_cost_matrix = ( - GlobalNearestNeighbor._validate_pairwise_cost_matrix( - [[1, 2.5]], - 1, - 2, - ) + pairwise_cost_matrix = GlobalNearestNeighbor._validate_pairwise_cost_matrix( + [[1, 2.5]], + 1, + 2, ) np.testing.assert_allclose(pairwise_cost_matrix, [[1.0, 2.5]]) diff --git a/tests/filters/test_goal_conditioned_replay_imm_probability_validation.py b/tests/filters/test_goal_conditioned_replay_imm_probability_validation.py index 8eb0e83405..a1df392a8d 100644 --- a/tests/filters/test_goal_conditioned_replay_imm_probability_validation.py +++ b/tests/filters/test_goal_conditioned_replay_imm_probability_validation.py @@ -20,12 +20,8 @@ def _construct(**kwargs): def test_rejects_nonfinite_transition_matrix_entries(self): invalid_matrices = { - "goal_transition_matrix": array( - [[1.0, 0.0], [float("nan"), 1.0]] - ), - "mode_transition_matrix": array( - [[1.0, 0.0], [float("nan"), 1.0]] - ), + "goal_transition_matrix": array([[1.0, 0.0], [float("nan"), 1.0]]), + "mode_transition_matrix": array([[1.0, 0.0], [float("nan"), 1.0]]), } for name, matrix in invalid_matrices.items(): diff --git a/tests/filters/test_hyperhemisphere_cart_prod_deterministic_prediction.py b/tests/filters/test_hyperhemisphere_cart_prod_deterministic_prediction.py index 173a052e6b..2fc8f7cc79 100644 --- a/tests/filters/test_hyperhemisphere_cart_prod_deterministic_prediction.py +++ b/tests/filters/test_hyperhemisphere_cart_prod_deterministic_prediction.py @@ -1,7 +1,6 @@ import unittest import numpy as np - import pyrecest.backend # pylint: disable=no-name-in-module,no-member from pyrecest.backend import array # pylint: disable=no-name-in-module,no-member from pyrecest.distributions.cart_prod.hyperhemisphere_cart_prod_dirac_distribution import ( diff --git a/tests/filters/test_hyperspherical_ukf_extreme_vector_normalization.py b/tests/filters/test_hyperspherical_ukf_extreme_vector_normalization.py index ba63c588ab..7cf2638334 100644 --- a/tests/filters/test_hyperspherical_ukf_extreme_vector_normalization.py +++ b/tests/filters/test_hyperspherical_ukf_extreme_vector_normalization.py @@ -1,8 +1,7 @@ import numpy as np import numpy.testing as npt -import pytest - import pyrecest.backend +import pytest from pyrecest.backend import array from pyrecest.filters.hyperspherical_ukf import HypersphericalUKF diff --git a/tests/filters/test_imm_positive_infinite_log_likelihood.py b/tests/filters/test_imm_positive_infinite_log_likelihood.py index 81f78a1b29..29181cbf3d 100644 --- a/tests/filters/test_imm_positive_infinite_log_likelihood.py +++ b/tests/filters/test_imm_positive_infinite_log_likelihood.py @@ -1,7 +1,6 @@ import numpy as np import numpy.testing as npt import pytest - from pyrecest.distributions import GaussianDistribution from pyrecest.filters import InteractingMultipleModelFilter @@ -33,9 +32,7 @@ def test_positive_infinite_log_likelihood_is_rejected_atomically(): expected_log_likelihoods = imm.latest_log_model_likelihoods.copy() with pytest.raises(ValueError, match="positive infinity"): - imm.update_mode_probabilities( - log_likelihoods=np.array([float("inf"), 0.0]) - ) + imm.update_mode_probabilities(log_likelihoods=np.array([float("inf"), 0.0])) npt.assert_array_equal(imm.mode_probabilities, expected_probabilities) npt.assert_array_equal(imm.latest_model_likelihoods, expected_likelihoods) diff --git a/tests/filters/test_information_form_distributed_kalman_filter_atomicity.py b/tests/filters/test_information_form_distributed_kalman_filter_atomicity.py index d939a7f66b..8d5c6474a5 100644 --- a/tests/filters/test_information_form_distributed_kalman_filter_atomicity.py +++ b/tests/filters/test_information_form_distributed_kalman_filter_atomicity.py @@ -37,10 +37,11 @@ def _assert_idkf_state_unchanged(node, snapshot): assert allclose(actual_contribution.y, expected_contribution.y) assert actual_contribution.epoch == expected_contribution.epoch assert ( - actual_contribution.operation_count - == expected_contribution.operation_count + actual_contribution.operation_count == expected_contribution.operation_count + ) + assert ( + actual_contribution.operation_hash == expected_contribution.operation_hash ) - assert actual_contribution.operation_hash == expected_contribution.operation_hash assert node.seen_contribution_ids == expected_seen_ids diff --git a/tests/filters/test_interacting_multiple_model_prediction_atomicity.py b/tests/filters/test_interacting_multiple_model_prediction_atomicity.py index 5e8246fff4..7359f59fb7 100644 --- a/tests/filters/test_interacting_multiple_model_prediction_atomicity.py +++ b/tests/filters/test_interacting_multiple_model_prediction_atomicity.py @@ -2,7 +2,6 @@ import unittest import numpy.testing as npt - import pyrecest.backend from pyrecest.backend import array, eye from pyrecest.distributions import GaussianDistribution @@ -34,18 +33,14 @@ def predict_linear(self, system_matrix, sys_noise_cov, sys_input=None): covariance = ( system_matrix @ self.filter_state.C @ system_matrix.T + sys_noise_cov ) - self.filter_state = GaussianDistribution( - mean, covariance, check_validity=False - ) + self.filter_state = GaussianDistribution(mean, covariance, check_validity=False) def predict_nonlinear(self, transition_function, sys_noise_cov, **kwargs): if self.fail_on_predict: raise RuntimeError("intentional prediction failure") mean = transition_function(self.filter_state.mu, **kwargs) covariance = self.filter_state.C + sys_noise_cov - self.filter_state = GaussianDistribution( - mean, covariance, check_validity=False - ) + self.filter_state = GaussianDistribution(mean, covariance, check_validity=False) @unittest.skipIf( @@ -82,9 +77,7 @@ def _snapshot(imm): def _assert_snapshot_equal(self, imm, snapshot): mode_probabilities, means, covariances, mixing = snapshot npt.assert_allclose(imm.mode_probabilities, mode_probabilities) - for curr_filter, mean, covariance in zip( - imm.filter_bank, means, covariances - ): + for curr_filter, mean, covariance in zip(imm.filter_bank, means, covariances): npt.assert_allclose(curr_filter.filter_state.mu, mean) npt.assert_allclose(curr_filter.filter_state.C, covariance) if mixing is None: @@ -108,9 +101,7 @@ def test_invalid_prediction_arguments_do_not_apply_interaction(self): for prediction_name, invalid_call in invalid_calls.items(): with self.subTest(prediction=prediction_name): imm = self._make_imm() - imm.latest_mixing_probabilities = array( - [[0.6, 0.4], [0.3, 0.7]] - ) + imm.latest_mixing_probabilities = array([[0.6, 0.4], [0.3, 0.7]]) before = self._snapshot(imm) with self.assertRaisesRegex(ValueError, "one entry per model"): @@ -136,9 +127,7 @@ def test_subfilter_failure_rolls_back_interaction_and_predictions(self): for prediction_name, failing_call in failing_calls.items(): with self.subTest(prediction=prediction_name): imm = self._make_imm(fail_second=True) - imm.latest_mixing_probabilities = array( - [[0.55, 0.45], [0.35, 0.65]] - ) + imm.latest_mixing_probabilities = array([[0.55, 0.45], [0.35, 0.65]]) before = self._snapshot(imm) with self.assertRaisesRegex( diff --git a/tests/filters/test_kernel_sme_clutter_moments.py b/tests/filters/test_kernel_sme_clutter_moments.py index ead070b862..8fbd7c4e4b 100644 --- a/tests/filters/test_kernel_sme_clutter_moments.py +++ b/tests/filters/test_kernel_sme_clutter_moments.py @@ -1,12 +1,10 @@ import numpy as np import numpy.testing as npt -import pytest - import pyrecest.backend +import pytest from pyrecest.backend import array, to_numpy from pyrecest.filters.kernel_sme_filter import KernelSMEFilter - pytestmark = pytest.mark.skipif( pyrecest.backend.__backend_name__ in ("pytorch", "jax"), reason="KernelSMEFilter moments are not supported on this backend", @@ -68,9 +66,7 @@ def test_clutter_only_covariance_does_not_double_count_clutter_products(): np.zeros(2), clutter_kernel_covariance, ) - expected_sigma[i, j] = ( - false_alarm_rate * kernel_between * clutter_mid_pdf - ) + expected_sigma[i, j] = false_alarm_rate * kernel_between * clutter_mid_pdf npt.assert_allclose(to_numpy(mu_s), expected_mu, rtol=1e-7, atol=1e-10) npt.assert_allclose(to_numpy(sigma_s), expected_sigma, rtol=1e-7, atol=1e-10) diff --git a/tests/filters/test_linear_update_planning.py b/tests/filters/test_linear_update_planning.py index f7e2570125..9d93920f9a 100644 --- a/tests/filters/test_linear_update_planning.py +++ b/tests/filters/test_linear_update_planning.py @@ -220,9 +220,7 @@ def test_normalized_innovation_squared_rejects_nonpositive_definite_covariance() ("measurement_covariance", np.array([[-2.0]])), ], ) -def test_plan_rejects_indefinite_component_covariances( - field, invalid_covariance -): +def test_plan_rejects_indefinite_component_covariances(field, invalid_covariance): kwargs = { "mean": np.zeros(1), "covariance_matrix": np.eye(1), diff --git a/tests/filters/test_measurement_reliability_temporal_counts.py b/tests/filters/test_measurement_reliability_temporal_counts.py index 2abed5d82b..4ff98c2a3b 100644 --- a/tests/filters/test_measurement_reliability_temporal_counts.py +++ b/tests/filters/test_measurement_reliability_temporal_counts.py @@ -1,7 +1,6 @@ import unittest import numpy as np - from pyrecest.filters import ( normalize_active_measurement_mask, normalize_measurement_noise_covariances, diff --git a/tests/filters/test_mode_rbpf_manifold_ukf_tracker.py b/tests/filters/test_mode_rbpf_manifold_ukf_tracker.py index bd6e3c87ae..ca3e7521eb 100644 --- a/tests/filters/test_mode_rbpf_manifold_ukf_tracker.py +++ b/tests/filters/test_mode_rbpf_manifold_ukf_tracker.py @@ -161,7 +161,6 @@ def test_update_without_measurements_is_noop(self): npt.assert_allclose(posterior, prior) - def test_preserves_impossible_mode_probabilities(self): transition_matrix = np.eye(3) tracker = self.make_tracker( diff --git a/tests/filters/test_mode_rbpf_probability_normalization_overflow.py b/tests/filters/test_mode_rbpf_probability_normalization_overflow.py index 3c77de1627..c03171446a 100644 --- a/tests/filters/test_mode_rbpf_probability_normalization_overflow.py +++ b/tests/filters/test_mode_rbpf_probability_normalization_overflow.py @@ -3,7 +3,6 @@ import numpy as np import numpy.testing as npt import pyrecest.backend as pyrecest_backend - from pyrecest.filters import ModeRBPFManifoldUKFTracker diff --git a/tests/filters/test_nonadditive_arraylike_samples.py b/tests/filters/test_nonadditive_arraylike_samples.py index ae6d5c316c..67907c49e3 100644 --- a/tests/filters/test_nonadditive_arraylike_samples.py +++ b/tests/filters/test_nonadditive_arraylike_samples.py @@ -1,5 +1,4 @@ import numpy.testing as npt - from pyrecest.backend import array from pyrecest.distributions import LinearDiracDistribution from pyrecest.filters.euclidean_particle_filter import EuclideanParticleFilter @@ -7,9 +6,7 @@ def test_predict_nonlinear_nonadditive_accepts_array_like_samples_and_weights(): particle_filter = EuclideanParticleFilter(n_particles=3, dim=1) - particle_filter.filter_state = LinearDiracDistribution( - array([[0.0], [1.0], [2.0]]) - ) + particle_filter.filter_state = LinearDiracDistribution(array([[0.0], [1.0], [2.0]])) particle_filter.predict_nonlinear_nonadditive( lambda particle, noise: particle + noise, diff --git a/tests/filters/test_particle_filter_count_precision.py b/tests/filters/test_particle_filter_count_precision.py index def36a006b..9dee320f71 100644 --- a/tests/filters/test_particle_filter_count_precision.py +++ b/tests/filters/test_particle_filter_count_precision.py @@ -35,9 +35,7 @@ def test_particle_filter_count_validation_is_exact(validator): np.timedelta64(3, "ns"), np.datetime64("1970-01-01T00:00:00.000000003"), np.array(np.timedelta64(3, "ns"), dtype=object), - np.array( - np.datetime64("1970-01-01T00:00:00.000000003"), dtype=object - ), + np.array(np.datetime64("1970-01-01T00:00:00.000000003"), dtype=object), ], ids=["timedelta", "datetime", "object-timedelta", "object-datetime"], ) diff --git a/tests/filters/test_particle_filter_prediction_shape.py b/tests/filters/test_particle_filter_prediction_shape.py index 4e4cf280ab..38155758d4 100644 --- a/tests/filters/test_particle_filter_prediction_shape.py +++ b/tests/filters/test_particle_filter_prediction_shape.py @@ -2,7 +2,6 @@ import numpy.testing as npt import pytest - from pyrecest.filters.hyperspherical_particle_filter import ( HypersphericalParticleFilter, ) diff --git a/tests/filters/test_relaxed_s3f_process_noise_validation.py b/tests/filters/test_relaxed_s3f_process_noise_validation.py index b8d1cdca07..a02a22037c 100644 --- a/tests/filters/test_relaxed_s3f_process_noise_validation.py +++ b/tests/filters/test_relaxed_s3f_process_noise_validation.py @@ -28,7 +28,9 @@ def test_rejects_nonsymmetric_process_noise_without_mutating_state(self): self.assertTrue( bool( - (filter_.filter_state.linear_distributions[0].C == covariance_before).all() + ( + filter_.filter_state.linear_distributions[0].C == covariance_before + ).all() ) ) @@ -45,7 +47,9 @@ def test_rejects_indefinite_process_noise_without_mutating_state(self): self.assertTrue( bool( - (filter_.filter_state.linear_distributions[0].C == covariance_before).all() + ( + filter_.filter_state.linear_distributions[0].C == covariance_before + ).all() ) ) diff --git a/tests/filters/test_replay_grid_zero_likelihood_update.py b/tests/filters/test_replay_grid_zero_likelihood_update.py index 5aa5fda70e..9d14dcdf5a 100644 --- a/tests/filters/test_replay_grid_zero_likelihood_update.py +++ b/tests/filters/test_replay_grid_zero_likelihood_update.py @@ -4,7 +4,6 @@ import unittest import numpy as np - from pyrecest.filters import update_position_grid_likelihood diff --git a/tests/filters/test_se2_ukf_real_inputs.py b/tests/filters/test_se2_ukf_real_inputs.py index ea2e25c617..24a32ed38d 100644 --- a/tests/filters/test_se2_ukf_real_inputs.py +++ b/tests/filters/test_se2_ukf_real_inputs.py @@ -34,9 +34,7 @@ def test_update_rejects_complex_measurement_without_mutating_state(self): array([1.0 + 0.0j, 0.0, 1.0j, 0.0]), ) - npt.assert_allclose( - to_numpy(current_filter.filter_state.mu), original_mean - ) + npt.assert_allclose(to_numpy(current_filter.filter_state.mu), original_mean) npt.assert_allclose( to_numpy(current_filter.filter_state.C), original_covariance ) diff --git a/tests/filters/test_sequence_association_temporal_validation.py b/tests/filters/test_sequence_association_temporal_validation.py index 895b4fc60d..a3fb56a458 100644 --- a/tests/filters/test_sequence_association_temporal_validation.py +++ b/tests/filters/test_sequence_association_temporal_validation.py @@ -6,7 +6,6 @@ solve_viterbi_sequence_association, ) - _TEMPORAL_VALUES = ( pytest.param(np.timedelta64(1, "ns"), id="timedelta-ns"), pytest.param(np.timedelta64(1, "us"), id="timedelta-us"), diff --git a/tests/filters/test_so3_product_particle_filter.py b/tests/filters/test_so3_product_particle_filter.py index 71b9496d1a..d001aeecc7 100644 --- a/tests/filters/test_so3_product_particle_filter.py +++ b/tests/filters/test_so3_product_particle_filter.py @@ -78,9 +78,7 @@ def test_set_particles_rejects_invalid_weights_atomically(self): filt = SO3ProductParticleFilter(n_particles=2, num_rotations=1) original_particles = to_numpy(filt.particles).copy() original_weights = to_numpy(filt.weights).copy() - replacement_particles = array( - [[z_quaternion(pi / 2.0)], [z_quaternion(pi)]] - ) + replacement_particles = array([[z_quaternion(pi / 2.0)], [z_quaternion(pi)]]) with self.assertRaisesRegex(ValueError, "weights must match"): filt.set_particles( diff --git a/tests/filters/test_state_space_subdivision_update_validation.py b/tests/filters/test_state_space_subdivision_update_validation.py index 133bdf6e55..bc43d5f845 100644 --- a/tests/filters/test_state_space_subdivision_update_validation.py +++ b/tests/filters/test_state_space_subdivision_update_validation.py @@ -2,7 +2,6 @@ import numpy as np import numpy.testing as npt - from pyrecest.backend import array, eye from pyrecest.distributions.cart_prod.state_space_subdivision_gaussian_distribution import ( StateSpaceSubdivisionGaussianDistribution, @@ -69,9 +68,7 @@ def test_invalid_linear_count_does_not_apply_periodic_likelihood(self): with self.assertRaisesRegex(ValueError, "1 or n_areas"): filter_instance.update( - likelihood_periodic_grid=array( - np.linspace(1.0, 2.0, n_grid_points) - ), + likelihood_periodic_grid=array(np.linspace(1.0, 2.0, n_grid_points)), likelihoods_linear=invalid_linear_likelihoods, ) diff --git a/tests/filters/test_von_mises_fisher_filter_real_inputs.py b/tests/filters/test_von_mises_fisher_filter_real_inputs.py index f914174f18..66ebd6736e 100644 --- a/tests/filters/test_von_mises_fisher_filter_real_inputs.py +++ b/tests/filters/test_von_mises_fisher_filter_real_inputs.py @@ -14,9 +14,7 @@ class VonMisesFisherFilterRealInputTest(unittest.TestCase): def test_update_rejects_complex_measurement_without_mutating_state(self): current_filter = VonMisesFisherFilter() - current_filter.filter_state = VonMisesFisherDistribution( - array([1.0, 0.0]), 0.7 - ) + current_filter.filter_state = VonMisesFisherDistribution(array([1.0, 0.0]), 0.7) measurement_noise = VonMisesFisherDistribution(array([0.0, 1.0]), 0.9) original_mean = copy.deepcopy(current_filter.filter_state.mu) original_kappa = current_filter.filter_state.kappa diff --git a/tests/models/test_additive_noise_positional_only_function_args.py b/tests/models/test_additive_noise_positional_only_function_args.py index f74f38ed0e..c8dd20f006 100644 --- a/tests/models/test_additive_noise_positional_only_function_args.py +++ b/tests/models/test_additive_noise_positional_only_function_args.py @@ -1,7 +1,6 @@ """Regression tests for positional-only additive-noise callback arguments.""" import pytest - from pyrecest.models import ( AdditiveNoiseMeasurementModel, AdditiveNoiseTransitionModel, diff --git a/tests/models/test_linear_gaussian_finite_inputs.py b/tests/models/test_linear_gaussian_finite_inputs.py index 07c87cc393..0227adce6d 100644 --- a/tests/models/test_linear_gaussian_finite_inputs.py +++ b/tests/models/test_linear_gaussian_finite_inputs.py @@ -15,27 +15,19 @@ def test_models_reject_nonfinite_system_and_measurement_matrices(self): for value in (np.nan, np.inf, -np.inf): with self.subTest(model="transition", value=value): with self.assertRaisesRegex(ValueError, "matrix.*finite"): - LinearGaussianTransitionModel( - array([[value]]), array([[1.0]]) - ) + LinearGaussianTransitionModel(array([[value]]), array([[1.0]])) with self.subTest(model="measurement", value=value): with self.assertRaisesRegex(ValueError, "matrix.*finite"): - LinearGaussianMeasurementModel( - array([[value]]), array([[1.0]]) - ) + LinearGaussianMeasurementModel(array([[value]]), array([[1.0]])) def test_models_reject_nonfinite_noise_covariances(self): for value in (np.nan, np.inf, -np.inf): with self.subTest(model="transition", value=value): with self.assertRaisesRegex(ValueError, "noise_cov.*finite"): - LinearGaussianTransitionModel( - array([[1.0]]), array([[value]]) - ) + LinearGaussianTransitionModel(array([[1.0]]), array([[value]])) with self.subTest(model="measurement", value=value): with self.assertRaisesRegex(ValueError, "noise_cov.*finite"): - LinearGaussianMeasurementModel( - array([[1.0]]), array([[value]]) - ) + LinearGaussianMeasurementModel(array([[1.0]]), array([[value]])) def test_transition_model_rejects_nonfinite_offset(self): for value in (np.nan, np.inf, -np.inf): @@ -55,12 +47,8 @@ def test_identity_models_reject_nonfinite_scalar_noise(self): IdentityGaussianMeasurementModel(1, value) def test_prediction_rejects_nonfinite_state_inputs(self): - transition = LinearGaussianTransitionModel( - array([[1.0]]), array([[1.0]]) - ) - measurement = LinearGaussianMeasurementModel( - array([[1.0]]), array([[1.0]]) - ) + transition = LinearGaussianTransitionModel(array([[1.0]]), array([[1.0]])) + measurement = LinearGaussianMeasurementModel(array([[1.0]]), array([[1.0]])) for value in (np.nan, np.inf, -np.inf): with self.subTest(method="transition mean", value=value): diff --git a/tests/models/test_singer_transition_numerics.py b/tests/models/test_singer_transition_numerics.py index eea90f91cd..ae011d9eae 100644 --- a/tests/models/test_singer_transition_numerics.py +++ b/tests/models/test_singer_transition_numerics.py @@ -3,9 +3,8 @@ import numpy as np import numpy.testing as npt import pytest -from scipy.linalg import expm - from pyrecest.models import singer_transition_matrix +from scipy.linalg import expm @pytest.mark.parametrize( diff --git a/tests/smoothers/test_mem_rbpf_ffbsi_option_validation.py b/tests/smoothers/test_mem_rbpf_ffbsi_option_validation.py index 0e6ba4fcfe..33fcc8e481 100644 --- a/tests/smoothers/test_mem_rbpf_ffbsi_option_validation.py +++ b/tests/smoothers/test_mem_rbpf_ffbsi_option_validation.py @@ -6,7 +6,6 @@ from pyrecest import backend from pyrecest.smoothers import MEMRBPFFFBSiSmoother, MEMRBPFForwardRecord - pytestmark = pytest.mark.skipif( backend.__backend_name__ != "numpy", reason="MEM-RBPF FFBSi tests use NumPy sampling paths", diff --git a/tests/smoothers/test_mem_rbpf_ffbsi_weight_normalization.py b/tests/smoothers/test_mem_rbpf_ffbsi_weight_normalization.py index 190f2a06a6..49b62e6192 100644 --- a/tests/smoothers/test_mem_rbpf_ffbsi_weight_normalization.py +++ b/tests/smoothers/test_mem_rbpf_ffbsi_weight_normalization.py @@ -23,9 +23,7 @@ def test_safe_probs_preserves_extreme_finite_weight_ratios(): def test_smooth_accepts_extreme_finite_particle_weights(): max_float = np.finfo(float).max - axis_covariance = np.repeat( - (0.1 * np.eye(2))[np.newaxis, :, :], 2, axis=0 - ) + axis_covariance = np.repeat((0.1 * np.eye(2))[np.newaxis, :, :], 2, axis=0) record = MEMRBPFForwardRecord( kinematic_state=np.array([0.0]), covariance=np.array([[1.0]]), @@ -35,9 +33,9 @@ def test_smooth_accepts_extreme_finite_particle_weights(): weights=np.array([max_float, max_float / 2.0]), ) - result = MEMRBPFFFBSiSmoother( - n_trajectories=8, sample_axis=False - ).smooth([record], rng=0, full_axis_lengths=False) + result = MEMRBPFFFBSiSmoother(n_trajectories=8, sample_axis=False).smooth( + [record], rng=0, full_axis_lengths=False + ) assert result.index_samples.shape == (8, 1) assert np.all(np.isfinite(result.states)) diff --git a/tests/smoothers/test_record_smoother_covariance_validation.py b/tests/smoothers/test_record_smoother_covariance_validation.py index d9e44badc9..6f30beafff 100644 --- a/tests/smoothers/test_record_smoother_covariance_validation.py +++ b/tests/smoothers/test_record_smoother_covariance_validation.py @@ -2,7 +2,6 @@ import numpy as np import pytest - from pyrecest.smoothers import smooth_records diff --git a/tests/smoothers/test_so3_chordal_mean_weight_stability.py b/tests/smoothers/test_so3_chordal_mean_weight_stability.py index 1192fe15df..34a136e55d 100644 --- a/tests/smoothers/test_so3_chordal_mean_weight_stability.py +++ b/tests/smoothers/test_so3_chordal_mean_weight_stability.py @@ -2,7 +2,6 @@ import numpy as np import numpy.testing as npt - import pyrecest.backend from pyrecest.backend import array, cos, eye, sin from pyrecest.smoothers import SO3ChordalMeanSmoother diff --git a/tests/test_deprecation_helper.py b/tests/test_deprecation_helper.py index ef851b7ed4..7251d5a62f 100644 --- a/tests/test_deprecation_helper.py +++ b/tests/test_deprecation_helper.py @@ -25,9 +25,9 @@ def test_deprecated_decorator_supports_partial_callables(): def add(left, right): return left + right - legacy_add_one = deprecated( - since="2.3.0", remove_in="3.0.0", replacement="add" - )(functools.partial(add, 1)) + legacy_add_one = deprecated(since="2.3.0", remove_in="3.0.0", replacement="add")( + functools.partial(add, 1) + ) with warnings.catch_warnings(record=True) as caught: warnings.simplefilter("always") diff --git a/tests/test_evidence_support_masked_flags.py b/tests/test_evidence_support_masked_flags.py index 8db18cec28..0e5da4518a 100644 --- a/tests/test_evidence_support_masked_flags.py +++ b/tests/test_evidence_support_masked_flags.py @@ -1,6 +1,5 @@ import numpy as np import pytest - from pyrecest.diagnostics import EvidenceSupport diff --git a/tests/test_evidence_terminal_posterior_validation.py b/tests/test_evidence_terminal_posterior_validation.py index 0f0cf09aa5..33f52d94b3 100644 --- a/tests/test_evidence_terminal_posterior_validation.py +++ b/tests/test_evidence_terminal_posterior_validation.py @@ -1,5 +1,4 @@ import pytest - from pyrecest.evidence import EvidenceComputationMode diff --git a/tests/test_gaussian_sampler_zero_samples.py b/tests/test_gaussian_sampler_zero_samples.py index 22397d2cab..bd4d6b1083 100644 --- a/tests/test_gaussian_sampler_zero_samples.py +++ b/tests/test_gaussian_sampler_zero_samples.py @@ -1,5 +1,4 @@ import numpy as np - from pyrecest.sampling.euclidean_sampler import GaussianSampler diff --git a/tests/test_group_results_by_filter.py b/tests/test_group_results_by_filter.py index 7eb8b683f3..8ae2c73b79 100644 --- a/tests/test_group_results_by_filter.py +++ b/tests/test_group_results_by_filter.py @@ -28,9 +28,7 @@ def test_nan_parameter_does_not_disrupt_numeric_order(self): grouped = group_results_by_filter(rows)["pf"] - self.assertEqual( - grouped["score"], ["none", "zero", "one", "nan", "category"] - ) + self.assertEqual(grouped["score"], ["none", "zero", "one", "nan", "category"]) self.assertTrue(math.isnan(grouped["parameter"][3])) diff --git a/tests/test_history_recorder_masked_flags.py b/tests/test_history_recorder_masked_flags.py index ac228ccab6..f265d1fe3f 100644 --- a/tests/test_history_recorder_masked_flags.py +++ b/tests/test_history_recorder_masked_flags.py @@ -1,6 +1,5 @@ import numpy as np import pytest - from pyrecest.utils import HistoryRecorder diff --git a/tests/test_history_recorder_masked_values.py b/tests/test_history_recorder_masked_values.py index ddf4e75bab..1761c85390 100644 --- a/tests/test_history_recorder_masked_values.py +++ b/tests/test_history_recorder_masked_values.py @@ -1,8 +1,7 @@ import numpy as np import numpy.testing as npt -import pytest - import pyrecest.backend as backend +import pytest from pyrecest.utils import HistoryRecorder diff --git a/tests/test_hypertoroidal_sampler_masked_controls.py b/tests/test_hypertoroidal_sampler_masked_controls.py index 690c0c0f82..95f4c43cf6 100644 --- a/tests/test_hypertoroidal_sampler_masked_controls.py +++ b/tests/test_hypertoroidal_sampler_masked_controls.py @@ -1,7 +1,6 @@ import unittest import numpy as np - from pyrecest.sampling.hypertoroidal_sampler import ( CircularUniformSampler, _validate_integral_scalar, diff --git a/tests/test_leopardi_small_symmetric_partitions.py b/tests/test_leopardi_small_symmetric_partitions.py index 90aa4b35cf..5a2a8376d9 100644 --- a/tests/test_leopardi_small_symmetric_partitions.py +++ b/tests/test_leopardi_small_symmetric_partitions.py @@ -3,7 +3,6 @@ import pytest from pyrecest.sampling.leopardi_sampler import get_partition_points_cartesian - pytestmark = pytest.mark.skipif( pyrecest.backend.__backend_name__ == "jax", reason="Leopardi sampling uses SciPy root finding.", diff --git a/tests/test_metrics_covariance_validation.py b/tests/test_metrics_covariance_validation.py index 4dda27ded9..bef88a0099 100644 --- a/tests/test_metrics_covariance_validation.py +++ b/tests/test_metrics_covariance_validation.py @@ -2,7 +2,6 @@ import numpy as np import numpy.testing as npt - from pyrecest.utils.metrics import nees, nis @@ -25,9 +24,7 @@ def test_nees_and_nis_reject_asymmetric_covariances(self): def test_asymmetry_validation_respects_strict_numpy_error_policy(self): maximum_float = np.finfo(float).max - asymmetric_covariance = np.array( - [[1.0, maximum_float], [-maximum_float, 1.0]] - ) + asymmetric_covariance = np.array([[1.0, maximum_float], [-maximum_float, 1.0]]) previous_settings = np.seterr(all="raise") try: with self.assertRaisesRegex( diff --git a/tests/test_metrics_temporal_counts.py b/tests/test_metrics_temporal_counts.py index 84650c8ae4..99e0842753 100644 --- a/tests/test_metrics_temporal_counts.py +++ b/tests/test_metrics_temporal_counts.py @@ -1,9 +1,7 @@ import numpy as np import pytest - from pyrecest.utils.metrics import chi_square_confidence_bounds - _TEMPORAL_COUNTS = ( np.timedelta64(2, "ns"), np.timedelta64(2, "us"), diff --git a/tests/test_model_comparison_comparable_flags.py b/tests/test_model_comparison_comparable_flags.py index bef9fa05e9..8edaa14e9d 100644 --- a/tests/test_model_comparison_comparable_flags.py +++ b/tests/test_model_comparison_comparable_flags.py @@ -1,5 +1,4 @@ import pandas as pd - from pyrecest.evaluation.model_comparison import ( evidence_margin_table, paired_model_margin_decisions, diff --git a/tests/test_numerics_symmetrization_overflow.py b/tests/test_numerics_symmetrization_overflow.py index 67b77f9207..ae24569257 100644 --- a/tests/test_numerics_symmetrization_overflow.py +++ b/tests/test_numerics_symmetrization_overflow.py @@ -1,5 +1,4 @@ import numpy as np - from pyrecest.numerics import ( jittered_cholesky, nearest_symmetric_psd, @@ -14,9 +13,7 @@ def test_symmetrize_matrix_avoids_finite_overflow_and_tiny_underflow(): with np.errstate(over="raise", invalid="raise"): symmetric = np.asarray(symmetrize_matrix(matrix)) - expected = np.array( - [[maximum, maximum * 0.75], [maximum * 0.75, maximum / 2.0]] - ) + expected = np.array([[maximum, maximum * 0.75], [maximum * 0.75, maximum / 2.0]]) np.testing.assert_array_equal(symmetric, expected) np.testing.assert_array_equal(symmetric, symmetric.T) diff --git a/tests/test_pairwise_covariance_symmetrization_overflow.py b/tests/test_pairwise_covariance_symmetrization_overflow.py index 1edfd95369..676c2f5576 100644 --- a/tests/test_pairwise_covariance_symmetrization_overflow.py +++ b/tests/test_pairwise_covariance_symmetrization_overflow.py @@ -2,7 +2,6 @@ import numpy as np import numpy.testing as npt - from pyrecest.backend import array from pyrecest.utils import pairwise_covariance_shape_components @@ -24,11 +23,9 @@ def test_shape_components_preserve_extreme_finite_covariances(): ] ) - shape_cost, logdet_cost, shape_similarity = ( - pairwise_covariance_shape_components( - covariance_along_first_axis, - covariance_along_second_axis, - ) + shape_cost, logdet_cost, shape_similarity = pairwise_covariance_shape_components( + covariance_along_first_axis, + covariance_along_second_axis, ) npt.assert_allclose(shape_cost, array([[1.0]])) diff --git a/tests/test_point_set_registration_rmse_stability.py b/tests/test_point_set_registration_rmse_stability.py index c46c2e4d16..c16e540e99 100644 --- a/tests/test_point_set_registration_rmse_stability.py +++ b/tests/test_point_set_registration_rmse_stability.py @@ -17,9 +17,7 @@ def test_rmse_preserves_maximum_finite_cost(self): def test_rmse_preserves_zero_and_empty_contract(self): self.assertEqual(compute_rmse(array([0.0], dtype=float64)), 0.0) - self.assertTrue( - math.isinf(compute_rmse(array([], dtype=float64))) - ) + self.assertTrue(math.isinf(compute_rmse(array([], dtype=float64)))) if __name__ == "__main__": diff --git a/tests/test_pytorch_array_equal_mixed_dtypes.py b/tests/test_pytorch_array_equal_mixed_dtypes.py index 8e318e0e8b..e9f8cdc19c 100644 --- a/tests/test_pytorch_array_equal_mixed_dtypes.py +++ b/tests/test_pytorch_array_equal_mixed_dtypes.py @@ -35,9 +35,7 @@ def test_mixed_int64_float32_comparison_matches_numpy(self): pytorch_backend.array_equal(integer_tensor, float_tensor), expected ) self.assertEqual( - pytorch_backend.array_equal( - integer_tensor, float_tensor, equal_nan=True - ), + pytorch_backend.array_equal(integer_tensor, float_tensor, equal_nan=True), expected, ) diff --git a/tests/test_pytorch_split_index_contract.py b/tests/test_pytorch_split_index_contract.py index e4b94f39cb..f066514b0f 100644 --- a/tests/test_pytorch_split_index_contract.py +++ b/tests/test_pytorch_split_index_contract.py @@ -2,7 +2,6 @@ from fractions import Fraction import numpy as np - from pyrecest.backend_support._pytorch_split_index_contract import ( _normalize_split_section_count, ) diff --git a/tests/test_sigma_points_masked_parameters.py b/tests/test_sigma_points_masked_parameters.py index 2c68cc30cf..1fbb9eede6 100644 --- a/tests/test_sigma_points_masked_parameters.py +++ b/tests/test_sigma_points_masked_parameters.py @@ -1,6 +1,5 @@ import numpy as np import pytest - from pyrecest.sampling import JulierSigmaPoints, MerweScaledSigmaPoints diff --git a/tests/test_sigma_points_merwe_scale_stability.py b/tests/test_sigma_points_merwe_scale_stability.py index 1678a8458e..1370751b3c 100644 --- a/tests/test_sigma_points_merwe_scale_stability.py +++ b/tests/test_sigma_points_merwe_scale_stability.py @@ -1,6 +1,5 @@ import numpy as np import pytest - from pyrecest.backend import asarray, to_numpy from pyrecest.sampling import MerweScaledSigmaPoints diff --git a/tests/test_sigma_points_temporal_parameters.py b/tests/test_sigma_points_temporal_parameters.py index bcfaacd403..b7185b3815 100644 --- a/tests/test_sigma_points_temporal_parameters.py +++ b/tests/test_sigma_points_temporal_parameters.py @@ -1,9 +1,7 @@ import numpy as np import pytest - from pyrecest.sampling import JulierSigmaPoints, MerweScaledSigmaPoints - _TEMPORAL_VALUES = ( np.timedelta64(2, "ns"), np.timedelta64(2, "us"), diff --git a/tests/test_sparse_second_order_grid_extreme_transition_weights.py b/tests/test_sparse_second_order_grid_extreme_transition_weights.py index 0f733b28f8..390b6ab03d 100644 --- a/tests/test_sparse_second_order_grid_extreme_transition_weights.py +++ b/tests/test_sparse_second_order_grid_extreme_transition_weights.py @@ -1,5 +1,4 @@ import numpy as np - from pyrecest.filters.sparse_second_order_grid import ( sparse_second_order_grid_evidence, ) diff --git a/tests/tracking/test_hypothesis_replay_temporal_validation.py b/tests/tracking/test_hypothesis_replay_temporal_validation.py index 5a581260e2..4dfa2c21cb 100644 --- a/tests/tracking/test_hypothesis_replay_temporal_validation.py +++ b/tests/tracking/test_hypothesis_replay_temporal_validation.py @@ -8,7 +8,6 @@ rank_hypothesis_replays, ) - _TEMPORAL_VALUES = ( np.timedelta64(2, "ns"), np.datetime64("1970-01-01T00:00:00.000000002"), @@ -45,9 +44,7 @@ def test_temporal_record_statistics_are_ignored() -> None: records=[ { "nis": np.timedelta64(4, "ns"), - "residual_norm_m": np.datetime64( - "1970-01-01T00:00:00.000000005" - ), + "residual_norm_m": np.datetime64("1970-01-01T00:00:00.000000005"), }, { "nis": np.asarray(np.timedelta64(6, "ns"), dtype=object), diff --git a/tests/utils/test_association_model_failed_refit.py b/tests/utils/test_association_model_failed_refit.py index ee8abe1ed6..24e6e53be0 100644 --- a/tests/utils/test_association_model_failed_refit.py +++ b/tests/utils/test_association_model_failed_refit.py @@ -1,6 +1,5 @@ import numpy.testing as npt import pytest - from pyrecest.backend import array, zeros from pyrecest.utils import LogisticPairwiseAssociationModel @@ -17,9 +16,7 @@ def test_failed_refit_preserves_previous_fitted_state(): converged_before = model.converged_ class_weights_before = model.class_weights_ - replacement_features = array( - [[-2.0, 0.0], [-1.0, 0.0], [1.0, 0.0], [2.0, 0.0]] - ) + replacement_features = array([[-2.0, 0.0], [-1.0, 0.0], [1.0, 0.0], [2.0, 0.0]]) with pytest.raises( ValueError, match="At least one example must receive positive weight" ): diff --git a/tests/utils/test_calibrated_association_feature_validation.py b/tests/utils/test_calibrated_association_feature_validation.py index ab4e8d89ef..b71f49d5d6 100644 --- a/tests/utils/test_calibrated_association_feature_validation.py +++ b/tests/utils/test_calibrated_association_feature_validation.py @@ -1,7 +1,6 @@ """Regression tests for calibrated association feature validation.""" import pytest - from pyrecest.backend import array from pyrecest.utils import CalibratedPairwiseAssociationModel diff --git a/tests/utils/test_history_recorder_empty_steps.py b/tests/utils/test_history_recorder_empty_steps.py index 75dd94f1e8..d8073885d6 100644 --- a/tests/utils/test_history_recorder_empty_steps.py +++ b/tests/utils/test_history_recorder_empty_steps.py @@ -14,9 +14,7 @@ def test_empty_padded_record_preserves_time_axis(): recorder.record("estimate", backend.array([1.0, 2.0]), pad_with_nan=True) recorder.record("estimate", backend.array([]), pad_with_nan=True) - history = recorder.record( - "estimate", backend.array([3.0]), pad_with_nan=True - ) + history = recorder.record("estimate", backend.array([3.0]), pad_with_nan=True) npt.assert_allclose( _to_numpy(history),