This commit is contained in:
Dario Coscia
2024-03-14 19:16:48 +01:00
committed by Nicola Demo
parent ada9643c11
commit 98f7694d6f
11 changed files with 1171 additions and 78 deletions

View File

@@ -1,62 +1,146 @@
import torch
from pina.model import AveragingNeuralOperator
from pina import LabelTensor
import pytest
output_numb_fields = 5
batch_size = 15
n_layers = 4
embedding_dim = 24
func = torch.nn.Tanh
coordinates_indices = ['p']
field_indices = ['v']
def test_constructor():
input_numb_fields = 1
output_numb_fields = 1
#minimuum constructor
AveragingNeuralOperator(input_numb_fields,
output_numb_fields,
coordinates_indices=['p'],
field_indices=['v'])
# working constructor
lifting_net = torch.nn.Linear(len(coordinates_indices) + len(field_indices),
embedding_dim)
projecting_net = torch.nn.Linear(embedding_dim + len(field_indices),
len(field_indices))
AveragingNeuralOperator(
lifting_net=lifting_net,
projecting_net=projecting_net,
coordinates_indices=coordinates_indices,
field_indices=field_indices,
n_layers=n_layers,
func=func)
#all constructor
AveragingNeuralOperator(input_numb_fields,
output_numb_fields,
inner_size=5,
n_layers=5,
func=torch.nn.ReLU,
coordinates_indices=['p'],
field_indices=['v'])
# not working constructor
with pytest.raises(ValueError):
AveragingNeuralOperator(
lifting_net=lifting_net,
projecting_net=projecting_net,
coordinates_indices=coordinates_indices,
field_indices=field_indices,
n_layers=3.2, # wrong
func=func)
AveragingNeuralOperator(
lifting_net=lifting_net,
projecting_net=projecting_net,
coordinates_indices=coordinates_indices,
field_indices=field_indices,
n_layers=n_layers,
func=1) # wrong
AveragingNeuralOperator(
lifting_net=[0], # wrong
projecting_net=projecting_net,
coordinates_indices=coordinates_indices,
field_indices=field_indices,
n_layers=n_layers,
func=func)
AveragingNeuralOperator(
lifting_net=lifting_net,
projecting_net=[0], # wront
coordinates_indices=coordinates_indices,
field_indices=field_indices,
n_layers=n_layers,
func=func)
AveragingNeuralOperator(
lifting_net=lifting_net,
projecting_net=projecting_net,
coordinates_indices=[0], #wrong
field_indices=field_indices,
n_layers=n_layers,
func=func)
AveragingNeuralOperator(
lifting_net=lifting_net,
projecting_net=projecting_net,
coordinates_indices=coordinates_indices,
field_indices=[0], #wrong
n_layers=n_layers,
func=func)
lifting_net = torch.nn.Linear(len(coordinates_indices),
embedding_dim)
AveragingNeuralOperator(
lifting_net=lifting_net,
projecting_net=projecting_net,
coordinates_indices=coordinates_indices,
field_indices=field_indices,
n_layers=n_layers,
func=func)
lifting_net = torch.nn.Linear(len(coordinates_indices) + len(field_indices),
embedding_dim)
projecting_net = torch.nn.Linear(embedding_dim,
len(field_indices))
AveragingNeuralOperator(
lifting_net=lifting_net,
projecting_net=projecting_net,
coordinates_indices=coordinates_indices,
field_indices=field_indices,
n_layers=n_layers,
func=func)
def test_forward():
input_numb_fields = 1
output_numb_fields = 1
dimension = 1
lifting_net = torch.nn.Linear(len(coordinates_indices) + len(field_indices),
embedding_dim)
projecting_net = torch.nn.Linear(embedding_dim + len(field_indices),
len(field_indices))
avno=AveragingNeuralOperator(
lifting_net=lifting_net,
projecting_net=projecting_net,
coordinates_indices=coordinates_indices,
field_indices=field_indices,
n_layers=n_layers,
func=func)
input_ = LabelTensor(
torch.rand(batch_size, 1000, input_numb_fields + dimension), ['p', 'v'])
ano = AveragingNeuralOperator(input_numb_fields,
output_numb_fields,
dimension=dimension,
coordinates_indices=['p'],
field_indices=['v'])
out = ano(input_)
torch.rand(batch_size, 100,
len(coordinates_indices) + len(field_indices)), ['p', 'v'])
out = avno(input_)
assert out.shape == torch.Size(
[batch_size, input_.shape[1], output_numb_fields])
[batch_size, input_.shape[1], len(field_indices)])
def test_backward():
input_numb_fields = 1
dimension = 1
output_numb_fields = 1
lifting_net = torch.nn.Linear(len(coordinates_indices) + len(field_indices),
embedding_dim)
projecting_net = torch.nn.Linear(embedding_dim + len(field_indices),
len(field_indices))
avno=AveragingNeuralOperator(
lifting_net=lifting_net,
projecting_net=projecting_net,
coordinates_indices=coordinates_indices,
field_indices=field_indices,
n_layers=n_layers,
func=func)
input_ = LabelTensor(
torch.rand(batch_size, 1000, dimension + input_numb_fields),
['p', 'v'])
torch.rand(batch_size, 100,
len(coordinates_indices) + len(field_indices)), ['p', 'v'])
input_ = input_.requires_grad_()
avno = AveragingNeuralOperator(input_numb_fields,
output_numb_fields,
dimension=dimension,
coordinates_indices=['p'],
field_indices=['v'])
out = avno(input_)
tmp = torch.linalg.norm(out)
tmp.backward()
grad = input_.grad
assert grad.shape == torch.Size(
[batch_size, input_.shape[1], dimension + input_numb_fields])
[batch_size, input_.shape[1],
len(coordinates_indices) + len(field_indices)])