From c64cbd48218c203503cd9948ce6e1d09574c154a Mon Sep 17 00:00:00 2001 From: Dario Coscia <93731561+dario-coscia@users.noreply.github.com> Date: Mon, 24 Mar 2025 12:47:11 +0100 Subject: [PATCH 1/4] Update solver.py --- pina/solver/solver.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/pina/solver/solver.py b/pina/solver/solver.py index 2a173b33d..78761e8b6 100644 --- a/pina/solver/solver.py +++ b/pina/solver/solver.py @@ -450,6 +450,16 @@ def __init__( "one." ) + if optimizers is None: + optimizers = [ + self.default_torch_optimizer() for _ in range(len(models)) + ] + + if schedulers is None: + schedulers = [ + self.default_torch_scheduler() for _ in range(len(models)) + ] + if any(opt is None for opt in optimizers): optimizers = [ self.default_torch_optimizer() if opt is None else opt @@ -480,12 +490,25 @@ def __init__( f"Got {len(models)} models, and {len(optimizers)}" " optimizers." ) + if len(schedulers) != len(optimizers): + raise ValueError( + "You must define one scheduler for each optimizer." + f"Got {len(schedulers)} schedulers, and {len(optimizers)}" + " optimizers." + ) # initialize the model self._pina_models = torch.nn.ModuleList(models) self._pina_optimizers = optimizers self._pina_schedulers = schedulers + # set automatic optimization to True, this is done on purpuse to trigger + # an error if the user does not uses manual optimization in the + # training step. The following must be override to False and manual + # optimization should be used. For more insights on manual optimization + # see https://lightning.ai/docs/pytorch/stable/model/manual_optimization.html + self.automatic_optimization = True + def configure_optimizers(self): """ Optimizer configuration for the solver. From 2841ab5e540ec35abc17157d1e019088796f6a79 Mon Sep 17 00:00:00 2001 From: giovanni Date: Mon, 24 Mar 2025 15:39:21 +0100 Subject: [PATCH 2/4] fix codacy --- pina/solver/solver.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/pina/solver/solver.py b/pina/solver/solver.py index 78761e8b6..2df8b8ef4 100644 --- a/pina/solver/solver.py +++ b/pina/solver/solver.py @@ -502,11 +502,13 @@ def __init__( self._pina_optimizers = optimizers self._pina_schedulers = schedulers - # set automatic optimization to True, this is done on purpuse to trigger - # an error if the user does not uses manual optimization in the - # training step. The following must be override to False and manual - # optimization should be used. For more insights on manual optimization - # see https://lightning.ai/docs/pytorch/stable/model/manual_optimization.html + # set automatic optimization to True. + # This is done on purpuse to ensure that an error is triggered whenever + # the user does not use manual optimization in the training step. + # The following must be overridden to False as manual optimization must + # be used for multisolvers. + # For more information on manual optimization see: + # http://lightning.ai/docs/pytorch/stable/model/manual_optimization.html self.automatic_optimization = True def configure_optimizers(self): From a92277e2d3764f60248f0c4920786c23f5f402e7 Mon Sep 17 00:00:00 2001 From: Dario Coscia Date: Thu, 3 Apr 2025 19:32:02 +0200 Subject: [PATCH 3/4] adding warning in doc --- .../competitive_pinn.py | 3 --- .../self_adaptive_pinn.py | 3 --- pina/solver/solver.py | 26 ++++++++++++------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/pina/solver/physics_informed_solver/competitive_pinn.py b/pina/solver/physics_informed_solver/competitive_pinn.py index 058c53f40..18a9861e9 100644 --- a/pina/solver/physics_informed_solver/competitive_pinn.py +++ b/pina/solver/physics_informed_solver/competitive_pinn.py @@ -103,9 +103,6 @@ def __init__( loss=loss, ) - # Set automatic optimization to False - self.automatic_optimization = False - def forward(self, x): """ Forward pass. diff --git a/pina/solver/physics_informed_solver/self_adaptive_pinn.py b/pina/solver/physics_informed_solver/self_adaptive_pinn.py index a6310d515..d9c9a9bb3 100644 --- a/pina/solver/physics_informed_solver/self_adaptive_pinn.py +++ b/pina/solver/physics_informed_solver/self_adaptive_pinn.py @@ -158,9 +158,6 @@ def __init__( loss=loss, ) - # Set automatic optimization to False - self.automatic_optimization = False - self._vectorial_loss = deepcopy(self.loss) self._vectorial_loss.reduction = "none" diff --git a/pina/solver/solver.py b/pina/solver/solver.py index 2df8b8ef4..a8a4ea830 100644 --- a/pina/solver/solver.py +++ b/pina/solver/solver.py @@ -14,9 +14,13 @@ class SolverInterface(lightning.pytorch.LightningModule, metaclass=ABCMeta): """ - Abstract base class for PINA solvers. All specific solvers should inherit - from this interface. This class is a wrapper of - :class:`~lightning.pytorch.LightningModule`. + Abstract base class for PINA solvers. All specific solvers must inherit + from this interface. This class extends + :class:`~lightning.pytorch.core.LightningModule`, providing additional + functionalities for defining and optimizing Deep Learning models. + + By inheriting from this base class, solvers gain access to built-in training + loops, logging utilities, and optimization techniques. """ def __init__(self, problem, weighting, use_lt): @@ -442,6 +446,14 @@ def __init__( :param bool use_lt: If ``True``, the solver uses LabelTensors as input. :raises ValueError: If the models are not a list or tuple with length greater than one. + + .. warning:: + :class:`MultiSolverInterface` uses manual optimization by setting + ``automatic_optimization=False`` in + :class:`~lightning.pytorch.core.LightningModule`. For more + information on manual optimization please + see `here `_. """ if not isinstance(models, (list, tuple)) or len(models) < 2: raise ValueError( @@ -502,14 +514,10 @@ def __init__( self._pina_optimizers = optimizers self._pina_schedulers = schedulers - # set automatic optimization to True. - # This is done on purpuse to ensure that an error is triggered whenever - # the user does not use manual optimization in the training step. - # The following must be overridden to False as manual optimization must - # be used for multisolvers. + # Set automatic optimization to False. # For more information on manual optimization see: # http://lightning.ai/docs/pytorch/stable/model/manual_optimization.html - self.automatic_optimization = True + self.automatic_optimization = False def configure_optimizers(self): """ From bfa7ebeec219fedea9b13d1270f9b7f237f833dd Mon Sep 17 00:00:00 2001 From: Dario Coscia Date: Thu, 3 Apr 2025 19:42:25 +0200 Subject: [PATCH 4/4] linter --- pina/solver/solver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pina/solver/solver.py b/pina/solver/solver.py index a8a4ea830..6776fea9d 100644 --- a/pina/solver/solver.py +++ b/pina/solver/solver.py @@ -16,7 +16,7 @@ class SolverInterface(lightning.pytorch.LightningModule, metaclass=ABCMeta): """ Abstract base class for PINA solvers. All specific solvers must inherit from this interface. This class extends - :class:`~lightning.pytorch.core.LightningModule`, providing additional + :class:`~lightning.pytorch.core.LightningModule`, providing additional functionalities for defining and optimizing Deep Learning models. By inheriting from this base class, solvers gain access to built-in training