|
5 | 5 | from pina.operators import grad, div, laplacian |
6 | 6 |
|
7 | 7 |
|
8 | | -def func_vec(x): |
| 8 | +def func_vector(x): |
9 | 9 | return x**2 |
10 | 10 |
|
11 | 11 |
|
12 | 12 | def func_scalar(x): |
13 | | - print('X') |
14 | 13 | x_ = x.extract(['x']) |
15 | 14 | y_ = x.extract(['y']) |
16 | | - mu_ = x.extract(['mu']) |
17 | | - return x_**2 + y_**2 + mu_**3 |
| 15 | + z_ = x.extract(['z']) |
| 16 | + return x_**2 + y_**2 + z_**2 |
18 | 17 |
|
19 | 18 |
|
20 | | -data = torch.rand((20, 3), requires_grad=True) |
21 | | -inp = LabelTensor(data, ['x', 'y', 'mu']) |
22 | | -labels = ['a', 'b', 'c'] |
23 | | -tensor_v = LabelTensor(func_vec(inp), labels) |
24 | | -tensor_s = LabelTensor(func_scalar(inp).reshape(-1, 1), labels[0]) |
25 | | - |
| 19 | +inp = LabelTensor(torch.rand((20, 3), requires_grad=True), ['x', 'y', 'z']) |
| 20 | +tensor_v = LabelTensor(func_vector(inp), ['a', 'b', 'c']) |
| 21 | +tensor_s = LabelTensor(func_scalar(inp).reshape(-1, 1), ['a']) |
26 | 22 |
|
27 | 23 | def test_grad_scalar_output(): |
28 | 24 | grad_tensor_s = grad(tensor_s, inp) |
| 25 | + true_val = 2*inp |
29 | 26 | assert grad_tensor_s.shape == inp.shape |
30 | 27 | assert grad_tensor_s.labels == [ |
31 | 28 | f'd{tensor_s.labels[0]}d{i}' for i in inp.labels |
32 | 29 | ] |
| 30 | + assert torch.allclose(grad_tensor_s, true_val) |
| 31 | + |
33 | 32 | grad_tensor_s = grad(tensor_s, inp, d=['x', 'y']) |
| 33 | + true_val = 2*inp.extract(['x', 'y']) |
34 | 34 | assert grad_tensor_s.shape == (inp.shape[0], 2) |
35 | 35 | assert grad_tensor_s.labels == [ |
36 | 36 | f'd{tensor_s.labels[0]}d{i}' for i in ['x', 'y'] |
37 | 37 | ] |
| 38 | + assert torch.allclose(grad_tensor_s, true_val) |
38 | 39 |
|
39 | 40 |
|
40 | 41 | def test_grad_vector_output(): |
41 | 42 | grad_tensor_v = grad(tensor_v, inp) |
| 43 | + true_val = torch.cat( |
| 44 | + (2*inp.extract(['x']), |
| 45 | + torch.zeros_like(inp.extract(['y'])), |
| 46 | + torch.zeros_like(inp.extract(['z'])), |
| 47 | + torch.zeros_like(inp.extract(['x'])), |
| 48 | + 2*inp.extract(['y']), |
| 49 | + torch.zeros_like(inp.extract(['z'])), |
| 50 | + torch.zeros_like(inp.extract(['x'])), |
| 51 | + torch.zeros_like(inp.extract(['y'])), |
| 52 | + 2*inp.extract(['z']) |
| 53 | + ), dim=1 |
| 54 | + ) |
42 | 55 | assert grad_tensor_v.shape == (20, 9) |
43 | | - grad_tensor_v = grad(tensor_v, inp, d=['x', 'mu']) |
| 56 | + assert grad_tensor_v.labels == [ |
| 57 | + f'd{j}d{i}' for j in tensor_v.labels for i in inp.labels |
| 58 | + ] |
| 59 | + assert torch.allclose(grad_tensor_v, true_val) |
| 60 | + |
| 61 | + grad_tensor_v = grad(tensor_v, inp, d=['x', 'y']) |
| 62 | + true_val = torch.cat( |
| 63 | + (2*inp.extract(['x']), |
| 64 | + torch.zeros_like(inp.extract(['y'])), |
| 65 | + torch.zeros_like(inp.extract(['x'])), |
| 66 | + 2*inp.extract(['y']), |
| 67 | + torch.zeros_like(inp.extract(['x'])), |
| 68 | + torch.zeros_like(inp.extract(['y'])) |
| 69 | + ), dim=1 |
| 70 | + ) |
44 | 71 | assert grad_tensor_v.shape == (inp.shape[0], 6) |
| 72 | + assert grad_tensor_v.labels == [ |
| 73 | + f'd{j}d{i}' for j in tensor_v.labels for i in ['x', 'y'] |
| 74 | + ] |
| 75 | + assert torch.allclose(grad_tensor_v, true_val) |
45 | 76 |
|
46 | 77 |
|
47 | 78 | def test_div_vector_output(): |
48 | | - grad_tensor_v = div(tensor_v, inp) |
49 | | - assert grad_tensor_v.shape == (20, 1) |
50 | | - grad_tensor_v = div(tensor_v, inp, components=['a', 'b'], d=['x', 'mu']) |
51 | | - assert grad_tensor_v.shape == (inp.shape[0], 1) |
| 79 | + div_tensor_v = div(tensor_v, inp) |
| 80 | + true_val = 2*torch.sum(inp, dim=1).reshape(-1,1) |
| 81 | + assert div_tensor_v.shape == (20, 1) |
| 82 | + assert div_tensor_v.labels == [f'dadx+dbdy+dcdz'] |
| 83 | + assert torch.allclose(div_tensor_v, true_val) |
| 84 | + |
| 85 | + div_tensor_v = div(tensor_v, inp, components=['a', 'b'], d=['x', 'y']) |
| 86 | + true_val = 2*torch.sum(inp.extract(['x', 'y']), dim=1).reshape(-1,1) |
| 87 | + assert div_tensor_v.shape == (inp.shape[0], 1) |
| 88 | + assert div_tensor_v.labels == [f'dadx+dbdy'] |
| 89 | + assert torch.allclose(div_tensor_v, true_val) |
52 | 90 |
|
53 | 91 |
|
54 | 92 | def test_laplacian_scalar_output(): |
55 | | - laplace_tensor_s = laplacian(tensor_s, inp, components=['a'], d=['x', 'y']) |
| 93 | + laplace_tensor_s = laplacian(tensor_s, inp) |
| 94 | + true_val = 6*torch.ones_like(laplace_tensor_s) |
56 | 95 | assert laplace_tensor_s.shape == tensor_s.shape |
57 | 96 | assert laplace_tensor_s.labels == [f"dd{tensor_s.labels[0]}"] |
| 97 | + assert torch.allclose(laplace_tensor_s, true_val) |
| 98 | + |
| 99 | + laplace_tensor_s = laplacian(tensor_s, inp, components=['a'], d=['x', 'y']) |
58 | 100 | true_val = 4*torch.ones_like(laplace_tensor_s) |
59 | | - assert all((laplace_tensor_s - true_val == 0).flatten()) |
| 101 | + assert laplace_tensor_s.shape == tensor_s.shape |
| 102 | + assert laplace_tensor_s.labels == [f"dd{tensor_s.labels[0]}"] |
| 103 | + assert torch.allclose(laplace_tensor_s, true_val) |
60 | 104 |
|
61 | 105 |
|
62 | 106 | def test_laplacian_vector_output(): |
63 | 107 | laplace_tensor_v = laplacian(tensor_v, inp) |
| 108 | + true_val = 2*torch.ones_like(tensor_v) |
64 | 109 | assert laplace_tensor_v.shape == tensor_v.shape |
65 | 110 | assert laplace_tensor_v.labels == [ |
66 | 111 | f'dd{i}' for i in tensor_v.labels |
67 | 112 | ] |
| 113 | + assert torch.allclose(laplace_tensor_v, true_val) |
| 114 | + |
68 | 115 | laplace_tensor_v = laplacian(tensor_v, |
69 | 116 | inp, |
70 | 117 | components=['a', 'b'], |
71 | 118 | d=['x', 'y']) |
| 119 | + true_val = 2*torch.ones_like(tensor_v.extract(['a', 'b'])) |
72 | 120 | assert laplace_tensor_v.shape == tensor_v.extract(['a', 'b']).shape |
73 | 121 | assert laplace_tensor_v.labels == [ |
74 | 122 | f'dd{i}' for i in ['a', 'b'] |
75 | 123 | ] |
76 | | - true_val = 2*torch.ones_like(tensor_v.extract(['a', 'b'])) |
77 | | - assert all((laplace_tensor_v - true_val == 0).flatten()) |
| 124 | + assert torch.allclose(laplace_tensor_v, true_val) |
0 commit comments