utv_oblique_gauge_projection#

t3toolbox.backend.utv_operations.utv_oblique_gauge_projection(frame_data, variations_data)#
def utv_oblique_gauge_projection(
        frame_data,       # UT3Frame .data
        variations_data,  # UT3Variations .data
):  # -> gauged variations .data (same masks; the tangent VECTOR is PRESERVED)

Project the variations onto the gauge-satisfying subspace while PRESERVING the tangent vector (the uniform mirror of tv_operations.tv_oblique_gauge_projection()). The Tucker perturbation is made perpendicular to U (compensating through the down core O), then the TT variations are made left-perpendicular (compensating through the right core Q).

The Tucker step is independent per core -> vectorized over d. The TT step carries a correction forward to the next core (a left-to-right sweep), implemented as an xscan over d – NOT a Python loop: an unrolled loop bakes d copies of the step into the jit graph (compile time superlinear in the tensor order d), while a scan compiles the body once. Mask-once up front. Enforces the gauge conditions (48)-(49), Appendix A.3 of Alger et al. (2026).