{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Tutorial: Solving the Kuramoto–Sivashinsky Equation with Averaging Neural Operator\n", "\n", "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/mathLab/PINA/blob/master/tutorials/tutorial10/tutorial.ipynb)\n", "\n", "\n", "In this tutorial, we will build a Neural Operator using the **`AveragingNeuralOperator`** model and the **`SupervisedSolver`**. By the end of this tutorial, you will be able to train a Neural Operator to learn the operator for time-dependent PDEs.\n", "\n", "Let's start by importing the necessary modules." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "## routine needed to run the notebook on Google Colab\n", "try:\n", " import google.colab\n", "\n", " IN_COLAB = True\n", "except:\n", " IN_COLAB = False\n", "if IN_COLAB:\n", " !pip install \"pina-mathlab[tutorial]\"\n", " # get the data\n", " !mkdir \"data\"\n", " !wget \"https://github.com/mathLab/PINA/raw/refs/heads/master/tutorials/tutorial10/data/Data_KS.mat\" -O \"data/Data_KS.mat\"\n", " !wget \"https://github.com/mathLab/PINA/raw/refs/heads/master/tutorials/tutorial10/data/Data_KS2.mat\" -O \"data/Data_KS2.mat\"\n", "\n", "import torch\n", "import matplotlib.pyplot as plt\n", "import warnings\n", "\n", "from scipy import io\n", "from pina import Trainer, LabelTensor\n", "from pina.model import AveragingNeuralOperator\n", "from pina.solver import SupervisedSolver\n", "from pina.problem.zoo import SupervisedProblem\n", "\n", "warnings.filterwarnings(\"ignore\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data Generation\n", "\n", "In this tutorial, we will focus on solving the **Kuramoto-Sivashinsky (KS)** equation, a fourth-order nonlinear PDE. The equation is given by:\n", "\n", "$$\n", "\\frac{\\partial u}{\\partial t}(x,t) = -u(x,t)\\frac{\\partial u}{\\partial x}(x,t) - \\frac{\\partial^{4}u}{\\partial x^{4}}(x,t) - \\frac{\\partial^{2}u}{\\partial x^{2}}(x,t).\n", "$$\n", "\n", "In this equation, $x \\in \\Omega = [0, 64]$ represents a spatial location, and $t \\in \\mathbb{T} = [0, 50]$ represents time. The function $u(x, t)$ is the value of the function at each point in space and time, with $u(x, t) \\in \\mathbb{R}$. We denote the solution space as $\\mathbb{U}$, where $u \\in \\mathbb{U}$.\n", "\n", "We impose Dirichlet boundary conditions on the derivative of $u$ at the boundary of the domain $\\partial \\Omega$:\n", "\n", "$$\n", "\\frac{\\partial u}{\\partial x}(x,t) = 0 \\quad \\forall (x,t) \\in \\partial \\Omega \\times \\mathbb{T}.\n", "$$\n", "\n", "The initial conditions are sampled from a distribution over truncated Fourier series with random coefficients $\\{A_k, \\ell_k, \\phi_k\\}_k$, as follows:\n", "\n", "$$\n", "u(x,0) = \\sum_{k=1}^N A_k \\sin\\left(2 \\pi \\frac{\\ell_k x}{L} + \\phi_k\\right),\n", "$$\n", "\n", "where:\n", "- $A_k \\in [-0.4, -0.3]$,\n", "- $\\ell_k = 2$,\n", "- $\\phi_k = 2\\pi \\quad \\forall k=1,\\dots,N$.\n", "\n", "We have already generated data for different initial conditions. The goal is to build a Neural Operator that, given $u(x,t)$, outputs $u(x,t+\\delta)$, where $\\delta$ is a fixed time step. \n", "\n", "We will cover the Neural Operator architecture later, but for now, let’s start by importing the data.\n", "\n", "**Note:**\n", "The numerical integration is obtained using a pseudospectral method for spatial derivative discretization and implicit Runge-Kutta 5 for temporal dynamics." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Data Loaded\n", " shape initial condition: torch.Size([100, 12800, 3])\n", " shape solution: torch.Size([100, 12800, 1])\n" ] } ], "source": [ "# load data\n", "data = io.loadmat(\"data/Data_KS.mat\")\n", "\n", "# converting to label tensor\n", "initial_cond_train = LabelTensor(\n", " torch.tensor(data[\"initial_cond_train\"], dtype=torch.float),\n", " [\"t\", \"x\", \"u0\"],\n", ")\n", "initial_cond_test = LabelTensor(\n", " torch.tensor(data[\"initial_cond_test\"], dtype=torch.float), [\"t\", \"x\", \"u0\"]\n", ")\n", "sol_train = LabelTensor(\n", " torch.tensor(data[\"sol_train\"], dtype=torch.float), [\"u\"]\n", ")\n", "sol_test = LabelTensor(torch.tensor(data[\"sol_test\"], dtype=torch.float), [\"u\"])\n", "\n", "print(\"Data Loaded\")\n", "print(f\" shape initial condition: {initial_cond_train.shape}\")\n", "print(f\" shape solution: {sol_train.shape}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The data is saved in the form `[B, N, D]`, where:\n", "- `B` is the batch size (i.e., how many initial conditions we sample),\n", "- `N` is the number of points in the mesh (which is the product of the discretization in $x$ times the one in $t$),\n", "- `D` is the dimension of the problem (in this case, we have three variables: $[u, t, x]$).\n", "\n", "We are now going to plot some trajectories!" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# helper function\n", "def plot_trajectory(coords, real, no_sol=None):\n", " # find the x-t shapes\n", " dim_x = len(torch.unique(coords.extract(\"x\")))\n", " dim_t = len(torch.unique(coords.extract(\"t\")))\n", " # if we don't have the Neural Operator solution we simply plot the real one\n", " if no_sol is None:\n", " fig, axs = plt.subplots(1, 1, figsize=(15, 5), sharex=True, sharey=True)\n", " c = axs.imshow(\n", " real.reshape(dim_t, dim_x).T.detach(),\n", " extent=[0, 50, 0, 64],\n", " cmap=\"PuOr_r\",\n", " aspect=\"auto\",\n", " )\n", " axs.set_title(\"Real solution\")\n", " fig.colorbar(c, ax=axs)\n", " axs.set_xlabel(\"t\")\n", " axs.set_ylabel(\"x\")\n", " # otherwise we plot the real one, the Neural Operator one, and their difference\n", " else:\n", " fig, axs = plt.subplots(1, 3, figsize=(15, 5), sharex=True, sharey=True)\n", " axs[0].imshow(\n", " real.reshape(dim_t, dim_x).T.detach(),\n", " extent=[0, 50, 0, 64],\n", " cmap=\"PuOr_r\",\n", " aspect=\"auto\",\n", " )\n", " axs[0].set_title(\"Real solution\")\n", " axs[1].imshow(\n", " no_sol.reshape(dim_t, dim_x).T.detach(),\n", " extent=[0, 50, 0, 64],\n", " cmap=\"PuOr_r\",\n", " aspect=\"auto\",\n", " )\n", " axs[1].set_title(\"NO solution\")\n", " c = axs[2].imshow(\n", " (real - no_sol).abs().reshape(dim_t, dim_x).T.detach(),\n", " extent=[0, 50, 0, 64],\n", " cmap=\"PuOr_r\",\n", " aspect=\"auto\",\n", " )\n", " axs[2].set_title(\"Absolute difference\")\n", " fig.colorbar(c, ax=axs.ravel().tolist())\n", " for ax in axs:\n", " ax.set_xlabel(\"t\")\n", " ax.set_ylabel(\"x\")\n", " plt.show()\n", "\n", "\n", "# a sample trajectory (we use the sample 5, feel free to change)\n", "sample_number = 20\n", "plot_trajectory(\n", " coords=initial_cond_train[sample_number].extract([\"x\", \"t\"]),\n", " real=sol_train[sample_number].extract(\"u\"),\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see, as time progresses, the solution becomes chaotic, making it very difficult to learn! We will now focus on building a Neural Operator using the `SupervisedSolver` class to tackle this problem.\n", "\n", "## Averaging Neural Operator\n", "\n", "We will build a neural operator $\\texttt{NO}$, which takes the solution at time $t=0$ for any $x\\in\\Omega$, the time $t$ at which we want to compute the solution, and gives back the solution to the KS equation $u(x, t)$. Mathematically:\n", "\n", "$$\n", "\\texttt{NO}_\\theta : \\mathbb{U} \\rightarrow \\mathbb{U},\n", "$$\n", "\n", "such that\n", "\n", "$$\n", "\\texttt{NO}_\\theta[u(t=0)](x, t) \\rightarrow u(x, t).\n", "$$\n", "\n", "There are many ways to approximate the following operator, for example, by using a 2D [FNO](https://mathlab.github.io/PINA/_rst/model/fourier_neural_operator.html) (for regular meshes), a [DeepOnet](https://mathlab.github.io/PINA/_rst/model/deeponet.html), [Continuous Convolutional Neural Operator](https://mathlab.github.io/PINA/_rst/model/block/convolution.html), or [MIONet](https://mathlab.github.io/PINA/_rst/model/mionet.html). In this tutorial, we will use the *Averaging Neural Operator* presented in [*The Nonlocal Neural Operator: Universal Approximation*](https://arxiv.org/abs/2304.13221), which is a [Kernel Neural Operator](https://mathlab.github.io/PINA/_rst/model/kernel_neural_operator.html) with an integral kernel:\n", "\n", "$$\n", "K(v) = \\sigma\\left(Wv(x) + b + \\frac{1}{|\\Omega|}\\int_\\Omega v(y)dy\\right)\n", "$$\n", "\n", "where:\n", "\n", "* $v(x) \\in \\mathbb{R}^{\\rm{emb}}$ is the update for a function $v$, with $\\mathbb{R}^{\\rm{emb}}$ being the embedding (hidden) size.\n", "* $\\sigma$ is a non-linear activation function.\n", "* $W \\in \\mathbb{R}^{\\rm{emb} \\times \\rm{emb}}$ is a tunable matrix.\n", "* $b \\in \\mathbb{R}^{\\rm{emb}}$ is a tunable bias.\n", "\n", "In PINA, many Kernel Neural Operators are already implemented. The modular components of the [Kernel Neural Operator](https://mathlab.github.io/PINA/_rst/model/kernel_neural_operator.html) class allow you to create new ones by composing base kernel layers.\n", "\n", "**Note:** We will use the already built class `AveragingNeuralOperator`. As a constructive exercise, try to use the [KernelNeuralOperator](https://mathlab.github.io/PINA/_rst/model/kernel_neural_operator.html) class to build a kernel neural operator from scratch. You might employ the different layers that we have in PINA, such as [FeedForward](https://mathlab.github.io/PINA/_rst/model/feed_forward.html) and [AveragingNeuralOperator](https://mathlab.github.io/PINA/_rst/model/average_neural_operator.html) layers." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "class SIREN(torch.nn.Module):\n", " def forward(self, x):\n", " return torch.sin(x)\n", "\n", "\n", "embedding_dimesion = 40 # hyperparameter embedding dimension\n", "input_dimension = 3 # ['u', 'x', 't']\n", "number_of_coordinates = 2 # ['x', 't']\n", "lifting_net = torch.nn.Linear(input_dimension, embedding_dimesion)\n", "projecting_net = torch.nn.Linear(embedding_dimesion + number_of_coordinates, 1)\n", "model = AveragingNeuralOperator(\n", " lifting_net=lifting_net,\n", " projecting_net=projecting_net,\n", " coordinates_indices=[\"x\", \"t\"],\n", " field_indices=[\"u0\"],\n", " n_layers=4,\n", " func=SIREN,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Super easy! Notice that we use the `SIREN` activation function, which is discussed in more detail in the paper [Implicit Neural Representations with Periodic Activation Functions](https://arxiv.org/abs/2006.09661).\n", "\n", "## Solving the KS problem\n", "\n", "We will now focus on solving the KS equation using the `SupervisedSolver` class and the `AveragingNeuralOperator` model. As done in the [FNO tutorial](https://github.com/mathLab/PINA/blob/master/tutorials/tutorial5/tutorial.ipynb), we now create the Neural Operator problem class with `SupervisedProblem`." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "GPU available: True (mps), used: False\n", "TPU available: False, using: 0 TPU cores\n", "HPU available: False, using: 0 HPUs\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "38a4c0eac050435283e8250fadec6764", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Training: | | 0/? [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sample_number = 2\n", "no_sol = solver(initial_cond_test)\n", "plot_trajectory(\n", " coords=initial_cond_test[sample_number].extract([\"x\", \"t\"]),\n", " real=sol_test[sample_number].extract(\"u\"),\n", " no_sol=no_sol[5],\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see, we can obtain nice results considering the small training time and the difficulty of the problem! \n", "Let's take a look at the training and testing error:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training error: 0.114\n", "Testing error: 0.106\n" ] } ], "source": [ "from pina.loss import PowerLoss\n", "\n", "error_metric = PowerLoss(p=2) # we use the MSE loss\n", "\n", "with torch.no_grad():\n", " no_sol_train = solver(initial_cond_train)\n", " err_train = error_metric(\n", " sol_train.extract(\"u\"), no_sol_train\n", " ).mean() # we average the error over trajectories\n", " no_sol_test = solver(initial_cond_test)\n", " err_test = error_metric(\n", " sol_test.extract(\"u\"), no_sol_test\n", " ).mean() # we average the error over trajectories\n", " print(f\"Training error: {float(err_train):.3f}\")\n", " print(f\"Testing error: {float(err_test):.3f}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see, the error is pretty small, which aligns with the observations from the previous plots." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## What's Next?\n", "\n", "You have completed the tutorial on solving time-dependent PDEs using Neural Operators in **PINA**. Great job! Here are some potential next steps you can explore:\n", "\n", "1. **Train the network for longer or with different layer sizes**: Experiment with various configurations, such as adjusting the number of layers or hidden dimensions, to further improve accuracy and observe the impact on performance.\n", "\n", "2. **Use a more challenging dataset**: Try using the more complex dataset [Data_KS2.mat](dat/Data_KS2.mat) where $A_k \\in [-0.5, 0.5]$, $\\ell_k \\in [1, 2, 3]$, and $\\phi_k \\in [0, 2\\pi]$ for a more difficult task. This dataset may require longer training and testing.\n", "\n", "3. **... and many more...**: Explore other models, such as the [FNO](https://mathlab.github.io/PINA/_rst/models/fno.html), [DeepOnet](https://mathlab.github.io/PINA/_rst/models/deeponet.html), or implement your own operator using the [KernelNeuralOperator](https://mathlab.github.io/PINA/_rst/models/base_no.html) class to compare performance and find the best model for your task.\n", "\n", "For more resources and tutorials, check out the [PINA Documentation](https://mathlab.github.io/PINA/)." ] } ], "metadata": { "kernelspec": { "display_name": "pina", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.21" } }, "nbformat": 4, "nbformat_minor": 2 }