utv_weighted_norm ================= .. py:function:: t3toolbox.backend.utv_operations.utv_weighted_norm(variations, weights, n_stack) .. code-block:: python def utv_weighted_norm( variations: typ.Tuple, # UT3Variations .data: (tkv, ttv, shape, masks), stack = K + C weights: typ.Tuple, # UT3FrameWeights .data: (up, down, left, right, masks), stack = C n_stack: int, # leading K+C stack axes to keep; 0 -> a single scalar ) -> NDArray: # weighted coordinate norm, shape = stack_shape[:n_stack] Weighted (Grasedyck-Kramer) coordinate norm of a uniform tangent's variations: absorb the metric into the variation supercores, then take the corewise stack-norm. Uniform twin of ``fv_weighted_norm``. The frame (orthonormal) is not needed and not touched, so this is O(ranks). The inserted diagonal is **squared** by the norm, so ``weights = 1/sigma`` penalises by ``1/sigma^2``. Like ``corewise_norm`` this is the coordinate metric (= Hilbert-Schmidt only on an orthonormal, gauged frame) -- and note that absorbing weights **breaks the gauge**, so the HS reading does not survive the weighting. Weighting does not mask; the reduction does (``utv_corewise_inner`` masks its own input), so garbage padding is zeroed where the sum happens. **Precondition:** the weight's masks (broadcast over ``K``) must equal the variations' -- ``ufv_weights_consistent``; the frontend enforces it. Lives here, not in ``ufv_operations`` beside ``ufv_absorb_weights``, because the corewise reduction it needs is ``utv_corewise_inner`` and ``utv_operations`` already imports ``ufv_operations`` -- the other placement would be a circular import. (Ragged has no such constraint: its ``fv_weighted_norm`` reaches a standalone ``corewise`` module.)