{ "cells": [ { "cell_type": "markdown", "id": "8e02c40b-93f7-4914-8285-6ec5c204719b", "metadata": {}, "source": [ "# Example: Cylinder Flow - Part 2/3\n", "\n", "- Author: Dr. Daning Huang\n", "- Date: 10/14/2025\n", "- Updated: 05/07/2026" ] }, { "cell_type": "markdown", "id": "71936efa-dccc-4b3a-92a6-f004ed12af04", "metadata": {}, "source": [ "As discussed in Part 1, this part will train several models and visualize the predictions. If you have gone through the previous examples, then the main new things here are two handy visualization tools." ] }, { "cell_type": "markdown", "id": "7d6f8613-2f72-472c-8758-f92f998afc79", "metadata": {}, "source": [ "## Setup\n", "\n", "The imports:" ] }, { "cell_type": "code", "execution_count": 1, "id": "cd4dcd6a-2fc8-47f2-8c2f-36fc9d81d982", "metadata": {}, "outputs": [], "source": [ "import warnings\n", "warnings.filterwarnings('ignore')\n", "import copy\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import torch\n", "\n", "from dymad.io import load_model\n", "from dymad.models import KBF, DKBF, DKMSK\n", "from dymad.training import LinearTrainer, StackedTrainer\n", "from dymad.utils import animate, compare_contour, plot_summary, setup_logging" ] }, { "cell_type": "markdown", "id": "6ae17fc5-4cbc-49e0-9fd0-01505bec6f5d", "metadata": {}, "source": [ "Model options:" ] }, { "cell_type": "code", "execution_count": 2, "id": "06aff883-fedf-4420-a830-e77ffbf3f3a2", "metadata": {}, "outputs": [], "source": [ "def gen_mdl_kb(e, l, k):\n", " # Options for Koopman models\n", " return {\n", " \"name\" : 'vor_model',\n", " \"encoder_layers\" : e,\n", " \"decoder_layers\" : e,\n", " \"hidden_dimension\" : l,\n", " \"koopman_dimension\" : k,\n", " \"activation\" : \"prelu\",\n", " \"weight_init\" : \"xavier_uniform\",\n", " \"predictor_type\" : \"exp\"}\n", "\n", "mdl_kl = { # Kernel model using Diffusion Map\n", " \"name\" : 'vor_model',\n", " \"encoder_layers\" : 0,\n", " \"decoder_layers\" : 0,\n", " \"kernel_dimension\" : 12,\n", " \"type\": \"share\",\n", " \"kernel\": {\n", " \"type\": \"sc_dm\",\n", " \"input_dim\": 12,\n", " \"eps_init\": None\n", " },\n", " \"dtype\": torch.float64,\n", " \"ridge_init\": 1e-10\n", " }" ] }, { "cell_type": "markdown", "id": "5b89a057-5846-46aa-b8d0-9791c5ba7148", "metadata": {}, "source": [ "Training options - using explicit `phases` for alternating linear-solve / optimizer schedules:" ] }, { "cell_type": "code", "execution_count": 3, "id": "ef8714ff-f545-447a-aed0-958c1f48ca7c", "metadata": {}, "outputs": [], "source": [ "# Base optimizer config for NODE phases\n", "trn_nd = {\n", " \"n_epochs\": 200,\n", " \"save_interval\": 50,\n", " \"load_checkpoint\": False,\n", " \"learning_rate\": 5e-3,\n", " \"decay_rate\": 0.999,\n", " \"sweep_lengths\": [2],\n", " \"sweep_epoch_step\": 100,\n", " \"chop_mode\": \"unfold\",\n", " \"chop_step\": 1,\n", " \"ode_method\": \"dopri5\",\n", " \"ode_args\": {\n", " \"rtol\": 1.e-7,\n", " \"atol\": 1.e-9}\n", " }\n", "# NODE trainer config, for a more nonlinear model\n", "trn_ae = copy.deepcopy(trn_nd)\n", "trn_ae[\"n_epochs\"] = 2000\n", "trn_ae[\"sweep_lengths\"] = [2, 10, 50]\n", "trn_ae[\"sweep_epoch_step\"] = 500\n", "# Enable reconstruction loss\n", "crit = {\n", " \"dynamics\" : {\"weight\" : 1.0},\n", " \"recon\" : {\"weight\" : 1.0}}\n", "# Linear trainer using generic least squares\n", "trn_ln = {\n", " \"n_epochs\": 1,\n", " \"save_interval\": 50,\n", " \"load_checkpoint\": False,\n", " \"method\": \"full\"\n", " }\n", "# Linear trainer using linear solver given by model\n", "## (Kernel Ridge Regression in this case)\n", "trn_rw = copy.deepcopy(trn_ln)\n", "trn_rw[\"method\"] = \"raw\"" ] }, { "cell_type": "markdown", "id": "6dd4af69-6fc7-45ba-8393-abef74c7b11c", "metadata": {}, "source": [ "Data transformation options:" ] }, { "cell_type": "code", "execution_count": 4, "id": "63a110ae-227e-420b-b431-0019da9d8b98", "metadata": {}, "outputs": [], "source": [ "# SVD for dimension reduction\n", "## Used to save training cost\n", "trn_svd = {\n", " \"type\" : \"svd\",\n", " \"ifcen\": True,\n", " \"order\": 12\n", "}\n", "# Normalize data by std\n", "trn_scl = {\n", " \"type\" : \"scaler\",\n", " \"mode\" : \"std\",\n", "}\n", "# Appending unity to each sample\n", "trn_add = {\n", " \"type\" : \"add_one\"\n", "}\n", "# Diffusion Map model\n", "trn_dmf = {\n", " \"type\" : \"dm\",\n", " \"edim\": 3,\n", " \"Knn\" : 15,\n", " \"Kphi\": 3,\n", " \"inverse\": \"gmls\",\n", " \"order\": 1,\n", " \"mode\": \"full\"\n", "}" ] }, { "cell_type": "markdown", "id": "693254ca-4490-4bf6-aef1-b3052f3bffcb", "metadata": {}, "source": [ "The models to train:\n", "\n", "- `kbf_node`: Continuous-time Koopman model, SVD as observables, using least squares and finite difference (for $\\dot{z}$) to estimate system matrix and NODE to refine the matrix.\n", "- `dkbf_ln`: Discrete-time (DT) Koopman model - equivalent to DMD.\n", "- `dkbf_ae`: DT Koopman, but with an NN autoencoder to compress data further into 3 dimensions - this needs the longest training time among the models, but still fast.\n", "- `dkbf_dm`: DT Koopman, using Diffusion Map to further reduce the dimensionality; but this reduction is nonlinear.\n", "- `dks_ln`: A simple DT nonlinear model by Diffusion Map, plus skip-connection. It is essentially a linear-regression type model, the data is normalized after SVD." ] }, { "cell_type": "code", "execution_count": 5, "id": "4df443a6-3a03-4c18-8a4d-12f5121cc206", "metadata": {}, "outputs": [], "source": [ "def _optimizer_phase(trainer, cfg):\n", " phase = dict(cfg)\n", " phase[\"type\"] = \"optimizer\"\n", " phase[\"trainer\"] = trainer\n", " return phase\n", "\n", "\n", "def _linear_solve_phase(method, params=None, *, kwargs=None, reset_optimizer=True):\n", " phase = {\"type\": \"linear_solve\", \"method\": method, \"reset_optimizer\": reset_optimizer}\n", " if params is not None:\n", " phase[\"params\"] = params\n", " if kwargs is not None:\n", " phase[\"kwargs\"] = kwargs\n", " return phase\n", "\n", "\n", "def _alternating_schedule(\n", " trainer, base_cfg, chunk_epochs, *, method, params=None, kwargs=None, reset_optimizer=True\n", "):\n", " phases = []\n", " for n_epochs in chunk_epochs:\n", " phases.append(\n", " _linear_solve_phase(\n", " method, params=params, kwargs=kwargs, reset_optimizer=reset_optimizer\n", " )\n", " )\n", " chunk_cfg = dict(base_cfg)\n", " chunk_cfg[\"n_epochs\"] = n_epochs\n", " phases.append(_optimizer_phase(trainer, chunk_cfg))\n", " phases.append(\n", " _linear_solve_phase(method, params=params, kwargs=kwargs, reset_optimizer=reset_optimizer)\n", " )\n", " return phases\n", "\n", "\n", "cfgs = [\n", " ('kbf_node', KBF, StackedTrainer,\n", " {\"model\": gen_mdl_kb(0,0,13), \"criterion\": crit,\n", " \"phases\": _alternating_schedule(\"NODE\", trn_nd, [50, 150], method=\"full\"),\n", " \"transform_x\" : [trn_svd, trn_add]}),\n", " ('dkbf_ln', DKBF, LinearTrainer,\n", " {\"model\": gen_mdl_kb(0,0,13), \"training\" : trn_ln, \"transform_x\" : [trn_svd, trn_add]}),\n", " ('dkbf_ae', DKBF, StackedTrainer,\n", " {\"model\": gen_mdl_kb(3,64,3), \"criterion\": crit,\n", " \"phases\": _alternating_schedule(\"NODE\", trn_ae, [500, 500, 2000], method=\"full\", reset_optimizer=False),\n", " \"transform_x\" : [trn_svd]}),\n", " ('dkbf_dm', DKBF, LinearTrainer,\n", " {\"model\": gen_mdl_kb(0,0,3), \"training\" : trn_ln, \"transform_x\" : [trn_svd, trn_dmf]}),\n", " ('dks_ln', DKMSK, LinearTrainer,\n", " {\"model\": mdl_kl, \"training\" : trn_rw, \"transform_x\" : [trn_svd, trn_scl]}),\n", " ]\n", "config_path = 'vor_model.yaml'" ] }, { "cell_type": "markdown", "id": "8faa0608-e192-47d9-9074-9f241715c51f", "metadata": {}, "source": [ "## Training\n", "\n", "The usual work." ] }, { "cell_type": "code", "execution_count": 6, "id": "39dea7fb-f95f-47d7-8c6d-175c9021f31a", "metadata": {}, "outputs": [], "source": [ "IDX = [0, 1, 2, 3, 4]\n", "\n", "for i in IDX:\n", " mdl, MDL, Trainer, opt = cfgs[i]\n", " opt[\"model\"][\"name\"] = f\"kp_{mdl}\"\n", " trainer = Trainer(config_path, MDL, config_mod=opt)\n", " trainer.train()" ] }, { "cell_type": "markdown", "id": "ea76992f-e20f-45d9-8f4c-cc0744024b8e", "metadata": {}, "source": [ "## Visualization\n", "\n", "First load reference dataset, and compute the model predictions." ] }, { "cell_type": "code", "execution_count": 7, "id": "aee17f18-bfac-427e-8e5b-7a237c0b3386", "metadata": {}, "outputs": [], "source": [ "dat = np.load('./data/cylinder.npz')\n", "x_data, t_data = dat['x'], dat['t']\n", "Nx, Ny = 199, 449\n", "\n", "res = [x_data]\n", "for i in IDX:\n", " mdl, MDL, Trainer, opt = cfgs[i]\n", " _, prd_func = load_model(MDL, f'kp_{mdl}.pt')\n", " with torch.no_grad():\n", " pred = prd_func(x_data, t_data)\n", " res.append(pred)" ] }, { "cell_type": "markdown", "id": "1501ed3c-4093-4871-a887-d9cc679b2d30", "metadata": {}, "source": [ "In the function below, we introduce a `compare_contour` function. It is a convenient tool to compare two 2D fields. It generates 3 contours: One for truth, 2nd for prediction, 3rd for the error.\n", "\n", "See the comments for the usage." ] }, { "cell_type": "code", "execution_count": 8, "id": "31ca9da5-66a8-4f36-bdac-f78dd53c621c", "metadata": {}, "outputs": [], "source": [ "N = len(IDX)\n", "def contour_fig(j):\n", " # A figure of Nx3 grid\n", " fig, ax = plt.subplots(N, 3, sharex=True, sharey=True, figsize=(12, 1.5*N))\n", " colorbar = j == 0\n", " for i in range(N):\n", " # Apply the function for each row of grid of axes\n", " compare_contour(\n", " res[0][j].reshape(Nx, Ny), # Truth, at step j\n", " res[i+1][j].reshape(Nx, Ny), # Prediction, at step j\n", " vmin=-12, vmax=12, # Range of colorbar\n", " axes=(fig, ax[i]), # The axes to plot the contours\n", " colorbar=colorbar) # Whether to plot colorbar\n", " ax[i,1].set_title(cfgs[IDX[i]][0])\n", " for _ax in ax.flatten(): # Turn off axis for this case\n", " _ax.set_axis_off()\n", " return fig, ax" ] }, { "cell_type": "markdown", "id": "88de8835-eedd-4352-95ac-3e58941daef9", "metadata": {}, "source": [ "Below is the case for step 40. All of them are doing a decent job." ] }, { "cell_type": "code", "execution_count": 9, "id": "30f2c3fb-7004-4987-866b-66ac976c06a9", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7YAAAJrCAYAAADULQ/dAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAiwFJREFUeJzt3QeYVNX9xvHDUhd2qYKIAoqg/4iKPcYQsfeWqImaxBJrxBqNsSTBGo1Ro7Fhi0QTjUos0Sg2CPZGBGMHQUAR6UiTOv/nPXgnd2ZnZufO3D7fz/Os7E69u+7+7vu759xzW2QymYwBAAAAACCh6qLeAAAAAAAAqkFjCwAAAABINBpbAAAAAECi0dgCAAAAABKNxhYAAAAAkGg0tgAAAACARKOxBQAAAAAkGo0tAAAAACDRaGwBAAAAAIlGY4vIbLjhhuaAAw6IejMApNDFF19sWrRoYebMmVP0MbvssovZfPPNy3q9L7/80hx22GGmW7du9nWvv/56EycjRoyw2/Xpp59GvSkAAESCxrZGKQCV8/Hvf/+7qvd5//33bcAkbAFIsrPPPts8/fTT5oILLjD33nuv2WeffaLeJAA1zDmYVezjtddeM0lz1113mW9961umXbt2ZsCAAebGG28s+7kTJ040RxxxhNlggw1M+/btzf/93/+ZSy+91CxdujT7GGXRUj+zE088MfvYzz//3Oy///6mY8eOZrPNNjOPP/54k/d8+OGHTY8ePczChQt9+O7hh1a+vAoSR8HM7Z577jHPPvtsk9tVYKptbC+55BI7MqIRWgBIotGjR5uDDz7YnHvuuVFvCgBkqXnbaKONmtzev39/kyS33XabOeWUU8yhhx5qfvGLX5gXX3zRnHHGGbYx/dWvflXyudOnTzc77LCD6dSpkznttNNM165dzauvvmqGDRtmxo0bZx577DH7uO7duzfJuTJq1Cjzt7/9zey1117Z24455hjb3P7+9783L7/8sjn88MPNhx9+mM2yX3/9td0fXH755fZ9EQ80tjXqJz/5Sc7XOrKnxjb/9nwqMDoSBgC1ZNasWaZz585RbwYA5Nh3333Ndttt5+k5q1atMmvWrDFt2rRpct+SJUtMhw4dKt6eTCZjm776+vqyn7Ns2TJz0UUX2RHSkSNH2ts0eqptvOyyy8xJJ51kunTpUvT5alYXLFhgXnrpJTNw4EB7m56j52vgZv78+fb5+r4K5VyNfmtk9sADD8xujw5matbizjvvbBvuV155xc7aOfnkk+1jrrnmGtvQnnDCCZ5/RggOU5HR7PlnOtqlP2w1tBdeeKG9T1M2NMU4n45kHXvssdlCoSNcsuuuuxad3qxCpCNtmnrSr18/W4QAwG9Tp061oxiqazpn1qEat9NOO9kgppGP4cOHN5nup7B28803Z+tYufRYjSA8+uij9n3btm1rg5dGCPK9/fbbNqQqYDU0NJjdd9+94HTC9957z+y22252ezXtTiMGCnCFPPXUU+Z73/ueDXSNjY02OOr5AGqDM/1WjZjWBth4441tHXJOFdN9+vyoo46yzd/gwYOzza+aSufxynfKgMuXLy+4XoqaPjXYqksafZVp06bZUc7mjBkzxsydO9eceuqpObcPHTrUNtr/+te/Sj7/q6++sv+uu+66Obevt956pq6urmAD7/jiiy/s+//gBz+wOVTUmKvmO820fkY6sOlMa9ZI7lVXXWVuuOEG+/qID/5voCQVGgWtrbbayhZENajlUjOsaSSiYqgjavpwT2+eNGmSXZBlzz33NNdee60tImqMCV4A/PTJJ5/YmqTmTgfXnACkI/n77bef2Xbbbc3VV19tG8Wf//zn5s9//rO9X89xpq6pTjl1zAsdvFNg0/lfeg+FJk23U311qOapAZ0wYYI577zzzG9+8xszZcoUe4Dx9ddfzz5u5syZtg6PHz/enH/++eass86yBwMVsPJpO9XIqknWdDq9pgKsgivrHgDpoPM7tUie+8NdWxx33323PWdVI5nKW5qu69AghJq23/3ud9nzTDUS+dvf/tZss8025o9//KMZMmSIufLKK20dy/fRRx+ZI4880tZI1SJlRjn66KPLOqVNB/Ukf+RZdVmNo3N/MaqTcvzxx9vaqKnJDzzwgLn11lttDi01Av33v//dHhj88Y9/nL1NWVQNvX4eqsOapqzX1SCMqEYrG2v/gJjJAJlMZujQoZn8X4chQ4bY24YPH97k8bp92LBhTW7v27dv5phjjsl+/dBDD9nHjhkzpuBjdd8LL7yQvW3WrFmZtm3bZs455xwfvisAtUr1SfVl9uzZmQ8++CDTq1evzPbbb5+ZN29ekxp37bXXZm9bvnx5Zquttsr06NEjs2LFiuztepzqpFd6Xps2bTKTJk3K3jZh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BjEAgHdqgtesWWNuuOEG079/5bNhAED23Xdfs91223l6zqpVq2wdavPNSKabmr8OHTpUvD06KKimr97DCOayZcvMRRddZPbff3/bQMqJJ55ot/Gyyy6zjWOXLl2KPl8N8IIFC8xLL71kDxyKnqPna+Bm/vz59vn6vgrlXDXAHTt2NAceeGB2e0aPHm3r9c4772yb5VdeecU8/fTT5uSTT7aPueaaa2wjfcIJJ3j+GSE4nGOLojTCqhHVcePG2T9sNbQXXnhhdhRDIxv5dCTr2GOPzRYK58iXRjP0HH2oULipEO2www6mXbt2pl+/frYIAUAazZo1y/7buXPnqDcFQA349NNPbfZSI3b99debjTfe2LRt29a8//77NsfpPn1+1FFH2eZv8ODB2eZXTaXzeOU7ZcDly5fnvL5uP+CAA2zTpwZbDa1GX2XatGl2lLM5mtU3d+5cc+qpp+bcrtkyarT/9a9/lXz+V199Zf/Nn2G43nrrmbq6uoINvOOLL76w7/+DH/zA5lBRY64G3Wmm9TNSzdbgjmgkVyPJOkCp10d88H8DJanQ6GjgVlttZQuiGtRyqRnWFA5RMdQRNX1861vfyj5m0qRJduqepjxfe+21toioMX7vvfcC+X4AwH1Qbfvtt7dhRuHNCWPNufzyy22YufHGG3NuX716ta11PXv2tCMDmgKnKXLuADhs2DD7effu3YseICyXEyg5OAjUroULF5o5c+bkfCi75bv77rttzdJIpvKWpus6NAihpu13v/udHSkVjUT+9re/Ndtss4354x//aIYMGWKuvPJKc8QRRzR57Y8++sgceeSRNsup2VNmlKOPPjon8xXz9ttv23/zR5633XZbW2ud+4txTnU7/vjjzfjx423dfeCBB8ytt95qc2ipEei///3vdmT3xz/+cfY2ZVHtE/Tz0Okfmqas11WdlfPOO89mY+VcxIzOsQWGDh2qE8pybhsyZIi9bfjw4U0er9uHDRvW5Pa+fftmjjnmmOzXDz30kH3smDFjCj5W973wwgvZ22bNmpVp27Zt5pxzzvHhuwKAwt55551MfX19pk+fPpkrr7wyc9lll2XWXXfdzJZbbplTC/W56qPjoosuyrRo0SJz++23Z29TfdPjtthiC/v86667LnP++edn2rVrl9lkk00yS5cutY975JFHMt///vftY2+99dbMvffem5kwYUJZ23v33Xfb502ZMiWnhm666aZ2uy+88MLMTTfdlNlmm23s9r377rs+/aQAxJFTEwp9KEc5VDN0W8eOHW3GclOO031HHnlkzu3jx4+3t59wwgk5t5977rn29tGjRzfJcqNGjWqyjU6ObI5qbMuWLQve171798wRRxzR7Guohqumu38OqtfN2XbbbTPrrbdeZvXq1Tm3P//885kuXbpkX+uss86yt7/88sv2fT799NNmXxvh4xxblKTpJ1qcICg68f573/te9muNYmy66aZm8uTJgb0nAGgkQn2rFijp06ePvU2LlmyxxRZFn3PuuefakQuNfBxzzDFN7p83b5754IMPTGNjo/1aIx1aGOqOO+6wowaHHHKIPeqvxUs0U8WPhV00UvLCCy9k66jer3fv3nYbNfUQQLrdfPPNZpNNNsm5rWXLlk0ep/qmjFWIziF1e/LJJ+2/v/jFL3JuP+ecc2xd0dRg9ww+LV6lBZ/y5Z96VozOaS02XVgzUXR/OTNYNIKq77Nbt252GzXiqhk0p512WsHnfPzxx/Z0u7PPPrvJlOLddtvNTqXWDMJevXrZuqqRXdVy/Rz69u1rR4Q1Qq19iV4j/+eI8NHYoqT111+/5LkJ1XICpZumgOhEfwAIgqYM63wwNZruGqQpcwpnTqhzKLQoGGmqslaU15S7QjTtzmlqRc2rzvHS6zmnZfiNg4NAbdP02HIWjyq0cnKx+6ZOnWobvfwF7tQk6lxT3V/ua5dD5+WuWLGi4H3lLESl6cSaYq1GdYMNNrC36ZxZNaJaUVk1W81uPk0xFvc0ZLeGhgbz7W9/O/u1DhjOnDnTroT83HPPmV/+8pd2n6DTSnSOsmqvl1P24D/OsUVJXla1cwKjF4WOKgpXoQIQlNmzZ9sRgAEDBjS5T8Ekn85Z1aiIzk8r1tRK/usp7CgYavGWoHBwEEC1ea7Yfaph1b52OXQAUPnRWVzPoWZX5wtrxLSUW265xWy99dbZptahdQ507nCxc3Tvu+8+W/N1Lm9ztECVVm7WolE6Z/f++++3By91gPTggw+2nzuNMqJDY4uKKDhpafX8AqTV5SopigAQV9/97nftapu6lq2mG8cJBwcB+E3TbDXaOXHixJzbv/zyS5v9dL+fnMWm3nrrrZzb9bW2w7m/GG1XoYGVlStXZld4zvf666/bBUyLjdbmc64X7Dx+xowZOQ23PtdqyYgWjS0qotXidF6X2+23396ksDgr0eU3wQAQFU3X1QhDfmhzzlnNp1HXZ555xgaZffbZxyxatKjg6+a/nppLBSed+wUASbHffvvZf3U1DLfrrrvO/qvrzZaj3Mv96HxWrdKsc1bd9LUuNel+P636rNd0Lr0jOsdYo7KaiuymUVVNqd5yyy0LjtaKphA3R6+rA5s6n9YZsNHBTvf3pvUVNFUb0eIcW1REy8DrJHmdpK/l3SdMmGDPWctfDEVH2TSi8Pvf/94uSa/FqFTAevToEdm2A6htqkk6l/bRRx+1wcuZzqtgojpWiIKRzpVVvTvwwAPNU0891WT6naYsX3DBBdnzbEeOHGlnsegcLwAIgmpRoeZxp512spf/qsSgQYPsAnkasNDAhC7188Ybb5i//OUvduptueeRat2BsWPHNjuDRLVU18zVdWt16SHVZy3sp/NXr7jiipxLE6nBvOSSS+y1Z53L/OhcV/0ctN6A1kPQ+bRPPPGEvU15NX8qswZhdDmgHXfc0Q7UNEcLQ/3oRz/KXu5HNPVYU5B1iTd5/PHH7XsiWjS2qIiuc6Zre911111m1KhRtpg8++yzZvfdd895nI5eDR8+3F77TNcXUzFRMaKxBRAlBSOndp166ql2qprOoR04cKB55513Cj5HIeixxx6zoxkKNWqMW7dunb1f4Wvw4MF2JXlNjdNoh0Z7netCAkAQK7wXooWOKm1s5c4777TPHzFihF3JXXlOB+6ca3H7TXVY9VTX2P3nP/9pVyHWKvRnnnlms8/VasivvPKKvS64zrfVebmaNqymWNeczaeFn1Sjdc5sc3RAUzMU80eDdQ1xvb72G2rclXN1bVtEq4Wu+RPxNgAAEDqFFV3O4r///a9ddEQBSCOsanqdXaOmnWkUQaMEDoUuzVbRh6az6XU0gqFpb2qKdcBP05U1O0Uhy73Ak4KXXl8LWHm53I/CpRpmHVB0pjbr380337zJKIEzilHupTYAAEgDGlsAAAAAQKKxeBQAAAAAINE4xxYAgIgsXrzYfjS3inOxy/oAAIC1aGwBAIjINddcY8+5LcV9Xi0AACiMc2wBAIjI5MmT7UcpWmm5Xbt2oW0TAABJRGMLAAAAAEg0Fo8CAAAAANTGObb9/nRtsFsCIPUmn3GOSSPqI4BqUR8BoLr6yIgtAAAAACDRaGwBAAAAAIlGYwsAAAAASDQaWwAAAABAotHYAgAAAAASjcYWAAAAAJBoNLYAAAAAgESjsQUAAAAAJBqNLQAAAAAg0VpFvQFA2Fp9Vd3xnFUd1/i2LQAQJ9RHAEBS0dgi9aoNauW8HmEOQFL5WSOpjwCAqNDYIrX8bmjLfS9CHIAkCKtGUh8BAGGgsUVq5QeosEMcAQ5AnLlrFE0uACDpaGxRM8JudGlwASRFFAcCqZEAAD/R2KJmhTVaQXgDkDRhjuZSIwEAfuByP8A3gSroUKXwFuZ5vwCQlPoo1EcAQDXYiwAuhDcAiLY+UiMBAJVg7wHkIbwBQGFhTRemPgIAvGLPARRAeAOA6OsjNRIAUC72GEARNLcAUFiYCz1RIwEA5WBvAZRAcwsAhdHcAgDihD0FEBMENwAojhoJACiFvQTQDEYlAKAwrj0LAIgLUjQQMzS3AFAY9REAUAx7CCCGCG8AUBj1EQBQSCtTY8LeITJNC0BSUB9R6f/HsH939H78/gAAUt3Yxu1IbrHtYYecLAQ3pEWcaiT1EQAA+CXRjW2cAlq1206QQyE0t6gU9RFpR30EACS2sfUS1FovNqFa2eDf98aOGoBX1Mf0W92wOvt5y8UtTa3PahGaWwBAIhrbUjvJsINZc4ptTyWBzvm+a2Vn7Q5r+eIW3qJAcIPXGlkL9VHS/ndRqjY691EjAQCIcWObH9aKhaI2i/x7zxWNJhDubfca4tIc4EoFtvzHxSW4RTUiAbgV+h0sVCOTVh+rqZG1Wh+xFgf/AACxamxLNbN+BrQo+dHkJn3nXUlgi1NzGxWCG9w1Mo31sZoamZb6WEmNpD4CABCTxrZQWHMHtTaLMp5eb0VjizIfZxIb4JIY3hiBAKqrkX7Ux3JrZNT10f391kqDS42sTlL3jQCAlDS2hQKbE9TaLiy+k1/eqaWnoBaHkOZngEtaeCOwAeHVR681Mm31MWlNjh/1MS6jtpyuAQCoucbWHdicsOYEtdYLV5rW85dlH7uyS71Z2al1TlgrFtK8BrRKV+oMamGWtDW4fja0BLdkhXX439CqRhaqj/bfTq1zmtlCNZL6GD8c9AMAIMGNbX5T2/jZqmxYazF/kVkzd54x/fvawLa4T7smIc1LOKv2EhPlvG4QIU6vmfTRCQIbEEx9bNGtq1nRr0e2mY1zfQyiRlbS4MatPgo10n9x/X8NAEhhY6udjnuUtmHa16bN5Fk2rC3dYwszd9+uZlmv3q5nOOePlT6PLMqpT064Irz9D4ENqK6pbZiRWx9Xbv9/ZmaT+ujUxvjWR6eGRX0AsBbqY1xmtQAAkPrG1t3UahSiw9uf29s/OamvWd6r1zfhbGX28V520NUGlqiDX5rCG01tsOLw/xj+c2pQhy/W1sf2n35lMpOmmpnHbm0Wbtr7m7+r5NbHuDS3EuXfTy3UR86zBQCkurF1N7Vd31tmWr35oZl2+tZm8SYrc8Kaw+tR52ovVO8EnWp2xkEFt6Q0t2EEtriMSBDcEGRTq4N+83bpY2ae2ehrfazkuX7VxyAl5dSNWmhqAQCIUuBJxQlDTlOrqXUTrxz0TVPbVDWNi4JDVOEhqKa2ktcPO4AS2IDquJtazWKZucsq3+qj+znV/K3GeaZA0PW3WtRIAABSMmLrhDYtgPLRuc60Ov84wc153UKvX04gTNNIXFijEgQ2wI/ZLBnb1K6tj4UP+lVD9a/a+hj3xjOuM1uokeHidA0AqF11YYU2nTP28fGdS+7kqw1XpZ6fhnDhNRwG3aSn4WdaKYIT/JzNooWiNFIb9/qYpt/7MA5ihl0j41KT0/R7AgBIjsD37E5om3x410BDWzmvU85OP2075KDCW1wCVC1Ky6wCrD1Ypdks0/eoN8t7+T9SG5eDf0FdWijOU5KpkQAAhKsu6NFamTewvmTDGIcFgaptbuMc3PxuhAhsgH8H/nSd2ubqY5xqZJoO/nHgLzhp+j0BACRDCCO2GbNw07U7uPxwFlRg8+M12SkXRmD7H35H4EdDpdHaWqiPYR38q+UDf3E6AAIAQOoWj1rR2MKsblgVy5EHvxeTCvKSP9Xy4xqONLWA//Q36VzKKmn1UdJQI93fAzUSAIBkCnTEViFmyXrJa2jdFHK8BB19z3EdmahmdILAVhijtvDj9ybs+ujn+3n9G4hzfXRqZCV1khrZFPURAJCKxtbZoUW1Y/M7KFbS4AbBj9f1GtziEtiSenAEKEYH/tIgLvUxKl5qZOuGFU0+AABAzKcip/ForZfpd054i+PUu6ACWzErF7fxaYuAdKA++l8fo2iYy62Rpeqj7ktrjUzT9eEBAPFWF+TOvq7nMvuRRlFMT/YztJWz/V4CW3OjDmkelUhjg4JguetjXGZERDWCm9T66FdT6+UxAAAg5MbW2dl3alxmBvScHVlwK7TKaFLPv41zUwvAO6c+rrPewtRO7Q+rwY1rUxvmVOM4n6rBwT8AQKKnImtn3qPDYjO42yf264/G9zFpDm8OL1PwypmG5/fUuiibWqbbAbl/X6qPU9t3M89N7BrJtoTVDFUyRTmK+liucptaAACQosv9yLG9XjEXRNTY5qtk9NhL+PN6CYwwg5lfTW0UgS3OoxEOmltUYvfO75unGwbG4ne8lutj0mtk3FEfAQBBC3wv07/tl6Zfm9lmj53eMVFSGKl0SrTzXC+v4XWactAIbEA8qT5evfNDUW9GzdfHJNfIOBwUAQAgtY2tppzOWrL2cPuAVqvN1b1G21DgXGomyUduvYS4OAS4uAS2SqchJym0hfH/OurfJ1Qn//dZ9XHv9jPNpltNC60+5r++n+sgpLE+SnPfD5fuaR71EQAQpLqgg9uk5etmP5+wz41NzkcNo8ENcvGqckOcE+DC3OkmfRQCSLOFi+rN1GXdsl/f3/9hs2aTJaHUR3ddoD6WVs72+1Efa+HAn9B4AgCCUhd0cHtp7sZm4qr/7Xj/c9j1TXZsQTa3Ya7I7HWUIqgdvJfXpqn1H8EN5Zq+tLN5emnP7NdvDb4tp7kV6qO/qI8AAKRTYIlJR5Gd6cjPLNo85z41t2GENy+hzZlGVuijkveNIsR5DWxhhrZaGY1w0NyinPo4cWZ38/yCzXLuU3O78c6fxqo+Si3VR6E+Bof6CABI5KrIzqitDO0yISe8Pb1NT3PBk0f4Htr8DiSFHltuEHG2pZwAUmxnX+jnU00wSMo1apMa2oByqY6Mm72Bubl+UE591LRk09+YQaNON21ntPb1PWuhPpZ6fLnbFPemNulYJRkAkKjG1o5KmLWjEs4KyVokxaHP9z7senPz/EHm9td3rriRiWK6mPv1ygkm7m30+n36dXTb6wi2Xwhu/r4m0kF1QH+TOvj38LRB9jZ3c+usS6BTOY587QRjZtZX9D7Ux/hNy/ZDGg78+V0jqY8AUNsCH7F1N7cjzE5mUrdPmoQ3fT10n7W3qclVyFPYyw9ExcJX1Md8wwxxYU059EutTbHLx6gEyqmPC43JNrd7Nb5rV0qWzr2mmwEzetsZLqLzcUfM2MnW00J/W4X+dqP+7UtbfRRGa/1DjQQAJKaxzW9udc6tVgI9scfYbHhr0uR+0/hqpGLyiu52ZWU9RwutiHMZITc1wnHgBB6vU/GCCHFRBjap9abWQXCDl+Z2avduZvfO79sZLQtm9M55rJ3l8s005fz6KKqR1MdgR2jj0NRSIwEAiKixzQ9v48wGZvrSg83gbp80mZ5ciB7j1rv9gmyTKwpynRqXlb0tYYQ8rwGuUNDyGl6qnUoXh6Y2rfwIbkyzS6+m9bGznd2i2tevzeyCBwEd1MfKnl8Jmtr41kjqIwAgtMbWHd7mLG5jFjbU28DVo8PibIAThTiHRiPc18LtWz83OzLhDm96DUeh0Yp8pUKe36GukgCX1HO+HIS2whiVQCX1UbVOtc9pcvPrYyHUR//R1AaPGgkASExj614wRTv3hd8EJXeAe/6bBrYQp6ktRa9TTngLWzUBLimhrdrvLe2hrZrgxmhEbXDXx2yD29hgpnfobKa271ayPpaj2vqopjeIEd1aqI9CU9s8mlsAQGIaW/cOWqMTkm1wG9cGLoU4h5rdQtxT7ZJEASlu4Y2mNlwEN5Tzt1CowY26PgY9TTnuDW6lqI/B1kgO/AEAImtsizW4CnAKNk540uiAe3TBPaWukGpGIsJcXCWOzW2l/Pg+ai20uYNYOeGN0FabCjW4UdXHWq6R1Rz4oz5WjgOAAIBENbbFApxDI7n5wcrLIiilRL1KaJyCm7bDS3jzc7trNbSV2+DS1KIW62OcUB/jfQCQGgkAiFVjWyjAFQsI+WEuqeLS1JYT3oLY1loPbKXCmUIcYQ2l/mbym1wH9TGa5pYaGW59zL8NAIDYNbbFduju1S9LBQg/L1eThLCV1O+PwFYagQ1em9xy/4aDrJHUR39QH0ujPgIAEtXYeml0aylYpQGhDYimPgo1Mt6ojwAApLyxLWfnn9RrvtYKAhsQDupjMlEjAQCowca2klBAsIsGYQ2IHvUxvqiRAAD4IzWNbZDhgdDnHWENSA7qY/iokQAA+KtmGtsoAkgtBj7CGlBbqI/loz4CABAcGtsIQkwaAx2BDYBfNSNtNZL6CABA8GhsI5CWhpewBiAIaVgAi/oIAEC4aGxjJO5hjqAGICpxPyBIfQQAIFo0tjEX1XQ9QhqAJIii4aU+AgAQPzS2CUa4AoDCqI8AANSWuqg3AAAAAACAatDYAgAAAAASjcYWAAAAAJBoNLYAAAAAgESjsQUAAAAAJBqNLQAAAAAg0WhsAQAAAACJRmMLAAAAAEg0GlsAAAAAQKLR2AIAAAAAEo3GFgAAAACQaDS2AAAAAIBEo7EFAAAAACQajS0AAAAAINFobAEAAAAAiUZjCwAAAABINBpbAAAAAECi0dgiMtMvucLMvO2uqDcDQI2b/9TTZsqZ52a/1udzRj5c8jnLJk6yj1syfkJZ77HozXHmsyt+b6acfZ6Zev6vq95mAACQq1XUG4BouENcKT1PO8XUD+hf8fusmDnTLHl7gmnYYXvTulvXil8HAJJqxZezzJy//d3Uf2tT02mP3UyLNq2j3iQACbfo9TfNnPseKHr/emefbtpt2NckyaJXXzcLx4w1q+bOMy07dzYdhww2nXYeXNZzl0//zMx/4inz9ZRP7ddtN+xruh60v2m7wfo5j1v64UdmyX8mmOVTp5qVX84yrbp0Nr2HXdTk9VYvXWbmjnzYLHv/Q1PXvt503nN30/idb+e+57Tp5os/3WLWv+Bc07pbt6q+d/ijRSaTyfj0WkiQv/71rzlf33PPPebZZ5819957b87te+65p1l33XUrfp+RI0eaww8/3IwZM8bssssuOfdtuOGGZvPNNzdPPPFExa8PANW6+OKLzSWXXGKc3WGLFi3M0KFDzU033VT0Of/+97/Nrrvuah566CFz2GGHlXz94cOHm5///Odm4sSJpn//yg8UAoBjxIgR5rjjjjOXXnqp2WijjZrcv88++5h11lnHJMVtt91mTjnlFHPooYeavffe27z44os2k1511VXmV7/6Vcnn/uc//zHf/e53Te/evc3JJ59s1qxZY2655RYzb94888Ybb5hNN900+9hjjz3WPPDAA2abbbYx06ZNMy1btjSffrq2GXY74YQTzFNPPWXfe9KkSXZ/8NJLL5mddtrJ3q/9hd5T2fZ3v/tdAD8RVIIR2xr1k5/8JOfr1157zTa2+bfnW7p0qWnfvn3AWwcA6TFr1iz7b+fOnaPeFAAps++++5rtttvO03NWrVplm782bdo0uW/JkiWmQ4cOFW+PGr6vv/7a1NfXl/2cZcuWmYsuusjsv//+dkBETjzxRLuNl112mTnppJNMly5dij7/N7/5jX2/V1991XT7ZuRUeXaTTTYxF154ofnHP/6Rfaya0DvuuMO0bt3aHHDAAebdd98t+JoadLn66qvN0Ucfbb9+5513zOOPP55tbP/2t7+ZqVOn2tdHfHCOLYrSUSiNqI4bN87svPPOtqF1/oA1oqFRjnwahdXRMOdookZrRSMbeo4+NNLhpiNgO+ywg2nXrp3p16+fHT0GgCCo3my//fa23my88cZ2lKAcl19+uamrqzM33nhjzu2rV6+2dbFnz542DB500EFm+vTpOTVx2LBh9vPu3bsXrZ2FKDSdeuqpdrRBoU2BTTW10OjCggULzFlnnWVHLNq2bWtHhn//+9/bYAigdqleqO5cc8015vrrr7d1TzXi/ffft7VI9+nzo446yjaPgwcPzja/aiqdx6uWqdYtX7485/V1uxrEp59+2jbYqlVOXdWI6IcfftjsNmpW39y5c229c9PMGTXa//rXv0o+X6O7e+yxR7aplfXWW88MGTLENqiLFy/O3t6rVy/b1JbTbLub6a5du9rBHdE2nX/++ebKK680DQ0Nzb4WwsOILUpSodHRwCOOOMIe/fIyLVnN8BlnnGH+9Kc/2WL4rW99y97u/Cua3qFpfMcff7w55phjzJ///GfbGG+77bZm4MCBgXxPAGrTf//7X7PXXnvZBlOBTsFNTWdzde3Xv/61PcqvsKZRBLcrrrjCBkNNV9PIrIKjAtb48eNtwNPXOlj3yCOPmFtvvdWGoC233LKs7X3zzTfNK6+8YuvvBhtsYAOqXkMHHRVEndkzClsKcJ9//rmdhtenTx/7vAsuuMB88cUXdhsApNPChQvNnDlzcm5TTXI3eXL33XfbkVSNfqpRVaPm0AGzAQMG2DrnnJKhqbh/+ctfbEY755xzzOuvv24buQ8++MDWM7ePPvrIHHnkkbb+qEY6U3812jl27Njsaxbz9ttv23/zR56VBXVAUfeXmlGoZrvQCLFq5IoVK+yo7I477mi80AHQ6667zvzf//2fmTx5shk1apQd6RX9nNZff33z05/+1NNrIgQ6xxYYOnSoqk7ObUOGDLG3DR8+vMnjdfuwYcOa3N63b9/MMccck/36oYceso8dM2ZMwcfqvhdeeCF726xZszJt27bNnHPOOT58VwDwP4ccckimXbt2malTp2Zve//99zMtW7bMqX/6XDVRVIvq6uoyI0aMyHkt1TQ9bv3118989dVX2dsffPBBe/sNN9yQvU21UrfNnj3b0/YuXbq0yW2vvvqqfa177rkne9tll12W6dChQ+bjjz/Oeez5559vv7dp06Z5el8A8Xf33XfbWlDoQznKMWXKFHtbx44dbcZyc2rTkUcemXP7+PHj7e0nnHBCzu3nnnuuvX306NFNstyoUaOabKOTI5ujeqtaVUj37t0zRxxxRMnnb7HFFplNNtkks2rVquxty5cvz/Tp08e+/8iRIws+b//997fbX8g777yT2WCDDbI/00MPPTSzevXqzOTJkzP19fW2FiN+mIqMknRUT4sTBGWzzTYz3/ve97JfayRFR/p0dAwA/KIpw5oqd8ghh9gRTYdmkGihknzqb0877TRzww032MX2NKOkEI1INDY2Zr/W6IamwD355JNVb7N7BGLlypV2Bo2mGOtcXS2W4tACVqqjmjankRvnQyPH+r5feOGFqrcFQDzdfPPNdo0U94cWPcqnRZmUsQrRok1uTv36xS9+kXO7Rm4lf2qwFq8qVEd16lk5a9Rq2m+h831Fp43o/lI0hfnjjz+2s/80m0UjtKrNmrHivL5XW2yxhV3wTzNn9K/O/dXosX4G+llqBPjhhx82gwYNst+/FvFiPd7oMRUZJWmqRbFi4wd3wHQonM2fPz+w9wRQe2bPnm3Djabb5dPBtPxGVNOHdV6Wpv5qil0x+a+nKYBqPgudB+uVtldT/zSFUNOM3aFJ0w8dCl1a2KRYaHUWrwKQPlqjpJzFowqtnFzsPp3fryYufxV3rSWgA2u6v9zXLvcgnqYMF1LOQlRqzLW2wR/+8Ac7fVr0MznvvPPs6SKVngerptr9sx09erR55pln7NRrfeg0EZ2iovOMtZ/QGgdBDgaheTS2KMnLqnai0QEvtMx6IRz1AhAlXcZB58nqEg8//OEPc85HC8vpp59um1otCvWd73zHdOrUyTbOClPuRaH0uS7NphBXiFYGBVDbSuW5Yvep3lT72uXQLBflRx2E69GjR/Z2NbuaqaIFn5qjBvbcc8817733nq2VGnF1Fjz1owZq+84880y7aJQGfbSwllZIdhpZnV+slZJpbKNFY4uKaFRVq3C6qQA50z68FkUACJJGMxW+NLqZT0fe82mkQpd60EJNuh7k888/nzPl2JH/ejoop0Xxyl0gqhRNfdMU6GuvvTZn9CK/9mrVUo0ua+oxAFSrb9++9oCZ6pt7wc8vv/zS1h/d76etttrK/vvWW2+Z/fbbL3u7vtZ2OPc3x72qszz33HN24T0tAFUtzd5ZtGiRbZ5lxowZOQ23PtfMGkSLc2xREQWp/PO2br/99iYjts610PKDGACESbNDdA7Yo48+ai9B4dAKnzr3thA1p5qirMcceOCBBc/T0pRlhR13M6oDfFpN3o9tzp+9ossN5ddZjSjr+o2Fvg/VXq3+DADlcprL/BXVtUqw6Hqz5Sj3cj+77babnRWj5tFNX2tlY/f7af0AvaZz6Z1iHnjgAXt+rGa8aFp1NebNm2dX0NdUZ01PFq2m7/7etJ/QVG1EixFbVETLwOucBp1ArylwEyZMsKFqnXXWyXmcjrIpnOl6ijonTItRqYC5p5oAQBguueQSe8kGLbSkxUbU8KlR1KXFdI5qIVog5LHHHrNBTwtDqTF2XwNRYUwjBJp+ptEMBUGN9uZfFqgSujbkvffea6fVaaE9Na8agci/jMcvf/lL889//tM+3rlcmq6zqMsbqdHW+b75tRlAOmihqELNo6bJ9uvXr6LX1IJImi2iAQsdHNPlxN544w17/qoW4Nt1113Lep1yL/ej2TSa2qvr1urSQzoIqWvTauE+TTF2nwqi00NUy3XtW82oEQ20aPEmXc5N9fG1116zp3Foto2mD7up1qteimbXKJvqOuXO962DmPl+85vf2KnN2jaH8q/e8+c//7kdwda5tk7jj+jQ2KIiCm1Tpkwxd911VzYoaiW+3XffPedxOno1fPhwuwCKVqvTSIOKEY0tgLBpBFYH4LTS529/+1s7RU0BSSOsxRpb0cG4Bx980AYZXbfwvvvuy96nc7j0XNU4jdyqBt5yyy3Za8xWQysy68CgztvSFGSd96vGNn/1Ub2XwqOuragVkjWK3LFjR3temb4/NcYA0km1rBA1dpU2tnLnnXfa548YMcJet1Z5TtfG1shlEHSwUQcNdeqFGk8txPTHP/6xSWNaiM55Va3UiKrqsBazUrOqWt+qVW6roxXl1ai6OV+rmc9vbHWAUD8LXcfXTY2ufsa6JrreU9uvawQjWi10zZ+ItwEAAAAAgIpxji0AAAAAINGYigwAQIi0grE+mlvFudjl0AAAQFM0tgAAhOiaa66x576WojUMNtxww9C2CQCApOMcWwAAQjR58mT7UYpWWnYuKwEAAJpHYwsAAAAASDQWjwIAAAAA1MY5tv3+dG2wWwIg9SafcY5JI+ojgGpRHwGguvrIiC0AAAAAINFobAEAAAAAiUZjCwAAAABINBpbAAAAAECi0dgCAAAAABKNxhYAAAAAkGg0tgAAAACARKOxBQAAAAAkGo0tAAAAACDRWkW9AUCUWn1V3rGdVR3XBL4tABAn1EcAQJLQ2KJmlBvSvDyXQAcgDaiPAICko7FFqlUT1ry+PiEOQJKEWR+FGgkACBLn2AI+hjjnAwDiLuxGk/oIAAgSI7aoueAWRrBy3oMRCgBxll+jwqyPhd4fAIBK0dii5oQZ5GhwASSJu1ZxEBAAkCQ0tqh5TqCiwQWAaJpcaiQAoFqc7AJ8Q4Eq6FDFOWYAkiiM+ijURwBApdiDAHkIbwAQbX2kRgIAvGLPARRAcwsAhYU1XZgaCQDwgr0GUATNLQAURnMLAIgb9hhAxJh2BwDFUR8BAOVgbwGUEOYKnYQ3AElCfQQAxAl7CiBGCG8AkoTmFgAQF+wlgGZwXUUAiAeaWwBAMewhgJghuAFAcdRIAEAhrQreWmP83Ekyuge/fif5XUIcUB9Rzv9Xmk0AQNRS39iGvbMt9X6EuuSKIrjR3KKW6qPw+45yUR8BAKlsbJNypLjQdrJjBhC0pNZI6iNKobkFACS+sa0mpLVeXP37r2wwgXwv7KCRj+CGpNVHP2sk9REAAKSqsW0uqPkVxsrV3PtVGupqOcStbljd5LaWi1tGsi1A2hrZONVI6qM/9TFuNTKq82w5+AcAiH1jW2gHWW44a7Oo9P0rGk2gCm2n1zBXCyGuWFhz309wI7ihqWK/h37USOpjMupjHGtkVKiRAIDYNbb5YS0/ADXXsJar2OsEGejc30ulIS4tO+5yApv7sQQ3ILwaSX1MVo0EAAAxamzdYc0dcNwBq82iTNmvt6KxhYfHmtBVGuKSHuAqDWs0t4xI1LpCNZL6mK76WGmNpD4CABCDxrZYWHOHtLYLC+/ol3dq6TmwRRHSmuN8314DXNLCGyMQQOU1Mr+ZdWqkn/Vx7WNMKuqjJKlGUh+rl8T9IgAgJY2tO7C5w5qCWuuFK5s8fmWn1k0CW6mgVk1Ac4eosBZd8RrgkhLe/ApscRmViOo8WyG41XZD69RHe3tejSxUH4Oqkfk1KowameYDgH7USOojAAARNbba8TkNrbuZbT1/mb2/xfxFJtNlbepa2aXehjYFtvyQ5jWYVbIaZ6nnBBHoKmlw4xreGIUAqj/o1/jZqrLqo7hrZBj1MewaSX0EAACxaGyLBbY2k2eZNXPnGdO/r5k/qItZ3Kurr9eKDYqzjUE1uEkdvSWwAf4c9GuY9nW2Prbo1tUs2Xp9s2hwV9u01nKNTHJ9DKpGxmXUNkpxPpABAEhRY+tuahtm5Aa2aadvbZb16m3vX92wyv5b6Q662DSo/J2dn9OlFLCibm7jslOnqQ1WHP4fI/imVgf9Orz9uXlq2vXm20dfZ2Zv19v197Uy8PpY6rFxqZFJHb2lRgIAkODGNr+p7TJhvslMmmo+uWBrs7xXLxvU3LyGNico6HnlBpcgG91abW6DDmxxGZHgPDIE1dQ6B/1avfmhPeDX989XG7NLda9dSX0U92Pj/PvudfQ2rfUxLqiPAICohLb3cTe1mm784Y2bm+W9mi4SVU3jouBQaXiIw5H8YryOdEQRKmoltAFBNrWqjzLxykFm8SZN62M1NTKt9dEr6iMAAOlUF3Zom75vVzNzl7XTjf2SH/ScAOc1TMQ5vMW5uSW0AdVPP9ZIrQ76TTq6VdG/qUqaWupjU9TH9GK0GABqV10YOxgntKmpLTYKUe1obbHnVhri4iiO4S0NP9dKxDnkI1mcc2oX92nn+0G/uNTHMC8JVMv1MS71mPoIAIhCXRhhQ6Ft3sD6kk2tH/w4/5IdcvJCVK1hRCJto7UZuzp8c01ttfWtueeX8/cc9/oY1nXHy0F9BAAgXHVhjEYotC3ctHQg8mtRoFKvE2TQCOvSG3EZlSC0AdVzZrNM+UHbyOtjuSppbuN6aSLqIwAA6VEXxmjE9D3qSwatOKx0m6RRiajDG6Etnb8niOZvcuaOa+tjoToYRH1kZksu6mMw0vQ7AgBIhlDmNDqrHzshzf0RBL+Cm9cdc1xHJfwMb4Q2wN/ZF8t6rcm5JE/Q9dEvaauPftTIqOtj3H9nAABIdGO7uFeLWOzwK5W28FaNpP4/BOIozrWiFuuju8GtpFZSH5ti1BYAEKZWwe7Q6lJxFNnZOZcbdhTe4rSIiZvzPXgNHIS2wvRzZDEnVPp7s6LRRFIj9X5+/U1XUh8lrjWyEl5+lq0bVjS5beXiNj5vEQAAtSewxjbqo7V+BrdKAlxQ4c2vEQ99D+X+/6k2tPkV3JJ+gARoerqDSY04HACMYkTYj/qo22luAQCoTqBDTWm5fmw1598qaMVx+p3fTa2CWbHQ5tyfVky3QyWoj9TH/MekEfURAJD4xlY7/HXWW2g/ogpvQY/wedlh+xHgwg6AXkIbAG9/W/q7UX2s67kstfUxzAa31utjnGe00NwCABLb2DqhTbbt/lmkjY97Zx/Ejt8Jb0EGOL9HNcrZ1nJCWzmjEPmPTyuCG8rl/G11alxm6+OAnrNTWx+lkvropd7FtT6mveYBAFBT59j26LDY9K2fa44bONfcNXNXE5VCga25YFJJyKvkHFw39/lmQY0++NnUhinOoxFApVQf9fGR6RPZNsSxPhaqgfnn4wZRI2lqg8NCewCARDe20r/tl6Zfm9nm7p47mjUz602UvEyJLvTYcsOc1wAX1lS6pDa1SUFwQyX2anzXvLTVxuaj8dE1t0J9TG595MAfAAAhXMdWBrRabe7f8U4TJT/O83UWeyn3tbxMwQtaHEIbq376Iy6/U/CnCbH1sf/D2b+/KA6O+F0fy3k96mPtCeP/d1x+pwAA4asLKripiZm1pCEnvO2x0zvZ4OZ8hCGIxasqCXBR7HDLfd84h7YkjUYQqlCpCfvcmP08zPoYFOpjOJJUHwEACFKgyWnhonrz/ILNsl9f3Wt0trl1JD28SRxHKbwEtjiHtiSiuUW59fGluRubiav+15hcud/fc35/gqiP+a8Z9Kr1Sa6PElZ9rJUZLdRHAEBQAu8qx83ewDy9tGdOc7vLPuNDa27DvtRQ1KMUfge2qEMboxFII/eslmcWbZ69fe/2M80Dh9wYaHPrfu2o6mNz7+uuj37WSK/1Me4H/ZJaH2luAQCJWjzKBjfTxiw0xoyYsZPpt+Fjdjqy09yan40224w8Kxva9K+fO7ugmrZyGzT3+zcXPvK/b69BtpKfGyt7BouFpOBl1FaL7KmpFdXJ/xx2vdnupZNN3ccdAqmPEkTT5uUAlvP+5TRn1dTIJNTHWhmtdaNGAgAStyqyMypxx6wh5sQeY7PNrSi83Tx/kLnr+V2z55RVG96aCyTVBpH855cTSLw0uUEfzfYyQhN1aEvqaESQwY2RjvRwDv5NnNndjDC5B//krcG3mYk7tjSHPXeqaTujNfUxhL8D6mOyUR8BoLYF2thqx6ugMOeLTmacvaVpczu0ywQz9LAJ9jyzU977sX1sqR2216lzQY84Oq/vdSQ37FAS1c+t1kMboxIo529Eze0d7YeY3Tu/nx25FdVKZ1GpIyf9wLw/af1E1kevTS71sTZQHwEAiRqxLdTc5oc3J8A9P+geYwat/Vrn5WrhqelLO2cf415lWVP44qTSABd0iKvkHDpCm78Ib2iuPupvZfTkAWZ6z85mUrdP7AG/fLokkOn/v/o4afm6Zuqybtka6a6Pca6R1Mfq62NaDvwJ9REAkJjGNr+5Hb2oPhve9mp8N2f01k2Nb782s83kFd1tgJOp7f8X4np0WNwkyMUl1FU6iutXaKlmQRhCW3wxzS79za1GbkUNa6EDgE3qY9vuxnQ2a5vc9t3sfe6DgcVQH5NbH9PIj+aW+ggACKWxLRTe1JS+1GFjM7jbJ3bhFIU0cRpd9yUwdL+CW9/6udnbFN7U3Lq5G91Ojcs8b6PfYc9rgGsueOUHOr9XNI1DaEtrU8uoBDzVx8YGW+Oeb7/ANril6qND9VENce/2Cwq+R9rrY379SGN9FGokAAARN7b54W3hN0FJYUsNqsKYgtkz3zSybs6IrZsenz8y4TS6pUZyS1HYC2Iko9IAly/IS3PEIbSlNbDljygQ3lDq918LSs1RjWyozza4XutjIX7Uxzg1uGHWyDjUx1qpkdRHAEAiGtv88CbZBlcBrsPaRtWZUpc2fga4uCGwBRvemGZXO9wHAN0N7jizgW1OqY/JRI0sD/URAJCYxrZYg+sEOFGIk/ypxkEL67wzBbg4hbdqRyMIbMGGN0Jb7XH+JtwNrv5OnYOAjjTWyLjVx2r58b3UWo1k5BYAkKjGtliAc0Zx3SGqkvPByhXVIipJD29+bXutBTY3piajkvroNLlO/QqyPjrvEbak10ehRoZTHznwBwCITWNbKsA5nEa3OYUCXtwueRFH+nmXM2rrd9Cs1cBWboAjsKFQfcz/W3Q3uqVQH4PnZ42kPjbf4FIjAQCxbGxLrWpZLCzkh7moQlrSRxai+B4IbU0R0tCcYqv+Fvr7jUt9TEONdG9/GKPJ1MemqI8AgMQ1tl4ub5P0sFSLCGyAP6iP0aCpBQAgnmLd2IZ9HVcEi8AGhPv3RY1MDuojAAA11Nh6CQIEuvggsAHx+tujPsYLNRIAgBpvbP0ICgS84BDWgHiiPsYDNRIAAP+ktrENO1gQAP+HsAakA/UxGNRIAAD8V/ONbVhBpRaCHWENQKW1Ie01kvoIAECwaGxDktZz3QhrAPxAjQQAANWgsY1YEsMcQQ1AWJK22jP1EQCAaNDYxlScwhxBDUCcxOmAIPURAIB4oLFNkCDP4yWcAUi6oGok9REAgPijsU0RwhcAFEeNBAAgveqi3gAAAAAAAKpBYwsAAAAASDQaWwAAAABAotHYAgAAAAASjcYWAAAAAJBoNLYAAAAAgESjsQUAAAAAJBqNLQAAAAAg0WhsAQAAAACJRmMLAAAAAEg0GlsAAAAAQKLR2AIAAAAAEo3GFgAAAACQaDS2AAAAAIBEo7EFAAAAACQajS0AAAAAINFobBGZ6ZdcYWbedlfUmwEAAAAg4VpFvQGIxpQzzy3rcT1PO8XUD+hf8fusmDnTLHl7gmnYYXvTulvXil8HAPw0/6mnzYJRz5qNbrgmWxMbv7eTWeewHxR9zrKJk8zMm4abHsf91HTYalCz77HozXFm4TPPmZVz5pq6tm1M36su9217AdS2Ra+/aebc90DR+9c7+3TTbsO+Jim+eukVW2OXfzrNrF6wwDTssJ3p/uMjyn5+Zs0as3DMWLPopVfM6q8WmVbdu5vOe+5mGrbduuz8226TAWa9oSfbz1cvXWbmjnzYLHv/Q1PXvt503nN30/idb+c8fvm06eaLP91i1r/gXNO6WzfP3zP81yKTyWQCeF3E3F//+tecr++55x7z7LPPmnvvvTfn9j333NOsu+66Fb/PyJEjzeGHH27GjBljdtlll5z7NtxwQ7P55pubJ554ouLXB4BKXHzxxeaSSy4xzi6wRYsWZujQoeamm24q+px///vfZtdddzUPPfSQOeyww0q+/ocffmgGDhxo9tlnH1sD27dvb374wx/6tr0AatuIESPMcccdZy699FKz0UYbNblftWedddYxSaFMuGjRIrPDDjuY5557zvz4xz+232O5LrjgAnPVVVeZE0880Wy//fbmscceM//617/M/fffb4444oii+Vfeeustc8MNN5irr77a/PKXv7S3nXDCCeapp54yv/rVr8ykSZPsvuGll14yO+20k71ftfi73/2uzba/+93vfPkZoHqM2Naon/zkJzlfv/baa7axzb8939KlS21AAwCYkk3wmjVrbFjq37/yWS8AUMq+++5rtttuO0/PWbVqla1Pbdq0aXLfkiVLTIcOHSreHjV8X3/9tamvr/f0vLFjx5o+ffrYg4wNDQ2envv555+ba6+9NufgpBrTIUOG2EZVBxdbtmxpby+Uc1Wv9b5HHnlk9jYNuqjRPfroo+3X77zz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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "contour_fig(40);" ] }, { "cell_type": "markdown", "id": "28461de7-59ba-4846-bce4-71b5e2903758", "metadata": {}, "source": [ "One can further use `animate` to make an animation of the comparison over time.\n", "\n", "The output is not shown here to save storage. But feel free to try this locally." ] }, { "cell_type": "code", "execution_count": 10, "id": "44b0eef7-a2b2-49f4-a392-8e23be8ca0f3", "metadata": {}, "outputs": [], "source": [ "setup_logging() # Show progress\n", "animate(\n", " contour_fig, # The function for plotting\n", " filename=\"vis.mp4\", # Filename\n", " fps=10, # Frame per second\n", " n_frames=len(t_data)) # Number of frames to plot" ] } ], "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 }