fv_weights_consistent#

t3toolbox.backend.fv_operations.fv_weights_consistent(variations, weights)#
def fv_weights_consistent(
        variations: typ.Tuple[typ.Sequence[NDArray], typ.Sequence[NDArray]],  # (V, H)
        weights:    typ.Tuple[typ.Sequence[NDArray], typ.Sequence[NDArray],
                              typ.Sequence[NDArray], typ.Sequence[NDArray]],   # (up, down, left, right)
) -> bool:                                                                     # True iff shape-consistent

True iff the four weight families (each len=d) can be absorbed into variations (non-raising).

Ranks: up<->H.nU (axis -2), down<->V.nD (axis -2), left<->H.rL (axis -3), right<->H.rR (axis -1).

Stacks – the trailing rule: a weight is frame-like, carrying the frame stack C, while the variations carry K + C (a K-batch of tangents at one frame shares the one metric). So the weight’s stack must be the trailing (inner) part of the variation stack – exactly the rule check_fv_pair applies to a (frame, variations) pair, with the weight playing the frame’s role. Absorption then broadcasts C over K + C for free through the leading '...' (which works because C is innermost). K may be empty, the common case.

Like the variations themselves, this predicate is blind to the frame: a weight whose stack is the whole variation stack also passes, reading as C_w = K + C (that many base points, one tangent each) – a legitimate absorption. Whether the weight is the metric of this tangent’s frame needs the frame, and is checked by frame_variations_format.check_fw_pair at the tangent level.

Parameters:
  • variations (t3toolbox.backend.common.typ.Tuple[t3toolbox.backend.common.typ.Sequence[NDArray], t3toolbox.backend.common.typ.Sequence[NDArray]])

  • weights (t3toolbox.backend.common.typ.Tuple[t3toolbox.backend.common.typ.Sequence[NDArray], t3toolbox.backend.common.typ.Sequence[NDArray], t3toolbox.backend.common.typ.Sequence[NDArray], t3toolbox.backend.common.typ.Sequence[NDArray]])

Return type:

bool