fnn update, pinn torch models, tests update. (#88)

* fnn update, remove labeltensors
* allow custom torch models
* updating tests

---------

Co-authored-by: Dario Coscia <dariocoscia@Dario-Coscia.local>
Co-authored-by: Dario Coscia <dariocoscia@dhcp-031.eduroam.sissa.it>
This commit is contained in:
Dario Coscia
2023-05-02 15:19:48 +02:00
committed by Nicola Demo
parent c8fb7715c4
commit be11110bb2
11 changed files with 149 additions and 177 deletions

View File

@@ -1,7 +1,7 @@
import torch
import pytest
from pina import LabelTensor, Condition, Span, PINN
from pina import LabelTensor, Condition, CartesianDomain, PINN
from pina.problem import SpatialProblem
from pina.model import FeedForward
from pina.operators import nabla
@@ -11,7 +11,7 @@ out_ = LabelTensor(torch.tensor([[0.]]), ['u'])
class Poisson(SpatialProblem):
output_variables = ['u']
spatial_domain = Span({'x': [0, 1], 'y': [0, 1]})
spatial_domain = CartesianDomain({'x': [0, 1], 'y': [0, 1]})
def laplace_equation(input_, output_):
force_term = (torch.sin(input_.extract(['x'])*torch.pi) *
@@ -25,19 +25,19 @@ class Poisson(SpatialProblem):
conditions = {
'gamma1': Condition(
location=Span({'x': [0, 1], 'y': 1}),
location=CartesianDomain({'x': [0, 1], 'y': 1}),
function=nil_dirichlet),
'gamma2': Condition(
location=Span({'x': [0, 1], 'y': 0}),
location=CartesianDomain({'x': [0, 1], 'y': 0}),
function=nil_dirichlet),
'gamma3': Condition(
location=Span({'x': 1, 'y': [0, 1]}),
location=CartesianDomain({'x': 1, 'y': [0, 1]}),
function=nil_dirichlet),
'gamma4': Condition(
location=Span({'x': 0, 'y': [0, 1]}),
location=CartesianDomain({'x': 0, 'y': [0, 1]}),
function=nil_dirichlet),
'D': Condition(
location=Span({'x': [0, 1], 'y': [0, 1]}),
location=CartesianDomain({'x': [0, 1], 'y': [0, 1]}),
function=laplace_equation),
'data': Condition(
input_points=in_,
@@ -53,15 +53,33 @@ class Poisson(SpatialProblem):
truth_solution = poisson_sol
problem = Poisson()
class myFeature(torch.nn.Module):
"""
Feature: sin(x)
"""
model = FeedForward(problem.input_variables, problem.output_variables)
def __init__(self):
super(myFeature, self).__init__()
def forward(self, x):
t = (torch.sin(x.extract(['x'])*torch.pi) *
torch.sin(x.extract(['y'])*torch.pi))
return LabelTensor(t, ['sin(x)sin(y)'])
problem = Poisson()
model = FeedForward(len(problem.input_variables),len(problem.output_variables))
model_extra_feat = FeedForward(len(problem.input_variables) + 1,len(problem.output_variables))
def test_constructor():
PINN(problem, model)
def test_constructor_extra_feats():
PINN(problem, model_extra_feat, [myFeature()])
def test_span_pts():
pinn = PINN(problem, model)
n = 10
@@ -133,6 +151,28 @@ def test_train_2():
assert list(pinn.history_loss.keys()) == truth_key
def test_train_extra_feats():
pinn = PINN(problem, model_extra_feat, [myFeature()])
boundaries = ['gamma1', 'gamma2', 'gamma3', 'gamma4']
n = 10
pinn.span_pts(n, 'grid', locations=boundaries)
pinn.span_pts(n, 'grid', locations=['D'])
pinn.train(5)
def test_train_2_extra_feats():
boundaries = ['gamma1', 'gamma2', 'gamma3', 'gamma4']
n = 10
expected_keys = [[], list(range(0, 50, 3))]
param = [0, 3]
for i, truth_key in zip(param, expected_keys):
pinn = PINN(problem, model_extra_feat, [myFeature()])
pinn.span_pts(n, 'grid', locations=boundaries)
pinn.span_pts(n, 'grid', locations=['D'])
pinn.train(50, save_loss=i)
assert list(pinn.history_loss.keys()) == truth_key
def test_train_with_optimizer_kwargs():
boundaries = ['gamma1', 'gamma2', 'gamma3', 'gamma4']
n = 10