PirateNet
PirateNet implements the Physics-Informed Residual Adaptive Network from
Wang et al. (2024). Each block contains three dense layers, two
modified-MLP gates, and a trainable scalar alpha:
nonlinear = gated_three_layer_block(features, U, V)
features = alpha * nonlinear + (1 - alpha) * features
The default alpha=0 makes every block an identity at initialization. Training increases the effective depth by
learning each coefficient. Random Fourier features are enabled by default and must produce hidden_dim features.
Because PhiJAX pairs cosine and sine features, the default samples embed_dim=hidden_dim/2 frequencies. Random weight
factorization can be enabled separately.
The factory uses standard Glorot initialization. It does not apply the paper's optional physics-informed least-squares initialization because that method depends on training data.
Factory example
from functools import partial
from phijax.models import build_pirate_net
model_factory = partial(
build_pirate_net,
input_dim=2,
output_dim=1,
hidden_dim=256,
num_blocks=4,
activation="tanh",
nonlinearity=0.0,
input_norm=True,
fourier_features_kwargs={"scale": 1.0},
weight_factorization=True,
weight_factorization_kwargs={"mean": 0.5, "std": 0.1},
)
API reference
PirateBlock
[source]
PirateBlock(
hidden_dim: int,
activation: Activation,
*,
nonlinearity: float = 0.0,
kernel_init: Initializer | None = None,
weight_factorization: bool = False,
weight_factorization_kwargs: Mapping[str, Any]
| None = None,
compute_dtype: Any = jnp.float32,
parameter_dtype: Any = jnp.float32,
rngs: Rngs,
)
Bases: Module
Apply one gated PirateNet block with an adaptive residual connection.
Attributes:
| Name | Type | Description |
|---|---|---|
layers |
Three hidden-width dense layers. |
|
alpha |
Trainable scalar controlling the block's nonlinear contribution. |
Initialize an adaptive residual block.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
hidden_dim
|
int
|
Shared width of block inputs, gates, and hidden activations. |
required |
activation
|
Activation
|
Point-wise activation callable. |
required |
nonlinearity
|
float
|
Initial value of the trainable residual coefficient |
0.0
|
kernel_init
|
Initializer | None
|
Optional dense-kernel initializer. |
None
|
weight_factorization
|
bool
|
Whether to use random weight-factorized dense layers. |
False
|
weight_factorization_kwargs
|
Mapping[str, Any] | None
|
Options forwarded to :class: |
None
|
compute_dtype
|
Any
|
Data type used for block arithmetic. |
float32
|
parameter_dtype
|
Any
|
Data type used to initialize trainable parameters. |
float32
|
rngs
|
Rngs
|
NNX random streams used for parameter initialization. |
required |
Raises:
| Type | Description |
|---|---|
ValueError
|
If |
__call__
[source]
Evaluate the gated dense stack and adaptive identity interpolation.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
inputs
|
Array
|
Block inputs with final width |
required |
gate_u
|
Array
|
First shallow latent gate with the same shape as |
required |
gate_v
|
Array
|
Second shallow latent gate with the same shape as |
required |
Returns:
| Type | Description |
|---|---|
Array
|
Interpolation between the block inputs and nonlinear block output. |
PirateNet
[source]
PirateNet(
input_dim: int,
output_dim: int,
hidden_dim: int = 256,
num_blocks: int = 2,
activation: ActivationName | Activation = "tanh",
activation_kwargs: Mapping[str, Any] | None = None,
output_activation: ActivationName
| Activation
| None = None,
output_activation_kwargs: Mapping[str, Any]
| None = None,
output_names: Sequence[str] | None = None,
nonlinearity: float | Sequence[float] = 0.0,
initialization: InitializationName
| Initializer
| None = "xavier_uniform",
initialization_kwargs: Mapping[str, Any] | None = None,
weight_factorization: bool = False,
weight_factorization_kwargs: Mapping[str, Any]
| None = None,
periodic_features: bool = False,
periodic_features_kwargs: Mapping[str, Any]
| None = None,
fourier_features: bool = True,
fourier_features_kwargs: Mapping[str, Any]
| None = None,
input_norm: bool = False,
input_norm_eps: float = 1e-08,
compute_dtype: Any = jnp.float32,
parameter_dtype: Any = jnp.float32,
output_dtype: Any = jnp.float32,
*,
rngs: Rngs,
)
Bases: Module
Implement a Physics-Informed Residual Adaptive Network.
PirateNet embeds coordinates into hidden_dim features, constructs two shallow latent gates, and applies a stack
of three-layer adaptive residual blocks. Each block's scalar coefficient is normally initialized to zero, making
every block an exact identity map at initialization before progressively learning a nonlinear contribution.
Attributes:
| Name | Type | Description |
|---|---|---|
periodic_embedding |
Optional fixed periodic coordinate mapping. |
|
embedding |
Optional random Fourier feature mapping. |
|
gate_u |
Dense layer producing the first shallow latent gate. |
|
gate_v |
Dense layer producing the second shallow latent gate. |
|
blocks |
Adaptive residual blocks in evaluation order. |
|
output_layer |
Final linear prediction layer. |
References
Wang, S., Li, B., Chen, Y., and Perdikaris, P. (2024). PirateNets: Physics-informed Deep Learning with Residual Adaptive Networks. Journal of Machine Learning Research, 25(402), 1-51.
Initialize a PirateNet architecture.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
input_dim
|
int
|
Width of the physical input coordinate vector. |
required |
output_dim
|
int
|
Width of the predicted output vector. |
required |
hidden_dim
|
int
|
Shared width of coordinate embeddings, gates, and residual blocks. |
256
|
num_blocks
|
int
|
Number of adaptive residual blocks, each containing three dense layers. |
2
|
activation
|
ActivationName | Activation
|
Hidden activation name or callable. |
'tanh'
|
activation_kwargs
|
Mapping[str, Any] | None
|
Keyword arguments bound to the hidden activation. |
None
|
output_activation
|
ActivationName | Activation | None
|
Optional output activation name or callable. |
None
|
output_activation_kwargs
|
Mapping[str, Any] | None
|
Keyword arguments bound to the output activation. |
None
|
output_names
|
Sequence[str] | None
|
Optional unique names for scalar outputs. |
None
|
nonlinearity
|
float | Sequence[float]
|
Initial adaptive coefficient shared by all blocks or one value per block. |
0.0
|
initialization
|
InitializationName | Initializer | None
|
Dense-kernel initializer name, callable, or |
'xavier_uniform'
|
initialization_kwargs
|
Mapping[str, Any] | None
|
Keyword arguments forwarded to the initializer factory. |
None
|
weight_factorization
|
bool
|
Whether to use random weight-factorized dense layers. |
False
|
weight_factorization_kwargs
|
Mapping[str, Any] | None
|
Options for :class: |
None
|
periodic_features
|
bool
|
Whether to replace selected coordinates with fixed cosine and sine features. |
False
|
periodic_features_kwargs
|
Mapping[str, Any] | None
|
Options for :class: |
None
|
fourier_features
|
bool
|
Whether to use a trainable random Fourier coordinate embedding. |
True
|
fourier_features_kwargs
|
Mapping[str, Any] | None
|
Options for :class: |
None
|
input_norm
|
bool
|
Whether to apply explicit per-input mean and standard deviation arrays. |
False
|
input_norm_eps
|
float
|
Minimum standard deviation used during normalization. |
1e-08
|
compute_dtype
|
Any
|
Data type used for model arithmetic while parameters remain separately configurable. |
float32
|
parameter_dtype
|
Any
|
Data type used to initialize trainable parameters. |
float32
|
output_dtype
|
Any
|
Data type returned by the network. |
float32
|
rngs
|
Rngs
|
NNX random streams used for parameter initialization. |
required |
Raises:
| Type | Description |
|---|---|
ValueError
|
If dimensions, embeddings, output names, nonlinearities, or normalization options are invalid. |
slice_output
[source]
Return an index tuple selecting one named scalar output.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
name
|
str
|
Output name registered in |
required |
Returns:
| Type | Description |
|---|---|
tuple[EllipsisType, slice]
|
An index preserving the selected scalar output dimension. |
Raises:
| Type | Description |
|---|---|
ValueError
|
If output names were not configured. |
KeyError
|
If |
coordinate_features
[source]
coordinate_features(
inputs: Array,
input_mean: Array | None = None,
input_std: Array | None = None,
) -> jax.Array
Transform physical coordinates into fixed-width residual features.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
inputs
|
Array
|
Coordinate array with final width |
required |
input_mean
|
Array | None
|
Optional per-input normalization mean. |
None
|
input_std
|
Array | None
|
Optional per-input normalization standard deviation. |
None
|
Returns:
| Type | Description |
|---|---|
Array
|
Coordinate features with final width |
Raises:
| Type | Description |
|---|---|
ValueError
|
If input width or normalization arrays are invalid. |
__call__
[source]
__call__(
inputs: Array,
input_mean: Array | None = None,
input_std: Array | None = None,
) -> jax.Array
Evaluate PirateNet without mutating model state.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
inputs
|
Array
|
Input array with final width |
required |
input_mean
|
Array | None
|
Optional per-input normalization mean. |
None
|
input_std
|
Array | None
|
Optional per-input normalization standard deviation. |
None
|
Returns:
| Type | Description |
|---|---|
Array
|
Predictions with unchanged leading dimensions and final width |
build_pirate_net
[source]
build_pirate_net(
key: Array,
input_dim: int,
output_dim: int,
input_mean: ArrayLike | None = None,
input_std: ArrayLike | None = None,
*,
precision: PrecisionName
| PrecisionPolicy
| None = None,
**model_kwargs: Any,
) -> InitializedModel
Build normalized PirateNet through the generic initialized-model contract.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
key
|
Array
|
JAX PRNG key for deterministic parameter initialization. |
required |
input_dim
|
int
|
Width of the physical input coordinate vector. |
required |
output_dim
|
int
|
Width of the predicted output vector. |
required |
input_mean
|
ArrayLike | None
|
Optional array-like per-coordinate input normalization mean. |
None
|
input_std
|
ArrayLike | None
|
Optional array-like per-coordinate input normalization standard deviation. |
None
|
precision
|
PrecisionName | PrecisionPolicy | None
|
Optional model precision policy. |
None
|
**model_kwargs
|
Any
|
Architecture options forwarded to :class: |
{}
|
Returns:
| Type | Description |
|---|---|
InitializedModel
|
Pure model application, explicit NNX state, and model-summary callable. |