mirror of
https://git.gfz-potsdam.de/naaice/model-training.git
synced 2025-12-16 02:28:22 +01:00
1501 lines
226 KiB
Plaintext
1501 lines
226 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## General Information"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"This notebook is used to train a simple neural network model to predict the chemistry in the barite benchmark (50x50 grid). The training data is stored in the repository using **git large file storage** and can be downloaded after the installation of git lfs using the `git lfs pull` command.\n",
|
||
"\n",
|
||
"It is then recommended to create a Python environment using miniconda. The necessary dependencies are contained in `environment.yml` and can be installed using `conda env create -f environment.yml`.\n",
|
||
"\n",
|
||
"The data set is divided into a design and result part and consists of the iterations of a reference simulation. The design part of the data set contains the chemical concentrations at time $t$ and the result part at time $t+1$, which are to be learned by the model."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Setup Libraries"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"2025-02-14 15:03:29.350232: I tensorflow/core/util/port.cc:153] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.\n",
|
||
"2025-02-14 15:03:29.368766: I tensorflow/core/platform/cpu_feature_guard.cc:210] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
|
||
"To enable the following instructions: SSE4.1 SSE4.2 AVX AVX2 AVX_VNNI FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Running Keras in version 3.6.0\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"import keras\n",
|
||
"from keras.layers import Dense, Dropout, Input, BatchNormalization\n",
|
||
"import tensorflow as tf\n",
|
||
"import h5py\n",
|
||
"import numpy as np\n",
|
||
"import pandas as pd\n",
|
||
"import time\n",
|
||
"import sklearn.model_selection as sk\n",
|
||
"import matplotlib.pyplot as plt\n",
|
||
"from sklearn.cluster import KMeans\n",
|
||
"from sklearn.pipeline import Pipeline, make_pipeline\n",
|
||
"from sklearn.preprocessing import StandardScaler, MinMaxScaler\n",
|
||
"from imblearn.over_sampling import SMOTE\n",
|
||
"from imblearn.under_sampling import RandomUnderSampler\n",
|
||
"from imblearn.over_sampling import RandomOverSampler\n",
|
||
"from collections import Counter\n",
|
||
"import os\n",
|
||
"from preprocessing import *\n",
|
||
"from sklearn import set_config\n",
|
||
"from importlib import reload\n",
|
||
"set_config(transform_output = \"pandas\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"%load_ext autoreload\n",
|
||
"%autoreload 2"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Define parameters"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"dtype = \"float32\"\n",
|
||
"activation = \"relu\"\n",
|
||
"\n",
|
||
"lr = 0.001\n",
|
||
"batch_size = 512\n",
|
||
"epochs = 50 # default 400 epochs\n",
|
||
"\n",
|
||
"lr_schedule = keras.optimizers.schedules.ExponentialDecay(\n",
|
||
" initial_learning_rate=lr,\n",
|
||
" decay_steps=2000,\n",
|
||
" decay_rate=0.9,\n",
|
||
" staircase=True\n",
|
||
")\n",
|
||
"\n",
|
||
"optimizer_simple = keras.optimizers.Adam(learning_rate=lr_schedule)\n",
|
||
"optimizer_large = keras.optimizers.Adam(learning_rate=lr_schedule)\n",
|
||
"optimizer_paper = keras.optimizers.Adam(learning_rate=lr_schedule)\n",
|
||
"\n",
|
||
"\n",
|
||
"loss = keras.losses.Huber()\n",
|
||
"\n",
|
||
"sample_fraction = 0.8"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Setup the model"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential\"</span>\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1mModel: \"sequential\"\u001b[0m\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
|
||
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
|
||
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
|
||
"│ dense (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">1,280</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_1 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">16,512</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_2 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">9</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">1,161</span> │\n",
|
||
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
|
||
"┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
|
||
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
|
||
"│ dense (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m1,280\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_1 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m16,512\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_2 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m9\u001b[0m) │ \u001b[38;5;34m1,161\u001b[0m │\n",
|
||
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">18,953</span> (74.04 KB)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m18,953\u001b[0m (74.04 KB)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">18,953</span> (74.04 KB)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m18,953\u001b[0m (74.04 KB)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# small model\n",
|
||
"model_simple = keras.Sequential(\n",
|
||
" [\n",
|
||
" keras.Input(shape = (9,), dtype = \"float32\"),\n",
|
||
" keras.layers.Dense(units = 128, activation = \"linear\", dtype = \"float32\"),\n",
|
||
" # Dropout(0.2),\n",
|
||
" keras.layers.Dense(units = 128, activation = \"elu\", dtype = \"float32\"),\n",
|
||
" keras.layers.Dense(units = 9, dtype = \"float32\")\n",
|
||
" ]\n",
|
||
")\n",
|
||
"\n",
|
||
"model_simple.compile(optimizer=optimizer_simple, loss = loss)\n",
|
||
"model_simple.summary()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 5,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential_1\"</span>\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1mModel: \"sequential_1\"\u001b[0m\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
|
||
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
|
||
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
|
||
"│ dense_3 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">5,120</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_4 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">1024</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">525,312</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_5 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">524,800</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_6 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">9</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">4,617</span> │\n",
|
||
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
|
||
"┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
|
||
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
|
||
"│ dense_3 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m5,120\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_4 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1024\u001b[0m) │ \u001b[38;5;34m525,312\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_5 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m524,800\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_6 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m9\u001b[0m) │ \u001b[38;5;34m4,617\u001b[0m │\n",
|
||
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">1,059,849</span> (4.04 MB)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m1,059,849\u001b[0m (4.04 MB)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">1,059,849</span> (4.04 MB)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m1,059,849\u001b[0m (4.04 MB)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# large model\n",
|
||
"model_large = keras.Sequential(\n",
|
||
" [keras.layers.Input(shape=(9,), dtype=dtype),\n",
|
||
" keras.layers.Dense(512, activation='relu', dtype=dtype),\n",
|
||
" keras.layers.Dense(1024, activation='relu', dtype=dtype),\n",
|
||
" keras.layers.Dense(512, activation='relu', dtype=dtype),\n",
|
||
" keras.layers.Dense(9, dtype=dtype)\n",
|
||
" ])\n",
|
||
"\n",
|
||
"model_large.compile(optimizer=optimizer_large, loss = loss)\n",
|
||
"model_large.summary()\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\">Model: \"sequential_2\"</span>\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1mModel: \"sequential_2\"\u001b[0m\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
|
||
"┃<span style=\"font-weight: bold\"> Layer (type) </span>┃<span style=\"font-weight: bold\"> Output Shape </span>┃<span style=\"font-weight: bold\"> Param # </span>┃\n",
|
||
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
|
||
"│ dense_7 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">128</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">1,664</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_8 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">33,024</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_9 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">512</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">131,584</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_10 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">256</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">131,328</span> │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_11 (<span style=\"color: #0087ff; text-decoration-color: #0087ff\">Dense</span>) │ (<span style=\"color: #00d7ff; text-decoration-color: #00d7ff\">None</span>, <span style=\"color: #00af00; text-decoration-color: #00af00\">12</span>) │ <span style=\"color: #00af00; text-decoration-color: #00af00\">3,084</span> │\n",
|
||
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
|
||
"┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
|
||
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
|
||
"│ dense_7 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m128\u001b[0m) │ \u001b[38;5;34m1,664\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_8 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m33,024\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_9 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m512\u001b[0m) │ \u001b[38;5;34m131,584\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_10 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m256\u001b[0m) │ \u001b[38;5;34m131,328\u001b[0m │\n",
|
||
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
|
||
"│ dense_11 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m12\u001b[0m) │ \u001b[38;5;34m3,084\u001b[0m │\n",
|
||
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Total params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">300,684</span> (1.15 MB)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Total params: \u001b[0m\u001b[38;5;34m300,684\u001b[0m (1.15 MB)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">300,684</span> (1.15 MB)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m300,684\u001b[0m (1.15 MB)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\"><span style=\"font-weight: bold\"> Non-trainable params: </span><span style=\"color: #00af00; text-decoration-color: #00af00\">0</span> (0.00 B)\n",
|
||
"</pre>\n"
|
||
],
|
||
"text/plain": [
|
||
"\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"# model from paper\n",
|
||
"# (see https://doi.org/10.1007/s11242-022-01779-3 model for the complex chemistry)\n",
|
||
"model_paper = keras.Sequential(\n",
|
||
" [keras.layers.Input(shape=(12,), dtype=dtype),\n",
|
||
" keras.layers.Dense(128, activation='relu', dtype=dtype),\n",
|
||
" keras.layers.Dense(256, activation='relu', dtype=dtype),\n",
|
||
" keras.layers.Dense(512, activation='relu', dtype=dtype),\n",
|
||
" keras.layers.Dense(256, activation='relu', dtype=dtype),\n",
|
||
" keras.layers.Dense(12, dtype=dtype)\n",
|
||
" ])\n",
|
||
"\n",
|
||
"model_paper.compile(optimizer=optimizer_paper, loss = loss)\n",
|
||
"model_paper.summary()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Define transformer functions"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 7,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def Safelog(val):\n",
|
||
" # get range of vector\n",
|
||
" if val > 0:\n",
|
||
" return np.log10(val)\n",
|
||
" elif val < 0:\n",
|
||
" return -np.log10(-val)\n",
|
||
" else:\n",
|
||
" return 0\n",
|
||
"\n",
|
||
"def Safeexp(val):\n",
|
||
" if val > 0:\n",
|
||
" return -10 ** -val\n",
|
||
" elif val < 0:\n",
|
||
" return 10 ** val\n",
|
||
" else:\n",
|
||
" return 0"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 8,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# ? Why does the charge is using another logarithm than the other species\n",
|
||
"\n",
|
||
"func_dict_in = {\n",
|
||
" \"H\" : np.log1p,\n",
|
||
" \"O\" : np.log1p,\n",
|
||
" \"Charge\" : Safelog,\n",
|
||
" \"H_0_\" : np.log1p,\n",
|
||
" \"O_0_\" : np.log1p,\n",
|
||
" \"Ba\" : np.log1p,\n",
|
||
" \"Cl\" : np.log1p,\n",
|
||
" \"S_2_\" : np.log1p,\n",
|
||
" \"S_6_\" : np.log1p,\n",
|
||
" \"Sr\" : np.log1p,\n",
|
||
" \"Barite\" : np.log1p,\n",
|
||
" \"Celestite\" : np.log1p,\n",
|
||
"}\n",
|
||
"\n",
|
||
"func_dict_out = {\n",
|
||
" \"H\" : np.expm1,\n",
|
||
" \"O\" : np.expm1,\n",
|
||
" \"Charge\" : Safeexp,\n",
|
||
" \"H_0_\" : np.expm1,\n",
|
||
" \"O_0_\" : np.expm1,\n",
|
||
" \"Ba\" : np.expm1,\n",
|
||
" \"Cl\" : np.expm1,\n",
|
||
" \"S_2_\" : np.expm1,\n",
|
||
" \"S_6_\" : np.expm1,\n",
|
||
" \"Sr\" : np.expm1,\n",
|
||
" \"Barite\" : np.expm1,\n",
|
||
" \"Celestite\" : np.expm1,\n",
|
||
"}\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Read data from `.h5` file and convert it to a `pandas.DataFrame`"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 9,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# os.chdir('/mnt/beegfs/home/signer/projects/model-training')\n",
|
||
"data_file = h5py.File(\"barite_50_4_corner.h5\")\n",
|
||
"\n",
|
||
"design = data_file[\"design\"]\n",
|
||
"results = data_file[\"result\"]\n",
|
||
"\n",
|
||
"df_design = pd.DataFrame(np.array(design[\"data\"]).transpose(), columns = np.array(design[\"names\"].asstr()))\n",
|
||
"df_results = pd.DataFrame(np.array(results[\"data\"]).transpose(), columns = np.array(results[\"names\"].asstr()))\n",
|
||
"\n",
|
||
"data_file.close()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"species_columns = ['H', 'O', 'Charge', 'Ba', 'Cl', 'S', 'Sr', 'Barite', 'Celestite']"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/home/signer/bin/miniconda3/envs/training/lib/python3.11/site-packages/sklearn/base.py:1473: ConvergenceWarning: Number of distinct clusters (1) found smaller than n_clusters (2). Possibly due to duplicate points in X.\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n"
|
||
]
|
||
},
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Amount class 0 before: 0.9521309523809524\n",
|
||
"Amount class 1 before: 0.04786904761904762\n",
|
||
"Using Oversampling\n",
|
||
"Amount class 0 after: 0.5\n",
|
||
"Amount class 1 after: 0.5\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"preprocess = preprocessing(func_dict_in=func_dict_in, func_dict_out=func_dict_out)\n",
|
||
"X, y = preprocess.cluster(df_design[species_columns], df_results[species_columns])\n",
|
||
"# X, y = preprocess.funcTranform(X, y)\n",
|
||
"\n",
|
||
"X_train, X_test, y_train, y_test = preprocess.split(X, y, ratio = 0.2)\n",
|
||
"X_train, y_train = preprocess.balancer(X_train, y_train, strategy = \"over\")\n",
|
||
"preprocess.scale_fit(X_train, y_train, scaling = \"individual\")\n",
|
||
"X_train, X_test, y_train, y_test = preprocess.scale_transform(X_train, X_test, y_train, y_test)\n",
|
||
"X_train, X_val, y_train, y_val = preprocess.split(X_train, y_train, ratio = 0.1)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<matplotlib.contour.QuadContourSet at 0x7a6a8a5e9c10>"
|
||
]
|
||
},
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"timestep=250\n",
|
||
"plt.imshow(np.array(X[\"Barite\"][(timestep*2500):(timestep*2500+2500)]).reshape(50,50), origin='lower')\n",
|
||
"plt.contour(np.array(X[\"Class\"][(timestep*2500):(timestep*2500+2500)]).reshape(50,50), origin='lower', colors='red')\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Preprocess Data\n",
|
||
"\n",
|
||
"The data are preprocessed in the following way:\n",
|
||
"\n",
|
||
"1. Label data points in the `design` dataset with `reactive` and `non-reactive` labels using kmeans clustering\n",
|
||
"2. Transform `design` and `results` data set into log-scaled data.\n",
|
||
"3. Split data into training and test sets.\n",
|
||
"4. Learn scaler on training data for `design` and `results` together (option `global`) or individual (option `individual`).\n",
|
||
"5. Transform training and test data.\n",
|
||
"6. Split training data into training and validation dataset."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stderr",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"/home/signer/bin/miniconda3/envs/training/lib/python3.11/site-packages/sklearn/base.py:1473: ConvergenceWarning: Number of distinct clusters (1) found smaller than n_clusters (2). Possibly due to duplicate points in X.\n",
|
||
" return fit_method(estimator, *args, **kwargs)\n"
|
||
]
|
||
},
|
||
{
|
||
"ename": "KeyError",
|
||
"evalue": "'S'",
|
||
"output_type": "error",
|
||
"traceback": [
|
||
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
||
"\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)",
|
||
"Cell \u001b[0;32mIn[13], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m X_train, X_val, X_test, y_train, y_val, y_test, scaler_X, scaler_y \u001b[38;5;241m=\u001b[39m preprocessing_training(df_design[species_columns], df_results[species_columns], func_dict_in, func_dict_out, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124moff\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mglobal\u001b[39m\u001b[38;5;124m'\u001b[39m, \u001b[38;5;241m0.1\u001b[39m)\n",
|
||
"File \u001b[0;32m~/Documents/model-training/preprocessing.py:161\u001b[0m, in \u001b[0;36mpreprocessing_training\u001b[0;34m(df_design, df_targets, func_dict_in, func_dict_out, sampling, scaling, test_size)\u001b[0m\n\u001b[1;32m 158\u001b[0m df_design \u001b[38;5;241m=\u001b[39m clustering(df_design)\n\u001b[1;32m 159\u001b[0m df_targets \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mconcat([df_targets, df_design[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mClass\u001b[39m\u001b[38;5;124m'\u001b[39m]], axis\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m1\u001b[39m)\n\u001b[0;32m--> 161\u001b[0m df_design_log \u001b[38;5;241m=\u001b[39m FuncTransform(func_dict_in, func_dict_out)\u001b[38;5;241m.\u001b[39mfit_transform(df_design)\n\u001b[1;32m 162\u001b[0m df_results_log \u001b[38;5;241m=\u001b[39m FuncTransform(func_dict_in, func_dict_out)\u001b[38;5;241m.\u001b[39mfit_transform(df_targets)\n\u001b[1;32m 164\u001b[0m X_train, X_test, y_train, y_test \u001b[38;5;241m=\u001b[39m sk\u001b[38;5;241m.\u001b[39mtrain_test_split(df_design_log, df_results_log, test_size \u001b[38;5;241m=\u001b[39m test_size, random_state\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m42\u001b[39m)\n",
|
||
"File \u001b[0;32m~/Documents/model-training/preprocessing.py:63\u001b[0m, in \u001b[0;36mFuncTransform.fit_transform\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m 61\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mfit_transform\u001b[39m(\u001b[38;5;28mself\u001b[39m, X, y\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mNone\u001b[39;00m):\n\u001b[1;32m 62\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfit(X)\n\u001b[0;32m---> 63\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtransform(X, y)\n",
|
||
"File \u001b[0;32m~/Documents/model-training/preprocessing.py:58\u001b[0m, in \u001b[0;36mFuncTransform.transform\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m 56\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m key \u001b[38;5;129;01min\u001b[39;00m X\u001b[38;5;241m.\u001b[39mkeys(): \n\u001b[1;32m 57\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mClass\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m key:\n\u001b[0;32m---> 58\u001b[0m X[key] \u001b[38;5;241m=\u001b[39m X[key]\u001b[38;5;241m.\u001b[39mapply(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfunc_transform[key])\n\u001b[1;32m 59\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m X\n",
|
||
"\u001b[0;31mKeyError\u001b[0m: 'S'"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"X_train, X_val, X_test, y_train, y_val, y_test, scaler_X, scaler_y = preprocessing_training(df_design[species_columns], df_results[species_columns], func_dict_in, func_dict_out, \"off\", 'global', 0.1)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 37,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([5.88371754e-02, 2.38285692e-01, 1.25266821e-01, 4.02648011e-05,\n",
|
||
" 5.71730222e-02, 2.38302374e-01, 9.25432038e-02, 3.77910581e-07,\n",
|
||
" 9.99694424e-01])"
|
||
]
|
||
},
|
||
"execution_count": 37,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"X_train.iloc[12, :-1].values"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 44,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([[1.11012434e+02, 5.55068087e+01, 3.55966726e-08, 3.89751302e-06,\n",
|
||
" 1.12795836e-02, 1.47982437e-04, 5.78389634e-03, 9.99927111e-04,\n",
|
||
" 1.00047941e+00]])"
|
||
]
|
||
},
|
||
"execution_count": 44,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"preprocess.scaler_X.inverse_transform(tf.keras.backend.constant(X_train.iloc[12, :-1].values.reshape(1, -1)))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Custom Loss function"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def custom_loss_H20(df_design_log, df_result_log, data_min_log, data_max_log, func_dict_out, postprocess):\n",
|
||
" df_result = postprocess(df_result_log, func_dict_out, data_min_log, data_max_log) \n",
|
||
" return keras.losses.Huber + np.sum(((df_result['H'] / df_result['O']) - 2)**2)\n",
|
||
"\n",
|
||
"def loss_wrapper(data_min_log, data_max_log, func_dict_out, postprocess):\n",
|
||
" def loss(df_design_log, df_result_log):\n",
|
||
" return custom_loss_H20(df_design_log, df_result_log, data_min_log, data_max_log, func_dict_out, postprocess)\n",
|
||
" return loss"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 133,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"column_dict = {\"Ba\": X.columns.get_loc(\"Ba\"), \"Barite\":X.columns.get_loc(\"Barite\"), \"Sr\":X.columns.get_loc(\"Sr\"), \"Celestite\":X.columns.get_loc(\"Celestite\")}"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 160,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def custom_loss(preprocess, column_dict):\n",
|
||
" def loss(results, predicted):\n",
|
||
" \n",
|
||
" # predicted = preprocess.funcInverse(predicted)\n",
|
||
" # results = preprocess.funcInverse(results)\n",
|
||
" # predicted = tf.keras.backend.constant(predicted)\n",
|
||
" # results = tf.keras.backend.constant(results)\n",
|
||
" \n",
|
||
" # predicted = tf.keras.backend.constant(preprocess.scaler_X.inverse_transform(predicted))\n",
|
||
" # results = tf.keras.backend.constant(preprocess.scaler_y.inverse_transform(results))\n",
|
||
" \n",
|
||
" # dBa = tf.keras.backend.abs((predicted[\"Ba\"] + predicted[\"Barite\"]) - (results[\"Ba\"] + results[\"Barite\"]))\n",
|
||
" # dSr = tf.keras.backend.abs((predicted[\"Sr\"] + predicted[\"Celestite\"]) - (results[\"Sr\"] + results[\"Celestite\"]))\n",
|
||
" # huber_loss = tf.keras.losses.Huber()(results, predicted)\n",
|
||
" # total_loss = huber_loss + 0.1 * dBa + 0.1 * dSr\n",
|
||
" \n",
|
||
" predicted_inverse = predicted * tf.keras.backend.constant(preprocess.scaler_X.scale_) + tf.keras.backend.constant(preprocess.scaler_X.min_)\n",
|
||
" results_inverse = results * tf.keras.backend.constant(preprocess.scaler_y.scale_) + tf.keras.backend.constant(preprocess.scaler_y.min_)\n",
|
||
" \n",
|
||
" dBa = tf.keras.backend.abs((predicted_inverse[:,column_dict[\"Ba\"]] + predicted_inverse[:, column_dict[\"Barite\"]]) - (results_inverse[:, column_dict[\"Ba\"]] + results_inverse[:, column_dict[\"Barite\"]]))\n",
|
||
" dSa = tf.keras.backend.abs((predicted_inverse[:,column_dict[\"Sr\"]] + predicted_inverse[:, column_dict[\"Celestite\"]]) - (results_inverse[:, column_dict[\"Sr\"]] + results_inverse[:, column_dict[\"Celestite\"]]))\n",
|
||
" \n",
|
||
" huber_loss = tf.keras.losses.Huber()(results, predicted)\n",
|
||
" total_loss = huber_loss # + 0.1 * dBa + 0.1 * dSa\n",
|
||
" \n",
|
||
" return total_loss\n",
|
||
"\n",
|
||
" return loss\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 165,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"model_simple.compile(optimizer=optimizer_simple, loss=loss)#custom_loss(preprocess, column_dict))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Train the model"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 166,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"array([1.15182858e+07, 4.02793041e+02, 1.88096044e+06, 1.03308956e+01,\n",
|
||
" 5.06871734e+00, 1.61113403e+03, 1.74937705e+01, 9.88625768e-01,\n",
|
||
" 9.99215371e-01])"
|
||
]
|
||
},
|
||
"execution_count": 166,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"preprocess.scaler_X.scale_"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 167,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# measure time\n",
|
||
"def model_training(model):\n",
|
||
" start = time.time()\n",
|
||
" callback = keras.callbacks.EarlyStopping(monitor='loss', patience=3)\n",
|
||
" history = model.fit(X_train.loc[:, X_train.columns != \"Class\"], \n",
|
||
" y_train.loc[:, y_train.columns != \"Class\"], \n",
|
||
" batch_size=batch_size, \n",
|
||
" epochs=20, \n",
|
||
" validation_data=(X_val.loc[:, X_val.columns != \"Class\"], y_val.loc[:, y_val.columns != \"Class\"]),\n",
|
||
" callbacks=[callback])\n",
|
||
"\n",
|
||
" end = time.time()\n",
|
||
"\n",
|
||
" print(\"Training took {} seconds\".format(end - start))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 168,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Epoch 1/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - loss: 2.8797e-04 - val_loss: 2.8113e-04\n",
|
||
"Epoch 2/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - loss: 2.8380e-04 - val_loss: 2.7753e-04\n",
|
||
"Epoch 3/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - loss: 2.8036e-04 - val_loss: 2.7414e-04\n",
|
||
"Epoch 4/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - loss: 2.7782e-04 - val_loss: 2.7140e-04\n",
|
||
"Epoch 5/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - loss: 2.7578e-04 - val_loss: 2.6949e-04\n",
|
||
"Epoch 6/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - loss: 2.7396e-04 - val_loss: 2.6790e-04\n",
|
||
"Epoch 7/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - loss: 2.7167e-04 - val_loss: 2.6644e-04\n",
|
||
"Epoch 8/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - loss: 2.6910e-04 - val_loss: 2.6501e-04\n",
|
||
"Epoch 9/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - loss: 2.6823e-04 - val_loss: 2.6271e-04\n",
|
||
"Epoch 10/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - loss: 2.6424e-04 - val_loss: 2.5818e-04\n",
|
||
"Epoch 11/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - loss: 2.6078e-04 - val_loss: 2.5062e-04\n",
|
||
"Epoch 12/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - loss: 2.5335e-04 - val_loss: 2.4440e-04\n",
|
||
"Epoch 13/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - loss: 2.4686e-04 - val_loss: 2.4047e-04\n",
|
||
"Epoch 14/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - loss: 2.4252e-04 - val_loss: 2.3637e-04\n",
|
||
"Epoch 15/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m2s\u001b[0m 1ms/step - loss: 2.3795e-04 - val_loss: 2.3264e-04\n",
|
||
"Epoch 16/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - loss: 2.3383e-04 - val_loss: 2.2967e-04\n",
|
||
"Epoch 17/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - loss: 2.3237e-04 - val_loss: 2.2776e-04\n",
|
||
"Epoch 18/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - loss: 2.2965e-04 - val_loss: 2.2670e-04\n",
|
||
"Epoch 19/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - loss: 2.2929e-04 - val_loss: 2.2598e-04\n",
|
||
"Epoch 20/20\n",
|
||
"\u001b[1m1688/1688\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m3s\u001b[0m 2ms/step - loss: 2.2851e-04 - val_loss: 2.2543e-04\n",
|
||
"Training took 56.33732986450195 seconds\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"model_training(model_simple)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Test Mass Balance"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 98,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def mass_balance(model, X, preprocess):\n",
|
||
" \n",
|
||
" # predict the chemistry\n",
|
||
" columns = X.iloc[:, X.columns != \"Class\"].columns\n",
|
||
" prediction = pd.DataFrame(model.predict(X[columns]), columns=columns)\n",
|
||
" # backtransform min/max\n",
|
||
" X = pd.DataFrame(preprocess.scaler_X.inverse_transform(X.iloc[:, X.columns != \"Class\"]), columns=columns)\n",
|
||
" prediction = pd.DataFrame(preprocess.scaler_y.inverse_transform(prediction), columns=columns)\n",
|
||
" \n",
|
||
" # backtransform log\n",
|
||
" if(preprocess.state['log'] == True):\n",
|
||
" X, prediction = preprocess.funcInverse(X, prediction)\n",
|
||
" \n",
|
||
" # calculate mass balance\n",
|
||
" dBa = np.abs((prediction[\"Ba\"] + prediction[\"Barite\"]) - (X[\"Ba\"] + X[\"Barite\"]))\n",
|
||
" dSr = np.abs((prediction[\"Sr\"] + prediction[\"Celestite\"]) - (X[\"Sr\"] + X[\"Celestite\"]))\n",
|
||
" \n",
|
||
" return dBa + dSr"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 99,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\u001b[1m26993/26993\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m10s\u001b[0m 358us/step\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"mass_balance_results = mass_balance(model_simple, X_train, preprocess)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 100,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"0.0"
|
||
]
|
||
},
|
||
"execution_count": 100,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"len(mass_balance_results[mass_balance_results < 1e-5]) / len(mass_balance_results)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 101,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"Series([], dtype: float64)"
|
||
]
|
||
},
|
||
"execution_count": 101,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"mass_balance_results[mass_balance_results < 1e-5]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"### Percentage of cells that pass the mass balance condition\n",
|
||
"\n",
|
||
"small_modell_20_epochs = 0.0031088911088911087\n",
|
||
"\n",
|
||
"large_modell_20_epochs = 0.022793206793206792"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 102,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\u001b[1m8/8\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 712us/step\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlQAAAHFCAYAAAA0SmdSAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAdFlJREFUeJzt3Xd4U3X7x/F3uge0zC5mGTJkU0UqS9mIiuOhrgKCKIIi4kRFEAeCyoOIgCiCE9Afw4Xs8YgUZIksUZYgtGxaoNB5fn8cEho66E7TfF7XlSvJyfecc+c0be5+p8UwDAMRERERyTc3RwcgIiIi4uyUUImIiIgUkBIqERERkQJSQiUiIiJSQEqoRERERApICZWIiIhIASmhEhERESkgJVQiIiIiBaSESkRERKSAlFCJQ8yaNQuLxWJ3q1y5Mh06dODHH38sknP+8ssv9O7dmypVquDl5UVgYCCRkZFMnTqVCxcuFMk5HWndunWMHj2as2fPFsnxv/76ayZOnJjlaxaLhdGjRxfJeUsLi8XCE088YXt+9OhRRo8eze+//+64oK4Rx+jRo7FYLMUfVC4cPHgQi8XCrFmzHB1KllavXo3FYmH16tW2bXm5nkuWLOHmm2/G19eXwMBAbr/9dnbu3Jll2eXLl9O6dWv8/PyoVKkS/fr14/jx45nKpaSk8Nprr1GzZk28vb2pX78+H3zwQb7enyihEgebOXMmMTExrFu3junTp+Pu7s7tt9/ODz/8UKjnGTVqFO3atePIkSO8/vrrLFu2jDlz5tCxY0dGjx7NK6+8UqjnKwnWrVvHa6+95pCEKiYmhkceeaRIzltaHT16lNdee61EJFTZxfHII48QExNT/EHlQmhoKDExMdx2222ODqXQfffdd3Tv3p2goCDmzZvHtGnT+Pvvv2nbti379u2zK7tmzRq6d+9OcHAw3333He+//z7Lly+nY8eOJCUl2ZUdPHgwY8eOZciQISxZsoS77rqLp556irfeeqs4317pYYg4wMyZMw3A2Lhxo932xMREw9vb27j//vsL7VzffPONARgDBgww0tPTM72ekJBgLFmypNDOV1K88847BmAcOHAgV+UTExPzdPzbbrvNqFGjRt4DcxHJyclGSkpKtq8DxpAhQ2zPN27caADGzJkzCzWOxMTELD/32SmqOFzdqlWrDMBYtWqVbduoUaOM3HwN16tXz2jSpIndz/HgwYOGl5eX8cADD9iVveGGG4yGDRvaffZ+/fVXAzCmTJli27Zjxw7DYrEYb731lt3+AwcONHx9fY1Tp07l9S26PNVQSYni4+ODl5cXnp6edttfe+01WrVqRYUKFQgICKBFixbMmDEDIxdre48ZM4by5cszadKkLKvXy5YtS5cuXWzPL126xIgRIwgPD8fLy4sqVaowZMiQTDU9NWvWpGfPnixevJgWLVrg6+tL/fr1+fTTTzOd48iRIzz66KNUq1YNLy8vwsLCuPfeezl27JitTEJCAs8++6zdeYcNG5apOdLaVPTFF1/QoEED/Pz8aNq0qV1T6ejRo3nuuecACA8PtzWrWpsbrLHPnz+f5s2b4+Pjw2uvvQbAhx9+SLt27QgKCsLf35/GjRszfvx4UlJSbMfv0KEDP/30E//8849ds23GGK9u8tuxYwd33nkn5cuXx8fHh2bNmvHZZ5/ZlbE2i8yePZuXX36ZsLAwAgIC6NSpE3v27Ml0XbOydu1aOnbsSNmyZfHz8yMyMpKffvrJ9vq2bduwWCzMmDEj074///wzFouF77//3rbt77//5oEHHiAoKAhvb28aNGjAhx9+mGXcX3zxBc888wxVqlTB29ubvXv35irm1atXc8MNNwDw8MMP265nxmu4adMm7rjjDipUqICPjw/Nmzfnm2++sTuOtSl96dKl9O/fn8qVK+Pn50dSUhJ79+7l4Ycfpm7duvj5+VGlShVuv/12tm/fnus4smqiSk9PZ/z48dSvXx9vb2+CgoLo06cP//77r125Dh060KhRIzZu3Ejbtm3x8/OjVq1avP3226Snp9sd74033qBevXr4+vpSrlw5mjRpwvvvv5/jNcyqyc8a786dO7n//vsJDAwkODiY/v37Ex8fn/MP5bLFixfTsWNHAgMD8fPzo0GDBowdO9auTG5+Nvl16tQp9uzZQ/fu3e2ufY0aNWjUqBELFy4kLS0NMP/ObNy4kejoaDw8PGxlIyMjue6661iwYIFt28KFCzEMg4cfftjufA8//DAXL15k8eLFhRK/K/G4dhGRopOWlkZqaiqGYXDs2DHeeecdLly4wAMPPGBX7uDBgzz22GNUr14dgPXr1/Pkk09y5MgRXn311WyPHxsby44dO4iKisLPz++a8RiGQa9evVixYgUjRoygbdu2/PHHH4waNYqYmBhiYmLw9va2ld+2bRvPPPMML774IsHBwXzyyScMGDCAOnXq0K5dO8D8I3fDDTeQkpLCSy+9RJMmTTh16hRLlizhzJkzBAcHk5iYSPv27fn3339tZXbu3Mmrr77K9u3bWb58ud0f059++omNGzcyZswYypQpw/jx47nrrrvYs2cPtWrV4pFHHuH06dN88MEHzJ8/n9DQUAAaNmxoO8aWLVvYvXs3r7zyCuHh4fj7+wOwb98+HnjgAVtit23bNt58803+/PNPW7I4ZcoUHn30Ufbt22f3Rzo7e/bsITIykqCgICZNmkTFihX58ssv6devH8eOHeP555+3K//SSy9x880388knn5CQkMALL7zA7bffzu7du3F3d8/2PGvWrKFz5840adKEGTNm4O3tzZQpU7j99tuZPXs2UVFRNG3alObNmzNz5kwGDBhgt/+sWbMICgqiR48eAOzatYvIyEiqV6/Oe++9R0hICEuWLGHo0KGcPHmSUaNG2e0/YsQIWrduzbRp03BzcyMoKOia1wagRYsWzJw5k4cffphXXnnF1mxVtWpVAFatWkW3bt1o1aoV06ZNIzAwkDlz5hAVFUViYiL9+vWzO17//v257bbb+OKLL7hw4QKenp4cPXqUihUr8vbbb1O5cmVOnz7NZ599RqtWrdi6dSv16tW7ZhxZefzxx5k+fTpPPPEEPXv25ODBg4wcOZLVq1ezZcsWKlWqZCsbFxfHgw8+yDPPPMOoUaNYsGABI0aMICwsjD59+gAwfvx4WzN8u3btSElJ4c8//yxQ0/U999xDVFQUAwYMYPv27YwYMQIgy39+MpoxYwYDBw6kffv2TJs2jaCgIP766y927NhhK5PXn01eJScnA9j93bHy9vYmMTGRffv2cd1119niatKkSaayTZo04ddff7U937FjB5UrVyYkJCRTOevrkkeOrSATV2Vt8rv65u3tbVctnZW0tDQjJSXFGDNmjFGxYsUcmzPWr19vAMaLL76Yq7gWL15sAMb48ePtts+dO9cAjOnTp9u21ahRw/Dx8TH++ecf27aLFy8aFSpUMB577DHbtv79+xuenp7Grl27sj3v2LFjDTc3t0xNoP/3f/9nAMaiRYts2wAjODjYSEhIsG2Li4sz3NzcjLFjx9q25dTkV6NGDcPd3d3Ys2dPDlfjyrX+/PPPDXd3d+P0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VatWtWvi7NKlC1WqVGHmzJnMnDkTHx8f7r//ftvrfn5+3HLLLWzdupUmTZpk+XPJqsYlv7L7edWrV4+6deuybdu2LGOIiIiwa/7NjsViydSx+aeffuLIkSO5iiMrt956K5D592Xjxo3s3r07X78vGZUrV457772XIUOGcPr0aQ4ePFig4+VFZGQkgYGBTJs2LdvRxIX1s8mtMmXK0LhxY0JDQ9myZQsrVqzgqaeesr1epUoVbrzxRr788ktbzSuYg3j27Nljl/TdeeedWCyWTCNtZ82aha+vL926dSu0uF2FaqjEoXbs2EFqaipgVlPPnz+fZcuWcdddd9n++7/tttuYMGECDzzwAI8++iinTp3i3XffzXLUS1b+85//MHLkSF5//XX+/PNPBgwYQO3atUlMTGTDhg189NFHREVF0aVLFzp37kzXrl154YUXSEhI4Oabb7aN8mvevDnR0dF5fo9jxozh559/pl27drz00ks0btyYs2fPsnjxYoYPH079+vUZNmwY8+bNo127djz99NM0adKE9PR0Dh06xNKlS3nmmWdo1apVns7buHFjAN5//3369u2Lp6cn9erVy/EPfOfOnfHy8uL+++/n+eef59KlS0ydOpUzZ85kefz58+czdepUWrZsiZubGxEREVked9SoUfz444/ccsstvPrqq1SoUIGvvvqKn376ifHjxxMYGJin95adsWPH0rlzZ2655RaeffZZvLy8mDJlCjt27GD27Nl2NTfu7u706dOHCRMmEBAQwN13350pjvfff582bdrQtm1bHn/8cWrWrMm5c+fYu3cvP/zwg63PXWGoXbs2vr6+fPXVVzRo0IAyZcoQFhZGWFgYH330Ed27d6dr167069ePKlWqcPr0aXbv3s2WLVv49ttvr3n8nj17MmvWLOrXr0+TJk3YvHkz77zzTqaapZziuFq9evV49NFH+eCDD3Bzc6N79+62UX7VqlXj6aefzvN1uP3222nUqBERERFUrlyZf/75h4kTJ1KjRg1bU1dxKFOmDO+99x6PPPIInTp1YuDAgQQHB7N37162bdtm6+dZGD+ba1m9ejUbN26kSZMmGIbBb7/9xrhx4+jWrZvdbPsA48aNo3PnzvznP/9h8ODBHD9+nBdffJFGjRrZTZFw/fXXM2DAAEaNGoW7uzs33HADS5cuZfr06bzxxhtq8ssPB3aIFxeW1Si/wMBAo1mzZsaECROMS5cu2ZX/9NNPjXr16hne3t5GrVq1jLFjxxozZszI08SVa9asMe69914jNDTU8PT0NAICAozWrVsb77zzjt2IuYsXLxovvPCCUaNGDcPT09MIDQ01Hn/8cePMmTN2x6tRo4Zx2223ZTpP+/btjfbt29ttO3z4sNG/f38jJCTE8PT0NMLCwozevXsbx44ds5U5f/688corrxj16tUzvLy8jMDAQKNx48bG008/bcTFxdnKcdXosIzx9O3b127biBEjjLCwMMPNzc1uhFF2sRuGYfzwww9G06ZNDR8fH6NKlSrGc889Z/z888+ZRiidPn3auPfee41y5coZFovFbrQSV43yMwzD2L59u3H77bcbgYGBhpeXl9G0adNMI8msI6G+/fZbu+1ZjeDKzi+//GLceuuthr+/v+Hr62vcdNNNxg8//JBl2b/++sv2+Vu2bFmWZQ4cOGD079/fqFKliuHp6WlUrlzZiIyMNN54441rxp2TrH6Os2fPNurXr294enpmuobbtm0zevfubQQFBRmenp5GSEiIceuttxrTpk2zlcluwlzDMEeFDRgwwAgKCjL8/PyMNm3aGL/88kuWn9fs4shqVFpaWpoxbtw447rrrjM8PT2NSpUqGQ899JBx+PBhu3Lt27c3rr/++kxx9e3b12606HvvvWdERkYalSpVMry8vIzq1asbAwYMMA4ePJjT5cxxlN+JEyfsylqvU27+dixatMho37694e/vb/j5+RkNGzY0xo0bZ1cmNz+bgkzs+euvvxqtWrUyAgICDG9vb6NRo0bGu+++ayQnJ2dZfunSpcZNN91k+Pj4GBUqVDD69Olj97fGKjk52Rg1apRRvXp1w8vLy7juuuuMSZMmXTMeyZrFMHIxM6KIiIiIZEt9qEREREQKSAmViIiISAEpoRIREREpICVUIiIiIgWkhEpERESkgJRQiYiIiBSQJvYsJunp6Rw9epSyZctq0UkREREnYRgG586dIywsLNNC1BkpoSomR48epVq1ao4OQ0RERPLh8OHDOS6WrYSqmFiX+zh8+DABAQEOjkZERERyIyEhgWrVql1zXUYlVMXE2swXEBCghEpERMTJXKu7jjqli4iIiBSQEioRERGRAlJCJSIiIlJA6kMlIiKSB+np6SQnJzs6DCkknp6euLu7F/g4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w4cJCAgotONKZrrWxUPXufjoWhcPXefiUxTX2jAMzp07R1hYGG5u2feUUg1VMXFzc6Nq1apFdvyAgAD9ohYTXevioetcfHSti4euc/Ep7GudU82UlTqli4iIiBSQEioRERGRAlJC5eS8vb0ZNWoU3t7ejg6l1NO1Lh66zsVH17p46DoXH0dea3VKFxERESkg1VCJiIiIFJASKhEREZECUkIlIiIiUkBKqEREREQKSAmVk5syZQrh4eH4+PjQsmVLfvnlF0eH5NRGjx6NxWKxu4WEhNheNwyD0aNHExYWhq+vLx06dGDnzp0OjNh5/O9//+P2228nLCwMi8XCwoUL7V7PzbVNSkriySefpFKlSvj7+3PHHXfw77//FuO7KPmudZ379euX6TN+00032ZXRdb62sWPHcsMNN1C2bFmCgoLo1asXe/bssSujz3ThyM21LgmfayVUTmzu3LkMGzaMl19+ma1bt9K2bVu6d+/OoUOHHB2aU7v++uuJjY213bZv3257bfz48UyYMIHJkyezceNGQkJC6Ny5s22tRsnehQsXaNq0KZMnT87y9dxc22HDhrFgwQLmzJnD2rVrOX/+PD179iQtLa243kaJd63rDNCtWze7z/iiRYvsXtd1vrY1a9YwZMgQ1q9fz7Jly0hNTaVLly5cuHDBVkaf6cKRm2sNJeBzbYjTuvHGG41BgwbZbatfv77x4osvOigi5zdq1CijadOmWb6Wnp5uhISEGG+//bZt26VLl4zAwEBj2rRpxRRh6QAYCxYssD3PzbU9e/as4enpacyZM8dW5siRI4abm5uxePHiYovdmVx9nQ3DMPr27Wvceeed2e6j65w/x48fNwBjzZo1hmHoM12Urr7WhlEyPteqoXJSycnJbN68mS5dutht79KlC+vWrXNQVKXD33//TVhYGOHh4dx3333s378fgAMHDhAXF2d3zb29vWnfvr2ueQHl5tpu3ryZlJQUuzJhYWE0atRI1z+PVq9eTVBQENdddx0DBw7k+PHjttd0nfMnPj4egAoVKgD6TBelq6+1laM/10qonNTJkydJS0sjODjYbntwcDBxcXEOisr5tWrVis8//5wlS5bw8ccfExcXR2RkJKdOnbJdV13zwpebaxsXF4eXlxfly5fPtoxcW/fu3fnqq69YuXIl7733Hhs3buTWW28lKSkJ0HXOD8MwGD58OG3atKFRo0aAPtNFJatrDSXjc+1RKEcRh7FYLHbPDcPItE1yr3v37rbHjRs3pnXr1tSuXZvPPvvM1sFR17zo5Ofa6vrnTVRUlO1xo0aNiIiIoEaNGvz000/cfffd2e6n65y9J554gj/++IO1a9dmek2f6cKV3bUuCZ9r1VA5qUqVKuHu7p4psz5+/Him/4gk//z9/WncuDF///23bbSfrnnhy821DQkJITk5mTNnzmRbRvIuNDSUGjVq8PfffwO6znn15JNP8v3337Nq1SqqVq1q267PdOHL7lpnxRGfayVUTsrLy4uWLVuybNkyu+3Lli0jMjLSQVGVPklJSezevZvQ0FDCw8MJCQmxu+bJycmsWbNG17yAcnNtW7Zsiaenp12Z2NhYduzYoetfAKdOneLw4cOEhoYCus65ZRgGTzzxBPPnz2flypWEh4fbva7PdOG51rXOikM+14XStV0cYs6cOYanp6cxY8YMY9euXcawYcMMf39/4+DBg44OzWk988wzxurVq439+/cb69evN3r27GmULVvWdk3ffvttIzAw0Jg/f76xfft24/777zdCQ0ONhIQEB0de8p07d87YunWrsXXrVgMwJkyYYGzdutX4559/DMPI3bUdNGiQUbVqVWP58uXGli1bjFtvvdVo2rSpkZqa6qi3VeLkdJ3PnTtnPPPMM8a6deuMAwcOGKtWrTJat25tVKlSRdc5jx5//HEjMDDQWL16tREbG2u7JSYm2sroM104rnWtS8rnWgmVk/vwww+NGjVqGF5eXkaLFi3shpFK3kVFRRmhoaGGp6enERYWZtx9993Gzp07ba+np6cbo0aNMkJCQgxvb2+jXbt2xvbt2x0YsfNYtWqVAWS69e3b1zCM3F3bixcvGk888YRRoUIFw9fX1+jZs6dx6NAhB7ybkiun65yYmGh06dLFqFy5suHp6WlUr17d6Nu3b6ZrqOt8bVldY8CYOXOmrYw+04XjWte6pHyuLZeDFREREZF8Uh8qERERkQJSQiUiIiJSQEqoRERERApICZWIiIhIASmhEhERESkgJVQiIiIiBaSESkRERKSAlFCJiBSTmjVrMnHiREeHISJFQAmViJRK/fr1o1evXgB06NCBYcOGFdu5Z82aRbly5TJt37hxI48++mixxSEixcfD0QGIiDiL5ORkvLy88r1/5cqVCzEaESlJVEMlIqVav379WLNmDe+//z4WiwWLxcLBgwcB2LVrFz169KBMmTIEBwcTHR3NyZMnbft26NCBJ554guHDh1OpUiU6d+4MwIQJE2jcuDH+/v5Uq1aNwYMHc/78eQBWr17Nww8/THx8vO18o0ePBjI3+R06dIg777yTMmXKEBAQQO/evTl27Jjt9dGjR9OsWTO++OILatasSWBgIPfddx/nzp0r2osmInmmhEpESrX333+f1q1bM3DgQGJjY4mNjaVatWrExsbSvn17mjVrxqZNm1i8eDHHjh2jd+/edvt/9tlneHh48Ouvv/LRRx8B4ObmxqRJk9ixYwefffYZK1eu5PnnnwcgMjKSiRMnEhAQYDvfs88+mykuwzDo1asXp0+fZs2aNSxbtox9+/YRFRVlV27fvn0sXLiQH3/8kR9//JE1a9bw9ttvF9HVEpH8UpOfiJRqgYGBeHl54efnR0hIiG371KlTadGiBW+99ZZt26effkq1atX466+/uO666wCoU6cO48ePtztmxv5Y4eHhvP766zz++ONMmTIFLy8vAgMDsVgsdue72vLly/njjz84cOAA1apVA+CLL77g+uuvZ+PGjdxwww0ApKenM2vWLMqWLQtAdHQ0K1as4M033yzYhRGRQqUaKhFxSZs3b2bVqlWUKVPGdqtfvz5g1gpZRUREZNp31apVdO7cmSpVqlC2bFn69OnDqVOnuHDhQq7Pv3v3bqpVq2ZLpgAaNmxIuXLl2L17t21bzZo1bckUQGhoKMePH8/TexWRoqcaKhFxSenp6dx+++2MGzcu02uhoaG2x/7+/nav/fPPP/To0YNBgwbx+uuvU6FCBdauXcuAAQNISUnJ9fkNw8BisVxzu6enp93rFouF9PT0XJ9HRIqHEioRKfW8vLxIS0uz29aiRQvmzZtHzZo18fDI/Z/CTZs2kZqaynvvvYebm1nJ/80331zzfFdr2LAhhw4d4vDhw7Zaql27dhEfH0+DBg1yHY+IlAxq8hORUq9mzZps2LCBgwcPcvLkSdLT0xkyZAinT5/m/vvv57fffmP//v0sXbqU/v3755gM1a5dm9TUVD744AP279/PF198wbRp0zKd7/z586xYsYKTJ0+SmJiY6TidOnWiSZMmPPjgg2zZsoXffvuNPn360L59+yybGUWkZFNCJSKl3rPPPou7uzsNGzakcuXKHDp0iLCwMH799VfS0tLo2rUrjRo14qmnniIwMNBW85SVZs2aMWHCBMaNG0ejRo346quvGDt2rF2ZyMhIBg0aRFRUFJUrV87UqR3MpruFCxdSvnx52rVrR6dOnahVqxZz584t9PcvIkXPYhiG4eggRERERJyZaqhERERECkgJlYiIiEgBKaESERERKSAlVCIiIiIFpIRKREREpICUUImIiIgUkBIqERERkQJSQiUiIiJSQEqoRERERApICZWIiIhIASmhEhERESkgJVQiIiIiBfT/1ZzMG/g2wwoAAAAASUVORK5CYII=",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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Dg44c+YMxo4di3Xr1iEoKAiPHz/O9xtXotLKIoLhjIwMnD17Fp9++qne9s6dO+P48eMGO86KFSvQv39/2Nvb622/ceMG/Pz8IJfL0aJFC8ycORNVqlTJcz9KpRJKpVL3c1JSksH6aC6xT9N1/z96Iw6H/32ETnW8zdgjIrI0aZkq1Plir1mOfWVGF9jJivaRu3v3bjg4OEClUiE9XfMeOm/ePADAl19+ie+++w5vvvkmACAwMBBXrlzB0qVLMXToUERFRaF69ep4+eWXIZFIEBAQUOy+y2QyODs750jzi4qKgr29PXr27AlHR0cEBASgcePGxT4OkblYxNBcXFwcVCoVvL31gy9vb2/ExMQY5BinTp3CpUuXdCPPWi1atMDatWuxd+9eLFu2DDExMQgKCkJ8fHye+5o1axacnZ11N39/f4P00ZxikzTBvbu9DABw70mqObtDRFTqtW/fHhERETh58iQ+/PBDdOnSBR9++CEePXqEu3fvYuTIkXBwcNDdvvrqK9y8eROAZgJeREQEatasibFjx+qlVxhKp06dEBAQgCpVqmDw4MFYv349UlP53k5lj0WMDGu9+BWVEMJgxbJXrFiBevXqoXnz5nrbu3Xrpvt//fr10apVK1StWhVr1qzBhAkTct3XpEmT9H6XlJRU5gPi2KeaYLhBRWcc+vcRYpLSC7gHEZFh2dpIcWVGF7Mdu6js7e1RrVo1AMDChQvRvn17TJ8+HR988AEATapEixYt9O6jXQ64SZMmuH37Nv7880/s378fffv2RceOHfHbb7/BykozDiaE0N2vOKunOTo64ty5czh8+DD27duHL774AtOmTcPp06dZeYLKFIsIhj08PCCVSnOMAsfGxuYYLS6O1NRUbNq0CTNmzCiwrb29PerXr48bN27k2UYul0Mul5e4X6VFijILycosAED9ii449O8jPExkMExEpiWRSIqcqlCaTJ06Fd26dcN7772HChUq4NatW3j77bfzbO/k5IR+/fqhX79+6NOnD7p27YrHjx/D09MTgKZqkjatIftkutzIZDKoVDnzra2trdGxY0d07NgRU6dOhYuLCw4ePKhL3yAqC8ruu0IRyGQyNG3aFGFhYXjjjTd028PCwvD666+XeP9btmyBUqnEoEGDCmyrVCpx9epVBAcHl/i4ZYV2VNheJkVVT00+NUeGiYiKpl27dqhbty5mzpyJadOmYezYsXByckK3bt2gVCpx5swZPHnyBBMmTMD3338PX19fNGrUCFZWVvj111/h4+MDFxcXWFlZoWXLlvjmm29QuXJlxMXFYcqUKfkeu3LlykhOTsaBAwfQsGFD2NnZ4eDBg7h16xbatGkDV1dXhIaGQq1Wo2bNmiY6I0SGYRE5wwAwYcIELF++HCtXrsTVq1cxfvx4REVFISQkBIAmNWHIkCF694mIiEBERASSk5Px6NEjRERE4MqVKzn2vWLFCvTq1Qvu7u45fjdx4kQcOXIEt2/fxsmTJ9GnTx8kJSVh6NChxnmgpVDss8DXy0kBbycFAOBhkjK/uxARUS4mTJiAZcuWoUuXLli+fDlWr16N+vXro23btli9ejUCAwMBaKo9zJ49G82aNcNLL72EyMhIhIaG6lIkVq5ciczMTDRr1gwfffQRvvrqq3yPGxQUhJCQEPTr1w+enp6YM2cOXFxcsG3bNrzyyiuoXbs2lixZgo0bN6Ju3bpGPw9EhiQR2ZOGyrlFixZhzpw5iI6ORr169fD999+jTZs2ADSTDSIjI/VqLOaWTxwQEIDIyEjdz9evX0fNmjWxb98+dOrUKUf7/v3746+//kJcXBw8PT3RsmVLfPnll6hTp06h+52UlARnZ2ckJibCycmp8A+4lNh14QE+3HgezQPdMKd3A7Sbe1iXu2eonG0iohelp6fj9u3busWWiIwhv+usrH9+WwqLSJPQGjNmTJ6r96xevTrHtsL8nVCjRo18223atKnQ/SuvHj4bGfZ2UsDHWfNGkZapQlJ6FpxtbczZNSIiIrJwFpMmQebz6FnOsJejHAobqS4Afsi8YSIiIjIzBsNkdLHZgmEA8HbS/MtgmIiIiMyNwTAZXfY0iez/xrC8GhEREZkZg2EyuhdHhn10FSUYDBMREZF5MRgmo3uoK632LBh+NomOtYaJiIjI3BgMk1GlZ6rwNF2z+pxXjjQJ1homIiIi82IwTEYV+2xxDYWNFRzlmkp+TJMgIiKi0oLBMBnVw6fPUiQcFboFNpgmQURERKUFg2EyKu3IsHbyHPA8TSIuWYlMldos/SIiKqsiIyMhkUgQERFh0uMePnwYEokECQkJJdqPRCLB9u3b8/y9uR4fWS4Gw2RUj1MzAADuDjLdNnd7GaytJBBCExATEZGGRCLJ9zZs2DBzd7FU2LZtG7p06QIPDw+DBs6rV6/O9bynp/ObzPLMopZjJtNLVWomz9nLn19qVlYSuNjZIC45AwmpmfB1tjVX94iISpXo6Gjd/zdv3owvvvgC//77r26bra0tnjx5UuT9qlQqSCQSWFmVjzGwlJQUtG7dGm+99RZGjx5t0H07OTnpnXMAUCgUBj0GlS7l41VBpVZKhgoAYC/T/7vL6dmSzElpmSbvExFRaeXj46O7OTs7QyKR5NimdevWLbRv3x52dnZo2LAhwsPDdb9bvXo1XFxcsHv3btSpUwdyuRx37txBRkYGPvnkE1SoUAH29vZo0aIFDh8+rLvfnTt38Oqrr8LV1RX29vaoW7cuQkND9fp49uxZNGvWDHZ2dggKCsoROC5evBhVq1aFTCZDzZo1sW7dunwf86lTp9C4cWMoFAo0a9YM58+fL/A8DR48GF988QU6duyYZ5vExES888478PLygpOTE1555RVcuHChwH2/eM59fHwKvA+VbQyGyajSMjQjw3Yyqd52J4UmGE5kMExEppaSkvftxa/D82ublla4tkYyefJkTJw4EREREahRowYGDBiArKws3e9TU1Mxa9YsLF++HJcvX4aXlxeGDx+OY8eOYdOmTfjnn3/w1ltvoWvXrrhx4wYA4P3334dSqcRff/2FixcvYvbs2XBwcMhx3O+++w5nzpyBtbU1RowYofvd77//jo8++ggff/wxLl26hHfffRfDhw/HoUOHcn0MKSkp6NmzJ2rWrImzZ89i2rRpmDhxYonPjRACPXr0QExMDEJDQ3H27Fk0adIEHTp0wOPHj/O9b3JyMgICAlCxYkX07NmzUME5lW1MkyCj0o4M270wMuysHRlOz8pxHyIio3ohuNPTvTvwxx/Pf/byAlJTc2/bti2QbVQVlSsDcXE52wlRnF4WaOLEiejRowcAYPr06ahbty7+++8/1KpVCwCQmZmJRYsWoWHDhgCAmzdvYuPGjbh37x78/Px0+9izZw9WrVqFmTNnIioqCr1790b9+vUBAFWqVMlx3K+//hpt27YFAHz66afo0aMH0tPToVAoMHfuXAwbNgxjxowBAEyYMAEnTpzA3Llz0b59+xz7Wr9+PVQqFVauXAk7OzvUrVsX9+7dw3vvvVeic3Po0CFcvHgRsbGxkMs1E7jnzp2L7du347fffsM777yT6/1q1aqF1atXo379+khKSsKCBQvQunVrXLhwAdWrVy9Rn6j04sgwGdXznOEXRoZtOTJMRFQSDRo00P3f19cXABAbG6vbJpPJ9NqcO3cOQgjUqFEDDg4OutuRI0dw8+ZNAMDYsWPx1VdfoXXr1pg6dSr++eefIh336tWraN26tV771q1b4+rVq7k+hqtXr6Jhw4aws7PTbWvVqlXhTkA+zp49i+TkZLi7u+s91tu3b+PmzZuIiorS2z5z5kwAQMuWLTFo0CA0bNgQwcHB2LJlC2rUqIEffvihxH2i0osjw2RUeY8Ma35mzjARmVxyct6/k+r/4Y5swWUOL05Gi4wsdpeKw8bGRvd/bR13tfp5uUpbW1vddu3vpFIpzp49C+kLj1ObCjFq1Ch06dIFf/zxB/bt24dZs2bhu+++w4cffljo42Y/JqBJWXhxW/bfGYNarYavr69ePrSWi4sLXFxc9CpQuLm55bofKysrvPTSS7o0EiqfGAyTUaXpgmHmDBNRKWFvb/62ZtC4cWOoVCrExsYiODg4z3b+/v4ICQlBSEgIJk2ahGXLlukFw/mpXbs2/v77bwwZMkS37fjx46hdu3au7evUqYN169YhLS0NtraaykInTpwowqPKXZMmTRATEwNra2tUrlw51zbVqlUrcD9CCEREROjSRqh8YjBMRpWSxwS65znDDIaJiEyhRo0aePvttzFkyBB89913aNy4MeLi4nDw4EHUr18f3bt3x7hx49CtWzfUqFEDT548wcGDB/MMZHPzv//9D3379tVNVtu1axe2bduG/fv359p+4MCBmDx5MkaOHIkpU6YgMjISc+fOLfA4jx8/RlRUFB48eAAAuooW2uoPHTt2RKtWrdCrVy/Mnj0bNWvWxIMHDxAaGopevXqhWbNmue53+vTpaNmyJapXr46kpCQsXLgQERER+Omnnwp9DqjsYc4wGVWq8llpNTlLqxERmduqVaswZMgQfPzxx6hZsyZee+01nDx5Ev7+/gA09Yjff/991K5dG127dkXNmjWxaNGiQu+/V69eWLBgAb799lvUrVsXS5cuxapVq9CuXbtc2zs4OGDXrl24cuUKGjdujMmTJ2P27NkFHmfnzp1o3LixbgJh//790bhxYyxZsgSAJlUjNDQUbdq0wYgRI1CjRg30798fkZGR8Pb2znO/CQkJeOedd1C7dm107twZ9+/fx19/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",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"import matplotlib.pyplot as plt\n",
|
||
"\n",
|
||
"species = \"Ba\"\n",
|
||
"iterations = 250\n",
|
||
"cell_offset = 900\n",
|
||
"y_design = []\n",
|
||
"y_results = []\n",
|
||
"y_differences = []\n",
|
||
"\n",
|
||
"# if(preprocess.state['log'] == True):\n",
|
||
"# df_design_transformed, df_results_transformed = preprocess.funcTranform(df_design[species_columns], df_results[species_columns])\n",
|
||
"\n",
|
||
"df_design_transformed_scaled = preprocess.scaler_X.transform(df_design[species_columns])\n",
|
||
"df_results_transformed_scaled = preprocess.scaler_y.transform(df_results[species_columns])\n",
|
||
"\n",
|
||
"for i in range(0,iterations):\n",
|
||
" idx = i*50*50 + cell_offset-1\n",
|
||
" y_design.append(df_design_transformed_scaled.iloc[idx, :])\n",
|
||
" y_results.append(df_results_transformed_scaled.iloc[idx,:])\n",
|
||
" \n",
|
||
"y_design = pd.DataFrame(y_design)\n",
|
||
"y_results = pd.DataFrame(y_results)\n",
|
||
"\n",
|
||
"prediction = model_simple.predict(y_design.iloc[:, y_design.columns != \"Class\"])\n",
|
||
"prediction = pd.DataFrame(prediction, columns = y_results.columns)\n",
|
||
"\n",
|
||
"# y_results_back, prediction = preprocess.funcInverse(y_results, prediction)\n",
|
||
"\n",
|
||
"y_results_back = pd.DataFrame(preprocess.scaler_y.inverse_transform(y_results), columns = species_columns)\n",
|
||
"prediction_back = pd.DataFrame(preprocess.scaler_X.inverse_transform(prediction), columns = species_columns)\n",
|
||
"\n",
|
||
"\n",
|
||
"plt.plot(np.arange(0,iterations), y_results_back[species], label = \"Results\")\n",
|
||
"plt.plot(np.arange(0,iterations), prediction_back[species], label = \"Prediction\")\n",
|
||
"plt.legend()\n",
|
||
"plt.xlabel('Iteration')\n",
|
||
"plt.ylabel(species)\n",
|
||
"plt.title(species+' Concentration over Iterations in cell ' + str(cell_offset))\n",
|
||
"plt.legend()\n",
|
||
"plt.show()\n",
|
||
"\n",
|
||
"\n",
|
||
"mass_balance = np.abs((prediction_back[\"Ba\"] + prediction_back[\"Barite\"]) - (y_results_back[\"Ba\"] + y_results_back[\"Barite\"])) \\\n",
|
||
" + np.abs((prediction_back[\"Sr\"] + prediction_back[\"Celestite\"]) - (y_results_back[\"Sr\"] + y_results_back[\"Celestite\"]))\n",
|
||
"plt.plot(np.arange(0,iterations), mass_balance, label = \"Results\")\n",
|
||
"plt.xlabel('Iteration')\n",
|
||
"plt.ylabel(species)\n",
|
||
"plt.title(species+' Absolute Differences between predictions and true values Iterations in cell ' + str(cell_offset))\n",
|
||
"plt.axhline(y=1e-5, color='r', linestyle='--', label='Threshold 1e-5')\n",
|
||
"plt.legend()\n",
|
||
"\n",
|
||
"\n",
|
||
"plt.show()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>H</th>\n",
|
||
" <th>O</th>\n",
|
||
" <th>Charge</th>\n",
|
||
" <th>Ba</th>\n",
|
||
" <th>Cl</th>\n",
|
||
" <th>S_6_</th>\n",
|
||
" <th>Sr</th>\n",
|
||
" <th>Barite</th>\n",
|
||
" <th>Celestite</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.510420</td>\n",
|
||
" <td>-5.285676e-07</td>\n",
|
||
" <td>4.536952e-07</td>\n",
|
||
" <td>0.000022</td>\n",
|
||
" <td>1.050707e-03</td>\n",
|
||
" <td>0.000625</td>\n",
|
||
" <td>0.001010</td>\n",
|
||
" <td>1.717461</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.507697</td>\n",
|
||
" <td>-5.292985e-07</td>\n",
|
||
" <td>1.091671e-06</td>\n",
|
||
" <td>0.002399</td>\n",
|
||
" <td>3.700427e-04</td>\n",
|
||
" <td>0.001488</td>\n",
|
||
" <td>0.001738</td>\n",
|
||
" <td>1.716139</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.506335</td>\n",
|
||
" <td>-5.311407e-07</td>\n",
|
||
" <td>6.816584e-05</td>\n",
|
||
" <td>0.008922</td>\n",
|
||
" <td>2.946349e-05</td>\n",
|
||
" <td>0.004445</td>\n",
|
||
" <td>0.004898</td>\n",
|
||
" <td>1.708478</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.506229</td>\n",
|
||
" <td>-5.326179e-07</td>\n",
|
||
" <td>1.435037e-03</td>\n",
|
||
" <td>0.017414</td>\n",
|
||
" <td>3.035681e-06</td>\n",
|
||
" <td>0.007281</td>\n",
|
||
" <td>0.008778</td>\n",
|
||
" <td>1.698481</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.506224</td>\n",
|
||
" <td>-5.354202e-07</td>\n",
|
||
" <td>3.264876e-03</td>\n",
|
||
" <td>0.026235</td>\n",
|
||
" <td>1.872898e-06</td>\n",
|
||
" <td>0.009764</td>\n",
|
||
" <td>0.012641</td>\n",
|
||
" <td>1.688408</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>995</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.506217</td>\n",
|
||
" <td>-5.369526e-07</td>\n",
|
||
" <td>6.381593e-02</td>\n",
|
||
" <td>0.223770</td>\n",
|
||
" <td>1.220403e-07</td>\n",
|
||
" <td>0.032096</td>\n",
|
||
" <td>1.714723</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>996</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.506217</td>\n",
|
||
" <td>-5.370535e-07</td>\n",
|
||
" <td>6.386712e-02</td>\n",
|
||
" <td>0.223789</td>\n",
|
||
" <td>1.220029e-07</td>\n",
|
||
" <td>0.032055</td>\n",
|
||
" <td>1.714723</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>997</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.506217</td>\n",
|
||
" <td>-5.371457e-07</td>\n",
|
||
" <td>6.391481e-02</td>\n",
|
||
" <td>0.223807</td>\n",
|
||
" <td>1.219644e-07</td>\n",
|
||
" <td>0.032017</td>\n",
|
||
" <td>1.714723</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>998</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.506217</td>\n",
|
||
" <td>-5.372196e-07</td>\n",
|
||
" <td>6.395922e-02</td>\n",
|
||
" <td>0.223826</td>\n",
|
||
" <td>1.219672e-07</td>\n",
|
||
" <td>0.031982</td>\n",
|
||
" <td>1.714723</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>999</th>\n",
|
||
" <td>111.012434</td>\n",
|
||
" <td>55.506217</td>\n",
|
||
" <td>-5.372770e-07</td>\n",
|
||
" <td>6.400057e-02</td>\n",
|
||
" <td>0.223844</td>\n",
|
||
" <td>1.220142e-07</td>\n",
|
||
" <td>0.031950</td>\n",
|
||
" <td>1.714723</td>\n",
|
||
" <td>0.000000</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>1000 rows × 9 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" H O Charge Ba Cl \\\n",
|
||
"0 111.012434 55.510420 -5.285676e-07 4.536952e-07 0.000022 \n",
|
||
"1 111.012434 55.507697 -5.292985e-07 1.091671e-06 0.002399 \n",
|
||
"2 111.012434 55.506335 -5.311407e-07 6.816584e-05 0.008922 \n",
|
||
"3 111.012434 55.506229 -5.326179e-07 1.435037e-03 0.017414 \n",
|
||
"4 111.012434 55.506224 -5.354202e-07 3.264876e-03 0.026235 \n",
|
||
".. ... ... ... ... ... \n",
|
||
"995 111.012434 55.506217 -5.369526e-07 6.381593e-02 0.223770 \n",
|
||
"996 111.012434 55.506217 -5.370535e-07 6.386712e-02 0.223789 \n",
|
||
"997 111.012434 55.506217 -5.371457e-07 6.391481e-02 0.223807 \n",
|
||
"998 111.012434 55.506217 -5.372196e-07 6.395922e-02 0.223826 \n",
|
||
"999 111.012434 55.506217 -5.372770e-07 6.400057e-02 0.223844 \n",
|
||
"\n",
|
||
" S_6_ Sr Barite Celestite \n",
|
||
"0 1.050707e-03 0.000625 0.001010 1.717461 \n",
|
||
"1 3.700427e-04 0.001488 0.001738 1.716139 \n",
|
||
"2 2.946349e-05 0.004445 0.004898 1.708478 \n",
|
||
"3 3.035681e-06 0.007281 0.008778 1.698481 \n",
|
||
"4 1.872898e-06 0.009764 0.012641 1.688408 \n",
|
||
".. ... ... ... ... \n",
|
||
"995 1.220403e-07 0.032096 1.714723 0.000000 \n",
|
||
"996 1.220029e-07 0.032055 1.714723 0.000000 \n",
|
||
"997 1.219644e-07 0.032017 1.714723 0.000000 \n",
|
||
"998 1.219672e-07 0.031982 1.714723 0.000000 \n",
|
||
"999 1.220142e-07 0.031950 1.714723 0.000000 \n",
|
||
"\n",
|
||
"[1000 rows x 9 columns]"
|
||
]
|
||
},
|
||
"execution_count": 99,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"y"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 25,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "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16+fU5t3797dbNlgPq+S9NFHHzn1taioSJJ05513trhfMJzXU6dOacCAAVqwYIHL93/729/qhRde0IIFC/TRRx8pOTlZw4cPdzx/05Xi4mJlZ2crJydHu3btUk5OjsaPH69t27b5qxtuaamv1dXV2rFjh2bOnKkdO3Zo9erV+uKLL3Tbbbe1Wm+XLl2cznNZWZliYmL80QWPtHZuJWnkyJFO7S4sLGyxzmA8t5KanJ9XXnlFJpNJY8eObbHejnpu/cZAh3PdddcZkyZNctrWp08fY+rUqS7LP/XUU0afPn2ctj388MPG4MGD/dZGfzl8+LAhydi0aVOzZd59911DknHs2LH2a5gPzJo1yxgwYIDb5UPpvBqGYTz++ONG7969DZvN5vL9YD2vkow1a9Y4XttsNiM5OdmYN2+eY1tNTY0RHx9vLFmypNl6xo8fb4wcOdJp24gRI4y77rrL52321vl9deXDDz80JBlff/11s2VeffVVIz4+3reN8wNX/b3//vuNMWPGeFRPqJzbMWPGGDfffHOLZYLl3PoSI1IdTF1dnbZv366srCyn7VlZWdq6davLfYqLi5uUHzFihD7++GNZrVa/tdUfKisrJUkXXnhhq2WvvvpqpaSk6JZbbtG7777r76b5xP79+5Wamqq0tDTddddd+vLLL5stG0rnta6uTn/5y1/04IMPtvoA72A8r+cqLS1VeXm507mzWCwaNmxYs/+GpebPd0v7dESVlZUymUxKSEhosdzJkyfVq1cvXXzxxfrxj3+skpKS9mmgD7z33nvq3r27rrjiCk2cOFGHDx9usXwonNv/+7//0zvvvKOHHnqo1bLBfG69QZDqYCoqKtTQ0KCkpCSn7UlJSSovL3e5T3l5ucvy9fX1qqio8Ftbfc0wDOXl5emGG25Q//79my2XkpKipUuXatWqVVq9erWuvPJK3XLLLfrXv/7Vjq313KBBg/T6669r/fr1eumll1ReXq4hQ4boyJEjLsuHynmVpLVr1+r48eN64IEHmi0TrOf1fPZ/p578G7bv5+k+HU1NTY2mTp2qe+65p8UH2vbp00fLli3TunXrtHz5csXExOj666/X/v3727G13hk1apTeeOMN/fOf/9Tvf/97ffTRR7r55ptVW1vb7D6hcG5fe+01xcXF6Y477mixXDCfW29FBboBcO38v9oNw2jxL3lX5V1t78geffRRffLJJ9qyZUuL5a688kpdeeWVjteZmZk6ePCgnn/+ed14443+bqbXRo0a5fj+qquuUmZmpnr37q3XXntNeXl5LvcJhfMqSQUFBRo1apRSU1ObLROs57U5nv4b9nafjsJqtequu+6SzWbTokWLWiw7ePBgpwna119/va655hr96U9/0osvvujvprZJdna24/v+/ftr4MCB6tWrl955550WQ0Ywn1tJeuWVV/TTn/601blOwXxuvcWIVAfTrVs3RUZGNvlL5fDhw03+orFLTk52WT4qKkpdu3b1W1t96Ze//KXWrVund999VxdffLHH+w8ePDjo/uLp3LmzrrrqqmbbHQrnVZK+/vprbdy4URMmTPB432A8r/Y7MT35N2zfz9N9Ogqr1arx48ertLRURUVFLY5GuRIREaFrr7026M611DiS2qtXrxbbHsznVpI2b96sffv2efVvOJjPrbsIUh1MdHS0MjIyHHc42RUVFWnIkCEu98nMzGxSfsOGDRo4cKDMZrPf2uoLhmHo0Ucf1erVq/XPf/5TaWlpXtVTUlKilJQUH7fOv2pra7V3795m2x3M5/Vcr776qrp3764f/ehHHu8bjOc1LS1NycnJTueurq5OmzZtavbfsNT8+W5pn47AHqL279+vjRs3ehXyDcPQzp07g+5cS9KRI0d08ODBFtserOfWrqCgQBkZGRowYIDH+wbzuXVboGa5o3krVqwwzGazUVBQYOzZs8eYPHmy0blzZ+Orr74yDMMwpk6dauTk5DjKf/nll0ZsbKwxZcoUY8+ePUZBQYFhNpuNt956K1BdcNsjjzxixMfHG++9955RVlbm+KqurnaUOb+/f/jDH4w1a9YYX3zxhfHpp58aU6dONSQZq1atCkQX3PbEE08Y7733nvHll18aH3zwgfHjH//YiIuLC8nzatfQ0GD07NnTePrpp5u8F8zn9cSJE0ZJSYlRUlJiSDJeeOEFo6SkxHGn2rx584z4+Hhj9erVxu7du427777bSElJMaqqqhx15OTkON2J+/777xuRkZHGvHnzjL179xrz5s0zoqKijA8++KDd+3eulvpqtVqN2267zbj44ouNnTt3Ov0brq2tddRxfl9nz55t/OMf/zD+/e9/GyUlJcbPfvYzIyoqyti2bVsguuikpf6eOHHCeOKJJ4ytW7capaWlxrvvvmtkZmYa3/ve90Lu3NpVVlYasbGxxuLFi13WEUzn1l8IUh3UwoULjV69ehnR0dHGNddc47QcwP33328MGzbMqfx7771nXH311UZ0dLRxySWXNPtD39FIcvn16quvOsqc39/58+cbvXv3NmJiYozExETjhhtuMN555532b7yHsrOzjZSUFMNsNhupqanGHXfcYXz22WeO90PpvNqtX7/ekGTs27evyXvBfF7tSzWc/3X//fcbhtG4BMKsWbOM5ORkw2KxGDfeeKOxe/dupzqGDRvmKG/35ptvGldeeaVhNpuNPn36dIgQ2VJfS0tLm/03/O677zrqOL+vkydPNnr27GlER0cbF110kZGVlWVs3bq1/TvnQkv9ra6uNrKysoyLLrrIMJvNRs+ePY3777/fOHDggFMdoXBu7f785z8bnTp1Mo4fP+6yjmA6t/5iMowzs1cBAADgEeZIAQAAeIkgBQAA4CWCFAAAgJcIUgAAAF4iSAEAAHiJIAUAAOAlghQAAICXCFIAAABeIkgBQDsymUxau3ZtoJsBwEcIUgDCxgMPPCCTydTka+TIkYFuGoAgFRXoBgBAexo5cqReffVVp20WiyVArQEQ7BiRAhBWLBaLkpOTnb4SExMlNV52W7x4sUaNGqVOnTopLS1Nb775ptP+u3fv1s0336xOnTqpa9eu+vnPf66TJ086lXnllVfUr18/WSwWpaSk6NFHH3V6v6KiQj/5yU8UGxuryy+/XOvWrfNvpwH4DUEKAM4xc+ZMjR07Vrt27dK9996ru+++W3v37pUkVVdXa+TIkUpMTNRHH32kN998Uxs3bnQKSosXL9YvfvEL/fznP9fu3bu1bt06XXbZZU7HmDNnjsaPH69PPvlEo0eP1k9/+lMdPXq0XfsJwEcMAAgT999/vxEZGWl07tzZ6evZZ581DMMwJBmTJk1y2mfQoEHGI488YhiGYSxdutRITEw0Tp486Xj/nXfeMSIiIozy8nLDMAwjNTXVmD59erNtkGTMmDHD8frkyZOGyWQy/v73v/usnwDaD3OkAISVH/7wh1q8eLHTtgsvvNDxfWZmptN7mZmZ2rlzpyRp7969GjBggDp37ux4//rrr5fNZtO+fftkMpl06NAh3XLLLS224fvf/77j+86dOysuLk6HDx/2tksAAoggBSCsdO7cucmlttaYTCZJkmEYju9dlenUqZNb9ZnN5ib72mw2j9oEoGNgjhQAnOODDz5o8rpPnz6SpPT0dO3cuVOnTp1yvP/+++8rIiJCV1xxheLi4nTJJZfo//2//9eubQYQOIxIAQgrtbW1Ki8vd9oWFRWlbt26SZLefPNNDRw4UDfccIPeeOMNffjhhyooKJAk/fSnP9WsWbN0//33a/bs2fruu+/0y1/+Ujk5OUpKSpIkzZ49W5MmTVL37t01atQonThxQu+//75++ctftm9HAbQLghSAsPKPf/xDKSkpTtuuvPJKff7555Ia76hbsWKFcnNzlZycrDfeeEPp6emSpNjYWK1fv16PP/64rr32WsXGxmrs2LF64YUXHHXdf//9qqmp0R/+8Af96le/Urdu3TRu3Lj26yCAdmUyDMMIdCMAoCMwmUxas2aNbr/99kA3BUCQYI4UAACAlwhSAAAAXmKOFACcwUwHAJ5iRAoAAMBLBCkAAAAvEaQAAAC8RJACAADwEkEKAADASwQpAAAALxGkAAAAvESQAgAA8NL/D3qRss4b1+VXAAAAAElFTkSuQmCC",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plt.plot(history.history[\"loss\"], \"o-\", label = \"Training Loss\")\n",
|
||
"plt.xlabel(\"Epoch\")\n",
|
||
"# plt.yscale('log')\n",
|
||
"plt.ylabel(\"Loss (Huber)\")\n",
|
||
"plt.grid('on')\n",
|
||
"\n",
|
||
"plt.savefig(\"loss_all.png\", dpi=300)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkAAAAHACAYAAABKwtdzAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAXPlJREFUeJzt3XlcVOX+B/DPmWGYYR1FZRkFJFMRUcQN0TJbRLGLecu0LFOzvWyh5cZtUa7eW9avXNJr95aK5pKZYna1EivFnVwgcwdJEQcREYZFhoE5vz+Q0ZFtgFmZz/v1mpfOOc95zvfrwfz2nOecRxBFUQQRERGRE5HYOgAiIiIia2MBRERERE6HBRARERE5HRZARERE5HRYABEREZHTYQFERERETocFEBERETkdFkBERETkdFgAERERkdNhAUREREROhwVQE1JTUxEXFweVSgVBELBp0yaLnm/WrFkQBMHo4+/vb9FzEhERORsWQE0oKytDREQEFi1aZLVz9u7dG2q12vA5evSo1c5NRETkDFxsHYC9i42NRWxsbIP7Kysr8e6772L16tUoKipCeHg45s6dixEjRrT4nC4uLhz1ISIisiCOALXStGnTsGfPHnz99df4/fff8fDDD2P06NE4c+ZMi/s8c+YMVCoVQkJC8Mgjj+Ds2bNmjJiIiIgEURRFWwfhKARBQHJyMsaNGwcAyMrKQvfu3XHhwgWoVCpDu/vuuw+DBw/Gv/71r2af44cffkB5eTl69OiBS5cuYc6cOTh58iSOHTuGDh06mCsVIiIip8YRoFY4fPgwRFFEjx494Onpafjs3LkTWVlZAIA///yzzqTmWz8vvfSSoc/Y2Fg89NBD6NOnD+677z5s2bIFALBixQqb5EhERNQWcQ5QK+j1ekilUhw6dAhSqdRon6enJwCgc+fOOHHiRKP9tG/fvsF9Hh4e6NOnT6tuqREREZExFkCtEBkZierqauTn5+POO++st41MJkNoaGiLz6HVanHixIkG+yciIqLmYwHUhNLSUmRmZhq+Z2dnIz09HT4+PujRowcee+wxPPHEE/jkk08QGRmJgoIC/PLLL+jTpw/GjBnT7PO98cYbiIuLQ1BQEPLz8zFnzhxoNBpMmTLFnGkRERE5NU6CbsKOHTtw991319k+ZcoUJCUlQafTYc6cOVi5ciVyc3PRoUMHREdHIzExEX369Gn2+R555BGkpqaioKAAnTp1wpAhQzB79myEhYWZIx0iIiICCyAiIiJyQjZ9Cqwly0ysXr0aERERcHd3R0BAAKZNm4YrV64Y9iclJdX7pFVFRYUFMyEiIiJHYtMCqLnLTOzevRtPPPEEpk+fjmPHjmH9+vX47bff8NRTTxm18/b2NlpKQq1WQ6FQWCIFIiIickA2nQTd1DITt9q/fz+6du2Kl19+GQAQEhKCZ599Fh999JFRu9YuIKrX63Hx4kV4eXlBEIQW90NERETWI4oiSkpKoFKpIJE0PsbjUE+BDR06FO+88w62bt2K2NhY5Ofn49tvv8X9999v1K60tBTBwcGorq5Gv379MHv2bERGRjbYr1arhVarNXzPzc3lpGMiIiIHlZOTgy5dujTaxuEKoNWrV2PixImoqKhAVVUVxo4di88++8zQJjQ0FElJSejTpw80Gg0WLFiAYcOGISMjA927d6+33w8++ACJiYl1tn/55Zdwd3e3WD5ERERkPuXl5Xjqqafg5eXVZFu7eQrs1nW26nP8+HHcd999eO211zBq1Cio1Wq8+eabGDRoEJYuXVrvMXq9Hv3798fw4cOxcOHCetvcOgKk0WgQGBiIgoICeHt7tyqvW+l0OqSkpGDkyJGQyWRm7dueOWveAHN3xtydNW+AuTtj7vaUt0ajQceOHVFcXNzkv98ONQL0wQcfYNiwYXjzzTcBAH379oWHhwfuvPNOzJkzBwEBAXWOkUgkGDRoUKNLScjlcsjl8jrbZTKZxS6mJfu2Z86aN8DcnTF3Z80bYO7OmLs95N2c8zvUYqjl5eV1JjXVrsHV0ECWKIpIT0+vtzgiIiIi52TTEaDGlpkICgpCQkICcnNzsXLlSgBAXFwcnn76aSxZssRwC+zVV1/F4MGDoVKpAACJiYkYMmQIunfvDo1Gg4ULFyI9PR2LFy+2SY5ERERkf2xaAB08eNBomYn4+HgAN5aZUKvVOH/+vGH/1KlTUVJSgkWLFuH1119Hu3btcM8992Du3LmGNkVFRXjmmWeQl5cHpVKJyMhIpKamYvDgwdZLjIiIiOyaTQugESNGNHjrCqh5q/OtZsyYgRkzZjR4zLx58zBv3jxzhEdERERtlEPNASIiIiIyBxZARERE5HRYABEREZHTYQFERERETocFkBVV60UcyC7EoQIBB7ILUa23i5dwExEROR2HehO0I/vxDzUSvz8OdXEFAClWnjmIAKUCM+PCMDqcL2kkIiKyJo4AWcGPf6jx/KrD14ufG/KKK/D8qsP48Q+1jSIjIiJyTiyALKxaLyLx++Oo72ZX7bbE74/zdhgREZEVsQCysLTswjojPzcTAaiLK5CWXWi9oIiIiJwcCyALyy9puPhpSTsiIiJqPRZAFubrpTBrOyIiImo9FkAWNjjEBwFKBYQG9gsAApQKDA7xsWZYRERETo0FkIVJJQJmxoUBQJ0iqPb7zLgwSCUNlUhERERkbiyArGB0eACWPN4f/krj21z+SgWWPN6f7wEiIiKyMr4I0UpGhwdgZJg/Vu45i8QtJ9HeTYbdf7uHIz9EREQ2wBEgK5JKBPw1UgUAuHpNh+JrOhtHRERE5JxYAFmZh9wFHeU1Lz08odbYOBoiIiLnxALIBlQeLICIiIhsiQWQDXR2ry2ASmwcCRERkXNiAWQDKo+aX0/mcQSIiIjIFlgA2UDtCNCZS6XQVettHA0REZHzYQFkA+3lgIdcispqPc5eLrN1OERERE6HBZANSAQg1M8LAG+DERER2QILIBsJ9a8pgI7zSTAiIiKrYwFkIz39PQEAJ/kkGBERkdWxALKR2hEgvguIiIjI+lgA2UgPX08IApBfosWVUq2twyEiInIqLIBsxEPugmAfdwDAyTzeBiMiIrImFkA21CvAGwBvgxEREVkbCyAbCvWvKYD4JBgREZF1sQCyoV4B198FxCfBiIiIrMqmBVBqairi4uKgUqkgCAI2bdrU5DGrV69GREQE3N3dERAQgGnTpuHKlStGbTZs2ICwsDDI5XKEhYUhOTnZQhm0Tu0tsMx8LolBRERkTTYtgMrKyhAREYFFixaZ1H737t144oknMH36dBw7dgzr16/Hb7/9hqeeesrQZt++fZg4cSImT56MjIwMTJ48GRMmTMCBAwcslUaLdWnvBi+5C5fEICIisjIXW548NjYWsbGxJrffv38/unbtipdffhkAEBISgmeffRYfffSRoc38+fMxcuRIJCQkAAASEhKwc+dOzJ8/H2vXrjVvAq0kCAJCA7zw259XcUKtQc/r7wYiIiIiy3KoOUBDhw7FhQsXsHXrVoiiiEuXLuHbb7/F/fffb2izb98+xMTEGB03atQo7N2719rhmqR2IjSfBCMiIrIem44ANdfQoUOxevVqTJw4ERUVFaiqqsLYsWPx2WefGdrk5eXBz8/P6Dg/Pz/k5eU12K9Wq4VWe+NlhBpNTTGi0+mg0+nMmkNtf7W/9vD1AAAcv1hs9nPZk1vzdibM3flyd9a8AeZ+86/Owp7ybk4MDlUAHT9+HC+//DLef/99jBo1Cmq1Gm+++Saee+45LF261NBOEASj40RRrLPtZh988AESExPrbN+2bRvc3d3Nl8BNUlJSAACFJQDggoxzBdi6datFzmVPavN2Rszd+Thr3gBzd0b2kHd5ebnJbR2qAPrggw8wbNgwvPnmmwCAvn37wsPDA3feeSfmzJmDgIAA+Pv71xntyc/PrzMqdLOEhATEx8cbvms0GgQGBiImJgbe3t5mzUGn0yElJQUjR46ETCZDeWUV5h/7BRqdgKjh96KDp9ys57MXt+btTJi78+XurHkDzN0Zc7envGvv4JjCoQqg8vJyuLgYhyyVSgHUjPIAQHR0NFJSUvDaa68Z2mzbtg1Dhw5tsF+5XA65vG7hIZPJLHYxa/tWymTo2sED2QVlyCyogH97T4ucz15Y8s/U3jF358vdWfMGmLsz5m4PeTfn/DadBF1aWor09HSkp6cDALKzs5Geno7z588DqBmZeeKJJwzt4+LisHHjRixZsgRnz57Fnj178PLLL2Pw4MFQqVQAgFdeeQXbtm3D3LlzcfLkScydOxfbt2/Hq6++au30TMaV4YmIiKzLpgXQwYMHERkZicjISABAfHw8IiMj8f777wMA1Gq1oRgCgKlTp+LTTz/FokWLEB4ejocffhg9e/bExo0bDW2GDh2Kr7/+GsuXL0ffvn2RlJSEdevWISoqyrrJNYNhTbA8FkBERETWYNNbYCNGjDDcuqpPUlJSnW0zZszAjBkzGu13/PjxGD9+fGvDs5obi6JySQwiIiJrcKj3ALVVtbfAMvNLUFnFJTGIiIgsjQWQHejS3g1eChfoqkWcLSi1dThERERtHgsgOyAIAnrxjdBERERWwwLIToQG1NwGO8l5QERERBbHAshO1E6EPs4RICIiIotjAWQnbrwLiCNARERElsYCyE709PeCIAAFpVpcLtE2fQARERG1GAsgO+Hu6oKQDjUrw5/kCxGJiIgsigWQHamdCM0nwYiIiCyLBZAdqX0Unk+CERERWRYLIDsSyifBiIiIrIIFkB3pdf0WWNblUi6JQUREZEEsgOxI53Y3lsTIuswlMYiIiCyFBZAd4ZIYRERE1sECyM7U3gY7mceJ0ERERJbCAsjO1C6JwREgIiIiy2EBZGdCWQARERFZHAsgO9PTr3ZJjEouiUFERGQhLIDsjJur1LAkBkeBiIiILIMFkB2qnQfENcGIiIgsgwWQHeplWBOMT4IRERFZAgsgOxTKdwERERFZFAsgO9RLVVMAZeZzSQwiIiJLYAFkh1RKBbwVLqjSi8jM55IYRERE5sYCyA4JgmB4HxAnQhMREZkfCyA7FcYXIhIREVkMCyA7FerPJ8GIiIgshQWQneK7gIiIiCyHBZCd6uHnBcn1JTHySypsHQ4REVGbwgLITrm5StG1Y+2SGLwNRkREZE4sgOyY4TYYJ0ITERGZFQsgO9bLMBGaBRAREZE52bQASk1NRVxcHFQqFQRBwKZNmxptP3XqVAiCUOfTu3dvQ5ukpKR621RUON48mhsToXkLjIiIyJxsWgCVlZUhIiICixYtMqn9ggULoFarDZ+cnBz4+Pjg4YcfNmrn7e1t1E6tVkOhUFgiBYuqLYAy80uhraq2cTRERERth4stTx4bG4vY2FiT2yuVSiiVSsP3TZs24erVq5g2bZpRO0EQ4O/vb7Y4bSXg+pIYmooqZOaXordK2fRBRERE1CSbFkCttXTpUtx3330IDg422l5aWorg4GBUV1ejX79+mD17NiIjIxvsR6vVQqvVGr5rNDVzbnQ6HXQ6nVljru3P1H5D/b2Q9udVHLtQhB6d3M0aizU1N++2hLk7X+7OmjfA3G/+1VnYU97NiUEQRVG0YCwmEwQBycnJGDdunEnt1Wo1AgMDsWbNGkyYMMGwff/+/cjMzESfPn2g0WiwYMECbN26FRkZGejevXu9fc2aNQuJiYl1tq9Zswbu7rYtOjZkS5CaJ8GIAD3+2pUrwxMRETWkvLwckyZNQnFxMby9vRtt67AF0AcffIBPPvkEFy9ehKura4Pt9Ho9+vfvj+HDh2PhwoX1tqlvBCgwMBAFBQVN/gE2l06nQ0pKCkaOHAmZTNZk+/WHLuDvm45j6G0+WDFtoFljsabm5t2WMHfny91Z8waYuzPmbk95azQadOzY0aQCyCFvgYmiiGXLlmHy5MmNFj8AIJFIMGjQIJw5c6bBNnK5HHK5vM52mUxmsYtpat/hXdoDAE5eKoWLiwsEQbBIPNZiyT9Te8fcnS93Z80bYO7OmLs95N2c8zvke4B27tyJzMxMTJ8+vcm2oigiPT0dAQEBVojM/GqXxCgsq8TlEm3TBxAREVGTbDoCVFpaiszMTMP37OxspKenw8fHB0FBQUhISEBubi5WrlxpdNzSpUsRFRWF8PDwOn0mJiZiyJAh6N69OzQaDRYuXIj09HQsXrzY4vlYgkImRUhHD2RdLsOJvBL4ejve4/xERET2xqYjQAcPHkRkZKThCa34+HhERkbi/fffB1Az0fn8+fNGxxQXF2PDhg0Njv4UFRXhmWeeQa9evRATE4Pc3FykpqZi8ODBlk3GgkKvvw+Ib4QmIiIyD5uOAI0YMQKNzcFOSkqqs02pVKK8vLzBY+bNm4d58+aZIzy7ERbgjS2/q1kAERERmYlDzgFyNr0CatYEO8lV4YmIiMyCBZADCPWvuQWWdZlLYhAREZkDCyAHEKBUQOkmQ5VeRGZ+qa3DISIicngsgByAIAgI9a+5DXaCt8GIiIhajQWQg+jFJ8GIiIjMhgWQgwi7XgCdzGMBRERE1FosgBxEaMCNW2B2snwbERGRw2IB5CBuXhIjn0tiEBERtQoLIAehkElxWydPAJwHRERE1FosgBwInwQjIiIyDxZADqQXJ0ITERGZBQsgB9LLMBGaBRAREVFrsAByILUjQFmXy1Ch45IYRERELcUCyIH4eyvQzl2Gai6JQURE1CosgByI8ZIYvA1GRETUUiyAHMyNJTH4JBgREVFLsQByML38+SQYERFRa7EAcjA3L4rKJTGIiIhahgWQg+nu5wmJAFwt13FJDCIiohZiAeRgbl4S4zgnQhMREbUICyAHdPNtMCIiImo+FkAOqPaN0Cf5JBgREVGLsAByQLVPgnEEiIiIqGVYADmg2ltgZwu4JAYREVFLsAByQH7eci6JQURE1AosgByQIAiG22B8EoyIiKj5WAA5qNrbYJwITURE1HwsgBxUaAAXRSUiImopFkAOKqz2XUB5XBKDiIiouVgAOajbfT0hlQgoKtfhkoZLYhARETUHCyAHpZBJcVtHDwC8DUZERNRcNi2AUlNTERcXB5VKBUEQsGnTpkbbT506FYIg1Pn07t3bqN2GDRsQFhYGuVyOsLAwJCcnWzAL2+l1020wIiIiMp1NC6CysjJERERg0aJFJrVfsGAB1Gq14ZOTkwMfHx88/PDDhjb79u3DxIkTMXnyZGRkZGDy5MmYMGECDhw4YKk0bObGRGg+CUZERNQcLrY8eWxsLGJjY01ur1QqoVQqDd83bdqEq1evYtq0aYZt8+fPx8iRI5GQkAAASEhIwM6dOzF//nysXbvWfMHbAS6KSkRE1DI2LYBaa+nSpbjvvvsQHBxs2LZv3z689tprRu1GjRqF+fPnN9iPVquFVntjIrFGU1NQ6HQ66HQ6s8Zc2585+r29oxsA4OzlUpSWV0Auk7a6T0sxZ96Ohrk7X+7OmjfA3G/+1VnYU97NicFhCyC1Wo0ffvgBa9asMdqel5cHPz8/o21+fn7Iy8trsK8PPvgAiYmJdbZv27YN7u7u5gn4FikpKa3uQxQBDxcpyqoEJCX/hEBPMwRmYebI21Exd+fjrHkDzN0Z2UPe5eXlJrd12AIoKSkJ7dq1w7hx4+rsEwTB6LsoinW23SwhIQHx8fGG7xqNBoGBgYiJiYG3t7fZYgZqqtOUlBSMHDkSMpms1f2tyz+IfWcL4dMtAmMGdDZDhJZh7rwdCXN3vtydNW+AuTtj7vaUd+0dHFM4ZAEkiiKWLVuGyZMnw9XV1Wifv79/ndGe/Pz8OqNCN5PL5ZDL5XW2y2Qyi11Mc/XdK0CJfWcLceZymc1/8ExhyT9Te8fcnS93Z80bYO7OmLs95N2c8zvke4B27tyJzMxMTJ8+vc6+6OjoOsNw27Ztw9ChQ60VnlX14pIYREREzWbTEaDS0lJkZmYavmdnZyM9PR0+Pj4ICgpCQkICcnNzsXLlSqPjli5diqioKISHh9fp85VXXsHw4cMxd+5cPPDAA/juu++wfft27N692+L52IJhUdS8kiZv9REREVENm44AHTx4EJGRkYiMjAQAxMfHIzIyEu+//z6AmonO58+fNzqmuLgYGzZsqHf0BwCGDh2Kr7/+GsuXL0ffvn2RlJSEdevWISoqyrLJ2MjNS2LkaSpsHQ4REZFDsOkI0IgRIxpdyDMpKanONqVS2eQs7/Hjx2P8+PGtDc8hKGRSdOvkgdOXSnFCrUGA0s3WIREREdk9h5wDRMZC/WtfiMg3QhMREZmCBVAbwDdCExERNQ8LoDag9kmwk3kcASIiIjIFC6A2oHYE6OzlUlToqm0cDRERkf1jAdQG+HrJ4ePhCr0InL7EUSAiIqKmsABqAwRBQKj/9dtgnAhNRETUJBZAbUTtbbDjnAhNRETUJBZAbQSfBCMiIjJdi16E+Oeff2LXrl34888/UV5ejk6dOiEyMhLR0dFQKBTmjpFMYLgFxiUxiIiImtSsAmjNmjVYuHAh0tLS4Ovri86dO8PNzQ2FhYXIysqCQqHAY489hr/97W8IDg62VMxUj+5+NUtiFF/TQV1cAVU7vhGaiIioISbfAuvfvz8+/fRTPP744/jzzz+Rl5eHQ4cOYffu3Th+/Dg0Gg2+++476PV6DBw4EOvXr7dk3HQLuUvNkhgAcDKPt8GIiIgaY/II0OzZs3H//fc3uF8ul2PEiBEYMWIE5syZg+zsbLMESKbrFeB9fU2wEtwT6mfrcIiIiOyWySNAtcVPVVUVVqxYgby8vAbbduzYEYMGDWp9dNQsfBKMiIjINM1+CszFxQXPP/88tFqtJeKhVrjxLiAWQERERI1p0WPwUVFRSE9PN3Mo1FphhiUxyvDtoRzsy7qCar1o46iIiIjsT4seg3/hhRcQHx+PnJwcDBgwAB4eHkb7+/bta5bgqHkOnbsKiQDoReCN9b8DAAKUCsyMC8Po8AAbR0dERGQ/WlQATZw4EQDw8ssvG7YJgmB4/0x1NRfktLYf/1DjhdWHcet4T15xBZ5fdRhLHu/PIoiIiOi6FhVAfMLLvlTrRSR+f7xO8QMAIgABQOL3xzEyzB9SCV+QSERE1KICiC85tC9p2YVQF1c0uF8EoC6uQFp2IaK7dbBeYERERHaqxWuBffXVVxg2bBhUKhXOnTsHAJg/fz6+++47swVHpskvabj4aUk7IiKitq5FBdCSJUsQHx+PMWPGoKioyDDnp127dpg/f7454yMT+HqZtv6aqe2IiIjauhYVQJ999hm++OILvPPOO5BKpYbtAwcOxNGjR80WHJlmcIgPApQKNDS7R0DN02CDQ3ysGRYREZHdalEBlJ2djcjIyDrb5XI5ysrKWh0UNY9UImBmXBgANFgEzYwL4wRoIiKi61pUAIWEhNT7IsQffvgBYWFhrY2JWmB0eACWPN4f/krj21xuMikfgSciIrpFi54Ce/PNN/Hiiy+ioqICoigiLS0Na9euxQcffIAvv/zS3DGSiUaHB2BkmD/SsguR9ucVzEs5g2q9HtG3dbR1aERERHalRQXQtGnTUFVVhbfeegvl5eWYNGkSOnfujAULFuCRRx4xd4zUDFKJgOhuHTDkNh/8cDQPJ/NKsOHwBTx5R4itQyMiIrIbLX4M/umnn8a5c+eQn5+PvLw85OTkYPr06eaMjVpBEAQ8NqTmfU1r0s5DFLkmGBERUa0WF0AAkJ+fjxMnTuD06dO4fPmyuWIiMxnXTwV3Vyky80uRll1o63CIiIjsRosKII1Gg8mTJ0OlUuGuu+7C8OHDoVKp8Pjjj6O4uNjcMVILeSlkeKCfCgCw+sB5G0dDRERkP1pUAD311FM4cOAAtmzZgqKiIhQXF+N///sfDh48iKefftrcMVIrTBpccxvsxz/ycKVUa+NoiIiI7EOLCqAtW7Zg2bJlGDVqFLy9veHl5YVRo0bhiy++wJYtW8wdI7VCny5KRHRRorJaj28PXbB1OERERHahRQVQhw4doFQq62xXKpVo3769yf2kpqYiLi4OKpUKgiBg06ZNTR6j1WrxzjvvIDg4GHK5HN26dcOyZcsM+5OSkiAIQp1PRYXzroM1KSoIQM1kaL2ek6GJiIhaVAC9++67iI+Ph1qtNmzLy8vDm2++iffee8/kfsrKyhAREYFFixaZfMyECRPw888/Y+nSpTh16hTWrl2L0NBQozbe3t5Qq9VGH4XCedfBiotQwUvugnNXyrE364qtwyEiIrI5k98DFBkZCUG4sZTCmTNnEBwcjKCgmtGF8+fPQy6X4/Lly3j22WdN6jM2NhaxsbEmB/vjjz9i586dOHv2LHx8ata16tq1a512giDA39/f5H7bOndXFzzYvzNW7DuH1QfO4Y7ufDEiERE5N5MLoHHjxlkwDNNs3rwZAwcOxEcffYSvvvoKHh4eGDt2LGbPng03NzdDu9LSUgQHB6O6uhr9+vXD7Nmz6127zJlMigrGin3nsO34JVzSVMDP23lHxIiIiEwugGbOnGnJOExy9uxZ7N69GwqFAsnJySgoKMALL7yAwsJCwzyg0NBQJCUloU+fPtBoNFiwYAGGDRuGjIwMdO/evd5+tVottNobT0hpNBoAgE6ng06nM2sOtf2Zu9+m3NZBgQFB7XDofBHWHjiHF0fcZtXz2ypve8DcnS93Z80bYO43/+os7Cnv5sQgiHbyimBBEJCcnNzoSFNMTAx27dqFvLw8wyTsjRs3Yvz48SgrKzMaBaql1+vRv39/DB8+HAsXLqy331mzZiExMbHO9jVr1sDd3b1lCdmh3y4LWJUpRXtXEe/3rwYXhyciorakdnmu4uJieHt7N9q2RWuBSSQSo/lAt6qurm5Jt00KCAhA586djZ5A69WrF0RRxIULF+od4ZFIJBg0aBDOnDnTYL8JCQmIj483fNdoNAgMDERMTEyTf4DNpdPpkJKSgpEjR0Imk5m176bcq6vG/z5OxdVrOnjcPgh39+xktXPbMm9bY+7Ol7uz5g0wd2fM3Z7yrr2DY4oWFUDJyclG33U6HY4cOYIVK1bUO5JiLsOGDcP69etRWloKT09PAMDp06chkUjQpUuXeo8RRRHp6eno06dPg/3K5XLI5fI622UymcUupiX7buyc4wd0wZe7s7HuYC5iwlVWPX9tDLb+C2IrzN35cnfWvAHm7oy520PezTl/iwqgBx54oM628ePHo3fv3li3bp3Ji6KWlpYiMzPT8D07Oxvp6enw8fFBUFAQEhISkJubi5UrVwIAJk2ahNmzZ2PatGlITExEQUEB3nzzTTz55JOG21+JiYkYMmQIunfvDo1Gg4ULFyI9PR2LFy9uSaptzqNRQfhydzZ+PZWP3KJr6Nyu7m1DIiKitq5Vi6HeKioqCtu3bze5/cGDBxEZGWl4Qis+Ph6RkZF4//33AQBqtRrnz99Yw8rT0xMpKSkoKirCwIED8dhjjyEuLs5obk9RURGeeeYZ9OrVCzExMcjNzUVqaioGDx5spiwdW7dOnhjarQP0IrAujeuDERGRc2rRCFB9rl27hs8++6zBW1H1GTFiBBqbg52UlFRnW2hoKFJSUho8Zt68eZg3b57JMTijSVFB2Jt1BV//loMZ93aHTGrWOpiIiMjutagAat++vdEkaFEUUVJSAnd3d6xatcpswZFlxIT5o6OnK/JLtPj5xCWMDg+wdUhERERW1aICaN68eUYFkEQiQadOnRAVFdWstcDINlxdJJgwMBD/3pGF1QfOswAiIiKn06ICaOrUqWYOg6zt0cFBWLIzC7vOFODclTIEd/CwdUhERERW06wC6PfffzepXd++fVsUDFlPoI87hnfvhJ2nL2NN2nkkxPaydUhERERW06wCqF+/fhAEwTBxufY22M0TmQVBsNiLEMm8HosKws7Tl/HtwQuIH9kDcheprUMiIiKyimYVQNnZ2Ybfi6KI8PBwbN26FcHBwWYPjCzvnlBf+HsrkKepwE/HLmFshPVfjEhERGQLzSqAbi10BEFAly5dWAA5KBepBBMHBWLBz2ewev85FkBEROQ0+AIYJ/fI4EBIBOBAdiEy80tsHQ4REZFVsABycgFKN9zbyw8AsOZAjo2jISIiso5WF0CNrQpPjmFSVBAA4NtDOajQcQI7ERG1fc2aAxQZGWlU8Fy7dg1xcXFwdXU1anf48GHzREdWMbx7J3Rp74YLV6/hf7+rMX6A6cuZEBEROaJmFUDjxo0z+l7fqvDkeKQSAY8ODsLHP53CmgPnWAAREVGb16wCaObMmZaKg2zs4YFdMC/lNA6fL8LxixqEqbxtHRIREZHFcBI0AQB8vRQY1dsfALAm7ZyNoyEiIrIskwug0aNHY+/evU22Kykpwdy5c7F48eJWBUbW99j1ydCbjlxEmbbKxtEQERFZjsm3wB5++GFMmDABXl5eGDt2LAYOHAiVSgWFQoGrV6/i+PHj2L17N7Zu3Yq//OUv+Pjjjy0ZN1lAdLcOCOnogeyCMmzOuIhHBwfZOiQiIiKLMLkAmj59OiZPnoxvv/0W69atwxdffIGioiIANY/Ch4WFYdSoUTh06BB69uxpqXjJggRBwKTBQfjn1hNYtf8cHhkUyNccEBFRm9SsSdCurq6YNGkSJk2aBAAoLi7GtWvX0KFDB8hkMosESNb10IAu+HjbKRy7qMHvF4oREdjO1iERERGZXasmQSuVSvj7+7P4aUN8PFxxf58AAMCaA+dtHA0REZFl8CkwqqP2zdCbMy6i+JrOxtEQERGZHwsgqmNgcHv08PPENV01Nh3JtXU4REREZscCiOoQBAGPRQUDAFYfOAdRFG0cERERkXmxAKJ6jYvsDIVMgtOXSnHo3FVbh0NERGRWLSqAcnJycOHCBcP3tLQ0vPrqq/jvf/9rtsDItpRuMoyNUAEAVnMyNBERtTEtKoAmTZqEX3/9FQCQl5eHkSNHIi0tDX//+9/xj3/8w6wBku3U3gbbclSNq2WVNo6GiIjIfFpUAP3xxx8YPHgwAOCbb75BeHg49u7dizVr1iApKcmc8ZEN9e2iRG+VNyqr9Nhw+ELTBxARETmIFhVAOp0OcrkcALB9+3aMHTsWABAaGgq1Wm2+6MimjCdDn+dkaCIiajNaVAD17t0bn3/+OXbt2oWUlBSMHj0aAHDx4kV06NDBrAGSbY3tp4Kn3AXZBWXYl3XF1uEQERGZRYsKoLlz5+I///kPRowYgUcffRQREREAgM2bNxtujVHb4Cl3wQP9OBmaiIjalmatBVZrxIgRKCgogEajQfv27Q3bn3nmGbi7u5stOLIPj0UFY/WB8/jpWB4ul2jRyUtu65CIiIhapUUjQNeuXYNWqzUUP+fOncP8+fNx6tQp+Pr6mjVAsr0wlTcig9qhSi/im4M5tg6HiIio1VpUAD3wwANYuXIlAKCoqAhRUVH45JNPMG7cOCxZssTkflJTUxEXFweVSgVBELBp06Ymj9FqtXjnnXcQHBwMuVyObt26YdmyZUZtNmzYgLCwMMjlcoSFhSE5OblZ+VFdtZOh16adh17PydBEROTYWlQAHT58GHfeeScA4Ntvv4Wfnx/OnTuHlStXYuHChSb3U1ZWhoiICCxatMjkYyZMmICff/4ZS5cuxalTp7B27VqEhoYa9u/btw8TJ07E5MmTkZGRgcmTJ2PChAk4cOCA6QlSHX/pGwBvhQsuXL2G1DOXbR0OERFRq7RoDlB5eTm8vLwAANu2bcODDz4IiUSCIUOG4Ny5cyb3Exsbi9jYWJPb//jjj9i5cyfOnj0LHx8fAEDXrl2N2syfPx8jR45EQkICACAhIQE7d+7E/PnzsXbtWpPPRcYUMikeGtAFy/f8idUHzmNET97qJCIix9WiEaDbb78dmzZtQk5ODn766SfExMQAAPLz8+Ht7W3WAG+2efNmDBw4EB999BE6d+6MHj164I033sC1a9cMbfbt22eIp9aoUaOwd+9ei8XlLB6LCgIAbD9+CVt+v4jv0nOxL+sKqnlLjIiIHEyLRoDef/99TJo0Ca+99hruueceREdHA6gZDYqMjDRrgDc7e/Ysdu/eDYVCgeTkZBQUFOCFF15AYWGhYR5QXl4e/Pz8jI7z8/NDXl5eg/1qtVpotVrDd41GA6DmhY86nc6sOdT2Z+5+rSG4vQLdOnkg63IZXlxzxLDd31uOd8eEYlRvvwaPdeS8W4u5O1/uzpo3wNxv/tVZ2FPezYlBEFv4et+8vDyo1WpERERAIqkZSEpLS4O3t7fRnByTAxEEJCcnY9y4cQ22iYmJwa5du5CXlwelUgkA2LhxI8aPH4+ysjK4ubnB1dUVK1aswKOPPmo4bvXq1Zg+fToqKirq7XfWrFlITEyss33NmjV8rP8mGVcELDstASDcsqfmR+jJHnpEdOBoEBER2UZ5eTkmTZqE4uLiJu9ItWgECAD8/f3h7++PCxcuQBAEdO7c2eIvQQwICEDnzp0NxQ8A9OrVC6Io4sKFC+jevTv8/f3rjPbk5+fXGRW6WUJCAuLj4w3fNRoNAgMDERMTY/ZbejqdDikpKRg5ciRkMplZ+7akar2IDz5JBaCtZ68AAcAPl9zx1mPDIZXcWiA5bt7mwNydL3dnzRtg7s6Yuz3lXXsHxxQtKoD0ej3mzJmDTz75BKWlpQAALy8vvP7663jnnXcMI0LmNmzYMKxfvx6lpaXw9PQEAJw+fRoSiQRdunQBAERHRyMlJQWvvfaa4bht27Zh6NChDfYrl8sNa5vdTCaTWexiWrJvSziYdQV5mvqKnxoiAHWxFkculCC6W8PLoTha3ubE3J0vd2fNG2Duzpi7PeTdnPO3qAB65513sHTpUnz44YcYNmwYRFHEnj17MGvWLFRUVOCf//ynSf2UlpYiMzPT8D07Oxvp6enw8fFBUFAQEhISkJuba3jn0KRJkzB79mxMmzYNiYmJKCgowJtvvoknn3wSbm5uAIBXXnkFw4cPx9y5c/HAAw/gu+++w/bt27F79+6WpErX5ZfUf/uwpe2IiIhsqUUF0IoVK/Dll18aVoEHgIiICHTu3BkvvPCCyQXQwYMHcffddxu+196GmjJlCpKSkqBWq3H+/I31pzw9PZGSkoIZM2Zg4MCB6NChAyZMmIA5c+YY2gwdOhRff/013n33Xbz33nvo1q0b1q1bh6ioqJakStf5einM2o6IiMiWWlQAFRYW1jvROTQ0FIWFhSb3M2LECDQ2BzspKanec6SkpDTa7/jx4zF+/HiT46CmDQ7xQYBSgbziCtR3xQQA/koFBof4WDs0IiKiZmvRZJ2G3t68aNEiw8rw1LZIJQJmxoUBqPsMGFAzB2hmXFi9E6CJiIjsTYtGgD766CPcf//92L59O6KjoyEIAvbu3YucnBxs3brV3DGSnRgdHoAlj/dH4vfHoS42nuujkEnQt0s72wRGRETUTC0qgO666y6cPn0aixcvxsmTJyGKIh588EG88MILUKlU5o6R7Mjo8ACMDPNHWnYh8ksq0MHDFR//dAoZF4rxtw2/Y+WTgyEIHAUiIiL71uL3AKlUqjqTnXNycvDkk0/WWZ2d2hapRDB61D2gnRvuX7gLu84UYNX+c5gc3dV2wREREZnArC/sKSwsxIoVK8zZJTmAbp088fbomknx/9p6En8WlNk4IiIiosZZ5o2F5HSeiO6Kod064JquGvHfpHOBVCIismssgMgsJBIBHz8cAS+5Cw6fL8J/UrNsHRIREVGDWACR2XRu54b3rz8qPy/lNE6oTV+ThYiIyJqaNQn6wQcfbHR/UVFRa2KhNmD8gC746dglbD9xCfHfZOC7F4fB1YV1NhER2Zdm/cukVCob/QQHB+OJJ56wVKzkAARBwAcP9oGPhytOqDVY8PNpW4dERERUR7NGgJYvX26pOKgN6eQlx7/+Go7nVh3Gkh1ZuLeXH/oEeNo6LCIiIgPemyCLGB0egL9GdoZeBF7/JgPllVW2DomIiMiABRBZzKyxveHvrUB2QRn+b9sZW4dDRERkwAKILEbpJsNH4/sCAL46kINTxVwig4iI7AMLILKo4T06YfKQYADAmkwJNNd0No6IiIiIBRBZQcKYUAT7uKOoUsCcrSdtHQ4RERELILI8d1cXfPRQOASISE5X46djebYOiYiInBwLILKK/kHtcI+qZn2wv288ioJSrY0jIiIiZ8YCiKxmTKAePf08caWsEu8kH4UocsFUIiKyDRZAZDUuEuCjh8Ihkwr46dglJB/JtXVIRETkpFgAkVWFBXjj1ft6AABmfncMF4uu2TgiIiJyRiyAyOqeHX4bIoPaoURbhbe+/R16PW+FERGRdbEAIqtzkUrwycMRUMgk2J1ZgFUHztk6JCIicjIsgMgmbuvkiYTYXgCAf209geyCMhtHREREzoQFENnM5CHBGHZ7B1To9Ij/Jh1V1Xpbh0RERE6CBRDZjEQi4OPxEfCSu+DI+SL8J/WsrUMiIiInwQKIbErVzg0zx/YGAMzffhrHL2psHBERETkDFkBkcw/174yRYX7QVYuI/yYd2qpqW4dERERtHAsgsjlBEPDBg33QwcMVJ/NKsGD7GVuHREREbRwLILILHT3l+Odf+wAAPt+ZhbTsK9iXdQXfpediX9YVVPNdQUREZEYutg6AqNbocH88GNkZG4/k4tEvDhgVPQFKBWbGhWF0eIANIyQioraCI0BkV4Z17wgAdUZ88oor8Pyqw/jxD7UtwiIiojbGpgVQamoq4uLioFKpIAgCNm3a1Gj7HTt2QBCEOp+TJ08a2iQlJdXbpqKiwsLZUGtV60X830+n6t1XWw4lfn+ct8OIiKjVbHoLrKysDBEREZg2bRoeeughk487deoUvL29Dd87depktN/b2xunThn/Q6pQKFoXLFlcWnYh1MUNF6oiAHVxBdKyCxHdrYP1AiMiojbHpgVQbGwsYmNjm32cr68v2rVr1+B+QRDg7+/fisjIFvJLTBulM7UdERFRQxxyEnRkZCQqKioQFhaGd999F3fffbfR/tLSUgQHB6O6uhr9+vXD7NmzERkZ2WB/Wq0WWq3W8F2jqXkZn06ng06nM2vstf2Zu197Z0reHdxN+3Hs4O7iUH9+znrNAefN3VnzBpj7zb86C3vKuzkxCKIo2sWECkEQkJycjHHjxjXY5tSpU0hNTcWAAQOg1Wrx1Vdf4fPPP8eOHTswfPhwAMD+/fuRmZmJPn36QKPRYMGCBdi6dSsyMjLQvXv3evudNWsWEhMT62xfs2YN3N3dzZIfNU0vAomHpSiqBAChnhYi2rkCM/tXQ1LfbiIicmrl5eWYNGkSiouLjabK1MehCqD6xMXFQRAEbN68ud79er0e/fv3x/Dhw7Fw4cJ629Q3AhQYGIiCgoIm/wCbS6fTISUlBSNHjoRMJjNr3/bM1Lx/OnYJM77OAHBj4vPNokN8sGLaAAiC41RAznrNAefN3VnzBpi7M+ZuT3lrNBp07NjRpALIIW+B3WzIkCFYtWpVg/slEgkGDRqEM2cafruwXC6HXC6vs10mk1nsYlqyb3vWVN5/6dcFLi5SJH5/3GhCdHt3GYqv6bAvuxALfj2LN0eFWiNcs3LWaw44b+7OmjfA3J0xd3vIuznnd/gC6MiRIwgIaPjleKIoIj09HX369LFiVNQao8MDMDLMH2nZhcgvqYCvlwKDQ3zw7aEc/G3DUSz+NQsdPeWYNizE1qESEZGDsmkBVFpaiszMTMP37OxspKenw8fHB0FBQUhISEBubi5WrlwJAJg/fz66du2K3r17o7KyEqtWrcKGDRuwYcMGQx+JiYkYMmQIunfvDo1Gg4ULFyI9PR2LFy+2en7UclKJUOdR94mDglBQWomPfzqFf/zvODp6yhEXobJRhERE5MhsWgAdPHjQ6Amu+Ph4AMCUKVOQlJQEtVqN8+fPG/ZXVlbijTfeQG5uLtzc3NC7d29s2bIFY8aMMbQpKirCM888g7y8PCiVSkRGRiI1NRWDBw+2XmJkMS+M6IZ8TQVW7DuH+G/S0d7dFXdcf3s0ERGRqWxaAI0YMQKNzcFOSkoy+v7WW2/hrbfearTPefPmYd68eeYIj+yQIAh4P643CsoqseV3NZ796iDWPRuN8M5KW4dGREQOhGuBkcORSgR8OiECQ7t1QFllNaYuT8O5K2W2DouIiBwICyBySHIXKf4zeQDCArxRUFqJyUvTcLlE2/SBREREYAFEDsxLIUPSk4MQ5OOO84XlmLo8DSUVtn8TKRER2T8WQOTQfL0UWPnkYHT0dMWxixo8t+oQtFXVtg6LiIjsHAsgcnhdO3pg+dTB8HCVYk/mFcR/kwG93i5ecE5ERHaKBRC1CX26KPGfyQMhkwrY8rsa//jf8UafMCQiIufGAojajDu6d8QnE/oBAJL2/ol/78iybUBERGS3WABRmzI2QoWZcWEAgI9/OoVvfsuxcURERGSPWABRmzNtWAieH9ENAJCQfBTbj1+ycURERGRvWABRm/TWqJ54eEAXVOtFvLjmMA6dK7R1SEREZEdYAFGbJAgCPniwD+4J9YW2So8nkw7i9KUSW4dFRER2ggUQtVkuUgkWT+qPyKB2KL6mw5RlabhYdM3WYRERkR1gAURtmpurFMumDMLtvp5QF1fgiWVpKCqvtHVYRERkYyyAqM1r7+GKlU8Ohr+3Apn5pXgy6Tdcq+TboomInBkLIHIKqnZuWDl9MLwVLjh8vggvrTkMra4a+7Ku4Lv0XOzLuoJqvj2aiMhpuNg6ACJr6eHnhWVTB+GxLw/g55P56PePFFzT3RgJClAqMDMuDKPDA2wYJRERWQNHgMipDOzqgyeHhQCAUfEDAHnFFXh+1WH8+IfaFqEREZEVsQAip1KtF7EpPbfefbU3wBK/P87bYUREbRwLIHIqadmFUBdXNLhfBKAurkBaNl+cSETUlrEAIqeSX9Jw8dOSdkRE5JhYAJFT8fVSmLUdERE5JhZA5FQGh/ggQKmA0ES7zMslEEXOAyIiaqtYAJFTkUoEzIwLA4A6RdDN39/bdAx/2/A7KnR8YSIRUVvEAoiczujwACx5vD/8lca3ufyVCix5rD/+NjoUEgH45uAFPPz5Ply4Wm6jSImIyFL4IkRySqPDAzAyzB9p2YXIL6mAr5cCg0N8IJXUjAP16azEjLWHcTS3GHGf7cZnj/bHHd072jhqIiIyF44AkdOSSgREd+uAB/p1RnS3DobiBwDu6N4R38+4A+GdvXG1XIcnlh3A5zuzOC+IiKiNYAFE1IAu7d3x7XNDMX5AF+hF4MMfTuKF1YdRqq2ydWhERNRKLICIGqGQSfHx+L6YMy4cMqmAH/7Iw7jFe5B1udTWoRERUSuwACJqgiAIeHxIMNY9Gw0/bzky80vxwKI9+OlYnq1DIyKiFmIBRGSi/kHt8f2MOzA4xAel2io8+9UhfPzTSa4bRkTkgFgAETWDr5cCq5+KMqwov/jXLExdnoarZZU2joyIiJrDpgVQamoq4uLioFKpIAgCNm3a1Gj7HTt2QBCEOp+TJ08atduwYQPCwsIgl8sRFhaG5ORkC2ZBzkYmleD9uDAseKQfFDIJdp0pQNyi3fgjt9jWoRERkYlsWgCVlZUhIiICixYtatZxp06dglqtNny6d+9u2Ldv3z5MnDgRkydPRkZGBiZPnowJEybgwIED5g6fnNwD/Toj+YVhCPJxx4Wr1/DQkr3YcOiCrcMiIiIT2PRFiLGxsYiNjW32cb6+vmjXrl29++bPn4+RI0ciISEBAJCQkICdO3di/vz5WLt2bWvCJaqjV4A3vn/pDry67gh+PXUZr6/PQMaFIrx7fxhcXSSo1os4kF2IQwUCOmQXIvp2X6P3DRERkW045BygyMhIBAQE4N5778Wvv/5qtG/fvn2IiYkx2jZq1Cjs3bvXmiGSE1G6y7B0yiC8cm/NSOTKfefw6Bf78XXaedwx9xc8vuwgVp6R4vFlB3HH3F/w4x9qG0dMREQOtRRGQEAA/vvf/2LAgAHQarX46quvcO+992LHjh0YPnw4ACAvLw9+fn5Gx/n5+SEvr+FHlrVaLbRareG7RqMBAOh0Ouh0OrPmUNufufu1d86Q90sjQhAW4Ik3vj2KQ+eu4tC5q3Xa5BVX4PlVh/HZIxEY1duvnl7aFme47vVx1rwB5n7zr87CnvJuTgyCaCfv9hcEAcnJyRg3blyzjouLi4MgCNi8eTMAwNXVFStWrMCjjz5qaLN69WpMnz4dFRUV9fYxa9YsJCYm1tm+Zs0auLu7NyseorxyYG6GFPo6683XEtHOFZjZvxq8G0ZEZD7l5eWYNGkSiouL4e3t3WhbhxoBqs+QIUOwatUqw3d/f/86oz35+fl1RoVulpCQgPj4eMN3jUaDwMBAxMTENPkH2Fw6nQ4pKSkYOXIkZDKZWfu2Z86U94HsQugzDjbSQkBRJdApbAiiQnysFpctONN1v5mz5g0wd2fM3Z7yrr2DYwqHL4COHDmCgIAAw/fo6GikpKTgtddeM2zbtm0bhg4d2mAfcrkccrm8znaZTGaxi2nJvu2ZM+R9pdy0tcKulFe1+T+LWs5w3evjrHkDzN0Zc7eHvJtzfpsWQKWlpcjMzDR8z87ORnp6Onx8fBAUFISEhATk5uZi5cqVAGqe8OratSt69+6NyspKrFq1Chs2bMCGDRsMfbzyyisYPnw45s6diwceeADfffcdtm/fjt27d1s9P3JOvl4Ks7YjIiLzs2kBdPDgQdx9992G77W3oaZMmYKkpCSo1WqcP3/esL+yshJvvPEGcnNz4ebmht69e2PLli0YM2aMoc3QoUPx9ddf491338V7772Hbt26Yd26dYiKirJeYuTUBof4IECpQF5xBRqbYLc3qwCRQe2gkEmtFhsREdWwaQE0YsQINDYHOykpyej7W2+9hbfeeqvJfsePH4/x48e3NjyiFpFKBMyMC8Pzqw5DABosgj77JRNbfldjzrhwDL29ozVDJCJyeg75HiAiezc6PABLHu8Pf6Xxba4ApQJLHuuPRZMi0clLjrMFZZj05QHEr0vHlVJtA70REZG5OfwkaCJ7NTo8ACPD/LEvMx/bdh1AzJ1RRm+CHt6jE/7vp1P4av85bDySi59P5iMhNhQTBgZCwufjiYgsiiNARBYklQiICvHBgI4iokJ8jJbB8FbI8I8HwpH8wjCEBXij+JoOb288ion/3YfTl0psGDURUdvHAojIxvoFtsPml4bh3ft7wd1Vit/+vIoxC3Zh7o8nca2y2tbhERG1SSyAiOyAi1SCp+68DSnxd2FkmB+q9CKW7MhCzPyd2HEq39bhERG1OSyAiOxI53Zu+OKJgfjv5AFQKRXIKbyGqct/w4trDiNfU/9SLkRE1HwsgIjsUExvf6TE34Wn7giBRAC2/K7GvZ/sxMp9f6JabxfL9xEROTQWQER2ykPugnf/EobNL92BiC5KlGir8P53x/Dgkr04drHY0K5aL2Jf1hV8l56LfVlXWCAREZmAj8ET2bnwzkpsfGEYVh84h49/PIWMnCKMXbQH04Z2RXhnJeb+eBLq4hu3xwKUCsyMC8Po8IBGeiUicm4cASJyAFKJgCeiu2L763fh/r4BqNaL+HJ3Nl5dl25U/ABAXnEFnl91GD/+obZRtERE9o8FEJED8fNWYPGk/lg2ZSCkDbwrsfYGWOL3x3k7jIioASyAiByQm6sLqhupbUQA6uIKpGUXWi0mIiJHwgKIyAHll5j2SDwfnSciqh8nQRM5IF8vRdONACz4+QwgAGP6BEAm5f/vEBHV4n8RiRzQ4BAfBCgVaGrJ1LMFZXjl63SM+HgHvtx1FiUVOqvER0Rk71gAETkgqUTAzLgwAKhTBAnXPx+P74vX7uuBjp6uyC26hjlbTmDoB7/gn1uO42LRNWuHTERkV1gAETmo0eEBWPJ4f/grjW+H+SsVWPJ4fzw8MBCv3Ncdu/92Dz58sA9u9/VEibYKX+zKxp0f/YqX1x7B0QvFDfRORNS2cQ4QkQMbHR6AkWH+SMsuRH5JBXy9FBgc4gOp5Ma4kEImxSODgzBhYCB2nr6ML3adxd6sK9iccRGbMy5iyG0+ePrO23B3T19IJE3dVCMiahtYABE5OKlEQHS3Dk22k0gE3B3qi7tDffFHbjGW7s7G9xkXsf9sIfafLcRtnTzw1B234cH+naGQSY2OrdaLjRZZRESOhgUQkRMK76zEvIn98Nbonkja8yfWpJ3H2ctl+HvyUXyy7RQeHxKMydHB6Ogpx49/qJH4/XEut0FEbQoLICInFqB0Q8KYXphxb3es+y0Hy3ZnI7foGhb8fAZLdmZhcFcf7M4sqHNc7XIbSx7vzyKIiBwSJ0ETETzlLph+Rwh2vjkCiyZFIiKwHSqr9PUWPwCX2yAix8cCiIgMXKQS/KWvCpteGIpZ1x+zbwiX2yAiR8YCiIjqEAQB7T1cTWp7IPsK9BwFIiIHwzlARFQvU5fbmL/9DFbtP4+RYb6ICfNHdLcOdZ4iIyKyNyyAiKhetctt5BVXoKHxHTeZBFKJgIJSLdam5WBtWg48XKUYEeqLmDA/3NmtvVVjJiIyFQsgIqpX7XIbz686DAEwKoJq3wA0b2I/3BPqhwPZV7Dt2CVsO56HSxottvyuxpbf1ZBJBXTzlOBqxxyMDlfVeWv1zfiuISKyJhZARNSg2uU2bn0PkP8t7wG6s3sn3Nm9ExLH9sbR3GJsO56Hbccu4Ux+KU4WSzDr+xOY9f0JRAS2w6jefogJ88ftvp6G/viuISKyNhZARNQoU5bbqCWRCIgIbIeIwHZ4c1QoTquLsCg5FTmiD47kFCMjpwgZOUX46MdTuK2TB2LC/OGtcMHHP52qc5uN7xoiIktiAURETTJ1uY1bhXT0wL2dRYwZE4Wr16qx/UQ+th3Pw97MKzh7uQyf78xq8FgRNbfaEr8/jpFh/rwdRkRmxQKIiKzC11uBSVFBmBQVhJIKHXacuow1aeexL+tKg8fceNfQFUR362i9YImozbPpe4BSU1MRFxcHlUoFQRCwadMmk4/ds2cPXFxc0K9fP6PtSUlJEAShzqeioqL+jojI6rwUMsRFqPDIoECT2j/z1SE8teIgFv+aid1nCqCp0LXovNV6EfuyruC79Fzsy7rCt1gTOTGbjgCVlZUhIiIC06ZNw0MPPWTyccXFxXjiiSdw77334tKlS3X2e3t749SpU0bbFArT3mlCRNZj6ruGSiqqsP3EJWw/cePve7dOHugX2B79ApXoF9gePf294OrS8P/TcaI1Ed3MpgVQbGwsYmNjm33cs88+i0mTJkEqldY7aiQIAvz9/c0QIRFZUlPvGhIA+HkrsOCRfjiaW4yMC8VIz7mKnMJryLpchqzLZdhw+AIAwNVFgnCVNyIC26Hf9U+QjzsEQcCPf6jx/KrDnGhNRAYONwdo+fLlyMrKwqpVqzBnzpx625SWliI4OBjV1dXo168fZs+ejcjISCtHSkRNMeVdQ7PGhiHqtg6Iuu3GJOwrpVpkXChCek4x0q8/WVZ8TYfD54tw+HyRoV17dxn6dlHi0LmiegssTrQmcl4OVQCdOXMGb7/9Nnbt2gUXl/pDDw0NRVJSEvr06QONRoMFCxZg2LBhyMjIQPfu3es9RqvVQqvVGr5rNBoAgE6ng07XsrkGDantz9z92jtnzRtg7jf/Wp97e3bEZ49EYM7Wk8jT3Ph76K+U453YUNzbs2Od473lEtzZzQd3dvMBAIiiiHOF5ci4oMHvF2pGio6rNbharsPO0/WvaF+rdqL1vsx8RIX4tDDTG6r1IvZnXcahAgHKM/kY0q2TUxVW/Hl3vtztKe/mxCCIomgXswAFQUBycjLGjRtX7/7q6moMGTIE06dPx3PPPQcAmDVrFjZt2oT09PQG+9Xr9ejfvz+GDx+OhQsX1ttm1qxZSExMrLN9zZo1cHd3b3YuRNR8ehHI0gjQ6ABvGdDNW0Rr6oYqPZBbDuzOkyDtctPPe3i6iAjyFOHrBvi7ifB1E+HnBnjKTD9nxhUBG/+UoKjyRuDtXEU82FWPiA528Z9aojatvLwckyZNQnFxMby9vRtt6zAFUFFREdq3bw+p9MYii3q9HqIoQiqVYtu2bbjnnnvqPfbpp5/GhQsX8MMPP9S7v74RoMDAQBQUFDT5B9hcOp0OKSkpGDlyJGSyZvyX1cE5a94Ac7d17geyC/H4soMtPr69uwzdOnngto4euO36r906eaBzOzejkZ2fjl3CjK8z6txqq23x2SMRGNXbr8VxOAp7uOa24qy521PeGo0GHTt2NKkAcphbYN7e3jh69KjRtn//+9/45Zdf8O233yIkJKTe40RRRHp6Ovr06dNg33K5HHK5vM52mUxmsYtpyb7tmbPmDTB3W+UefbtvkxOtfb3lmDehH7KvlCErvwyZl0uRlV+K3KJruFquw8FzRTh4rsjoOFcXyfViyBMhnTywat+5RucZ/fOHU4jt29kst8McYd00/rw7X+72kHdzzm/TAqi0tBSZmZmG79nZ2UhPT4ePjw+CgoKQkJCA3NxcrFy5EhKJBOHh4UbH+/r6QqFQGG1PTEzEkCFD0L17d2g0GixcuBDp6elYvHix1fIiIvthykTrxLG9MfT2jhh6u/HLFq9VVuNsQSky80uvP3VWUxidLShDZZUeJ/NKcDKvpMkYaucZbUrPxZjwALi5Sps8piF8nJ/IPGxaAB08eBB333234Xt8fDwAYMqUKUhKSoJarcb58+eb1WdRURGeeeYZ5OXlQalUIjIyEqmpqRg8eLBZYycix2Hqoq63cnOVordKid4qpdH2ar2I3KvXkHW5pjj65eQl7Dtb2GQcr3+Tgde/yUA7dxlUSjeo2ikQoHRDQDsFVEo3BCgVULVzg79SAZm07rwlaz7O7wijTEStYdMCaMSIEWhsClJSUlKjx8+aNQuzZs0y2jZv3jzMmzfPDNERUVvSnEVdmyKVCAjq4I6gDu64O9QX4Z2V2Hd2f5PHKVwkqKjSo6hch6JyHY6rNfW2EwSgk6ccAe3coLpeFPl5y/HvHVlWeZzfWqNMLLLIlhxmDhARUWu1dFHXppjyQkd/pQK73robZZXVUBdfg7qoArlF1wy/v1h8DeriCqiLKlBZrUd+iRb5JVpk5JgWQ+1ttr8nH0W/wHZo7+6KDp6uNb96uELpJoPEhOLCWqNM1ryVx0KL6sMCiIiolUyZZzQzLgwuUgmUbhIo3WQI9a//CRW9XsSVskqoi6/hYlFFTYFUXIG07EKk5xQ1Gcu633Kw7re6VZNEANq5u8LHwxU+139t7+EKHw8ZfDzk8PGQQamQ4Z1Nf1h8lMmat/KsOZp1ILsQhwoEdMguRPTtvmYvsljImRcLICIiM2jpPKNbSSQCOnnJ0clLjr5dbmzfl3UFj37R9G22u3p0hEwqwZWySlwtq8SVskqUVFRBLwKFZZUoLKtsdm61akeZnkxKQ0hHT3gpXOAhr/l4Xf/VzQXIKQX+vFIGpYcCXnIZFDIJBKHmH+pqvYjE749b7Vae9UezpFh55qDZi6y2dFvSXgo5FkBERGZSO89oX2Y+tu06gJg7o8w2EmDqbbZlUwfXOZ+uWo+r5ZWGAuhqmQ6FZVoU1v5arsPVskqcLSjDxaJrTcay83RBE2/YdsH/Hd1j+CYRAE+5CzzlLpBIYPSP+K1qi6wPfziB3iolFDIJ5DIpFC5SKGQSuLnW/r7mu0ImhdzlRoFVy1qFljWKrLZ0W9KenmJkAUREZEZSiYCoEB9cOSEiyoz/Z2vqbbb6zieTSuDrpYCvl6LRc5g6yvTIoED4eLiiTFuFEm0VyrRVKNNWo0RbhdIKHQqKS1EtyFBWWQVRrHnLt6aiCpqKKpPz/WJXtsltAUDuIjEqivR60aRC69V16Qjp4A5XFwlk0pqPq4sErlIJZC4CXKVSyKTCTduu/yqVQCoB3tt0zKJFFgs5y2EBRETkIMx1m60hpo4y/fOvfRr8x1an02Hr1q0YM2YUpFIXXNNVo1RbVfOpqMJv2YWYs/VEk7H0D2wHN7kUFTo9KnTV1z96aKuqDduq9Dei1Fbpoa3So7jpASwj32dcbN4BzVBbZIW+9wMULlJIpQJcJAKkEgEuEglcpLW/FyCVSCAz+i5AJpVAU6EzqZB7cc0hBLZ3h6T2eKGmT6kEkEokcJEIhn3GbQQIAP7xv4aLLAD4e/If8JS7QCqRQCLU3Kqt+REQoK+uwrlS4I9cDWQyFwgCIBGE65+apxr1ouWLxeZiAURE5EDM+Tj/rVozylQfiUQwzBGqXQQkvLMSS/dkN1lkrX9+aJPnqarWo6Kqphi6VlltVBwdPl+Ef5lQaI0J90dHLzl01TUFlK5ahK5Kj8pq/U3baj6V1/dXXt9fpq1CeWV1k+fQVYvQVZs++tUSP/5xyaL9F5ZV4vGlaY20cMGnR5sePWxIbSGXll1okSc168MCiIjIwVjqcX7A8qNM5iyyXKQSeEol8JTX/acsMqg9lptQaH02qX+Li0dTbxkufKQf+nZphyq9iGq9CF21HtV60fC9qlp/4/e3fD+ZV4LPd2Y1eY4HIlTwb6dAdbWIarHm2Fs/Vfrr+25pk1dcgVOXmn6jub+3HJ4KGfSiCFGsWWpKL9asy1lWfg1yhQKAAP317TX7RYgAtLpqXNPpmzxHfknDo13mxgKIiIiMWHKUqbZ/SxZZgPlHs+pj6i3D+/uqWjUH6Lv03CbP8enEfhYv5OZNjKy38L5x2/OuBtfiMvUcTc1TMycWQEREVIclR5kAyxdZtedwlNEsW57D1EJucIiPXZ+juVgAERGRTVi6yALaxmgWCznLYAFERERtmrVGsyzx/qdbz8FCznxYABEREbWSpd7/dOs52sJtSUufw1QsgIiIiAiAdW5LWuMcppDYOgAiIiIia2MBRERERE6HBRARERE5HRZARERE5HRYABEREZHTYQFERERETocFEBERETkdFkBERETkdFgAERERkdPhm6DrIYo1y7RpNBqz963T6VBeXg6NRgOZTGb2/u2Vs+YNMHdnzN1Z8waYuzPmbk951/67XfvveGNYANWjpKQEABAYGGjjSIiIiKi5SkpKoFQqG20jiKaUSU5Gr9fj4sWL8PLygiCYd4E2jUaDwMBA5OTkwNvb26x92zNnzRtg7s6Yu7PmDTB3Z8zdnvIWRRElJSVQqVSQSBqf5cMRoHpIJBJ06dLFoufw9va2+Q+KLThr3gBzd8bcnTVvgLk7Y+72kndTIz+1OAmaiIiInA4LICIiInI6LICsTC6XY+bMmZDL5bYOxaqcNW+AuTtj7s6aN8DcnTF3R82bk6CJiIjI6XAEiIiIiJwOCyAiIiJyOiyAiIiIyOmwALKAf//73wgJCYFCocCAAQOwa9euRtvv3LkTAwYMgEKhwG233YbPP//cSpGaxwcffIBBgwbBy8sLvr6+GDduHE6dOtXoMTt27IAgCHU+J0+etFLU5jFr1qw6Ofj7+zd6jKNf71pdu3at9xq++OKL9bZ31GuempqKuLg4qFQqCIKATZs2Ge0XRRGzZs2CSqWCm5sbRowYgWPHjjXZ74YNGxAWFga5XI6wsDAkJydbKIOWayx3nU6Hv/3tb+jTpw88PDygUqnwxBNP4OLFi432mZSUVO/PQUVFhYWzaZ6mrvvUqVPr5DBkyJAm+7X3695U3vVdO0EQ8PHHHzfYp71ecxZAZrZu3Tq8+uqreOedd3DkyBHceeediI2Nxfnz5+ttn52djTFjxuDOO+/EkSNH8Pe//x0vv/wyNmzYYOXIW27nzp148cUXsX//fqSkpKCqqgoxMTEoKytr8thTp05BrVYbPt27d7dCxObVu3dvoxyOHj3aYNu2cL1r/fbbb0Z5p6SkAAAefvjhRo9ztGteVlaGiIgILFq0qN79H330ET799FMsWrQIv/32G/z9/TFy5EjDkjr12bdvHyZOnIjJkycjIyMDkydPxoQJE3DgwAFLpdEijeVeXl6Ow4cP47333sPhw4exceNGnD59GmPHjm2yX29vb6OfAbVaDYVCYYkUWqyp6w4Ao0ePNsph69atjfbpCNe9qbxvvW7Lli2DIAh46KGHGu3XLq+5SGY1ePBg8bnnnjPaFhoaKr799tv1tn/rrbfE0NBQo23PPvusOGTIEIvFaGn5+fkiAHHnzp0Ntvn1119FAOLVq1etF5gFzJw5U4yIiDC5fVu83rVeeeUVsVu3bqJer693f1u45gDE5ORkw3e9Xi/6+/uLH374oWFbRUWFqFQqxc8//7zBfiZMmCCOHj3aaNuoUaPERx55xOwxm8utudcnLS1NBCCeO3euwTbLly8XlUqleYOzsPpynzJlivjAAw80qx9Hu+6mXPMHHnhAvOeeexptY6/XnCNAZlRZWYlDhw4hJibGaHtMTAz27t1b7zH79u2r037UqFE4ePAgdDqdxWK1pOLiYgCAj49Pk20jIyMREBCAe++9F7/++qulQ7OIM2fOQKVSISQkBI888gjOnj3bYNu2eL2Bmp/9VatW4cknn2xy/by2cM1rZWdnIy8vz+iayuVy3HXXXQ3+nQca/jlo7BhHUFxcDEEQ0K5du0bblZaWIjg4GF26dMFf/vIXHDlyxDoBmtmOHTvg6+uLHj164Omnn0Z+fn6j7dvadb906RK2bNmC6dOnN9nWHq85CyAzKigoQHV1Nfz8/Iy2+/n5IS8vr95j8vLy6m1fVVWFgoICi8VqKaIoIj4+HnfccQfCw8MbbBcQEID//ve/2LBhAzZu3IiePXvi3nvvRWpqqhWjbb2oqCisXLkSP/30E7744gvk5eVh6NChuHLlSr3t29r1rrVp0yYUFRVh6tSpDbZpK9f8ZrV/r5vzd772uOYeY+8qKirw9ttvY9KkSY2uBxUaGoqkpCRs3rwZa9euhUKhwLBhw3DmzBkrRtt6sbGxWL16NX755Rd88skn+O2333DPPfdAq9U2eExbu+4rVqyAl5cXHnzwwUbb2es152KoFnDr/wGLotjo/xXX176+7Y7gpZdewu+//47du3c32q5nz57o2bOn4Xt0dDRycnLwf//3fxg+fLilwzSb2NhYw+/79OmD6OhodOvWDStWrEB8fHy9x7Sl611r6dKliI2NhUqlarBNW7nm9Wnu3/mWHmOvdDodHnnkEej1evz73/9utO2QIUOMJgsPGzYM/fv3x2effYaFCxdaOlSzmThxouH34eHhGDhwIIKDg7Fly5ZGC4K2dN2XLVuGxx57rMm5PPZ6zTkCZEYdO3aEVCqtU83n5+fXqfpr+fv719vexcUFHTp0sFisljBjxgxs3rwZv/76K7p06dLs44cMGWLz/yNoLQ8PD/Tp06fBPNrS9a517tw5bN++HU899VSzj3X0a177xF9z/s7XHtfcY+yVTqfDhAkTkJ2djZSUlGavBi6RSDBo0CCH/jkAakY4g4ODG82jLV33Xbt24dSpUy36e28v15wFkBm5urpiwIABhqdhaqWkpGDo0KH1HhMdHV2n/bZt2zBw4EDIZDKLxWpOoijipZdewsaNG/HLL78gJCSkRf0cOXIEAQEBZo7OurRaLU6cONFgHm3het9q+fLl8PX1xf3339/sYx39moeEhMDf39/omlZWVmLnzp0N/p0HGv45aOwYe1Rb/Jw5cwbbt29vUREviiLS09Md+ucAAK5cuYKcnJxG82gr1x2oGfUdMGAAIiIimn2s3VxzW82+bqu+/vprUSaTiUuXLhWPHz8uvvrqq6KHh4f4559/iqIoim+//bY4efJkQ/uzZ8+K7u7u4muvvSYeP35cXLp0qSiTycRvv/3WVik02/PPPy8qlUpxx44dolqtNnzKy8sNbW7Ne968eWJycrJ4+vRp8Y8//hDffvttEYC4YcMGW6TQYq+//rq4Y8cO8ezZs+L+/fvFv/zlL6KXl1ebvt43q66uFoOCgsS//e1vdfa1lWteUlIiHjlyRDxy5IgIQPz000/FI0eOGJ50+vDDD0WlUilu3LhRPHr0qPjoo4+KAQEBokajMfQxefJkoydB9+zZI0qlUvHDDz8UT5w4IX744Yeii4uLuH//fqvn15jGctfpdOLYsWPFLl26iOnp6UZ/97VaraGPW3OfNWuW+OOPP4pZWVnikSNHxGnTpokuLi7igQMHbJFigxrLvaSkRHz99dfFvXv3itnZ2eKvv/4qRkdHi507d3b4697Uz7soimJxcbHo7u4uLlmypN4+HOWaswCygMWLF4vBwcGiq6ur2L9/f6PHwadMmSLeddddRu137NghRkZGiq6urmLXrl0b/KGyVwDq/SxfvtzQ5ta8586dK3br1k1UKBRi+/btxTvuuEPcsmWL9YNvpYkTJ4oBAQGiTCYTVSqV+OCDD4rHjh0z7G+L1/tmP/30kwhAPHXqVJ19beWa1z6+f+tnypQpoijWPAo/c+ZM0d/fX5TL5eLw4cPFo0ePGvVx1113GdrXWr9+vdizZ09RJpOJoaGhdlkINpZ7dnZ2g3/3f/31V0Mft+b+6quvikFBQaKrq6vYqVMnMSYmRty7d6/1k2tCY7mXl5eLMTExYqdOnUSZTCYGBQWJU6ZMEc+fP2/UhyNe96Z+3kVRFP/zn/+Ibm5uYlFRUb19OMo152rwRERE5HQ4B4iIiIicDgsgIiIicjosgIiIiMjpsAAiIiIip8MCiIiIiJwOCyAiIiJyOiyAiIiIyOmwACIiIiKnwwKIiMgEgiBg06ZNtg6DiMyEBRAR2b2pU6dCEIQ6n9GjR9s6NCJyUC62DoCIyBSjR4/G8uXLjbbJ5XIbRUNEjo4jQETkEORyOfz9/Y0+7du3B1Bze2rJkiWIjY2Fm5sbQkJCsH79eqPjjx49invuuQdubm7o0KEDnnnmGZSWlhq1WbZsGXr37g25XI6AgAC89NJLRvsLCgrw17/+Fe7u7ujevTs2b95s2aSJyGJYABFRm/Dee+/hoYceQkZGBh5//HE8+uijOHHiBACgvLwco0ePRvv27fHbb79h/fr12L59u1GBs2TJErz44ot45plncPToUWzevBm333670TkSExMxYcIE/P777xgzZgwee+wxFBYWWjVPIjITWy9HT0TUlClTpohSqVT08PAw+vzjH/8QRVEUAYjPPfec0TFRUVHi888/L4qiKP73v/8V27dvL5aWlhr2b9myRZRIJGJeXp4oiqKoUqnEd955p8EYAIjvvvuu4XtpaakoCIL4ww8/mC1PIrIezgEiIodw9913Y8mSJUbbfHx8DL+Pjo422hcdHY309HQAwIkTJxAREQEPDw/D/mHDhkGv1+PUqVMQBAEXL17Evffe22gMffv2Nfzew8MDXl5eyM/Pb2lKRGRDLICIyCF4eHjUuSXVFEEQAACiKBp+X18bNzc3k/qTyWR1jtXr9c2KiYjsA+cAEVGbsH///jrfQ0NDAQBhYWFIT09HWVmZYf+ePXsgkUjQo0cPeHl5oWvXrvj555+tGjMR2Q5HgIjIIWi1WuTl5Rltc3FxQceOHQEA69evx8CBA3HHHXdg9erVSEtLw9KlSwEAjz32GGbOnIkpU6Zg1qxZuHz5MmbMmIHJkyfDz88PADBr1iw899xz8PX1RWxsLEpKSrBnzx7MmDHDuokSkVWwACIih/Djjz8iICDAaFvPnj1x8uRJADVPaH399dd44YUX4O/vj9WrVyMsLAwA4O7ujp9++gmvvPIKBg0aBHd3dzz00EP49NNPDX1NmTIFFRUVmDdvHt544w107NgR48ePt16CRGRVgiiKoq2DICJqDUEQkJycjHHjxtk6FCJyEJwDRERERE6HBRARERE5Hc4BIiKHxzv5RNRcHAEiIiIip8MCiIiIiJwOCyAiIiJyOiyAiIiIyOmwACIiIiKnwwKIiIiInA4LICIiInI6LICIiIjI6bAAIiIiIqfz//KwDQ0W7iPdAAAAAElFTkSuQmCC",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"plt.plot(history.history[\"loss\"][1:], \"o-\", label = \"Training Loss\")\n",
|
||
"plt.xlabel(\"Epoch\")\n",
|
||
"# plt.yscale('log')\n",
|
||
"plt.ylabel(\"Loss (Huber)\")\n",
|
||
"plt.grid('on')\n",
|
||
"plt.savefig(\"loss_1_to_end.png\", dpi=300)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Test the model"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 48,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\u001b[1m15641/15641\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 351us/step - loss: 5.1847e-07\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"3.571243496480747e-07"
|
||
]
|
||
},
|
||
"execution_count": 48,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# test on all test data\n",
|
||
"model_simple.evaluate(X_test.loc[:, X_test.columns != \"Class\"], y_test.loc[:, y_test.columns != \"Class\"])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 49,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\u001b[1m15452/15452\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m6s\u001b[0m 385us/step - loss: 5.2313e-07\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"3.601293485644419e-07"
|
||
]
|
||
},
|
||
"execution_count": 49,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# test on non-reactive data\n",
|
||
"model_simple.evaluate(X_test[X_test['Class'] == 0].iloc[:,X_test.columns != \"Class\"], y_test[X_test['Class'] == 0].iloc[:, y_test.columns != \"Class\"])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 17,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\u001b[1m94/94\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 4ms/step - loss: 4.0710e-05\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"mass_balance = mass_balance(model_simple, X_test, scaler_X, func_dict_in, func_dict_out)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 50,
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"\u001b[1m189/189\u001b[0m \u001b[32m━━━━━━━━━━━━━━━━━━━━\u001b[0m\u001b[37m\u001b[0m \u001b[1m0s\u001b[0m 393us/step - loss: 1.2226e-07\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"1.1114495634956256e-07"
|
||
]
|
||
},
|
||
"execution_count": 50,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# test on reactive data\n",
|
||
"model_simple.evaluate(X_test[X_test['Class'] == 1].iloc[:,:-1], y_test[X_test['Class'] == 1].iloc[:, :-1])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Save the model"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 53,
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Save the model\n",
|
||
"model.save(\"Barite_50_Model_additional_species.keras\")"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"kernelspec": {
|
||
"display_name": "training",
|
||
"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.11.11"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 2
|
||
}
|