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 carryK + C(aK-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 rulecheck_fv_pairapplies to a (frame, variations) pair, with the weight playing the frame’s role. Absorption then broadcastsCoverK + Cfor free through the leading'...'(which works becauseCis innermost).Kmay 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 byframe_variations_format.check_fw_pairat 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