...
Project description
AnyPINN
Solve differential equations with Physics-Informed Neural Networks.
Modular. Training-agnostic. Inverse-problem-first.
Most PINN libraries make you wire up every loss term, collocation grid, and training loop by hand before you see a single result. AnyPINN gives you a working experiment in one command and then lets you peel back every layer when you're ready.
🚀 Quick Start
The fastest way to start is from the terminal. The command below generates a complete, runnable project interactively, no manual setup needed. uvx lets you run it without installing anything permanently:
uvx anypinn create my-project
pipx works the same way:
pipx run anypinn create my-project
Run anypinn create --help to see all available flags and templates. For a full walkthrough covering project structure, configuration, training, and next steps, see the Getting Started guide.
👥 Who Is This For?
AnyPINN is built around progressive complexity. Start simple, go deeper only when you need to.
| User | Goal | How |
|---|---|---|
| Experimenter | Run a known problem, tweak parameters, see results | Pick a built-in template, change config, press start |
| Researcher | Define new physics or custom constraints | Subclass Constraint and Problem, use the provided training engine |
| Framework builder | Custom training loops, novel architectures | Use anypinn.core directly, no Lightning required |
💡 Examples
The examples/ directory has ready-made, self-contained scripts covering epidemic models, oscillators, predator-prey dynamics, and more, from a minimal ~80-line core-only script to full Lightning stacks. They're a great source of inspiration when defining your own problem.
🔬 Defining Your Own Problem
If you want to go beyond the built-in templates, here is the full workflow for defining a custom inverse problem. The example below uses an ODE; PDEs follow the same pattern with different building blocks (PDEResidualConstraint, DirichletBCConstraint, etc.).
1: Define the equation
Write a function that returns derivatives given the current state and parameters:
from torch import Tensor
from anypinn.core import ArgsRegistry
def my_ode(x: Tensor, y: Tensor, args: ArgsRegistry) -> Tensor:
k = args["k"](x) # learnable or fixed parameter
return -k * y # simple exponential decay
2: Configure hyperparameters
from dataclasses import dataclass
from anypinn.problems import ODEHyperparameters
@dataclass(frozen=True, kw_only=True)
class MyHyperparameters(ODEHyperparameters):
pde_weight: float = 1.0
ic_weight: float = 10.0
data_weight: float = 5.0
3: Build the problem
from anypinn.problems import ODEInverseProblem, ODEProperties
props = ODEProperties(ode=my_ode, args={"k": param}, y0=y0)
problem = ODEInverseProblem(
ode_props=props,
fields={"u": field},
params={"k": param},
hp=hp,
)
4: Train
import pytorch_lightning as pl
from anypinn.lightning import PINNModule
# With Lightning (batteries included)
module = PINNModule(problem, hp)
trainer = pl.Trainer(max_epochs=50_000)
trainer.fit(module, datamodule=dm)
# Or with your own training loop (core only, no Lightning)
optimizer = torch.optim.Adam(problem.parameters(), lr=1e-3)
for batch in dataloader:
optimizer.zero_grad()
loss = problem.training_loss(batch, log=my_log_fn)
loss.backward()
optimizer.step()
For complete walkthroughs, see the custom ODE guide and the PDE forward problems guide.
🏗️ Architecture
Four layers with a strict dependency direction: outer layers depend on inner ones, never the reverse.
graph TD
EXP["Your Experiment / Generated Project"]
EXP --> CAT
EXP --> LIT
subgraph CAT["anypinn.catalog"]
direction LR
CA1[SIR / SEIR]
CA2[DampedOscillator]
CA3[LotkaVolterra]
end
subgraph LIT["anypinn.lightning (optional)"]
direction LR
L1[PINNModule]
L2[Callbacks]
L3[PINNDataModule]
end
subgraph PROB["anypinn.problems"]
direction LR
P1[ResidualsConstraint]
P2[ICConstraint]
P3[DataConstraint]
P4[ODEInverseProblem]
P5[PDEResidualConstraint]
P6[DirichletBC · NeumannBC]
end
subgraph CORE["anypinn.core (pure PyTorch)"]
direction LR
C1[Problem · Constraint]
C2[Field · Parameter]
C3[Config · Context]
end
CAT -->|depends on| PROB
CAT -->|depends on| CORE
LIT -->|depends on| CORE
PROB -->|depends on| CORE
For a detailed breakdown of each layer, see the Architecture guide.
🤝 Contributing
See CONTRIBUTING.md for setup instructions, code style guidelines, and the pull request workflow.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file anypinn-0.25.7.tar.gz.
File metadata
- Download URL: anypinn-0.25.7.tar.gz
- Upload date:
- Size: 42.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
28366634a38858d27bd6aa6ff1a9d2fbefa2821e77488839f2551f9403b945ae
|
|
| MD5 |
592da740e9b565950936c86030d1a69c
|
|
| BLAKE2b-256 |
4311af87aa13d7e0c76e97b0ea2f2a11b4dd1aa1bf5830c737f1a516f6a734d8
|
Provenance
The following attestation bundles were made for anypinn-0.25.7.tar.gz:
Publisher:
ci.yaml on giacomoguidotto/anypinn
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
anypinn-0.25.7.tar.gz -
Subject digest:
28366634a38858d27bd6aa6ff1a9d2fbefa2821e77488839f2551f9403b945ae - Sigstore transparency entry: 1439945178
- Sigstore integration time:
-
Permalink:
giacomoguidotto/anypinn@e5b5ee50a2f9f0eb3a41c2b76163d533f2a81490 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/giacomoguidotto
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yaml@e5b5ee50a2f9f0eb3a41c2b76163d533f2a81490 -
Trigger Event:
push
-
Statement type:
File details
Details for the file anypinn-0.25.7-py3-none-any.whl.
File metadata
- Download URL: anypinn-0.25.7-py3-none-any.whl
- Upload date:
- Size: 132.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
54d3bc552e86fede3ffe3a22bfe2e2a5d087720dc547d960dee62ca6d4845586
|
|
| MD5 |
871909154c8e6200b1ecdc3f0b4570bb
|
|
| BLAKE2b-256 |
cafc55a0e6345e46db97ab93e6e12b1a90faa453b7a397c55f771b7d6bdd8e76
|
Provenance
The following attestation bundles were made for anypinn-0.25.7-py3-none-any.whl:
Publisher:
ci.yaml on giacomoguidotto/anypinn
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
anypinn-0.25.7-py3-none-any.whl -
Subject digest:
54d3bc552e86fede3ffe3a22bfe2e2a5d087720dc547d960dee62ca6d4845586 - Sigstore transparency entry: 1439945185
- Sigstore integration time:
-
Permalink:
giacomoguidotto/anypinn@e5b5ee50a2f9f0eb3a41c2b76163d533f2a81490 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/giacomoguidotto
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yaml@e5b5ee50a2f9f0eb3a41c2b76163d533f2a81490 -
Trigger Event:
push
-
Statement type: