t3toolbox.backend.contractions.MNa_Maib_MiN_to_MNb#

t3toolbox.backend.contractions.MNa_Maib_MiN_to_MNb(MNa: t3toolbox.backend.common.NDArray, Maib: t3toolbox.backend.common.NDArray, MiN: t3toolbox.backend.common.NDArray, use_jax: bool = False) t3toolbox.backend.common.NDArray#

Computes vectorized einsum a,aib,i->b, with vectorization over a and i, or aib and i, or both.

N and M are the vectorization indices, which may be groups of indices.

Examples

Vectorize over both N and M:

>>> import numpy as np
>>> from t3toolbox.utils.contractions import MNa_Maib_MiN_to_MNb
>>> uv_xyz_a = np.random.randn(5,6,  2,3,4, 10)
>>> uv_aib = np.random.randn(5,6, 10,11,12)
>>> uv_i_xyz = np.random.randn(5,6, 11, 2,3,4)
>>> MNb = MNa_Maib_MiN_to_MNb(uv_xyz_a, uv_aib, uv_i_xyz)
>>> MNb_true = np.einsum('uvxyza,uvaib,uvixyz->uvxyzb', uv_xyz_a, uv_aib, uv_i_xyz)
>>> print(MNb.shape == MNb_true.shape)
True
>>> print(np.linalg.norm(MNb - MNb_true))
4.0539884184333385e-13

Vectorize over N only

>>> import numpy as np
>>> from t3toolbox.utils.contractions import MNa_Maib_MiN_to_MNb
>>> xyz_a = np.random.randn(2,3,4, 10)
>>> aib = np.random.randn(10,11,12)
>>> i_xyz = np.random.randn(11, 2,3,4)
>>> MNb = MNa_Maib_MiN_to_MNb(xyz_a, aib, i_xyz)
>>> MNb_true = np.einsum('xyza,aib,ixyz->xyzb', xyz_a, aib, i_xyz)
>>> print(MNb.shape == MNb_true.shape)
True
>>> print(np.linalg.norm(MNb - MNb_true))
7.867752051442911e-14

Vectorize over both M only:

>>> import numpy as np
>>> from t3toolbox.utils.contractions import MNa_Maib_MiN_to_MNb
>>> uv_a = np.random.randn(5,6, 10)
>>> uv_aib = np.random.randn(5,6, 10,11,12)
>>> uv_i = np.random.randn(5,6, 11)
>>> MNb = MNa_Maib_MiN_to_MNb(uv_a, uv_aib, uv_i)
>>> MNb_true = np.einsum('uva,uvaib,uvi->uvb', uv_a, uv_aib, uv_i)
>>> print(MNb.shape == MNb_true.shape)
True
>>> print(np.linalg.norm(MNb - MNb_true))
6.647117027933763e-14

No vectorization:

>>> import numpy as np
>>> from t3toolbox.utils.contractions import MNa_Maib_MiN_to_MNb
>>> a = np.random.randn(10)
>>> aib = np.random.randn(10,11,12)
>>> i = np.random.randn(11)
>>> MNb = MNa_Maib_MiN_to_MNb(a, aib, i)
>>> MNb_true = np.einsum('a,aib,i->b', a, aib, i)
>>> print(MNb.shape == MNb_true.shape)
True
>>> print(np.linalg.norm(MNb - MNb_true))
8.510422543011842e-15