t3toolbox.backend.probing.probe_dense#

t3toolbox.backend.probing.probe_dense(vectors: t3toolbox.backend.common.typ.Sequence[t3toolbox.backend.common.NDArray], T: t3toolbox.backend.common.NDArray, use_jax: bool = False) t3toolbox.backend.common.typ.Tuple[t3toolbox.backend.common.NDArray]#

Probe a dense tensor.

Parameters:
  • T (NDArray) – Tensor to be probed. shape=Z+(N1,…,Nd)

  • vectors (typ.Sequence[NDArray]) – Probing input vectors. len=d. elm_shape=K+(Ni,)

  • xnp – Linear algebra backend. Default: np (numpy)

Returns:

Probes. len=d. elm_shape=(Ni,) or elm_shape=Z+K+(Ni,)

Return type:

typ.Tuple[NDArray]

Examples

Probe with one set of vectors:

>>> import numpy as np
>>> import t3toolbox.backend.probing as t3p
>>> T = np.random.randn(10,11,12)
>>> u0 = np.random.randn(10)
>>> u1 = np.random.randn(11)
>>> u2 = np.random.randn(12)
>>> yy = t3p.probe_dense((u0,u1,u2),T)
>>> y0 = np.einsum('ijk,j,k', T, u1, u2)
>>> y1 = np.einsum('ijk,i,k', T, u0, u2)
>>> y2 = np.einsum('ijk,i,j', T, u0, u1)
>>> print(np.linalg.norm(yy[0] - y0))
2.0928808318295785e-14
>>> print(np.linalg.norm(yy[1] - y1))
1.0841599276764049e-14
>>> print(np.linalg.norm(yy[2] - y2))
1.2970142174948615e-14

Vectorize over probing vectors

>>> import numpy as np
>>> import t3toolbox.backend.probing as t3p
>>> T = np.random.randn(10,11,12)
>>> u0 = np.random.randn(2,3, 10)
>>> u1 = np.random.randn(2,3, 11)
>>> u2 = np.random.randn(2,3, 12)
>>> yy = t3p.probe_dense((u0,u1,u2),T)
>>> y0 = np.einsum('ijk,uvj,uvk->uvi', T, u1, u2)
>>> y1 = np.einsum('ijk,uvi,uvk->uvj', T, u0, u2)
>>> y2 = np.einsum('ijk,uvi,uvj->uvk', T, u0, u1)
>>> print(np.linalg.norm(yy[0] - y0))
2.0928808318295785e-14
>>> print(np.linalg.norm(yy[1] - y1))
1.0841599276764049e-14
>>> print(np.linalg.norm(yy[2] - y2))
1.2970142174948615e-14

Vectorize over probing vectors and big tensor

>>> import numpy as np
>>> import t3toolbox.backend.probing as t3p
>>> T = np.random.randn(4,5,6, 10,11,12)
>>> u0 = np.random.randn(2,3, 10)
>>> u1 = np.random.randn(2,3, 11)
>>> u2 = np.random.randn(2,3, 12)
>>> yy = t3p.probe_dense((u0,u1,u2),T)
>>> y0 = np.einsum('xyzijk,uvj,uvk->xyzuvi', T, u1, u2)
>>> y1 = np.einsum('xyzijk,uvi,uvk->xyzuvj', T, u0, u2)
>>> y2 = np.einsum('xyzijk,uvi,uvj->xyzuvk', T, u0, u1)
>>> print(np.linalg.norm(yy[0] - y0))
2.0928808318295785e-14
>>> print(np.linalg.norm(yy[1] - y1))
1.0841599276764049e-14
>>> print(np.linalg.norm(yy[2] - y2))
1.2970142174948615e-14