utv_orthogonal_gauge_projection#

t3toolbox.backend.utv_operations.utv_orthogonal_gauge_projection(frame_data, variations_data, shared_data=None)#
def utv_orthogonal_gauge_projection(
        frame_data,       # UT3Frame .data
        variations_data,  # UT3Variations .data
        shared_data: typ.Optional['sharing_module.SharedFrameData'] = None,  # tied post-pass (SF-T3)
):  # -> gauged variations .data (same masks; the tangent VECTOR changes)

Orthogonally project the variations onto the gauge-satisfying subspace (the uniform mirror of tv_operations.tv_orthogonal_gauge_projection()). Removes the component of each Tucker variation parallel to its up-core U and of each left-interior TT variation parallel to its left-core P – the gauge conditions (48)-(49), Appendix A.3 of Alger et al. (2026). The represented tangent vector CHANGES (orthogonal, not oblique).

Mask-once up front (the frame and variation padding zeroed), then mask-agnostic einsums vectorized over the leading mode axis d (a per-core map); the last TT variation is left unchanged (the [:-1] boundary). The output carries the variation’s masks unchanged (gauge preserves the rank structure).

With shared_data (the frame’s uniform SF-T3 companion, ufv_shared_frame_data()), the tied post-pass fires after the gauge loops (P_tied = P_tied o P_gauge, tied within gauged), mirroring the ragged threading.

Parameters:

shared_data (t3toolbox.backend.common.typ.Optional[SharedFrameData])