{ "cells": [ { "cell_type": "markdown", "id": "fc571f68-3a5b-49d6-88d6-66ef6c2dab97", "metadata": {}, "source": [ "# Example: 1D Oscillator - Part 4/5\n", "\n", "- Author: Dr. Daning Huang\n", "- Date: 01/03/2026\n", "- Updated: 05/07/2026" ] }, { "cell_type": "markdown", "id": "7ac8fbcf-4201-4519-a33f-3ccd1b9bafc3", "metadata": {}, "source": [ "In this part, we explore the use of sequential dynamics models (SDMs) for data with time delay.\n", "\n", "Meanwhile, since the model starts to be more complex, we will also show how to visualize the model structure to understand/debug the model." ] }, { "cell_type": "markdown", "id": "0762eb84-cc1a-4fbd-9b1f-35b267996462", "metadata": {}, "source": [ "## Formulation\n", "\n", "Consider $T$ steps of observations $x_{1:T}$ and inputs $u_{1:T}$, SDMs map these to a $T$-step sequence of latent states $z_{1:T}$, and predict $z_{T+1}$. Formally, we can write\n", "\n", "- Encoder: $z_{1:T}=f_E(x_{1:T}, u_{1:T})$\n", "- Dynamics: $z_{T+1}=f_P(z_{1:T})$, then assemble $z_{2:T+1}=[z_{2:T}, z_{T+1}]$\n", "- Decoder: $x_{2:T+1}=f_D(z_{2:T+1})$\n", "\n", "In practice, either $f_E$ or $f_P$ can be sequential modules, e.g., RNNs. For technical details, one can refer to the [theory documentation](https://dymad.readthedocs.io/en/latest/theory/architecture.html).\n", "\n", "In this example, we demonstrate two SDM architectures,\n", "\n", "- Stepwise MLP's as encoder and decoder, RNN as processor\n", "- RNN as encoder, brutal force MLP as processor, stepwise MLP as decoder" ] }, { "cell_type": "markdown", "id": "1d83f2b2-2290-47ae-ad7d-01fcf95965bd", "metadata": {}, "source": [ "## Preparation\n", "\n", "Same drill like before." ] }, { "cell_type": "code", "execution_count": 1, "id": "6e8f3d73-f86b-4ff3-ac79-17f695bd089e", "metadata": {}, "outputs": [], "source": [ "import copy\n", "import warnings\n", "warnings.filterwarnings('ignore')\n", "import numpy as np\n", "import torch\n", "\n", "from dymad.io import load_model, visualize_model # New function\n", "from dymad.models import DSDM # New model\n", "from dymad.training import NODETrainer # For discrete-time model\n", "from dymad.utils import plot_trajectory, TrajectorySampler" ] }, { "cell_type": "code", "execution_count": 2, "id": "abd1ab44-5503-4bc2-9b0c-47701cfa6860", "metadata": {}, "outputs": [], "source": [ "B = 128 # Number of trajectories\n", "N = 501 # Number of steps\n", "t_grid = np.linspace(0, 5, N)\n", "\n", "A = np.array([\n", " [0., 1.],\n", " [-1., -0.1]])\n", "def f(t, z, u): # Define the dynamics\n", " return (z @ A.T) + u\n", "g = lambda t, z, u: z # Define the observation\n", "\n", "# Chirp input for training\n", "config_chr = {\n", " \"control\" : {\n", " \"kind\": \"chirp\",\n", " \"params\": {\n", " \"t1\": 4.0,\n", " \"freq_range\": (0.5, 2.0),\n", " \"amp_range\": (0.5, 1.0),\n", " \"phase_range\": (0.0, 360.0)}}}\n", "\n", "# Random Gaussian input for testing/generalization\n", "config_gau = {\n", " \"control\" : {\n", " \"kind\": \"gaussian\",\n", " \"params\": {\n", " \"mean\": 0.5,\n", " \"std\": 1.0,\n", " \"t1\": 4.0,\n", " \"dt\": 0.2,\n", " \"mode\": \"zoh\"}}}\n", "\n", "# Generate data\n", "sampler_chr = TrajectorySampler(f, g, config='lti_data.yaml', config_mod=config_chr)\n", "ts, zs, us, xs = sampler_chr.sample(t_grid, batch=B, save='./data/lti.npz')\n", "\n", "sampler_gau = TrajectorySampler(f, g, config='lti_data.yaml', config_mod=config_gau)" ] }, { "cell_type": "markdown", "id": "fb53352a-86df-4df9-aa6e-e14690854059", "metadata": {}, "source": [ "Set up the options for the trainer, where\n", "\n", "- We only consider time delay in data transformation for simplicity.\n", "- The `latent_dimension` is the dimension of $z_{1:T}$; in the current case $T=2$ so each $z$ is 4-dimensional.\n", "- Note the new options `autoencoder_type` and `processor_type` that specifies the SDM.\n", "- The optimizer settings now sit in a single `phases` entry.\n", "- We use trajectory chopping and sweeping to enhance the training." ] }, { "cell_type": "code", "execution_count": 3, "id": "65612056-38a2-453f-9065-1d117e42f69e", "metadata": {}, "outputs": [], "source": [ "opt_case1 = {\n", " \"transform_x\": {\"type\": \"delay\", \"delay\": 1},\n", " \"transform_u\": {\"type\": \"delay\", \"delay\": 1},\n", " \"model\": {\n", " \"name\" : 'ltd_sdm_smp',\n", " \"autoencoder_type\" : 'seq_smp', # Stepwise MLP as encoder/decoder\n", " \"encoder_layers\" : 1,\n", " \"decoder_layers\" : 1,\n", " \"processor_layers\" : 1, # RNN as processor by default\n", " \"hidden_dimension\" : 16,\n", " \"latent_dimension\" : 8,\n", " \"activation\" : \"none\", # Linear model as the underlying data is linear\n", " \"weight_init\" : \"xavier_uniform\",\n", " \"gain\" : 0.01 # Smaller initialization for more stable training\n", " },\n", " \"criterion\": {\n", " \"dynamics\" : {\"weight\" : 1.0},\n", " \"recon\" : {\"weight\" : 1.0}\n", " },\n", " \"phases\" : [{\n", " \"type\": \"optimizer\",\n", " \"name\": \"NODE\",\n", " \"trainer\": \"NODE\",\n", " \"n_epochs\": 500,\n", " \"save_interval\": 10,\n", " \"load_checkpoint\": False,\n", " \"learning_rate\": 5e-3,\n", " \"decay_rate\": 0.999,\n", " \"chop_mode\": \"unfold\",\n", " \"chop_step\": 0.5,\n", " \"sweep_lengths\": [3, 5, 7],\n", " \"sweep_epoch_step\": 200\n", " }]\n", "}\n", "opt_case2 = copy.deepcopy(opt_case1)\n", "opt_case2[\"model\"][\"name\"] = 'ltd_sdm_std'\n", "opt_case2[\"model\"][\"autoencoder_type\"] = 'seq_std' # RNN as encoder, MLP as decoder\n", "opt_case2[\"model\"][\"processor_type\"] = 'mlp_smp' # Brutal force MLP as processor\n", "\n", "opts = [opt_case1, opt_case2]\n", "IDX = [0, 1]\n", "labels = [opts[_i][\"model\"]['name'] for _i in IDX]" ] }, { "cell_type": "markdown", "id": "46c1d4eb-2b70-406c-9430-bb3a91e00684", "metadata": {}, "source": [ "## Training" ] }, { "cell_type": "code", "execution_count": 4, "id": "d2f7c8c3-1f92-4aec-ae08-f5243bba265b", "metadata": {}, "outputs": [], "source": [ "config_path = 'lti_model.yaml'\n", "for _i in IDX:\n", " trainer = NODETrainer(config_path, DSDM, config_mod=opts[_i])\n", " trainer.train();" ] }, { "cell_type": "markdown", "id": "8b7ba2b8-1948-4cdc-a991-508258c6519e", "metadata": {}, "source": [ "## Results\n", "\n", "### Prediction\n", "\n", "We first check the model prediction. Again due to time delay, `t_data` is reduced by 1 step during prediction. Both models appear to work OK." ] }, { "cell_type": "code", "execution_count": 5, "id": "a6595cf4-39de-4a93-9e6c-713e1d2b5856", "metadata": {}, "outputs": [ { "data": { "image/png": "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AtbN3a+yMS8E4+yuvfZaVc1bv+8wTo/1lzp06FCHW21diGgSBEG4BMHBwSogPCoqCq+//rpqi6FnxYoVGD16NFq3bo2PP/7YUAeqPH6NPdF3Wlv0vLFVhSKFv87YgL9f36YypATrg6UENn59EP+9vQN56QWG/ofGmXLG7N27F926dTP0j6N1kxYnWketqX9cfSCiSRAEoYrwgvTss8+qoFsKJGbX6WGsJANvWYD3ySefNNTHuRR7lpxEUZ4WcYdSVbD46o/2KMuTYB2wyvySZzea1F4K6+iH69/qh8AW3hVeP3/+fJURp++vyIKs//77r6r6LTFttY/8w4IgCNWEgbasIk6hxNk9Y6D0MKiURQQpqFjniZaoylx3eljTySPQxfCYhTMXPb4OW+Yfvqh7RrBsWKJi928n8HulpQS6Vai9VFhYqGovsX8c2wERWptYTuDqq6+ul99gjfy/vTOBkqq69v6uqh6q55FmbAYZBRQBkShRARHUqCHJUmOMUR76XEZQJL4XWRrQmAgvJg5LjUmMYybxxel9KkSDDOKIoAIKCAjS0PREz/NQ/a19uqv63O4Gqvue23Vunf9vrbuqurr71K06557zv3vvszdEEwAA2Mj3xHEl77zzDn322WeiFEswaJyF0ssvvyxinsaNGycKCHNZi85wAswfPHAunX3dePKntFWkD7S00s41B+nF2zfStpf3imSaIHqoKq6lN375EW19cS+1trTFI2WPSKXv/bprKgEmLy9P5FniTPZBOB/Tu+++S8OGDevz8zcZpBwA2oCt0/qCvgmfwsJCETzOOZ86FxXnlAVcqoXjogYMsCbHZFgcbX/9AO1484AlVUFcYoxIU5AzOkN537A1q+xwtSg+3PZYTS1NLTR0Sg5Nnt99WgUQHsfrG3a/vnznZlFol/XRpO+OpMnfH0W+TqkEGK6PyDvhgrvjeAyxa3jhwoV9+lmijQDKqJwciCa9wcKsL+ibntPU1CRcd3/4wx+EJapzbBRbntgy1V0dsJrSetr20l76auMRag20kj81jn74yEyR48lO33ACzq82HWkTSHnVVHakOhR43JnpPx5Hp10yosefG4TXN19tOEyfvrKPzv/pJBowtqsYbm5uphUrVtD9998feo2tSi+99BJNnTq1T84/mglANJ0ciCa9wcKsL+gbe3CpFrY+PfPMM5aSLBwL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11MzWT63qiBr7puWllZ18WawNEUtjoomTmj5wx/+kDZs2EDp6enitfLycpo1axa98MIL1K9fPyffHgCtA3nlQFuT3HMmWpo6zkvdwiy3oszS5EDfqMaJum5iTLYQNSv6zKamEzEBR73/ixcvpqqqKvriiy+otLRUHDt37qTKykq69dZbnXxrAFyVZ8ekidVqzTAjpkkOBldWe84B8WB1z5GWOHHdBIW2qhg71UWFgSGWprVr19K///1vOvXUU0OvjR8/nh5//HGaO3euk28NgPa1w0wVTfIiouq7dId7zrnxoy7lgJzcstUFgeCKLE3tn9uZGyI9xyPoHY7ek3Gtuc5pBhh+rXMdOgB0xvnaYabWnjMjI7hcSkVnS6W1jAoZZGlSnaep47mmwxHoKJpmz55Nt912G+Xn54deO3LkCN1+++10wQUXOPnWALhANJk5sTqRddoN7rngGNK6YK8bUg7IxZk9aoW8sjIqCASPWhydXh577DERv8SJLUeOHCmOESNGiNceffRRJ98aAP1TDjiQnNBtu+fkxSX63XMeFyS3NC/lgDOCtuO5psMR6BjTlJubK7J+c1zT7t27xWsc3zRnzhwn3xYA5ThT1FO+YzZnZrUkEzRq9xwpDgQ3M+WAk+45dXmaYGmKVhzP08SBhRdeeKE4AIiKhd6JRc+gidUZS5ObYpragqzloGv7opuMiWlyJBDcQUsTds9FF46459555x2xS47dcJ2pqKgQCS7fffddJ94aAFfunjNpYjU9pqlV0ed2QnTLzei6e87JlANIbglOhiPTy8MPP0w33ngjpaamdvldWloa3XTTTfTggw868dYAuHL3nF2rg5vwOeDqlN0qulqaVI8hY91zFkGiKuVA26MzZVT0HI9AI9H0+eef00UXXXTc33OOJi6tAoBbcHr3nEmWJvmzqso84gr3nOLNBI4kt3SFe86ZMiohK6BiQWvStW0CjoimwsLCbvMzBYmJiaHi4mIn3hoA1+yec2L3k/vcc+pjmuT4M22FtwL/nBNlVNyQcsCJVAvymFHjOoV7LlpxZHoZPHiwKJdyPLZv304DBw504q0BcI2lyVpqwdTklmRcygFH3HPKAsHVJx511NKkqK9V943s5tN0OAKdds9dcskl9Itf/EK46Px+v+V3dXV1tGLFCrr00kudeGsAXFSwt+O5QZrJ4q54e381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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sampler = TrajectorySampler(f, g, config='lti_data.yaml', config_mod=config_gau)\n", "\n", "ts, xs, us, ys = sampler.sample(t_grid, batch=1)\n", "x_data, t_data, u_data = xs[0], ts[0], us[0]\n", "\n", "res = [x_data]\n", "for _i in IDX:\n", " _, prd_func = load_model(DSDM, f'{labels[_i]}.pt')\n", " with torch.no_grad():\n", " _pred = prd_func(x_data, t_data[:-1], u=u_data)\n", " res.append(_pred)\n", "\n", "plot_trajectory(\n", " np.array(res), t_data, \"LTD\",\n", " us=u_data, labels=['Truth']+labels, ifclose=False);" ] }, { "cell_type": "markdown", "id": "ee2e4b6f-a1d2-4d67-94a6-df46684afb76", "metadata": {}, "source": [ "### Model visualization\n", "\n", "`DyMAD` provides `visualize_model` to show the architecture of a model, including the input/output dimensions of each layer. The tool is based on the `torchview` package.\n", "\n", "Unfortunately, at the point of writing, the tool has two limitations:\n", "\n", "- It cannot differentiate among inputs and among outputs, so they are uniformly labelled as `input-tensor`s and `output-tensor`s, respectively. One needs to infer the specific input/output based on the graph.\n", "- The inputs go through some bookkeeping blocks such as `__getitem__`, which is only for generating dimensionally consistent data. One should ignore these blocks." ] }, { "cell_type": "code", "execution_count": 6, "id": "109417b7-5390-4e4b-ac39-a45e191af996", "metadata": {}, "outputs": [], "source": [ "graphs = []\n", "for _i in IDX:\n", " model_graph = visualize_model(\n", " mdl_class=DSDM, # Model class\n", " checkpoint_path=f'{labels[_i]}.pt', # Checkpoint of the model\n", " ref_data='./data/lti.npz', # Reference dataset to determine input dimensions\n", " depth=1, # Level of details, the higher the more\n", " ifsave=False)\n", " graphs.append(model_graph)" ] }, { "cell_type": "markdown", "id": "cecab3c5-7221-47c7-979d-dd5a8bf8ae65", "metadata": {}, "source": [ "Below is the first case. The left is the initial condition $x_0$, given the dimension (raw $x$ is 2D, time delay $T=2$, so $4=2\\times 2$); the right is the input $u$ (raw $u$ is 1D and $2=1\\times 2$).\n", "\n", "Next, we see that $x_0$ and $u$ are passed into `StepwiseModel`, the encoder, as we have specified. The single output on the right produced by `StepwiseModel` is the latent states $z$. The output also passes to another `StepwiseModel`, the decoder, again as we have specified; the output is the decoded $x$.\n", "\n", "The remaining branch is then apparently for `SimpleRNN` as processor. It takes input dimension of 8, for $z_{1:2}$, and returns dimension 4 for $z_3$. The `__getitem__` obtains $z_2$ and later `cat` concatenates the two pieces into $z_{2:3}$, of dimension 8." ] }, { "cell_type": "code", "execution_count": 7, "id": "5d188c59-bd1d-4f42-8a79-aa9382e1f1e1", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "model\n", "\n", "\n", "\n", "1\n", "\n", "\n", "input-tensor\n", "depth:0\n", "\n", "(4,)\n", "\n", "\n", "\n", "3\n", "\n", "\n", "reshape\n", "depth:1\n", "\n", "input:\n", "\n", "(4,) \n", "\n", "output: \n", "\n", "(1, 1, 4) \n", "\n", "\n", "\n", "1->3\n", "\n", "\n", "\n", "\n", "\n", "2\n", "\n", "\n", "input-tensor\n", "depth:0\n", "\n", "(2,)\n", "\n", "\n", "\n", "6\n", "\n", "\n", "reshape\n", "depth:1\n", "\n", "input:\n", "\n", "(2,) \n", "\n", "output: \n", "\n", "(1, 1, 2) \n", "\n", "\n", "\n", "2->6\n", "\n", "\n", "\n", "\n", "\n", "9\n", "\n", "\n", "__getitem__\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 1, 4) \n", "\n", "output: \n", "\n", "(1, 4) \n", "\n", "\n", "\n", "3->9\n", "\n", "\n", "\n", "\n", "\n", "7\n", "\n", "\n", "expand\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 1, 2) \n", "\n", "output: \n", "\n", "(1, 1, 2) \n", "\n", "\n", "\n", "6->7\n", "\n", "\n", "\n", "\n", "\n", "10\n", "\n", "\n", "__getitem__\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 1, 2) \n", "\n", "output: \n", "\n", "(1, 2) \n", "\n", "\n", "\n", "7->10\n", "\n", "\n", "\n", "\n", "\n", "12\n", "\n", "\n", "stack\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 4) \n", "\n", "output: \n", "\n", "(1, 1, 4) \n", "\n", "\n", "\n", "9->12\n", "\n", "\n", "\n", "\n", "\n", "13\n", "\n", "\n", "stack\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 2) \n", "\n", "output: \n", "\n", "(1, 1, 2) \n", "\n", "\n", "\n", "10->13\n", "\n", "\n", "\n", "\n", "\n", "15\n", "\n", "\n", "__getitem__\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 1, 4) \n", "\n", "output: \n", "\n", "(1, 4) \n", "\n", "\n", "\n", "12->15\n", "\n", "\n", "\n", "\n", "\n", "16\n", "\n", "\n", "__getitem__\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 1, 2) \n", "\n", "output: \n", "\n", "(1, 2) \n", "\n", "\n", "\n", "13->16\n", "\n", "\n", "\n", "\n", "\n", "18\n", "\n", "\n", "StepwiseModel\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 4), (1, 2) \n", "\n", "output: \n", "\n", "(1, 8) \n", "\n", "\n", "\n", "15->18\n", "\n", "\n", "\n", "\n", "\n", "16->18\n", "\n", "\n", "\n", "\n", "\n", "19\n", "\n", "\n", "SimpleRNN\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 8) \n", "\n", "output: \n", "\n", "(1, 4) \n", "\n", "\n", "\n", "18->19\n", "\n", "\n", "\n", "\n", "\n", "20\n", "\n", "\n", "__getitem__\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 8) \n", "\n", "output: \n", "\n", "(1, 4) \n", "\n", "\n", "\n", "18->20\n", "\n", "\n", "\n", "\n", "\n", "23\n", "\n", "\n", "StepwiseModel\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 8) \n", "\n", "output: \n", "\n", "(1, 4) \n", "\n", "\n", "\n", "18->23\n", "\n", "\n", "\n", "\n", "\n", "25\n", "\n", "\n", "output-tensor\n", "depth:0\n", "\n", "(1, 8)\n", "\n", "\n", "\n", "18->25\n", "\n", "\n", "\n", "\n", "\n", "21\n", "\n", "\n", "cat\n", "depth:1\n", "\n", "input:\n", "\n", "2 x (1, 4) \n", "\n", "output: \n", "\n", "(1, 8) \n", "\n", "\n", "\n", "19->21\n", "\n", "\n", "\n", "\n", "\n", "20->21\n", "\n", "\n", "\n", "\n", "\n", "22\n", "\n", "\n", "output-tensor\n", "depth:0\n", "\n", "(1, 8)\n", "\n", "\n", "\n", "21->22\n", "\n", "\n", "\n", "\n", "\n", "24\n", "\n", "\n", "output-tensor\n", "depth:0\n", "\n", "(1, 4)\n", "\n", "\n", "\n", "23->24\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "graphs[0] # ltd_sdm_smp" ] }, { "cell_type": "markdown", "id": "9e946222-04fe-4b70-88cf-cf353fbd7aef", "metadata": {}, "source": [ "Next, the second case. Using the same reasoning as before, the inputs from left to right are $x$ and $u$, respectively. This time `SimpleRNN` is used as encoder, and its output is passed to a brutal force `MLP` for processing and a `StepwiseModel` to decode." ] }, { "cell_type": "code", "execution_count": 8, "id": "abb34838-015f-4339-bdba-7501809f0018", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "model\n", "\n", "\n", "\n", "1\n", "\n", "\n", "input-tensor\n", "depth:0\n", "\n", "(4,)\n", "\n", "\n", "\n", "3\n", "\n", "\n", "reshape\n", "depth:1\n", "\n", "input:\n", "\n", "(4,) \n", "\n", "output: \n", "\n", "(1, 1, 4) \n", "\n", "\n", "\n", "1->3\n", "\n", "\n", "\n", "\n", "\n", "2\n", "\n", "\n", "input-tensor\n", "depth:0\n", "\n", "(2,)\n", "\n", "\n", "\n", "6\n", "\n", "\n", "reshape\n", "depth:1\n", "\n", "input:\n", "\n", "(2,) \n", "\n", "output: \n", "\n", "(1, 1, 2) \n", "\n", "\n", "\n", "2->6\n", "\n", "\n", "\n", "\n", "\n", "9\n", "\n", "\n", "__getitem__\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 1, 4) \n", "\n", "output: \n", "\n", "(1, 4) \n", "\n", "\n", "\n", "3->9\n", "\n", "\n", "\n", "\n", "\n", "7\n", "\n", "\n", "expand\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 1, 2) \n", "\n", "output: \n", "\n", "(1, 1, 2) \n", "\n", "\n", "\n", "6->7\n", "\n", "\n", "\n", "\n", "\n", "10\n", "\n", "\n", "__getitem__\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 1, 2) \n", "\n", "output: \n", "\n", "(1, 2) \n", "\n", "\n", "\n", "7->10\n", "\n", "\n", "\n", "\n", "\n", "12\n", "\n", "\n", "stack\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 4) \n", "\n", "output: \n", "\n", "(1, 1, 4) \n", "\n", "\n", "\n", "9->12\n", "\n", "\n", "\n", "\n", "\n", "13\n", "\n", "\n", "stack\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 2) \n", "\n", "output: \n", "\n", "(1, 1, 2) \n", "\n", "\n", "\n", "10->13\n", "\n", "\n", "\n", "\n", "\n", "15\n", "\n", "\n", "__getitem__\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 1, 4) \n", "\n", "output: \n", "\n", "(1, 4) \n", "\n", "\n", "\n", "12->15\n", "\n", "\n", "\n", "\n", "\n", "16\n", "\n", "\n", "__getitem__\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 1, 2) \n", "\n", "output: \n", "\n", "(1, 2) \n", "\n", "\n", "\n", "13->16\n", "\n", "\n", "\n", "\n", "\n", "18\n", "\n", "\n", "SimpleRNN\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 4), (1, 2) \n", "\n", "output: \n", "\n", "(1, 8) \n", "\n", "\n", "\n", "15->18\n", "\n", "\n", "\n", "\n", "\n", "16->18\n", "\n", "\n", "\n", "\n", "\n", "19\n", "\n", "\n", "MLP\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 8) \n", "\n", "output: \n", "\n", "(1, 4) \n", "\n", "\n", "\n", "18->19\n", "\n", "\n", "\n", "\n", "\n", "20\n", "\n", "\n", "__getitem__\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 8) \n", "\n", "output: \n", "\n", "(1, 4) \n", "\n", "\n", "\n", "18->20\n", "\n", "\n", "\n", "\n", "\n", "23\n", "\n", "\n", "StepwiseModel\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 8) \n", "\n", "output: \n", "\n", "(1, 4) \n", "\n", "\n", "\n", "18->23\n", "\n", "\n", "\n", "\n", "\n", "25\n", "\n", "\n", "output-tensor\n", "depth:0\n", "\n", "(1, 8)\n", "\n", "\n", "\n", "18->25\n", "\n", "\n", "\n", "\n", "\n", "21\n", "\n", "\n", "cat\n", "depth:1\n", "\n", "input:\n", "\n", "2 x (1, 4) \n", "\n", "output: \n", "\n", "(1, 8) \n", "\n", "\n", "\n", "19->21\n", "\n", "\n", "\n", "\n", "\n", "20->21\n", "\n", "\n", "\n", "\n", "\n", "22\n", "\n", "\n", "output-tensor\n", "depth:0\n", "\n", "(1, 8)\n", "\n", "\n", "\n", "21->22\n", "\n", "\n", "\n", "\n", "\n", "24\n", "\n", "\n", "output-tensor\n", "depth:0\n", "\n", "(1, 4)\n", "\n", "\n", "\n", "23->24\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "graphs[1] # ltd_sdm_std" ] }, { "cell_type": "markdown", "id": "eb34ff8b-67a4-4c40-8c0e-302d1bea346c", "metadata": {}, "source": [ "The models in this example do not consider time, so the time data path is not shown. However, we can set `show_all_paths=True` to visualize all data paths.\n", "\n", "In the figure, we see an additional `input-tensor`, which corresponds to the time $t$; it does not contribute to the output, so the path stops before passing to the NN models." ] }, { "cell_type": "code", "execution_count": 12, "id": "ce012224-f4e0-4709-8e06-81f8386e33f4", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", "\n", "\n", "\n", "model\n", "\n", "\n", "\n", "0\n", "\n", "\n", "input-tensor\n", "depth:0\n", "\n", "()\n", "\n", "\n", "\n", "4\n", "\n", "\n", "reshape\n", "depth:1\n", "\n", "input:\n", "\n", "() \n", "\n", "output: \n", "\n", "(1, 1) \n", "\n", "\n", "\n", "0->4\n", "\n", "\n", "\n", "\n", "\n", "1\n", "\n", "\n", "input-tensor\n", "depth:0\n", "\n", "(4,)\n", "\n", "\n", "\n", "3\n", "\n", "\n", "reshape\n", "depth:1\n", "\n", "input:\n", "\n", "(4,) \n", "\n", "output: \n", "\n", "(1, 1, 4) \n", "\n", "\n", "\n", "1->3\n", "\n", "\n", "\n", "\n", "\n", "2\n", "\n", "\n", "input-tensor\n", "depth:0\n", "\n", "(2,)\n", "\n", "\n", "\n", "6\n", "\n", "\n", "reshape\n", "depth:1\n", "\n", "input:\n", "\n", "(2,) \n", "\n", "output: \n", "\n", "(1, 1, 2) \n", "\n", "\n", "\n", "2->6\n", "\n", "\n", "\n", "\n", "\n", "9\n", "\n", "\n", "__getitem__\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 1, 4) \n", "\n", "output: \n", "\n", "(1, 4) \n", "\n", "\n", "\n", "3->9\n", "\n", "\n", "\n", "\n", "\n", "5\n", "\n", "\n", "expand\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 1) \n", "\n", "output: \n", "\n", "(1, 1) \n", "\n", "\n", "\n", "4->5\n", "\n", "\n", "\n", "\n", "\n", "8\n", "\n", "\n", "__getitem__\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 1) \n", "\n", "output: \n", "\n", "(1,) \n", "\n", "\n", "\n", "5->8\n", "\n", "\n", "\n", "\n", "\n", "7\n", "\n", "\n", "expand\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 1, 2) \n", "\n", "output: \n", "\n", "(1, 1, 2) \n", "\n", "\n", "\n", "6->7\n", "\n", "\n", "\n", "\n", "\n", "10\n", "\n", "\n", "__getitem__\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 1, 2) \n", "\n", "output: \n", "\n", "(1, 2) \n", "\n", "\n", "\n", "7->10\n", "\n", "\n", "\n", "\n", "\n", "11\n", "\n", "\n", "stack\n", "depth:1\n", "\n", "input:\n", "\n", "(1,) \n", "\n", "output: \n", "\n", "(1, 1) \n", "\n", "\n", "\n", "8->11\n", "\n", "\n", "\n", "\n", "\n", "12\n", "\n", "\n", "stack\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 4) \n", "\n", "output: \n", "\n", "(1, 1, 4) \n", "\n", "\n", "\n", "9->12\n", "\n", "\n", "\n", "\n", "\n", "13\n", "\n", "\n", "stack\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 2) \n", "\n", "output: \n", "\n", "(1, 1, 2) \n", "\n", "\n", "\n", "10->13\n", "\n", "\n", "\n", "\n", "\n", "14\n", "\n", "\n", "__getitem__\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 1) \n", "\n", "output: \n", "\n", "(1,) \n", "\n", "\n", "\n", "11->14\n", "\n", "\n", "\n", "\n", "\n", "15\n", "\n", "\n", "__getitem__\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 1, 4) \n", "\n", "output: \n", "\n", "(1, 4) \n", "\n", "\n", "\n", "12->15\n", "\n", "\n", "\n", "\n", "\n", "16\n", "\n", "\n", "__getitem__\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 1, 2) \n", "\n", "output: \n", "\n", "(1, 2) \n", "\n", "\n", "\n", "13->16\n", "\n", "\n", "\n", "\n", "\n", "18\n", "\n", "\n", "StepwiseModel\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 4), (1, 2) \n", "\n", "output: \n", "\n", "(1, 8) \n", "\n", "\n", "\n", "15->18\n", "\n", "\n", "\n", "\n", "\n", "16->18\n", "\n", "\n", "\n", "\n", "\n", "17\n", "\n", "\n", "__getitem__\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 1) \n", "\n", "output: \n", "\n", "(1,) \n", "\n", "\n", "\n", "19\n", "\n", "\n", "SimpleRNN\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 8) \n", "\n", "output: \n", "\n", "(1, 4) \n", "\n", "\n", "\n", "18->19\n", "\n", "\n", "\n", "\n", "\n", "20\n", "\n", "\n", "__getitem__\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 8) \n", "\n", "output: \n", "\n", "(1, 4) \n", "\n", "\n", "\n", "18->20\n", "\n", "\n", "\n", "\n", "\n", "23\n", "\n", "\n", "StepwiseModel\n", "depth:1\n", "\n", "input:\n", "\n", "(1, 8) \n", "\n", "output: \n", "\n", "(1, 4) \n", "\n", "\n", "\n", "18->23\n", "\n", "\n", "\n", "\n", "\n", "25\n", "\n", "\n", "output-tensor\n", "depth:0\n", "\n", "(1, 8)\n", "\n", "\n", "\n", "18->25\n", "\n", "\n", "\n", "\n", "\n", "21\n", "\n", "\n", "cat\n", "depth:1\n", "\n", "input:\n", "\n", "2 x (1, 4) \n", "\n", "output: \n", "\n", "(1, 8) \n", "\n", "\n", "\n", "19->21\n", "\n", "\n", "\n", "\n", "\n", "20->21\n", "\n", "\n", "\n", "\n", "\n", "22\n", "\n", "\n", "output-tensor\n", "depth:0\n", "\n", "(1, 8)\n", "\n", "\n", "\n", "21->22\n", "\n", "\n", "\n", "\n", "\n", "24\n", "\n", "\n", "output-tensor\n", "depth:0\n", "\n", "(1, 4)\n", "\n", "\n", "\n", "23->24\n", "\n", "\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model_graph = visualize_model(\n", " mdl_class=DSDM, checkpoint_path=f'{labels[0]}.pt',\n", " ref_data='./data/lti.npz', depth=1, ifsave=False,\n", " show_all_paths=True);\n", "model_graph" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.12.7" } }, "nbformat": 4, "nbformat_minor": 5 }