anypinn.problems
Problem templates and implementations.
BCValueFn: TypeAlias = Callable[[Tensor], Tensor]
module-attribute
A callable that maps boundary coordinates (n_pts, d) → target values (n_pts, out_dim).
PDEResidualFn: TypeAlias = Callable[[Tensor, FieldsRegistry, ParamsRegistry], Tensor]
module-attribute
A callable (x, fields, params) → residual tensor, expected to be zero at the solution.
PredictDataFn: TypeAlias = Callable[[Tensor, FieldsRegistry, ParamsRegistry], Tensor]
module-attribute
__all__ = ['BCValueFn', 'BoundaryCondition', 'DataConstraint', 'DirichletBCConstraint', 'ICConstraint', 'NeumannBCConstraint', 'ODECallable', 'ODEHyperparameters', 'ODEInverseProblem', 'ODEProperties', 'PDEResidualConstraint', 'PDEResidualFn', 'PeriodicBCConstraint', 'PredictDataFn', 'ResidualsConstraint']
module-attribute
BoundaryCondition
Pairs a boundary region sampler with a prescribed value function.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
sampler
|
Callable[[int], Tensor]
|
Callable |
required |
value
|
BCValueFn
|
Callable |
required |
n_pts
|
int
|
Number of boundary points sampled per training step. |
100
|
Source code in src/anypinn/problems/pde.py
n_pts = n_pts
instance-attribute
sampler = sampler
instance-attribute
value = value
instance-attribute
__init__(sampler: Callable[[int], Tensor], value: BCValueFn, n_pts: int = 100)
DataConstraint
Bases: Constraint
Constraint enforcing fit to observed data. Minimizes \(\lVert \hat{{y}} - y \rVert^2\).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
fields
|
FieldsRegistry
|
Fields registry. |
required |
params
|
ParamsRegistry
|
Parameters registry. |
required |
predict_data
|
PredictDataFn
|
Function to predict data values from fields. |
required |
weight
|
float
|
Weight for this loss term. |
1.0
|
Source code in src/anypinn/problems/ode.py
fields = fields
instance-attribute
params = params
instance-attribute
predict_data = predict_data
instance-attribute
weight = weight
instance-attribute
__init__(fields: FieldsRegistry, params: ParamsRegistry, predict_data: PredictDataFn, weight: float = 1.0)
Source code in src/anypinn/problems/ode.py
loss(batch: TrainingBatch, criterion: nn.Module, log: LogFn | None = None) -> Tensor
Source code in src/anypinn/problems/ode.py
DirichletBCConstraint
Bases: Constraint
Enforces the Dirichlet boundary condition: u(x_bc) = g(x_bc).
Minimizes weight * criterion(u(x_bc), g(x_bc)).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
bc
|
BoundaryCondition
|
Boundary condition (sampler + target value function). |
required |
field
|
Field
|
The neural field to enforce the condition on. |
required |
log_key
|
str
|
Key used when logging the loss value. |
'loss/bc_dirichlet'
|
weight
|
float
|
Loss term weight. |
1.0
|
Source code in src/anypinn/problems/pde.py
bc = bc
instance-attribute
field = field
instance-attribute
log_key = log_key
instance-attribute
weight = weight
instance-attribute
__init__(bc: BoundaryCondition, field: Field, log_key: str = 'loss/bc_dirichlet', weight: float = 1.0)
loss(batch: TrainingBatch, criterion: nn.Module, log: LogFn | None = None) -> Tensor
Source code in src/anypinn/problems/pde.py
ICConstraint
Bases: Constraint
Constraint enforcing Initial Conditions (IC). Minimizes \(\lVert y(t_0) - Y_0 \rVert^2\).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
fields
|
FieldsRegistry
|
Fields registry. |
required |
weight
|
float
|
Weight for this loss term. |
1.0
|
Source code in src/anypinn/problems/ode.py
Y0 = props.y0.clone().reshape(-1, 1, 1)
instance-attribute
dY0 = [(dy.clone().reshape(-1, 1, 1)) for dy in (props.dy0)]
instance-attribute
fields = fields
instance-attribute
order = props.order
instance-attribute
weight = weight
instance-attribute
__init__(props: ODEProperties, fields: FieldsRegistry, weight: float = 1.0)
Source code in src/anypinn/problems/ode.py
inject_context(context: InferredContext) -> None
Inject the context into the constraint.
loss(batch: TrainingBatch, criterion: nn.Module, log: LogFn | None = None) -> Tensor
Source code in src/anypinn/problems/ode.py
NeumannBCConstraint
Bases: Constraint
Enforces the Neumann boundary condition: \(\partial u / \partial n (x_{bc}) = h(x_{bc})\).
For a rectangular domain face whose outward normal is axis-aligned with
dimension normal_dim, we have
\(\partial u / \partial n = \partial u / \partial x_{\mathrm{normal\_dim}}\).
Minimizes
weight * criterion(du_dn(x_bc), h(x_bc)).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
bc
|
BoundaryCondition
|
Boundary condition (sampler + target normal-derivative function). |
required |
field
|
Field
|
The neural field to enforce the condition on. |
required |
normal_dim
|
int
|
Index of the spatial dimension the boundary normal points along. |
required |
log_key
|
str
|
Key used when logging the loss value. |
'loss/bc_neumann'
|
weight
|
float
|
Loss term weight. |
1.0
|
Source code in src/anypinn/problems/pde.py
bc = bc
instance-attribute
field = field
instance-attribute
log_key = log_key
instance-attribute
normal_dim = normal_dim
instance-attribute
weight = weight
instance-attribute
__init__(bc: BoundaryCondition, field: Field, normal_dim: int, log_key: str = 'loss/bc_neumann', weight: float = 1.0)
Source code in src/anypinn/problems/pde.py
loss(batch: TrainingBatch, criterion: nn.Module, log: LogFn | None = None) -> Tensor
Source code in src/anypinn/problems/pde.py
ODECallable
Bases: Protocol
Protocol for ODE right-hand side callables.
First-order callables (ODEProperties.order == 1) receive three
positional arguments and must match this Protocol exactly::
def my_ode(x: Tensor, y: Tensor, args: ArgsRegistry) -> Tensor: ...
Higher-order callables (order >= 2) receive a fourth positional
argument derivs: list[Tensor], where derivs[k] is the
(k+1)-th derivative of all fields stacked as (n_fields, m, 1)::
def my_ode(x: Tensor, y: Tensor, args: ArgsRegistry,
derivs: list[Tensor] = []) -> Tensor: ...
The Protocol is intentionally kept to three arguments so that existing
first-order callables remain valid ODECallable implementations.
ResidualsConstraint uses _ODECallableN internally to call
higher-order functions with the correct signature.
Source code in src/anypinn/problems/ode.py
__call__(x: Tensor, y: Tensor, args: ArgsRegistry) -> Tensor
Source code in src/anypinn/problems/ode.py
ODEHyperparameters
dataclass
Bases: PINNHyperparameters
Hyperparameters for ODE inverse problems.
Source code in src/anypinn/problems/ode.py
data_weight: float = 1.0
class-attribute
instance-attribute
ic_weight: float = 1.0
class-attribute
instance-attribute
pde_weight: float = 1.0
class-attribute
instance-attribute
__init__(*, lr: float, training_data: IngestionConfig | GenerationConfig, fields_config: MLPConfig, params_config: MLPConfig | ScalarConfig, max_epochs: int | None = None, gradient_clip_val: float | None = None, criterion: Criteria = 'mse', optimizer: AdamConfig | LBFGSConfig | None = None, scheduler: ReduceLROnPlateauConfig | CosineAnnealingConfig | None = None, early_stopping: EarlyStoppingConfig | None = None, smma_stopping: SMMAStoppingConfig | None = None, pde_weight: float = 1.0, ic_weight: float = 1.0, data_weight: float = 1.0) -> None
ODEInverseProblem
Bases: Problem
Generic ODE Inverse Problem. Composes Residuals + IC + Data constraints with MSELoss.
Source code in src/anypinn/problems/ode.py
__init__(props: ODEProperties, hp: ODEHyperparameters, fields: FieldsRegistry, params: ParamsRegistry, predict_data: PredictDataFn) -> None
Source code in src/anypinn/problems/ode.py
ODEProperties
dataclass
Properties defining an Ordinary Differential Equation problem.
Attributes:
| Name | Type | Description |
|---|---|---|
ode |
ODECallable
|
The ODE function (callable). |
args |
ArgsRegistry
|
Arguments/Parameters for the ODE. |
y0 |
Tensor
|
Initial conditions. |
order |
int
|
Order of the ODE (default 1). For order=n, the ODE callable receives derivs as its last argument: derivs[k] is the (k+1)-th derivative. |
dy0 |
list[Tensor]
|
Initial conditions for lower-order derivatives, length = order-1. dy0[k] is the IC for the (k+1)-th derivative, shape (n_fields,). |
expected_args |
frozenset[str] | None
|
Optional set of arg keys the ODE function accesses. When provided, validated against the merged args+params at construction time. |
Source code in src/anypinn/problems/ode.py
args: ArgsRegistry
instance-attribute
dy0: list[Tensor] = dc_field(default_factory=list)
class-attribute
instance-attribute
expected_args: frozenset[str] | None = None
class-attribute
instance-attribute
ode: ODECallable
instance-attribute
order: int = 1
class-attribute
instance-attribute
y0: Tensor
instance-attribute
__init__(ode: ODECallable, args: ArgsRegistry, y0: Tensor, order: int = 1, dy0: list[Tensor] = list(), expected_args: frozenset[str] | None = None) -> None
__post_init__() -> None
PDEResidualConstraint
Bases: Constraint
Enforces a PDE interior residual: residual_fn(x, fields, params) ≈ 0.
Minimizes weight * criterion(residual_fn(x_coll, fields, params), 0).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
fields
|
FieldsRegistry
|
Registry of neural fields the residual function operates on. Pass only the subset needed — other fields in the Problem are ignored. |
required |
params
|
ParamsRegistry
|
Registry of parameters the residual function uses. |
required |
residual_fn
|
PDEResidualFn
|
Callable (x, fields, params) → Tensor of residuals.
Should use |
required |
log_key
|
str
|
Key used when logging the loss value. |
'loss/pde_residual'
|
weight
|
float
|
Loss term weight. |
1.0
|
Source code in src/anypinn/problems/pde.py
fields = fields
instance-attribute
log_key = log_key
instance-attribute
params = params
instance-attribute
residual_fn = residual_fn
instance-attribute
weight = weight
instance-attribute
__init__(fields: FieldsRegistry, params: ParamsRegistry, residual_fn: PDEResidualFn, log_key: str = 'loss/pde_residual', weight: float = 1.0)
Source code in src/anypinn/problems/pde.py
loss(batch: TrainingBatch, criterion: nn.Module, log: LogFn | None = None) -> Tensor
Source code in src/anypinn/problems/pde.py
PeriodicBCConstraint
Bases: Constraint
Enforces periodic boundary conditions:
u(x_left, t) = u(x_right, t) and
∂u/∂x(x_left, t) = ∂u/∂x(x_right, t).
The two boundary samplers must produce paired points — identical coordinates in every dimension except the periodic one — so that the value- and derivative-matching losses are meaningful.
Minimizes
weight * [criterion(u_left, u_right) + criterion(du_left, du_right)].
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
bc_left
|
BoundaryCondition
|
Left boundary sampler (sampler + dummy value function). |
required |
bc_right
|
BoundaryCondition
|
Right boundary sampler (sampler + dummy value function). |
required |
field
|
Field
|
The neural field to enforce the condition on. |
required |
match_dim
|
int
|
Spatial dimension index for the derivative matching. |
0
|
log_key
|
str
|
Key used when logging the loss value. |
'loss/bc_periodic'
|
weight
|
float
|
Loss term weight. |
1.0
|
Source code in src/anypinn/problems/pde.py
bc_left = bc_left
instance-attribute
bc_right = bc_right
instance-attribute
field = field
instance-attribute
log_key = log_key
instance-attribute
match_dim = match_dim
instance-attribute
weight = weight
instance-attribute
__init__(bc_left: BoundaryCondition, bc_right: BoundaryCondition, field: Field, match_dim: int = 0, log_key: str = 'loss/bc_periodic', weight: float = 1.0)
Source code in src/anypinn/problems/pde.py
loss(batch: TrainingBatch, criterion: nn.Module, log: LogFn | None = None) -> Tensor
Source code in src/anypinn/problems/pde.py
ResidualsConstraint
Bases: Constraint
Constraint enforcing the ODE residuals. Minimizes \(\lVert \partial y / \partial t - f(t, y) \rVert^2\).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
props
|
ODEProperties
|
ODE properties. |
required |
fields
|
FieldsRegistry
|
List of fields. |
required |
params
|
ParamsRegistry
|
List of parameters. |
required |
weight
|
float
|
Weight for this loss term. |
1.0
|
Source code in src/anypinn/problems/ode.py
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 | |