Releases: FlorianPfaff/PyRecEst
Releases · FlorianPfaff/PyRecEst
Release 2.4.1
🐛 Fixes
- Fix
CircularFourierDistribution.from_distribution()grid generation to use endpoint-freelinspaceinstead of floating-steparange, preventing off-by-one samples for certain odd grid sizes. (#2946) - Preserve nested import errors from installed optional packages in
require_optional_dependency, so real import-time failures inside an installed package are no longer incorrectly reported as the package being missing. (#2944) - Fix
CalibratedPairwiseAssociationModelto correctly handle stringified binary positive labels such as"1"and"true"when selecting the positive column from two-columnpredict_probaoutput. (#2675) - Validate
AbstractCircularFilter.association_likelihood_numericalPDF evaluations so empty or multi-element outputs raise an error instead of silently using only the first value. (#3183) - Fix
fit_time_offsetto validate and normalize themetricparameter before use, so typos and unhashable inputs raise clear errors instead of producing all-NaN results. (#3182) - Fix Metropolis-Hastings sampler to reject multi-element
ln_pdfor proposal-correction outputs instead of silently using only the first value for acceptance decisions. (#3180) - Fix per-particle prediction stacking so
(n, 1)Euclidean particle matrices remain(n, 1)instead of being transposed to(1, n). (#3179) - Validate
EvidenceComputationMode.modetype before membership checks, so unhashable inputs like lists raiseValueErrorinstead of a rawTypeError. (#3176) - Fix Pareto constraint spec parsing to raise
ValueErrorfor malformed scalar/object/text specs instead of leaking a rawTypeErrorfromlen(spec). (#3172) - Fix EOT shape-transform scalar conversion (
_as_shapely_scalar) to reject multi-value arrays instead of silently truncating to the first entry, preventing incorrect target translations and rotations. (#3174) - Fix NumPy backend vectorizer to collect mapped outputs with NumPy stacking instead of preallocating from the first output, preventing silent dtype truncation (e.g.,
[0, 1.5]becoming[0, 1]). (#3171) - Fix shared NumPy
convert_to_wider_dtypeto use NumPy'sresult_typefor mixed-type promotion, soint64andfloat32correctly promote tofloat64instead of truncating tofloat32. (#3173) - Fix
BackendNotSupportedErrorto treatsupported_backends="numpy"as a single backend name rather than iterating over individual characters. (#3169) - Fix explicit NumPy backend
zerosto normalize dtypes from shared state when another backend (e.g., PyTorch) was initialized first, preventing incompatible dtype values from reaching NumPy. (#3166) - Fix
set_default_dtypeto normalize dtype-like inputs (e.g.,jnp.dtype("float32")) before the complex-dtype lookup, and prevent partial state mutation when a non-floating dtype is rejected. (#3165) - Fix
get_backendto convert missing optional dependencies for explicit backends (e.g.,"pytorch") intoOptionalDependencyErrorwith install guidance instead of leaking a rawModuleNotFoundError. (#3157) - Fix backend support Markdown table rendering to escape literal pipe characters in cells instead of replacing them with fullwidth lookalikes. (#3153)
- Fix Euclidean MTT mean extractor to use the public
get_tracks()selection API when available, preventing hidden tentative or deleted tracks from contaminating evaluation summaries. (#3154) - Fix backend support table rendering to escape table-sensitive characters in Markdown cells, preventing malformed table output for metadata containing separator characters. (#3145)
- Fix Euclidean MTT target orientation handling for ambiguous orientation representations. (#3147)
- Preserve explicit positional dynamic dtypes in backend operations so explicitly specified dtypes are not lost. (#3039)
- Preserve one-dimensional multi-target ground-truth shape so single-dimension scenarios are not incorrectly reshaped. (#3116)
- Fix empty file-backed measurement counting so empty files contribute a correct measurement count rather than being skipped. (#3105)
- Fix NumPy
traceto correctly forward keyword arguments, resolving failures when callingtracewithoffsetordtypekwargs. (#3095) - Fix virtual backend submodule imports so that backend-specific submodules resolve correctly when accessed through the virtual backend namespace. (#3087)
- Fix fixed-lag Viterbi filter to correctly use custom transition context instead of the default context. (#3055)
- Fix
LinearDiracDistributionconstructor to accept and flatten weight arrays regardless of their shape, improving compatibility with array-producing workflows. (#3030) - Fix backend error diagnostics to remain available even when no active backend is configured. (#3013)
- Treat boolean track matrix cell values as missing/absent instead of interpreting
True/Falseas numeric track data. (#2993) - Treat missing diagnostic track IDs as absent rather than raising an error, improving robustness of diagnostic summaries with incomplete track data. (#3011)
- Fix Autograd quadratic assignment to correctly use default solver options when none are provided. (#2975)
- Fix NumPy backend
choiceto return elements in population order whenshuffle=False, correcting previously unsorted output. (#2979) - Fix JAX
randintbounds handling to correctly validate and convert integer bounds. (#2982) - Fix overwritten association probability gate regression so the gate threshold is correctly applied after probability updates. (#3007)
- Fix PyTorch QR decomposition mode contract to correctly handle
mode='r'and other mode variants. (#3004) - Fix shared NumPy QR mode signatures to correctly handle all supported mode variants. (#2999)
- Fix replay grid filter to handle nonfinite position inputs gracefully instead of propagating NaN/Inf values. (#2936)
- Fix Euclidean mean extraction to correctly handle raw array states (not wrapped in a distribution object). (#2938)
- Accept
Noneevidence mode metadata as a valid absent-metadata indicator, fixing errors in evidence mode objects with no metadata. (#2925) - Normalize overflowing assignment costs to a large finite sentinel value, preventing integer overflow from corrupting assignment solutions. (#2860)
- Fix out-of-sequence measurement
accepteddiagnostic parsing to correctly read boolean values from serialized records. (#2877) - Fix evidence support boolean metadata parsing to correctly read boolean values from serialized metadata. (#2875)
- Fix masked measurement observed dimension handling to preserve dimension sets correctly when constructed from iterables. (#2858)
- Fix registration point validation to correctly import backend functions needed for coordinate checks. (#2853)
- Handle overflowing particle diagnostics scalar values by clamping to finite limits instead of propagating infinity. (#2844)
- Handle mixed result parameter types (e.g., integer followed by float) in result aggregation without dtype truncation. (#2843)
- Fix surface-band probability computation for sequence inputs, correctly aggregating probabilities over multiple points. (#2772)
- Normalize overflowing seed scalar values to a valid range instead of leaking raw overflow errors. (#2828)
- Handle nonfinite nearest-time queries gracefully instead of returning incorrect results. (#2825)
- Handle overflowing optional diagnostics scalar values by clamping instead of propagating overflow. (#2821)
- Fix ambiguous Euclidean MTT target orientation handling to resolve orientation correctly. (#2810)
- Fix fragment completion candidate observation validation to correctly accept valid candidate observations. (#2769)
- Handle string
return_smoothedflag values explicitly, rejecting non-boolean strings instead of silently coercing them. (#2782) - Fix GGIW tracker update to accept empty measurement scans gracefully without raising errors. (#2785)
- Fix selection fallback ranking to use the correct tie-breaking order. (#2788)
- Fix Pareto front computation for non-scalar metrics so all dimensions are checked correctly. (#2790)
- Fix axis labels for distributions on specific manifolds (e.g., torus, sphere) to display correct coordinate names. (#2799)
- Handle non-parametric plot result summaries gracefully in evaluation reporting. (#2805)
- Fix gated assignment to correctly handle optional matching when no assignment meets the gate threshold. (#2800)
- Fix duplicate session-label detection to work correctly with custom fill values. (#2783)
- Fix 1D replay grid position inputs to be handled correctly instead of being misinterpreted as higher-dimensional inputs. (#2780)
- Honor
shuffle=Falsein random choice backends so unshuffled draws return elements in their original order. (#2774) - Ensure candidate pruning penalty values remain large after normalization, preventing reduced penalties from causing incorrect candidate selection. (#2766)
- Fix fixed-lag Viterbi filter prefix context handling to correctly propagate prefix hypotheses. (#2765)
- Fix PyTorch backend NumPy integer dtype normalization so NumPy integer dtypes are correctly mapped to PyTorch equivalents. (#2760)
- Apply metadata correctly in no-op record smoothing passes so smoothed records retain their source metadata. (#2751)
- Skip disabled callable dimension attributes during dimension inference to prevent errors from non-callable or disabled attribute accessors. (#2752)
- Fix serialized innovation
acceptedflag parsing to correctly deserialize boolean values from stored records. (#2747) - Handle scalar single-target MTT ground-truth inputs correctly, preventing shape errors for scalar state values. (#2745)
- Preserve singleton measurement axis when processing single-measurement updates, preventing dimension collapse. (#2743)
- Fix observation-cost assignment numeric gap handling for sessions with gaps in observation numbering. (#2729)
- Fix observation-cost gap handling for inferred session sizes when sessions have unequal observation counts. (#2734)
- Fix ...
Release 2.4.0
✨ Features
- Add point-set distance and overlap metrics to
pyrecest.evaluation, expose SCGP measurement reliability example wrappers frompyrecest.examples, fix JAX backend compatibility in SCGP measurement Jacobian assembly, and bump version to 2.4.0. (#2579) - Add implicit scalar-field surface protocols to
pyrecest.protocols, implicit surface evaluation helpers topyrecest.evaluation, DVS normal-flow polarity helpers topyrecest.experimental.dvs, and domain-neutral protected-tail selection utilities topyrecest.evaluation. (#2578) - Add DVS event contour likelihood utility functions under
pyrecest.experimental.dvsand Pareto frontier and equal-quality selection helpers underpyrecest.evaluation. (#2577) - Add support-point sampling helpers to
pyrecest.sampling, non-mutating SCGP measurement scoring topyrecest.filters, and SCGP contour sampling utilities used by the experimental DVS point-process tracker. (#2575) - Add shared measurement reliability helpers (weight normalization, active masks, combined active-index selection, per-measurement covariance stacking) to
pyrecest.filters, reused byFullSCGPTracker. (#2572) - Add a shared filter update diagnostics helper exported from
pyrecest.filtersthat records standard metadata keys during updates, applied to the GPRHM tracker update path. (#2570)
🐛 Fixes
- Resolve issue where the PyTorch backend
divideoperation incorrectly masked non-zero-denominator positions whenignore_div_zero=True; inputs are now promoted to tensors and placed on the correct device with widened dtypes before division. (#2564)
📦 Dependencies
- Bump
astropy-iers-datafrom 0.2026.6.1.17.39.59 to 0.2026.6.8.17.49.5 (updated IERS Earth rotation and leap second tables). (#2574) - Bump
filelockfrom 3.29.0 to 3.29.1 (fixes soft lock symlink follow security issue). (#2573) - Bump
tqdmfrom 4.67.3 to 4.68.1 (fixes monitor threadatexitdeadlock and addsitertoolsextras). (#2569) - Bump
platformdirsfrom 4.9.6 to 4.10.0 (addsuser_projects_dir,user_publicshare_dir,user_templates_dir,user_fonts_dir, anduser_preference_dir). (#2568) - Bump
idnafrom 3.16 to 3.18 (75% memory reduction, new 1024-character input length cap, and a lenientdisplaydecode option). (#2565) - Bump
setuptoolsfrom 81.0.0 to 82.0.1 (removespkg_resources; projects relying on it should pin to an older setuptools version). (#2567) - Bump
astropy-iers-datafrom 0.2026.5.18.1.11.28 to 0.2026.6.1.17.39.59 (updated IERS Earth rotation and leap second tables). (#2566)
Release 2.3.0
✨ Features
- Add JAX custom gradient support via
jax.custom_vjp, preserving keyword and default argument binding for differentiable functions. (#2559) - Add
DelayedOutputMixinshared interface for online fixed-lag smoothers, exported frompyrecest.smoothers. (#2560) - Add ellipse geometry conversion, canonicalization helpers, and covariance projection utilities to the tracking module. (#2552)
- Add residual multi-hypothesis selector for discrete edit candidates with threshold fallback and conflict handling, exported from
pyrecest.tracking. (#2547) - Add reusable innovation/NIS diagnostic dataclasses and summary helpers, exposed through
pyrecest.tracking. (#2537) - Add dataframe-oriented model-comparison evidence margin helpers and hypothesis replay ranking utilities to the tracking module. (#2534)
- Add generic track fragment completion path utilities exported from
pyrecest.utils. (#2530) - Add generic evidence computation mode helpers, tracking event/record helpers, track-edit what-if scoring utilities, and sparse second-order evidence diagnostics. (#2532)
- Implement
pyrecest.backend.signal.fftconvolvefor the PyTorch backend usingtorch.fft, with SciPy-compatiblemode={full,same,valid}semantics. (#2531) - Add evidence support metadata helpers, generic record smoothing utilities, and weak/masked linear measurement model helpers. (#2529)
- Add reusable sparse transition row cache utilities and wire sparse second-order grid evidence through the cache. (#2527)
- Add sparse second-order grid evidence utility, exposed through filter lazy exports. (#2522)
🐛 Fixes
- Resolve issue where
GaussianDistribution.from_distributionnow raises a clearConversionErrorinstead of leaking anAttributeErrorwhen a source distribution lacksmean()/covariance()support. (#2535) - Resolve issue where the velocity-locked MEM-QKF tracker now correctly returns early without modifying state when given an empty measurement set. (#2555)
- Resolve issue where the UKF prediction now correctly regenerates cached propagated sigma points after folding additive process noise into the prediction covariance. (#2548)
- Resolve issue where PyTorch
dotnow correctly handles 0-D scalar operands by using multiplication instead of einsum/dot paths. (#2521) - Resolve issue where backend
size()now correctly infers shapes for Python array-like inputs, andcomb(n, k)now returns 0 for out-of-range selections (e.g.,comb(3, 4) == 0). (#2520) - Resolve issue where PyTorch
random.randintnow correctly handles array-valued and broadcastedlow/highbounds with NumPy-compatible semantics. (#2519) - Resolve issue where JAX and PyTorch
random.randnow correctly accept NumPy-style positional dimension arguments (e.g.,rand(2, 3)). (#2518) - Resolve issue where PyTorch
random.multinomialnow correctly supports NumPy-stylesize=parameter with proper trial count and probability validation. (#2517) - Resolve issue where JAX
random.multinomialnow correctly supports NumPy-stylesize=parameter and validates trial counts and probability vector shape before sampling. (#2515) - Resolve issue where the NumPy backend
random.randnow correctly accepts thesize=keyword contract alongside legacy positional dimension calls. (#2513) - Resolve issue where the PyTorch random backend now validates
sizearguments, rejecting boolean, non-integral, string, and negative dimensions before passing them to PyTorch. (#2511) - Resolve issue where PyTorch
random.uniformnow samples independent values over the broadcastedlow/highshape whensizeis omitted, instead of correlating all output elements. (#2510) - Resolve issue where JAX
random.normalnow samples independent values over the broadcastedloc/scaleshape whensizeis omitted, instead of producing perfectly correlated outputs. (#2504) - Fix JAX autodiff backend behavior and tighten PyTorch backend contract handling for
linspaceandapply_along_axis. (#2539)
⚡ Improvements
- Improve PyTorch backend NumPy compatibility for
atleast_*helpers,meshgrid,expand_dims, and cross-product with NumPy axis arguments and mixed dimensions. (#2543) - Add NumPy-compatible PyTorch reduction handling for
mean/stdedge cases, including improved argument normalization and dtype behavior. (#2544) - Align NumPy and JAX backend
matmulbehavior with NumPy-style vector operands for vector-vector, matrix-vector, and vector-matrix products. (#2545) - Accept array-like inputs in JAX and PyTorch backend helper wrappers, and add NumPy-style
axis/keepdimssupport in PyTorch reduction helpers. (#2561) - Handle scalar operands in shared backend
dothelpers using multiplication instead of vector einsum paths, and coerce array-like inputs forouterandmatvechelpers across backends. (#2550) - Handle scalar and array-like products consistently across NumPy/autograd, JAX, and PyTorch backends. (#2554)
- Expand backend product helpers to support scalar and array-like inputs consistently across NumPy/autograd, JAX, and PyTorch. (#2551)
- Accept array-like inputs in backend assignment, diagonal/triangular matrix reconstruction, and dot helpers, and add stacked cart-product distribution metadata. (#2549)
- Tighten PyTorch backend contract handling for array helpers and matmul edge cases. (#2541)
- Add
autogradtoSUPPORTED_BACKENDSinpyrecest.backends, makingget_backend("autograd")an officially recognized entry point. (#2505)
📦 Dependencies
- Bump
astropy-iers-datato 0.2026.6.1.17.39.59 with updated IERS Earth rotation and leap second tables. (#2525) - Bump
filelockfrom 3.29.0 to 3.29.1. (#2524) - Bump
idnafrom 3.17 to 3.18. (#2526) - Bump
platformdirsfrom 4.9.6 to 4.10.0. (#2509) - Bump
idnafrom 3.16 to 3.17 with 75% memory usage reduction and input length cap for validation entry points. (#2508) - Bump
setuptoolsfrom 81.0.0 to 82.0.1. (#2506) - Bump
astropy-iers-datafrom 0.2026.5.18.1.11.28 to 0.2026.5.25.1.14.13 with updated IERS Earth rotation and leap second tables. (#2507)
Release 2.2.4
✨ Features
- Add delayed-decision MHT utilities for deferred track management decisions in multi-hypothesis tracking. (#2169)
- Add SO3 product sequence filtering utilities for multi-step orientation filtering over particle sets. (#2154)
- Add RaFT-UAV helper utilities for UAV tracking with range and angle measurements. (#2153)
- Add SO3 tangent Savitzky-Golay smoother for polynomial smoothing of orientation sequences. (#2152)
- Add replay grid likelihood helpers for offline likelihood evaluation over pre-recorded grids. (#2151)
- Add experimental DVS (Dynamic Vision Sensor) core processing utilities. (#2150)
- Add max-cardinality assignment helper for optimal assignment problems with cardinality constraints. (#2149)
- Add fusion utility candidates including multi-sensor combination helpers. (#2148)
- Add discrete state space utilities for Markov chain and hidden Markov model filtering. (#2146)
- Add SCGP filter support for measurement reliability weights, enabling downweighting of uncertain observations. (#2145)
- Add JAX backend helpers for triangular vector pack/unpack operations. (#2159)
- Implement JAX positive-definite matrix check (
is_positive_definite) in the JAX backend. (#2190) - Add PyTorch backend wrappers for reduction operations (
sum,prod,any,all) with correctaxis/keepdimssemantics. (#2216) - Add PyTorch backend wrapper for argument reduction operations (
argmin/argmax). (#2239)
🐛 Fixes
- Fix underscored symmetric hypersphere mean dispatch so
meancorrectly delegates to the internal_meancomputation. (#2138) - Fix backend contract edge cases including indexing and shape operations across all backends. (#2160)
- Fix various runtime edge cases in PyRecEst distributions and filters. (#2161)
- Fix backend contract shape handling edge cases across array operations. (#2163)
- Fix runtime edge cases in various distribution and filter classes. (#2164)
- Complete MHT tracker fixes including track pruning and merging edge cases. (#2166)
- Harden multi-Bernoulli tracker and backend edge cases for robustness. (#2167)
- Fix backend and MHT edge cases including empty track set handling. (#2168)
- Fix multi-session assignment indexing so tracks are correctly mapped across sessions. (#2170)
- Fix time-offset calibration aggregation to correctly combine offset estimates from multiple sensors. (#2171)
- Fix hypertoroidal wrapped-normal distribution to correctly handle edge case inputs such as zero sigma and boundary points. (#2173)
- Fix backend
meshgridto correctly coerce array-like inputs before grid construction. (#2174) - Fix wrapped-normal distribution to correctly handle edge case inputs. (#2175)
- Fix hypertoroidal distributions to correctly accept scalar and list inputs across methods. (#2176)
- Fix
PartiallyWrappedNormalDistributionto correctly handle edge case inputs. (#2177) - Fix JAX multinomial sampling to correctly manage the random number generator state. (#2178)
- Fix backend
meshgridand JPDAF warning handling edge cases. (#2179) - Fix time-offset utility to validate input shapes before processing. (#2181)
- Fix JAX backend assignment indexing to correctly handle all index types. (#2182)
- Complete autograd backend contract, adding missing operations needed for gradient-based filtering. (#2183)
- Fix
HistoryRecorderto correctly handle array-like inputs with padding. (#2184) - Fix PyTorch tuple reduction operations (
min/maxreturning value and index) to work correctly. (#2187) - Fix
HypercylindricalDiracDistributionconditioning to correctly handle edge case observations. (#2188) - Fix tracklet Viterbi multi-session assignment to handle edge cases including empty sessions and boundary tracks. (#2189)
- Fix S2 coordinate conversion to validate inputs before conversion, preventing silent NaN propagation. (#2195)
- Fix positive-definite matrix shape validation to work correctly for NumPy and PyTorch backends. (#2196)
- Add support for scalar likelihood callbacks in the wrapped-normal filter update step. (#2194)
- Fix
WrappedExponentialDistributionto correctly handle scalar parameter inputs. (#2198) - Fix backend and wrapped distribution input edge cases across multiple distributions. (#2200)
- Fix track metric
min_lengthdenominator so track quality scores are computed correctly. (#2201) - Fix circular distribution constructors to correctly handle scalar parameters. (#2202)
- Fix backend and scalar parameter handling edge cases across distributions. (#2203)
- Fix association model to fall back correctly to an alternative solver when the primary solver fails. (#2205)
- Fix PyTorch
random.choiceto correctly handle the population array and sampling semantics. (#2208) - Fix PyTorch
random.choiceto correctly sample with and without replacement. (#2209) - Fix scalar process noise handling in the random matrix tracker. (#2210)
- Fix JAX
random.randintto follow the NumPy contract for shape and dtype. (#2211) - Fix PyTorch
meanto correctly handle theaxisargument. (#2212) - Fix PyTorch backend quantile computation to correctly handle the
axisargument. (#2214) - Fix dtype promotion and bias validation edge cases in the shared backend. (#2215)
- Fix PyTorch
random.normalto correctly handle array parameters forlocandscale. (#2217) - Fix JAX
meshgridto correctly coerce array-like inputs before constructing the coordinate grid. (#2218) - Fix PyTorch backend compatibility gaps including correct handling of
zeros_like,ones_like, and type promotion edge cases. (#2219) - Fix PyTorch
splitandhsplitto match NumPy semantics for section-count and size-list arguments. (#2223) - Fix PyTorch
random.multinomialto correctly accept sequence inputs. (#2225) - Fix MEM-RBPF FFBSi backward smoothing to correctly handle tuple record types. (#2226)
- Fix backend
assignmentto correctly handle empty index arrays as no-ops across all backends. (#2227) - Fix GNN tracker pairwise-cost validation to raise clear errors for malformed cost matrices. (#2232)
- Fix time-offset summary reporting to correctly identify the best-row offset estimate. (#2233)
- Fix PyTorch
sumto correctly implement thekeepdimscontract. (#2234) - Fix PyTorch reduction operations to correctly implement the
keepdimscontract. (#2237) - Fix positive-definite matrix checks to correctly handle non-symmetric matrices without false positives. (#2238)
- Fix scalar non-assignment costs in Murty k-best assignment to be handled correctly. (#2244)
- Fix PyTorch
multivariate_normalto correctly accept array-like inputs. (#2245) - Fix PyTorch
stdto correctly accept array-like inputs. (#2246) - Validate negative time-offset maximum delta, raising a clear error instead of silently producing incorrect offsets. (#2247)
- Validate Fibonacci Gaussian sampler inputs for finiteness and consistency. (#2248)
- Fix PyTorch
linalgfunctions to correctly accept array-like inputs. (#2249) - Fix association gate monotonicity so the gate function correctly enforces its ordering constraint. (#2254)
- Fix PyTorch
meanto correctly handle integer array inputs. (#2257) - Fix PyTorch
takeandpadbackend functions to correctly follow the NumPy contract. (#2258) - Filter non-finite reference values from calibration reference sets before processing. (#2262)
- Validate Euclidean sampler integer arguments before sampling to prevent cryptic failures. (#2263)
- Fix PyTorch backend
copyto correctly handle scalar inputs without shape errors. (#2265) - Validate numerical repair helper parameters with explicit error checks. (#2266)
- Fix backend
matmulto correctly accept array-like inputs including Python lists. (#2269) - Validate numerical tolerance parameters for finiteness and positivity. (#2270)
- Fix JAX UKF sigma-point updates to correctly propagate state covariance. (#2271)
- Fix non-vectorized Dirac transforms to work correctly across NumPy, PyTorch, and JAX backends. (#2272)
- Fix infinite log-weight normalization to clamp weights to finite values instead of producing NaN. (#2273)
- Validate sensor bias feature row counts before matrix construction. (#2274)
- Validate bias application feature row counts before applying sensor bias corrections. (#2275)
- Validate bias prediction row counts before matrix construction. (#2277)
- Validate finite sequence association costs, rejecting non-finite values before assignment. (#2281)
- Handle non-finite track observation IDs gracefully rather than propagating them into track data structures. (#2282)
- Reject NaN time delta cutoff parameters with a clear error. (#2283)
- Reject non-finite association weight arrays before running data association. (#2285)
- Validate ROI assignment threshold parameters with explicit error checks. (#2286)
- Validate non-assignment cost parameters for finiteness. (#2287)
- Validate chi-square gating state dimension parameter. (#2288)
- Validate track metric
min_lengthparameter to be a positive integer. (#2290) - Validate multi-session tracker max gap parameter explicitly. (#2291)
- Validate multi-session tracker integer inputs explicitly. (#2292)
- Validate candidate pruning top-k parameter to be a positive integer. (#2294)
- Validate adaptive process noise configuration parameters explicitly. (#2295)
- Validate linear update planning scalar parameters explicitly. (#2296)
- Validate bias calibration fitting parameters with explicit error checks. (#2297)
- Validate track manager integer inputs (e.g., max track count) explicitly. (#2301)
- Validate association gate parameters with explicit error checks. (#2302)
- Validate tracklet Viterbi tracker configuration parameters explicitly. (#2303)
- Validate diagnostic summary configuration parameters explicitly. (#2304)
- Validate dynamic model parameters with explicit error checks. (#2305)
- Validate sensor model parameters with explicit error checks. (#2306)
- Reject boolean values as model dimension parameters. (#2307)
- Validate numerical utility sc...
Release 2.2.3
📚 Docs
- Clarify the
InformationFormDistributedKalmanNode/IDKFNodeprediction-input conventions in the API docs so node-local inputs are interpreted correctly. (#2088) - Expand the documentation with API-selection, distribution-taxonomy, error-handling, and install-footprint guidance for choosing and deploying PyRecEst. (#2102)
- Document the public API registry and backend capability matrix so supported modules and examples are easier to discover. (#2105)
- Add scientific validation documentation, a backend-portable workflows tutorial, and backend API matrix checks for cross-backend usage. (#2109)
- Document backend contracts and advanced tracking behavior while tightening distribution API and scientific-invariant coverage. (#2111)
📦 Dependencies
- Update generated requirements to use NumPy 2.4.6. (#2089)
- Refresh the locked
pymdown-extensionsversion for documentation builds. (#2093) - Refresh the locked
idnaversion in Poetry installs to 3.15. (#2094) - Raise the runtime and development
idnapins to 3.15 and add a temporary OSV override so dependency scans report the fixed version. (#2095) - Regenerate the dependency files, including new
requirements-all.txtandrequirements-min.txtinstall variants. (#2097) - Refresh generated requirement files after the dependency set changes. (#2099)
- Update generated requirements to use
idna3.15. (#2100) - Refresh the Poetry lockfile to keep packaged dependencies in sync. (#2115)
- Refresh the generated requirements and lockfile entries after dependency changes. (#2122)
- Update generated requirements to use the latest
astropy-iers-datatables package. (#2125) - Update generated requirements to use
requests2.34.2. (#2126) - Update generated requirements to use
networkx3.6.1. (#2127) - Update generated requirements to use
boule0.6.0. (#2128) - Update generated requirements to use
packaging26.2. (#2129) - Refresh the generated requirements for the Healpy, JAX, and PyTorch install variants. (#2131)
- Update generated requirements to use
requests2.34.2. (#2133) - Update generated requirements to use
pandas3.0.3. (#2134) - Update generated requirements to use
setuptools82.0.1. (#2135) - Update generated requirements to use
packaging26.2. (#2136) - Update generated requirements to use
idna3.16. (#2137) - Refresh the generated requirements for the Healpy, JAX, and PyTorch install variants after the latest dependency bumps. (#2140)
🐛 Fixes
- Make the JAX
array_from_sparseconversion place multidimensional entries correctly when rebuilding dense arrays. (#2091) - Make
HypersphericalGridDistribution.to_hemisphere()reject invalid even-sized grids with a clearValueError. (#2092) - Make NumPy and JAX backend contract operations such as reductions,
take,cross,scatter_add, and slicing behave more consistently. (#2104) - Resolve hyperrectangular distribution edge cases so NumPy, JAX, and PyTorch backends handle them consistently. (#2108)
- Restore custom distribution behavior and filter lazy exports so distributions and filter modules load consistently again. (#2110)
- Make Fibonacci, spherical, circular, and Driscoll-Healy samplers return valid grids for singleton and low-density edge cases. (#2117)
- Make evaluation runs pass Kalman process noise correctly, honor likelihood-based updates, and accept simulator-produced MTT ground-truth arrays. (#2119)
- Resolve evaluation distance selection and object-array estimate extraction so filter evaluations use the intended metrics and mean extractors. (#2121)
✨ Features
- Add CLI scenario tooling and backend-support utilities while resolving several tracking, distribution, and Gaussian numerics edge cases across PyRecEst. (#2096)
⚡ Improvements
- Add backend portability, optional-dependency, and numerical-stability utilities plus compatibility and release-note tooling for easier setup across environments. (#2103)
- Add backend capability and public API contract checks plus benchmark baselines to make supported features and regressions easier to track. (#2107)
- Add
pyrecest.api_registryand install, benchmark, and public-API checks so supported imports and dependency footprints are easier to audit. (#2112) - Add reproducibility and scenario-registry helpers and improve diagnostics, CLI discovery, and evaluation/filter backend boundaries. (#2114)
Release 2.2.2
What's Changed
- Fix MegaLinter lint errors across three files by @Copilot in #2067
- [MegaLinter] Apply linters automatic fixes by @github-actions[bot] in #2069
- Add fixed-lag and fixed-interval smoothers for MEM-QKF trackers by @FlorianPfaff in #2068
- [MegaLinter] Apply linters automatic fixes by @github-actions[bot] in #2070
- Add RB-FFBSi smoother for MEM-RBPF trackers by @FlorianPfaff in #2071
- [MegaLinter] Apply linters automatic fixes by @github-actions[bot] in #2072
- Align LOMEM update with paper reduction by @FlorianPfaff in #2074
- Fix MegaLinter E402 and invalid parameterized test case causing CI failures by @Copilot in #2078
- Ensure hypertoroidal wrapped-normal mean is 1-D by @FlorianPfaff in #2082
- Fix von Mises moment inversion by @FlorianPfaff in #2081
- Fix JAX wrapped-normal PDF convergence check by @FlorianPfaff in #2079
- Bump numpy from 2.4.4 to 2.4.5 by @dependabot[bot] in #2073
- Handle undefined hyperspherical mean directions by @FlorianPfaff in #2080
- Guard undefined hyperspherical mean directions by @FlorianPfaff in #2077
- Fix von Mises moment inversion edge cases by @FlorianPfaff in #2075
- Adapt RM smoother to Granstrom extent recursion by @FlorianPfaff in #2076
- [MegaLinter] Apply linters automatic fixes by @github-actions[bot] in #2085
- Bump version from 2.2.1 to 2.2.2 by @FlorianPfaff in #2086
- Update requirements by @github-actions[bot] in #2087
Full Changelog: 2.2.1...2.2.2
Release 2.2.1
What's Changed
- Add tracking performance metrics by @FlorianPfaff in #2011
- Add fixed-lag out-of-sequence measurement utilities by @FlorianPfaff in #2010
- Add ready-made dynamic and sensor model catalog by @FlorianPfaff in #2014
- Add association hypothesis and gating helpers by @FlorianPfaff in #2016
- Use matvec for camera projection helpers by @FlorianPfaff in #2017
- Add association hypothesis smoke workflow by @FlorianPfaff in #2019
- [MegaLinter] Apply linters automatic fixes by @github-actions[bot] in #2021
- Bump urllib3 from 2.6.3 to 2.7.0 by @dependabot[bot] in #2022
- Add Euclidean boxed particle filter by @FlorianPfaff in #2023
- Fix block particle filter lint issues by @FlorianPfaff in #2025
- [MegaLinter] Apply linters automatic fixes by @github-actions[bot] in #2026
- Fix MEM-RBPF tracker lint issue by @FlorianPfaff in #2027
- Bump urllib3 requirements to 2.7.0 by @FlorianPfaff in #2028
- Add VBRM extended object tracker by @FlorianPfaff in #2031
- Add MEM-QKF tracker by @FlorianPfaff in #2033
- [MegaLinter] Apply linters automatic fixes by @github-actions[bot] in #2034
- Update MEM-QKF robustness by @FlorianPfaff in #2035
- Add LOMEM extended object tracker by @FlorianPfaff in #2036
- Reuse MegaLinter autofix PR branch by @FlorianPfaff in #2041
- Add MEM-QKF batch update mode by @FlorianPfaff in #2037
- [MegaLinter] Apply linters automatic fixes by @github-actions[bot] in #2043
- Use backend in MEM-RBPF tracker by @FlorianPfaff in #2044
- [MegaLinter] Apply linters automatic fixes by @github-actions[bot] in #2045
- Restore velocity locked MEM-QKF aliases by @FlorianPfaff in #2047
- Bump torch from 2.11.0 to 2.12.0 by @dependabot[bot] in #2049
- [MegaLinter] Apply linters automatic fixes by @github-actions[bot] in #2048
- Add tests and exports for VL-MEM-QKF smoother by @FlorianPfaff in #2053
- [MegaLinter] Apply linters automatic fixes by @github-actions[bot] in #2050
- Add velocity-aided MEM-QKF tracker by @FlorianPfaff in #2051
- Add mode RBPF manifold UKF tracker by @FlorianPfaff in #2052
- [MegaLinter] Apply linters automatic fixes by @github-actions[bot] in #2054
- Fix vMF deterministic sigma-point sampler by @FlorianPfaff in #2055
- [MegaLinter] Apply linters automatic fixes by @github-actions[bot] in #2056
- Fix hypertoroidal Dirac marginalization typing by @FlorianPfaff in #2058
- [MegaLinter] Apply linters automatic fixes by @github-actions[bot] in #2059
- [MegaLinter] Apply linters automatic fixes by @github-actions[bot] in #2060
- Fix JAX backend failures in mixture pruning and vMF deterministic sampling by @Copilot in #2061
- [MegaLinter] Apply linters automatic fixes by @github-actions[bot] in #2062
- Bump version from 2.2.0 to 2.2.1 by @FlorianPfaff in #2063
- Update requirements by @github-actions[bot] in #2064
- [MegaLinter] Apply linters automatic fixes by @github-actions[bot] in #2065
Full Changelog: 2.2.0...2.2.1
Release 2.2.0
⚡ Improvements
- Expose linear Gaussian innovation diagnostics through
KalmanFilter.innovation_linear(...)andKalmanFilter.normalized_innovation_squared_linear(...)for backend-native Kalman consistency checks. (#1999) - Add
KalmanFilter.update_model_robust(...)so model-based Kalman filters can use robust linear-Gaussian updates with gating, Huber, and Student-t scaling. (#2002) - Add optional diagnostics to linear Gaussian and Kalman updates, including residuals, normalized innovation squared, measurement-noise scale, and action labels. (#1987)
- Add inverse and composition helpers to
AffineTransformfor point-set registration workflows. (#1991) - Add
student_t_covariance_scale(...)to compute robust measurement-covariance inflation for Student-t Kalman updates. (#1988)
✨ Features
- Add
NamedPairwiseFeatureSchemaandCalibratedPairwiseAssociationModelto define named pairwise association features and turn them into calibrated match probabilities or costs. (#2004) - Add
pairwise_mahalanobis_distancesandpairwise_covariance_shape_componentsinpyrecest.utilsfor generic covariance-based association features. (#2003) - Add
linear_gaussian_update_robust(...)andKalmanFilter.update_linear_robust(...)for gated, Student-t, Huber, and NIS-inflated linear-Gaussian measurement updates. (#1992) - Add
pyrecest.filters.relaxed_s3f_so3with relaxed S3F prediction helpers for SO(3) and S3+ x R3 state spaces. (#1998) - Add generic track-evaluation utilities in
pyrecest.utilsfor scoring links, complete tracks, fragmentation, and aggregate track matrices across sessions. (#1997) - Add confidence-aware, heteroskedastic geodesic log-likelihood updates for
SO3ProductParticleFilterandPartitionedSO3ProductParticleFilter. (#1996) - Expose a public
pyrecest.distributions.so3_helpersmodule for quaternion normalization, exp/log maps, rotation conversion, geodesic distance, and vector rotation on SO(3). (#1990) - Add
so3_right_multiplication_grid_transition(...)andquaternion_grid_transition_density(...)for quaternion-grid prediction on SO(3). (#1995)
🐛 Fixes
- Resolve scalar SO(3) geodesic-distance handling and keep quaternion-grid transition densities normalized for SO(3) particle-filter workflows. (#2000)
Release 2.1.0
✨ Features
- Add
PartitionedSO3ProductParticleFilterforSO(3)^Kstates with configurable partitions, per-block weights, and block-wise resampling. (#1980) - Add configurable post-update resampling to particle filters so users can keep weighted particles, trigger resampling manually, or apply a custom resampling rule. (#1978)
- Let
FullSCGPTracker.update()weight or mask individual measurements so unreliable detections can be down-weighted or ignored during shape and kinematic updates. (#1976) - Add
SphericalHarmonicsEOTTrackerfor 3-D star-convex extended-object tracking with spherical-harmonic extent coefficients. (#1973)
⚡ Improvements
- Speed up
BinghamDistributionnormalization and moment fitting, especially for 2D and 4D cases, to make Bingham-based estimation much faster. (#1972) - Make
HyperhemisphericalGridFilter.get_point_estimate()return the dominant scatter-matrix eigenvector directly for much faster point estimates. (#1970)
Release 2.0.0
✨ Features
- Introduce
AdditiveNoiseTransitionModelandAdditiveNoiseMeasurementModelso nonlinear additive-noise dynamics and sensor models can be defined once and reused across compatible filters. (#1950) - Add SO(3) and SO(3)^K representation conversion support, including aliases and tangent-Gaussian and Dirac approximations for rotation distributions. (#1939)
- Add reusable model adapters for grid filters so
AbstractGridFiltercan update from likelihood models and predict from transition-density models. (#1948) - Expand representation conversion aliases with domain-specific targets, custom alias registration, and a runnable conversion example for more distribution families. (#1964)
- Add
predict_model(...)andupdate_model(...)support to particle filters for reusable transition-sampling and likelihood model objects. (#1947) - Add
predict_model(...)andupdate_model(...)support toUnscentedKalmanFilterfor reusable additive-noise transition and measurement models. (#1944) - Add
KalmanFilter.predict_model(...)andupdate_model(...)so linear Gaussian model objects can be passed directly to the filter. (#1945) - Add reusable likelihood, transition-sampling, and transition-density model objects in
pyrecest.modelsfor particle, grid, and related estimators. (#1949) - Add reusable linear Gaussian transition and measurement model classes in
pyrecest.modelswith prediction and noise helper methods. (#1946) - Add string-based representation conversion aliases such as
particles,gaussian,grid, andfourier, plusconvert_to(...)convenience methods on distributions. (#1931) - Introduce a distribution representation-conversion layer with
convert_distribution(...), conversion registration helpers, and method-formconvert_to(...)access on distributions. (#1929) - Add proposal-based rejuvenation for goal-conditioned replay particle filters so particles can be pulled back onto high-likelihood position hypotheses after an update. (#1928)
- Add
GoalConditionedReplayParticleIMMFilterwith per-particle motion modes for stationary, diffusion, momentum, goal-directed, and jump replay dynamics. (#1927)
⚡ Improvements
- Make the representation conversion API available directly from
pyrecest.distributions, including package-level exports forconvert_distribution(...)and related helpers. (#1940) - Add
pyrecest.protocols.testinghelpers that make it easier to check whether custom distributions, filters, and models satisfy PyRecEst capability protocols. (#1953) - Add public model capability protocols and adapter helpers that let existing Kalman-style APIs accept structurally compatible model objects. (#1962)
- Add a protocol capability matrix for representative distributions and filters, and ensure batched particle-model predictions keep the expected particle layout. (#1965)
- Ship a
py.typedmarker so PyRecEst exposes its type information to external type checkers and typed downstream projects. (#1954) - Introduce the public
pyrecest.protocolspackage with common array and dimension contracts plus filter capability protocols for extension code. (#1952) - Add backend-aware validation utilities for model vectors, matrices, covariances, and inferred state dimensions to make reusable model objects safer to construct. (#1942)
- Speed up
StateSpaceSubdivisionFilterlinear updates and relaxed S3F covariance calculations with vectorized implementations. (#1926)