├── .gitignore
├── README.md
├── ckpts
├── 110.pickle
└── 78.pickle
├── knot_theory.ipynb
├── requirements.txt
└── test_ckpt.py
/.gitignore:
--------------------------------------------------------------------------------
1 | knot_theory_invariants.csv
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # CompactNet
2 | This repo is a slight modification on DeepMind's _Advancing mathematics by
3 | guiding human intuition with AI_
4 | - [Original Notebook](https://colab.research.google.com/github/deepmind/mathematics_conjectures/blob/main/knot_theory.ipynb)
5 | - [Original Repo](https://github.com/google-deepmind/mathematics_conjectures)
6 | - [Nature Paper](https://www.nature.com/articles/s41586-021-04086-x)
7 |
8 | We noticed some issues when the [KAN](https://arxiv.org/abs/2404.19756) paper
9 | cited this work and found that the comparisons had some errors.
10 | We found that we could match KAN's 81.6% accuracy on this dataset with as few as
11 | 122 parameters.
12 | We did not make any major modifications to the DeepMind code.
13 | To achieve this result we only decreased the network size, used a random seed,
14 | and increased the training time.
15 | Keeping the same seed and keeping the same training cutoff we could get a
16 | matching result with a network with 204 parameters.
17 |
18 | The table below depicts some of our results.
19 | There are some variances so numbers may change slightly during your runs.
20 | Running several times you should be quite similar to ours.
21 | These results maintain the same random seed and the same training limit.
22 |
23 | | Network | Number of Hidden Neurons| Number of Parameters | Accuracy Pre Salient | Accuracy Post Salient |
24 | |:--------:|:---------------------:|:---------------------:|:----------------------:|:-----------------------:|
25 | | [300, 300, 300] | 900 | 190,214 | 81.38% | 80.14% |
26 | | [100, 100, 100] | 300 | 23,414 | 82.79% | 82.04% |
27 | | [50, 50, 50] | 150 | 6,714 | 85.13% | 81.65% |
28 | | [10, 10, 10] | 30 | 554 | 84.45% | 82.30% |
29 | | [5, 5, 5] | 15 | 234 | 83.06% | 80.42% |
30 | | [4, 4, 4] | 12 | 182 | 76.73% | 65.19% |
31 | | [3, 3, 3] | 9 | 134 | 66.33% | 74.93% |
32 | | [50, 50] | 100 | 4,164 | 87.15% | 82.65% |
33 | | [10, 10] | 20 | 444 | 83.02% | 81.50% |
34 | | [5, 5] | 10 | 204 | 82.19% | 81.33% |
35 | | [4, 4] | 8 | 162 | 81.89% | 81.03% |
36 | | [3, 3] | 6 | 122 | 77.72% | 76.24% |
37 | | Baseline (direct calculate) | 0 | 0 | 73.82% | 73.82% |
38 | | DeepMind's 4 layer reported | 900 | 190,214 | 78% | 78% |
39 | | KAN | N/A | 200 | 81.6% | 78.2% |
40 |
41 | Here are some results where we have changed the random seed and training length.
42 | We set `num_training_steps` to 50k for an arbitrarially long run and report how many steps before the network early stopped (`Steps`)
43 | | Network | Number of Hidden Neurons|Number of Parameters | seed | Accuarcy Pre Salient | Steps | Accuracy Post Salient | Steps |
44 | |:--------:|:----:|:---------------------:|:----:|:---------------------:|:-----:|:----------------------:|:-----:|
45 | | [3,3] | 6 | 122 | 552 | 81.60% | 20700 | 81.69% | 22100 |
46 | | [2,2] | 4 | 84 | 8110 | 81.33% | 22700 | 80.44% | 23300 |
47 |
48 | We also have advanced methods to train a two layer extremely small MLP in 1k steps that can achieve average performance (averaged over 10 times) of more thann 80%. You may check the models in the folder `ckpt` for details. You may run the following code for inference.
49 | ```python
50 | python test_ckpt.py -hn 3
51 | python test_ckpt.py -hn 2
52 | ```
53 |
54 | | Network | Number of Neurons|Number of Parameters | Accuarcy Pre Salient | Steps | Accuracy Post Salient | Steps |
55 | |:--------:|:---------------------:|:----:|:---------------------:|:-----:|:----------------------:|:-----:|
56 | | [3] | 3 | 110 | 82.42% | ~1000 | 80.33% | ~1000 |
57 | | [2] | 2 | 78 | 80.85% | ~1000 | 80.23% | ~1000|
58 |
59 |
60 | ## Running
61 | ```
62 | pip install -r requirements.txt
63 | ```
64 | You will also need to install the dataset which requires having installed
65 | [gsutil](https://cloud.google.com/storage/docs/gsutil_install).
66 | If you install this, we will automatically download the dataset for you.
67 | Make sure `gsutil` is in your path before opening the notebook or it may not be
68 | able to download it for you.
69 |
70 | Line 1 of the file contains the network definition where you should define how
71 | many hidden neurons you want per hidden layer.
72 | The length of the list determines the number of hidden layers.
73 | For example `[2,2]` means two hidden layers with 2 neurons each.
74 |
--------------------------------------------------------------------------------
/ckpts/110.pickle:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SHI-Labs/CompactNet/cba12b447a654b154051eeb63caff6088c022a15/ckpts/110.pickle
--------------------------------------------------------------------------------
/ckpts/78.pickle:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/SHI-Labs/CompactNet/cba12b447a654b154051eeb63caff6088c022a15/ckpts/78.pickle
--------------------------------------------------------------------------------
/knot_theory.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {
6 | "id": "n-vSyzB-qmir"
7 | },
8 | "source": [
9 | "\n",
10 | "Copyright 2021 DeepMind Technologies Limited\n",
11 | "\n",
12 | "Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n",
13 | "\n",
14 | "https://www.apache.org/licenses/LICENSE-2.0\n",
15 | "Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License."
16 | ]
17 | },
18 | {
19 | "cell_type": "markdown",
20 | "metadata": {},
21 | "source": [
22 | "# Reimplimitation/Validation of DeepMind Colab\n",
23 | "- [Original Notebook](https://colab.research.google.com/github/deepmind/mathematics_conjectures/blob/main/knot_theory.ipynb)\n",
24 | "- [Original Repo](https://github.com/google-deepmind/mathematics_conjectures)\n",
25 | "- [Nature Paper](https://www.nature.com/articles/s41586-021-04086-x)\n",
26 | "\n",
27 | "The code is nearly identical to the original notebook which you can compare with the link above. We've only made some minor changes (the rest is unmodified)\n",
28 | "- We [rewrote the network](#Network-Definition-\\(modified\\)) to be defined with a loop so you can use the array on the next line to define the architecture\n",
29 | "- We noticed an off-by-one error on the last layer. Original has an output of 13 and it should be 14 (even). In most cases this seems not to make a big difference.\n",
30 | "\n",
31 | "We noticed that we could shrink DeepMind's Network and still get >80% accuracy. We find that you can reliably get netowrks with <200 parameters to classify with >80% accuracy. We've included some of our results [here](#Our-Results). If you find better results, let us know! :)\n",
32 | " \n",
33 | "# How To Use?\n",
34 | "1) First, make sure that you install the requirements (if you haven't, create a new cell and run `!pip install -r requirements.txt`)\n",
35 | "2) Download [gsutils](https://cloud.google.com/storage/docs/gsutil_install) (This is called [in this cell](Run me first to get data)). Make sure that `gsutils` is within your path (the installation should handle this. You may need to close jupyter and reopen in a new terminal). We will download the file for you if we don't find it.\n",
36 | "\n",
37 | "For quick validation you can just hit run and you will get an output from a 4 layer network (2 hidden layers) where each hidden layer has 5 neurons. Your result should match the shown outputs of this notebook (within small variance)\n",
38 | "\n",
39 | "To define a different MLP structure edit `hidden_layers` on the cell below. The numbers represent the hidden neurons per hidden layer. This is arbitrary so `[4,5,6]` would define a 5 layer network (3 hidden layers) where there are 4 neurons in the first hidden layer, 5 in the second hidden layer, and 6 in the third hidden layer. The input layer is always 17 neurons and the output is 14 (when using `use_fix`). You can see the summary of your network in the output just above [this cell](#Network-Setup)\n",
40 | "\n",
41 | "When using smaller networks you may want to edit some of the user defined parameters, specifically `num_training_steps` (suggest use the commented `50_000`). This defines the *maximum* number of training steps that will be used. Network will early stop if validation loss increases. \n",
42 | "\n",
43 | "We also suggest trying different random seeds. There is some variance to the results so this may be good to check. You can find the user defined variables [here](#User-Defined-Parameters)\n",
44 | "\n",
45 | "### What We Don't Do\n",
46 | "We didn't want to stray from DeepMind's code much so we don't implement any different training techniques or anything else. It is likely that results could be improved with changes such as different optimizers, learning rates (learning schedulers), or any number of modern DL training techniques. "
47 | ]
48 | },
49 | {
50 | "cell_type": "code",
51 | "execution_count": 1,
52 | "metadata": {},
53 | "outputs": [],
54 | "source": [
55 | "# Length of array = number of hidden layers\n",
56 | "# Array entries = number of hidden neurons per hidden layer\n",
57 | "# e.g. [5,5] = 4 layer network with [17, 5, 5, 14] (17 input neurons, 2 hidden layers w/ 5 hidden neurons, 14 output neurons)\n",
58 | "hidden_layers = [5,5]\n",
59 | "# Set True to use the off-by-one error fix\n",
60 | "use_fix = True"
61 | ]
62 | },
63 | {
64 | "cell_type": "markdown",
65 | "metadata": {},
66 | "source": [
67 | "# Our Results\n",
68 | "Numbers may vary. With smaller networks the network will likely stop training at the max number of training steps (10k in original)\n",
69 | "All results in this table are with identical settings except changing the hidden layer.\n",
70 | "(Your numbers may vary slightly, especially in smaller networks. See tips below)\n",
71 | "| Network | Number of Parameters | Accuracy Pre Salient | Accuracy Post Salient |\n",
72 | "|:--------|---------------------:|---------------------:|----------------------:|\n",
73 | "|[300,300,300] | 190,214 | 0.8137779 | 0.8013719 |\n",
74 | "|[100,100,100] | 23,414 | 0.82789063 | 0.8204076 |\n",
75 | "|[50,50,50] | 6,714 | 0.8512915 | 0.8164692 |\n",
76 | "|[10,10,10] | 554 | 0.8444977 | 0.82296765 |\n",
77 | "|[5,5,5] | 234 | 0.83061475 | 0.80422723 |\n",
78 | "|[4,4,4] | 182 | 0.7673045 | 0.6519413 |\n",
79 | "|[3,3,3] | 134 | 0.66332996 | 0.74925333 | \n",
80 | "| - | - | - | - |\n",
81 | "|[50,50] | 4,164 | 0.87154156 | 0.8265122 |\n",
82 | "|[10,10] | 444 | 0.8302209 | 0.8149923 |\n",
83 | "|[5,5] | 204 | 0.82191736 | 0.8132528 |\n",
84 | "|[4,4] | 162 | 0.81886506 | 0.810299 |\n",
85 | "|[3,3] | 122 | 0.77718335 | 0.76238143 |\n",
86 | "\n",
87 | "Here are some results where we have changed the random seed and training length. We set `num_training_steps` to 50k for an arbitrarially long run and report how many steps before the network early stopped (`Steps`)\n",
88 | "| Network | Number of Parameters | seed | Accuarcy Pre Salient | Steps | Accuracy Post Salient | Steps |\n",
89 | "|:--------|---------------------:|:----:|---------------------:|:-----:|----------------------:|:-----:|\n",
90 | "| [3,3] | 122 | 552 | 0.8160097 | 20700 | 0.81686306 | 22100 |\n",
91 | "| [2,2] | 84 | 8110 | 0.81328565 | 22700 | 0.8043914 | 23300 |\n",
92 | " "
93 | ]
94 | },
95 | {
96 | "cell_type": "markdown",
97 | "metadata": {},
98 | "source": [
99 | "# User Defined Parameters"
100 | ]
101 | },
102 | {
103 | "cell_type": "markdown",
104 | "metadata": {},
105 | "source": [
106 | "We've moved user defined parameters here to make this easier to run\n",
107 | "#### Tips\n",
108 | "- Change random seed\n",
109 | "- Increase `num_training_steps`\n",
110 | "\n",
111 | "Most runs smaller than `[50,50,50]` will likely run the full `num_training_steps` so it is a good idea to change this value to see that actual potential of the network. Larger networks will likely early stop. This can also result in a small network getting a very different result when the random seed is different.\n",
112 | "\n",
113 | "Defaults\n",
114 | "| Variable | Value | Description |\n",
115 | "|:---------|-------:|-----------:|\n",
116 | "| `random_seed` | 2 | Random seed for notebook |\n",
117 | "| `num_training_steps` | 10_000 | Maximum number of training steps (will early stop) |\n",
118 | "| `network_weight_rng` | 1 | [Seed for generating network's initial random weights](#Network-Setup) |\n",
119 | "| `batch_size` | 64 | Training Batch size |\n",
120 | "| `learning_rate` | 0.001 | Training Learning Rate |\n",
121 | "| `validation_interval` | 100 | Frequency to check against validation split |\n",
122 | "\n",
123 | "`network_weight_rng` is used [here](#Network-Setup)\n"
124 | ]
125 | },
126 | {
127 | "cell_type": "code",
128 | "execution_count": 2,
129 | "metadata": {},
130 | "outputs": [
131 | {
132 | "name": "stdout",
133 | "output_type": "stream",
134 | "text": [
135 | "This run was performed with random_seed=2\n"
136 | ]
137 | }
138 | ],
139 | "source": [
140 | "# These are default values provided by the original colab\n",
141 | "import random\n",
142 | "#random_seed = random.randint(0,10000)\n",
143 | "random_seed = 2 # @param {type: \"integer\"}\n",
144 | "print(f\"This run was performed with {random_seed=}\")\n",
145 | "#\n",
146 | "# *maximum* number of training steps (will early stop!)\n",
147 | "num_training_steps = 10_000 # @param {type: \"integer\"}\n",
148 | "### Suggest using this, especially if smaller network\n",
149 | "#num_training_steps = 50_000 # @param {type: \"integer\"}\n",
150 | "#\n",
151 | "# Random number for initializing the network weights\n",
152 | "network_weight_rng = 1 # @param {type: \"integer\"}\n",
153 | "#\n",
154 | "#\n",
155 | "batch_size = 64 # @param {type: \"integer\"}\n",
156 | "learning_rate = 0.001 # @param {type: \"float\"}\n",
157 | "validation_interval = 100 # @param {type: \"integer\"}\n",
158 | "\n"
159 | ]
160 | },
161 | {
162 | "cell_type": "markdown",
163 | "metadata": {},
164 | "source": [
165 | "# Run me first to get data\n",
166 | "\n",
167 | "You may need to download [gsutil](https://cloud.google.com/storage/docs/gsutil_install)\n",
168 | "\n",
169 | "After doing so, close jupyter and open it back up in a new terminal. Making sure you have the binary in your path"
170 | ]
171 | },
172 | {
173 | "cell_type": "code",
174 | "execution_count": 3,
175 | "metadata": {},
176 | "outputs": [],
177 | "source": [
178 | "# @title Download data\n",
179 | "import pandas as pd\n",
180 | "\n",
181 | "#_, input_filename = tempfile.mkstemp()\n",
182 | "input_filename = \"./knot_theory_invariants.csv\"\n",
183 | "# USE YOUR OWN gsutil cp COMMAND HERE\n",
184 | "!(if [[ ! -a {input_filename} ]]; then \\\n",
185 | " gsutil cp \"gs://maths_conjectures/knot_theory/knot_theory_invariants.csv\" {input_filename}; \\\n",
186 | "fi)\n",
187 | "\n",
188 | "full_df = pd.read_csv(input_filename)"
189 | ]
190 | },
191 | {
192 | "cell_type": "markdown",
193 | "metadata": {},
194 | "source": [
195 | "# Run (Mostly Unmodified Deep Mind Code)"
196 | ]
197 | },
198 | {
199 | "cell_type": "markdown",
200 | "metadata": {},
201 | "source": [
202 | "### Pip installs\n",
203 | "Uncomment me if first time!"
204 | ]
205 | },
206 | {
207 | "cell_type": "code",
208 | "execution_count": 4,
209 | "metadata": {
210 | "cellView": "form",
211 | "id": "xQnp1V1cvdxy"
212 | },
213 | "outputs": [],
214 | "source": [
215 | "# @title Install required modules\n",
216 | "from IPython.display import clear_output\n",
217 | "\n",
218 | "#!pip install dm-haiku\n",
219 | "#!pip install optax\n",
220 | "clear_output()"
221 | ]
222 | },
223 | {
224 | "cell_type": "markdown",
225 | "metadata": {},
226 | "source": [
227 | "### Imports"
228 | ]
229 | },
230 | {
231 | "cell_type": "code",
232 | "execution_count": 5,
233 | "metadata": {
234 | "cellView": "form",
235 | "id": "3NFhPsG4u1L1"
236 | },
237 | "outputs": [],
238 | "source": [
239 | "# @title Imports\n",
240 | "import tempfile\n",
241 | "\n",
242 | "import haiku as hk\n",
243 | "import jax\n",
244 | "import jax.numpy as jnp\n",
245 | "import matplotlib.pyplot as plt\n",
246 | "import numpy as np\n",
247 | "import optax\n",
248 | "import seaborn as sns\n",
249 | "from sklearn.model_selection import train_test_split"
250 | ]
251 | },
252 | {
253 | "cell_type": "markdown",
254 | "metadata": {},
255 | "source": [
256 | "### Load and Preprocess Data"
257 | ]
258 | },
259 | {
260 | "cell_type": "code",
261 | "execution_count": 6,
262 | "metadata": {
263 | "cellView": "form",
264 | "id": "C-kZ_rW-h8Nk"
265 | },
266 | "outputs": [],
267 | "source": [
268 | "# @title Load and preprocess data\n",
269 | "\n",
270 | "#@markdown The columns of the dataset which will make up the inputs to the network.\n",
271 | "#@markdown In other words, for a knot k, X(k) will be a vector consisting of these quantities. In this case, these are the geometric invariants of each knot.\n",
272 | "#@markdown For descriptions of these invariants see https://knotinfo.math.indiana.edu/\n",
273 | "display_name_from_short_name = {\n",
274 | " 'chern_simons': 'Chern-Simons',\n",
275 | " 'cusp_volume': 'Cusp volume',\n",
276 | " 'hyperbolic_adjoint_torsion_degree': 'Adjoint Torsion Degree',\n",
277 | " 'hyperbolic_torsion_degree': 'Torsion Degree',\n",
278 | " 'injectivity_radius': 'Injectivity radius',\n",
279 | " 'longitudinal_translation': 'Longitudinal translation',\n",
280 | " 'meridinal_translation_imag': 'Re(Meridional translation)',\n",
281 | " 'meridinal_translation_real': 'Im(Meridional translation)',\n",
282 | " 'short_geodesic_imag_part': 'Im(Short geodesic)',\n",
283 | " 'short_geodesic_real_part': 'Re(Short geodesic)',\n",
284 | " 'Symmetry_0': 'Symmetry: $0$',\n",
285 | " 'Symmetry_D3': 'Symmetry: $D_3$',\n",
286 | " 'Symmetry_D4': 'Symmetry: $D_4$',\n",
287 | " 'Symmetry_D6': 'Symmetry: $D_6$',\n",
288 | " 'Symmetry_D8': 'Symmetry: $D_8$',\n",
289 | " 'Symmetry_Z/2 + Z/2': 'Symmetry: $\\\\frac{Z}{2} + \\\\frac{Z}{2}$',\n",
290 | " 'volume': 'Volume',\n",
291 | "}\n",
292 | "column_names = list(display_name_from_short_name)\n",
293 | "target = 'signature'\n",
294 | "\n",
295 | "#@markdown Split the data into a training, a validation and a holdout test set. To check\n",
296 | "#@markdown the robustness of the model and any proposed relationship, the training\n",
297 | "#@markdown process can be repeated with multiple different train/validation/test splits.\n",
298 | "\n",
299 | "random_state = np.random.RandomState(random_seed)\n",
300 | "train_df, validation_and_test_df = train_test_split(\n",
301 | " full_df, random_state=random_state)\n",
302 | "validation_df, test_df = train_test_split(\n",
303 | " validation_and_test_df, test_size=.5, random_state=random_state)\n",
304 | "\n",
305 | "# Find bounds for the signature in the training dataset.\n",
306 | "max_signature = train_df[target].max()\n",
307 | "min_signature = train_df[target].min()"
308 | ]
309 | },
310 | {
311 | "cell_type": "code",
312 | "execution_count": 7,
313 | "metadata": {},
314 | "outputs": [
315 | {
316 | "data": {
317 | "text/html": [
318 | ""
319 | ],
320 | "text/plain": [
321 | ""
322 | ]
323 | },
324 | "metadata": {},
325 | "output_type": "display_data"
326 | }
327 | ],
328 | "source": [
329 | "# I'm here because Haiku's display is wide. I'll add horizontal scrolling support to output cells\n",
330 | "from IPython.display import display, HTML\n",
331 | "display(HTML(\"\"))"
332 | ]
333 | },
334 | {
335 | "cell_type": "markdown",
336 | "metadata": {},
337 | "source": [
338 | "# Network Definition (modified)\n",
339 | "Modification in `net_forward` to allow user to modify based on `hidden_layers` from above"
340 | ]
341 | },
342 | {
343 | "cell_type": "code",
344 | "execution_count": 8,
345 | "metadata": {
346 | "cellView": "form",
347 | "id": "jmBkFuYGu_j5"
348 | },
349 | "outputs": [
350 | {
351 | "name": "stdout",
352 | "output_type": "stream",
353 | "text": [
354 | "+----------------------------+------------------------------------------------------------------+-----------------+-----------+-----------+---------------+---------------+\n",
355 | "| Module | Config | Module params | Input | Output | Param count | Param bytes |\n",
356 | "+============================+==================================================================+=================+===========+===========+===============+===============+\n",
357 | "| sequential (Sequential) | Sequential( | | f32[1,17] | f32[1,14] | 204 | 816.00 B |\n",
358 | "| | layers=[Linear(output_size=5), | | | | | |\n",
359 | "| | >, | | | | | |\n",
360 | "| | Linear(output_size=5), | | | | | |\n",
361 | "| | >, | | | | | |\n",
362 | "| | Linear(output_size=14)], | | | | | |\n",
363 | "| | ) | | | | | |\n",
364 | "+----------------------------+------------------------------------------------------------------+-----------------+-----------+-----------+---------------+---------------+\n",
365 | "| linear (Linear) | Linear(output_size=5) | w: f32[17,5] | f32[1,17] | f32[1,5] | 90 | 360.00 B |\n",
366 | "| └ sequential (Sequential) | | b: f32[5] | | | | |\n",
367 | "+----------------------------+------------------------------------------------------------------+-----------------+-----------+-----------+---------------+---------------+\n",
368 | "| linear_1 (Linear) | Linear(output_size=5) | w: f32[5,5] | f32[1,5] | f32[1,5] | 30 | 120.00 B |\n",
369 | "| └ sequential (Sequential) | | b: f32[5] | | | | |\n",
370 | "+----------------------------+------------------------------------------------------------------+-----------------+-----------+-----------+---------------+---------------+\n",
371 | "| linear_2 (Linear) | Linear(output_size=14) | w: f32[5,14] | f32[1,5] | f32[1,14] | 84 | 336.00 B |\n",
372 | "| └ sequential (Sequential) | | b: f32[14] | | | | |\n",
373 | "+----------------------------+------------------------------------------------------------------+-----------------+-----------+-----------+---------------+---------------+\n"
374 | ]
375 | }
376 | ],
377 | "source": [
378 | "# @title Network Definition\n",
379 | "\n",
380 | "#@markdown Create a simple feedforward network, using the DM Haiku library\n",
381 | "#@markdown (https://github.com/deepmind/dm-haiku).\n",
382 | "\n",
383 | "#@markdown The output of the network is a predicted categorical distribution, represented\n",
384 | "#@markdown by a vector q, where softmax(q)[i] is the predicted probability that the\n",
385 | "#@markdown signature of the knot is equal to 2*i + min_signature. Note that signature is\n",
386 | "#@markdown always an even integer.\n",
387 | "\n",
388 | "#@markdown We take the cross entropy between this distribution and the true distribution\n",
389 | "#@markdown (i.e. 1 at the true value of the signature, 0 everywhere else) as the loss\n",
390 | "#@markdown function.\n",
391 | "def net_forward(inp, use_fix=True):\n",
392 | " net = []\n",
393 | " for layer in hidden_layers:\n",
394 | " net.append(hk.Linear(layer))\n",
395 | " net.append(jax.nn.sigmoid)\n",
396 | " net.append(hk.Linear(int((max_signature - min_signature) / 2) + (1 if use_fix else 0)))\n",
397 | " return hk.Sequential(net)(inp)\n",
398 | "\n",
399 | "# Print out network and parameter info\n",
400 | "x = jnp.zeros((1, 17))\n",
401 | "print(hk.experimental.tabulate(net_forward)(x))\n",
402 | "# Uncomment if you want line by line\n",
403 | "#for method_invocation in hk.experimental.eval_summary(net_forward)(x):\n",
404 | "# print(method_invocation)\n",
405 | "\n",
406 | "def softmax_cross_entropy(logits, labels):\n",
407 | " # Labels are the true values of the signature\n",
408 | " one_hot = jax.nn.one_hot((labels - min_signature) / 2, logits.shape[-1])\n",
409 | " return -jnp.sum(jax.nn.log_softmax(logits) * one_hot, axis=-1)\n",
410 | "\n",
411 | "\n",
412 | "# The cross-entropy loss is composed with the network predictions, to define\n",
413 | "# `loss_fn` as a function on X and y.\n",
414 | "def loss_fn(inputs, labels):\n",
415 | " return jnp.mean(softmax_cross_entropy(net_forward(inputs), labels))\n",
416 | "\n",
417 | "\n",
418 | "# Haiku network transformation steps.\n",
419 | "loss_fn_t = hk.without_apply_rng(hk.transform(loss_fn))\n",
420 | "net_forward_t = hk.without_apply_rng(hk.transform(net_forward))\n",
421 | "\n",
422 | "\n",
423 | "@jax.jit\n",
424 | "def predict(params, data_X):\n",
425 | " return (np.argmax(net_forward_t.apply(params, data_X), axis=1) * 2 +\n",
426 | " min_signature)\n",
427 | "\n",
428 | "\n",
429 | "#@markdown Calculate the mean and standard deviation over each column in the training\n",
430 | "#@markdown dataset. We use this to normalize each feature, this is best practice for\n",
431 | "#@markdown inputting features into a network, but is also very important in this case\n",
432 | "#@markdown to ensure the gradients used for saliency are meaningfully comparable.\n",
433 | "def normalize_features(df, cols, add_target=True):\n",
434 | " features = df[cols]\n",
435 | " sigma = features.std()\n",
436 | " if any(sigma == 0):\n",
437 | " print(sigma)\n",
438 | " raise RuntimeError(\n",
439 | " \"A poor data stratification has led to no variation in one of the data \"\n",
440 | " \"splits for at least one feature (ie std=0). Restratify and try again.\")\n",
441 | " mu = features.mean()\n",
442 | " normed_df = (features - mu) / sigma\n",
443 | " if add_target:\n",
444 | " normed_df[target] = df[target]\n",
445 | " return normed_df\n",
446 | "\n",
447 | "\n",
448 | "def get_batch(df, cols, size=None):\n",
449 | " batch_df = df if size is None else df.sample(size)\n",
450 | " X = batch_df[cols].to_numpy()\n",
451 | " y = batch_df[target].to_numpy()\n",
452 | " return X, y\n",
453 | "\n",
454 | "\n",
455 | "normed_train_df = normalize_features(train_df, column_names)\n",
456 | "# Sometimes this line will cause a RuntimeError when running smaller networks. Just restart the kernel and try again.\n",
457 | "normed_validation_df = normalize_features(validation_df, column_names)\n",
458 | "normed_test_df = normalize_features(test_df, column_names)"
459 | ]
460 | },
461 | {
462 | "cell_type": "markdown",
463 | "metadata": {},
464 | "source": [
465 | "# Network Setup"
466 | ]
467 | },
468 | {
469 | "cell_type": "code",
470 | "execution_count": 9,
471 | "metadata": {
472 | "cellView": "form",
473 | "id": "_ZyvOA1g_08D"
474 | },
475 | "outputs": [
476 | {
477 | "name": "stderr",
478 | "output_type": "stream",
479 | "text": [
480 | "/opt/homebrew/anaconda3/lib/python3.11/site-packages/haiku/_src/initializers.py:127: UserWarning: Explicitly requested dtype float64 is not available, and will be truncated to dtype float32. To enable more dtypes, set the jax_enable_x64 configuration option or the JAX_ENABLE_X64 shell environment variable. See https://github.com/google/jax#current-gotchas for more.\n",
481 | " unscaled = jax.random.truncated_normal(\n",
482 | "/opt/homebrew/anaconda3/lib/python3.11/site-packages/haiku/_src/base.py:658: UserWarning: Explicitly requested dtype float64 requested in zeros is not available, and will be truncated to dtype float32. To enable more dtypes, set the jax_enable_x64 configuration option or the JAX_ENABLE_X64 shell environment variable. See https://github.com/google/jax#current-gotchas for more.\n",
483 | " param = init(shape, dtype)\n"
484 | ]
485 | }
486 | ],
487 | "source": [
488 | "# @title Network Setup (re-run before re-training)\n",
489 | "\n",
490 | "train_X, train_y = get_batch(normed_train_df, column_names, batch_size)\n",
491 | "\n",
492 | "# Pick a random seed for the network weights. To check the robustness of the\n",
493 | "# model, the training process can be repeated with multiple different random\n",
494 | "# seeds.\n",
495 | "rng = jax.random.PRNGKey(network_weight_rng)\n",
496 | "init_params = loss_fn_t.init(rng, train_X, train_y)\n",
497 | "\n",
498 | "opt_init, opt_update = optax.adam(learning_rate)\n",
499 | "opt_state = opt_init(init_params)"
500 | ]
501 | },
502 | {
503 | "cell_type": "markdown",
504 | "metadata": {},
505 | "source": [
506 | "### Network Training"
507 | ]
508 | },
509 | {
510 | "cell_type": "code",
511 | "execution_count": 10,
512 | "metadata": {
513 | "cellView": "form",
514 | "id": "sofhcPK4vZWl"
515 | },
516 | "outputs": [
517 | {
518 | "name": "stdout",
519 | "output_type": "stream",
520 | "text": [
521 | "Step count: 0\n",
522 | "Train loss: 2.8116812705993652\n",
523 | "Validation loss: 2.7941524982452393\n",
524 | "Step count: 100\n",
525 | "Train loss: 2.384979724884033\n",
526 | "Validation loss: 2.407904863357544\n",
527 | "Step count: 200\n",
528 | "Train loss: 2.1264162063598633\n",
529 | "Validation loss: 2.1435587406158447\n",
530 | "Step count: 300\n",
531 | "Train loss: 2.0061676502227783\n",
532 | "Validation loss: 1.9773170948028564\n",
533 | "Step count: 400\n",
534 | "Train loss: 1.8468494415283203\n",
535 | "Validation loss: 1.8776098489761353\n",
536 | "Step count: 500\n",
537 | "Train loss: 1.8516018390655518\n",
538 | "Validation loss: 1.811793327331543\n",
539 | "Step count: 600\n",
540 | "Train loss: 1.715728759765625\n",
541 | "Validation loss: 1.760715365409851\n",
542 | "Step count: 700\n",
543 | "Train loss: 1.6884984970092773\n",
544 | "Validation loss: 1.717073678970337\n",
545 | "Step count: 800\n",
546 | "Train loss: 1.6176589727401733\n",
547 | "Validation loss: 1.6789257526397705\n",
548 | "Step count: 900\n",
549 | "Train loss: 1.4370570182800293\n",
550 | "Validation loss: 1.6448426246643066\n",
551 | "Step count: 1000\n",
552 | "Train loss: 1.5930187702178955\n",
553 | "Validation loss: 1.6133735179901123\n",
554 | "Step count: 1100\n",
555 | "Train loss: 1.6224822998046875\n",
556 | "Validation loss: 1.584986925125122\n",
557 | "Step count: 1200\n",
558 | "Train loss: 1.622300148010254\n",
559 | "Validation loss: 1.5556803941726685\n",
560 | "Step count: 1300\n",
561 | "Train loss: 1.444936990737915\n",
562 | "Validation loss: 1.5245068073272705\n",
563 | "Step count: 1400\n",
564 | "Train loss: 1.627079963684082\n",
565 | "Validation loss: 1.491458773612976\n",
566 | "Step count: 1500\n",
567 | "Train loss: 1.406960129737854\n",
568 | "Validation loss: 1.4536099433898926\n",
569 | "Step count: 1600\n",
570 | "Train loss: 1.3565831184387207\n",
571 | "Validation loss: 1.4108202457427979\n",
572 | "Step count: 1700\n",
573 | "Train loss: 1.4146857261657715\n",
574 | "Validation loss: 1.3642162084579468\n",
575 | "Step count: 1800\n",
576 | "Train loss: 1.1749764680862427\n",
577 | "Validation loss: 1.3149152994155884\n",
578 | "Step count: 1900\n",
579 | "Train loss: 1.188778042793274\n",
580 | "Validation loss: 1.264180302619934\n",
581 | "Step count: 2000\n",
582 | "Train loss: 1.3288445472717285\n",
583 | "Validation loss: 1.2146958112716675\n",
584 | "Step count: 2100\n",
585 | "Train loss: 1.3042057752609253\n",
586 | "Validation loss: 1.1659657955169678\n",
587 | "Step count: 2200\n",
588 | "Train loss: 1.248848557472229\n",
589 | "Validation loss: 1.1203685998916626\n",
590 | "Step count: 2300\n",
591 | "Train loss: 1.1984355449676514\n",
592 | "Validation loss: 1.078598141670227\n",
593 | "Step count: 2400\n",
594 | "Train loss: 1.2042495012283325\n",
595 | "Validation loss: 1.0411516427993774\n",
596 | "Step count: 2500\n",
597 | "Train loss: 1.1562697887420654\n",
598 | "Validation loss: 1.0058705806732178\n",
599 | "Step count: 2600\n",
600 | "Train loss: 0.8232065439224243\n",
601 | "Validation loss: 0.9747156500816345\n",
602 | "Step count: 2700\n",
603 | "Train loss: 0.9761694669723511\n",
604 | "Validation loss: 0.9461800456047058\n",
605 | "Step count: 2800\n",
606 | "Train loss: 0.7596954107284546\n",
607 | "Validation loss: 0.9209511876106262\n",
608 | "Step count: 2900\n",
609 | "Train loss: 0.9237159490585327\n",
610 | "Validation loss: 0.8975797891616821\n",
611 | "Step count: 3000\n",
612 | "Train loss: 0.8497984409332275\n",
613 | "Validation loss: 0.8760898113250732\n",
614 | "Step count: 3100\n",
615 | "Train loss: 0.7388738393783569\n",
616 | "Validation loss: 0.8562992215156555\n",
617 | "Step count: 3200\n",
618 | "Train loss: 0.9391216039657593\n",
619 | "Validation loss: 0.8379098773002625\n",
620 | "Step count: 3300\n",
621 | "Train loss: 0.8053942918777466\n",
622 | "Validation loss: 0.820518970489502\n",
623 | "Step count: 3400\n",
624 | "Train loss: 1.1734966039657593\n",
625 | "Validation loss: 0.8035964369773865\n",
626 | "Step count: 3500\n",
627 | "Train loss: 0.897958517074585\n",
628 | "Validation loss: 0.7881501317024231\n",
629 | "Step count: 3600\n",
630 | "Train loss: 0.7107032537460327\n",
631 | "Validation loss: 0.7737591862678528\n",
632 | "Step count: 3700\n",
633 | "Train loss: 0.7133588790893555\n",
634 | "Validation loss: 0.7591407895088196\n",
635 | "Step count: 3800\n",
636 | "Train loss: 0.8879278302192688\n",
637 | "Validation loss: 0.745370090007782\n",
638 | "Step count: 3900\n",
639 | "Train loss: 0.7890059947967529\n",
640 | "Validation loss: 0.7329174876213074\n",
641 | "Step count: 4000\n",
642 | "Train loss: 0.5831533670425415\n",
643 | "Validation loss: 0.721225917339325\n",
644 | "Step count: 4100\n",
645 | "Train loss: 0.7699029445648193\n",
646 | "Validation loss: 0.7102410197257996\n",
647 | "Step count: 4200\n",
648 | "Train loss: 0.6830381751060486\n",
649 | "Validation loss: 0.6998180150985718\n",
650 | "Step count: 4300\n",
651 | "Train loss: 0.6156393885612488\n",
652 | "Validation loss: 0.6894598603248596\n",
653 | "Step count: 4400\n",
654 | "Train loss: 0.8743906021118164\n",
655 | "Validation loss: 0.6800310015678406\n",
656 | "Step count: 4500\n",
657 | "Train loss: 0.6473797559738159\n",
658 | "Validation loss: 0.6715149283409119\n",
659 | "Step count: 4600\n",
660 | "Train loss: 0.7979230880737305\n",
661 | "Validation loss: 0.6632071733474731\n",
662 | "Step count: 4700\n",
663 | "Train loss: 0.6013624668121338\n",
664 | "Validation loss: 0.6549491286277771\n",
665 | "Step count: 4800\n",
666 | "Train loss: 0.6401097774505615\n",
667 | "Validation loss: 0.6469190120697021\n",
668 | "Step count: 4900\n",
669 | "Train loss: 0.7246673107147217\n",
670 | "Validation loss: 0.6397194266319275\n",
671 | "Step count: 5000\n",
672 | "Train loss: 0.5493844747543335\n",
673 | "Validation loss: 0.6325175762176514\n",
674 | "Step count: 5100\n",
675 | "Train loss: 0.6013330817222595\n",
676 | "Validation loss: 0.6253847479820251\n",
677 | "Step count: 5200\n",
678 | "Train loss: 0.5418999195098877\n",
679 | "Validation loss: 0.6195732951164246\n",
680 | "Step count: 5300\n",
681 | "Train loss: 0.5872135162353516\n",
682 | "Validation loss: 0.6133323311805725\n",
683 | "Step count: 5400\n",
684 | "Train loss: 0.6665270328521729\n",
685 | "Validation loss: 0.6069185137748718\n",
686 | "Step count: 5500\n",
687 | "Train loss: 0.544267475605011\n",
688 | "Validation loss: 0.6018220782279968\n",
689 | "Step count: 5600\n",
690 | "Train loss: 0.5228955745697021\n",
691 | "Validation loss: 0.5958737730979919\n",
692 | "Step count: 5700\n",
693 | "Train loss: 0.5577840805053711\n",
694 | "Validation loss: 0.5900106430053711\n",
695 | "Step count: 5800\n",
696 | "Train loss: 0.5805840492248535\n",
697 | "Validation loss: 0.5850721597671509\n",
698 | "Step count: 5900\n",
699 | "Train loss: 0.8313626050949097\n",
700 | "Validation loss: 0.5806062817573547\n",
701 | "Step count: 6000\n",
702 | "Train loss: 0.5863834619522095\n",
703 | "Validation loss: 0.5754520893096924\n",
704 | "Step count: 6100\n",
705 | "Train loss: 0.46375811100006104\n",
706 | "Validation loss: 0.5714226365089417\n",
707 | "Step count: 6200\n",
708 | "Train loss: 0.5163490772247314\n",
709 | "Validation loss: 0.5665392279624939\n",
710 | "Step count: 6300\n",
711 | "Train loss: 0.5626010894775391\n",
712 | "Validation loss: 0.5617250204086304\n",
713 | "Step count: 6400\n",
714 | "Train loss: 0.484112024307251\n",
715 | "Validation loss: 0.5571351647377014\n",
716 | "Step count: 6500\n",
717 | "Train loss: 0.5184279680252075\n",
718 | "Validation loss: 0.5530323386192322\n",
719 | "Step count: 6600\n",
720 | "Train loss: 0.5501329898834229\n",
721 | "Validation loss: 0.548738956451416\n",
722 | "Step count: 6700\n",
723 | "Train loss: 0.5456504821777344\n",
724 | "Validation loss: 0.5449445843696594\n",
725 | "Step count: 6800\n",
726 | "Train loss: 0.454240083694458\n",
727 | "Validation loss: 0.5415924787521362\n",
728 | "Step count: 6900\n",
729 | "Train loss: 0.5784645080566406\n",
730 | "Validation loss: 0.5375749468803406\n",
731 | "Step count: 7000\n",
732 | "Train loss: 0.492913156747818\n",
733 | "Validation loss: 0.5337445735931396\n",
734 | "Step count: 7100\n",
735 | "Train loss: 0.6137053966522217\n",
736 | "Validation loss: 0.5305295586585999\n",
737 | "Step count: 7200\n",
738 | "Train loss: 0.6540536880493164\n",
739 | "Validation loss: 0.5265972018241882\n",
740 | "Step count: 7300\n",
741 | "Train loss: 0.5247725248336792\n",
742 | "Validation loss: 0.5231927633285522\n",
743 | "Step count: 7400\n",
744 | "Train loss: 0.6034173965454102\n",
745 | "Validation loss: 0.520044207572937\n",
746 | "Step count: 7500\n",
747 | "Train loss: 0.5097901821136475\n",
748 | "Validation loss: 0.5166345834732056\n",
749 | "Step count: 7600\n",
750 | "Train loss: 0.5273083448410034\n",
751 | "Validation loss: 0.5132884979248047\n",
752 | "Step count: 7700\n",
753 | "Train loss: 0.6435624361038208\n",
754 | "Validation loss: 0.5110858082771301\n",
755 | "Step count: 7800\n",
756 | "Train loss: 0.4839707911014557\n",
757 | "Validation loss: 0.5074858665466309\n",
758 | "Step count: 7900\n",
759 | "Train loss: 0.5335568189620972\n",
760 | "Validation loss: 0.5046110153198242\n",
761 | "Step count: 8000\n",
762 | "Train loss: 0.44616270065307617\n",
763 | "Validation loss: 0.5017329454421997\n",
764 | "Step count: 8100\n",
765 | "Train loss: 0.5774402618408203\n",
766 | "Validation loss: 0.4991530478000641\n",
767 | "Step count: 8200\n",
768 | "Train loss: 0.36768782138824463\n",
769 | "Validation loss: 0.4969697594642639\n",
770 | "Step count: 8300\n",
771 | "Train loss: 0.44016486406326294\n",
772 | "Validation loss: 0.4940197467803955\n",
773 | "Step count: 8400\n",
774 | "Train loss: 0.5363975167274475\n",
775 | "Validation loss: 0.4918510913848877\n",
776 | "Step count: 8500\n",
777 | "Train loss: 0.424763023853302\n",
778 | "Validation loss: 0.48892942070961\n",
779 | "Step count: 8600\n",
780 | "Train loss: 0.4969513416290283\n",
781 | "Validation loss: 0.48722168803215027\n",
782 | "Step count: 8700\n",
783 | "Train loss: 0.37056827545166016\n",
784 | "Validation loss: 0.4848025143146515\n",
785 | "Step count: 8800\n",
786 | "Train loss: 0.391757071018219\n",
787 | "Validation loss: 0.482174813747406\n",
788 | "Step count: 8900\n",
789 | "Train loss: 0.4947183132171631\n",
790 | "Validation loss: 0.48007288575172424\n",
791 | "Step count: 9000\n",
792 | "Train loss: 0.45929282903671265\n",
793 | "Validation loss: 0.4781815707683563\n",
794 | "Step count: 9100\n",
795 | "Train loss: 0.47612375020980835\n",
796 | "Validation loss: 0.4760727882385254\n",
797 | "Step count: 9200\n",
798 | "Train loss: 0.44101282954216003\n",
799 | "Validation loss: 0.4746829867362976\n",
800 | "Step count: 9300\n",
801 | "Train loss: 0.37658315896987915\n",
802 | "Validation loss: 0.47280576825141907\n",
803 | "Step count: 9400\n",
804 | "Train loss: 0.3759828209877014\n",
805 | "Validation loss: 0.47096705436706543\n",
806 | "Step count: 9500\n",
807 | "Train loss: 0.5561549067497253\n",
808 | "Validation loss: 0.4691046476364136\n",
809 | "Step count: 9600\n",
810 | "Train loss: 0.5512958765029907\n",
811 | "Validation loss: 0.4677446782588959\n",
812 | "Step count: 9700\n",
813 | "Train loss: 0.4368234872817993\n",
814 | "Validation loss: 0.46550050377845764\n",
815 | "Step count: 9800\n",
816 | "Train loss: 0.4498073160648346\n",
817 | "Validation loss: 0.4638981521129608\n",
818 | "Step count: 9900\n",
819 | "Train loss: 0.45500627160072327\n",
820 | "Validation loss: 0.4625166654586792\n",
821 | "(5, 5)\n",
822 | "Test Accuracy: 0.819423\n"
823 | ]
824 | }
825 | ],
826 | "source": [
827 | "# @title Network Training\n",
828 | "\n",
829 | "# We train until the validation loss stops decreasing, checking every steps,\n",
830 | "# up to a maximum of 10k steps.\n",
831 | "\n",
832 | "\n",
833 | "@jax.jit\n",
834 | "def update(params, opt_state, batch_X, batch_y):\n",
835 | " grads = jax.grad(loss_fn_t.apply)(params, batch_X, batch_y)\n",
836 | " upds, new_opt_state = opt_update(grads, opt_state)\n",
837 | " new_params = optax.apply_updates(params, upds)\n",
838 | " return new_params, new_opt_state\n",
839 | "\n",
840 | "\n",
841 | "def train(columns_to_train_on, params, opt_state, update_fn):\n",
842 | " best_validation_loss = np.inf\n",
843 | " for i in range(num_training_steps):\n",
844 | " train_X, train_y = get_batch(normed_train_df, columns_to_train_on,\n",
845 | " batch_size)\n",
846 | " params, opt_state = update_fn(params, opt_state, train_X, train_y)\n",
847 | "\n",
848 | " if i % validation_interval == 0:\n",
849 | " # Run validation on the full validation dataset.\n",
850 | " validation_X, validation_y = get_batch(normed_validation_df,\n",
851 | " columns_to_train_on)\n",
852 | " train_loss = loss_fn_t.apply(params, train_X, train_y)\n",
853 | " validation_loss = loss_fn_t.apply(params, validation_X, validation_y)\n",
854 | " print(f\"Step count: {i}\")\n",
855 | " print(f\"Train loss: {train_loss}\")\n",
856 | " print(f\"Validation loss: {validation_loss}\")\n",
857 | "\n",
858 | " if validation_loss > best_validation_loss:\n",
859 | " print(\"Validation loss increased. Stopping!\")\n",
860 | " return params\n",
861 | " else:\n",
862 | " best_validation_loss = validation_loss\n",
863 | " return params\n",
864 | "\n",
865 | "\n",
866 | "trained_params = train(column_names, init_params, opt_state, update)\n",
867 | "# Print the test accuracy, i.e. the proportion of the knots for which the\n",
868 | "# network predicts the correct signature.\n",
869 | "test_X, test_y = get_batch(normed_test_df, column_names)\n",
870 | "print(trained_params[\"linear_1\"][\"w\"].shape)\n",
871 | "# The final below accuracy should be in the low 80%s.\n",
872 | "print(\"Test Accuracy: \",\n",
873 | " np.mean((predict(trained_params, test_X) - test_y) == 0))"
874 | ]
875 | },
876 | {
877 | "cell_type": "markdown",
878 | "metadata": {
879 | "id": "qj0TjRTnAmGW"
880 | },
881 | "source": [
882 | "The below cell replicates Figure 2a from the paper, though for simplicity omitting the error bars.\n",
883 | "\n",
884 | "To compute the saliency, we take the gradient of the loss function, with respect to each of the the components of the X input to the network (i.e. the geometric invariants of each knot), and average over the dataset.\n",
885 | "\n",
886 | "We plot the feature saliencies in decreasing order. The plot (should!) show that the overall loss is influenced far more by the longitudinal translation and the real and imaginary parts of the meridional translation than any of the other invariants."
887 | ]
888 | },
889 | {
890 | "cell_type": "markdown",
891 | "metadata": {},
892 | "source": [
893 | "### Saliency Analysis"
894 | ]
895 | },
896 | {
897 | "cell_type": "code",
898 | "execution_count": 11,
899 | "metadata": {
900 | "cellView": "form",
901 | "id": "j1CEbkUgxtGZ",
902 | "scrolled": true
903 | },
904 | "outputs": [
905 | {
906 | "data": {
907 | "image/png": "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IYQQQgghPlNZtqpVQkICu3fvJigoiI0bNxITE/N/7N15eIzX28Dx70RWCRFCxFJiDQ0iQkIQYt9iSVGJCkWjpGjRolXpSlVrqaW1Ndai1oZWLBWUEEvtewixRpBEbJHkef/IO/MzZrLORELvz3XNdfGc55xzz4k2c89zlowO/v/8jqpVq9K3b1/8/f2pVq2aMboUQgijkKlWQgghRN4UyK5WRYoUoV27dixZsoS4uDhWrlxJly5dMDMzQ1EULl68yBdffEHNmjXx8PDgp59+Ii4uzljdCyGEEEIIIQqxfD/H4/79+6xZs4bly5ezZ88ezcnlKpUKU1NTnj59mp/dCyFEtuSJhxBCCJE3heocDzs7OwYPHkxERARXr17lu+++o0SJEiiKQmpqan53L4QQQgghhCgETF9WRydPnmT58uX89ttvJCYmvqxuhRBCCCGEEIVAvj7xUD/hqFevHvXq1WPKlClcvXoVRVGwsrKiZ8+e+dm9eE3s3LkTPz8/ypcvj7m5OXZ2dtSsWZOePXsya9YsSWRfAyNHjkSlUmm9rKysqFChAh06dGDWrFk8ePCgoMMUQgghhAGM/sTj/v37rF69muXLl7Nv3z4URdGs6yhSpAg+Pj4EBATQo0cPbGxsjN29eM18+eWXTJw4EYBatWrh4eGBmZkZ586dY926daxZswZ3d3c8PT0LONLCJSYmBicnJ7y9vYmIiCjocLJ17NgxADp06ECZMmUAePToEVevXmXHjh1s2bKF7777jtWrV9O4ceOCDFUIIYQQeWSUxOPx48ds3LiRFStWsHXrVp49ewagSTjc3d0JCAjg7bffxsHBwRhdiv+Aw4cPExISgpmZGatXr6Zbt25a5bdu3WLZsmWUKFGiQOITxqNOPObPn0/58uW1yu7cucOoUaNYunQpnTp14tixY1SsWLEgwhRCCCGEAQxOPN555x02btzIw4cPgf8lG1WrViUgIICAgACqV69uaDfiP2jdunUoikKvXr10kg6AsmXLMnr06JcfmDCqq1evcv/+fUqVKqWTdACULl2axYsXc/36df7++28mTZrEnDlzCiBSIYQQQhjC4DUey5cvJzk5GUVRKF26NB988AH79+/nwoULhISESNIh8uzOnTtAxgfPnDh06BAqlYomTZpkes+3336LSqXSTN+KiYlBpVLRokULHj58yEcffUTFihWxsrLCzc2NsLAwTd3ff/8dDw8PrK2tcXBwYPjw4Tx+/FirfWO397zY2FiCg4OpWrUqlpaWlCxZks6dO7Nv3z6t+0JCQnBycgJg165dWusm+vfvrxNnUlISH330EU5OTpiZmdG5c+dcj6Mhjh49CkCdOnUyvUelUhEcHAzApk2bDO5TCCGEEC+fwYmHtbU1ffv25a+//uL69evMmDGDRo0aGSM28R+nnk6zdu3aHB026e7ujpubG5GRkZw6dUqnXFEUFi5ciImJCQMHDtQqS0lJoVWrVixfvhxPT088PT05duwY3bt3Z/v27UybNg1/f3+KFStGu3btSEtL46effmLQoEF6YzF2e5GRkdSrV4/Zs2djZmZGp06dcHFxITw8nObNm7Nq1SrNva6urvj5+QHg4OBAYGCg5tW0aVOtdh8/foy3tzehoaG4urri6+tLw4YN8zyOISEhWglOTqinWdWtWzfL+9SJSWxsrGY6pxBCCCFeHQZPtYqLi8PKysoYsQihJSAggEmTJhEbG0u1atXo0aMHTZs2pUGDBtStW5ciRYro1BkyZAjvvfce8+fPZ/r06VplO3bs4NKlS3To0IE33nhDqywyMhIfHx8uXbqEtbU1AKGhoQwYMID333+fu3fvEhkZibu7OwA3btygfv36rFixgq+++ooqVarkW3tJSUn4+fmRlJTEsmXLCAgI0JQdOnSItm3bMmjQIHx8fChdujTdunXD1dWVtWvX4uzsTGhoaKZjHBUVRePGjbl06ZLWWply5crlaRzzQv3EI7vEw9zcXPPnp0+fYmZmluc+nz59qnV4aVJSUp7bEkIIIUTOGPzEQ5IOkV+qVKlCWFgYFStW5MGDByxevJjBgwfj5uaGvb09Q4cO5ebNm1p1/P39KV68OEuXLtX6YAmwYMECAAYPHqzTl4mJCXPnztUkCQD9+vXD3t6eixcvMmzYME2SABkfzNUJwO7du/O1vUWLFnHz5k1GjhyplXRAxlOeCRMmkJyczLJly/SMYvZmzpyps0A/r+Nob29PzZo1cXR0zHH/OX3ikZCQAIClpaXWjnjPnj3j66+/pkqVKlhYWFC5cmUmTZqUZVuTJk3C1tZW85LF6kIIIUT+y/eTy4UwRKtWrbh48SLr1q1jyJAhuLm5YWpqSkJCAnPnzsXV1ZVz585p7ldP/bt37x5r167VXI+Pj2f9+vWULVuWLl266PRTuXJlatSooXXNxMSESpUqAdC2bVudOuqnEi8mP8Zub+vWrQD06NFDpw5As2bNgIynF7nl6OiolQCp5XUcg4ODOXv2bLYf/NUePHjApUuXKFKkCC4uLlneGx0dDWRsXPG8d955h19++YXx48cTHh7OxIkTUalUWbY1btw4EhMTNa/Y2NgcxSuEEEKIvDPqOR7Hjh1jz549XLp0iQcPHpCWlpbl/SqVioULFxozBPEaMjc3p3v37nTv3h3I+OZ75cqVjB8/nri4OIKDg9m2bZvm/iFDhjBnzhzmz5+Pv78/AEuWLCElJYUBAwZgaqr7z17fbkqA5pt1feXqshefCBi7vZiYGAC8vLz0tqkWHx+fZbk+WU2Vyss45tbx48dRFIVq1apl+/R07969QEYyqrZ582bWrVvH8ePHcXZ2BqBFixbZ9mthYYGFhUXeAxdCCCFErhkl8Th37hzvvvsu+/fvz3EdRVEk8RB5UqJECYYMGUK5cuXo2rUrO3fu5NGjRxQtWhTIWITcpEkTIiIiuHDhAtWrV2fhwoWoVKpMF2+bmGT98C+78vxsLz09HYC33npLa+rWi9QfvHPD0tIy07K8jGNu5XR9R0pKimYqWa9evTTXQ0ND8fHxydN7F0IIIcTLZXDicf36dZo3b058fLzmDA8bGxvs7Oxy/WFNiNzw8fEBIC0tjYSEBE3iARnf1u/bt48FCxbg6+vL6dOnad26tc4i8FdBhQoVOHfuHGPHjqVBgwYvte/8Hsecru/4/vvvuX37Nl5eXlpPfqKiovD19WXo0KEsWbIElUqFr68vs2bNws7OzigxCiGEEMI4DE48vvnmG+7cuaP5FnT06NE6c9uFyAv1U7HMXLx4EciYimVvb69V1rNnTz788ENCQ0O5du0aoH8x9KugTZs27Nixg/Xr1+c48VDvAJWammpQ3/k9jjl54rF27VpCQkKwsrLi559/1iq7deuWZivgNWvWEB8fz6hRoxgwYAAbNmwwWpxCCCGEMJzBjyS2bNmCSqWiX79+zJs3T5IOYTQTJkxgzJgxmkXFz7t+/TpBQUEA+Pr6am21ChlTiAIDA4mLi2PFihWabWZfRUFBQZQpU4YpU6Ywb948zdQrtdTUVMLDwzl58qTmmr29PWZmZkRHR2e71ioruR3HWbNm4ezszLhx47JtOy0tTROzvsTj2rVrBAcH06tXL4oUKcLixYt1FqCnp6ejKAobNmygffv29O3bl9mzZ7Nx40YuXLiQuzcrhBBCiHxl8BOPGzduABlbhQphTMnJycyYMYOpU6dSo0YNateujaWlJdeuXePAgQM8e/aMatWq6ZwzoRYUFMS0adNQFIXAwECd5ORVUaJECTZu3EiXLl0ICgri66+/xsXFBTs7O27dusWRI0dISEhg/fr1mg/m5ubmtG/fnrCwMOrVq4ebmxvm5uZ4eXkxYMCAXPWfm3GMj4/n3Llzenf6etH58+c1J7WHhIQAGU+5EhISuHTpklZSMnfuXL0nqdvZ2VG1alVKlSqluaZeXH7mzBmqV6+e07cphBBCiHxmcOJhZ2dHXFyczjkAQhjqs88+w93dnfDwcM2OaYmJiRQvXpxGjRrRtWtXhg4dmumC6xo1alChQgViY2ONthi6oHh6enLixAmmTZvG5s2b2bVrF5CxHa63tzfdu3endevWWnUWLFjA6NGj2bZtGytWrCAtLY3U1NRcJx75NY7q9R0AixcvBjKesNjZ2VGuXDk++OADOnToQPv27TOdclerVi29u4pB7jcEEEIIIUT+UinqFeF51KVLF/78809WrFhB7969jRWXEAaLjIykSZMmeHt7ExERUdDhvLIK8zh+9913fPnll1y5ckWzzmf16tW8/fbbXLp0icqVK+eonaSkJGxtbXEYthQTi6LZV8ilGz/oP4NFCCGEeNWpf4eqvxzOisFfCQ4fPhxFUZg3b56hTQlhVN988w2QcaidyLvCPI5BQUGUKFGCrl27smnTJkJDQwkODqZv3745TjqEEEII8XIYnHi0adOGTz75hJ07d/L+++/z7NkzY8QlRJ7s27ePgQMH4uHhwebNm3Fzc8v0xG+RuVdlHEuUKMHff/9N0aJF6dWrF6NHj+att97S2f1KCCGEEAXP4DUeS5YsoVatWjRp0oR58+YRFhbGW2+9hbOzs9a5CpmRRenCmM6fP8+iRYsoVqwYnTp1Yvbs2TLXPw9epXGsWbOm1sn1QgghhCicDF7jYWJikuVZC1l2rlIZfM6AEEIYStZ4CCGEEHmTmzUeBj/xADAwdxFCiELh/Le+2f5PUwghhBB5Y3DicfnyZWPEIYQQQgghhHiNGZx4VKpUyRhxCCGEEEIIIV5jhXO1qBBCCCGEEOK1IomHEEIIIYQQIt9J4iGEEEIIIYTIdzle4+Hj4wNkbIG7Y8cOnet58WJbQgghhBBCiNdTjs/xUB8eplKpSEtL07quUqlytaWu+v4X2xJCiIKQX+d4yPkdQgghXnf5co5H8+bN9R4UmNl1IYQQQgghhFDLceIRERGRq+tCCCGEEEIIoSaLy4UQQgghhBD5ThIPIYQQQgghRL6TxEMIIYQQQgiR7yTxEEIIIYQQQuQ7STxEgVCpVLl6Va5cucBiDQ0NRaVSERISUmAxZObFcTIzM8Pe3p46derQv39/1q5dS2pqakGHKYQQQgiR812thDCmwMBAnWv//PMP0dHR1KtXD1dXV60ye3v7lxTZq0k9nunp6SQmJnL+/HmWLFnC4sWLqVatGsuXL6dRo0YFHKUQQggh/ssk8RAFIjQ0VOda//79iY6Oplu3boXq6UL37t3x9PQs1MmPvvGMjo5m/PjxrF69mpYtW7J3716dhE4IIYQQ4mWRqVZCZMPW1hZnZ+dCnXjoU7VqVVatWsXAgQN59OgR7777bkGHJIQQQoj/MEk8xCvh7t27jBkzhurVq2NpaUnJkiVp3749W7du1Xu/el1ISkoKX375Jc7OzlhYWNCtWzfNPX/++Sdt2rShfPnyWFhYUK5cOZo2bcoXX3yh1VZWazwePXrEV199hYuLC1ZWVtja2tK8eXNWrlypN67KlSujUqkAWLBgAXXr1sXKyoqyZcsSFBREQkJCnsYnKz/88APW1tb8+++//PPPPzrlsbGxBAcHU7VqVc3Ydu7cmX379ultT1EU5s2bR7169TSxDxw4kLi4OPr3749KpdI5WDQnP49Hjx4xadIk6tevj42NDTY2Nnh6erJ48eJM39u9e/cYN24ctWvX1oy/j48PmzZtytNYCSGEECL/SOIhCr3r16/TqFEjpk6dSkpKCt26daN+/fps376ddu3aMW3aNL310tPT6datG1OmTKFq1ap07doVR0dHAGbPnk2nTp3YuXMn1apVw8/PDxcXF65cuZLjaV4PHjygefPmfP7558TFxdG5c2e8vLyIioqiT58+jBgxItO6H3/8McOGDcPR0ZEOHTpoPsz7+vqiKEquxygrtra2dOjQAYCdO3dqlUVGRlKvXj1mz56NmZkZnTp1wsXFhfDwcJo3b86qVat02vvoo48ICgri7NmzeHt74+3tzZ9//omHhwf379/PNI6sfh5xcXE0btyY8ePHc+vWLby9vWnevDlnz56lf//+fPDBBzrtnT9/HldXVyZPnszjx49p164d7u7uHDhwgC5dujB16lRDhk0IIYQQRiZrPEShN2TIEC5duoS/vz+//vor5ubmQMZi9Hbt2jFmzBhatmyps34hNjYWCwsLzp07R/ny5bXKpkyZgkqlYv/+/bi7u2uuK4rCrl27chTX+PHjOXz4MC1btmTjxo0UK1YMQPOBfObMmbRp04bOnTvr1F26dCnHjx+nZs2aAMTHx9O4cWP27NnDzp078fHxyfH45ISrqytr1qzhzJkzmmtJSUn4+fmRlJTEsmXLCAgI0JQdOnSItm3bMmjQIHx8fChdujSQMebTp0+nZMmS7Nq1CxcXFyDjaUWPHj34448/Mo0hq5/HgAEDOH78OCNGjOC7777DwsICgNu3b9O5c2dmzZpFp06daN++PQBpaWm89dZbxMbGMmXKFEaNGoWJScb3KBcvXqRt27aMHTuW9u3ba2IUQgghRMGSJx6iULt06RKbNm3CxsaGn376SZN0ADRt2pQhQ4aQlpbG7Nmz9dafNGmSzodcgDt37lCiRAmtpAMypgS1aNEi27gePnzIwoULMTExYc6cOZqkA8DZ2ZnPPvsMgBkzZuit/9VXX2mSDsjYtWvIkCEA7N69O9v+c0u9PuX5JxKLFi3i5s2bjBw5UivpAHB3d2fChAkkJyezbNkyzfWff/4ZgA8//FDrA33RokWZOXOm5sN/ZvT9PI4ePcqff/5Jw4YN+fHHHzVJB4CDgwPz5s0DYO7cuZrrYWFhnDhxAj8/P8aMGaPVb7Vq1fjhhx9IS0tj/vz5euN4+vQpSUlJWi8hhBBC5C+DE499+/ZRpEgRrKysuH79erb3X79+HUtLS0xNTTl8+LCh3YvXnHpNQvv27SlZsqRO+TvvvAPAnj17dMpUKhVdunTR226DBg24f/8+AwcO5NSpU7mO6/Dhwzx+/Bg3NzecnZ0zjWvv3r2kp6frlLdt21bnWo0aNQC4efNmruPJjnr6lnp9CaBZH9OjRw+9dZo1awZAVFSU5trevXsB6Nmzp879NWrUyHLXrMx+Huo4unXrpjdxUa/5eD6OvMT+vEmTJmFra6t5VaxYMdO4hRBCCGEcBiceK1euRFEUOnfurPeb5ReVL1+eLl26kJ6ezooVKwztXrzmbty4AZDpAYLq6/qS3jJlymh9e/682bNn4+TkxKJFi3BxcaFs2bL07t2bVatWkZaWZnBcJUqUwNbWlsePH+td91ChQgWda+qnJk+fPs22/9yKj48H0EreYmJiAPDy8tJ7aGPDhg216sL/kqLMPqi/8cYbmcaQ2c9DHcenn36a6QGSycnJWnGo6wQEBOi9Xz017Pk6zxs3bhyJiYmaV2xsbKZxCyGEEMI4DF7j8c8//6BSqTSLV3OiU6dOrF27Nl+mlIj/lue/wX+RpaVlpmV169bl9OnTbNmyhT///JOIiAhWr17N6tWrady4MREREVrTuowdW3ZTkozt33//BaB27dqaa+onMW+99RbW1taZ1tX3RCcvMvt5qONo2rQpVatWzVFb6jrt27fHwcEh0/sy2wLZwsIi06RUCCGEEPnD4MQjOjoa0P5Akx31B5mLFy8a2r14zZUrVw6AK1eu6C1Xf/Odk6dtL7K0tKRbt26aLV1PnTqFv78/kZGRLFiwgKFDh+Y5rsTERBISErCyssLOzi7XsRlTYmIi4eHhALRs2VJzvUKFCpw7d46xY8fSoEGDHLXl6OhITEwMsbGxWmtU1PLy5ED99Kdbt26MGjUqV3UGDRqEn59frvsUQgghxMtn8NeuT548AbL+dvlF6m8aHz58aGj34jXXtGlTALZs2aL3jAv1wmf1nH5DvPnmmwwbNgyAkydPZnlvgwYNsLKy4vDhw1y4cCHTuLy8vF76040XjRo1iocPH9KwYUMaN26sud6mTRsA1q9fn+O2vLy8AFi7dq1O2cWLFzVPVnIjL3HkpY4QQgghCpbBn4jUc8avXr2a4zrXrl0DMubBC5GVKlWq0KlTJx48eMCIESN49uyZpiwyMpK5c+dSpEgRTcKQE48ePWLmzJk6iUx6ejpbtmwBMl/DoGZtbc27775Leno6w4YN00qiz58/z9dffw3A8OHDcxyXsV26dInevXuzcOFCrK2tWbhwoVZ5UFAQZcqUYcqUKcybN09nEXxqairh4eFaSVhQUBAAP/74I6dPn9Zcf/z4McOHD9e7kD47Hh4etGnThr179zJs2DC9O0wdO3ZM87MB8PPzo3bt2ixfvpyvvvpKZ12Moijs3btXsxheCCGEEAXP4KlWtWvXJi4ujj/++ANfX98c1dmwYQOA3qkaQrzol19+oVmzZixZsoRdu3bRuHFj7ty5Q0REBGlpafzwww9Z7qb0opSUFEaMGMHo0aNp0KCB5kTtgwcPEhsbS+XKlXnvvfeybWfSpEns37+fbdu2UaVKFby9vXn48CF///03T548Yfjw4ZnuqmVs/fv3BzKSp6SkJM6fP8/Zs2dRFIXq1auzYsUK6tSpo1WnRIkSbNy4kS5duhAUFMTXX3+Ni4sLdnZ23Lp1iyNHjpCQkMD69es1W+c2a9aMkSNHMn36dNzc3GjZsiXFixdnz549mJub06VLF8LCwnK9PmbZsmW0b9+eOXPmsGLFClxdXSlXrhyJiYkcP36c2NhYRowYoTnHw9TUlA0bNtCuXTs+//xzZs2aRd26dSlTpgzx8fEcPXqUuLg4pk2bpnlKI4QQQoiCZXDi0bFjR3bu3MmSJUsIDAzMdsrL7t27Wbp0KSqVSu/BakK8qHz58hw8eJBJkyaxYcMG1q1bR9GiRWnVqhWjRo3SuzVtVmxsbJg9ezY7duzg2LFjHD9+HHNzc9544w0GDRpEcHCw3q17X1SsWDF27drFDz/8wKpVq/jjjz8wNzfH3d2doUOH0qdPn7y+5VxbvHgxkPGBvHjx4pQrV45+/frRtWtXfH19KVKkiN56np6enDhxgmnTprF582bN4YmOjo54e3vTvXt3WrdurVXnxx9/xNnZmdmzZ7Nz507NyeiTJ0/WbCNcqlSpXMVfpkwZ9u3bx/z581m5ciX//vsv+/btw8HBgSpVqjB8+HDefvttrTrVq1fn33//ZdasWaxbt479+/eTmppK2bJlqV+/Pr6+vvTq1StXcQghhBAi/6gU9Qb/eZScnEyVKlW4e/cuRYsWZdKkSQwaNEhnzceTJ0+YN28en376KQ8fPqRkyZJcunSJ4sWLG/QGhBCFQ3JyMk5OTjx58oSEhIRMk53CKCkpCVtbWxyGLcXEoqjR2r3xg/5zRoQQQojXhfp3aGJiYraf6w1+4mFjY8OKFSvo2LEjjx49YsSIEYwfP54GDRrg6OgIZOz9f+jQIR49eoSiKJiamvLbb79J0iHEK+jMmTNUqlSJokX/9wE9KSmJIUOGEB8fz6BBg16ppEMIIYQQL4fBiQdA69atCQ8P55133uHGjRskJyfrnNGhfrBSvnx5li5dSosWLYzRtRDiJZsxYwbLli3TfLkQHx/Pv//+y71796hSpQrffvttQYcohBBCiELIKIkHZJwPEB0dzZIlS9i0aRP//vuv5tRge3t73Nzc6NKlC3379pWDu4R4hfXo0YNbt25x+PBhoqKiAHBycmLQoEF8/PHHuV7fIYQQQoj/BoPXeAghxKtO1ngIIYQQeZObNR4Fe7KZEEIIIYQQ4j/BaFOthBDiVXf+W1/Z9EIIIYTIJ/LEQwghhBBCCJHvcvzEo0qVKgCoVCqio6N1rufFi20JIYQQQgghXk85TjxiYmKAjGRB3/W8eLEtIYQQQgghxOspx4lHYGBgrq4LIYQQQgghhJpspyuE+M/LzVaAQgghhPgf2U5XCCGEEEIIUagYvJ3uu+++C0CHDh3o2bOnwQEJIYQQQgghXj8GJx6LFy8GoHfv3gYHI4QQBanG+D+MdnK5nFouhBBCaDN4qlXp0qUBcHBwMDgYIYQQQgghxOvJ4MSjdu3aAFy5csXgYIQQQgghhBCvJ4MTj759+6IoimbKlRBCCCGEEEK8yODEY8CAAbRq1YqNGzcSEhKC7M4rhBBCCCGEeJHBi8v37NnD6NGjuXPnDl999RWrVq2id+/e1K1bFzs7O4oUKZJl/ebNmxsaghBCCCGEEKKQMzjxaNGiBSqVSvP38+fP89VXX+WorkqlIjU11dAQhBBCCCGEEIWcUQ4QVBQlzy8hsrNz5078/PwoX7485ubm2NnZUbNmTXr27MmsWbNITEws6BCFgUaOHIlKpdJ6WVlZUaFCBTp06MCsWbN48OBBQYcphBBCCAMY/MRj586dxohDCL2+/PJLJk6cCECtWrXw8PDAzMyMc+fOsW7dOtasWYO7uzuenp4FHGnhEhMTg5OTE97e3kRERBR0ONk6duwYkHEQaZkyZQB49OgRV69eZceOHWzZsoXvvvuO1atX07hx44IMVQghhBB5ZHDi4e3tbYw4hNBx+PBhQkJCMDMzY/Xq1XTr1k2r/NatWyxbtowSJUoUSHzCeNSJx/z58ylfvrxW2Z07dxg1ahRLly6lU6dOHDt2jIoVKxZEmEIIIYQwgFGmWgmRH9atW4eiKPTq1Usn6QAoW7Yso0ePxtnZ+eUHJ4zm6tWr3L9/n1KlSukkHZBxSOnixYvx8fHh/v37TJo0qQCiFEIIIYShDE483n33XQYOHMjNmzdzXOfOnTuaekJk5s6dO0DGB8+cOHToECqViiZNmmR6z7fffotKpdJM34qJiUGlUtGiRQsePnzIRx99RMWKFbGyssLNzY2wsDBN3d9//x0PDw+sra1xcHBg+PDhPH78WKt9Y7f3vNjYWIKDg6latSqWlpaULFmSzp07s2/fPq37QkJCcHJyAmDXrl1a6yb69++vE2dSUhIfffQRTk5OmJmZ0blz51yPoyGOHj0KQJ06dTK9R6VSERwcDMCmTZsM7lMIIYQQL5/BiUdoaCihoaHcv38/x3WSkpI09YTIjHo6zdq1a4mLi8v2fnd3d9zc3IiMjOTUqVM65YqisHDhQkxMTHSS3pSUFFq1asXy5cvx9PTE09OTY8eO0b17d7Zv3860adPw9/enWLFitGvXjrS0NH766ScGDRqkNxZjtxcZGUm9evWYPXs2ZmZmdOrUCRcXF8LDw2nevDmrVq3S3Ovq6oqfnx8ADg4OBAYGal5NmzbVavfx48d4e3sTGhqKq6srvr6+NGzYMM/jGBISopXg5IR6mlXdunWzvE+dmMTGxvLs2bMcty+EEEKIwsHgNR5C5JeAgAAmTZpEbGws1apVo0ePHjRt2pQGDRpQt25dvWfEDBkyhPfee4/58+czffp0rbIdO3Zw6dIlOnTowBtvvKFVFhkZiY+PD5cuXcLa2hrISKoHDBjA+++/z927d4mMjMTd3R2AGzduUL9+fVasWMFXX31FlSpV8q29pKQk/Pz8SEpKYtmyZQQEBGjKDh06RNu2bRk0aBA+Pj6ULl2abt264erqytq1a3F2ds4ywY+KiqJx48ZcunRJa61MuXLl8jSOeaF+4pFd4mFubq7589OnTzEzM8tzn0+fPuXp06eavyclJeW5LSGEEELkTIGs8Xjy5AkAFhYWBdG9eEVUqVKFsLAwKlasyIMHD1i8eDGDBw/Gzc0Ne3t7hg4dqjPFz9/fn+LFi7N06VKtD5YACxYsAGDw4ME6fZmYmDB37lxNkgDQr18/7O3tuXjxIsOGDdMkCZDxwVydAOzevTtf21u0aBE3b95k5MiRWkkHZDzlmTBhAsnJySxbtkzPKGZv5syZOgv08zqO9vb21KxZE0dHxxz3n9MnHgkJCQBYWlpiY2OjU37ixAlMTU2pUKFCtn1OmjQJW1tbzUsWqwshhBD5r0ASj7179wIZ00CEyEqrVq24ePEi69atY8iQIbi5uWFqakpCQgJz587F1dWVc+fOae63tramb9++3Lt3j7Vr12qux8fHs379esqWLUuXLl10+qlcuTI1atTQumZiYkKlSpUAaNu2rU4d9VMJfeubjNne1q1bAejRo4dOHYBmzZoBGU8vcsvR0VErAVLL6zgGBwdz9uzZHC8Af/DgAZcuXaJIkSK4uLhkeW90dDQAVatW1Vs+cuRISpUqlaN+x40bR2JiouYVGxubo3pCCCGEyLtcT7X68ssv9V6fM2eOZv/9zDx9+pTo6Gj++OMPVCoVXl5eue1e/AeZm5vTvXt3unfvDmR8871y5UrGjx9PXFwcwcHBbNu2TXP/kCFDmDNnDvPnz8ff3x+AJUuWkJKSwoABAzA11f1nr283JUDzzbq+cnXZi08EjN1eTEwMQLb/vcTHx2dZrk9WU6XyMo65dfz4cRRFoVq1alhZWWV5r/oLi1atWumUbdiwgUuXLvHuu++ydOnSbPu1sLCQJ65CCCHES5brTw7qxaPPUxSFuXPn5rgNRVGwtLRkzJgxue1eCEqUKMGQIUMoV64cXbt2ZefOnTx69IiiRYsCGYuQmzRpQkREBBcuXKB69eosXLgQlUqV6eJtE5OsH/5lV56f7aWnpwPw1ltvaU3delFethW2tLTMtCwv45hbOV3fkZKSoplK1qtXL52y0aNHM3nyZM6cOWOUuIQQQghhfHn6ylJRFM2f1UnI89cyY2lpiaOjI02aNGH06NHUq1cvL90LAYCPjw8AaWlpJCQkaBIPyPi2ft++fSxYsABfX19Onz5N69atdRaBvwoqVKjAuXPnGDt2LA0aNHipfef3OOZ0fcf333/P7du38fLy0nnyM336dEqXLk3v3r0JCQkxSlxCCCGEML5cJx7qb1/VTExMUKlUnDx5ktq1axstMCEURdF5uva8ixcvAhlTsezt7bXKevbsyYcffkhoaCjXrl0D9C+GfhW0adOGHTt2sH79+hwnHuodoFJTUw3qO7/HMSdPPNauXUtISAhWVlb8/PPPWmW3b9/mm2++YcuWLUaLSQghhBD5w+DF5W+88QZvvPGG1laXQhjDhAkTGDNmjGZR8fOuX79OUFAQAL6+vjr//iwtLQkMDCQuLo4VK1Zotpl9FQUFBVGmTBmmTJnCvHnzdJL/1NRUwsPDOXnypOaavb09ZmZmREdHk5aWlue+czuOs2bNwtnZmXHjxmXbdlpamiZmfYnHtWvXCA4OplevXhQpUoTFixfrLEAfP3487du3p3Hjxrl7Y0IIIYR46QxeHape+CqEsSUnJzNjxgymTp1KjRo1qF27NpaWlly7do0DBw7w7NkzqlWrpnPOhFpQUBDTpk1DURQCAwNf2eS4RIkSbNy4kS5duhAUFMTXX3+Ni4sLdnZ23Lp1iyNHjpCQkMD69es1H8zNzc1p3749YWFh1KtXDzc3N8zNzfHy8mLAgAG56j834xgfH8+5c+f07vT1ovPnz2tOaldPkVIUhYSEBC5duqSVlMydO1fnJPWTJ0+ybNky9u/fr9lq98mTJ5o2ihYt+sr+zIUQQojXkRwgKAqtzz77DHd3d8LDwzl27Bh79uwhMTGR4sWL06hRI7p27crQoUMzXXBdo0YNKlSoQGxsrNEWQxcUT09PTpw4wbRp09i8eTO7du0CMrbD9fb2pnv37rRu3VqrzoIFCxg9ejTbtm1jxYoVpKWlkZqamuvEI7/GUb2+A2Dx4sVAxhMWOzs7ypUrxwcffECHDh1o37693il3Fy9eJCUlBTc3N50yOzs75s6dy5AhQ4wWrxBCCCEMo1Jysio8hy5cuMCSJUuIjIzk1q1bPH78mPDwcKpVq6a55+TJk1y9ehVra2u8vb2N1bUQOiIjI2nSpAne3t5EREQUdDivrMI6jvHx8VrTyyDjdPjNmzfz+++/U6NGDcqVK5ejtpKSkrC1tcVh2FJMLIpmXyEHbvyg/9wVIYQQ4nWi/h2q/nI4K0Z54pGens7HH3/MjBkzSE9P1+xwpVKpSElJ0br36tWrdO7cGVNTUy5fvpzpeQdCGOqbb74BMg61E3lXWMfR3t6eFi1aaF2LiIjAwsJC57oQQgghCp5RTi5XzwFPS0ujXLlyvPXWW5ne27FjR5ycnEhLS2PNmjXG6F4IjX379jFw4EA8PDzYvHkzbm5umZ74LTIn4yiEEEIIYzM48dixYwcLFy4EMnaYiYmJYfXq1VnW6dmzJ4qi8PfffxvavRBazp8/z6JFizhz5gydOnVi3bp1uT78T7y64xgSEqLZ9lcIIYQQhYvBU63mzZsHZDzJ+Prrr3NUp1GjRgCcOnXK0O6F0NK/f3/69+9f0GG88mQchRBCCGFsBn+FGRkZiUqlYuDAgTmuU6FCBQBu3bplaPdCCCGEEEKIV4DBTzzi4uIAqFy5co7rmJmZAYafqiyEEMZ0/lvfbHfkEEIIIUTeGPzEQ32Gwp07d3JcRz0Hu2TJkoZ2L4QQQgghhHgFGJx4VKlSBYDTp0/nuM5ff/0FwJtvvmlo90IIIYQQQohXgMGJR9u2bVEUhdmzZ5Oenp7t/adPnyY0NBSVSkXHjh0N7V4IIYQQQgjxCjA48Rg+fDjW1tZER0czZMiQLNdtbNu2jbZt2/LkyRNKlizJ4MGDDe1eCCGEEEII8QoweHG5g4MDP//8M/369WPhwoWEh4fTqVMnTfmMGTNQFIW9e/dy9uxZFEXBxMSE0NBQbGxsDO1eCCGEEEII8QpQKYqiGKOh1atXExQURGJiIiqVSqdc3Y2NjQ2LFy+me/fuxuhWCCEMlpSUhK2tLYmJibKrlRBCCJELufkdarTEA+Du3bvMmTOHsLAwjh49qjXt6s0338TX15cRI0ZQpkwZY3UphBAGU/9P02HYUkwsiua6/o0feuRDVEIIIUThV2CJx/PS09O5d+8eaWlplCxZUnN2hxBCFDaSeAghhBB5k5vEw+A1HpkxMTHB3t4+v5oXQgghhBBCvEIM3tVKCCGEEEIIIbIjiYcQQgghhBAi3xkt8Thz5gwffvgh7u7umjUdRYoUyfJlappvM72EEEIIIYQQhYhRPvlPnjyZzz//nLS0NPJprboQQgghhBDiFWZw4vH7778zfvx4IGNBebNmzahXrx4lSpTAxERmchWEF89RUalUFCtWjFq1avH2228zbNgwo+4ydvHiRWrXrs2IESP4/vvvtcqSkpKYNm0aGzdu5MKFC6SkpFC6dGkqVqyIl5cXvr6+NG/eXHN/aGgoAwYMYOLEiYSEhBgtRpEz/fv3Z/HixezcuZMWLVq8lD5jYmJwcnLC29ubiIiIPLWhKApubm6kpqZy7Ngx+X+PEEIIUQgZnHjMmDEDgPLly/Pnn39Sp04dg4MSxhEYGAhAWloaMTEx7Nu3jwMHDrBp0ya2bNlitKlu48aNw9zcnI8//ljr+tWrV/H29iYmJgZra2s8PDxwcHDg3r17HDp0iP3793Py5EmtxKMwqVy5MleuXJGneK8AlUrF559/To8ePQgNDeXdd98t6JCEEEII8QKDP3keP34clUrFV199JUlHIRMaGqr19wMHDtCiRQt27NjBypUr6du3r8F9HDlyhDVr1jB8+HBKly6tVRYcHExMTAzt2rVjxYoVlCxZUlOWnp5OREQEx48fNzgG8WorX748Z86coWjR3J+f8bxu3brh7OzM559/Tr9+/WQNmRBCCFHIGDwfQT1lx9XV1dCmRD7z8PCgf//+AISHhxulzblz5wLQr18/reuPHz/mr7/+AmDWrFlaSQdkTMvz8fFh5MiRRolDvLrMzMxwdnbmjTfeMKgdlUpFQEAA169f548//jBSdEIIIYQwFoMTjxo1agBw9+5dg4MR+e/NN98EIC4uTqdMURR+++03fHx8sLOzw9LSklq1ahESEsKjR4907k9OTmblypVUr16dBg0aaJXdv3+f1NRUAJ0nITl19epV/P39KV26NFZWVri7uxMWFpbp/X/++Sdt2rTRxF6zZk3Gjh1LQkKCzr0hISGoVCpCQ0OJioqic+fOlCpVCpVKxfTp01GpVFy5cgXI+ECrflWuXDnH8a9btw5PT0+KFi2Kvb09PXv25OLFi1p9v+jRo0dMmjSJ+vXrY2Njg42NDZ6enixevDjTfk6fPk1AQACOjo6Ym5tTvnx5+vXrx7lz5zKts2jRIlxdXbGysqJs2bL079+fW7duZfl+7t27x7hx46hduzZWVlbY2tri4+PDpk2b9N5/8uRJ+vbtS5UqVbC0tKR06dK4uroycuRIbt68qbkvJiYGlUqV6ZqSAwcO8Pbbb1O+fHksLCxwdHSkVatWzJ8/X+def39/AL1lQgghhChYBicegYGBKIrChg0bjBCOyG8PHjwAoEyZMlrX09PTCQgIwN/fn4MHD+Lq6krHjh15+PAhX3zxBS1btuTx48dadXbt2kVycrLeD4z29vZYWloCMGfOnFzHGRMTQ8OGDYmKiqJVq1bUr1+fw4cP061bN7Zu3apz/6RJk+jUqRMRERE0aNCAbt268ejRI7777js8PDy4ffu23n52795N06ZNiYmJoW3btjRv3hwfHx8CAwOxtrYGMv6Nq19vvfVWjuKfMWMGfn5+HDx4EA8PD9q0acPhw4dp1KgRly9f1lsnLi6Oxo0bM378eG7duoW3tzfNmzfn7Nmz9O/fnw8++ECnzo4dO3B3d2fFihU4Ojri5+dHmTJlWLp0Ke7u7uzZs0enztixYxk4cCCnT5+mefPmNG/enL/++gsPDw/u3bunN7bz58/j6urK5MmTefz4Me3atcPd3Z0DBw7QpUsXpk6dqnX/4cOHadiwIcuXL6dYsWJ07doVT09Pnj17xowZM7JMil4cxyZNmrBq1SocHR3p0aMHLi4unDx5kjFjxujcX6VKFSpWrMjff/+t8+9VCCGEEAVMMVBKSorSvHlzxdzcXPnjjz8MbU4YAaBk9qNt3ry5AijLli3Tuj5lyhQFUFq0aKHcvHlTc/3p06fKwIEDFUD55JNPtOp88sknCqDMmzdPb19BQUGaWNzd3ZWQkBBl8+bNSlxcXKax//rrr5o6o0aNUtLS0jRl06ZNUwClWbNmWnWioqIUExMTxcbGRtm/f7/m+pMnT5SePXsqgOLn56dVZ+LEiZp+vvvuO72xVKpUKdNxzEp0dLRibm6umJubK3///bfm+rNnz5QBAwZo+v3111+16nXs2FEBlBEjRihPnjzRXL9165bi7u6uAMpff/2luZ6cnKw4ODgogDJr1iyttn788UcFUCpUqKA8fvxYcz0yMlJRqVSKra2tcuTIEc31Bw8eKD4+PprYdu7cqSlLTU1V6tSpowDKlClTtH4mFy5cUJycnJQiRYooJ06c0Fzv16+fAihTp07VGZ8zZ84oN27c0Pz98uXLCqB4e3tr3bdr1y5FpVIpxYoVU7Zv365V9uzZM2Xz5s06bSuKovj5+SmA1ti/6MmTJ0piYqLmFRsbqwCKw7CliuNHa3P9EkIIIf6rEhMTFUBJTEzM9l6DEw9FUZT79+8rvr6+SpEiRRR/f39l48aNypkzZ5QrV65k+xLG92LikZaWply8eFEZMmSIAihdu3ZVnj17pil/9uyZYm9vr1hbWyu3bt3Sae/Ro0dK2bJlFTs7O60PnR06dFAAZdeuXXrjePTokTJgwABFpVJpYgIUlUqlNGrUSFm5cqVOHXXi4eTkpDx9+lSr7NmzZ4qdnZ1iZmamVab+kDtu3Did9m7fvq1YWVkpJiYmytWrVzXX1YlHnTp1lPT0dL3x5zXx+PTTTxVAGThwoE7Z/fv3FRsbG53E499//1UApWHDhlpjrHbkyBEFUHx9fTXXFi1apABK48aN9cbRoEEDnSRTPVaff/65zv2nTp3S/KyeTzzWr1+vN3lTW7dunQIow4cP11xT/9s4evSo3jrPyyzxULcxefLkbNt4nnr8f/zxx0zveT7xfP4liYcQQgiRO7lJPIyy2X2JEiUYPnw4pUqVYuXKlXTv3p0333wTJyenLF9VqlQxRvciE+p1CUWKFKFatWr8/PPPDB48mPXr12vt+HPkyBHi4+Np0qQJDg4OOu1YWVnRoEED7t+/z4ULFzTX1etE7Ozs9PZvZWXFokWLOH/+PJMnT6Zz5844ODigKApRUVG8/fbbjBgxQm/dFi1aYG5urnXN1NQUJycnnj17prWmSD2dKCAgQKedMmXK0LZtW9LT09m7d69OeefOnXXOPTGUup+ePXvqlJUoUYK2bdvqXFdPH+vWrZveMyjUaz6ioqI017J634Bm17Lnp1up//z222/r3F+7dm3q1auXaWw9evTQ20+zZs0AtGJTr/kZNmwYERERmvU+OZWamqo50+O9997LVV31RgZ37tzJ9J5x48aRmJioecXGxuaqDyGEEELknlESj5EjR9K2bVvi4+NRMp6i5Pgl8o96XULv3r1xdnYGMhbdvrhQOSYmBoBt27ZpLaR+/rV582YA4uPjNfUSExMBKFasWJZxVKtWjU8++YSwsDBu3brF4cOH6dKlCwAzZ87UmxBUqFBBb1vqvp4+faq5duPGDYBMF36rr1+/fl2nzNCdlPRRL5yuWLGi3nJ9fap/Bp9++mmmP4Pk5GSt8c/L+1bXqVSpUpZ19MUWEBCgNy715gHPxzZmzBhatGjB3r17admyJXZ2drRt25YZM2Zo/t1k5e7duzx+/JiSJUtmmthmpnjx4gB6NxVQs7CwoHjx4lovIYQQQuQvgze6X7ZsGTNnzgQyPhR2795dTi4vJF7cNen777/n448/ZtiwYbRs2VLz4TM9PR3ISBC8vLyybLNUqVKaP9va2gL/W7CeU25ubmzYsAEPDw8OHTrE5s2bdfo15r+drJ5oqBfAFzT1z6Bp06ZUrVrVKG0a60mOOrb27dvrfSKmZm9vr/lz8eLF+fvvv9m7dy9hYWFERETw999/s23bNiZNmsSePXuoXr26UeJ7kTqxKVGiRL60L4QQQoi8MTjx+OmnnwBwdnZm586dWX4wEQVrzJgxbN++na1bt/LFF1+waNEi4H9PF5ydnfVu8ZoZ9c5Yme2ElBUTExO8vb05dOiQ1jfleVGuXDkuX77MlStXqF27tk65+hv78uXLG9RPTjk6OnLu3DliY2P1xqNvWo/6Z9CtWzdGjRqVo37KlSsHoNn290X63rejoyMxMTFcuXKFWrVq6dTR15Y6tkGDBuHn55ej2CAj8WnatClNmzYFMqbmjRw5kt9++41PP/2U1atXZ1rX3t4eKysr7t27R0JCQq6SiPv37wN538ZZCCGEEPnD4K+Vz549i0qlIiQkRJKOV8DkyZMBWLp0qeZDZsOGDbG1tWXXrl25SiLU6wFyujXqiy5evAgYnhCo1xj89ttvOmV37twhPDwclUqV7dOcF6nXmOR2fYK6n7Vr1+qUJSYm6t0OuE2bNgCsX78+x/1k9b4h42nk8/c9/2d9H/rPnj3L0aNHjRKbPmXKlCEkJATIOOMjK0WKFNFs0zxv3rxc9XPmzBlADjUVQgghChujnVyuPkhQFG7169enW7dupKamMmXKFCBjvvvHH3/MgwcP6NGjB5cuXdKpd/36dZYuXap1Tf0h9uDBgzr3JyQk0KhRI9asWUNKSopWWXp6OgsWLOCPP/7AxMSE7t27G/Sehg0bhomJCTNnzuTQoUOa6ykpKXzwwQc8fvyYHj16ZLrmIjPqJwq5TawGDBiAubk5S5YsYffu3ZrraWlpjBo1Su/UNPVZH3v37mXYsGEkJSXp3HPs2DG2bNmi+XuvXr1wcHDgn3/+0flwrh6L8uXLaz2lGDJkCADTp0/n2LFjmusPHz7kgw8+0Lvuys/Pj9q1a7N8+XK++uorrfU1kHHw5N69e7XW6vz88896zyv5888/gczXvzzvk08+QaVS8c0337Bz506tstTUVE1bL4qKisLc3BxPT89s+xBCCCHEy2Nw4qFetJzdqcei8FCfnL1o0SLNz23s2LG888477Nq1i1q1auHp6UmfPn3w8/PDxcWFihUr8sMPP2i107x5c2xsbDS7D73o4MGD9OzZk1KlStGiRQv8/f3p0qULVatWZfDgwQB888031K1b16D306hRI7766iuSkpJo3Lgxbdq0oU+fPlSrVo1Vq1ZRvXp1Zs+enet2fX19AWjVqhV9+vRh0KBBjB07Ntt6VatWZcqUKTx9+pSWLVvi4+NDnz59qFGjBmvXrtXsNvXirl3Lli2jfv36zJkzh0qVKtGyZUsCAgLo3Lkzb7zxBq6urlqJh7W1NcuXL8fKyoqgoCDc3d3x9/fHzc2NESNGYGNjw2+//aa1jqVJkyaMHj2ahIQEGjZsSPv27enduzdVq1bl/PnzmkX/zzM1NWXDhg04OTnx+eef88Ybb9CmTRsCAgJo164dZcuWpWnTploJ6M8//0yVKlV48803eeutt3j77bdxdXXlww8/xNLSks8//zzbcfT29mbKlCk8ePAAHx8fGjZsiL+/P23btqV8+fKaU8qfFx0dzbVr1/Dx8cHKyirbPoQQQgjx8hiceAwYMABFUTKd7iEKn3r16tG9e3eePHnCjz/+CGSsuViyZAkbN26kTZs2XL58mbVr1/LPP/9gaWnJmDFjNGtC1GxsbOjTpw8XL17Ueepha2tLZGQkISEhuLu7c+XKFdavX8/27dspUqQI77zzDv/880+OPsjnxPjx49m0aRPe3t4cPHiQdevWaZ7kHDhwIE/TAIcPH85nn32GjY0Na9euZeHChaxcuTJHdUeMGMGaNWtwd3dn//79hIeH4+rqyoEDBzSJwPML9SFjKtK+ffuYOXMmtWvX5t9//2XNmjUcP36cKlWq8P333zN69GitOq1ateLgwYP06dOHa9eusWbNGm7dukXfvn05dOiQ1jQrte+//5758+dTq1YtIiIiiIiIoE2bNkRGRmq2on1R9erV+ffff/n666+pUKEC+/fvZ926dZw/f5769esze/ZsTUIF8NVXX/Huu++iUqnYsWMHYWFhPH78mEGDBnH06NEcT3sbPXo0u3btonv37ly9epU1a9Zw8uRJ6tSpo5MIA6xYsQJAk9gKIYQQovBQKUbY09bX15fNmzczY8YMgoODjRGXeEUcPXqU+vXrExwcrNloQGQuLS2NunXrcubMGW7cuEHZsmULOqTXhqIo1KpVi+TkZGJiYrTOqslOUlIStra2OAxbiolF0Vz3feMH/WecCCGEEK879e/QxMTEbLenN3hXq927dzN8+HDu3LnDiBEjWLFiBW+//TY1atSgaNHsf4E3b97c0BBEAXJ1daVnz54sWrSICRMmaHa6+q+Ljo6mVKlSWrsxPX36lPHjx3P69Glat24tSYeRbdiwgXPnzrFw4cJcJR1CCCGEeDkMfuJhYmKS5/MCVCpVrncMEoVPdHQ0tWrVYvjw4UydOrWgwykUJk+ezMSJE2nQoAEVK1YkKSmJY8eOcfPmTezt7fnnn3+oWbNmQYf52lAUBTc3N1JTUzl27Fiuz4GRJx5CCCFE3rzUJx6AnED+H1e1alWdnav+61q1asWxY8fYv38/x48fJzU1lfLly/P+++8zbty4XO+wJbKmUqn4999/CzoMIYQQQmTB4MTjxW0uhRAZZ6PIhgtCCCGEEP9jcOLh7e1tjDiEEEIIIYQQrzFZgSmEEP/v/Le+2c5PFUIIIUTeGHyOhxBCCCGEEEJkx+hPPA4fPsz27ds5efIk9+7dA6BkyZK4uLjQunVrGjRoYOwuhRBCCCGEEIWcUQ4QBDhx4gTvvfceUVFRWd7n4eHBL7/8Qp06dYzRrRBCGCw3WwEKIYQQ4n9y8zvUKFOttm/fTqNGjYiKikJRFBRFwdTUFAcHBxwcHDA1NdVc379/P40aNWLHjh3G6FoIIYQQQgjxCjA48YiPj6dnz548ffoUlUrFoEGDOHDgAA8fPuTGjRvcuHGDR48eERUVxeDBgylSpAhPnz6lZ8+e3L171xjvQQghhBBCCFHIGZx4zJgxg8TERMzNzdm8eTPz5s2jYcOGmJr+b/lIkSJFcHd355dffmHz5s2YmZmRmJjIjBkzDO1eCCGEEEII8QoweI2Hm5sbx44d48MPP2Tq1Kk5qjN69Gh+/PFH6tevz+HDhw3pXgghDKaen+owbCkmFkVzXf/GDz3yISohhBCi8HupazwuX74MgK+vb47rqO+9dOmSod0LIYQQQgghXgEGJx5PnjwBwNraOsd11Pc+ffrU0O6FEEIIIYQQrwCDE4+yZcsC8O+//+a4jvpeBwcHQ7sXQgghhBBCvAIMTjyaNWuGoihMnjyZpKSkbO9/8OAB3333HSqVimbNmhnavRBCCCGEEOIVYHDiERQUBGSs9WjevDmHDh3K9N5Dhw7h7e1NdHS0Vl0hROF04sQJVCpVlq+C2iCiMMcmhBBCCF2m2d+SNS8vL4YOHcqcOXM4ceIEHh4evPnmm3h4eFCmTBlUKhW3b9/mwIEDnDp1SlNv6NCheHl5Gdq9ECIfVaxYkcjISJ3rZ8+eZdCgQdSpUwcXF5cCiKxwxyaEEEIIXQZvpwugKAqffPIJP/74I+np6RkNq1Q69wCYmJgwatQoJk+erHOPEKLwi4uLw9PTk2fPnnHgwAHKlStX0CFp5DU22U5XCCGEyJuXup0uZCQZU6ZM4ejRo7z//vtUr14dRVG0XtWrV+f999/n6NGjmjUeQohXy+PHj+nSpQt3795l8+bNhSrpKMyxCSGEEMIIU62e5+LiwuzZswFISUnh/v37ANjZ2WFubm7MroQQL1l6ejoBAQEcOXKEzZs3U7du3YIOSaMwxyaEEEKIDEZ54qGPubk5Dg4OODg4SNLxmtu5cyd+fn6UL18ec3Nz7OzsqFmzJj179mTWrFkkJiYWdIjCCEaNGsX69euZO3cubdu2LehwtBTm2IQQQgiRId8SD/Hf8OWXX+Lj48O6deuwtbWlc+fOtG3bFisrK9atW8cHH3zAmTNnCjrMQicmJgaVSkWLFi0KOpQcmTVrFtOnT2fcuHEMGjSooMPRUphjE0IIIcT/GHWq1YULF1iyZAmRkZHcunWLx48fEx4eTrVq1TT3nDx5kqtXr2JtbY23t7cxuxcv2eHDhwkJCcHMzIzVq1fTrVs3rfJbt26xbNkySpQoUSDxCeMICwtjxIgR9OnTh2+++aagw9FSmGMTQgghhDajJB7p6el8/PHHzJgxg/T0dM0OViqVipSUFK17r169SufOnTE1NeXy5cuUL1/eGCGIArBu3ToURaFXr146SQdknGo/evTolx+YMJrDhw/Tp08fvLy8+PXXX426KURMTAxOTk4EBgYSGhpaqGITQgghhPEZZapVUFAQ06ZNIy0tjXLlyvHWW29lem/Hjh1xcnIiLS2NNWvWGKN7UUDu3LkDQOnSpXN0/6FDh1CpVDRp0iTTe7799ltUKhUTJ04EtKckPXz4kI8++oiKFStiZWWFm5sbYWFhmrq///47Hh4eWFtb4+DgwPDhw3n8+LFW+8Zu73mxsbEEBwdTtWpVLC0tKVmyJJ07d2bfvn1a94WEhODk5ATArl27tA6869+/v06cSUlJfPTRRzg5OWFmZkbnzp1zPY55ceXKFTp37kz58uXZsGEDFhYWeW7L2AyN7enTpyQlJWm9hBBCCJG/DE48duzYwcKFCwEYP348MTExrF69Oss6PXv2RFEU/v77b0O7FwWoYsWKAKxdu5a4uLhs73d3d8fNzY3IyEitwyTVFEVh4cKFmJiYMHDgQK2ylJQUWrVqxfLly/H09MTT05Njx47RvXt3tm/fzrRp0/D396dYsWK0a9eOtLQ0fvrpp0zn/Bu7vcjISOrVq8fs2bMxMzOjU6dOuLi4EB4eTvPmzVm1apXmXldXV/z8/ABwcHAgMDBQ82ratKlWu48fP8bb25vQ0FBcXV3x9fWlYcOGeR7HkJAQrQQnM48ePaJTp07cvXuXzz//nPPnz7N//36tV0xMTJZt5BdjxDZp0iRsbW01L/W/ZSGEEELkI8VAvXr1UlQqldK5c2et6yqVSjExMVFOnTqlU2ft2rWKSqVSqlatamj3ogBFR0crVlZWCqAUK1ZMCQwMVObPn68cOXJESU1N1Vtn3rx5CqCMGDFCp2zbtm0KoHTo0EFz7fLlywqgAIqPj4+SnJysKfv1118VQKlWrZpiZ2enHDx4UFN2/fp1pUyZMgqgREdH51t7iqIoiYmJiqOjo1KkSBFl2bJlWmUHDx5U7OzsFBsbGyUuLk4nDm9vb73j9HycjRs3Vu7fv2/QOKpNnDhRAZTAwEC9/art2rVL039mr2+++SbLNrKjfo/ZxZIfsT158kRJTEzUvGJjYxVAcRi2VHH8aG2uX0IIIcR/VWJiogIoiYmJ2d5r8BOPyMhIVCqVzjerWalQoQKQsfhYvLqqVKlCWFgYFStW5MGDByxevJjBgwfj5uaGvb09Q4cO5ebNm1p1/P39KV68OEuXLuXp06daZQsWLABg8ODBOn2ZmJgwd+5crK2tNdf69euHvb09Fy9eZNiwYbi7u2vKypUrR0BAAAC7d+/O1/YWLVrEzZs3GTlypOYeNXd3dyZMmEBycjLLli3TM4rZmzlzps4C/byOo729PTVr1sTR0THLPps3b65zCOiLr/Hjx+fp/RjKGLFZWFhQvHhxrZcQQggh8pfBi8vVU2wqV66c4zpmZmYApKamGtq9KGCtWrXi4sWLbN68ma1btxIVFcXx48dJSEhg7ty5rF27lt27d1OzZk0ArK2t6du3L3PmzGHt2rX4+/sDEB8fz/r16ylbtixdunTR6ady5crUqFFD65qJiQmVKlUiPj5e79kNVapUAdBJfozd3tatWwHo0aOH3jFq1qwZAFFRUXrLs+Lo6KiVAKnldRyDg4MJDg7OdRyGmjx5MmfPntW6lpycDMA///yjd+rXoEGDdKaeCSGEEOLVZXDiYW1tTUJCgmahcU5cu3YNgJIlSxravSgEzM3N6d69O927dwcgISGBlStXMn78eOLi4ggODmbbtm2a+4cMGcKcOXOYP3++5gPzkiVLSElJYcCAAZia6v6zzGz3Mxsbm0zL1WUvPhEwdnvq9QReXl5621SLj4/PslyfN954I9OyvIxjQdmyZQu7du3SWxYdHU10dLTO9RYtWkjiIYQQQrxGDP5kUqVKFY4cOcLp06dp06ZNjur89ddfALz55puGdi8KoRIlSjBkyBDKlStH165d2blzJ48ePaJo0aIA1KlThyZNmhAREcGFCxeoXr06CxcuRKVSZbp428Qk61mB2ZXnZ3vp6ekAvPXWW1pTt17k7Oyc4zbVLC0tMy3LyzgWlIiICJ1rhm6nK4QQQohXi8GJR9u2bTl8+DCzZ8/mgw8+yPYD2+nTpwkNDUWlUtGxY0dDuxeFmI+PDwBpaWkkJCRoEg/I+LZ+3759LFiwAF9fX06fPk3r1q0105leJRUqVODcuXOMHTuWBg0avNS+83Mcc3suhvL/5/e8DIU5NiGEEELoZ/Di8uHDh2NtbU10dDRDhgzJct3Gtm3baNu2LU+ePKFkyZJ6F7+KV0d2H+YuXrwIZEzFsre31yrr2bMnpUqVIjQ0lDlz5gD6F0O/CtRP+tavX5/jOubm5oDh65zycxwVRWHVqlV07NiRsmXLUrx4cZo1a8aePXv0Luh+mQpzbEIIIYTQz+DEw8HBgZ9//hmAhQsXUrVqVYYOHaopnzFjBu+99x5vvvkm7du358aNG5iYmBAaGqqZMy9eTRMmTGDMmDF65+dfv36doKAgAHx9fTUftNUsLS0JDAwkLi6OFStWULp0ab2nn78KgoKCKFOmDFOmTGHevHmaqVdqqamphIeHc/LkSc01e3t7zMzMiI6OJi0tLc9953YcZ82ahbOzM+PGjctR+9OnT8fe3p7Zs2fz+++/U758eVq1asWxY8fyHLOxFObYhBBCCKHLKKtPAwICMDMzIygoiNjYWH755RfNVAj11p7qbx1tbGxYvHgxnTp1MkbXogAlJyczY8YMpk6dSo0aNahduzaWlpZcu3aNAwcO8OzZM6pVq8b06dP11lefeK8oCoGBgTrJyauiRIkSbNy4kS5duhAUFMTXX3+Ni4sLdnZ23Lp1iyNHjpCQkMD69etxcXEBMp54tG/fnrCwMOrVq4ebmxvm5uZ4eXkxYMCAXPWfm3GMj4/n3Llzenf60icsLIxSpUpp/t66dWvq1KnD7NmzmTdvXq7iNLbCHJsQQgghdBlt25tevXrRqlUr5syZQ1hYGEePHtWaRvLmm2/i6+vLiBEjKFOmjLG6FQXos88+w93dnfDwcI4dO8aePXtITEykePHiNGrUiK5duzJ06NBMF1zXqFGDChUqEBsbW+gWQ+eWp6cnJ06cYNq0aWzevFmzg5OjoyPe3t50796d1q1ba9VZsGABo0ePZtu2baxYsYK0tDRSU1NznXjk5zg+/8EeMhbdu7i4cPnyZaP2kxeFOTYhhBBC6FIp+TQBOj09nXv37pGWlkbJkiU1Z3cIoRYZGUmTJk3w9vbWu+uRyJmXOY5paWlUr16ddu3aMXfu3HztK7cMiS0pKQlbW1schi3FxKJo9hVecOMH/We4CCGEEK879e9Q9ZfPWcm3jf5NTEx0FhQL8bxvvvkGoEAOtHudvMxxnDVrFlevXtVax1VYFObYhBBCCJGPiYcQ+uzbt4+FCxdy8uRJoqKicHNzy/TEb5G5ghjHAwcOMHbsWD777DPq1KmTr33lVmGOTQghhBAZjJ54pKWlcf369SzvMTc3p2zZssbuWrwCzp8/z6JFiyhWrBidOnVi9uzZuT78T7z8cYyJiaFr16506dKFiRMn5ls/eWHM2M5/65vtY2IhhBBC5E2u13icPn2aWbNmAdCpUyed3alOnTpF3bp1s2zD1NSUo0ePUqtWrVyGK4R42RISEvDy8qJYsWLs3LkTKyurgg5Jw1ix5WZ+qhBCCCH+Jze/Q3P9Feknn3zCL7/8wl9//UWzZs303qPvAK/nX8+ePWPMmDG57VoI8ZKlpKTQo0cPHj16xMaNGwtV0lGYYxNCCCGErlxNtYqJiWHz5s2oVCq+/fbbLLMalUpFv379dK4nJCSwceNGtmzZwpUrV6hUqVLuoxZCvBRDhw5l165dzJ8/n8uXL2u2qrWwsKB+/foSmxBCCCFyLFeJx5o1awCoXLkyb7/9drb3//rrr3qv16lTh9OnT7Nq1So+/vjj3IQghHiJtm/fTnp6OgMHDtS6XqlSJWJiYgomqP9XmGMTQgghhK5cTbXat28fKpWKzp07a04mz4tevXqhKAqRkZF5bkMIkf9iYmL0TpcsDB/sC3NsQgghhNCVq8TjxIkTADRv3tygTt3c3LTaE0IIIYQQQrzecjXV6s6dOwA4Ojoa1Kl6K927d+8a1I4QQhhTjfF/5OrkcjmxXAghhMi5XCUejx49AqBo0cx/MdeuXZv79+9n2U6RIkW02hNCCCGEEEK83nI11crOzg7I+kmFSqXC1tYWW1vbTO+5d+8eACVKlMhN90IIIYQQQohXVK4SDwcHBwCOHz9uUKfqtR1lypQxqB0hhBBCCCHEqyFXiUfjxo1RFIVNmzYZ1GlYWBgqlYrGjRsb1I4QQgghhBDi1ZCrxKNdu3YAREREsGfPnjx1uHfvXv7++2+t9oQQQgghhBCvt1wlHl27dqVatWooikLv3r01JwXn1JUrV+jduzcqlYoqVarQvXv3XNUXQgghhBBCvJpylXgUKVKEqVOnolKpuH37Nm5ubsydO5fHjx9nWe/Jkyf88ssv1K9fnxs3bgAwdepUTExy1b0QQgghhBDiFaVSFEXJbaWvv/6azz//XHN6ebFixWjWrBlubm6ULl0aa2trHj58yJ07d/j333/Zs2cPSUlJqLsKCQnh888/N+47EeI5O3fuZNasWezfv587d+5gbW1NmTJlqFu3Lt7e3rzzzjtZ7rwmCr/Hjx8zadIkVq5cydWrVylZsiTt27fnq6++onz58rlqKykpCVtbWxyGLZVzPIQQQohcUP8OTUxMpHjx4lnem6fEA2DRokUEBwfz5MmTjIb+PwnRR92FpaUlM2fOZNCgQXnpUogc+fLLL5k4cSIAtWrVwtnZGTMzM86dO8eJEydIT08nMjIST0/PAo60cImJicHJyQlvb28iIiIKOpwsPXnyhJYtW7J//34cHR1p1qwZMTExREVFUbp0afbv30+VKlVy3J4kHkIIIUTe5CbxyNUBgs979913adu2LT/88APLli3L8myPUqVK0bdvXz766CMqVqyY1y6FyNbhw4cJCQnBzMyM1atX061bN63yW7dusWzZMjlD5hX39ddfs3//fho3bszWrVuxsbEB4Mcff2TUqFG8++67hT55EkIIIf5r8vzE40UnT57k+PHjxMfH8+DBA4oVK0apUqWoV68eLi4uxuhCiGx9+umnfPvttwQEBLBs2bKCDueV8qo88UhJSaFMmTIkJiZy5MgR6tevr1Ver149jh8/zqFDh2jQoEGO2pQnHkIIIUTe5OaJh9FWd7u4uODv78/w4cP59NNPGT58OAEBAZJ0iJfqzp07AJQuXTpH9x86dAiVSkWTJk0yvefbb79FpVJppm/FxMSgUqlo0aIFDx8+1DzJs7Kyws3NjbCwME3d33//HQ8PD6ytrXFwcGD48OE6mzEYu73nxcbGEhwcTNWqVbG0tKRkyZJ07tyZffv2ad0XEhKCk5MTALt27UKlUmle/fv314kzKSmJjz76CCcnJ8zMzOjcuXOuxzGv9u7dS2JiIlWrVtVJOgDeeustAK1xE0IIIUTBk22l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",
908 | "text/plain": [
909 | ""
910 | ]
911 | },
912 | "metadata": {},
913 | "output_type": "display_data"
914 | }
915 | ],
916 | "source": [
917 | "# @title Saliency Analysis\n",
918 | "train_X = normalize_features(train_df, column_names, add_target=False).to_numpy()\n",
919 | "train_y = train_df[target].to_numpy()\n",
920 | "\n",
921 | "\n",
922 | "saliencies = np.mean(\n",
923 | " np.abs(jax.grad(loss_fn_t.apply, 1)(trained_params, train_X, train_y)), axis=0)\n",
924 | "\n",
925 | "\n",
926 | "decreasing_saliency = reversed(sorted(zip(saliencies, display_name_from_short_name.values())))\n",
927 | "sorted_saliencies, sorted_columns = zip(*decreasing_saliency)\n",
928 | "\n",
929 | "fig, ax = plt.subplots(figsize=(6,8))\n",
930 | "sns.barplot(y=np.array(sorted_columns),\n",
931 | " x=np.array(sorted_saliencies) / max(sorted_saliencies),\n",
932 | " color=\"#0077c6\");\n",
933 | "\n",
934 | "ax.tick_params(labelsize=15);\n",
935 | "ax.set_ylabel('Geometric invariants X(z)', fontsize=20);\n",
936 | "plt.xlabel('Normalized attribution score', fontsize=20);"
937 | ]
938 | },
939 | {
940 | "cell_type": "markdown",
941 | "metadata": {},
942 | "source": [
943 | "### Confirming The Feature Saliency"
944 | ]
945 | },
946 | {
947 | "cell_type": "code",
948 | "execution_count": 12,
949 | "metadata": {
950 | "cellView": "form",
951 | "id": "EsDbwItnlNUY"
952 | },
953 | "outputs": [],
954 | "source": [
955 | "# @title Confirming the Feature Saliency\n",
956 | "\n",
957 | "#@markdown To confirm the results of the saliency analysis, we re-train the network with\n",
958 | "#@markdown only these three features as input to the network.\n",
959 | "salient_column_names = ['longitudinal_translation',\n",
960 | " 'meridinal_translation_imag',\n",
961 | " 'meridinal_translation_real']\n",
962 | "target = 'signature'"
963 | ]
964 | },
965 | {
966 | "cell_type": "markdown",
967 | "metadata": {},
968 | "source": [
969 | "### Confirming the Feature Saliency: Network Setup"
970 | ]
971 | },
972 | {
973 | "cell_type": "code",
974 | "execution_count": 13,
975 | "metadata": {
976 | "cellView": "form",
977 | "id": "SKY75X_sEsy2"
978 | },
979 | "outputs": [
980 | {
981 | "name": "stderr",
982 | "output_type": "stream",
983 | "text": [
984 | "/opt/homebrew/anaconda3/lib/python3.11/site-packages/haiku/_src/initializers.py:127: UserWarning: Explicitly requested dtype float64 is not available, and will be truncated to dtype float32. To enable more dtypes, set the jax_enable_x64 configuration option or the JAX_ENABLE_X64 shell environment variable. See https://github.com/google/jax#current-gotchas for more.\n",
985 | " unscaled = jax.random.truncated_normal(\n",
986 | "/opt/homebrew/anaconda3/lib/python3.11/site-packages/haiku/_src/base.py:658: UserWarning: Explicitly requested dtype float64 requested in zeros is not available, and will be truncated to dtype float32. To enable more dtypes, set the jax_enable_x64 configuration option or the JAX_ENABLE_X64 shell environment variable. See https://github.com/google/jax#current-gotchas for more.\n",
987 | " param = init(shape, dtype)\n"
988 | ]
989 | }
990 | ],
991 | "source": [
992 | "# @title Confirming the Feature Saliency: Network Setup (re-run before re-training)\n",
993 | "\n",
994 | "train_X, train_y = get_batch(normed_train_df, salient_column_names, batch_size)\n",
995 | "\n",
996 | "init_params_salient = loss_fn_t.init(rng, train_X, train_y)\n",
997 | "\n",
998 | "opt_init_salient, opt_update_salient = optax.adam(learning_rate)\n",
999 | "opt_state_salient = opt_init(init_params_salient)"
1000 | ]
1001 | },
1002 | {
1003 | "cell_type": "markdown",
1004 | "metadata": {},
1005 | "source": [
1006 | "### Confirming the Feature Saliency: Network Training"
1007 | ]
1008 | },
1009 | {
1010 | "cell_type": "code",
1011 | "execution_count": 14,
1012 | "metadata": {
1013 | "cellView": "form",
1014 | "id": "lGOfm424lXtR"
1015 | },
1016 | "outputs": [
1017 | {
1018 | "name": "stdout",
1019 | "output_type": "stream",
1020 | "text": [
1021 | "Step count: 0\n",
1022 | "Train loss: 2.7614235877990723\n",
1023 | "Validation loss: 2.805657386779785\n",
1024 | "Step count: 100\n",
1025 | "Train loss: 2.388213872909546\n",
1026 | "Validation loss: 2.419311285018921\n",
1027 | "Step count: 200\n",
1028 | "Train loss: 2.1496756076812744\n",
1029 | "Validation loss: 2.161698579788208\n",
1030 | "Step count: 300\n",
1031 | "Train loss: 1.9615678787231445\n",
1032 | "Validation loss: 1.9971750974655151\n",
1033 | "Step count: 400\n",
1034 | "Train loss: 1.9326486587524414\n",
1035 | "Validation loss: 1.896746039390564\n",
1036 | "Step count: 500\n",
1037 | "Train loss: 1.7300117015838623\n",
1038 | "Validation loss: 1.826549768447876\n",
1039 | "Step count: 600\n",
1040 | "Train loss: 1.8089721202850342\n",
1041 | "Validation loss: 1.7697826623916626\n",
1042 | "Step count: 700\n",
1043 | "Train loss: 1.8630174398422241\n",
1044 | "Validation loss: 1.7183831930160522\n",
1045 | "Step count: 800\n",
1046 | "Train loss: 1.7237074375152588\n",
1047 | "Validation loss: 1.6680281162261963\n",
1048 | "Step count: 900\n",
1049 | "Train loss: 1.5447618961334229\n",
1050 | "Validation loss: 1.618795394897461\n",
1051 | "Step count: 1000\n",
1052 | "Train loss: 1.5312609672546387\n",
1053 | "Validation loss: 1.5699970722198486\n",
1054 | "Step count: 1100\n",
1055 | "Train loss: 1.4775203466415405\n",
1056 | "Validation loss: 1.5210233926773071\n",
1057 | "Step count: 1200\n",
1058 | "Train loss: 1.4869463443756104\n",
1059 | "Validation loss: 1.4717947244644165\n",
1060 | "Step count: 1300\n",
1061 | "Train loss: 1.3452095985412598\n",
1062 | "Validation loss: 1.4213618040084839\n",
1063 | "Step count: 1400\n",
1064 | "Train loss: 1.3345348834991455\n",
1065 | "Validation loss: 1.3705226182937622\n",
1066 | "Step count: 1500\n",
1067 | "Train loss: 1.1913044452667236\n",
1068 | "Validation loss: 1.3196864128112793\n",
1069 | "Step count: 1600\n",
1070 | "Train loss: 1.2670183181762695\n",
1071 | "Validation loss: 1.2692861557006836\n",
1072 | "Step count: 1700\n",
1073 | "Train loss: 1.1062930822372437\n",
1074 | "Validation loss: 1.2203614711761475\n",
1075 | "Step count: 1800\n",
1076 | "Train loss: 1.1311137676239014\n",
1077 | "Validation loss: 1.1733242273330688\n",
1078 | "Step count: 1900\n",
1079 | "Train loss: 1.1015247106552124\n",
1080 | "Validation loss: 1.1291357278823853\n",
1081 | "Step count: 2000\n",
1082 | "Train loss: 1.2747454643249512\n",
1083 | "Validation loss: 1.0881578922271729\n",
1084 | "Step count: 2100\n",
1085 | "Train loss: 1.1164498329162598\n",
1086 | "Validation loss: 1.0503908395767212\n",
1087 | "Step count: 2200\n",
1088 | "Train loss: 0.9105275273323059\n",
1089 | "Validation loss: 1.0164942741394043\n",
1090 | "Step count: 2300\n",
1091 | "Train loss: 0.8813854455947876\n",
1092 | "Validation loss: 0.9849182963371277\n",
1093 | "Step count: 2400\n",
1094 | "Train loss: 0.9708192348480225\n",
1095 | "Validation loss: 0.956310510635376\n",
1096 | "Step count: 2500\n",
1097 | "Train loss: 0.8696013689041138\n",
1098 | "Validation loss: 0.9300026297569275\n",
1099 | "Step count: 2600\n",
1100 | "Train loss: 1.024273157119751\n",
1101 | "Validation loss: 0.9060561060905457\n",
1102 | "Step count: 2700\n",
1103 | "Train loss: 0.8595995903015137\n",
1104 | "Validation loss: 0.8840814232826233\n",
1105 | "Step count: 2800\n",
1106 | "Train loss: 0.7574213743209839\n",
1107 | "Validation loss: 0.8634595274925232\n",
1108 | "Step count: 2900\n",
1109 | "Train loss: 0.8112626075744629\n",
1110 | "Validation loss: 0.8452709317207336\n",
1111 | "Step count: 3000\n",
1112 | "Train loss: 0.8701050281524658\n",
1113 | "Validation loss: 0.8277906179428101\n",
1114 | "Step count: 3100\n",
1115 | "Train loss: 0.7930698394775391\n",
1116 | "Validation loss: 0.8116493225097656\n",
1117 | "Step count: 3200\n",
1118 | "Train loss: 0.8960763216018677\n",
1119 | "Validation loss: 0.795965850353241\n",
1120 | "Step count: 3300\n",
1121 | "Train loss: 0.7834410071372986\n",
1122 | "Validation loss: 0.7817390561103821\n",
1123 | "Step count: 3400\n",
1124 | "Train loss: 0.6940096616744995\n",
1125 | "Validation loss: 0.7686640620231628\n",
1126 | "Step count: 3500\n",
1127 | "Train loss: 0.7357538938522339\n",
1128 | "Validation loss: 0.7559365034103394\n",
1129 | "Step count: 3600\n",
1130 | "Train loss: 0.7318865060806274\n",
1131 | "Validation loss: 0.7439627647399902\n",
1132 | "Step count: 3700\n",
1133 | "Train loss: 0.7224804162979126\n",
1134 | "Validation loss: 0.7326063513755798\n",
1135 | "Step count: 3800\n",
1136 | "Train loss: 0.7348959445953369\n",
1137 | "Validation loss: 0.7221681475639343\n",
1138 | "Step count: 3900\n",
1139 | "Train loss: 0.6049644947052002\n",
1140 | "Validation loss: 0.7122893929481506\n",
1141 | "Step count: 4000\n",
1142 | "Train loss: 0.7843313813209534\n",
1143 | "Validation loss: 0.7031309008598328\n",
1144 | "Step count: 4100\n",
1145 | "Train loss: 0.7371485233306885\n",
1146 | "Validation loss: 0.6940381526947021\n",
1147 | "Step count: 4200\n",
1148 | "Train loss: 0.8364322185516357\n",
1149 | "Validation loss: 0.6851128935813904\n",
1150 | "Step count: 4300\n",
1151 | "Train loss: 0.7326945066452026\n",
1152 | "Validation loss: 0.6773727536201477\n",
1153 | "Step count: 4400\n",
1154 | "Train loss: 0.6783174276351929\n",
1155 | "Validation loss: 0.6696005463600159\n",
1156 | "Step count: 4500\n",
1157 | "Train loss: 0.614048957824707\n",
1158 | "Validation loss: 0.6618369221687317\n",
1159 | "Step count: 4600\n",
1160 | "Train loss: 0.7186390161514282\n",
1161 | "Validation loss: 0.6548063158988953\n",
1162 | "Step count: 4700\n",
1163 | "Train loss: 0.6813069581985474\n",
1164 | "Validation loss: 0.648128867149353\n",
1165 | "Step count: 4800\n",
1166 | "Train loss: 0.6567203998565674\n",
1167 | "Validation loss: 0.6416744589805603\n",
1168 | "Step count: 4900\n",
1169 | "Train loss: 0.6926349401473999\n",
1170 | "Validation loss: 0.6355624198913574\n",
1171 | "Step count: 5000\n",
1172 | "Train loss: 0.6608371138572693\n",
1173 | "Validation loss: 0.6299481987953186\n",
1174 | "Step count: 5100\n",
1175 | "Train loss: 0.8321611285209656\n",
1176 | "Validation loss: 0.6240999102592468\n",
1177 | "Step count: 5200\n",
1178 | "Train loss: 0.6036645174026489\n",
1179 | "Validation loss: 0.6185488700866699\n",
1180 | "Step count: 5300\n",
1181 | "Train loss: 0.6060733795166016\n",
1182 | "Validation loss: 0.6134203672409058\n",
1183 | "Step count: 5400\n",
1184 | "Train loss: 0.6677653193473816\n",
1185 | "Validation loss: 0.6078833937644958\n",
1186 | "Step count: 5500\n",
1187 | "Train loss: 0.4742782413959503\n",
1188 | "Validation loss: 0.6031250953674316\n",
1189 | "Step count: 5600\n",
1190 | "Train loss: 0.49872714281082153\n",
1191 | "Validation loss: 0.5985592603683472\n",
1192 | "Step count: 5700\n",
1193 | "Train loss: 0.6913710832595825\n",
1194 | "Validation loss: 0.593771755695343\n",
1195 | "Step count: 5800\n",
1196 | "Train loss: 0.6784710884094238\n",
1197 | "Validation loss: 0.5893182158470154\n",
1198 | "Step count: 5900\n",
1199 | "Train loss: 0.6741566061973572\n",
1200 | "Validation loss: 0.5848686695098877\n",
1201 | "Step count: 6000\n",
1202 | "Train loss: 0.6259003281593323\n",
1203 | "Validation loss: 0.5804926156997681\n",
1204 | "Step count: 6100\n",
1205 | "Train loss: 0.6865454316139221\n",
1206 | "Validation loss: 0.5764020085334778\n",
1207 | "Step count: 6200\n",
1208 | "Train loss: 0.5772806406021118\n",
1209 | "Validation loss: 0.5719350576400757\n",
1210 | "Step count: 6300\n",
1211 | "Train loss: 0.6780864596366882\n",
1212 | "Validation loss: 0.5680485367774963\n",
1213 | "Step count: 6400\n",
1214 | "Train loss: 0.4631125032901764\n",
1215 | "Validation loss: 0.5639679431915283\n",
1216 | "Step count: 6500\n",
1217 | "Train loss: 0.5941550731658936\n",
1218 | "Validation loss: 0.5604357719421387\n",
1219 | "Step count: 6600\n",
1220 | "Train loss: 0.6307265758514404\n",
1221 | "Validation loss: 0.5566143989562988\n",
1222 | "Step count: 6700\n",
1223 | "Train loss: 0.7405992746353149\n",
1224 | "Validation loss: 0.5531129837036133\n",
1225 | "Step count: 6800\n",
1226 | "Train loss: 0.526777982711792\n",
1227 | "Validation loss: 0.5495466589927673\n",
1228 | "Step count: 6900\n",
1229 | "Train loss: 0.6490035057067871\n",
1230 | "Validation loss: 0.5466834306716919\n",
1231 | "Step count: 7000\n",
1232 | "Train loss: 0.5304993987083435\n",
1233 | "Validation loss: 0.5427576303482056\n",
1234 | "Step count: 7100\n",
1235 | "Train loss: 0.53404301404953\n",
1236 | "Validation loss: 0.5399003028869629\n",
1237 | "Step count: 7200\n",
1238 | "Train loss: 0.487496554851532\n",
1239 | "Validation loss: 0.5371031165122986\n",
1240 | "Step count: 7300\n",
1241 | "Train loss: 0.45802122354507446\n",
1242 | "Validation loss: 0.5341663360595703\n",
1243 | "Step count: 7400\n",
1244 | "Train loss: 0.44041725993156433\n",
1245 | "Validation loss: 0.5314267873764038\n",
1246 | "Step count: 7500\n",
1247 | "Train loss: 0.531814455986023\n",
1248 | "Validation loss: 0.5284692645072937\n",
1249 | "Step count: 7600\n",
1250 | "Train loss: 0.47992217540740967\n",
1251 | "Validation loss: 0.526004433631897\n",
1252 | "Step count: 7700\n",
1253 | "Train loss: 0.5088521242141724\n",
1254 | "Validation loss: 0.5230643153190613\n",
1255 | "Step count: 7800\n",
1256 | "Train loss: 0.5828921794891357\n",
1257 | "Validation loss: 0.520179808139801\n",
1258 | "Step count: 7900\n",
1259 | "Train loss: 0.4943484663963318\n",
1260 | "Validation loss: 0.5175743103027344\n",
1261 | "Step count: 8000\n",
1262 | "Train loss: 0.552828311920166\n",
1263 | "Validation loss: 0.5151614546775818\n",
1264 | "Step count: 8100\n",
1265 | "Train loss: 0.6291115880012512\n",
1266 | "Validation loss: 0.5133667588233948\n",
1267 | "Step count: 8200\n",
1268 | "Train loss: 0.4879392683506012\n",
1269 | "Validation loss: 0.510779082775116\n",
1270 | "Step count: 8300\n",
1271 | "Train loss: 0.4349018633365631\n",
1272 | "Validation loss: 0.5087208151817322\n",
1273 | "Step count: 8400\n",
1274 | "Train loss: 0.41613534092903137\n",
1275 | "Validation loss: 0.5061413049697876\n",
1276 | "Step count: 8500\n",
1277 | "Train loss: 0.46150243282318115\n",
1278 | "Validation loss: 0.504405677318573\n",
1279 | "Step count: 8600\n",
1280 | "Train loss: 0.5156277418136597\n",
1281 | "Validation loss: 0.5025164484977722\n",
1282 | "Step count: 8700\n",
1283 | "Train loss: 0.6169106364250183\n",
1284 | "Validation loss: 0.5001534819602966\n",
1285 | "Step count: 8800\n",
1286 | "Train loss: 0.35082823038101196\n",
1287 | "Validation loss: 0.49816426634788513\n",
1288 | "Step count: 8900\n",
1289 | "Train loss: 0.5226665139198303\n",
1290 | "Validation loss: 0.4966347813606262\n",
1291 | "Step count: 9000\n",
1292 | "Train loss: 0.6887170672416687\n",
1293 | "Validation loss: 0.4947109520435333\n",
1294 | "Step count: 9100\n",
1295 | "Train loss: 0.6093366146087646\n",
1296 | "Validation loss: 0.49301907420158386\n",
1297 | "Step count: 9200\n",
1298 | "Train loss: 0.6447827219963074\n",
1299 | "Validation loss: 0.491354763507843\n",
1300 | "Step count: 9300\n",
1301 | "Train loss: 0.4595358967781067\n",
1302 | "Validation loss: 0.48962050676345825\n",
1303 | "Step count: 9400\n",
1304 | "Train loss: 0.564563512802124\n",
1305 | "Validation loss: 0.4886232018470764\n",
1306 | "Step count: 9500\n",
1307 | "Train loss: 0.5287905335426331\n",
1308 | "Validation loss: 0.48654934763908386\n",
1309 | "Step count: 9600\n",
1310 | "Train loss: 0.41884922981262207\n",
1311 | "Validation loss: 0.4851319193840027\n",
1312 | "Step count: 9700\n",
1313 | "Train loss: 0.3431329131126404\n",
1314 | "Validation loss: 0.48383355140686035\n",
1315 | "Step count: 9800\n",
1316 | "Train loss: 0.47992512583732605\n",
1317 | "Validation loss: 0.4823845624923706\n",
1318 | "Step count: 9900\n",
1319 | "Train loss: 0.39113670587539673\n",
1320 | "Validation loss: 0.4812586009502411\n",
1321 | "Test Accuracy: 0.81358105\n"
1322 | ]
1323 | }
1324 | ],
1325 | "source": [
1326 | "# @title Confirming the Feature Saliency: Network Training\n",
1327 | "\n",
1328 | "\n",
1329 | "#@markdown Re-train the network using only the most salient features.\n",
1330 | "@jax.jit\n",
1331 | "def update_salient(params, opt_state, batch_X, batch_y):\n",
1332 | " grads = jax.grad(loss_fn_t.apply)(params, batch_X, batch_y)\n",
1333 | " upds, new_opt_state = opt_update_salient(grads, opt_state)\n",
1334 | " new_params = optax.apply_updates(params, upds)\n",
1335 | " return new_params, new_opt_state\n",
1336 | "\n",
1337 | "\n",
1338 | "trained_params_salient = train(salient_column_names, init_params_salient,\n",
1339 | " opt_state_salient, update_salient)\n",
1340 | "\n",
1341 | "#@markdown Print the test accuracy. This should be very similar to the test accuracy in\n",
1342 | "#@markdown the case that all columns / invariants are included, demonstrating that most\n",
1343 | "#@markdown of the predictve information about the signature is contained in the three\n",
1344 | "#@markdown selected invariants.\n",
1345 | "test_X, test_y = get_batch(normed_test_df, salient_column_names)\n",
1346 | "\n",
1347 | "#@markdown The final below accuracy should be in the low 80%s, probably 0.8 -> 0.85\n",
1348 | "print(\"Test Accuracy: \",\n",
1349 | " np.mean((predict(trained_params_salient, test_X) - test_y) == 0))"
1350 | ]
1351 | },
1352 | {
1353 | "cell_type": "markdown",
1354 | "metadata": {},
1355 | "source": [
1356 | "### Slope vs. Signature: Proposed Linear Relationship"
1357 | ]
1358 | },
1359 | {
1360 | "cell_type": "code",
1361 | "execution_count": 15,
1362 | "metadata": {
1363 | "cellView": "form",
1364 | "id": "ZIqvjO_O8Zti"
1365 | },
1366 | "outputs": [],
1367 | "source": [
1368 | "# @title Slope vs. Signature: Proposed Linear Relationship\n",
1369 | "\n",
1370 | "#@markdown The quantity we proposed was the \"natural slope\", given by\n",
1371 | "#@markdown real(longitudinal_translation / meridinal_translation). We show that\n",
1372 | "#@markdown this is approximately twice the signature (up to a correction term based on\n",
1373 | "#@markdown other hyperbolic invariants) which we can check by comparing the predictions\n",
1374 | "#@markdown made by this rule to those made by the previously trained models.\n",
1375 | "\n",
1376 | "\n",
1377 | "def predict_signature_from_slope(data_X, min_signature, max_signature):\n",
1378 | " meridinal_translation = (\n",
1379 | " data_X['meridinal_translation_real'] +\n",
1380 | " 1j * data_X['meridinal_translation_imag'])\n",
1381 | " slope = data_X['longitudinal_translation'] / meridinal_translation\n",
1382 | " return slope.real / 2"
1383 | ]
1384 | },
1385 | {
1386 | "cell_type": "markdown",
1387 | "metadata": {},
1388 | "source": [
1389 | "### Proposed Linear Relationship: Scatter plot"
1390 | ]
1391 | },
1392 | {
1393 | "cell_type": "code",
1394 | "execution_count": 16,
1395 | "metadata": {
1396 | "cellView": "form",
1397 | "id": "KAwLtNFxTwCc"
1398 | },
1399 | "outputs": [
1400 | {
1401 | "data": {
1402 | "text/plain": [
1403 | "Text(0, 0.5, 'Signature')"
1404 | ]
1405 | },
1406 | "execution_count": 16,
1407 | "metadata": {},
1408 | "output_type": "execute_result"
1409 | },
1410 | {
1411 | "data": {
1412 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAr4AAAKnCAYAAABgXk4mAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAACGgElEQVR4nOz9ebBlWV7X/b/XWns40z3nzjln1jx1dVd306M0tu3TMj0hAv4MRX0glFAjDGfQoMMBQX0ahEBERSAU0XhUcAAD+P2CB2kZ7aahgZ67uqtrzHm6w7nnnnP2sNb6/bFv3qqsrCqqsrMqs3J/XsQh8+zxe/a+nfmpddb+pokxRkREREREbnP2ZhcgIiIiIvJaUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZIbnYBt5oQAmfOnGFhYQFjzM0uR0RERESeJ8bIzs4Ohw8fxtqXP46r4Ps8Z86c4dixYze7DBERERH5fZw8eZKjR4++7O0VfJ9nYWEBaC7kcDi8ydWIiIiIyPONx2OOHTu2n9teLgXf57kyvWE4HCr4ioiIiNzCXum0VD3cJiIiIiKtoOArIiIiIq2g4CsiIiIiraDgKyIiIiKtoOArIiIiIq2g4CsiIiIiraDgKyIiIiKtoOArIiIiIq2g4CsiIiIiraDgKyIiIiKtoOArIiIiIq2g4CsiIiIiraDgKyIiIiKtoOArIiIiIq2g4CsiIiIiraDgKyIiIiKtoOArIiIiIq2g4CsiIiIiraDgKyIiIiKtoOArIiIiIq2g4CsiIiIirZDc7AJERERE5NZU1J7xrKbygdRZht2EPHH76yfzirNbc2a1p5s4Di12GHTSm1jxS1PwFREREZFrbE9LTm/N8OHZZRd34Mhil1Ev4/TGLp84tU1Rx/31j13Y4ZGjI44s929Cxb8/TXUQERERkasUtb8m9AL4AKe3ZmzuFteE3ma/yCdObTOZV69htS+fgq+IiIiIXGU8q68JvVf4AE9d2r0m9F5R1JGzW/NXsbrrp+ArIiIiIlepXiz17pmU/iXXz+qXXn+zKPiKiIiIyFVS99IRcZC5l1zfTV56/c2i4CsiIiIiVxl2E14s+zoLd6z2yRPzguvzxHBosfMqVnf9FHxFRERE5Cp54jiy2L0m/DrbdHVY6uc8cnR0TfjNE8MjR0e3bEsztTMTERERkWuMehmdzL1oH98jy31GvUx9fEVERETk9S9PHGsLLz5fd9BJuffgrRt0n09THURERESkFRR8RURERKQVFHxFREREpBUUfEVERESkFRR8RURERKQVFHxFREREpBUUfEVERESkFRR8RURERKQVFHxFREREpBUUfEVERESkFRR8RURERKQVFHxFREREpBUUfEVERESkFRR8RURERKQVFHxFREREpBUUfEVERESkFRR8RURERKQVFHxFREREpBUUfEVERESkFRR8RURERKQVFHxFREREpBUUfEVERESkFRR8RURERKQVFHxFREREpBUUfEVERESkFRR8RURERKQVFHxFREREpBUUfEVERESkFRR8RURERKQVFHxFREREpBUUfEVERESkFRR8RURERKQVFHxFREREpBUUfEVERESkFRR8RURERKQVFHxFREREpBUUfEVERESkFRR8RURERKQVFHxFREREpBUUfEVERESkFV5XwffXfu3X+KN/9I9y+PBhjDH8j//xP65aH2PkH/yDf8ChQ4fodru8//3v57HHHrs5xYqIiIjILSW52QW8Eru7uzzyyCP8+T//5/nGb/zGa9b/03/6T/mhH/oh/v2///fceeed/P2///f5qq/6Kj772c/S6XRuQsUiIiLyShS1ZzyrqXwgdZZhNyFP3Kt+rKL2bExKtmYVlfcUdSA1ln6ecGixw6CTvuj2tQ8YIpOZZ6sosdEw7KUsdTOOLHev2veFagK4uF1wdmfGzqwmTyyjboLBYqyhkxiqOlKEQDdxHFrskCb2hl2nNjExxnizi7gexhh+5md+hq//+q8HmtHew4cP823f9m18+7d/OwDb29scOHCAn/iJn+BP/ak/9bKOOx6PGY1GbG9vMxwOX63yRURE5Hm2pyWnt2b48OwyZ+HIYpdRL3vVjrU9LXni4oRTm3OKuubz5ybMas9yL+PoUpdBnvDI0RFHlvvXbD+ramal57Nnt7k0KTFAUUcOjXLeeGSRlUG2v+8L1TQva0rveez8Ls9sTKl8IADTouLIYpfVQc6prRmL3Yyjyz1ihDwx9DPH8qDz+36229X15rXX1VSHl/Lkk09y7tw53v/+9+8vG41GvPOd7+QjH/nITaxMREREfj9F7a8JhQA+wOmtGUXtX5VjFbXn1MaUU5tzIoHP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ckdR1xxZ7EDwzMuaynsGecJyPyHGQJZYQoikDhZ7KTEGht2U5V7CbllhLcQQ6KSWg8OMwjcj2c5EFrsJJgY6DnyEfuZoxpwDq/2UhdxR1WEv/BucgWOjHAOkCaTWMOg4erlldSGnmzvyxNDPr53H62xzzeXWp7skIiJym8kTx5HFLqe3ZnzFvatguKqrw6z2/F/vOsb//MwF5lng6FJnv6vD2+5YZnu35P0PrO93dbh3vc+Tl7mqq8NDB0f0rOXdd68yKXzT1WFWc2DUuaqrw+GlDt7D3SsDPnt+jA9xv6tD6izvufvZrg51HfiyE8ss9pKmq0MSmVX1fleH2bzmoYMLHBx2nu3qYOCBgwv7XR2cMSz38v2uDoNOig/PdnWYzgLvunOF5X7T1WGhk+x1dejvd3VIXcKJlaxp+7bco5c1Yf+Ro6Nrujo423R10INtrw/q6vA86uogIiK3C/XxVR/f29X15jUF3+dR8BURERG5tamdmYiIiIjIS1DwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVkhudgEiIiKvtqL2jGc1lQ+kztJNLbMq7L8fdhPyxL3oPhCZF4EnL++wPatw1pA5w7TyeB9JjME6AzESMfgYSQyUHmIIJNbgI/gYyZyl9AEfIgu5Y6HjOD8uKYMnT1JyZ5hVnsRaUmeofE2NZZQ7dorItCrJsBwc5WzMPF1ncM6yPa/YLWv6ecIoTyl9hfeRIhoIkCeWGCN56ijryMasoJskHB6mzKrITumJMZJYSwLYxLA5r/Hes9TJ6eWWM9szsiThjpWUrUlgWkempSdPIplL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EBERERF5VV1X8AU4deoUP/uzP8szzzxDWZZXrfuBH/iBL7kwEREREZEb6bqC74c+9CG+7uu+jrvuuotHH32Uhx9+mKeeeooYI29961tvdI0iIiIiIl+y62pn9oEPfIBv//Zv51Of+hSdTof//t//OydPnuS9730vf+JP/IkbXaOIiIiIyJfsuoLv5z73Ob75m78ZgCRJmM1mDAYDvvu7v5vv/d7vvaEFioiIiIjcCNcVfPv9/v683kOHDvH444/vr7t06dKNqUxERERE5Aa6rjm+73rXu/iN3/gNHnzwQb72a7+Wb/u2b+NTn/oUP/3TP8273vWuG12jiIiIiMiX7LqC7w/8wA8wmUwA+K7v+i4mkwk/9VM/xb333quODiIiIiJySzIxxnizi7iVjMdjRqMR29vbDIfDm12OiIiIiDzP9ea16+7jC1CWJRcuXCCEcNXy48ePfymHFRERERG54a4r+H7hC1/gW7/1W/nwhz981fIYI8YYvPc3pDgRERERkRvluoLvn/tzf44kSfj5n/95Dh06hDHmRtclIiIiInJDXVfw/fjHP87v/M7v8MADD9zoekREREREXhXX1cf3oYceUr9eEREREXldua7g+73f+738nb/zd/iVX/kVLl++zHg8vuolIiIiInKrua52ZtY2efn5c3tvh4fb1M5MRERE5Nb2mrYz++Vf/uXr2U1ERERE5Ka5ruD73ve+90bXISIiIiLyqrqu4PvJT37yBZcbY+h0Ohw/fpw8z7+kwkREREREbqTrCr5vfvObX7J3b5qm/Mk/+Sf50R/9UTqdznUXJyIiIiJyo1xXV4ef+Zmf4d577+XHfuzH+PjHP87HP/5xfuzHfoz777+f//Sf/hP/9t/+W/7X//pf/L2/9/dudL0iIiIiItflukZ8/8k/+Sf883/+z/mqr/qq/WVvfOMbOXr0KH//7/99fuu3fot+v8+3fdu38f3f//03rFgRERERket1XSO+n/rUpzhx4sQ1y0+cOMGnPvUpoJkOcfbs2S+tOhERERGRG+S6gu8DDzzA93zP91CW5f6yqqr4nu/5nv1/xvj06dMcOHDgxlQpIiIiIvIluq6pDv/qX/0rvu7rvo6jR4/ypje9CWhGgb33/PzP/zwATzzxBH/5L//lG1fpK6zv+77v+zh37hyPPPII/+Jf/Ave8Y533JRaROTGK2rP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YdTNWOg6upklzxzOmv3rPOw4uumV//AwdPNn5/M629wbERGR1wMFX3ldyBPHkcUu3dSxPsjJE0c/Szm81OPtdy6zPS1509FFFrsZBstDBxdY6Wcs9jMOjnoMOykPHuhzz9qAzUnB50+P+RNfdoz71gdsTkpOrPQYdhwWeO/963QTi7OGE6t91voZ43nNO+5cYXXQYdhx3LHSxwJ3rPZ5550rfOjT53nHiWXuXO5zz+qANHXsFp571/q8+eiI6cxz3/oCi72UhTzh3vUFhrljqZ/y4KERs3nk+FKX99yzyqdPbnFomHNxu+TL71njkaOLbM8qhp0UZw0PHxnyRx85ws987DR3rAz4shPLdJyllycMOynL/ZQ3HR5hgmG132W1n/PGo4uYCA8fXeDQQodDoy5FFTm+3OPOtT5vOTbijpUB3STBYDgwzFjtZ3SThOPLfZb7OXliOLzYuerBtiOLXT3YJiIirxvq6vA86upwa1MfX/XxFRERud68pu8o5XUlTxxrC461hfxml3LbGXRuzDYiIiK3Kk11EBEREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZQ8BURERGRVlDwFREREZFWUPAVERERkVZIbnYBcmuazCueujTh1OaMog6M8hTrgGjIU0cnh+1JDS6wMS7ZKWpyl2BMJMQIxpAZg3GG2gdCiGSJY1YFitrTzRwLmSNxhku7NbOqop+l9DLHzryikyRkSWR7Fogx0MkSFnLHpPD4GBnmCTuFZ7esGGQp/cyyMa3odxyZtewWHmMNyz3HpUnNbtmcc7mbMKsDqTMQYVIEfAx0EksMYKzh8FKHbuYo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ruLxxx+nqKgos/7BBx/k3HPP5Ze//CXDhw8nFovx9a9/ndbW1kybl156iS996UuZ9+0rX/kK27Zty6zvPv748eOxLIuLLrqo1/cS4Morr8y8TwDDhw/n4Ycf5oYbbqCwsJBvfvObAKxfv54LLriASCRCZWUlt99+eybgi0huUvAVkZwRiUR6jAauWbOGuro6Vq9ezcqVK0mlUkybNo2CggJeffVVXnvtNaLRKNOnT89s9y//8i8sW7aMf//3f2f9+vXs37+f559//ojHveGGG3jmmWd44okneP/993nqqaeIRqNUVlby61//GoC6ujoaGhr40Y9+BMCiRYv4xS9+wdKlS3nvvfeYO3cu119/PS+//DKQDuhXX301V1xxBbW1tfzjP/4j99577xHrKCsrw3Ecnn/++UPC+uG89tpr3Hzzzdxxxx3U1tZyySWXsHDhwkPabdu2jRUrVrBy5UpWrlzJyy+/zOLFizPr29vbmTdvHr///e9Zs2YNtm1z1VVX4XkeAG+++SYA//u//0tDQwO/+c1v+lRft8cee4xx48bxhz/8gfvvv59t27Yxffp0vvrVr/LHP/6RZ599lvXr13Prrbf2a78icpoxIiKnoZqaGjNjxgxjjDGe55nVq1ebUChk7rrrrsz6wYMHm0Qikdnml7/8pRk1apTxPC+zLJFImEgkYn77298aY4wpLy83S5YsyaxPpVJm6NChmWMZY8yFF15o7rjjDmOMMXV1dQYwq1ev7rXOtWvXGsB8/PHHmWXxeNzk5eWZDRs29Gh74403mmuvvdYYY8x9991nxowZ02P9Pffcc8i+Dvbd737X+P1+U1xcbKZPn26WLFliGhsbD1vPzJkzzeWXX95jH9ddd52JxWKZ1wsWLDB5eXmmpaUls+zuu+82kyZNOmwde/fuNYB55513jDHGbN++3QDmD3/4Q492B76X3WbMmGFqamoyr6uqqsyVV17Zo82NN95ovvnNb/ZY9uqrrxrbtk1nZ+dh6xKR05tGfEXktLVy5Uqi0SjhcJjLLruMmTNn8uCDD2bWjx07lmAwmHn99ttvs3XrVgoKCohGo0SjUYqLi4nH42zbto3m5mYaGhqYNGlSZhu/38/5559/2Bpqa2vx+XxceOGFfa5769atdHR0cMkll2TqiEaj/OIXv8hcHvD+++/3qANg8uTJR933woULaWxsZOnSpZx11lksXbqUM888k3feeafX9nV1dUycOLHHsoNfQ/pygwOvay4vL8/cMAewZcsWrr32WqqrqyksLGT48OEA1NfXH7Xmvji4D95++22WLVvW4/2bNm0anuexffv243JMETn1+LNdgIjIZ2XKlCk8+eSTBINBKioq8Pt7/peXn5/f43VbWxvnnXcev/rVrw7ZV0lJyTHVEIlE+r1NW1sbAKtWrWLIkCE91oVCoWOq40ADBw7kmmuu4ZprruGRRx5h/PjxPPbYYyxfvvyY9xkIBHq8tiwrcxkDwBVXXEFVVRVPP/00FRUVeJ7H2WeffdQb0WzbPuSyjFQqdUi73vryW9/6FrfffvshbYcNG3bU8xGR05OCr4ictvLz8xk5cmSf20+YMIFnn32W0tJSCgsLe21TXl7OG2+8wZe//GUAHMdh06ZNTJgwodf2Y8eOxfM8Xn75ZaZOnXrI+u4RZ9d1M8vGjBlDKBSivr7+sCPFo0ePztyo1+31118/+kn2cvwzzjjjsDd9jRo1it/97nc9lh38+mj27dtHXV0dTz/9NBdccAGQvvHs4Dqg5/sA6R84GhoaMq9d1+Xdd9/N3BR4OBMmTOBPf/pTv/pfRE5/utRBRKTLddddx6BBg5gxYwavvvoq27dvZ926ddx+++3s3LkTgDvuuIPFixezYsUKNm/ezLe//e0jzsE7fPhwampq+MY3vsGKFSsy+3zuuecAqKqqwrIsVq5cyd69e2lra6OgoIC77rqLuXPnsnz5crZt28Zbb73Fj3/848yo7M0338yWLVu4++67qaur4z/+4z9YtmzZEc9v5cqVXH/99axcuZIPPviAuro6HnvsMV544QVmzJjR6za33XYbL7zwAo8//jhbtmzhqaee4sUXX+zXdGcDBgxg4MCB/Nu//Rtbt27l//7v/5g3b16PNqWlpUQiEV566SV2795Nc3MzAH/7t3/LqlWrWLVqFZs3b2bOnDl9mvP4nnvuYcOGDdx6663U1tayZcsW/vu//1s3t4nkOAVfEZEueXl5vPLKKwwbNoyrr76a0aNHc+ONNxKPxzMjwPPnz2fWrFnU1NQwefJkCgoKuOqqq4643yeffJK///u/59vf/jZnnnkmN910U2aEdciQITz00EPce++9DB48OBPMHn74Ye6//34WLVrE6NGjmT59OqtWrcpM+zVs2DB+/etfs2LFCsaNG8fSpUt55JFHjljHmDFjyMvLY/78+Zx77rl84Qtf4LnnnuOnP/0ps2bN6nWbv/mbv2Hp0qU8/vjjjBs3jpdeeom5c+cSDof7/L7ats1//ud/smnTJs4++2zmzp17yHzKfr+fJ554gqeeeoqKiopMEP/GN75BTU0NN9xwAxdeeCHV1dVHHe0FOOecc3j55Zf54IMPuOCCCxg/fjwPPPAAFRUVfa5bRE4/ljn44ikREZEjuOmmm9i8eTOvvvpqtksREekXXeMrIiJH9Nhjj3HJJZeQn5/Piy++yPLly/nXf/3XbJclItJvGvEVEZEj+trXvsa6detobW2lurqa2267jZtvvjnbZYmI9JuCr4iIiIjkBN3cJiIiIiI5QcFXRERERHKCgq+IiIiI5AQFXxERERHJCQq+IiIiIpITFHxFREREJCco+IqIiIhITlDwFREREZGcoOArIiIiIjnh/wMY9ClqoG1oiAAAAABJRU5ErkJggg==",
1413 | "text/plain": [
1414 | ""
1415 | ]
1416 | },
1417 | "metadata": {},
1418 | "output_type": "display_data"
1419 | }
1420 | ],
1421 | "source": [
1422 | "# @title Proposed Linear Relationship: Scatter plot\n",
1423 | "\n",
1424 | "#@markdown Scatter plot of the slope against predicted signature.\n",
1425 | "predictions = [\n",
1426 | " predict_signature_from_slope(x, min_signature, max_signature)\n",
1427 | " for _, x in test_df.iterrows()\n",
1428 | "]\n",
1429 | "\n",
1430 | "fig, ax = plt.subplots(figsize=(8, 8))\n",
1431 | "sns.scatterplot(\n",
1432 | " x=predictions, y=test_df[target], alpha=0.2)\n",
1433 | "ax.set_xlabel('Predicted Signature')\n",
1434 | "ax.set_ylabel('Signature')"
1435 | ]
1436 | },
1437 | {
1438 | "cell_type": "markdown",
1439 | "metadata": {},
1440 | "source": [
1441 | "### Proposed Linear Relationship: Test Accuracy\n"
1442 | ]
1443 | },
1444 | {
1445 | "cell_type": "code",
1446 | "execution_count": 17,
1447 | "metadata": {
1448 | "cellView": "form",
1449 | "id": "HkoLDdYV_Idv"
1450 | },
1451 | "outputs": [],
1452 | "source": [
1453 | "# @title Proposed Linear Relationship: Test Accuracy\n",
1454 | "\n",
1455 | "\n",
1456 | "#@markdown In order to compute the \"test accuracy\" in the same way as before, we quantize\n",
1457 | "#@markdown the predicted signature values to even integers, between min_signature and\n",
1458 | "#@markdown max_signature.\n",
1459 | "def quantize(x, min_signature, max_signature):\n",
1460 | " return min(max(2 * round(x / 2), min_signature), max_signature)\n",
1461 | "\n",
1462 | "\n",
1463 | "quantized_predictions = [\n",
1464 | " quantize(x, min_signature, max_signature) for x in predictions\n",
1465 | "]"
1466 | ]
1467 | },
1468 | {
1469 | "cell_type": "markdown",
1470 | "metadata": {
1471 | "id": "ZhJAExt6739Y"
1472 | },
1473 | "source": [
1474 | "Now we can compute the \"test accuracy\" of this prediction.\n",
1475 | "\n",
1476 | "The value is slightly lower than for the trained network predictors (although still far higher than chance), but this is not unexpected.\n",
1477 | "\n",
1478 | "Indeed, the proposed rule gives a provable bound on the signature over all knots, instead of maximizing prediction performance over a given finite dataset, as the networks are doing. Although we do use separate training, validation and test datasets for the networks, these are all drawn from approximately the same distribution, whereas the proposed rule could be considered (in some imprecise sense) to have been \"trained\" on the set of all knots, a very different distribution.\n",
1479 | "\n",
1480 | "The correction term may also have some bias, for example tending to be positive more often than it is negative, information which the network predictors would be able to use to increase their prediction performance relative to that of the proposed rule."
1481 | ]
1482 | },
1483 | {
1484 | "cell_type": "markdown",
1485 | "metadata": {},
1486 | "source": [
1487 | "### Network output here is fixed (unmodified)\n",
1488 | "We did not modify this part but the result is always `0.738192917391447` if you are using a seed of 2"
1489 | ]
1490 | },
1491 | {
1492 | "cell_type": "code",
1493 | "execution_count": 18,
1494 | "metadata": {
1495 | "id": "2m-RE-PQ74GC"
1496 | },
1497 | "outputs": [
1498 | {
1499 | "name": "stdout",
1500 | "output_type": "stream",
1501 | "text": [
1502 | "Test Accuracy: 0.738192917391447\n"
1503 | ]
1504 | }
1505 | ],
1506 | "source": [
1507 | "#@markdown The below accuracy will probably be lower than the previous ~80%, but not by much, likely still >70%\n",
1508 | "print(\"Test Accuracy: \", np.mean(test_df[target] - quantized_predictions == 0))"
1509 | ]
1510 | }
1511 | ],
1512 | "metadata": {
1513 | "colab": {
1514 | "collapsed_sections": [],
1515 | "name": "Knot_theory",
1516 | "private_outputs": true,
1517 | "provenance": [
1518 | {
1519 | "file_id": "1tKuhjAHpuTUr5fs683eWFNPAuhmLt0uP",
1520 | "timestamp": 1632418370828
1521 | }
1522 | ]
1523 | },
1524 | "kernelspec": {
1525 | "display_name": "Python 3 (ipykernel)",
1526 | "language": "python",
1527 | "name": "python3"
1528 | },
1529 | "language_info": {
1530 | "codemirror_mode": {
1531 | "name": "ipython",
1532 | "version": 3
1533 | },
1534 | "file_extension": ".py",
1535 | "mimetype": "text/x-python",
1536 | "name": "python",
1537 | "nbconvert_exporter": "python",
1538 | "pygments_lexer": "ipython3",
1539 | "version": "3.11.7"
1540 | }
1541 | },
1542 | "nbformat": 4,
1543 | "nbformat_minor": 4
1544 | }
1545 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | jax
2 | dm-haiku
3 | optax
4 | matplotlib
5 | numpy
6 | pandas
7 | seaborn
8 | sklearn
9 |
--------------------------------------------------------------------------------
/test_ckpt.py:
--------------------------------------------------------------------------------
1 | import tempfile
2 |
3 | import haiku as hk
4 | import jax
5 | import jax.numpy as jnp
6 | import matplotlib.pyplot as plt
7 | import numpy as np
8 | import optax
9 | import seaborn as sns
10 | from sklearn.model_selection import train_test_split
11 |
12 | # These are default values provided by the original colab
13 | import random
14 | # random_seed = random.randint(0,10000)
15 | # print(f"{random_seed=}")
16 | random_seed = 2 # @param {type: "integer"}
17 | batch_size = 64 # @param {type: "integer"}
18 | learning_rate = 0.001 # @param {type: "float"}
19 | num_training_steps = 50_000 # @param {type: "integer"}
20 | validation_interval = 100 # @param {type: "integer"}
21 |
22 | prngkey = 1 # @param {type: "integer"}
23 |
24 | # @title Download data
25 | import pandas as pd
26 | import os
27 | #_, input_filename = tempfile.mkstemp()
28 | input_filename = "./knot_theory_invariants.csv"
29 | # USE YOUR OWN gsutil cp COMMAND HERE
30 | if not os.path.exists(input_filename):
31 | os.system(f"~/software/google-cloud-sdk/bin/gsutil cp gs://maths_conjectures/knot_theory/knot_theory_invariants.csv {input_filename}")
32 |
33 | full_df = pd.read_csv(input_filename)
34 |
35 | # @title Load and preprocess data
36 |
37 | #@markdown The columns of the dataset which will make up the inputs to the network.
38 | #@markdown In other words, for a knot k, X(k) will be a vector consisting of these quantities. In this case, these are the geometric invariants of each knot.
39 | #@markdown For descriptions of these invariants see https://knotinfo.math.indiana.edu/
40 | display_name_from_short_name = {
41 | 'chern_simons': 'Chern-Simons',
42 | 'cusp_volume': 'Cusp volume',
43 | 'hyperbolic_adjoint_torsion_degree': 'Adjoint Torsion Degree',
44 | 'hyperbolic_torsion_degree': 'Torsion Degree',
45 | 'injectivity_radius': 'Injectivity radius',
46 | 'longitudinal_translation': 'Longitudinal translation',
47 | 'meridinal_translation_imag': 'Re(Meridional translation)',
48 | 'meridinal_translation_real': 'Im(Meridional translation)',
49 | 'short_geodesic_imag_part': 'Im(Short geodesic)',
50 | 'short_geodesic_real_part': 'Re(Short geodesic)',
51 | 'Symmetry_0': 'Symmetry: $0$',
52 | 'Symmetry_D3': 'Symmetry: $D_3$',
53 | 'Symmetry_D4': 'Symmetry: $D_4$',
54 | 'Symmetry_D6': 'Symmetry: $D_6$',
55 | 'Symmetry_D8': 'Symmetry: $D_8$',
56 | 'Symmetry_Z/2 + Z/2': 'Symmetry: $\\frac{Z}{2} + \\frac{Z}{2}$',
57 | 'volume': 'Volume',
58 | }
59 | column_names = list(display_name_from_short_name)
60 | target = 'signature'
61 |
62 | #@markdown Split the data into a training, a validation and a holdout test set. To check
63 | #@markdown the robustness of the model and any proposed relationship, the training
64 | #@markdown process can be repeated with multiple different train/validation/test splits.
65 |
66 | #@markdown Calculate the mean and standard deviation over each column in the training
67 | #@markdown dataset. We use this to normalize each feature, this is best practice for
68 | #@markdown inputting features into a network, but is also very important in this case
69 | #@markdown to ensure the gradients used for saliency are meaningfully comparable.
70 | def normalize_features(df, cols, add_target=True):
71 | features = df[cols]
72 | sigma = features.std()
73 | if any(sigma == 0):
74 | print(sigma)
75 | raise RuntimeError(
76 | "A poor data stratification has led to no variation in one of the data "
77 | "splits for at least one feature (ie std=0). Restratify and try again.")
78 | mu = features.mean()
79 | normed_df = (features - mu) / sigma
80 | if add_target:
81 | normed_df[target] = df[target]
82 | return normed_df
83 |
84 |
85 | def get_batch(df, cols, size=None):
86 | batch_df = df if size is None else df.sample(size)
87 | X = batch_df[cols].to_numpy()
88 | y = batch_df[target].to_numpy()
89 | return X, y
90 |
91 |
92 |
93 | random_state = np.random.RandomState(random_seed)
94 | train_df, validation_and_test_df = train_test_split(
95 | full_df, random_state=random_state)
96 | validation_df, test_df = train_test_split(
97 | validation_and_test_df, test_size=.5, random_state=random_state)
98 |
99 |
100 | # normed_train_df = normalize_features(train_df, column_names)
101 | # Sometimes this line will cause a RuntimeError when running smaller networks. Just restart the kernel and try again.
102 | # normed_validation_df = normalize_features(validation_df, column_names)
103 | normed_test_df = normalize_features(test_df, column_names)
104 |
105 | test_X, test_y = get_batch(normed_test_df, column_names)
106 |
107 |
108 |
109 | # Find bounds for the signature in the training dataset.
110 | max_signature = train_df[target].max()
111 | min_signature = train_df[target].min()
112 |
113 | import argparse
114 | parser = argparse.ArgumentParser()
115 | parser.add_argument("-hn", type=int, default=3)
116 | args = parser.parse_args()
117 | hid_dim = args.hn
118 |
119 | def compacted_net_forward(inp):
120 | return hk.Sequential([
121 | hk.Linear(hid_dim),
122 | jax.nn.sigmoid,
123 | hk.Linear(int((max_signature - min_signature) / 2)+1),
124 | ])(inp)
125 | compacted_net_forward_t = hk.without_apply_rng(hk.transform(compacted_net_forward))
126 |
127 | @jax.jit
128 | def compacted_predict(params, data_X):
129 | return (np.argmax(compacted_net_forward_t.apply(params, data_X), axis=1) * 2 +
130 | min_signature)
131 |
132 | if hid_dim == 2:
133 | num_ckpt = 78
134 | elif hid_dim == 3:
135 | num_ckpt = 110
136 |
137 | import pickle
138 | with open(f'ckpts/{num_ckpt}.pickle', 'rb') as f:
139 | hk_params = pickle.load(f)
140 | print(np.mean((compacted_predict(hk_params, test_X) - test_y) == 0))
--------------------------------------------------------------------------------