Arithmetics¶
Basic Arithmetics¶
The most basic tensor operations (addition +
, subtraction -
, and product *
with either a scalar or with another tensor) can be accomplished via direct manipulation of tensor cores (see e.g. the original tensor train paper).
[1]:
import tntorch as tn
import torch
import numpy as np
t1 = tn.ones([32]*4)
t2 = tn.ones([32]*4)
t = tn.round((t1+t2)*(t2-2))
print(t)
4D TT tensor:
32 32 32 32
| | | |
(0) (1) (2) (3)
/ \ / \ / \ / \
1 1 1 1 1
You can also assign values to parts of a tensor:
[2]:
t = tn.ones(5, 5)
t[:3, :] = 2
t[:, :2] *= 3
print(t.torch())
tensor([[6., 6., 2., 2., 2.],
[6., 6., 2., 2., 2.],
[6., 6., 2., 2., 2.],
[3., 3., 1., 1., 1.],
[3., 3., 1., 1., 1.]])
Advanced Operations¶
Thanks to cross-approximation, tntorch supports many other more advanced operations on tensors, including element-wise division /
, exp()
, log()
, sin()
, etc.
[3]:
domain = [torch.linspace(0, np.pi, 32)]*4
x, y, z, w = tn.meshgrid(domain)
t = tn.round(1 / (1+x+y+z+w))
print(t)
4D TT-Tucker tensor:
32 32 32 32
| | | |
7 13 13 7
(0) (1) (2) (3)
/ \ / \ / \ / \
1 7 7 7 1
We will now try the trigonometric identity \(\sin^2(x) + \cos^2(x) = 1\):
[4]:
t = tn.round(tn.sin(t)**2 + tn.cos(t)**2)
print(t)
4D TT tensor:
32 32 32 32
| | | |
(0) (1) (2) (3)
/ \ / \ / \ / \
1 13 17 13 1
The tensor t
should be \(1\) everywhere. Indeed:
[5]:
print(tn.mean(t))
print(tn.var(t))
tensor(1.0000)
tensor(1.8159e-15)