T3Frame.random_orthogonal#

static t3toolbox.frame_variations_format.T3Frame.random_orthogonal(shape, tucker_ranks, tt_ranks, stack_shape=(), use_jax=False)#
def random_orthogonal(
        shape:          typ.Sequence[int],              # (N0,...,N(d-1))
        tucker_ranks:   typ.Sequence[int],              # (n0,...,n(d-1))
        tt_ranks:       typ.Sequence[int],              # (1,r1,...,r(d-1),1)
        stack_shape:    typ.Tuple[int, ...] = (),       # C (frame/core stack)
        use_jax:        bool = False,
) -> 'T3Frame':

Orthogonal representation of a random T3 – a genuine random base point (orthogonal, consistent), not iid-random cores. Equals from_t3(TuckerTensorTrain.randn(...)).

Requesting a rank above what the rest of the network can support is allowed and does not raise: an orthonormal core cannot carry more rank than its own shape admits, so the excess is carried as slack between the frame’s four rank stores rather than in any one core. Asking for tucker_ranks=(4,4,4) with tt_ranks=(1,2,2,1) returns up_ranks=(4,4,4) but down_ranks=(2,4,2); asking for tt_ranks=(1,9,9,1) returns different left_ranks and right_ranks. The frame is exactly orthogonal either way and every tangent operation on it is exact – only has_minimal_ranks reports False (a diagnostic, never a precondition; see docs/frame_variations.md).

Parameters:
  • shape (t3toolbox.backend.common.typ.Sequence[int])

  • tucker_ranks (t3toolbox.backend.common.typ.Sequence[int])

  • tt_ranks (t3toolbox.backend.common.typ.Sequence[int])

  • stack_shape (t3toolbox.backend.common.typ.Tuple[int, ...])

  • use_jax (bool)

Return type:

T3Frame