Preserve hypertoroidal particle counts and axes - #5262
Conversation
✅MegaLinter analysis: Success
Notices📣 MegaLinter 9.5.0 is out! Discover the new features and security recommendations in the release announcement. (Skip this info by defining See detailed reports in MegaLinter artifacts Your project could benefit from a custom flavor, which would allow you to run only the linters you need, and thus improve runtime performances. (Skip this info by defining
|
|
Closing as superseded by #5220. Both PRs fix the particle-count/axis-shape regression in the same constructor, but #5220 also removes the artificial multidimensional diagonal collapse and adds regression coverage for marginal spacing. Keeping both would duplicate the same code path while the newer patch preserves the underlying dependence defect. |
Pull request was closed

Bug
HypertoroidalParticleFilterinitialized multidimensional particles with a floating-steparange(...)and then applied.squeeze().This violates the constructor's particle-count and shape contracts in two concrete cases:
n_particles=61anddim=2, NumPy produces 62 grid values, with the final value equal to2π; after toroidal wrapping this is a duplicate of zero;n_particles=1anddim>1,.squeeze()removes the particle axis, so one three-dimensional particle is stored as shape(3,)instead of(1, 3). The shared Dirac constructor then interprets the state as three scalar Diracs and creates three weights.Fix
Generate the one-dimensional angular grid with exact-count
linspace(..., num=n_particles, endpoint=False)for every dimension. For multidimensional filters, tile and transpose that grid without squeezing the batch axis.Regression coverage
(61, 2)and 61 weights;(1, 3), one weight, and a three-dimensional point estimate.Validation
2πendpoint;(1, 3)to(3,);main(f196ec41d1d8681e279936db9f1a0a3abfa276e7);