t3toolbox.OLD_uniform.unpack#

t3toolbox.OLD_uniform.unpack(packed_edge_tensors: NDArray, submask: NDArray, use_jax: bool = False) Tuple[NDArray, Ellipsis]#

Get ragged (variable length) edge vectors from uniform edge vectors.

Example

>>> import numpy as np
>>> import t3toolbox.uniform_tucker_tensor_train as ut3
>>> E = np.array([[1,2,3,4],[5,6,7,8]])
>>> submask = [[True, False, True, True],[False, True, False, False]]
>>> print(ut3.unpack(E, submask))
(array([1, 3, 4]), array([6]))

Get a tensor from each “edge”:

>>> import numpy as np
>>> import t3toolbox.uniform_tucker_tensor_train as ut3
>>> E = np.random.randn(6,5,4,3,2)
>>> submask = [[False, False],[False, True], [True, True]]
>>> ee = ut3.unpack(E, submask)
>>> print([e.shape for e in ee])
[(6, 5, 4, 0), (6, 5, 4, 1), (6, 5, 4, 2)]

Practical use case: remove zero singular values from uniform T3-SVD

>>> import numpy as np
>>> import t3toolbox.tucker_tensor_train as t3
>>> import t3toolbox.uniform_tucker_tensor_train as ut3
>>> import t3toolbox.t3svd as t3svd
>>> s0 = ((11,12,13), (6,7,5), (1,3,6,2))
>>> s = (s0[0],) + t3.compute_minimal_t3_ranks(s0)
>>> x = t3.t3_corewise_randn(s)
>>> _, _, ss_tt = t3svd.t3svd(x)
>>> print(ss_tt[1])
[2627.79225375  441.12769204  328.73617961]
>>> cores, masks = ut3.t3_to_ut3(x)
>>> _, _, ss_tt_from_ut3 = ut3.ut3_svd(cores, masks)
>>> print(ss_tt_from_ut3[1])
[2627.79225375  441.12769204  328.73617961    0.            0.        ]
>>> print(ut3.unpack(ss_tt_from_ut3, masks[2])[1])
[2627.79225375  441.12769204  328.73617961]