use dict instead of class

This commit is contained in:
Kashif Rasul committed 2022-11-28 23:13:27 +01:00
1 parent f6e7d77fe4
commit 4e78dd7dc5
3 files changed
+92 -81

No files matched your search

+1 -3
View File
@@ -1,4 +1,3 @@
# +
from typing import Any, Dict, Iterable, List, Optional
import torch
@@ -32,7 +31,6 @@ from gluonts.transform import (
ValidationSplitSampler,
VstackFeatures,
)
from torchscale.architecture.config import EncoderDecoderConfig
from lightning_module import TorchscaleLightningModule
from module import TorchscaleModel
@@ -60,7 +58,7 @@ class TorchscaleEstimator(PyTorchLightningEstimator):
freq: str,
prediction_length: int,
# Torchscale arguments
enc_dec_config: EncoderDecoderConfig,
enc_dec_config: Dict[str, Any],
input_size: int = 1,
context_length: Optional[int] = None,
num_feat_dynamic_real: int = 0,
+8 -7
View File
@@ -287,7 +287,7 @@ class TorchscaleModel(nn.Module):
num_feat_static_cat: int,
cardinality: List[int],
# torchscale config
enc_dec_config: EncoderDecoderConfig,
enc_dec_config: Dict[str, Any],
input_size: int = 1,
embedding_dimension: Optional[List[int]] = None,
distr_output: DistributionOutput = StudentTOutput(),
@@ -328,11 +328,12 @@ class TorchscaleModel(nn.Module):
self.distr_output = distr_output
self.param_proj = distr_output.get_args_proj(d_model)
enc_dec_config.encoder_embed_dim = d_model
enc_dec_config.decoder_embed_dim = d_model
config = EncoderDecoderConfig(**enc_dec_config)
config.encoder_embed_dim = d_model
config.decoder_embed_dim = d_model
self.encoder = Encoder(enc_dec_config)
self.decoder = Decoder(enc_dec_config)
self.encoder = Encoder(config)
self.decoder = Decoder(config)
# attention_args["dropout"] = dropout
# attention_args["causal"] = False
@@ -565,7 +566,7 @@ class TorchscaleModel(nn.Module):
future_time_feat,
)
enc_out = self.encoder(src=encoder_inputs)
enc_out = self.encoder(encoder_inputs)
params = self.param_proj(enc_out.transpose(0, 1)) # (B, T, D)
distr = self.output_distribution(params, trailing_n=1)
@@ -584,7 +585,7 @@ class TorchscaleModel(nn.Module):
repeats=self.num_parallel_samples, dim=0
)
repeated_enc_out = enc_out.repeat_interleave(
repeats=self.num_parallel_samples, dim=0
repeats=self.num_parallel_samples, dim=1
)
future_samples = []
+83 -71
View File
@@ -35,7 +35,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
"2022-11-28 19:48:37.174077: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: SSE3 SSE4.1 SSE4.2 AVX AVX2 FMA\n",
"2022-11-28 23:05:45.287845: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: SSE3 SSE4.1 SSE4.2 AVX AVX2 FMA\n",
"To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.\n"
]
}
@@ -46,7 +46,6 @@
"from gluonts.evaluation import make_evaluation_predictions, Evaluator\n",
"from pytorch_lightning.loggers import CSVLogger\n",
"from datasets import load_dataset\n",
"from torchscale.architecture.config import EncoderDecoderConfig\n",
"\n",
"from estimator import TorchscaleEstimator"
]
@@ -68,7 +67,7 @@
"metadata": {},
"outputs": [],
"source": [
"enc_dec_config = EncoderDecoderConfig(\n",
"enc_dec_config = dict(\n",
" encoder_attention_heads=2,\n",
" decoder_attention_heads=2,\n",
" encoder_layers=4,\n",
@@ -80,7 +79,7 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": 15,
"id": "1717d0d2",
"metadata": {},
"outputs": [],
@@ -99,7 +98,7 @@
" \n",
" batch_size=256,\n",
" num_batches_per_epoch=100,\n",
" trainer_kwargs=dict(gpus=\"1\", max_epochs=50, logger=CSVLogger(\".\", \"lightning_logs/\")),\n",
" trainer_kwargs=dict(accelerator='gpu', devices='1', max_epochs=50, logger=CSVLogger(\".\", \"lightning_logs/\")),\n",
" )"
]
},
@@ -108,7 +107,7 @@
"execution_count": null,
"id": "c77b420c",
"metadata": {
"scrolled": true
"scrolled": false
},
"outputs": [
{
@@ -117,8 +116,6 @@
"text": [
"/home/kashif/.env/pytorch/lib/python3.10/site-packages/pytorch_lightning/utilities/parsing.py:262: UserWarning: Attribute 'model' is an instance of `nn.Module` and is already saved during checkpointing. It is recommended to ignore them using `self.save_hyperparameters(ignore=['model'])`.\n",
" rank_zero_warn(\n",
"/home/kashif/.env/pytorch/lib/python3.10/site-packages/pytorch_lightning/trainer/connectors/accelerator_connector.py:446: LightningDeprecationWarning: Setting `Trainer(gpus='1')` is deprecated in v1.7 and will be removed in v2.0. Please use `Trainer(accelerator='gpu', devices='1')` instead.\n",
" rank_zero_deprecation(\n",
"GPU available: True (cuda), used: True\n",
"TPU available: False, using: 0 TPU cores\n",
"IPU available: False, using: 0 IPUs\n",
@@ -142,7 +139,7 @@
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "093dab1c2d694f2b879622f8a21f139e",
"model_id": "a197e41cbd984592a31e541a6ef43a59",
"version_major": 2,
"version_minor": 0
},
@@ -157,17 +154,31 @@
"name": "stderr",
"output_type": "stream",
"text": [
"Epoch 0, global step 100: 'train_loss' reached 6.82088 (best 6.82088), saving model to './lightning_logs/version_10/checkpoints/epoch=0-step=100.ckpt' as top 1\n",
"Epoch 1, global step 200: 'train_loss' reached 5.84754 (best 5.84754), saving model to './lightning_logs/version_10/checkpoints/epoch=1-step=200.ckpt' as top 1\n",
"Epoch 2, global step 300: 'train_loss' reached 5.61930 (best 5.61930), saving model to './lightning_logs/version_10/checkpoints/epoch=2-step=300.ckpt' as top 1\n",
"Epoch 3, global step 400: 'train_loss' reached 5.47171 (best 5.47171), saving model to './lightning_logs/version_10/checkpoints/epoch=3-step=400.ckpt' as top 1\n",
"Epoch 4, global step 500: 'train_loss' reached 5.35223 (best 5.35223), saving model to './lightning_logs/version_10/checkpoints/epoch=4-step=500.ckpt' as top 1\n",
"Epoch 5, global step 600: 'train_loss' reached 5.30912 (best 5.30912), saving model to './lightning_logs/version_10/checkpoints/epoch=5-step=600.ckpt' as top 1\n",
"Epoch 6, global step 700: 'train_loss' reached 5.25711 (best 5.25711), saving model to './lightning_logs/version_10/checkpoints/epoch=6-step=700.ckpt' as top 1\n",
"Epoch 7, global step 800: 'train_loss' was not in top 1\n",
"Epoch 8, global step 900: 'train_loss' reached 5.22801 (best 5.22801), saving model to './lightning_logs/version_10/checkpoints/epoch=8-step=900.ckpt' as top 1\n",
"Epoch 9, global step 1000: 'train_loss' reached 5.16079 (best 5.16079), saving model to './lightning_logs/version_10/checkpoints/epoch=9-step=1000.ckpt' as top 1\n",
"Epoch 10, global step 1100: 'train_loss' was not in top 1\n"
"Epoch 0, global step 100: 'train_loss' reached 6.56327 (best 6.56327), saving model to './lightning_logs/version_20/checkpoints/epoch=0-step=100.ckpt' as top 1\n",
"Epoch 1, global step 200: 'train_loss' reached 5.91539 (best 5.91539), saving model to './lightning_logs/version_20/checkpoints/epoch=1-step=200.ckpt' as top 1\n",
"Epoch 2, global step 300: 'train_loss' reached 5.66458 (best 5.66458), saving model to './lightning_logs/version_20/checkpoints/epoch=2-step=300.ckpt' as top 1\n",
"Epoch 3, global step 400: 'train_loss' reached 5.46733 (best 5.46733), saving model to './lightning_logs/version_20/checkpoints/epoch=3-step=400.ckpt' as top 1\n",
"Epoch 4, global step 500: 'train_loss' reached 5.36346 (best 5.36346), saving model to './lightning_logs/version_20/checkpoints/epoch=4-step=500.ckpt' as top 1\n",
"Epoch 5, global step 600: 'train_loss' reached 5.27607 (best 5.27607), saving model to './lightning_logs/version_20/checkpoints/epoch=5-step=600.ckpt' as top 1\n",
"Epoch 6, global step 700: 'train_loss' reached 5.25226 (best 5.25226), saving model to './lightning_logs/version_20/checkpoints/epoch=6-step=700.ckpt' as top 1\n",
"Epoch 7, global step 800: 'train_loss' reached 5.20599 (best 5.20599), saving model to './lightning_logs/version_20/checkpoints/epoch=7-step=800.ckpt' as top 1\n",
"Epoch 8, global step 900: 'train_loss' was not in top 1\n",
"Epoch 9, global step 1000: 'train_loss' reached 5.16118 (best 5.16118), saving model to './lightning_logs/version_20/checkpoints/epoch=9-step=1000.ckpt' as top 1\n",
"Epoch 10, global step 1100: 'train_loss' was not in top 1\n",
"Epoch 11, global step 1200: 'train_loss' reached 5.15817 (best 5.15817), saving model to './lightning_logs/version_20/checkpoints/epoch=11-step=1200.ckpt' as top 1\n",
"Epoch 12, global step 1300: 'train_loss' reached 5.15382 (best 5.15382), saving model to './lightning_logs/version_20/checkpoints/epoch=12-step=1300.ckpt' as top 1\n",
"Epoch 13, global step 1400: 'train_loss' reached 5.11824 (best 5.11824), saving model to './lightning_logs/version_20/checkpoints/epoch=13-step=1400.ckpt' as top 1\n",
"Epoch 14, global step 1500: 'train_loss' was not in top 1\n",
"Epoch 15, global step 1600: 'train_loss' was not in top 1\n",
"Epoch 16, global step 1700: 'train_loss' was not in top 1\n",
"Epoch 17, global step 1800: 'train_loss' reached 5.10534 (best 5.10534), saving model to './lightning_logs/version_20/checkpoints/epoch=17-step=1800.ckpt' as top 1\n",
"Epoch 18, global step 1900: 'train_loss' reached 5.09408 (best 5.09408), saving model to './lightning_logs/version_20/checkpoints/epoch=18-step=1900.ckpt' as top 1\n",
"Epoch 19, global step 2000: 'train_loss' reached 5.07192 (best 5.07192), saving model to './lightning_logs/version_20/checkpoints/epoch=19-step=2000.ckpt' as top 1\n",
"Epoch 20, global step 2100: 'train_loss' was not in top 1\n",
"Epoch 21, global step 2200: 'train_loss' was not in top 1\n",
"Epoch 22, global step 2300: 'train_loss' was not in top 1\n",
"Epoch 23, global step 2400: 'train_loss' was not in top 1\n",
"Epoch 24, global step 2500: 'train_loss' was not in top 1\n"
]
}
],
@@ -182,9 +193,11 @@
},
{
"cell_type": "code",
"execution_count": 9,
"execution_count": 8,
"id": "f8a362b6",
"metadata": {},
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"forecast_it, ts_it = make_evaluation_predictions(\n",
@@ -195,7 +208,7 @@
},
{
"cell_type": "code",
"execution_count": 10,
"execution_count": 9,
"id": "5fdc12da",
"metadata": {},
"outputs": [],
@@ -205,7 +218,7 @@
},
{
"cell_type": "code",
"execution_count": 11,
"execution_count": 10,
"id": "4b7d3409",
"metadata": {},
"outputs": [],
@@ -215,7 +228,7 @@
},
{
"cell_type": "code",
"execution_count": 12,
"execution_count": 11,
"id": "9b154bde",
"metadata": {},
"outputs": [],
@@ -225,7 +238,7 @@
},
{
"cell_type": "code",
"execution_count": 13,
"execution_count": 12,
"id": "0fdec8a7",
"metadata": {},
"outputs": [
@@ -233,8 +246,7 @@
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
"Running evaluation: 2247it [00:00, 3399.98it/s]\n",
"Running evaluation: 2247it [00:00, 3771.68it/s]\n",
"/home/kashif/.env/pytorch/lib/python3.10/site-packages/pandas/core/dtypes/astype.py:170: UserWarning: Warning: converting a masked element to nan.\n",
" return arr.astype(dtype, copy=True)\n"
]
@@ -246,59 +258,59 @@
},
{
"cell_type": "code",
"execution_count": 14,
"execution_count": 13,
"id": "7f28f4d3",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'MSE': 10018107.873432416,\n",
" 'abs_error': 26035099.499095917,\n",
"{'MSE': 28224175.008797746,\n",
" 'abs_error': 37351447.05586052,\n",
" 'abs_target_sum': 128632956.0,\n",
" 'abs_target_mean': 2385.272140631954,\n",
" 'seasonal_error': 189.49338196116761,\n",
" 'MASE': 2.4701614804361784,\n",
" 'MAPE': 0.25477670689181103,\n",
" 'sMAPE': 0.24819572961811426,\n",
" 'MSIS': 20.209983280943216,\n",
" 'QuantileLoss[0.1]': 11107718.37581723,\n",
" 'Coverage[0.1]': 0.1886774959204866,\n",
" 'QuantileLoss[0.2]': 17534385.729109436,\n",
" 'Coverage[0.2]': 0.2506860999851654,\n",
" 'QuantileLoss[0.3]': 21799774.12036043,\n",
" 'Coverage[0.3]': 0.29637665034861294,\n",
" 'QuantileLoss[0.4]': 24542475.651297044,\n",
" 'Coverage[0.4]': 0.3366525738021065,\n",
" 'QuantileLoss[0.5]': 26035099.4930306,\n",
" 'Coverage[0.5]': 0.37475893784305,\n",
" 'QuantileLoss[0.6]': 26299950.11746931,\n",
" 'Coverage[0.6]': 0.4088785046728972,\n",
" 'QuantileLoss[0.7]': 24979193.32426689,\n",
" 'Coverage[0.7]': 0.4523809523809524,\n",
" 'QuantileLoss[0.8]': 21707479.345738567,\n",
" 'Coverage[0.8]': 0.5081590268506158,\n",
" 'QuantileLoss[0.9]': 15351255.969729993,\n",
" 'Coverage[0.9]': 0.6027110221035455,\n",
" 'RMSE': 3165.1394714028665,\n",
" 'NRMSE': 1.3269510918633773,\n",
" 'ND': 0.20239836126517932,\n",
" 'wQuantileLoss[0.1]': 0.08635204166354717,\n",
" 'wQuantileLoss[0.2]': 0.13631332338432334,\n",
" 'wQuantileLoss[0.3]': 0.16947269811913854,\n",
" 'wQuantileLoss[0.4]': 0.19079461760403799,\n",
" 'wQuantileLoss[0.5]': 0.2023983612180272,\n",
" 'wQuantileLoss[0.6]': 0.2044573252088626,\n",
" 'wQuantileLoss[0.7]': 0.1941896859174012,\n",
" 'wQuantileLoss[0.8]': 0.16875519323165183,\n",
" 'wQuantileLoss[0.9]': 0.11934154704281222,\n",
" 'mean_absolute_QuantileLoss': 21039703.56964661,\n",
" 'mean_wQuantileLoss': 0.1635638659322002,\n",
" 'MAE_Coverage': 0.15104954754487465,\n",
" 'MASE': 3.0573827514240386,\n",
" 'MAPE': 0.30876189776929736,\n",
" 'sMAPE': 0.3119385377116399,\n",
" 'MSIS': 26.850209888001007,\n",
" 'QuantileLoss[0.1]': 16514360.619457962,\n",
" 'Coverage[0.1]': 0.13540275923453493,\n",
" 'QuantileLoss[0.2]': 24639972.0714408,\n",
" 'Coverage[0.2]': 0.2143042575285566,\n",
" 'QuantileLoss[0.3]': 30503361.37330259,\n",
" 'Coverage[0.3]': 0.2734201157098353,\n",
" 'QuantileLoss[0.4]': 34646364.46083483,\n",
" 'Coverage[0.4]': 0.3241358848835484,\n",
" 'QuantileLoss[0.5]': 37351446.74963215,\n",
" 'Coverage[0.5]': 0.3725522919448153,\n",
" 'QuantileLoss[0.6]': 38735412.66370968,\n",
" 'Coverage[0.6]': 0.4194481530930129,\n",
" 'QuantileLoss[0.7]': 38193044.51865159,\n",
" 'Coverage[0.7]': 0.47702492211838005,\n",
" 'QuantileLoss[0.8]': 35495781.72468124,\n",
" 'Coverage[0.8]': 0.5465435395341938,\n",
" 'QuantileLoss[0.9]': 29017368.437739775,\n",
" 'Coverage[0.9]': 0.6522771102210354,\n",
" 'RMSE': 5312.642940081494,\n",
" 'NRMSE': 2.227269102582971,\n",
" 'ND': 0.2903722981835271,\n",
" 'wQuantileLoss[0.1]': 0.12838358950141798,\n",
" 'wQuantileLoss[0.2]': 0.19155256038305457,\n",
" 'wQuantileLoss[0.3]': 0.23713488612749123,\n",
" 'wQuantileLoss[0.4]': 0.2693428304705587,\n",
" 'wQuantileLoss[0.5]': 0.29037229580289015,\n",
" 'wQuantileLoss[0.6]': 0.30113132643635804,\n",
" 'wQuantileLoss[0.7]': 0.29691492527507174,\n",
" 'wQuantileLoss[0.8]': 0.27594624914536864,\n",
" 'wQuantileLoss[0.9]': 0.22558269155953917,\n",
" 'mean_absolute_QuantileLoss': 31677456.957716737,\n",
" 'mean_wQuantileLoss': 0.2462623727446389,\n",
" 'MAE_Coverage': 0.13158944436203004,\n",
" 'OWA': nan}"
]
},
"execution_count": 14,
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
@@ -309,13 +321,13 @@
},
{
"cell_type": "code",
"execution_count": 15,
"execution_count": 14,
"id": "cc3f804d",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAB7kAAAXCCAYAAABuS1l6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeZhcdZk2/ruqurqq9y3pbJ2NBAIREgISCCCEgL4MiAKCv3GZSVB0GEdfGUEc3sFZUF98RVRmlJEZEVAHHIhsISZsSUggG9nXTjq971vt26nlnN8fp87p6u5au2s5VXV/rquvJLX1t6srtZznez+PTpIkCURERERERERERERERERERHlAn+sFEBERERERERERERERERERJYtFbiIiIiIiIiIiIiIiIiIiyhsschMRERERERERERERERERUd5gkZuIiIiIiIiIiIiIiIiIiPIGi9xERERERERERERERERERJQ3WOQmIiIiIiIiIiIiIiIiIqK8wSI3ERERERERERERERERERHlDRa5iYiIiIiIiIiIiIiIiIgob7DITUREREREREREREREREREeYNFbiIiIiIiIiIiIiIiIiIiyhsschMR5YDT6cS//Mu/4JJLLkFlZSVqampwxRVX4IknnoDf78/18oiIiIgoD3g8HmzZsgU//OEPceedd2LhwoXQ6XTQ6XT4l3/5l1wvj4iIiIjyxOjoKJ599ll8+ctfxvLly1FRUQGTyYSmpibcfvvtePXVV3O9RCKiSXSSJEm5XgQRUTHp7OzE2rVr0dHRAQAoLy9HKBSCIAgAgFWrVuG9995DXV1dDldJRERERFq3Y8cO3HDDDVHP++d//mcWuomIiIgoKUajEcFgUP232WyGwWCA2+1WT/uLv/gLbNy4EeXl5blYIhHRJExyExFlUTAYxG233YaOjg7MmTMH77zzDtxuNzweD/74xz+iqqoKhw8fxpe//OVcL5WIiIiI8kBdXR1uvPFGfPe738WLL76I2bNn53pJRERERJRngsEgVq9ejaeeegqtra3wer1wuVxob2/HV7/6VQDAli1b8Dd/8zc5XikR0RgmuYmIsuiZZ57BvffeCwDYvXs31qxZM+78F198EV/84hcBAO+++y5uvPHGrK+RiIiIiPJDKBSCwWAYd9qiRYvQ2dnJJDcRERERJW379u0xOwQBwH333Yenn34aANDV1YX58+dna2lERDExyU1ElEXPP/88AOCGG26YVOAGgL/8y7/E4sWLAQC/+93vsro2IiIiIsovEwvcRERERERTEa/ADUBNcwPAgQMHMr0cIqKksMhNRJQlHo8HH374IQB5hk00Op0ON998MwDg7bffztraiIiIiIiIiIiIiKIxm83q30OhUA5XQkQ0hkVuIqIsOX36NERRBABcfPHFMS+nnDcwMACLxZKVtRERERERERERERFFs2PHDvXvl1xySe4WQkQUgUVuIqIs6evrU/8+b968mJeLPC/yOkRERERERERERETZZLPZ8NhjjwEAPvGJT2DZsmU5XhERkYxFbiKiLHE6nerfy8vLY14u8rzI6xARERERERERERFliyiK+Ku/+iv09/fDbDbjl7/8Za6XRESkYpGbiIiIiIiIiIiIiIiIxvn2t7+NN998EwDwq1/9CitWrMjxioiIxrDITUSUJVVVVerfPR5PzMtFnhd5HSIiIiIiIiIiIqJsePDBB9Xk9s9//nN85StfyfGKiIjGY5GbiChL5s6dq/69t7c35uUiz4u8DhEREREREREREVGmPfTQQ3jiiScAAD/96U9x//3353ZBRERRsMhNRJQlF110EfR6+Wn3xIkTMS+nnDd79mzU19dnZW1ERERERERERERE3/3ud/H4448DAH7yk5/ggQceyPGKiIiiY5GbiChLysvLcc011wAAtm7dGvUykiThrbfeAgB86lOfytraiIiIiIiIiIiIqLg9+OCD+OlPfwpALnB/97vfzfGKiIhiY5GbiCiL1q9fDwDYvn079u3bN+n8l19+GW1tbQCAv/7rv87q2oiIiIiIiIiIiKg4Pfjgg+NalLPATURaxyI3EVEWrV+/HpdccgkkScLnPvc5vPfeewAAURTx8ssv42tf+xoA4C/+4i9w44035nKpRERERJQHrFYrRkZG1C9RFAEAHo9n3OkulyvHKyUiIiIirYqcwf2zn/2MLcqJKC/oJEmScr0IIqJi0tHRgRtuuAEdHR0A5DbmoijC5/MBAFatWoX33nsPdXV1OVwlEREREeWDRYsWobOzM+Hl1q9fj+eeey7zCyIiIiKivNLV1YWFCxcCAPR6PWbOnBn38g8++CAefPDBbCyNiCiuklwvgIio2CxatAjHjh3DT3/6U7zyyitob2+H0WjExz72MXzhC1/At771LZSWluZ6mURERERERERERFTglE5Ayt8HBwfjXp4dgohIK5jkJiIiIiIiIiIiIiIiIiKivMGZ3ERERERERERERERERERElDdY5CYiIiIiIiIiIiIiIiIiorzBIjcREREREREREREREREREeUNFrmJiIiIiIiIiIiIiIiIiChvsMhNRERERERERERERERERER5oyTXC9ACURTR19eHqqoq6HS6XC+HiIiIKCskSYLT6cTcuXOh13PvYzrwfSUREREVI76vTD++ryQiIqJilMr7Sha5AfT19WH+/Pm5XgYRERFRTnR3d6OpqSnXyygIfF9JRERExYzvK9OH7yuJiIiomCXzvpJFbgBVVVUA5Dusuro6x6shIiIiyg6Hw4H58+er74Vo+vi+koiIiIoR31emH99XEhERUTFK5X0li9yA2vKnurqabxqJiIio6LD9YfrwfSUREREVM76vTB++ryQiIqJilsz7Sg7JISIiIiIiIiIiIiIiIiKivMEiNxERERERERERERERERER5Q0WuYmIiIiIiIiIiIiIiIiIKG+wyE1ERERERERERERERERERHmDRW4iIiIiIiIiIiIiIiIiIsobLHITEREREREREREREREREVHeYJGbiIiIiIiIiIiIKMLBgwfx4x//GHfeeSeampqg0+mg0+lSuo2bbrpJvV5PT0+GVkpERERUnEpyvQAiIiIiIiIiIiIiLfnBD36A119/fcrXf+655/Dee+9Bp9NBkqQ0royIiIiIABa5iYiIiIiIiIiIiMZZs2YNVqxYgSuuuAJXXHEFFi1aBEEQkrru8PAwHnjgAXzqU5/CmTNn0NnZmeHVEhERERUfFrmJiIiIiIiIiIiIInzve9+b8nXvv/9+eDwePPXUU7jxxhvTuCoiIiIiUnAmNxEREREREREREVEabN26FS+88AL+8R//EUuWLMn1coiIiIgKFovcRERERERERERERNPkdrvxt3/7t7jwwgvx0EMP5Xo5RERERAWNRW4iIiIiIiIiymtbjvfjuy8fhRAM5XopRFTE/umf/gkdHR349a9/jdLS0pSuKwgCHA7HuC/KvWM9NvzvFw+jx+rJ9VKIiIhoAha5iYiIiJIQFIO5XgIRERHF8O/bzuHlgz3Y327J9VKIqEgdOnQITz75JNavX4/rr78+5es/9thjqKmpUb/mz5+fgVVSqn63pxNvHO3DG0f7cr0UIiIimoBFbiIiIqIkWLw8aE5ERKRVvoCc4LZ5AjleCREVo1AohHvvvRe1tbX46U9/OqXbePjhh2G329Wv7u7uNK+SpkJ5XXH6uOmZiIhIa0pyvQAiIiKifGDxWtBY0ZjrZRAREVEUQlAEADh8LHITUfb94he/wOHDh/HMM89gxowZU7oNk8kEk8mU5pXRdCmvK26BRW4iIiKtYZGbiIiIKAFREmH32XO9DCIiIorBH5KL3EzaEVEubNq0CTqdDs8//zx+97vfjTtvYGAAAHD33XfDZDLhH/7hH3DzzTfnYpk0BcrrilsI5XglRERENBGL3EREREQJCEEB7oA718sgIiKiGPxKktvLJDcR5YYkSdi5c2fM8/fu3QsA2LBhQ5ZWROmgvK54/NxERUREpDUschMREREl4Av64Al4cr0MIiIiikEpcjPJTUS5sGPHjpjnLVq0CJ2dneju7kZTU1P2FkVp4Qy3K3exXTkREZHm6HO9ACIiIiKtE0IC3H4muYmIiLRKaVfOmdxERJQuoijBGS5ue/xsV05ERKQ1THITERERJcAkNxERkXaFRAkhUQLAduVElD6bN2/GD37wA/Xffr8fAHDVVVepp33/+9/HrbfemvW1UXa4/UFIUvjvTHITERFpDovcRERERAkIQQFCSEBIDMGgN+R6OURERBRBaVUOsF05EaXP8PAw9u3bN+n0yNOGh4ezuSTKMkfEa4qbM7mJiIg0h0VuIiIiogSEkAAA8AQ8qDJV5Xg1REREFCmyyM125USULhs2bMCGDRumfTsdHR3Tvg3KDWfEa4pHYLtyIiIireFMbiIiojzjD/lzvYSi4wv6AADuAOdyExERaY0QGis8MMlNRETp4vCOvaa42K6ciIhIc1jkJiIiyjNt1rZcL6HoqEVuP4vcREREWhMISerfOZObiIjSJTLJLQRFBENinEsTERFRtrHITURElGfOjp7N9RKKjhAca1dORERE2hLZrtztD7EIQUREaTFxBIbbz5blREREWsIiNxERUZ4Zdg/D6rXmehlFJXImNxEREWlLZJEbYEtZIiJKj4kjMDx+vr4QERFpCYvcREREeSQoBhEQA+hx9OR6KUWFM7mJiIi0a2KRm3O5iYgoHSaOwHALTHITERFpCYvcREREeURJErPInV1sV05ERKRd/tD4ooOdc7mJiCgNJm6acrNTCBERkaawyE1ERJRHlCJrv6sfkiTleDXFQ01y+5nkJiIi0hqBSW4iIsqAyTO5+fpCRESkJSxyExER5RGlyOoP+THkHsrxaoqDKIkIiPLBDSa5iYiItGdiu/KJRQkiIqKpcExKcrNdORERkZawyE1ERJRHIousbFmLine truncated
"image/png": "iVBORw0KGgoAAAANSUhEUgAAB7cAAAXCCAYAAABwgmnJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/av/WaAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOz9d3xc5Zk3/n+madQly5Z77xiXYMChY8Ap4NDtbNquTcmGtC+EEAjPJpssIQ88EAL8NiEhCSXZBDaxwTSHamwMxtjYBveu3sv0Pqf8/jg6oxlN0fT6eb9eemGdOXPmnpEY3XNf93VdGlmWZRAREREREREREREREREREeUxba4HQERERERERERERERERERENBoGt4mIiIiIiIiIiIiIiIiIKO8xuE1ERERERERERERERERERHmPwW0iIiIiIiIiIiIiIiIiIsp7DG4TEREREREREREREREREVHeY3CbiIiIiIiIiIiIiIiIiIjyHoPbRERERERERERERERERESU9xjcJiIiIiIiIiIiIiIiIiKivMfgNhERERERERERERERERER5T0Gt4mIiIiIiIiIiIiIiIiIKO8xuE1ElEV2ux0///nPsWTJElRXV6Ourg7nnnsuHnnkEfh8vlwPj4iIiIjynMvlwuuvv477778fN9xwA2bMmAGNRgONRoOf//znuR4eERERERWIwcFBPPPMM/jGN76BRYsWoaqqCkajEVOnTsV1112HTZs25XqIREQRaWRZlnM9CCKiUtDa2oqVK1eipaUFAFBZWQlRFOH1egEAZ511FrZs2YIxY8bkcJRERERElM+2bduGyy67LOJtP/vZzxjgJiIiIqK4GAwGCIIQ+L68vBw6nQ5OpzNw7Morr8TGjRtRWVmZiyESEUXEzG0ioiwQBAFXX301WlpaMGnSJLz99ttwOp1wuVz43//9X9TU1OCTTz7BN77xjVwPlYiIiIjy3JgxY3DFFVfgRz/6EZ5//nlMnDgx10MiIiIiogIjCAJWrFiBJ554AqdPn4bb7YbD4UBzczNuueUWAMDrr7+Ob33rWzkeKRFRKGZuExFlwVNPPYVbb70VAPDhhx/i/PPPD7n9+eefx9e+9jUAwDvvvIMrrrgi62MkIiIiovwniiJ0Ol3IsZkzZ6K1tZWZ20REREQUt61bt0atCAQAt912G5588kkAQFtbG6ZNm5atoRERxcTMbSKiLPjzn/8MALjsssvCAtsA8JWvfAWzZs0CAPzlL3/J6tiIiIiIqHCMDGwTERERESUjVmAbQCB7GwD27NmT6eEQEcWNwW0iogxzuVzYsWMHAKVPTSQajQZf/OIXAQBvvfVW1sZGRERERERERERENFJ5eXng36Io5nAkREShGNwmIsqwo0ePQpIkAMDixYujnqfe1tPTA5PJlJWxEREREREREREREY20bdu2wL+XLFmSu4EQEY3A4DYRUYZ1dXUF/j1lypSo5wXfFnwfIiIiIiIiIiIiomyxWCx44IEHAAAXX3wxFixYkOMRERENY3CbiCjD7HZ74N+VlZVRzwu+Lfg+RERERERERERERNkgSRL+9V//Fd3d3SgvL8dvfvObXA+JiCgEg9tERERERERERERERESE22+/Ha+99hoA4Le//S2WLl2a4xEREYVicJuIKMNqamoC/3a5XFHPC74t+D5EREREREREREREmXbXXXcFMrUfffRR3HzzzTkeERFROAa3iYgybPLkyYF/d3Z2Rj0v+Lbg+xARERERERERERFl0t13341HHnkEAPCrX/0Kd9xxR24HREQUBYPbREQZdsYZZ0CrVd5uDx06FPU89baJEyeioaEhK2MjIiIiIiIiIiKi0vajH/0IDz/8MADgoYcewg9/+MMcj4iIKDoGt4mIMqyyshIXXnghAOCNN96IeI4sy3jzzTcBAJ///OezNjYiIiIiIiIiIiIqXXfddRd+9atfAVAC2z/60Y9yPCIiotgY3CYiyoJ169YBALZu3Ypdu3aF3b5hwwY0NTUBAP7t3/4tq2MjIiIiIiIiIiKi0nPXXXeFlCJnYJuICgGD20REWbBu3TosWbIEsizjxhtvxJYtWwAAkiRhw4YN+OY3vwkAuPLKK3HFFVfkcqhERERElOfMZjMGBgYCX5IkAQBcLlfIcYfDkeOREhEREVG+Cu6x/etf/5qlyImoYGhkWZZzPQgiolLQ0tKCyy67DC0tLQCUcuWSJMHj8QAAzjrrLGzZsgVjxozJ4SiJiIiIKN/NnDkTra2to563bt06PPvss5kfEBEREREVlLa2NsyYMQMAoNVq0djYGPP8u+66C3fddVc2hkZENCp9rgdARFQqZs6ciQMHDuBXv/oVXnzxRTQ3N8NgMODMM8/EV7/6VXz/+99HWVlZrodJRERERERERERERUyt/KP+u7e3N+b5rAhERPmEmdtERERERERERERERERERJT32HObiIiIiIiIiIiIiIiIiIjyHoPbRERERERERERERERERESU9xjcJiIiIiIiIiIiIiIiIiKivMfgNhERERERERERERERERER5T0Gt4mIiIiIiIiIiIiIiIiIKO/pcz2AXJIkCV1dXaipqYFGo8n1cIiIiIiyQpZl2O12TJ48GVot9zqmA+eVREREVIo4r0w/ziuJiIioFCUyryzp4HZXVxemTZuW62EQERER5UR7ezumTp2a62EUBc4riYiIqJRxXpk+nFcSERFRKYtnXlnSwe2amhoAygtVW1ub49EQERERZYfNZsO0adMCcyFKHeeVREREVIo4r0w/ziuJiIioFCUyryzp4LZa2qe2tpaTRSIiIio5LHOYPpxXEhERUSnjvDJ9OK8kIiKiUhbPvJLNcIiIiIiIiIiIiIiIiIiIKO8xuE1ERERERERERERERERERHmPwW0iIiIiIiIiIiIiIiIiIsp7OQ1uf/zxx/jyl7+MyZMnw2AwoL6+HhdffDGeeeYZyLIcdr4oinj00UexZMkSVFRUoLGxEV/+8pdx9OjRHIyeiIiIiIiIiIiIiIiIiIiyRZ+rB37hhRfwL//yLxBFEcuXL8fFF1+M/v5+vP/++/jggw/wzjvv4G9/+1vgfEmSsHbtWmzatAn19fVYvXo1BgYGsHHjRmzevBlbt27FihUrcvV0iIiIiIiIiIiIiIiIiIgog3KSuS0IAr7zne9AFEX87W9/w969e/H3v/8d7777Lg4cOICGhgY899xz2Lp1a+A+Tz/9NDZt2oR58+bh2LFj2LhxI7Zt24YNGzbA5XLh61//OgRByMXTISIiIiIiIiIiIiIiIiKiDMtJcPvYsWPo6+vDggUL8LWvfS3ktjPOOAPf+MY3AChly1W//vWvAQAPPfQQJkyYEDh+44034pprrsGpU6fw8ssvZ2H0RERERERERERERERERESUbTkJbhuNxrjOGzt2LACgubkZR48eRUVFBVavXh123po1awAAr776avoGSUREREREREREREREREREeSMnwe3Zs2djzpw5OH78OJ577rmQ244ePYq//vWvGDNmDK6//noAwP79+wEAixcvhsFgCLve8uXLAQAHDhzI8MiJiIiIiIiIiIiIiIiIiCgXchLc1ul0+POf/4z6+np8/etfx9lnn42vfOUruPzyy7F06VJMnToVW7ZsQUNDAwCgra0NADB16tSI11OPt7a2xnxcr9cLm80W8kVERERERERERERERERERPkvJ8FtALjwwgvx3nvvYfbs2di3bx/+/ve/Y+vWrdBqtfjc5z6H2bNnB851OBwAgMrKyojXqqqqAgDY7faYj/nAAw+grq4u8DVt2rQ0PRsiIiIiIiIiIiIiIiIiIsqknAW3n3/+eaxYsQLTpk3Drl274HA4cOLECaxfvx6PPPIILr/8cni93rQ+5r333gur1Rr4am9vT+v1iYiIiIiIiIiIiIiIiIgoM/S5eNCTJ09i3bp1GD9+PF577TVUV1cDAObNm4cnn3wSXV1deO211/D000/j29/+duB2l8sV8XpOpxMAUFNTE/NxjUYjjEZjGp8JERERERERERERERERERFlQ04yt//3f/8Xfr8fX/ziFwOB62Bf/vKXAQDbt28HAEyfPh0A0NHREfF66vEZM2ZkYrhERESUBL/oz/UQiIiIiKjEuPyREyOIiIiIqPi4/W502CLHDql45SS4rQaj6+rqIt6uHjebzQCAZcuWAQAOHToEvz98oXzfvn0AgKVLl6Z9rERERJQ4WZZhcptSuobb707TaIiIiIioVBztP5rrIRARERFRFnTZu7DhyAacNp3O9VAoy3IS3J44cSIAYM+ePRFv//jjjwEAM2fOBADMmjULZ5xxBtxuNzZv3hx2/saNGwEAV199dQZGS0RERIly+p0pZ830u/rTNBoiIiIiKhUtlhZukiQiIiIqcvu69+HV46/C5XfB5rXlejiUZTkJbl977bUAlLLjv/vd70Ju++ijj/Doo48CANasWRM4fueddwIA7r77bvT19QWOv/jii3jllVcwd+7cwHWJiIgotxw+BzyCJ6VrDLgGIMtymkZERERERKXALbjRZG7K9TCIiIiIKAO8ghf/PPlP7O7cDRnKuqHVa83xqCjbchLcXr58Oe666y4AwHe+8x0sXrwYX/7yl3HRRRfhwgsvhNPpxL//+79j1apVgfvcfPPNuP7663Hy5EksXLgQa9euxWWXXYY1a9agoqICf/3rX6HX63PxdIiIiGiEdAS3nb7Us7+JiIiIqLR4BS+D20RERERFyCf6sOHIBrRZ20KOO31OiJKYo1FRLuQkuA0ADz/8MF588UV8/vOfR09PDzZt2oQjR47g0ksvxXPPPYcnn3wy5HytVosNGzbgkUceweTJk/Haa6/h4MGDuPHGG7Fnzx589rOfzdEzISIiopHsXjvcQmrlIN2CGw6fI00jIiIiIqJiJ8kS/JIfXfYuliYnIiIiKjJOnzPiWqEMmaXJS0xLine truncated
"text/plain": [
"<Figure size 2000x1500 with 9 Axes>"
]