| from __future__ import annotations |
|
|
| import sys |
| from pathlib import Path |
| from types import SimpleNamespace |
|
|
| import torch |
|
|
|
|
| PROJECT_ROOT = Path(__file__).resolve().parents[1] |
| if str(PROJECT_ROOT) not in sys.path: |
| sys.path.insert(0, str(PROJECT_ROOT)) |
|
|
|
|
| def check(name: str, tensor: torch.Tensor, expected_last_dim: int | None = None) -> None: |
| if not torch.isfinite(tensor).all(): |
| raise RuntimeError(f"{name} produced non-finite values") |
| if expected_last_dim is not None and tensor.shape[-1] != expected_last_dim: |
| raise RuntimeError( |
| f"{name} last dim expected {expected_last_dim}, got {tensor.shape[-1]}" |
| ) |
| print(f"[OK] {name}: shape={tuple(tensor.shape)}") |
|
|
|
|
| @torch.no_grad() |
| def smoke_deeponet() -> None: |
| from model.deeponet import DeepONetCartesianProd1D |
|
|
| model = DeepONetCartesianProd1D( |
| size=8, |
| in_channel_branch=1, |
| query_dim=1, |
| out_channel=1, |
| activation="relu", |
| base_model="MLP", |
| ).eval() |
| x_func = torch.randn(2, 8, 1) |
| x_loc = torch.linspace(0.0, 1.0, 8).unsqueeze(-1) |
| out = model((x_func, x_loc)) |
| check("deeponet.DeepONetCartesianProd1D", out, expected_last_dim=1) |
|
|
|
|
| @torch.no_grad() |
| def smoke_fno() -> None: |
| from model.fno import FNO2d |
|
|
| model = FNO2d(num_channels=1, modes1=4, modes2=4, width=8, initial_step=1).eval() |
| x = torch.randn(2, 16, 16, 1) |
| coords = torch.linspace(0.0, 1.0, 16) |
| xx, yy = torch.meshgrid(coords, coords, indexing="ij") |
| grid = torch.stack((xx, yy), dim=-1).unsqueeze(0).repeat(2, 1, 1, 1) |
| out = model(x, grid) |
| check("fno.FNO2d", out, expected_last_dim=1) |
|
|
|
|
| @torch.no_grad() |
| def smoke_mpnn() -> None: |
| from torch_geometric.data import Data |
|
|
| from model.mpnn import MPNN |
|
|
| pde = SimpleNamespace( |
| name="smoke", |
| tmin=0.0, |
| tmax=1.0, |
| resolution_t=10, |
| spatial_domain=[(0.0, 1.0)], |
| resolution=[4], |
| spatial_dim=1, |
| variables={}, |
| ) |
| model = MPNN(pde=pde, time_window=10, hidden_features=128, hidden_layers=1).eval() |
| edge_index = torch.tensor( |
| [[0, 1, 2, 3, 1, 2, 3, 0], [1, 2, 3, 0, 0, 1, 2, 3]], |
| dtype=torch.long, |
| ) |
| data = Data( |
| x=torch.randn(4, 10, 1), |
| x_pos=torch.linspace(0.0, 1.0, 4).unsqueeze(-1), |
| t_pos=torch.zeros(4), |
| edge_index=edge_index, |
| batch=torch.zeros(4, dtype=torch.long), |
| variables=torch.empty(4, 0), |
| ) |
| out = model(data, v=0) |
| check("mpnn.MPNN", out) |
|
|
|
|
| @torch.no_grad() |
| def smoke_pino_fno() -> None: |
| from model.pino_fno import FNO1d |
|
|
| model = FNO1d( |
| modes=[4, 4], |
| width=4, |
| layers=[4, 4, 4], |
| fc_dim=8, |
| in_dim=2, |
| out_dim=1, |
| pad_ratio=[0.0, 0.0], |
| ).eval() |
| out = model(torch.randn(2, 16, 2)) |
| check("pino_fno.FNO1d", out, expected_last_dim=1) |
|
|
|
|
| @torch.no_grad() |
| def smoke_unet() -> None: |
| from model.unet import UNet2d |
|
|
| model = UNet2d(in_channels=1, out_channels=1, init_features=2).eval() |
| out = model(torch.randn(1, 1, 16, 16)) |
| check("unet.UNet2d", out) |
|
|
|
|
| @torch.no_grad() |
| def smoke_uno() -> None: |
| from model.uno import UNO1d |
|
|
| model = UNO1d(num_channels=1, width=4, initial_step=1).eval() |
| x = torch.randn(1, 64, 1) |
| grid = torch.linspace(0.0, 1.0, 64).view(1, 64, 1) |
| out = model(x, grid) |
| check("uno.UNO1d", out, expected_last_dim=1) |
|
|
|
|
| def main() -> int: |
| torch.manual_seed(0) |
| smoke_deeponet() |
| smoke_fno() |
| smoke_mpnn() |
| smoke_pino_fno() |
| smoke_unet() |
| smoke_uno() |
| return 0 |
|
|
|
|
| if __name__ == "__main__": |
| raise SystemExit(main()) |
|
|