import torch import pytest from pina.model.block import LowRankBlock from pina import LabelTensor input_dimensions = 2 embedding_dimenion = 1 rank = 4 inner_size = 20 n_layers = 2 func = torch.nn.Tanh bias = True def test_constructor(): LowRankBlock( input_dimensions=input_dimensions, embedding_dimenion=embedding_dimenion, rank=rank, inner_size=inner_size, n_layers=n_layers, func=func, bias=bias, ) def test_constructor_wrong(): with pytest.raises(ValueError): LowRankBlock( input_dimensions=input_dimensions, embedding_dimenion=embedding_dimenion, rank=0.5, inner_size=inner_size, n_layers=n_layers, func=func, bias=bias, ) def test_forward(): block = LowRankBlock( input_dimensions=input_dimensions, embedding_dimenion=embedding_dimenion, rank=rank, inner_size=inner_size, n_layers=n_layers, func=func, bias=bias, ) data = LabelTensor(torch.rand(10, 30, 3), labels=["x", "y", "u"]) block(data.extract("u"), data.extract(["x", "y"])) def test_backward(): block = LowRankBlock( input_dimensions=input_dimensions, embedding_dimenion=embedding_dimenion, rank=rank, inner_size=inner_size, n_layers=n_layers, func=func, bias=bias, ) data = LabelTensor(torch.rand(10, 30, 3), labels=["x", "y", "u"]) data.requires_grad_(True) out = block(data.extract("u"), data.extract(["x", "y"])) loss = out.mean() loss.backward()