utv_retract =========== .. py:function:: t3toolbox.backend.utv_operations.utv_retract(frame_data, variations_data) .. code-block:: python def utv_retract( frame_data, # UT3Frame .data: supercore stack = C variations_data, # UT3Variations .data: supercore stack = K + C ): # -> retracted UniformTuckerTensorTrain .data (at the BASE point's ranks; stack = K + C) Retract a uniform frame-variations tangent vector onto the fixed-rank manifold. Forms the shifted doubled-rank embedding ``base point + v`` (:py:func:`utv_to_ut3` with ``include_shift=True``) and truncates it back to the **base point's own ranks** -- the Tucker ``up`` ranks and ``left`` TT ranks read off the frame masks -- via the mask-truncated uniform T3-SVD. The output is a UT3 at the frame padded dims (``ut3svd`` truncates by max rank to a fixed shape, so no extra slice is needed), one retracted point per stack element. The uniform mirror of :py:func:`tv_operations.tv_retract` (the implicit T3-SVD / Algorithm 10, Alger et al. 2026). **Varying ranks across ``C``** work for free: the per-``C`` frame ranks are the per-element truncation targets. **The ``K`` (tangent) stack:** the frame ranks have stack ``C`` while the shifted UT3 has stack ``K + C``, so the frame ranks are broadcast over ``K`` (the ``K`` tangents share the frame, hence the same truncation targets).