import torch from pina.model import AveragingNeuralOperator from pina import LabelTensor import pytest batch_size = 15 n_layers = 4 embedding_dim = 24 func = torch.nn.Tanh coordinates_indices = ['p'] field_indices = ['v'] def test_constructor(): # 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) # 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(): 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, 100, len(coordinates_indices) + len(field_indices)), ['p', 'v']) out = avno(input_) assert out.shape == torch.Size( [batch_size, input_.shape[1], len(field_indices)]) def test_backward(): 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, 100, len(coordinates_indices) + len(field_indices)), ['p', 'v']) input_ = input_.requires_grad_() out = avno(input_) tmp = torch.linalg.norm(out) tmp.backward() grad = input_.grad assert grad.shape == torch.Size( [batch_size, input_.shape[1], len(coordinates_indices) + len(field_indices)])