Skip to content

Dev into dev-backend-mixpol#309

Merged
achael merged 3 commits into
dev-backend-mixpolfrom
dev
Jun 17, 2026
Merged

Dev into dev-backend-mixpol#309
achael merged 3 commits into
dev-backend-mixpolfrom
dev

Conversation

@achael

@achael achael commented Jun 16, 2026

Copy link
Copy Markdown
Owner

merge pol gradient fix (#306) from dev into dev-backend-mixpol

achael added 3 commits June 12, 2026 15:50
Add package build and check steps to CI workflow
* Add physical_grad_slots helper

Maps the Stokes DOF mask to the physical gradout slots the chisq/reg
kernels must fill, centralizing the mcv/vcv cross-coupling that mirrors
transform_gradients' Jacobian sparsity. Not yet wired in. + unit tests.

* Wire physical_grad_slots into chisq and reg gradient dicts

Feed the cross-coupling-aware mask to the pol gradient kernels in both
compute_chisqgrad_dict and compute_reggrad_dict. Behavior-identical for
now (kernels still carry the or-patches). Guard physical_grad_slots
against sub-4-wide single-pol masks (Stokes-I carries 'mcv' inertly).
+ regression test.

* Revert vvis kernels to diagonal pol_solve gating

The mcv/vcv cross-coupling now lives in physical_grad_slots, so drop the
'or pol_solve[3]' patches (#296) in chisqgrad_vvis / chisqgrad_vvis_nfft;
each physical slot keys on its own bit again. Note in each pol chisqgrad
docstring that pol_solve flags required physical gradients, not DOFs.

* Fix reggrad_ptv first-row/col boundary masking + epsilon_tv

Zero the back-neighbor (m2/m3) terms on the first row/column in
reggrad_ptv slots 0/1/3 (the back-neighbor is the zero pad), matching
reggrad_vtv/reggrad_tv. Pre-fix the whole first row+col of those slots
was wrong (corner ~4x off vs FD). Add epsilon_tv to reg_ptv/reggrad_ptv
denominators (default 0, byte-identical) for #295 parity. Note pol_solve
= physical-gradient slots in the 8 pol reggrad docstrings.

Add full-grid boundary FD regression tests for ptv, vtv, and Stokes-I tv.

* Note pol_solve semantics in polchisqgrad docstring

polchisqgrad is a legacy shim (parity tests only); document that its
pol_solve is a physical-gradient mask, not a raw DOF mask.

* Drive pol regularizer FD with all four physical slots

_pol_solve_for now returns [1,1,1,1] so the previously-blind cross-
coupling slots are FD-checked: reggrad_ptv psi (3), reggrad_vflux/l1v/
l2v/vtv rho (1), and slot 0 for every pol reg. Proves the reg-grad
slots are individually correct against finite differences.

* Add pol chisq FD + cross-ttype tests in test_chisquared.py

New pol coverage in its final-home file: TestPolChisqGradFD checks
chisqgrad_p/m/vvis against finite differences of the chisq value in all
four physical slots (pol_solve=[1,1,1,1]) for direct+nfft, asserting
vvis slot 2 (EVPA) is identically zero. TestPolChisq{,Grad}Consistency
check direct-vs-nfft agreement. Closes the m / p-slot-3 blind spots.

* Add parametrized pol objective-FD sampling the polarization DOF block

TestObjectiveGradPolarimetricFD checks objgrad vs FD for IP/IV/IQUV x
{direct,nfft}, with each case bundling its pol data terms + a pol reg, so
both the chisq and reg gradient paths through physical_grad_slots are
exercised. Samples the pol DOF block (past the Stokes-I block), where the
mcv/vcv cross-coupling lives -- the existing global-sampling FD tests
missed it (the dropped IP slot-3 term is ~4% off FD at V=0.02*I, ~430% at
V=0.2*I). Comments out the now-subsumed test_fd_matches_analytic_polarimetric
(backend) and test_iv_gradient_matches_finite_difference (e2e).

* Use an asymmetric image for chisq/regularizer/gradient FD fixtures

Add make_asym_image (broad offset/elongated/rotated double-Gaussian) and
switch the Stokes-I FD fixtures (chisq_setup, reg_setup, mfreg_setup,
grad_setup) to it. Breaking the reflection/rotation/x<->y symmetry of the
centered Gaussian surfaces boundary/axis-ordering bugs a symmetric image
hides. Blobs kept broad (grid-filling, no dead pixels) so the |.|-kink TV
gradients stay FD-well-conditioned at epsilon_tv=0; all tolerances unchanged.

* Use asymmetric + spatially-varying pol in pol FD test fixtures

chisq_setup_pol and a new asym_pol_setup build on make_asym_image and use
add_random_pol (ccorr>0) so EVPA, vfrac, rho, and psi all vary spatially
instead of a constant pol fraction. polreg_setup switches its Stokes I to
the asymmetric image (keeping the per-pixel pol jitter that keeps TV
denominators non-degenerate). TestObjectiveGradPolarimetricFD now uses the
structured-pol obs.

Widen the pol chisq FD check to a median+max split (median 1e-5, max 1e-3):
the structured-pol imcur has sharper local curvature, so 2nd-order FD
truncation pushes a few small-gradient pixels to ~2.6e-4 -- well below any
real pol-gradient bug (%-level), which the tight median still catches.

* Comment cleanup + epsilon_tv consistency in pol_imager_utils

Manual review pass: per-slot dR/dX labels, docstrings on the reg kernels,
a module-level CONVENTIONS block (imarr = [I, rho, phi=2chi, psi]), and
removal of stale TODOs. Two behavior touches, both byte-identical at the
defaults:
- reg_vtv / reggrad_vtv now honor epsilon_tv (kwargs, default 0) like the
  ptv pair, instead of the value ignoring it while the grad pinned it to 0.
- reggrad_ptv masks the chi-slot back-neighbor terms (c2/c3) too, for
  uniformity (they already self-zero at the pad).
Plus an mcv_r exception-message fix and ruff-clean whitespace.

* Comment cleanup in imager_utils (no behavior change)

Manual review pass: docstrings on the Stokes-I reg kernels, per-block
comments, 'fourier/transform matrices' labels on the diag Amatrices
unpacking, and removal of dead commented-out systematic-noise code in the
bispectrum data functions (the intent is now documented in
apply_systematic_noise_snrcut). Purely cosmetic; ruff-clean.

* fixed lint errors in test_regularizers and test_chisquared
@achael achael requested a review from rohandahale June 16, 2026 20:34
@achael achael self-assigned this Jun 16, 2026
@rohandahale rohandahale added this to the 2.0 milestone Jun 16, 2026

@rohandahale rohandahale left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good!

@achael achael merged commit 03c7f05 into dev-backend-mixpol Jun 17, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants