t3toolbox.manifold.tangent_to_dense#

t3toolbox.manifold.tangent_to_dense(variation: t3toolbox.basis_coordinates_format.T3Variation, base: t3toolbox.basis_coordinates_format.T3Base, include_shift: bool = False, use_jax: bool = False) NDArray#

Convert Tangent vector to Tucker tensor train manifold into dense tensor.

Examples

>>> import numpy as np
>>> import t3toolbox.tucker_tensor_train as t3
>>> import t3toolbox.manifold as t3m
>>> import t3toolbox.orthogonalization as orth
>>> import t3toolbox.basis_coordinates_format as bvf
>>> p = t3.t3_corewise_randn(((14,15,16), (4,5,6), (2,3,2,2)))
>>> base, _ = orth.orthogonal_representations(p)
>>> variation = t3m.tangent_randn(base)
>>> v_dense = t3m.tangent_to_dense(variation, base) # Convert tangent to dense
>>> ((U0,U1,U2), (L0,L1,L2), (R0,R1,R2), (O0,O1,O2)) = base
>>> ((V0,V1,V2), (H0,H1,H2)) = variation
>>> s1 = np.einsum('ai,bj,ck,xay,ybz,zcw->ijk', U0,U1,U2,H0,R1,R2)
>>> s2 = np.einsum('ai,bj,ck,xay,ybz,zcw->ijk', U0,U1,U2,L0,H1,R2)
>>> s3 = np.einsum('ai,bj,ck,xay,ybz,zcw->ijk', U0,U1,U2,L0,L1,H2)
>>> s4 = np.einsum('ai,bj,ck,xay,ybz,zcw->ijk', V0,U1,U2,O0,R1,R2)
>>> s5 = np.einsum('ai,bj,ck,xay,ybz,zcw->ijk', U0,V1,U2,L0,O1,R2)
>>> s6 = np.einsum('ai,bj,ck,xay,ybz,zcw->ijk', U0,U1,V2,L0,L1,O2)
>>> v_dense2 = s1 + s2 + s3 + s4 + s5 + s6
>>> print(np.linalg.norm(v_dense - v_dense2))
1.2760924630140578e-14
>>> p_plus_v_dense = t3m.tangent_to_dense(variation, base, include_shift=True) # Convert shifted tangent, p+v, to dense
>>> p_plus_v_dense2 =  t3.t3_to_dense(p) + v_dense
>>> print(np.linalg.norm(p_plus_v_dense - p_plus_v_dense2))
1.2677102046134292e-12