From 9d9c2aa23e669dcc60d422da59f6a6da38257893 Mon Sep 17 00:00:00 2001 From: Nicola Demo Date: Thu, 8 Aug 2024 16:19:52 +0200 Subject: [PATCH] supervised working --- examples/problems/burgers.py | 2 +- examples/problems/first_order_ode.py | 2 +- .../parametric_elliptic_optimal_control.py | 2 +- examples/problems/parametric_poisson.py | 2 +- examples/problems/poisson.py | 2 +- examples/problems/stokes.py | 2 +- examples/problems/wave.py | 2 +- pina/__init__.py | 7 +- pina/condition/__init__.py | 8 +- pina/condition/condition.py | 22 +-- pina/condition/condition_interface.py | 3 + ...ondition.py => domain_output_condition.py} | 18 ++- pina/condition/input_equation_condition.py | 2 +- pina/data/__init__.py | 7 + pina/data/data_dataset.py | 41 +++++ pina/data/pina_batch.py | 36 +++++ pina/data/{dataset.py => pina_dataloader.py} | 140 ++++++------------ pina/data/sample_dataset.py | 43 ++++++ pina/{geometry => domain}/__init__.py | 4 +- pina/{geometry => domain}/cartesian.py | 4 +- .../{geometry => domain}/difference_domain.py | 0 .../domain_interface.py} | 4 +- pina/{geometry => domain}/ellipsoid.py | 4 +- pina/{geometry => domain}/exclusion_domain.py | 0 .../intersection_domain.py | 0 .../operation_interface.py | 6 +- pina/{geometry => domain}/simplex.py | 6 +- pina/{geometry => domain}/union_domain.py | 0 pina/label_tensor.py | 26 +++- pina/problem/abstract_problem.py | 88 ++++------- pina/solvers/solver.py | 2 + pina/solvers/supervised.py | 37 ++++- pina/trainer.py | 42 +++--- .../test_adaptive_refinment_callbacks.py | 2 +- .../test_optimizer_callbacks.py | 2 +- tests/test_condition.py | 2 +- tests/test_dataset.py | 2 +- tests/test_geometry/test_cartesian.py | 2 +- tests/test_geometry/test_difference.py | 2 +- tests/test_geometry/test_ellipsoid.py | 2 +- tests/test_geometry/test_exclusion.py | 2 +- tests/test_geometry/test_intersection.py | 2 +- tests/test_geometry/test_simplex.py | 2 +- tests/test_geometry/test_union.py | 2 +- tests/test_plotter.py | 2 +- tests/test_problem.py | 2 +- tests/test_solvers/test_causalpinn.py | 2 +- tests/test_solvers/test_competitive_pinn.py | 2 +- tests/test_solvers/test_gpinn.py | 2 +- tests/test_solvers/test_pinn.py | 2 +- tests/test_solvers/test_sapinn.py | 2 +- tests/test_solvers/test_supervised_solver.py | 15 +- tests/test_utils.py | 4 +- tutorials/tutorial1/tutorial.py | 4 +- tutorials/tutorial11/tutorial.py | 2 +- tutorials/tutorial12/tutorial.py | 2 +- tutorials/tutorial2/tutorial.py | 2 +- tutorials/tutorial3/tutorial.py | 2 +- tutorials/tutorial7/tutorial.py | 2 +- tutorials/tutorial8/tutorial.py | 2 +- tutorials/tutorial9/tutorial.py | 2 +- 61 files changed, 375 insertions(+), 262 deletions(-) rename pina/condition/{input_output_condition.py => domain_output_condition.py} (65%) create mode 100644 pina/data/data_dataset.py create mode 100644 pina/data/pina_batch.py rename pina/data/{dataset.py => pina_dataloader.py} (67%) create mode 100644 pina/data/sample_dataset.py rename pina/{geometry => domain}/__init__.py (87%) rename pina/{geometry => domain}/cartesian.py (99%) rename pina/{geometry => domain}/difference_domain.py (100%) rename pina/{geometry/location.py => domain/domain_interface.py} (90%) rename pina/{geometry => domain}/ellipsoid.py (99%) rename pina/{geometry => domain}/exclusion_domain.py (100%) rename pina/{geometry => domain}/intersection_domain.py (100%) rename pina/{geometry => domain}/operation_interface.py (92%) rename pina/{geometry => domain}/simplex.py (98%) rename pina/{geometry => domain}/union_domain.py (100%) diff --git a/examples/problems/burgers.py b/examples/problems/burgers.py index 5da9ccb..33c1b5d 100644 --- a/examples/problems/burgers.py +++ b/examples/problems/burgers.py @@ -15,7 +15,7 @@ import torch -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina import Condition from pina.problem import TimeDependentProblem, SpatialProblem from pina.operators import grad diff --git a/examples/problems/first_order_ode.py b/examples/problems/first_order_ode.py index 802b85b..be1d88c 100644 --- a/examples/problems/first_order_ode.py +++ b/examples/problems/first_order_ode.py @@ -17,7 +17,7 @@ from pina.problem import SpatialProblem from pina import Condition -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina.operators import grad from pina.equation import Equation, FixedValue import torch diff --git a/examples/problems/parametric_elliptic_optimal_control.py b/examples/problems/parametric_elliptic_optimal_control.py index 9d88b49..9ecd851 100644 --- a/examples/problems/parametric_elliptic_optimal_control.py +++ b/examples/problems/parametric_elliptic_optimal_control.py @@ -2,7 +2,7 @@ from pina import Condition -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina.equation import SystemEquation, FixedValue from pina.problem import SpatialProblem, ParametricProblem from pina.operators import laplacian diff --git a/examples/problems/parametric_poisson.py b/examples/problems/parametric_poisson.py index 58867d5..64dfdaa 100644 --- a/examples/problems/parametric_poisson.py +++ b/examples/problems/parametric_poisson.py @@ -14,7 +14,7 @@ # ===================================================== # -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina.problem import SpatialProblem, ParametricProblem from pina.operators import laplacian from pina.equation import FixedValue, Equation diff --git a/examples/problems/poisson.py b/examples/problems/poisson.py index c817787..e4a6cf9 100644 --- a/examples/problems/poisson.py +++ b/examples/problems/poisson.py @@ -13,7 +13,7 @@ import torch -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina import Condition from pina.problem import SpatialProblem from pina.operators import laplacian diff --git a/examples/problems/stokes.py b/examples/problems/stokes.py index f136d64..c7b1387 100644 --- a/examples/problems/stokes.py +++ b/examples/problems/stokes.py @@ -4,7 +4,7 @@ import torch from pina.problem import SpatialProblem from pina.operators import laplacian, grad, div from pina import Condition, LabelTensor -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina.equation import SystemEquation, Equation # ===================================================== # diff --git a/examples/problems/wave.py b/examples/problems/wave.py index cce94da..124a62d 100644 --- a/examples/problems/wave.py +++ b/examples/problems/wave.py @@ -2,7 +2,7 @@ import torch -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina import Condition from pina.problem import SpatialProblem, TimeDependentProblem from pina.operators import laplacian, grad diff --git a/pina/__init__.py b/pina/__init__.py index e45a4af..835232b 100644 --- a/pina/__init__.py +++ b/pina/__init__.py @@ -15,11 +15,8 @@ from .label_tensor import LabelTensor from .solvers.solver import SolverInterface from .trainer import Trainer from .plotter import Plotter -from .condition import Condition -from .dataset import SamplePointDataset -from .dataset import SamplePointLoader from .optimizer import TorchOptimizer from .scheduler import TorchScheduler from .condition.condition import Condition -from .data.dataset import SamplePointDataset -from .data.dataset import SamplePointLoader +from .data import SamplePointDataset +from .data import SamplePointLoader diff --git a/pina/condition/__init__.py b/pina/condition/__init__.py index 56d1ee4..ff329c1 100644 --- a/pina/condition/__init__.py +++ b/pina/condition/__init__.py @@ -1,10 +1,10 @@ __all__ = [ 'Condition', 'ConditionInterface', - 'InputOutputCondition', - 'InputEquationCondition' - 'LocationEquationCondition', + 'DomainOutputCondition', + 'DomainEquationCondition' ] from .condition_interface import ConditionInterface -from .input_output_condition import InputOutputCondition \ No newline at end of file +from .domain_output_condition import DomainOutputCondition +from .domain_equation_condition import DomainEquationCondition \ No newline at end of file diff --git a/pina/condition/condition.py b/pina/condition/condition.py index da3c6f6..eec523c 100644 --- a/pina/condition/condition.py +++ b/pina/condition/condition.py @@ -1,9 +1,11 @@ """ Condition module. """ from ..label_tensor import LabelTensor -from ..geometry import Location +from ..domain import DomainInterface from ..equation.equation import Equation +from . import DomainOutputCondition, DomainEquationCondition + def dummy(a): """Dummy function for testing purposes.""" @@ -51,14 +53,6 @@ class Condition: """ - __slots__ = [ - "input_points", - "output_points", - "location", - "equation", - "data_weight", - ] - # def _dictvalue_isinstance(self, dict_, key_, class_): # """Check if the value of a dictionary corresponding to `key` is an instance of `class_`.""" # if key_ not in dict_.keys(): @@ -77,11 +71,17 @@ class Condition: # f"Condition takes only the following keyword arguments: {Condition.__slots__}." # ) - from . import InputOutputCondition def __new__(cls, *args, **kwargs): if sorted(kwargs.keys()) == sorted(["input_points", "output_points"]): - return InputOutputCondition(**kwargs) + return DomainOutputCondition( + domain=kwargs["input_points"], + output_points=kwargs["output_points"] + ) + elif sorted(kwargs.keys()) == sorted(["domain", "output_points"]): + return DomainOutputCondition(**kwargs) + elif sorted(kwargs.keys()) == sorted(["domain", "equation"]): + return DomainEquationCondition(**kwargs) else: raise ValueError(f"Invalid keyword arguments {kwargs.keys()}.") diff --git a/pina/condition/condition_interface.py b/pina/condition/condition_interface.py index bb43293..f6b51bf 100644 --- a/pina/condition/condition_interface.py +++ b/pina/condition/condition_interface.py @@ -4,6 +4,9 @@ from abc import ABCMeta, abstractmethod class ConditionInterface(metaclass=ABCMeta): + def __init__(self) -> None: + self._problem = None + @abstractmethod def residual(self, model): """ diff --git a/pina/condition/input_output_condition.py b/pina/condition/domain_output_condition.py similarity index 65% rename from pina/condition/input_output_condition.py rename to pina/condition/domain_output_condition.py index d8040d6..49a0cb6 100644 --- a/pina/condition/input_output_condition.py +++ b/pina/condition/domain_output_condition.py @@ -1,26 +1,34 @@ from . import ConditionInterface -class InputOutputCondition(ConditionInterface): +class DomainOutputCondition(ConditionInterface): """ Condition for input/output data. """ - __slots__ = ["input_points", "output_points"] + __slots__ = ["domain", "output_points"] - def __init__(self, input_points, output_points): + def __init__(self, domain, output_points): """ Constructor for the `InputOutputCondition` class. """ super().__init__() - self.input_points = input_points + print(self) + self.domain = domain self.output_points = output_points + @property + def input_points(self): + """ + Get the input points of the condition. + """ + return self._problem.domains[self.domain] + def residual(self, model): """ Compute the residual of the condition. """ - return self.batch_residual(model, self.input_points, self.output_points) + return self.batch_residual(model, self.domain, self.output_points) @staticmethod def batch_residual(model, input_points, output_points): diff --git a/pina/condition/input_equation_condition.py b/pina/condition/input_equation_condition.py index 1c57ed7..288022c 100644 --- a/pina/condition/input_equation_condition.py +++ b/pina/condition/input_equation_condition.py @@ -1,7 +1,7 @@ from . import ConditionInterface -class InputOutputCondition(ConditionInterface): +class InputEquationCondition(ConditionInterface): """ Condition for input/output data. """ diff --git a/pina/data/__init__.py b/pina/data/__init__.py index e69de29..fba19b9 100644 --- a/pina/data/__init__.py +++ b/pina/data/__init__.py @@ -0,0 +1,7 @@ +__all__ = [ +] + +from .pina_dataloader import SamplePointLoader +from .data_dataset import DataPointDataset +from .sample_dataset import SamplePointDataset +from .pina_batch import Batch \ No newline at end of file diff --git a/pina/data/data_dataset.py b/pina/data/data_dataset.py new file mode 100644 index 0000000..9dff2d7 --- /dev/null +++ b/pina/data/data_dataset.py @@ -0,0 +1,41 @@ +from torch.utils.data import Dataset +import torch +from ..label_tensor import LabelTensor + + +class DataPointDataset(Dataset): + + def __init__(self, problem, device) -> None: + super().__init__() + input_list = [] + output_list = [] + self.condition_names = [] + + for name, condition in problem.conditions.items(): + if hasattr(condition, "output_points"): + input_list.append(problem.conditions[name].input_points) + output_list.append(problem.conditions[name].output_points) + self.condition_names.append(name) + + self.input_pts = LabelTensor.stack(input_list) + self.output_pts = LabelTensor.stack(output_list) + + if self.input_pts != []: + self.condition_indeces = torch.cat( + [ + torch.tensor([i] * len(input_list[i])) + for i in range(len(self.condition_names)) + ], + dim=0, + ) + else: # if there are no data points + self.condition_indeces = torch.tensor([]) + self.input_pts = torch.tensor([]) + self.output_pts = torch.tensor([]) + + self.input_pts = self.input_pts.to(device) + self.output_pts = self.output_pts.to(device) + self.condition_indeces = self.condition_indeces.to(device) + + def __len__(self): + return self.input_pts.shape[0] \ No newline at end of file diff --git a/pina/data/pina_batch.py b/pina/data/pina_batch.py new file mode 100644 index 0000000..cb1296e --- /dev/null +++ b/pina/data/pina_batch.py @@ -0,0 +1,36 @@ + + +class Batch: + """ + This class is used to create a dataset of sample points. + """ + + def __init__(self, type_, idx, *args, **kwargs) -> None: + """ + """ + if type_ == "sample": + + if len(args) != 2: + raise RuntimeError + + input = args[0] + conditions = args[1] + + self.input = input[idx] + self.condition = conditions[idx] + + elif type_ == "data": + + if len(args) != 3: + raise RuntimeError + + input = args[0] + output = args[1] + conditions = args[2] + + self.input = input[idx] + self.output = output[idx] + self.condition = conditions[idx] + + else: + raise ValueError("Invalid number of arguments.") \ No newline at end of file diff --git a/pina/data/dataset.py b/pina/data/pina_dataloader.py similarity index 67% rename from pina/data/dataset.py rename to pina/data/pina_dataloader.py index bf874e1..1b71a46 100644 --- a/pina/data/dataset.py +++ b/pina/data/pina_dataloader.py @@ -1,84 +1,8 @@ -from torch.utils.data import Dataset import torch -from ..label_tensor import LabelTensor - - -class SamplePointDataset(Dataset): - """ - This class is used to create a dataset of sample points. - """ - - def __init__(self, problem, device) -> None: - """ - :param dict input_pts: The input points. - """ - super().__init__() - pts_list = [] - self.condition_names = [] - - for name, condition in problem.conditions.items(): - if not hasattr(condition, "output_points"): - pts_list.append(problem.input_pts[name]) - self.condition_names.append(name) - - self.pts = LabelTensor.vstack(pts_list) - - if self.pts != []: - self.condition_indeces = torch.cat( - [ - torch.tensor([i] * len(pts_list[i])) - for i in range(len(self.condition_names)) - ], - dim=0, - ) - else: # if there are no sample points - self.condition_indeces = torch.tensor([]) - self.pts = torch.tensor([]) - - self.pts = self.pts.to(device) - self.condition_indeces = self.condition_indeces.to(device) - - def __len__(self): - return self.pts.shape[0] - - -class DataPointDataset(Dataset): - - def __init__(self, problem, device) -> None: - super().__init__() - input_list = [] - output_list = [] - self.condition_names = [] - - for name, condition in problem.conditions.items(): - if hasattr(condition, "output_points"): - input_list.append(problem.conditions[name].input_points) - output_list.append(problem.conditions[name].output_points) - self.condition_names.append(name) - - self.input_pts = LabelTensor.vstack(input_list) - self.output_pts = LabelTensor.vstack(output_list) - - if self.input_pts != []: - self.condition_indeces = torch.cat( - [ - torch.tensor([i] * len(input_list[i])) - for i in range(len(self.condition_names)) - ], - dim=0, - ) - else: # if there are no data points - self.condition_indeces = torch.tensor([]) - self.input_pts = torch.tensor([]) - self.output_pts = torch.tensor([]) - - self.input_pts = self.input_pts.to(device) - self.output_pts = self.output_pts.to(device) - self.condition_indeces = self.condition_indeces.to(device) - - def __len__(self): - return self.input_pts.shape[0] +from .sample_dataset import SamplePointDataset +from .data_dataset import DataPointDataset +from .pina_batch import Batch class SamplePointLoader: """ @@ -133,6 +57,8 @@ class SamplePointLoader: else: self.random_idx = torch.arange(len(self.batch_list)) + self._prepare_batches() + def _prepare_data_dataset(self, dataset, batch_size, shuffle): """ Prepare the dataset for data points. @@ -169,7 +95,7 @@ class SamplePointLoader: self.batch_output_pts = torch.tensor_split( dataset.output_pts, batch_num ) - + print(input_labels) for i in range(len(self.batch_input_pts)): self.batch_input_pts[i].labels = input_labels self.batch_output_pts[i].labels = output_labels @@ -216,6 +142,29 @@ class SamplePointLoader: self.tensor_conditions, batch_num ) + def _prepare_batches(self): + """ + Prepare the batches. + """ + self.batches = [] + for i in range(len(self.batch_list)): + type_, idx_ = self.batch_list[i] + + if type_ == "sample": + batch = Batch( + "sample", idx_, + self.batch_sample_pts, + self.batch_sample_conditions) + else: + batch = Batch( + "data", idx_, + self.batch_input_pts, + self.batch_output_pts, + self.batch_data_conditions) + print(batch.input.labels) + + self.batches.append(batch) + def __iter__(self): """ Return an iterator over the points. Any element of the iterator is a @@ -233,21 +182,24 @@ class SamplePointLoader: :rtype: iter """ # for i in self.random_idx: - for i in range(len(self.batch_list)): - type_, idx_ = self.batch_list[i] + for i in self.random_idx: + yield self.batches[i] - if type_ == "sample": - d = { - "pts": self.batch_sample_pts[idx_].requires_grad_(True), - "condition": self.batch_sample_conditions[idx_], - } - else: - d = { - "pts": self.batch_input_pts[idx_].requires_grad_(True), - "output": self.batch_output_pts[idx_], - "condition": self.batch_data_conditions[idx_], - } - yield d + # for i in range(len(self.batch_list)): + # type_, idx_ = self.batch_list[i] + + # if type_ == "sample": + # d = { + # "pts": self.batch_sample_pts[idx_].requires_grad_(True), + # "condition": self.batch_sample_conditions[idx_], + # } + # else: + # d = { + # "pts": self.batch_input_pts[idx_].requires_grad_(True), + # "output": self.batch_output_pts[idx_], + # "condition": self.batch_data_conditions[idx_], + # } + # yield d def __len__(self): """ diff --git a/pina/data/sample_dataset.py b/pina/data/sample_dataset.py new file mode 100644 index 0000000..84af292 --- /dev/null +++ b/pina/data/sample_dataset.py @@ -0,0 +1,43 @@ +from torch.utils.data import Dataset +import torch + +from ..label_tensor import LabelTensor + + +class SamplePointDataset(Dataset): + """ + This class is used to create a dataset of sample points. + """ + + def __init__(self, problem, device) -> None: + """ + :param dict input_pts: The input points. + """ + super().__init__() + pts_list = [] + self.condition_names = [] + + for name, condition in problem.conditions.items(): + if not hasattr(condition, "output_points"): + pts_list.append(problem.input_pts[name]) + self.condition_names.append(name) + + self.pts = LabelTensor.stack(pts_list) + + if self.pts != []: + self.condition_indeces = torch.cat( + [ + torch.tensor([i] * len(pts_list[i])) + for i in range(len(self.condition_names)) + ], + dim=0, + ) + else: # if there are no sample points + self.condition_indeces = torch.tensor([]) + self.pts = torch.tensor([]) + + self.pts = self.pts.to(device) + self.condition_indeces = self.condition_indeces.to(device) + + def __len__(self): + return self.pts.shape[0] \ No newline at end of file diff --git a/pina/geometry/__init__.py b/pina/domain/__init__.py similarity index 87% rename from pina/geometry/__init__.py rename to pina/domain/__init__.py index 963136a..e5a327b 100644 --- a/pina/geometry/__init__.py +++ b/pina/domain/__init__.py @@ -1,5 +1,5 @@ __all__ = [ - "Location", + "DomainInterface", "CartesianDomain", "EllipsoidDomain", "Union", @@ -10,7 +10,7 @@ __all__ = [ "SimplexDomain", ] -from .location import Location +from .domain_interface import DomainInterface from .cartesian import CartesianDomain from .ellipsoid import EllipsoidDomain from .exclusion_domain import Exclusion diff --git a/pina/geometry/cartesian.py b/pina/domain/cartesian.py similarity index 99% rename from pina/geometry/cartesian.py rename to pina/domain/cartesian.py index 11354b6..9ab179b 100644 --- a/pina/geometry/cartesian.py +++ b/pina/domain/cartesian.py @@ -1,11 +1,11 @@ import torch -from .location import Location +from .domain_interface import DomainInterface from ..label_tensor import LabelTensor from ..utils import torch_lhs, chebyshev_roots -class CartesianDomain(Location): +class CartesianDomain(DomainInterface): """PINA implementation of Hypercube domain.""" def __init__(self, cartesian_dict): diff --git a/pina/geometry/difference_domain.py b/pina/domain/difference_domain.py similarity index 100% rename from pina/geometry/difference_domain.py rename to pina/domain/difference_domain.py diff --git a/pina/geometry/location.py b/pina/domain/domain_interface.py similarity index 90% rename from pina/geometry/location.py rename to pina/domain/domain_interface.py index a22dfe1..5906d28 100644 --- a/pina/geometry/location.py +++ b/pina/domain/domain_interface.py @@ -1,9 +1,9 @@ -"""Module for Location class.""" +"""Module for the DomainInterface class.""" from abc import ABCMeta, abstractmethod -class Location(metaclass=ABCMeta): +class DomainInterface(metaclass=ABCMeta): """ Abstract Location class. Any geometry entity should inherit from this class. diff --git a/pina/geometry/ellipsoid.py b/pina/domain/ellipsoid.py similarity index 99% rename from pina/geometry/ellipsoid.py rename to pina/domain/ellipsoid.py index 2baea53..eda42d0 100644 --- a/pina/geometry/ellipsoid.py +++ b/pina/domain/ellipsoid.py @@ -1,11 +1,11 @@ import torch -from .location import Location +from .domain_interface import DomainInterface from ..label_tensor import LabelTensor from ..utils import check_consistency -class EllipsoidDomain(Location): +class EllipsoidDomain(DomainInterface): """PINA implementation of Ellipsoid domain.""" def __init__(self, ellipsoid_dict, sample_surface=False): diff --git a/pina/geometry/exclusion_domain.py b/pina/domain/exclusion_domain.py similarity index 100% rename from pina/geometry/exclusion_domain.py rename to pina/domain/exclusion_domain.py diff --git a/pina/geometry/intersection_domain.py b/pina/domain/intersection_domain.py similarity index 100% rename from pina/geometry/intersection_domain.py rename to pina/domain/intersection_domain.py diff --git a/pina/geometry/operation_interface.py b/pina/domain/operation_interface.py similarity index 92% rename from pina/geometry/operation_interface.py rename to pina/domain/operation_interface.py index 4f7709b..acd4cf4 100644 --- a/pina/geometry/operation_interface.py +++ b/pina/domain/operation_interface.py @@ -1,11 +1,11 @@ """ Module for OperationInterface class. """ -from .location import Location +from .domain_interface import DomainInterface from ..utils import check_consistency from abc import ABCMeta, abstractmethod -class OperationInterface(Location, metaclass=ABCMeta): +class OperationInterface(DomainInterface, metaclass=ABCMeta): def __init__(self, geometries): """ @@ -15,7 +15,7 @@ class OperationInterface(Location, metaclass=ABCMeta): such as ``EllipsoidDomain`` or ``CartesianDomain``. """ # check consistency geometries - check_consistency(geometries, Location) + check_consistency(geometries, DomainInterface) # check we are passing always different # geometries with the same labels. diff --git a/pina/geometry/simplex.py b/pina/domain/simplex.py similarity index 98% rename from pina/geometry/simplex.py rename to pina/domain/simplex.py index 15cdc16..704a9cb 100644 --- a/pina/geometry/simplex.py +++ b/pina/domain/simplex.py @@ -1,11 +1,11 @@ import torch -from .location import Location -from pina.geometry import CartesianDomain +from .domain_interface import DomainInterface +from pina.domain import CartesianDomain from ..label_tensor import LabelTensor from ..utils import check_consistency -class SimplexDomain(Location): +class SimplexDomain(DomainInterface): """PINA implementation of a Simplex.""" def __init__(self, simplex_matrix, sample_surface=False): diff --git a/pina/geometry/union_domain.py b/pina/domain/union_domain.py similarity index 100% rename from pina/geometry/union_domain.py rename to pina/domain/union_domain.py diff --git a/pina/label_tensor.py b/pina/label_tensor.py index 7cb2f71..12d2182 100644 --- a/pina/label_tensor.py +++ b/pina/label_tensor.py @@ -229,10 +229,6 @@ from torch import Tensor # detached._labels = self._labels # return detached -# def requires_grad_(self, mode=True): -# lt = super().requires_grad_(mode) -# lt.labels = self.labels -# return lt # def append(self, lt, mode="std"): # """ @@ -406,11 +402,29 @@ class LabelTensor(torch.Tensor): return LabelTensor(new_tensor, label_to_extract) - def __str__(self): s = '' for key, value in self.labels.items(): s += f"{key}: {value}\n" s += '\n' s += super().__str__() - return s \ No newline at end of file + return s + + @staticmethod + def stack(tensors): + """ + """ + if len(tensors) == 0: + return [] + + if len(tensors) == 1: + return tensors[0] + + raise NotImplementedError + labels = [tensor.labels for tensor in tensors] + print(labels) + + def requires_grad_(self, mode=True): + lt = super().requires_grad_(mode) + lt.labels = self.labels + return lt \ No newline at end of file diff --git a/pina/problem/abstract_problem.py b/pina/problem/abstract_problem.py index 6e5e317..01bb120 100644 --- a/pina/problem/abstract_problem.py +++ b/pina/problem/abstract_problem.py @@ -5,6 +5,8 @@ from ..utils import merge_tensors, check_consistency from copy import deepcopy import torch +from .. import LabelTensor + class AbstractProblem(metaclass=ABCMeta): """ @@ -18,17 +20,26 @@ class AbstractProblem(metaclass=ABCMeta): def __init__(self): - # variable storing all points - self.input_pts = {} - # varible to check if sampling is done. If no location - # element is presented in Condition this variable is set to true - self._have_sampled_points = {} + self._discretized_domains = {} + + for name, domain in self.domains.items(): + if isinstance(domain, (torch.Tensor, LabelTensor)): + self._discretized_domains[name] = domain + for condition_name in self.conditions: - self._have_sampled_points[condition_name] = False + self.conditions[condition_name]._problem = self + # # variable storing all points + # self.input_pts = {} - # put in self.input_pts all the points that we don't need to sample - self._span_condition_points() + # # varible to check if sampling is done. If no location + # # element is presented in Condition this variable is set to true + # self._have_sampled_points = {} + # for condition_name in self.conditions: + # self._have_sampled_points[condition_name] = False + + # # put in self.input_pts all the points that we don't need to sample + # self._span_condition_points() def __deepcopy__(self, memo): """ @@ -63,15 +74,20 @@ class AbstractProblem(metaclass=ABCMeta): variables += self.spatial_variables if hasattr(self, "temporal_variable"): variables += self.temporal_variable - if hasattr(self, "parameters"): + if hasattr(self, "unknown_parameters"): variables += self.parameters if hasattr(self, "custom_variables"): variables += self.custom_variables return variables + @input_variables.setter + def input_variables(self, variables): + raise RuntimeError + @property - def domain(self): + @abstractmethod + def domains(self): """ The domain(s) where the conditions of the AbstractProblem are valid. If more than one domain type is passed, a list of Location is @@ -80,27 +96,7 @@ class AbstractProblem(metaclass=ABCMeta): :return: the domain(s) of ``self`` :rtype: list[Location] """ - domains = [ - getattr(self, f"{t}_domain") - for t in ["spatial", "temporal", "parameter"] - if hasattr(self, f"{t}_domain") - ] - - if len(domains) == 1: - return domains[0] - elif len(domains) == 0: - raise RuntimeError - - if len(set(map(type, domains))) == 1: - domain = domains[0].__class__({}) - [domain.update(d) for d in domains] - return domain - else: - raise RuntimeError("different domains") - - @input_variables.setter - def input_variables(self, variables): - raise RuntimeError + pass @property @abstractmethod @@ -116,7 +112,9 @@ class AbstractProblem(metaclass=ABCMeta): """ The conditions of the problem. """ - pass + return self._conditions + + def _span_condition_points(self): """ @@ -281,28 +279,4 @@ class AbstractProblem(metaclass=ABCMeta): # merging merged_pts = torch.vstack([old_pts, new_pts]) merged_pts.labels = old_pts.labels - self.input_pts[location] = merged_pts - - @property - def have_sampled_points(self): - """ - Check if all points for - ``Location`` are sampled. - """ - return all(self._have_sampled_points.values()) - - @property - def not_sampled_points(self): - """ - Check which points are - not sampled. - """ - # variables which are not sampled - not_sampled = None - if self.have_sampled_points is False: - # check which one are not sampled: - not_sampled = [] - for condition_name, is_sample in self._have_sampled_points.items(): - if not is_sample: - not_sampled.append(condition_name) - return not_sampled + self.input_pts[location] = merged_pts \ No newline at end of file diff --git a/pina/solvers/solver.py b/pina/solvers/solver.py index 0112c86..a27e936 100644 --- a/pina/solvers/solver.py +++ b/pina/solvers/solver.py @@ -205,6 +205,8 @@ class SolverInterface(pytorch_lightning.LightningModule, metaclass=ABCMeta): # put everything in a list if only one input if not isinstance(model, list): model = [model] + if not isinstance(scheduler, list): + scheduler = [scheduler] if not isinstance(optimizer, list): optimizer = [optimizer] diff --git a/pina/solvers/supervised.py b/pina/solvers/supervised.py index 0285096..00a9c8f 100644 --- a/pina/solvers/supervised.py +++ b/pina/solvers/supervised.py @@ -82,6 +82,7 @@ class SupervisedSolver(SolverInterface): # check consistency check_consistency(loss, (LossInterface, _Loss), subclass=False) + self.loss = loss def forward(self, x): """Forward pass implementation for the solver. @@ -90,7 +91,16 @@ class SupervisedSolver(SolverInterface): :return: Solver solution. :rtype: torch.Tensor """ - return self._pina_model(x) + + output = self._pina_model[0](x) + + output.labels = { + 1: { + "name": "output", + "dof": self.problem.output_variables + } + } + return output def configure_optimizers(self): """Optimizer configuration for the solver. @@ -98,9 +108,12 @@ class SupervisedSolver(SolverInterface): :return: The optimizers and the schedulers :rtype: tuple(list, list) """ - self._pina_optimizer.hook(self._pina_model.parameters()) - self._pina_scheduler.hook(self._pina_optimizer) - return self._pina_optimizer, self._pina_scheduler + self._pina_optimizer[0].hook(self._pina_model[0].parameters()) + self._pina_scheduler[0].hook(self._pina_optimizer[0]) + return ( + [self._pina_optimizer[0].optimizer_instance], + [self._pina_scheduler[0].scheduler_instance] + ) def training_step(self, batch, batch_idx): """Solver training step. @@ -113,14 +126,16 @@ class SupervisedSolver(SolverInterface): :rtype: LabelTensor """ - condition_idx = batch["condition"] + condition_idx = batch.condition for condition_id in range(condition_idx.min(), condition_idx.max() + 1): condition_name = self._dataloader.condition_names[condition_id] condition = self.problem.conditions[condition_name] - pts = batch["pts"] - out = batch["output"] + pts = batch.input + out = batch.output + print(out) + print(pts) if condition_name not in self.problem.conditions: raise RuntimeError("Something wrong happened.") @@ -134,9 +149,11 @@ class SupervisedSolver(SolverInterface): output_pts = out[condition_idx == condition_id] input_pts = pts[condition_idx == condition_id] + input_pts.labels = pts.labels + output_pts.labels = out.labels + loss = ( self.loss_data(input_pts=input_pts, output_pts=output_pts) - * condition.data_weight ) loss = loss.as_subclass(torch.Tensor) @@ -155,6 +172,10 @@ class SupervisedSolver(SolverInterface): :return: The residual loss averaged on the input coordinates :rtype: torch.Tensor """ + print(input_pts) + print(output_pts) + print(self.loss) + print(self.forward(input_pts)) return self.loss(self.forward(input_pts), output_pts) @property diff --git a/pina/trainer.py b/pina/trainer.py index 25d21b7..758bbaa 100644 --- a/pina/trainer.py +++ b/pina/trainer.py @@ -3,7 +3,7 @@ import torch import pytorch_lightning from .utils import check_consistency -from .data.dataset import SamplePointDataset, SamplePointLoader, DataPointDataset +from .data import SamplePointDataset, SamplePointLoader, DataPointDataset from .solvers.solver import SolverInterface @@ -35,19 +35,33 @@ class Trainer(pytorch_lightning.Trainer): self._model = solver self.batch_size = batch_size + self._create_loader() + self._move_to_device() + # create dataloader - if solver.problem.have_sampled_points is False: - raise RuntimeError( - f"Input points in {solver.problem.not_sampled_points} " - "training are None. Please " - "sample points in your problem by calling " - "discretise_domain function before train " - "in the provided locations." - ) + # if solver.problem.have_sampled_points is False: + # raise RuntimeError( + # f"Input points in {solver.problem.not_sampled_points} " + # "training are None. Please " + # "sample points in your problem by calling " + # "discretise_domain function before train " + # "in the provided locations." + # ) - self._create_or_update_loader() + # self._create_or_update_loader() - def _create_or_update_loader(self): + def _move_to_device(self): + device = self._accelerator_connector._parallel_devices[0] + + # move parameters to device + pb = self._model.problem + if hasattr(pb, "unknown_parameters"): + for key in pb.unknown_parameters: + pb.unknown_parameters[key] = torch.nn.Parameter( + pb.unknown_parameters[key].data.to(device) + ) + + def _create_loader(self): """ This method is used here because is resampling is needed during training, there is no need to define to touch the @@ -64,12 +78,6 @@ class Trainer(pytorch_lightning.Trainer): self._loader = SamplePointLoader( dataset_phys, dataset_data, batch_size=self.batch_size, shuffle=True ) - pb = self._model.problem - if hasattr(pb, "unknown_parameters"): - for key in pb.unknown_parameters: - pb.unknown_parameters[key] = torch.nn.Parameter( - pb.unknown_parameters[key].data.to(device) - ) def train(self, **kwargs): """ diff --git a/tests/test_callbacks/test_adaptive_refinment_callbacks.py b/tests/test_callbacks/test_adaptive_refinment_callbacks.py index e5c46a1..67732b3 100644 --- a/tests/test_callbacks/test_adaptive_refinment_callbacks.py +++ b/tests/test_callbacks/test_adaptive_refinment_callbacks.py @@ -4,7 +4,7 @@ import pytest from pina.problem import SpatialProblem from pina.operators import laplacian -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina import Condition, LabelTensor from pina.solvers import PINN from pina.trainer import Trainer diff --git a/tests/test_callbacks/test_optimizer_callbacks.py b/tests/test_callbacks/test_optimizer_callbacks.py index 0b0aaba..898d3f5 100644 --- a/tests/test_callbacks/test_optimizer_callbacks.py +++ b/tests/test_callbacks/test_optimizer_callbacks.py @@ -4,7 +4,7 @@ import pytest from pina.problem import SpatialProblem from pina.operators import laplacian -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina import Condition, LabelTensor from pina.solvers import PINN from pina.trainer import Trainer diff --git a/tests/test_condition.py b/tests/test_condition.py index 23c9d12..5f1c623 100644 --- a/tests/test_condition.py +++ b/tests/test_condition.py @@ -3,7 +3,7 @@ import pytest from pina import LabelTensor, Condition from pina.solvers import PINN -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina.problem import SpatialProblem from pina.model import FeedForward from pina.operators import laplacian diff --git a/tests/test_dataset.py b/tests/test_dataset.py index cb6a9e4..40f2192 100644 --- a/tests/test_dataset.py +++ b/tests/test_dataset.py @@ -4,7 +4,7 @@ import pytest from pina.data.dataset import SamplePointDataset, SamplePointLoader, DataPointDataset from pina import LabelTensor, Condition from pina.equation import Equation -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina.problem import SpatialProblem from pina.model import FeedForward from pina.operators import laplacian diff --git a/tests/test_geometry/test_cartesian.py b/tests/test_geometry/test_cartesian.py index 3e7a8c9..65026c3 100644 --- a/tests/test_geometry/test_cartesian.py +++ b/tests/test_geometry/test_cartesian.py @@ -1,7 +1,7 @@ import torch from pina import LabelTensor -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain def test_constructor(): CartesianDomain({'x': [0, 1], 'y': [0, 1]}) diff --git a/tests/test_geometry/test_difference.py b/tests/test_geometry/test_difference.py index b165fa7..c5300aa 100644 --- a/tests/test_geometry/test_difference.py +++ b/tests/test_geometry/test_difference.py @@ -1,7 +1,7 @@ import torch from pina import LabelTensor -from pina.geometry import Difference, EllipsoidDomain, CartesianDomain +from pina.domain import Difference, EllipsoidDomain, CartesianDomain def test_constructor_two_CartesianDomains(): diff --git a/tests/test_geometry/test_ellipsoid.py b/tests/test_geometry/test_ellipsoid.py index 9ab0989..fa776f9 100644 --- a/tests/test_geometry/test_ellipsoid.py +++ b/tests/test_geometry/test_ellipsoid.py @@ -2,7 +2,7 @@ import torch import pytest from pina import LabelTensor -from pina.geometry import EllipsoidDomain +from pina.domain import EllipsoidDomain def test_constructor(): diff --git a/tests/test_geometry/test_exclusion.py b/tests/test_geometry/test_exclusion.py index b6400cd..f11fa7f 100644 --- a/tests/test_geometry/test_exclusion.py +++ b/tests/test_geometry/test_exclusion.py @@ -1,7 +1,7 @@ import torch from pina import LabelTensor -from pina.geometry import Exclusion, EllipsoidDomain, CartesianDomain +from pina.domain import Exclusion, EllipsoidDomain, CartesianDomain def test_constructor_two_CartesianDomains(): diff --git a/tests/test_geometry/test_intersection.py b/tests/test_geometry/test_intersection.py index 6106107..4929cac 100644 --- a/tests/test_geometry/test_intersection.py +++ b/tests/test_geometry/test_intersection.py @@ -1,7 +1,7 @@ import torch from pina import LabelTensor -from pina.geometry import Intersection, EllipsoidDomain, CartesianDomain +from pina.domain import Intersection, EllipsoidDomain, CartesianDomain def test_constructor_two_CartesianDomains(): diff --git a/tests/test_geometry/test_simplex.py b/tests/test_geometry/test_simplex.py index 1f59585..7fc34ce 100644 --- a/tests/test_geometry/test_simplex.py +++ b/tests/test_geometry/test_simplex.py @@ -2,7 +2,7 @@ import torch import pytest from pina import LabelTensor -from pina.geometry import SimplexDomain +from pina.domain import SimplexDomain def test_constructor(): diff --git a/tests/test_geometry/test_union.py b/tests/test_geometry/test_union.py index 16f8bca..acde895 100644 --- a/tests/test_geometry/test_union.py +++ b/tests/test_geometry/test_union.py @@ -1,7 +1,7 @@ import torch from pina import LabelTensor -from pina.geometry import Union, EllipsoidDomain, CartesianDomain +from pina.domain import Union, EllipsoidDomain, CartesianDomain def test_constructor_two_CartesianDomains(): diff --git a/tests/test_plotter.py b/tests/test_plotter.py index 99f99bc..98eb088 100644 --- a/tests/test_plotter.py +++ b/tests/test_plotter.py @@ -1,4 +1,4 @@ -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina import Condition, Plotter from matplotlib.testing.decorators import image_comparison import matplotlib.pyplot as plt diff --git a/tests/test_problem.py b/tests/test_problem.py index 09133d4..0db508f 100644 --- a/tests/test_problem.py +++ b/tests/test_problem.py @@ -4,7 +4,7 @@ import pytest from pina.problem import SpatialProblem from pina.operators import laplacian from pina import LabelTensor, Condition -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina.equation.equation import Equation from pina.equation.equation_factory import FixedValue diff --git a/tests/test_solvers/test_causalpinn.py b/tests/test_solvers/test_causalpinn.py index bad5255..c5a94a4 100644 --- a/tests/test_solvers/test_causalpinn.py +++ b/tests/test_solvers/test_causalpinn.py @@ -3,7 +3,7 @@ import pytest from pina.problem import TimeDependentProblem, InverseProblem, SpatialProblem from pina.operators import grad -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina import Condition, LabelTensor from pina.solvers import CausalPINN from pina.trainer import Trainer diff --git a/tests/test_solvers/test_competitive_pinn.py b/tests/test_solvers/test_competitive_pinn.py index fae6d43..97ee881 100644 --- a/tests/test_solvers/test_competitive_pinn.py +++ b/tests/test_solvers/test_competitive_pinn.py @@ -3,7 +3,7 @@ import pytest from pina.problem import SpatialProblem, InverseProblem from pina.operators import laplacian -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina import Condition, LabelTensor from pina.solvers import CompetitivePINN as PINN from pina.trainer import Trainer diff --git a/tests/test_solvers/test_gpinn.py b/tests/test_solvers/test_gpinn.py index 7c2bb50..4a6f9e3 100644 --- a/tests/test_solvers/test_gpinn.py +++ b/tests/test_solvers/test_gpinn.py @@ -2,7 +2,7 @@ import torch from pina.problem import SpatialProblem, InverseProblem from pina.operators import laplacian -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina import Condition, LabelTensor from pina.solvers import GPINN from pina.trainer import Trainer diff --git a/tests/test_solvers/test_pinn.py b/tests/test_solvers/test_pinn.py index f3cf275..e2a8972 100644 --- a/tests/test_solvers/test_pinn.py +++ b/tests/test_solvers/test_pinn.py @@ -2,7 +2,7 @@ import torch from pina.problem import SpatialProblem, InverseProblem from pina.operators import laplacian -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina import Condition, LabelTensor from pina.solvers import PINN from pina.trainer import Trainer diff --git a/tests/test_solvers/test_sapinn.py b/tests/test_solvers/test_sapinn.py index 45475fc..a29e045 100644 --- a/tests/test_solvers/test_sapinn.py +++ b/tests/test_solvers/test_sapinn.py @@ -3,7 +3,7 @@ import pytest from pina.problem import SpatialProblem, InverseProblem from pina.operators import laplacian -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina import Condition, LabelTensor from pina.solvers import SAPINN as PINN from pina.trainer import Trainer diff --git a/tests/test_solvers/test_supervised_solver.py b/tests/test_solvers/test_supervised_solver.py index d9cbea3..1b2b7d4 100644 --- a/tests/test_solvers/test_supervised_solver.py +++ b/tests/test_solvers/test_supervised_solver.py @@ -11,10 +11,17 @@ from pina.loss import LpLoss class NeuralOperatorProblem(AbstractProblem): input_variables = ['u_0', 'u_1'] output_variables = ['u'] + domains = { + 'pts': LabelTensor(torch.rand(100, 2), labels={1: {'name': 'space', 'dof': ['u_0', 'u_1']}}) + } conditions = { - # 'data' : Condition( - # input_points=LabelTensor(torch.rand(100, 2), input_variables), - # output_points=LabelTensor(torch.rand(100, 1), output_variables)) + 'data' : Condition( + domain='pts', + output_points=LabelTensor( + torch.rand(100, 1), + labels={1: {'name': 'output', 'dof': ['u']}} + ) + ) } class myFeature(torch.nn.Module): @@ -31,8 +38,8 @@ class myFeature(torch.nn.Module): return LabelTensor(t, ['sin(x)sin(y)']) -# make the problem + extra feats problem = NeuralOperatorProblem() +# make the problem + extra feats extra_feats = [myFeature()] model = FeedForward(len(problem.input_variables), len(problem.output_variables)) diff --git a/tests/test_utils.py b/tests/test_utils.py index 46305f6..46a5083 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -3,10 +3,10 @@ import torch from pina.utils import merge_tensors from pina.label_tensor import LabelTensor from pina import LabelTensor -from pina.geometry import EllipsoidDomain, CartesianDomain +from pina.domain import EllipsoidDomain, CartesianDomain from pina.utils import check_consistency import pytest -from pina.geometry import Location +from pina.domain import Location def test_merge_tensors(): diff --git a/tutorials/tutorial1/tutorial.py b/tutorials/tutorial1/tutorial.py index aa18b7f..a5b5c29 100644 --- a/tutorials/tutorial1/tutorial.py +++ b/tutorials/tutorial1/tutorial.py @@ -66,7 +66,7 @@ if IN_COLAB: get_ipython().system('pip install "pina-mathlab"') from pina.problem import SpatialProblem, TimeDependentProblem -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain class TimeSpaceODE(SpatialProblem, TimeDependentProblem): @@ -95,7 +95,7 @@ class TimeSpaceODE(SpatialProblem, TimeDependentProblem): from pina.problem import SpatialProblem from pina.operators import grad from pina import Condition -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina.equation import Equation, FixedValue import torch diff --git a/tutorials/tutorial11/tutorial.py b/tutorials/tutorial11/tutorial.py index 9bbabfe..b9d3a48 100644 --- a/tutorials/tutorial11/tutorial.py +++ b/tutorials/tutorial11/tutorial.py @@ -32,7 +32,7 @@ from pina.solvers import PINN from pina.model import FeedForward from pina.problem import SpatialProblem from pina.operators import grad -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina.equation import Equation, FixedValue class SimpleODE(SpatialProblem): diff --git a/tutorials/tutorial12/tutorial.py b/tutorials/tutorial12/tutorial.py index 515841a..d6aeb9b 100644 --- a/tutorials/tutorial12/tutorial.py +++ b/tutorials/tutorial12/tutorial.py @@ -41,7 +41,7 @@ if IN_COLAB: #useful imports from pina.problem import SpatialProblem, TimeDependentProblem from pina.equation import Equation, FixedValue, FixedGradient, FixedFlux -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain import torch from pina.operators import grad, laplacian from pina import Condition diff --git a/tutorials/tutorial2/tutorial.py b/tutorials/tutorial2/tutorial.py index b5132b4..4315bfc 100644 --- a/tutorials/tutorial2/tutorial.py +++ b/tutorials/tutorial2/tutorial.py @@ -30,7 +30,7 @@ from pina.model import FeedForward from pina.solvers import PINN from pina.trainer import Trainer from pina.plotter import Plotter -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina.equation import Equation, FixedValue from pina import Condition, LabelTensor from pina.callbacks import MetricTracker diff --git a/tutorials/tutorial3/tutorial.py b/tutorials/tutorial3/tutorial.py index bc2a8f6..445134a 100644 --- a/tutorials/tutorial3/tutorial.py +++ b/tutorials/tutorial3/tutorial.py @@ -25,7 +25,7 @@ import torch from pina.problem import SpatialProblem, TimeDependentProblem from pina.operators import laplacian, grad -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina.solvers import PINN from pina.trainer import Trainer from pina.equation import Equation diff --git a/tutorials/tutorial7/tutorial.py b/tutorials/tutorial7/tutorial.py index 3c55f1c..419dbbe 100644 --- a/tutorials/tutorial7/tutorial.py +++ b/tutorials/tutorial7/tutorial.py @@ -51,7 +51,7 @@ from pina.model import FeedForward from pina.equation import Equation, FixedValue from pina import Condition, Trainer from pina.solvers import PINN -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain # Then, we import the pre-saved data, for ($\mu_1$, $\mu_2$)=($0.5$, $0.5$). These two values are the optimal parameters that we want to find through the neural network training. In particular, we import the `input_points`(the spatial coordinates), and the `output_points` (the corresponding $u$ values evaluated at the `input_points`). diff --git a/tutorials/tutorial8/tutorial.py b/tutorials/tutorial8/tutorial.py index 980404e..b1d105a 100644 --- a/tutorials/tutorial8/tutorial.py +++ b/tutorials/tutorial8/tutorial.py @@ -35,7 +35,7 @@ plt.style.use('tableau-colorblind10') import torch import pina -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina.problem import ParametricProblem from pina.model.layers import PODBlock, RBFBlock diff --git a/tutorials/tutorial9/tutorial.py b/tutorials/tutorial9/tutorial.py index db4b7a3..c159087 100644 --- a/tutorials/tutorial9/tutorial.py +++ b/tutorials/tutorial9/tutorial.py @@ -36,7 +36,7 @@ from pina.model import FeedForward from pina.model.layers import PeriodicBoundaryEmbedding # The PBC module from pina.solvers import PINN from pina.trainer import Trainer -from pina.geometry import CartesianDomain +from pina.domain import CartesianDomain from pina.equation import Equation