perovskites_tolerance_factor.ipynb 216 KB
Newer Older
Luigi's avatar
Luigi committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div id=\"teaser\" style=' background-position:  right center; background-size: 00px; background-repeat: no-repeat; \n",
    "    padding-top: 20px;\n",
    "    padding-right: 10px;\n",
    "    padding-bottom: 170px;\n",
    "    padding-left: 10px;\n",
    "    border-bottom: 14px double #333;\n",
    "    border-top: 14px double #333;' > \n",
    "\n",
    "   <div style=\"text-align:center\">\n",
    "   <b><font size=\"6.4\">Finding a tolerance factor to predict perovskite stability with SISSO </font></b>    \n",
    "  </div>\n",
    "    \n",
    "<p>\n",
    " created by:\n",
    " Lucas Foppa<sup>1</sup>, \n",
    " Thomas Purcell<sup>1</sup>,\n",
    " Luigi Sbailò <sup> 1</sup>,\n",
    " Christopher Bartel <sup> 2</sup>,\n",
    " and Luca M. Ghiringhelli<sup>1</sup> <br><br>\n",
    "   \n",
    "<sup>1</sup> Fritz Haber Institute of the Max Planck Society, Berlin, Germany <br>\n",
    "<sup>2</sup> UC Berkeley, CA, USA <br>\n",
    "<span class=\"nomad--last-updated\" data-version=\"v1.0.0\">[Last updated: May 30, 2020]</span>\n",
    "  \n",
    "<div> \n",
    "<img  style=\"float: left;\" src=\"./assets/perovskites_tolerance_factor/Logo_MPG.png\" width=\"200\"> \n",
    "<img  style=\"float: right;\" src=\"./assets/perovskites_tolerance_factor/Logo_NOMAD.png\" width=\"250\">\n",
    "</div>\n",
    "</div>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This tutorial shows how tolerance factors for perovskite stability can be derived from data with the sure independece screening and sparsifying operator (SISSO) descriptor-identification approach.\n",
    "\n",
    "The SISSO method is described in detail in:\n",
    "\n",
    "<div style=\"padding: 1ex; margin-top: 1ex; margin-bottom: 1ex; border-style: dotted; border-width: 1pt; border-color: blue; border-radius: 3px;\">\n",
    "R. Ouyang, S. Curtarolo, E. Ahmetcik, M. Scheffler, L. M. Ghiringhelli: <span style=\"font-style: italic;\">SISSO: a compressed-sensing method for identifying the best low-dimensional descriptor in an immensity of offered candidates</span>, Phys. Rev. Materials  2, 083802 (2018) <a href=\"https://journals.aps.org/prmaterials/abstract/10.1103/PhysRevMaterials.2.083802\" target=\"_blank\">[PDF]</a> .\n",
    "</div>\n",
    "\n",
    "This tutorial is based on the following publication:\n",
    "\n",
    "<div style=\"padding: 1ex; margin-top: 1ex; margin-bottom: 1ex; border-style: dotted; border-width: 1pt; border-color: blue; border-radius: 3px;\">\n",
    "C. Bartel, C. Sutton, B. R. Goldsmith, R. Ouyang, C. B. Musgrave, Luca M. Ghiringhelli, M. Scheffler: <span style=\"font-style: italic;\">New tolerance factor to predict the stabilityof perovskite oxides and halides</span>, Sci. Adv.  5, eaav0693 (2019) <a href=\"https://advances.sciencemag.org/content/advances/5/2/eaav0693.full.pdf\" target=\"_blank\">[PDF]</a> .\n",
    "</div>\n",
    "\n",
    "# Perovskites and the Goldschmidt tolerance factor\n",
    "\n",
    "Perovskites are a class of materials having the basic formula $ABX_3$ and displaying a common structure in which a smaller metal cation $B$ (e.g. a transition metal) resides in corner-sharing octahedra of $X$ anions (e.g. $O^2-$, $Cl^-$, $Br^-$) and a larger A metal cation (e.g. alkali, alkaline earth or lanthanide) has a 12-fold coordination with the $X$ anions. This class of compounds has a remarkable variety of electronic, magnetic, optical, mechanical and transport properties, which is derived from the possibility of tuning the materials propertites by the composition. In fact, ca. 90% of the metallic natural elements of the periodic table can be stabilized in a perovskite structure. Therefore, perovskites are versatile materials suitable for a number of applications including photovoltaics, thermoelectrics and catalysis. \n",
    "\n",
    "The first step to design new perovskites is to assess their stability. For this purpose, the Goldschmidt tolerance factor, $t$, has been extensively used to predict the stability of a material in the perovskite structure based on the (Shannon) ionic radii,$r_i$, of each ion on the chemical formula $(A,B,X)$: \n",
    "\n",
    "$$ t=\\frac{r_A+r_X}{\\sqrt2(r_B+r_X)} $$\n",
    "\n",
    "$t$ measures how much the $A$-site cation fits into the corner-sharing octahedral network in a cubic crystal structure. It indicates the compatibilty of a given set of ions with the ideal, cubic perovskite structure ($t\\approx1$). Distortions from the cubic structure arise from size mismatch between cations and anions, which results in perovskite structures other than cubic (e.g. orthorhombic, rhombohedral). However, when these distortions are too large (e.g. $t<0.8$ or $t>1.05$), the perovskite structure may be unstable and non-perovskites structures are formed.\n",
    "\n",
    "The accuracy of the Goldschmidt factor is, however, often insufficient to screen for new potential materials and several modification have been proposed to overcome this issue. For instance, the input radii have been refined and the dimensionality of the factor has been increased. In this tutorial, we show how data can be used to derive tolerance factors for perovskite stability. \n",
    "\n",
    "# The SISSO method for descriptor identifcation\n",
    "\n",
    "A crucial step in data-driven materials science is the identification of descriptors, functions of parameters characterizing the phenomena governing a certain property. Descriptors allow distinguishing materials and, crucially, should be obtained (measured or calculated) more easily than the property itself, so that they can be evaluated for large sets of still unknown materials to search for new ones.\n",
    "\n",
    "The sure independence screening and sparsifying operator (SISSO) method combines a symbolic-regression-based feature construction with compressed sensing for the identification of the best low-dimensional descriptors based on data. Within SISSO feature construction, an initial set of input features (the primary features) offered by the user are systematically combined by the application of mathematical operators (e.g. addition, multiplication, exponential, square root), generating a large space (containing up to a billion elements) of candidate features. The candidate features are then ranked according to their fit to the target property (number of materials in the overlap of convex-hull regions, for the case of classification problems) and the top-ranked features are further used for descriptor selection.   \n",
    "\n",
    "For futher details on compressed sensing methods (including SISSO) for descriptor identification, a dedicated notebook is available in the NOMAD toolkit.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Import required modules"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt \n",
    "import pandas as pd\n",
    "import math\n",
    "import seaborn as sns\n",
    "\n",
    "from sisso.feature_creation.feature_space import FeatureSpace\n",
99
    "from perovskites_tolerance_factor.PredictPerovskites import PredictABX3, PredictAABBXX6\n",
Luigi's avatar
Luigi committed
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
    "\n",
    "from sklearn import tree\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn import metrics \n",
    "from sklearn.calibration import CalibratedClassifierCV  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Get the data\n",
    "The data consists of a list of 576 $ABX_3$ solids experimentally-characterized at ambient conditions, classified as stable or unstable at the perovskite structure, together with the following features:\n",
    "<div >\n",
    "\n",
    "<ul>\n",
    "      <li>$r_A, r_B, r_X$: Shannon ionic radii of each ion, with $r_A>r_B$ </li>\n",
    "      <li>$n_A, n_B, n_X$: oxidation satates of each ion </li>\n",
    "      <li>$\\frac{r_A}{r_B}, \\frac{r_A}{r_X}, \\frac{r_B}{r_x}$: ionic radii ratios </li>\n",
    "       <li>$Z_A, Z_B, Z_X$: nuclear charges </li>\n",
    "      <li>$r_{s,A}, r_{s,B}, r_{s,X}$: calculated radius where the radial distribution of the $s$ orbital has its maximum </li>\n",
    "      <li>$r_{p,A}, r_{p,B}, r_{p,X}$: calculated radius where the radial distribution of the $p$ orbital has its maximum</li>\n",
    "      <li>$HOMO_A, HOMO_B, HOMO_X$: calculated energy of the highest occupied atomic orbital</li>\n",
    "      <li>$LUMO_A, LUMO_B, LUMO_X$: calculated energy of the lowest unoccupied atomic orbital</li>\n",
    "      <li>$EA_A, EA_B, EA_X$: calculated electron affinity</li>\n",
    "      <li>$IP_A, IP_B, IP_X$: calculated ionization potential</li>\n",
    "</div> \n",
    "    \n",
    "The calculated features were obtained with DFT-PBE using the FHI-aims all-electron full-potential code and correspond to properties of isolated atoms. \n"
   ]
  },
  {
   "cell_type": "code",
133
   "execution_count": 3,
Luigi's avatar
Luigi committed
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>exp_label</th>\n",
       "      <th>rA (AA)</th>\n",
       "      <th>rB (AA)</th>\n",
       "      <th>rX (AA)</th>\n",
       "      <th>nA (Unitless)</th>\n",
       "      <th>nB (Unitless)</th>\n",
       "      <th>nX(Unitless)</th>\n",
       "      <th>rA_rB_ratio (Unitless)</th>\n",
       "      <th>rA_rX_ratio (Unitless)</th>\n",
       "      <th>rB_rX_ratio (Unitless)</th>\n",
       "      <th>...</th>\n",
       "      <th>LUMO_B (eV)</th>\n",
       "      <th>EA_B (eV)</th>\n",
       "      <th>IP_B (eV)</th>\n",
       "      <th>rS_X (AA)</th>\n",
       "      <th>rP_X (AA)</th>\n",
       "      <th>Z_X (elem_charge)</th>\n",
       "      <th>HOMO_X (eV)</th>\n",
       "      <th>LUMO_X (eV)</th>\n",
       "      <th>EA_X (eV)</th>\n",
       "      <th>IP_X  (eV)</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>material</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>AgBrO3</th>\n",
       "      <td>-1</td>\n",
       "      <td>1.28</td>\n",
       "      <td>0.31</td>\n",
       "      <td>1.40</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>-2</td>\n",
       "      <td>4.12903</td>\n",
       "      <td>0.914286</td>\n",
       "      <td>0.221429</td>\n",
       "      <td>...</td>\n",
       "      <td>0.055110</td>\n",
       "      <td>-3.678151</td>\n",
       "      <td>12.554312</td>\n",
       "      <td>0.4608</td>\n",
       "      <td>0.4333</td>\n",
       "      <td>8</td>\n",
       "      <td>-9.030485</td>\n",
       "      <td>-0.068724</td>\n",
       "      <td>-3.078804</td>\n",
       "      <td>16.431366</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AgCdBr3</th>\n",
       "      <td>-1</td>\n",
       "      <td>1.28</td>\n",
       "      <td>0.95</td>\n",
       "      <td>1.96</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>-1</td>\n",
       "      <td>1.34737</td>\n",
       "      <td>0.653061</td>\n",
       "      <td>0.484694</td>\n",
       "      <td>...</td>\n",
       "      <td>-1.157118</td>\n",
       "      <td>0.948262</td>\n",
       "      <td>9.271930</td>\n",
       "      <td>0.7514</td>\n",
       "      <td>0.8834</td>\n",
       "      <td>35</td>\n",
       "      <td>-7.858439</td>\n",
       "      <td>0.055110</td>\n",
       "      <td>-3.678151</td>\n",
       "      <td>12.554312</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>PbAgBr3</th>\n",
       "      <td>-1</td>\n",
       "      <td>1.49</td>\n",
       "      <td>1.15</td>\n",
       "      <td>1.96</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>-1</td>\n",
       "      <td>1.29565</td>\n",
       "      <td>0.760204</td>\n",
       "      <td>0.586735</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.246293</td>\n",
       "      <td>-1.475587</td>\n",
       "      <td>7.755963</td>\n",
       "      <td>0.7514</td>\n",
       "      <td>0.8834</td>\n",
       "      <td>35</td>\n",
       "      <td>-7.858439</td>\n",
       "      <td>0.055110</td>\n",
       "      <td>-3.678151</td>\n",
       "      <td>12.554312</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AgCaCl3</th>\n",
       "      <td>-1</td>\n",
       "      <td>1.28</td>\n",
       "      <td>1.00</td>\n",
       "      <td>1.81</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>-1</td>\n",
       "      <td>1.28000</td>\n",
       "      <td>0.707182</td>\n",
       "      <td>0.552486</td>\n",
       "      <td>...</td>\n",
       "      <td>-1.945848</td>\n",
       "      <td>0.149995</td>\n",
       "      <td>6.309260</td>\n",
       "      <td>0.6785</td>\n",
       "      <td>0.7567</td>\n",
       "      <td>17</td>\n",
       "      <td>-8.594666</td>\n",
       "      <td>0.019724</td>\n",
       "      <td>-3.935230</td>\n",
       "      <td>13.876021</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AgClO3</th>\n",
       "      <td>-1</td>\n",
       "      <td>1.28</td>\n",
       "      <td>0.12</td>\n",
       "      <td>1.40</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>-2</td>\n",
       "      <td>10.66670</td>\n",
       "      <td>0.914286</td>\n",
       "      <td>0.085714</td>\n",
       "      <td>...</td>\n",
       "      <td>0.019724</td>\n",
       "      <td>-3.935230</td>\n",
       "      <td>13.876021</td>\n",
       "      <td>0.4608</td>\n",
       "      <td>0.4333</td>\n",
       "      <td>8</td>\n",
       "      <td>-9.030485</td>\n",
       "      <td>-0.068724</td>\n",
       "      <td>-3.078804</td>\n",
       "      <td>16.431366</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>RbUO3</th>\n",
       "      <td>1</td>\n",
       "      <td>1.72</td>\n",
       "      <td>0.76</td>\n",
       "      <td>1.40</td>\n",
       "      <td>1</td>\n",
       "      <td>5</td>\n",
       "      <td>-2</td>\n",
       "      <td>2.26316</td>\n",
       "      <td>1.228570</td>\n",
       "      <td>0.542857</td>\n",
       "      <td>...</td>\n",
       "      <td>-1.995273</td>\n",
       "      <td>0.546862</td>\n",
       "      <td>5.590258</td>\n",
       "      <td>0.4608</td>\n",
       "      <td>0.4333</td>\n",
       "      <td>8</td>\n",
       "      <td>-9.030485</td>\n",
       "      <td>-0.068724</td>\n",
       "      <td>-3.078804</td>\n",
       "      <td>16.431366</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SmTiO3</th>\n",
       "      <td>1</td>\n",
       "      <td>1.24</td>\n",
       "      <td>0.67</td>\n",
       "      <td>1.40</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>-2</td>\n",
       "      <td>1.85075</td>\n",
       "      <td>0.885714</td>\n",
       "      <td>0.478571</td>\n",
       "      <td>...</td>\n",
       "      <td>-4.219539</td>\n",
       "      <td>-0.313899</td>\n",
       "      <td>7.119307</td>\n",
       "      <td>0.4608</td>\n",
       "      <td>0.4333</td>\n",
       "      <td>8</td>\n",
       "      <td>-9.030485</td>\n",
       "      <td>-0.068724</td>\n",
       "      <td>-3.078804</td>\n",
       "      <td>16.431366</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SrTeO3</th>\n",
       "      <td>-1</td>\n",
       "      <td>1.44</td>\n",
       "      <td>0.97</td>\n",
       "      <td>1.40</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>-2</td>\n",
       "      <td>1.48454</td>\n",
       "      <td>1.028570</td>\n",
       "      <td>0.692857</td>\n",
       "      <td>...</td>\n",
       "      <td>0.193946</td>\n",
       "      <td>-2.575489</td>\n",
       "      <td>9.729526</td>\n",
       "      <td>0.4608</td>\n",
       "      <td>0.4333</td>\n",
       "      <td>8</td>\n",
       "      <td>-9.030485</td>\n",
       "      <td>-0.068724</td>\n",
       "      <td>-3.078804</td>\n",
       "      <td>16.431366</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SrTiO3</th>\n",
       "      <td>1</td>\n",
       "      <td>1.44</td>\n",
       "      <td>0.60</td>\n",
       "      <td>1.40</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>-2</td>\n",
       "      <td>2.40000</td>\n",
       "      <td>1.028570</td>\n",
       "      <td>0.428571</td>\n",
       "      <td>...</td>\n",
       "      <td>-4.219539</td>\n",
       "      <td>-0.313899</td>\n",
       "      <td>7.119307</td>\n",
       "      <td>0.4608</td>\n",
       "      <td>0.4333</td>\n",
       "      <td>8</td>\n",
       "      <td>-9.030485</td>\n",
       "      <td>-0.068724</td>\n",
       "      <td>-3.078804</td>\n",
       "      <td>16.431366</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>YTmO3</th>\n",
       "      <td>-1</td>\n",
       "      <td>1.08</td>\n",
       "      <td>0.88</td>\n",
       "      <td>1.40</td>\n",
       "      <td>3</td>\n",
       "      <td>3</td>\n",
       "      <td>-2</td>\n",
       "      <td>1.22727</td>\n",
       "      <td>0.771429</td>\n",
       "      <td>0.628571</td>\n",
       "      <td>...</td>\n",
       "      <td>-1.072406</td>\n",
       "      <td>0.522244</td>\n",
       "      <td>6.424662</td>\n",
       "      <td>0.4608</td>\n",
       "      <td>0.4333</td>\n",
       "      <td>8</td>\n",
       "      <td>-9.030485</td>\n",
       "      <td>-0.068724</td>\n",
       "      <td>-3.078804</td>\n",
       "      <td>16.431366</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>576 rows × 31 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          exp_label  rA (AA)  rB (AA)  rX (AA)  nA (Unitless)  nB (Unitless)  \\\n",
       "material                                                                       \n",
       "AgBrO3           -1     1.28     0.31     1.40              1              5   \n",
       "AgCdBr3          -1     1.28     0.95     1.96              1              2   \n",
       "PbAgBr3          -1     1.49     1.15     1.96              2              1   \n",
       "AgCaCl3          -1     1.28     1.00     1.81              1              2   \n",
       "AgClO3           -1     1.28     0.12     1.40              1              5   \n",
       "...             ...      ...      ...      ...            ...            ...   \n",
       "RbUO3             1     1.72     0.76     1.40              1              5   \n",
       "SmTiO3            1     1.24     0.67     1.40              3              3   \n",
       "SrTeO3           -1     1.44     0.97     1.40              2              4   \n",
       "SrTiO3            1     1.44     0.60     1.40              2              4   \n",
       "YTmO3            -1     1.08     0.88     1.40              3              3   \n",
       "\n",
       "          nX(Unitless)  rA_rB_ratio (Unitless)  rA_rX_ratio (Unitless)  \\\n",
       "material                                                                 \n",
       "AgBrO3              -2                 4.12903                0.914286   \n",
       "AgCdBr3             -1                 1.34737                0.653061   \n",
       "PbAgBr3             -1                 1.29565                0.760204   \n",
       "AgCaCl3             -1                 1.28000                0.707182   \n",
       "AgClO3              -2                10.66670                0.914286   \n",
       "...                ...                     ...                     ...   \n",
       "RbUO3               -2                 2.26316                1.228570   \n",
       "SmTiO3              -2                 1.85075                0.885714   \n",
       "SrTeO3              -2                 1.48454                1.028570   \n",
       "SrTiO3              -2                 2.40000                1.028570   \n",
       "YTmO3               -2                 1.22727                0.771429   \n",
       "\n",
       "          rB_rX_ratio (Unitless)  ...  LUMO_B (eV)  EA_B (eV)  IP_B (eV)  \\\n",
       "material                          ...                                      \n",
       "AgBrO3                  0.221429  ...     0.055110  -3.678151  12.554312   \n",
       "AgCdBr3                 0.484694  ...    -1.157118   0.948262   9.271930   \n",
       "PbAgBr3                 0.586735  ...    -0.246293  -1.475587   7.755963   \n",
       "AgCaCl3                 0.552486  ...    -1.945848   0.149995   6.309260   \n",
       "AgClO3                  0.085714  ...     0.019724  -3.935230  13.876021   \n",
       "...                          ...  ...          ...        ...        ...   \n",
       "RbUO3                   0.542857  ...    -1.995273   0.546862   5.590258   \n",
       "SmTiO3                  0.478571  ...    -4.219539  -0.313899   7.119307   \n",
       "SrTeO3                  0.692857  ...     0.193946  -2.575489   9.729526   \n",
       "SrTiO3                  0.428571  ...    -4.219539  -0.313899   7.119307   \n",
       "YTmO3                   0.628571  ...    -1.072406   0.522244   6.424662   \n",
       "\n",
       "          rS_X (AA)  rP_X (AA)  Z_X (elem_charge)  HOMO_X (eV)  LUMO_X (eV)  \\\n",
       "material                                                                      \n",
       "AgBrO3       0.4608     0.4333                  8    -9.030485    -0.068724   \n",
       "AgCdBr3      0.7514     0.8834                 35    -7.858439     0.055110   \n",
       "PbAgBr3      0.7514     0.8834                 35    -7.858439     0.055110   \n",
       "AgCaCl3      0.6785     0.7567                 17    -8.594666     0.019724   \n",
       "AgClO3       0.4608     0.4333                  8    -9.030485    -0.068724   \n",
       "...             ...        ...                ...          ...          ...   \n",
       "RbUO3        0.4608     0.4333                  8    -9.030485    -0.068724   \n",
       "SmTiO3       0.4608     0.4333                  8    -9.030485    -0.068724   \n",
       "SrTeO3       0.4608     0.4333                  8    -9.030485    -0.068724   \n",
       "SrTiO3       0.4608     0.4333                  8    -9.030485    -0.068724   \n",
       "YTmO3        0.4608     0.4333                  8    -9.030485    -0.068724   \n",
       "\n",
       "          EA_X (eV)  IP_X  (eV)  \n",
       "material                         \n",
       "AgBrO3    -3.078804   16.431366  \n",
       "AgCdBr3   -3.678151   12.554312  \n",
       "PbAgBr3   -3.678151   12.554312  \n",
       "AgCaCl3   -3.935230   13.876021  \n",
       "AgClO3    -3.078804   16.431366  \n",
       "...             ...         ...  \n",
       "RbUO3     -3.078804   16.431366  \n",
       "SmTiO3    -3.078804   16.431366  \n",
       "SrTeO3    -3.078804   16.431366  \n",
       "SrTiO3    -3.078804   16.431366  \n",
       "YTmO3     -3.078804   16.431366  \n",
       "\n",
       "[576 rows x 31 columns]"
      ]
     },
548
     "execution_count": 3,
Luigi's avatar
Luigi committed
549
550
551
552
553
554
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#load data\n",
555
    "df = pd.read_csv(\"data/perovskites_tolerance_factor/data_perovskite.csv\", index_col=0)\n",
Luigi's avatar
Luigi committed
556
557
558
559
560
561
562
    "\n",
    "#show data\n",
    "df"
   ]
  },
  {
   "cell_type": "code",
563
   "execution_count": 4,
Luigi's avatar
Luigi committed
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "In the whole dataset, 313 compositions are unstable and 263 are stable.\n"
     ]
    }
   ],
   "source": [
    "#count the number of material in each class in the whole dataset\n",
    "print('In the whole dataset, %s compositions are unstable and %s are stable.' % (df['exp_label'].value_counts().values[0], df['exp_label'].value_counts().values[1]))"
   ]
  },
  {
   "cell_type": "code",
581
   "execution_count": 5,
Luigi's avatar
Luigi committed
582
583
584
585
586
587
588
589
590
   "metadata": {},
   "outputs": [],
   "source": [
    "#split the data in 80% training and 20% testing\n",
    "train,test=train_test_split(df,test_size=0.2)"
   ]
  },
  {
   "cell_type": "code",
591
   "execution_count": 6,
Luigi's avatar
Luigi committed
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "In the training set, 237 compositions are unstable and 223 are stable.\n",
      "In the test set, 76 compositions are unstable and 40 are stable.\n"
     ]
    }
   ],
   "source": [
    "#count the number of material in each class in the training/test sets\n",
    "print('In the training set, %s compositions are unstable and %s are stable.' % (train['exp_label'].value_counts().values[0], train['exp_label'].value_counts().values[1]))\n",
    "print('In the test set, %s compositions are unstable and %s are stable.' % (test['exp_label'].value_counts().values[0], test['exp_label'].value_counts().values[1]))"
   ]
  },
  {
   "cell_type": "code",
611
   "execution_count": 7,
Luigi's avatar
Luigi committed
612
613
614
615
616
617
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
618
      "<ipython-input-7-da9e169065e3>:2: SettingWithCopyWarning: \n",
Luigi's avatar
Luigi committed
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
      "A value is trying to be set on a copy of a slice from a DataFrame\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  train.sort_values(by=['exp_label'],inplace=True)\n"
     ]
    }
   ],
   "source": [
    "#sort the training data by the labels (stable/unstable)\n",
    "train.sort_values(by=['exp_label'],inplace=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Generate the candidate features space from the primary features and operators\n",
    "The two ingredients to create the feature space with SISSO are the features to be used (i.e. the primary features) and the set of mathematical operators to be applied. Another input from the user is the number of times the operators are applied, the so-called rung (max_phi).  "
   ]
  },
  {
   "cell_type": "code",
641
   "execution_count": 8,
Luigi's avatar
Luigi committed
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
   "metadata": {},
   "outputs": [],
   "source": [
    "#define list of primary features - user has to choose\n",
    "cols = [\n",
    "#    'rA (AA)',\n",
    "#    'rB (AA)',\n",
    "#    'rX (AA)',\n",
    "    'nA (Unitless)',\n",
    "#    'nB (Unitless)',\n",
    "#    'nX(Unitless)',\n",
    "    'rA_rB_ratio (Unitless)',\n",
    "#    'rA_rX_ratio (Unitless)',\n",
    "    'rB_rX_ratio (Unitless)',\n",
    "#    'rS_A (AA)',\n",
    "#    'rP_A (AA)',\n",
    "#    'Z_A (elem_charge)',\n",
    "#    'HOMO_A (eV)',\n",
    "#    'LUMO_A (eV)',\n",
    "#    'EA_A (eV)',\n",
    "#    'IP_A (eV)',\n",
    "#    'rS_B (AA)',\n",
    "#    'rP_B (AA)',\n",
    "#    'Z_B (elem_charge)',\n",
    "#    'HOMO_B (eV)',\n",
    "#    'LUMO_B (eV)',\n",
    "#    'EA_B (eV)',\n",
    "#    'IP_B (eV)',\n",
    "#    'rS_X (AA)',\n",
    "#    'rP_X (AA)',\n",
    "#    'Z_X (elem_charge)',\n",
    "#    'HOMO_X (eV)',\n",
    "#    'LUMO_X (eV)',\n",
    "#    'EA_X (eV)',\n",
    "#    'IP_X  (eV)'\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
682
   "execution_count": 9,
Luigi's avatar
Luigi committed
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
   "metadata": {},
   "outputs": [],
   "source": [
    "#define list of operators - user has to choose\n",
    "ops = [\n",
    "#    \"add\",\n",
    "    \"sub\",\n",
    "#    \"abs_diff\",\n",
    "    \"mult\",\n",
    "    \"div\",\n",
    "#    \"exp\",\n",
    "#    \"neg_exp\",\n",
    "    \"inv\",\n",
    "#    \"sq\",\n",
    "#    \"cb\",\n",
    "#    \"sixth_power\",\n",
    "#    \"sqrt\",\n",
    "#    \"cbrt\",\n",
    "    \"log\",\n",
    "#    \"abs\",\n",
    "#    \"sin\",\n",
    "#    \"cos\",\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
710
   "execution_count": 10,
Luigi's avatar
Luigi committed
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/sbailo/anaconda3/envs/sisso/lib/python3.8/site-packages/sisso/feature_creation/nodes/functions.py:41: RuntimeWarning: divide by zero encountered in true_divide\n",
      "  return np.divide(1.0, alpha * x + a) + c\n",
      "/home/sbailo/anaconda3/envs/sisso/lib/python3.8/site-packages/sisso/feature_creation/nodes/functions.py:71: RuntimeWarning: divide by zero encountered in log\n",
      "  return alpha * np.log(x + a) + c\n",
      "/home/sbailo/anaconda3/envs/sisso/lib/python3.8/site-packages/sisso/feature_creation/nodes/functions.py:71: RuntimeWarning: invalid value encountered in log\n",
      "  return alpha * np.log(x + a) + c\n",
      "/home/sbailo/anaconda3/envs/sisso/lib/python3.8/site-packages/sisso/feature_creation/nodes/functions.py:26: RuntimeWarning: divide by zero encountered in true_divide\n",
      "  return np.divide(x[pvt:], x[:pvt] * alpha + a) + c\n",
      "/home/sbailo/anaconda3/envs/sisso/lib/python3.8/site-packages/sisso/feature_creation/nodes/functions.py:26: RuntimeWarning: invalid value encountered in true_divide\n",
      "  return np.divide(x[pvt:], x[:pvt] * alpha + a) + c\n"
     ]
    }
   ],
   "source": [
    "#feature space creation - user has to choose rung\n",
    "fs = FeatureSpace.from_df(\n",
    "    train,\n",
    "    \"exp_label\",\n",
    "    ops,\n",
    "    cols,\n",
    "    max_phi=3,  # rung\n",
    "    n_sis_select=100,\n",
    "    parameterize=False,\n",
    "    fix_c_0=False,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
746
   "execution_count": 11,
Luigi's avatar
Luigi committed
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>nA ()</th>\n",
       "      <th>rA_rB_ratio ()</th>\n",
       "      <th>rB_rX_ratio ()</th>\n",
       "      <th>nA - rA_rB_ratio ()</th>\n",
       "      <th>nA*rA_rB_ratio ()</th>\n",
       "      <th>nA - rB_rX_ratio ()</th>\n",
       "      <th>nA*rB_rX_ratio ()</th>\n",
       "      <th>rA_rB_ratio - rB_rX_ratio ()</th>\n",
       "      <th>rA_rB_ratio*rB_rX_ratio ()</th>\n",
       "      <th>-nA*rA_rB_ratio + nA - rA_rB_ratio ()</th>\n",
       "      <th>...</th>\n",
       "      <th>1.0/rB_rX_ratio ()</th>\n",
       "      <th>1.0*rB_rX_ratio ()</th>\n",
       "      <th>1.0*rA_rB_ratio/rB_rX_ratio**2 ()</th>\n",
       "      <th>1.0*rB_rX_ratio**2/rA_rB_ratio ()</th>\n",
       "      <th>1.0*rB_rX_ratio/(nA*rA_rB_ratio) ()</th>\n",
       "      <th>1.0*nA*rA_rB_ratio/rB_rX_ratio ()</th>\n",
       "      <th>1.0*rB_rX_ratio/rA_rB_ratio**2 ()</th>\n",
       "      <th>1.0*rA_rB_ratio**2/rB_rX_ratio ()</th>\n",
       "      <th>1.0/rA_rB_ratio ()</th>\n",
       "      <th>1.0*rA_rB_ratio ()</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>material</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>FeGaO3</th>\n",
       "      <td>3.0</td>\n",
       "      <td>1.25806</td>\n",
       "      <td>0.442857</td>\n",
       "      <td>-1.74194</td>\n",
       "      <td>3.77418</td>\n",
       "      <td>-2.557143</td>\n",
       "      <td>1.328571</td>\n",
       "      <td>-0.815203</td>\n",
       "      <td>0.557141</td>\n",
       "      <td>5.51612</td>\n",
       "      <td>...</td>\n",
       "      <td>3.573874</td>\n",
       "      <td>0.279808</td>\n",
       "      <td>1.25806</td>\n",
       "      <td>0.794875</td>\n",
       "      <td>1.056047</td>\n",
       "      <td>0.946927</td>\n",
       "      <td>0.442857</td>\n",
       "      <td>2.258065</td>\n",
       "      <td>0.155893</td>\n",
       "      <td>6.414670</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>TlBeCl3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>3.77778</td>\n",
       "      <td>0.248619</td>\n",
       "      <td>2.77778</td>\n",
       "      <td>3.77778</td>\n",
       "      <td>-0.751381</td>\n",
       "      <td>0.248619</td>\n",
       "      <td>-3.529161</td>\n",
       "      <td>0.939228</td>\n",
       "      <td>1.00000</td>\n",
       "      <td>...</td>\n",
       "      <td>57.403584</td>\n",
       "      <td>0.017421</td>\n",
       "      <td>3.77778</td>\n",
       "      <td>0.264706</td>\n",
       "      <td>0.065811</td>\n",
       "      <td>15.195057</td>\n",
       "      <td>0.248619</td>\n",
       "      <td>4.022219</td>\n",
       "      <td>0.016362</td>\n",
       "      <td>61.117845</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>BaTeO3</th>\n",
       "      <td>2.0</td>\n",
       "      <td>1.65979</td>\n",
       "      <td>0.692857</td>\n",
       "      <td>-0.34021</td>\n",
       "      <td>3.31958</td>\n",
       "      <td>-1.307143</td>\n",
       "      <td>1.385714</td>\n",
       "      <td>-0.966933</td>\n",
       "      <td>1.149997</td>\n",
       "      <td>3.65979</td>\n",
       "      <td>...</td>\n",
       "      <td>3.976149</td>\n",
       "      <td>0.251500</td>\n",
       "      <td>1.65979</td>\n",
       "      <td>0.602486</td>\n",
       "      <td>0.834873</td>\n",
       "      <td>1.197787</td>\n",
       "      <td>0.692857</td>\n",
       "      <td>1.443299</td>\n",
       "      <td>0.289224</td>\n",
       "      <td>3.457530</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AgCdBr3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1.34737</td>\n",
       "      <td>0.484694</td>\n",
       "      <td>0.34737</td>\n",
       "      <td>1.34737</td>\n",
       "      <td>-0.515306</td>\n",
       "      <td>0.484694</td>\n",
       "      <td>-0.862676</td>\n",
       "      <td>0.653062</td>\n",
       "      <td>1.00000</td>\n",
       "      <td>...</td>\n",
       "      <td>3.745468</td>\n",
       "      <td>0.266989</td>\n",
       "      <td>1.34737</td>\n",
       "      <td>0.742187</td>\n",
       "      <td>0.359733</td>\n",
       "      <td>2.779836</td>\n",
       "      <td>0.484694</td>\n",
       "      <td>2.063157</td>\n",
       "      <td>0.174361</td>\n",
       "      <td>5.735240</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AgVO3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2.37037</td>\n",
       "      <td>0.385714</td>\n",
       "      <td>1.37037</td>\n",
       "      <td>2.37037</td>\n",
       "      <td>-0.614286</td>\n",
       "      <td>0.385714</td>\n",
       "      <td>-1.984656</td>\n",
       "      <td>0.914285</td>\n",
       "      <td>1.00000</td>\n",
       "      <td>...</td>\n",
       "      <td>14.566891</td>\n",
       "      <td>0.068649</td>\n",
       "      <td>2.37037</td>\n",
       "      <td>0.421875</td>\n",
       "      <td>0.162723</td>\n",
       "      <td>6.145408</td>\n",
       "      <td>0.385714</td>\n",
       "      <td>2.592595</td>\n",
       "      <td>0.062765</td>\n",
       "      <td>15.932552</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>EuCrO3</th>\n",
       "      <td>3.0</td>\n",
       "      <td>1.80645</td>\n",
       "      <td>0.442857</td>\n",
       "      <td>-1.19355</td>\n",
       "      <td>5.41935</td>\n",
       "      <td>-2.557143</td>\n",
       "      <td>1.328571</td>\n",
       "      <td>-1.363593</td>\n",
       "      <td>0.799999</td>\n",
       "      <td>6.61290</td>\n",
       "      <td>...</td>\n",
       "      <td>7.368658</td>\n",
       "      <td>0.135710</td>\n",
       "      <td>1.80645</td>\n",
       "      <td>0.553572</td>\n",
       "      <td>0.735460</td>\n",
       "      <td>1.359694</td>\n",
       "      <td>0.442857</td>\n",
       "      <td>2.258065</td>\n",
       "      <td>0.108568</td>\n",
       "      <td>9.210833</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>YAlO3</th>\n",
       "      <td>3.0</td>\n",
       "      <td>2.00000</td>\n",
       "      <td>0.385714</td>\n",
       "      <td>-1.00000</td>\n",
       "      <td>6.00000</td>\n",
       "      <td>-2.614286</td>\n",
       "      <td>1.157142</td>\n",
       "      <td>-1.614286</td>\n",
       "      <td>0.771428</td>\n",
       "      <td>7.00000</td>\n",
       "      <td>...</td>\n",
       "      <td>10.370378</td>\n",
       "      <td>0.096429</td>\n",
       "      <td>2.00000</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>0.578571</td>\n",
       "      <td>1.728396</td>\n",
       "      <td>0.385714</td>\n",
       "      <td>2.592595</td>\n",
       "      <td>0.074388</td>\n",
       "      <td>13.443093</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LuFeO3</th>\n",
       "      <td>3.0</td>\n",
       "      <td>1.60938</td>\n",
       "      <td>0.457143</td>\n",
       "      <td>-1.39062</td>\n",
       "      <td>4.82814</td>\n",
       "      <td>-2.542857</td>\n",
       "      <td>1.371429</td>\n",
       "      <td>-1.152237</td>\n",
       "      <td>0.735717</td>\n",
       "      <td>6.21876</td>\n",
       "      <td>...</td>\n",
       "      <td>5.665851</td>\n",
       "      <td>0.176496</td>\n",
       "      <td>1.60938</td>\n",
       "      <td>0.621357</td>\n",
       "      <td>0.852147</td>\n",
       "      <td>1.173506</td>\n",
       "      <td>0.457143</td>\n",
       "      <td>2.187499</td>\n",
       "      <td>0.129851</td>\n",
       "      <td>7.701130</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>YGaO3</th>\n",
       "      <td>3.0</td>\n",
       "      <td>1.74194</td>\n",
       "      <td>0.442857</td>\n",
       "      <td>-1.25806</td>\n",
       "      <td>5.22582</td>\n",
       "      <td>-2.557143</td>\n",
       "      <td>1.328571</td>\n",
       "      <td>-1.299083</td>\n",
       "      <td>0.771430</td>\n",
       "      <td>6.48388</td>\n",
       "      <td>...</td>\n",
       "      <td>6.851771</td>\n",
       "      <td>0.145948</td>\n",
       "      <td>1.74194</td>\n",
       "      <td>0.574073</td>\n",
       "      <td>0.762696</td>\n",
       "      <td>1.311138</td>\n",
       "      <td>0.442857</td>\n",
       "      <td>2.258065</td>\n",
       "      <td>0.112588</td>\n",
       "      <td>8.881906</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>TlMnCl3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2.04819</td>\n",
       "      <td>0.458564</td>\n",
       "      <td>1.04819</td>\n",
       "      <td>2.04819</td>\n",
       "      <td>-0.541436</td>\n",
       "      <td>0.458564</td>\n",
       "      <td>-1.589626</td>\n",
       "      <td>0.939226</td>\n",
       "      <td>1.00000</td>\n",
       "      <td>...</td>\n",
       "      <td>9.148303</td>\n",
       "      <td>0.109310</td>\n",
       "      <td>2.04819</td>\n",
       "      <td>0.488236</td>\n",
       "      <td>0.223887</td>\n",
       "      <td>4.466530</td>\n",
       "      <td>0.458564</td>\n",
       "      <td>2.180721</td>\n",
       "      <td>0.102667</td>\n",
       "      <td>9.740255</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>460 rows × 823 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          nA ()  rA_rB_ratio ()  rB_rX_ratio ()  nA - rA_rB_ratio ()  \\\n",
       "material                                                               \n",
       "FeGaO3      3.0         1.25806        0.442857             -1.74194   \n",
       "TlBeCl3     1.0         3.77778        0.248619              2.77778   \n",
       "BaTeO3      2.0         1.65979        0.692857             -0.34021   \n",
       "AgCdBr3     1.0         1.34737        0.484694              0.34737   \n",
       "AgVO3       1.0         2.37037        0.385714              1.37037   \n",
       "...         ...             ...             ...                  ...   \n",
       "EuCrO3      3.0         1.80645        0.442857             -1.19355   \n",
       "YAlO3       3.0         2.00000        0.385714             -1.00000   \n",
       "LuFeO3      3.0         1.60938        0.457143             -1.39062   \n",
       "YGaO3       3.0         1.74194        0.442857             -1.25806   \n",
       "TlMnCl3     1.0         2.04819        0.458564              1.04819   \n",
       "\n",
       "          nA*rA_rB_ratio ()  nA - rB_rX_ratio ()  nA*rB_rX_ratio ()  \\\n",
       "material                                                              \n",
       "FeGaO3              3.77418            -2.557143           1.328571   \n",
       "TlBeCl3             3.77778            -0.751381           0.248619   \n",
       "BaTeO3              3.31958            -1.307143           1.385714   \n",
       "AgCdBr3             1.34737            -0.515306           0.484694   \n",
       "AgVO3               2.37037            -0.614286           0.385714   \n",
       "...                     ...                  ...                ...   \n",
       "EuCrO3              5.41935            -2.557143           1.328571   \n",
       "YAlO3               6.00000            -2.614286           1.157142   \n",
       "LuFeO3              4.82814            -2.542857           1.371429   \n",
       "YGaO3               5.22582            -2.557143           1.328571   \n",
       "TlMnCl3             2.04819            -0.541436           0.458564   \n",
       "\n",
       "          rA_rB_ratio - rB_rX_ratio ()  rA_rB_ratio*rB_rX_ratio ()  \\\n",
       "material                                                             \n",
       "FeGaO3                       -0.815203                    0.557141   \n",
       "TlBeCl3                      -3.529161                    0.939228   \n",
       "BaTeO3                       -0.966933                    1.149997   \n",
       "AgCdBr3                      -0.862676                    0.653062   \n",
       "AgVO3                        -1.984656                    0.914285   \n",
       "...                                ...                         ...   \n",
       "EuCrO3                       -1.363593                    0.799999   \n",
       "YAlO3                        -1.614286                    0.771428   \n",
       "LuFeO3                       -1.152237                    0.735717   \n",
       "YGaO3                        -1.299083                    0.771430   \n",
       "TlMnCl3                      -1.589626                    0.939226   \n",
       "\n",
       "          -nA*rA_rB_ratio + nA - rA_rB_ratio ()  ...  1.0/rB_rX_ratio ()  \\\n",
       "material                                         ...                       \n",
       "FeGaO3                                  5.51612  ...            3.573874   \n",
       "TlBeCl3                                 1.00000  ...           57.403584   \n",
       "BaTeO3                                  3.65979  ...            3.976149   \n",
       "AgCdBr3                                 1.00000  ...            3.745468   \n",
       "AgVO3                                   1.00000  ...           14.566891   \n",
       "...                                         ...  ...                 ...   \n",
       "EuCrO3                                  6.61290  ...            7.368658   \n",
       "YAlO3                                   7.00000  ...           10.370378   \n",
       "LuFeO3                                  6.21876  ...            5.665851   \n",
       "YGaO3                                   6.48388  ...            6.851771   \n",
       "TlMnCl3                                 1.00000  ...            9.148303   \n",
       "\n",
       "          1.0*rB_rX_ratio ()  1.0*rA_rB_ratio/rB_rX_ratio**2 ()  \\\n",
       "material                                                          \n",
       "FeGaO3              0.279808                            1.25806   \n",
       "TlBeCl3             0.017421                            3.77778   \n",
       "BaTeO3              0.251500                            1.65979   \n",
       "AgCdBr3             0.266989                            1.34737   \n",
       "AgVO3               0.068649                            2.37037   \n",
       "...                      ...                                ...   \n",
       "EuCrO3              0.135710                            1.80645   \n",
       "YAlO3               0.096429                            2.00000   \n",
       "LuFeO3              0.176496                            1.60938   \n",
       "YGaO3               0.145948                            1.74194   \n",
       "TlMnCl3             0.109310                            2.04819   \n",
       "\n",
       "          1.0*rB_rX_ratio**2/rA_rB_ratio ()  \\\n",
       "material                                      \n",
       "FeGaO3                             0.794875   \n",
       "TlBeCl3                            0.264706   \n",
       "BaTeO3                             0.602486   \n",
       "AgCdBr3                            0.742187   \n",
       "AgVO3                              0.421875   \n",
       "...                                     ...   \n",
       "EuCrO3                             0.553572   \n",
       "YAlO3                              0.500000   \n",
       "LuFeO3                             0.621357   \n",
       "YGaO3                              0.574073   \n",
       "TlMnCl3                            0.488236   \n",
       "\n",
       "          1.0*rB_rX_ratio/(nA*rA_rB_ratio) ()  \\\n",
       "material                                        \n",
       "FeGaO3                               1.056047   \n",
       "TlBeCl3                              0.065811   \n",
       "BaTeO3                               0.834873   \n",
       "AgCdBr3                              0.359733   \n",
       "AgVO3                                0.162723   \n",
       "...                                       ...   \n",
       "EuCrO3                               0.735460   \n",
       "YAlO3                                0.578571   \n",
       "LuFeO3                               0.852147   \n",
       "YGaO3                                0.762696   \n",
       "TlMnCl3                              0.223887   \n",
       "\n",
       "          1.0*nA*rA_rB_ratio/rB_rX_ratio ()  \\\n",
       "material                                      \n",
       "FeGaO3                             0.946927   \n",
       "TlBeCl3                           15.195057   \n",
       "BaTeO3                             1.197787   \n",
       "AgCdBr3                            2.779836   \n",
       "AgVO3                              6.145408   \n",
       "...                                     ...   \n",
       "EuCrO3                             1.359694   \n",
       "YAlO3                              1.728396   \n",
       "LuFeO3                             1.173506   \n",
       "YGaO3                              1.311138   \n",
       "TlMnCl3                            4.466530   \n",
       "\n",
       "          1.0*rB_rX_ratio/rA_rB_ratio**2 ()  \\\n",
       "material                                      \n",
       "FeGaO3                             0.442857   \n",
       "TlBeCl3                            0.248619   \n",
       "BaTeO3                             0.692857   \n",
       "AgCdBr3                            0.484694   \n",
       "AgVO3                              0.385714   \n",
       "...                                     ...   \n",
       "EuCrO3                             0.442857   \n",
       "YAlO3                              0.385714   \n",
       "LuFeO3                             0.457143   \n",
       "YGaO3                              0.442857   \n",
       "TlMnCl3                            0.458564   \n",
       "\n",
       "          1.0*rA_rB_ratio**2/rB_rX_ratio ()  1.0/rA_rB_ratio ()  \\\n",
       "material                                                          \n",
       "FeGaO3                             2.258065            0.155893   \n",
       "TlBeCl3                            4.022219            0.016362   \n",
       "BaTeO3                             1.443299            0.289224   \n",
       "AgCdBr3                            2.063157            0.174361   \n",
       "AgVO3                              2.592595            0.062765   \n",
       "...                                     ...                 ...   \n",
       "EuCrO3                             2.258065            0.108568   \n",
       "YAlO3                              2.592595            0.074388   \n",
       "LuFeO3                             2.187499            0.129851   \n",
       "YGaO3                              2.258065            0.112588   \n",
       "TlMnCl3                            2.180721            0.102667   \n",
       "\n",
       "          1.0*rA_rB_ratio ()  \n",
       "material                      \n",
       "FeGaO3              6.414670  \n",
       "TlBeCl3            61.117845  \n",
       "BaTeO3              3.457530  \n",
       "AgCdBr3             5.735240  \n",
       "AgVO3              15.932552  \n",
       "...                      ...  \n",
       "EuCrO3              9.210833  \n",
       "YAlO3              13.443093  \n",
       "LuFeO3              7.701130  \n",
       "YGaO3               8.881906  \n",
       "TlMnCl3             9.740255  \n",
       "\n",
       "[460 rows x 823 columns]"
      ]
     },
1245
     "execution_count": 11,
Luigi's avatar
Luigi committed
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#visualize the feature space created\n",
    "fs.all_df"
   ]
  },
  {
   "cell_type": "code",
1257
   "execution_count": 12,
Luigi's avatar
Luigi committed
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "From 3 primary features and 5 operators, SISSO generated a feature space containing 823 candidate features.\n"
     ]
    }
   ],
   "source": [
    "#count the number of features created\n",
    "print('From %s primary features and %s operators, SISSO generated a feature space containing %s candidate features.' % (len(cols),len(ops),fs.all_df.shape[1]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Select the best candidate features\n",
    "Next, the generated candidate features are selected in two steps. In a first step, they are ranked according to the number of materials $N$ that fall in overlapping regions of stable and unstable domains and only the top-ranked features are kept. The domain is defined as the range between the maximum and minimum values of the feature for each of the classes (stable and unstable). The best candidate features are those that present lower $N$. The lenght of the overlap domain, $S$, is used to rank features with similar $N$. $N$ and $S$ correspond to equations 2 and 3, respectively, in the original SISSO publication (Phys. Rev. Materials 2, 083802 (2018))."
   ]
  },
  {
   "cell_type": "code",
1283
   "execution_count": 13,
Luigi's avatar
Luigi committed
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>N</th>\n",
       "      <th>S</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>feature index</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>175</th>\n",
       "      <td>-log(rB_rX_ratio) + 1/nA ()</td>\n",
       "      <td>361</td>\n",
       "      <td>1.072133</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>103</th>\n",
       "      <td>nA*rA_rB_ratio*rB_rX_ratio**2 ()</td>\n",
       "      <td>366</td>\n",
       "      <td>1.510203</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>478</th>\n",
       "      <td>1.0*nA*rB_rX_ratio/log(rB_rX_ratio) ()</td>\n",
       "      <td>368</td>\n",
       "      <td>2.068028</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>479</th>\n",
       "      <td>1.0*log(rB_rX_ratio)/(nA*rB_rX_ratio) ()</td>\n",
       "      <td>368</td>\n",
       "      <td>7.588221</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>311</th>\n",
       "      <td>nA*rB_rX_ratio**2 ()</td>\n",
       "      <td>369</td>\n",
       "      <td>1.142859</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>525</th>\n",
       "      <td>1.0/(nA*log(nA)) ()</td>\n",
       "      <td>460</td>\n",
       "      <td>5.545177</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>64</th>\n",
       "      <td>rA_rB_ratio**2 ()</td>\n",
       "      <td>460</td>\n",
       "      <td>15.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>119</th>\n",
       "      <td>rB_rX_ratio**2 ()</td>\n",
       "      <td>460</td>\n",
       "      <td>15.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>431</th>\n",
       "      <td>1.0/rA_rB_ratio**2 ()</td>\n",
       "      <td>460</td>\n",
       "      <td>15.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>483</th>\n",
       "      <td>1.0/rB_rX_ratio**2 ()</td>\n",
       "      <td>460</td>\n",
       "      <td>15.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>637 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                feature    N          S\n",
       "feature index                                                          \n",
       "175                         -log(rB_rX_ratio) + 1/nA ()  361   1.072133\n",
       "103                    nA*rA_rB_ratio*rB_rX_ratio**2 ()  366   1.510203\n",
       "478              1.0*nA*rB_rX_ratio/log(rB_rX_ratio) ()  368   2.068028\n",
       "479            1.0*log(rB_rX_ratio)/(nA*rB_rX_ratio) ()  368   7.588221\n",
       "311                                nA*rB_rX_ratio**2 ()  369   1.142859\n",
       "...                                                 ...  ...        ...\n",
       "525                                 1.0/(nA*log(nA)) ()  460   5.545177\n",
       "64                                    rA_rB_ratio**2 ()  460  15.000000\n",
       "119                                   rB_rX_ratio**2 ()  460  15.000000\n",
       "431                               1.0/rA_rB_ratio**2 ()  460  15.000000\n",
       "483                               1.0/rB_rX_ratio**2 ()  460  15.000000\n",
       "\n",
       "[637 rows x 3 columns]"
      ]
     },
1408
     "execution_count": 13,
Luigi's avatar
Luigi committed
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def rank_overlap(labels, feature_space, n_selected):\n",
    "    #rank features according to the number of materials in overlapping regions (N) \n",
    "    #and size of the overlap region (S) and select the top n_selected\n",
    "    #obs: labels and feature_space have to be sorted in the same way wrt the materials\n",
    "    i = 0\n",
    "    score=[]\n",
    "    #determine size of classes\n",
    "    n1=np.count_nonzero(labels == -1)\n",
    "    #split feature space in classes\n",
    "    fs1=feature_space.iloc[0:n1,:]\n",
    "    fs2=feature_space.iloc[n1:,:]\n",
    "    \n",
    "    #loop over each feature to determine its N and S\n",
    "    while i < feature_space.shape[1]:\n",
    "        N=0\n",
    "        min1=fs1.min().values[i]\n",
    "        max1=fs1.max().values[i]\n",
    "        min2=fs2.min().values[i]\n",
    "        max2=fs2.max().values[i]\n",
    "        j=0\n",
    "        while j < fs1.shape[0]:\n",
    "            if (fs1.iloc[j,i] >= min2 and fs1.iloc[j,i] <= max2):\n",
    "                N += 1\n",
    "            j += 1\n",
    "        j=0\n",
    "        while j < fs2.shape[0]:\n",
    "            if (fs2.iloc[j,i] >= min1 and fs2.iloc[j,i] <= max1):\n",
    "                N += 1\n",
    "            j += 1\n",
    "        S=(min(max1,max2)-max(min1,min2))\n",
    "        score.append([i,feature_space.columns.values[i],N,S])\n",
    "        i += 1\n",
    "    #sort features according to N (and S, if same N) and select the top tanked \n",
    "    score_selected = sorted(score, key=lambda x: (x[2], x[3]))[0:n_selected]\n",
    "    return score_selected\n",
    "\n",
    "labels_train=train[\"exp_label\"].to_numpy()\n",
    "feature_space=fs.all_df.loc[:,~fs.all_df.columns.duplicated()]\n",
    "n_selected=1000\n",
    "\n",
    "pd.DataFrame(rank_overlap(labels_train, feature_space, n_selected), columns=['feature index','feature','N','S']).set_index('feature index')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In a second step, classification trees are used to choose the best candidate feature among those selected by the overlaps (above). For each of the selected candidate features, a classification tree is trained, providing a threshold for the classification and its accuracy. The selected candidate features get ranked based on their accuracy. "
   ]
  },
  {
   "cell_type": "code",
1466
   "execution_count": 14,
Luigi's avatar
Luigi committed
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>feature</th>\n",
       "      <th>tree accuracy</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>feature index</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>248</th>\n",
       "      <td>rA_rB_ratio*log(rA_rB_ratio)/rB_rX_ratio ()</td>\n",
       "      <td>0.821739</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>582</th>\n",
       "      <td>1.0*rB_rX_ratio/(rA_rB_ratio*log(rA_rB_ratio)) ()</td>\n",
       "      <td>0.821739</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>581</th>\n",
       "      <td>1.0*rA_rB_ratio*log(rA_rB_ratio)/rB_rX_ratio ()</td>\n",
       "      <td>0.821739</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>96</th>\n",
       "      <td>nA - rA_rB_ratio/rB_rX_ratio - rB_rX_ratio ()</td>\n",
       "      <td>0.821739</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>146</th>\n",
       "      <td>rA_rB_ratio*(rA_rB_ratio - rB_rX_ratio)/rB_rX_...</td>\n",
       "      <td>0.815217</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>108</th>\n",
       "      <td>nA*rB_rX_ratio - log(nA) ()</td>\n",
       "      <td>0.602174</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>361</th>\n",
       "      <td>-nA + rB_rX_ratio/nA ()</td>\n",
       "      <td>0.597826</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>258</th>\n",
       "      <td>rB_rX_ratio*log(rB_rX_ratio)/nA ()</td>\n",
       "      <td>0.597826</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>588</th>\n",
       "      <td>1.0*nA/(rB_rX_ratio*log(rB_rX_ratio)) ()</td>\n",
       "      <td>0.597826</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>116</th>\n",
       "      <td>nA*rB_rX_ratio - rA_rB_ratio/nA ()</td>\n",
       "      <td>0.580435</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>637 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                         feature  \\\n",
       "feature index                                                      \n",
       "248                  rA_rB_ratio*log(rA_rB_ratio)/rB_rX_ratio ()   \n",
       "582            1.0*rB_rX_ratio/(rA_rB_ratio*log(rA_rB_ratio)) ()   \n",
       "581              1.0*rA_rB_ratio*log(rA_rB_ratio)/rB_rX_ratio ()   \n",
       "96                 nA - rA_rB_ratio/rB_rX_ratio - rB_rX_ratio ()   \n",
       "146            rA_rB_ratio*(rA_rB_ratio - rB_rX_ratio)/rB_rX_...   \n",
       "...                                                          ...   \n",
       "108                                  nA*rB_rX_ratio - log(nA) ()   \n",
       "361                                      -nA + rB_rX_ratio/nA ()   \n",
       "258                           rB_rX_ratio*log(rB_rX_ratio)/nA ()   \n",
       "588                     1.0*nA/(rB_rX_ratio*log(rB_rX_ratio)) ()   \n",
       "116                           nA*rB_rX_ratio - rA_rB_ratio/nA ()   \n",
       "\n",
       "               tree accuracy  \n",
       "feature index                 \n",
       "248                 0.821739  \n",
       "582                 0.821739  \n",
       "581                 0.821739  \n",
       "96                  0.821739  \n",
       "146                 0.815217  \n",
       "...                      ...  \n",
       "108                 0.602174  \n",
       "361                 0.597826  \n",
       "258                 0.597826  \n",
       "588                 0.597826  \n",
       "116                 0.580435  \n",
       "\n",
       "[637 rows x 2 columns]"
      ]
     },
1592
     "execution_count": 14,
Luigi's avatar
Luigi committed
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#train classification trees for the selected descriptors\n",
    "\n",
    "#depth of the classification tree - user has to choose\n",
    "depth=1\n",
    "select_feat_index=[k[0] for k in rank_overlap(labels_train, feature_space, n_selected)]\n",
    "\n",
    "def rank_tree(labels, feature_space, select_feat_indexes, depth):\n",
    "    #rank features according to the classification tree accuracy\n",
    "    #obs: labels and feature_space have to be sorted in the same way wrt the materials\n",
    "    score = []\n",
    "    for i in select_feat_indexes:\n",
    "        x=np.array(feature_space)[:,i]\n",
    "        clf = tree.DecisionTreeClassifier(max_depth=depth)\n",
    "        clf = clf.fit(x.reshape(-1,1), labels)\n",
    "        score.append([i,feature_space.columns.values[i],clf.score(x.reshape(-1,1),labels)])\n",
    "    score_sorted=sorted(score,reverse=True,key=lambda x: x[2])\n",
    "    return score_sorted\n",
    "\n",
    "rank_list=rank_tree(labels_train, feature_space, select_feat_index, 2)\n",
    "pd.DataFrame(rank_list, columns=['feature index','feature','tree accuracy']).set_index('feature index')\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The top-ranked candidate feature corresponds to the the SISSO-derived tolerance factor (tau). It can be now evaluated for all the materials, including those in the test set. "
   ]
  },
  {
   "cell_type": "code",
1629
   "execution_count": 15,
Luigi's avatar
Luigi committed
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Identified expression for tau: rA_rB_ratio*log(rA_rB_ratio)/rB_rX_ratio ()\n"
     ]
    }
   ],
   "source": [
    "print('Identified expression for tau: %s' % rank_list[0][1])"
   ]
  },
  {
   "cell_type": "code",
1646
   "execution_count": 16,
Luigi's avatar
Luigi committed
1647
1648
1649
1650
1651
1652
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
1653
      "<ipython-input-16-7d32e5fd28fe>:3: SettingWithCopyWarning: \n",
Luigi's avatar
Luigi committed
1654
1655
1656
1657
1658
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  i['t'] = i.apply(lambda row: (row['rA (AA)']+row['rX (AA)'])/((2)**(1/2)*(row['rB (AA)']+row['rX (AA)'])), axis=1)\n",
1659
      "<ipython-input-16-7d32e5fd28fe>:4: SettingWithCopyWarning: \n",
Luigi's avatar
Luigi committed
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  i['tau'] = i.apply(lambda row: row['rB_rX_ratio (Unitless)']*np.log(row['rB_rX_ratio (Unitless)'])/row['rB_rX_ratio (Unitless)'], axis=1)\n"
     ]
    }
   ],
   "source": [
    "#evaluate t and tau for test and train sets\n",
    "for i in train,test:\n",
    "    i['t'] = i.apply(lambda row: (row['rA (AA)']+row['rX (AA)'])/((2)**(1/2)*(row['rB (AA)']+row['rX (AA)'])), axis=1)\n",
    "    i['tau'] = i.apply(lambda row: row['rB_rX_ratio (Unitless)']*np.log(row['rB_rX_ratio (Unitless)'])/row['rB_rX_ratio (Unitless)'], axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The accuracy of the classification tree for tau can be now evaluated for train and test sets."
   ]
  },
  {
   "cell_type": "code",
1684
   "execution_count": 17,
Luigi's avatar
Luigi committed
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification tree accuracy (for tau) on the train set: 0.765217.\n",
      "Classification tree accuracy (for tau) on the test set: 0.784483.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#train classification tree with tau\n",
    "x_train_tau=train[\"tau\"].to_numpy()\n",
    "x_test_tau=test[\"tau\"].to_numpy()\n",
    "labels_test=test[\"exp_label\"].to_numpy()\n",
    "\n",
    "clf = tree.DecisionTreeClassifier(max_depth=1)\n",
    "clf = clf.fit(x_train_tau.reshape(-1,1),labels_train)\n",
    "labels_pred=clf.predict(x_test_tau.reshape(-1,1))\n",
    "tree.plot_tree(clf)\n",
    "print('Classification tree accuracy (for tau) on the train set: %f.' % clf.score(x_train_tau.reshape(-1,1),labels_train))\n",
    "print('Classification tree accuracy (for tau) on the test set: %f.' % metrics.accuracy_score(labels_test, labels_pred))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "By using similar settings, the accuracy of the classification tree for $t$ can be also evaluated. "
   ]
  },
  {
   "cell_type": "code",
1731
   "execution_count": 18,
Luigi's avatar
Luigi committed
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification tree accuracy (for t) on the train set: 0.750000.\n",
      "Classification tree accuracy (for t) on the test set: 0.715517.\n"
     ]
    },
    {
     "data": {
      "image/png": "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biUuLo7evXvX+ucA2ymvG+tfWRl8pZkzZw5eXl54eHiYHiAtX74cd3d33N3dWbt2rdnxr7/+uunpfkZGBh4eHhbJWLPG3zqYf96EhART1lnv3r1LnRz+RiEhIaalhmqjbtbZ2wsffvghbdu2JSUlhS+++IJdu3axe/du+vfvT1paGl988QX79u0jJCSE9957r8zzvPLKK8TFxREbG2t6Ijpz5ky7mey8phSVZ/v27dm9e7fpSXJxb731FgMHDiz3PJ999hm333676f8HGFdEKKrkdUV55VVa/WvSpAnr169nz549jBo1in/+859lnvuJJ57gwIEDbN26lZdeegkwLoPzzTffsHfvXpYsWWI69urVq6ZhWWAcfrZu3bpa+MTWU1TWUPLz9u3bl927d7N79278/f0ZOXJkuef67rvvyMvLM/27NupmjTW6YWFhptniP/nkE5YtW0Z8fDz+/v64u7szf/58s+OTk5NN37bF/3vr1q34+vri6enJF198cdNxbdu2DUdHR4KCgpgyZQrZ2dmVWhiwiLWy0Wy1PJ2cnExrUxV3+PBhevToQbNmzcp9/7///W+SkpIwGAy89tprNx1PEXsqr9LqX2kZfGUpWjvNycnJNPyqaM00R0dHs+Vo3nnnHR5//PGb/hzF2WpZQ9mft7CwkP379+Pr61vu+5cvX87TTz9dI7GUpcYa3TFjxrBhwwbAOOzij3/8Iy4uLsTExPDNN98QGxtb7k8mMBbMokWLiImJIS4ujsWLF5c45sZlPAwGQ7nppOfOnSMjI4MdO3bg6urKmjVrqryo3ZQpU3B1dSUgIKCiYqgxtlqeZXnzzTf585//XOFx586d4/bbbyc2NpavvvqKY8eOVflapbGn8iqv/l2+fJlVq1aZjb8ty0svvcRTTz1l9trKlSsZPXo0YOwofP311xU2NFVlq2Vd3ufdu3cvnp6e5X6ZHT58mK5du5baqahJNTZO19fXlxdffJErV66QmZlJx44dSUhI4NlnnyU7O5vExESzAittgHRaWhonTpzg3nvvBeD8+fPk5+ebfXMX/SStLGdnZwICAlBKERgYyDvvvMP9999fpUXtrJGNZqvlWZojR47QuXNnU0ZReYqyppRS+Pv7k5CQgKur603HYE/lVdaiijdm8JXnk08+4eLFizz66KOm1/bu3cvWrVvZtGkTAKtWrWLq1Kk3He+NbLWsy/u80dHRPPzww+W+/4033mD58uU11hEoS401ug4ODvTr149XXnmFkJAQwPit+9xzzxEYGIiPj49Zel/Lli1JSUkBfl/Erk2bNvTt25edO3fSsGFD8vLySqzcWfSzrLh169aVORDc29ubt956CzAuB969e3cGDRrE8uXLmTdvntmidmfOnKFz585mlcRa2Wi2Wp6l+f7779m/fz/Dhg3j6NGj/OlPf+Jf//oXKSkptG7dmkaNGpmOLcqauvPOO4mPj6+xn3L2VF5l1b8bM/iAUsvwm2++4b333jOlAwP89NNP/OUvf2Hz5s2m3lxiYiLbtm3jzTff5OTJkyxdupTw8PBKx1kWWy3rsj6viLBnzx7efPNN07Gllevp06eZMGECFy9eJC0tjcDAQIKCgqpXSOWo0Yy0MWPGEBQUxM8//wzAiBEjmDlzJr1796Zx48Zmxzo7O+Pi4oK/vz9ubm6A8X9mREQEgYGBODg44OLiUuKpYVW//fr160ebNm0wGAw0b96cjz76iBYtWjB06FB8fHxo3bq16WlvaGgoX375pek+Llg3G80WyzMrK4uQkBDi4+MJDg5m/vz5ZktmGwwG3n33XQBmz57N3/72N7N01KlTpxIaGsrq1atxc3PjnnvuqdL1y2Mv5RUQEFCi/pWVwVdaGc6YMYOcnByCg4Np1qwZmzdvZt68eabZuAA2b97MypUrTe/x8PCokQa3iC2WdVmf96uvvuKee+4xa9RLK9f9+/ebrrtt27ZaaXAB+5tPtzLCw8PFy8tLLly4UOn35OfnS1hYWKWOXbZsmdx5553y448/mr2Onc2nW1nVKU8RkWnTplXquN27d8vAgQNLzOBWXnnWxfIqTWXLsLKKZiybPn262esV1V1bLW9brJsVbTo5ogbp5IiapZMjLEcnR1SNXSVHaJqm1We60dU0TbMg3ehqmqZZ0E2NXnBycjqvlGpXU8HYOycnp/M3815dlubKK09dXjWrorqry9vczfyt39SDNE3TNK1q9O0FTdM0C9KNrqZpmgXpRlfTNM2CdKOraZpmQbrR1TRNsyDd6GqaplmQbnQ1TdMsSDe6mqZpFqQbXU3TNAvSja6maZoF6UZX0zTNgnSjq2maZkG60dU0TbMg3ehqmqZZkG50NU3TLEg3upqmaRakG11N0zQL0o2upmmaBelGV9M0zYJ0o6tpmmZButHVNE2zIN3oapqmWZBudDVN0yzo/wF8rm/MyJgX0gAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#train classification tree with t\n",
    "x_train_t=train[\"t\"].to_numpy()\n",
    "x_test_t=test[\"t\"].to_numpy()\n",
    "\n",
    "clf = tree.DecisionTreeClassifier(max_depth=2)\n",
    "clf = clf.fit(x_train_t.reshape(-1,1),labels_train)\n",
    "labels_pred=clf.predict(x_test_t.reshape(-1,1))\n",
    "tree.plot_tree(clf)\n",
    "print('Classification tree accuracy (for t) on the train set: %f.' % clf.score(x_train_t.reshape(-1,1),labels_train))\n",
    "print('Classification tree accuracy (for t) on the test set: %f.' % metrics.accuracy_score(labels_test, labels_pred))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Platt-scaled classification probabilities P(tau) can also be computed from the obtained tau values and the labels."
   ]
  },
  {
   "cell_type": "code",
1777
   "execution_count": 19,
Luigi's avatar
Luigi committed
1778
1779
1780
1781
1782
1783
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
1784
      "<ipython-input-19-abae1df11702>:6: SettingWithCopyWarning: \n",
Luigi's avatar
Luigi committed
1785
1786
1787
1788
1789
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  train['ptau'] = ptau_train\n",
1790
      "<ipython-input-19-abae1df11702>:7: SettingWithCopyWarning: \n",
Luigi's avatar
Luigi committed
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  test['ptau'] = ptau_test\n"
     ]
    }
   ],
   "source": [
    "#evaluation of P(tau)\n",
    "clf = CalibratedClassifierCV(cv=3)\n",
    "clf.fit(x_train_tau.reshape(-1,1), labels_train)\n",
    "ptau_train=clf.predict_proba(x_train_tau.reshape(-1,1))[:,1]\n",
    "ptau_test=clf.predict_proba(x_test_tau.reshape(-1,1))[:,1]\n",
    "train['ptau'] = ptau_train\n",
    "test['ptau'] = ptau_test"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To compare the performance of tau with t, P(tau) is plotted against t."
   ]
  },
  {
   "cell_type": "code",
1818
   "execution_count": 20,
Luigi's avatar
Luigi committed
1819
1820
1821
1822
1823
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
1824
       "<matplotlib.axes._subplots.AxesSubplot at 0x7fc39593b0a0>"
Luigi's avatar
Luigi committed
1825
1826
      ]
     },
1827
     "execution_count": 20,
Luigi's avatar
Luigi committed
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEGCAYAAABo25JHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOydeZhOZf/AP+ecZ19mX81g7GtIodXbYmmlpPopRaiINqkUISVrUSSFklJCRWnh5VVJEkr23Riz78++n/P74+FhmrGPJOdzXS7Pc5/73Pd9zsyc77m/q6AoCioqKioqFy/i+V6AioqKisr5RRUEKioqKhc5qiBQUVFRuchRBYGKiorKRY4qCFRUVFQucjTnewGnS0JCgpKRkXG+l6GioqJyQbFx48ZiRVESqzp2wQmCjIwMNmzYcL6XoaKionJBIQjCweMdU1VDKioqKhc5qiBQUVFRuchRBYGKiorKRc4FZyNQUVH59xEIBMjOzsbr9Z7vpVzwGAwG0tPT0Wq1p3yOKghUVFTOO9nZ2VitVjIyMhAE4Xwv54JFURRKSkrIzs6mTp06p3yeqhpSUVE573i9XuLj41UhcJYIgkB8fPxp76xUQaCiovKPQBUC1cOZ3EdVEKioqKhc5Kg2gr8BRZZRQkEUWUYQRQRJgyBWvwyWg0EUOQSAIEqIGvXHq6KicnLUHcE5RlEUQl4Ptt3bsO3aSvmurQScdhRZrtZ55GAAZ9Z+bDu3YNu5BdehTORgoFrnUFFROTOuu+66k2ZEyMjIoLi4+JTHnDNnDoMGDTrbpQGqIDjnKMEgzqz9KKHwmzqyjCvrAEooWK3z+O02gk575HvAUU7A6ajWOVRUVP6dqILgnKMg+30VW+RQte4IFEUh6Kr80A+6nNU2h4rKxcDHH39M27ZtadWqFY8++igHDx6kQYMGFBcXI8sy1157LcuXLyczM5PGjRvTq1cvWrRoQffu3XG73ac0x4ABA7j88stp1qwZI0eOrHBs4sSJtG3blrZt27J3714AioqKuOuuu2jTpg1t2rRhzZo11X7dqiA41wgCkslcoUnU6hBEqRqnENDHxFVq18XEVtscKir/dnbs2MFnn33GmjVr2LRpE5Ik8eOPP/L888/Tv39/Xn/9dZo2bUqnTp0A2LVrF4888gibN28mKiqK6dOnn9I8Y8aMYcOGDWzevJkff/yRzZs3R45FRUXx22+/MWjQIJ566ikAnnzySZ5++mnWr1/P559/Tr9+/ar92lVBcI4RNVosteqiMVsAkIwmrHUaIFSzIVcymjEmp4EoIogSxtR0JL2xWudQUfk3s3LlSjZu3EibNm1o1aoVK1euZP/+/fTr1w+Hw8GMGTOYNGlSpH/NmjW5+uqrAejZsyc///zzKc2zYMECWrduzaWXXsq2bdvYvn175FiPHj0i/69duxaAFStWMGjQIFq1akWXLl2w2+04HNWr9lXdSv4GJJ0eS+36oCgghIVDdSNqNBgSk9HHJQAKIQVKSm0IhFVHUTFR6HTa0/YxDgZDlJWWo8gKggBR0VY0Wg2SVH07GhWVfwKKotCrVy/Gjh1bod3tdpOdnQ2A0+nEarUClf31T+Vv68CBA0yaNIn169cTGxtL7969KwR/HTvGkc+yLLN27VqMxnP3YqfuCP4mRI0GUas9J0LgCIIoImq1IGnYtWM/eYdy0YR8bPz1D7wuFwG7Dfk0jdR7du5j47o/2bjuTzZt3EpOdj6rV/2Krdx+8pNVVC4gbrzxRhYtWkRhYSEApaWlHDx4kOeff57777+f0aNH8/DDD0f6Z2VlRd7aP/30U6655pqTzmG32zGbzURHR1NQUMB3331X4fhnn30W+f/KK68EoFOnTkybNi3SZ9OmTWd3oVWgCoJ/CHIgQMjnJeT3IwfPzqOotKScRZ98Ra20JOSiXC5rlkGopABn1j44DSN1SVEps6fPI71WDYYNHsOPK9fy0cwFPPXwcAoLTt3NTUXlQqBp06a8+uqrdOrUiRYtWtCxY0cyMzNZv359RBjodDo++OADAJo0acKHH35IixYtKC0tZcCAASedo2XLllx66aU0a9aMPn36RFRLR/D5fLRr144333yTyZMnA/DWW2+xYcMGWrRoQdOmTZkxY0a1X7ugKEq1D3ouufzyy5V/W4WykN+HY98u5IAfAENSCoaElDMOCCvIK6LjFd0Z/MKj3NLpCjTOUgDMGQ3QWaynHMxWWFBMh7Z30f2+22l1WXOGPxPeMk+YOpL/dLgKo8lwRutTUfkrO3bsoEmTJud7GadMZmYmt912G1u3bj3fS6mSqu6nIAgbFUW5vKr+6o7gPCOHgrhzsyNCAMBbmH9WcQY6vZZLL29Oy9ZNkUJHxw15XCjKqe8IdDotl7VryaVtWrBl045I++/r/8Tv95/gTBUVlQsJ1Vh8vpEVQj5PpeaQ34+kP7M37ti4GN6Y8QpaQgTzsxCS0jFoJDx5WRjiEuAU7bwxsdFMfHskRQUljHp+Aq9NGU50jJWnHhnO3T27Eh0TdUbrU1G50MnIyKhyN3DnnXdy4MCBCm3jx4+nc+fOf9fSzghVEJxnBElCFxWDtyj/mEYBzRkKgSPEJ8bhcbkxN74Ej8eP3mxAHxNz2vELCYnxSJLEinWLkGUFs9nIyt8+R6/XndX6VFT+jXz55ZfnewlnhCoIzjOCKGJITEYOBvGXlyLqdJjTaldLnIHRbALAoj27h3ZsXEyF7wajahtQUfk3oQqCfwCiRoupRk1MKWnh76dRYk5FRUXlbFEFwT8EUZJADdJSUVE5D6heQ/8y5FAQOXD6sQiKoiAHAsgBP4os4/V4KSosobSk/ITnlZfZKSoswel0nc2yAfCc4pwqKn83CxcupFmzZoiieNJ00hciqiD4FyEH/LiyD2LbtQ1n5l5CXg+nEicih0IE7Dbs+3Zi27uDkqISXn91Onfc+CCP9nyGzX9sx+er6C4qyzKZ+w/x1MPD6HJ9T0Y+O56iswgyKy0p441j5tyyaUelOVVUzhfNmzfniy++oH379ud7KecEVTV0jjiSZrq6KpEdqT6mhEIIkgZRU7HKmRwK4srJImAPv00H3U7s+3cT3aApwklsDkoggPNgOOWtYI1h7uyFfPbxEgB2bd9L33uf5MsVH+LxeElIjCM2LobS4jIevu9pCvKKALBGWSgpLmPfnoOk10olOiYKa5TllK7N5/Mz5935ledcOZfiwhLSaqaSkFg5u6rKxYuvrARPfg5ywI+o1WFMSUMfG3/O5ruQgt3OBFUQVDNyKITs8+ItLkAQJQxJKYhaLYJw5gJBDoWQg34CtnKCHjdaswVtVCySXn9MJ4WA3VbhPCUYOFy68sSCIHBMQRuvIrHy+4pZFH0+P1v/3MnE0dNo0rwBoye9gNvtiQiBa65vx+VXtKLH7Y8SOlyA5/lRT3DnvbdgMp08UZbD7mTFdz9VaPN6fWzdtIPxL7+FXq9j7udvk5iccNKxVP79+MpKcGUfhMPBkUd2wsA5FQb/ZlTVUDUj+7zY9+7AX16Kr7QI++7tKGeZO0gJBfHk5eApyCVgL8edl42nMJdQoKLqpIJgABAEOIUdiWQ4+rDWIlO3Qe1KfZJSErDbHPz0v1/JOZSHwaCPxBLcc39XJr82IyIEACaPnYHTfmqFcfR6HfUaZFRqT0yOx2FzknMon4XzvkKu5vKeKhcmnvyciBCIoMjh9rOgQ4cONG/evNK/JUuWnNW4FwKqIKhG5FAIT2FehTZFDuF3nGWmTkUh4Kj4tu8vLw2ntT6MqNVirlnnmIAxAVONWqcUQCYZDGijw0VsND4XQ17sT2JS+M1KEAR69unO5t+3RXT2+bkFWKOsvDR2CBqNhMVqpriotOL6fH78/lMTgNYoC8+NHFRxzr538+fGo3Nm7j9EMBg60TAqFwlyoGrb0fHaT5UVK1awdevWSv+6du16VuNeCKiqoWpEEASEKlxAz9pOUFWec0Go0C6HQghaLVENm6HIobA7qiiF/z8JokaLOa0WSmo6yApWSeKzb2ZitzkQRJFlS1fx5viZAOj0Oi65tClGk4EON7en3dWtCfgDXNfxKlYtP1pCr37DOhhNBtwuN6bDgW12m4NgMIQoCsTERldYQ1rN1MicOoOOb774L29NmBk5fnfPLuh0FVVcHo8Xp8OFTqdV011cRIhaXZUPffEsAycvZtQdQTUiiCLGpFQ4xh4ganVozdazHFdCH59Uoc2YlIooheW4HAjgzs3Cvmc7rkMHwgJJoz0lIRBZp0aLpNMjGQxIWi0JSfHUbZBBbFw00TFWMurW5PIrWvHRF29HIo1NJiM6rZZvl6yg38CedL/vNmplpHFz1xuZ/uEEtBoNXy74jrycAkpLyvnis2/Izc5j7Ig32bV9L8HA0R2DKIrHzBlD67YtaNaiEY2a1mfC1BE0alK/wnpLikqZMGoqd9/cl6cffYkD+7JU1dFFgjElrcLfGACCGG4/R3z55Zekp6ezdu1abr311n987qDTRU1DXc0osowcDBKwlyFIElpLdLVECsvBACGvl6DbER5Tp0fUaMLeQtkHCdjKIn0FjZboBk2rLUI5FApRXmZHo9EQHXNUqAX8AWZPn8f0yR9gMhu5/a7ONLukEVdf147EpHjKSst56J4n8Li9tLnyUr7+fBljJr/IujW/899vf+DrVR+f0ABcVmpDURRi46IrVG5yu9y8OnwyS79YHmmLT4xj4bezSEhSjYUXIqebhvrv9hq60DjdNNSqaugsUGT5aLpoUUSUwi6dkk6HlJBcrXOJGi2iRYvW8pfdhSwTsJcjiBLm9Np4CvOQ/X7gqICvap2nihwMICgKsTGWStXV7HYH3339PwDcLg+fzV0MwMxP3iAxKZ7YuBjmLJzKjW3v4qtF39P3sfspKS5jycJwVabcnIITCoLYuOgq290uDyu/X12hraSoFIfDpQqCiwR9bLz64K9GVNXQGSKHQvhtZdh2b6d8x2ZchzIPVxnz4S0pJOC0IwcDx/QPEvR68BYXEnS7TjnyVw4GCDjteEsKCfm8yKG/GkwFJL0RS0Y9/PZyTGm1sdSpjzsvO9w/GMRXVoxt1zbKd2zBnXuowrqOh6IohLweHPt3U75jM459uyoFqOn1emrXSa90blJKIgD2cgfz5y4mGAhijbLw3VcrufSy5tSpH/ZKik+IPaV78FdESaJWRkU1gCiKp+SqqqKiUplzKggEQbhJEIRdgiDsFQRhaBXHawmCsEoQhD8EQdgsCMIt53I9RziaTiFw2jV8I2MEg7gOHYi8aQfs5XiKC/AU5uLOycKxfzeurEzkYABFlvGXl2HfvS2sy9+7A29h3kmFgRwM4MrKxLF/N+6cLGy7thLyVEzlEFQgEJMEkpaQ14Pz4D7cudkE7LawmioUxJ2TdTieQMFfVoK/vPSkEcdKMIjjYDg6GSDk8+LI3BtxhXXYnZgtJoYMf4zRk4bSpHkDAO594A5i42MoKy0nEAyw7Ov/MX7qCBavnIvRaCDrYA4tLm3KQ/17EBV9eraTUChEcVEpcijEpOkvE58YFiSCIPDU0EcwW0ynNZ6KikqYc6YaEgRBAt4GOgLZwHpBEL5SFGX7Md2GAwsURXlHEISmwLdAxrlaE4TVJEG3E1d2JrI/gC4mFlNqzdPWpwe97sptTjv6mHj8lAAQcNrCD05JwZOfXaGvt7gAfeJR9ZEcDKKEgiihUDgATaNFCYYIOCu6jbpzD2Gt0xBRq6W8zM4Xny1l9tvzqFUnnTnzp+Dau41QMIC5Zh0kgwFfSeW0D357ObqY+BOmulYUGdnnq9AmB/x4vD4CTjfvv/MJd9/fheiYKPbtPsD4qSMxGPUYjQZKS8p58ekxPP1Cf6Z/OIEFHy/hw5nzmfnJG/h8AVq3aYHFaj4tQeB2uVn/6yZeHfYGpSXldOnWmQXfzKKoqJTY2GgsUWYsVvMpj6eionKUc2kjaAvsVRRlP4AgCPOBrsCxgkABjvj9RQO553A9QPiB6ziwJ+KD7y8vRdBoMKWkn5abp0ZfWQ2hMZoI+bwV2hRFQeBoyom/HDy8pkA4PcRhg6+g0RBVv0mVZSWPvNkD7Ny+hylj38VoMjLqtcG4czLDNgCNFndeNhqTGY25cpoHjfnkdYsFQUTUapEDgSMNyHGpzP94CV26dWbdmt9Z+uVyGjWpz29r/+DGztfStEVj7DY7/R8YQr2GGWz+fRuP3Dc44s3ToV13Fq+cS0bdmiecuyrKy+w82W9YZKzP5y8lNT2ZPgPuQ1MNtRtUVC5mzqVqKA04dMz37MNtxzIK6CkIQjbh3cDjVQ0kCMIjgiBsEARhQ1FR0VktSvZ5KwRiAWE1ymmqiASN5rAbW9ibRTKa0Sek4CsvifQRtbqwgVWU0P3FsKUxWSIPYzngr+D1owSDePJzwi6gx/hGCxotphq1I65zy79eBYBWq8FoMiKJIpqU2kTVa4ykN6DIMoJWiyExBQivU5eYiiEuEUEUT+huKWg0WGrXi+waRJ0eRaPjs7mLGTZ4LNM+GEdZiY01P/7GM8MG0PSSRuh0WrweH3k5BTRv0Zhff95QYQ5Zltm47s/Tus9H2L5lV6X1/m/ZzzhOMXpZRUXl+JxLQVBFFBR/VUz3AOYoipIO3AJ8JFSRlEdRlPcURblcUZTLExMTz2pRoq5y0IlkMMFplnAUNRr08UnENL6E6MaXYK1TH1GjwZxeG60lCn1CEtZ6jRG1YX9+U0oaphq10FisGJJqYKldL+KFE6qqELwggqAQVb8xxtR0TGm1sNZpQMBhw28vJ+j3cWnbS4BwoNZD9z5FUVDLzt0HEbVaLLXrIRmMSBothqQUohtfgqZWA7bszcXmcOFyulm35nfKSqtO+SwIApLRTHSDpkQ3uoSouo1ISIpj7udv838P3sHrY6YjSiLJqYnMevtjCguKURQFvV6HNcpCdlYeDRvXqzRuo6b1q5jt5NSpV6tSW7MWjTAaVQOxSvXx/fff06hRI+rXr8+4cePO93L+Ns6lIMgGjtUBpFNZ9dMXWACgKMpawACc08xigkaDMfnoxkTU6THVSD+t4KvIuZKEqNUh6fRh906NBn1MPObadTGlpCMdI3REjRZ9fCKWWvUwHk5EdwSN0VwhSlhjicIQn4ASCCBIGrSWKDRGM/7yMnTRseE8K6EQV11zOddc1w6AosISJo9/j/qN6hyeTxPxvRclDZJOR0hWWLfmd9av/YPSkjIcNgebNmylIK8Iv7+yJ5EgCOHr0+sRtVps5Q4+mPEJicnxZB/M5Y13RvPpV+9SIz2V4sISAoEg0bHRjHvrJX7+8Tduuv2GiBFZEATu6dmV9Fqpp32fARKS4nmofw/Ew7uoeg0yeOTxBzEY9Sc5U0Xl1AiFQgwcOJDvvvuO7du38+mnn7J9+/aTn/gv4JwFlAmCoAF2AzcCOcB64D5FUbYd0+c74DNFUeYIgtAEWAmkKSdYVHUElMmhEIRCKIqMIErnvTSkIssEvW7cuYeOxgPk5+C3l2NMroGnIBetJQpTjZq4sjMxpdYMu4EGAgSt8fhkAAWT2YTP66eosIT4hFgMRgNx8UfrDQcCAZwON++/M4/WbVpgtpjYtyeT2nXSMVvMNGnesFIah2MpKiih992P89qUYdTKSOO9qR9xe7fOpNdKRRBE3G43JUVlxCfGIgoiPp8PjVZDwB9Eq9VgMhtP21PoWBx2Jy6Xm4A/gMlsJD5BTU39b+F0A8oOrtvJliVrcJc6MMVZuaTr1dRu1/is1rB27VpGjRrFsmXLABg7diwAL7zwwlmNez74xwSUKYoSFARhELAMkID3FUXZJgjCaGCDoihfAc8AMwVBeJqw2qj3iYRAdXE6ZSHDxlLltAOxTgdBFNGaLFgz6qOEQtj378ZSsw4hnxdPXjaSwYipRk2CTifG5DQc+3dHbBpiSQ7RsQkIUTEUFtno0aU/Tw59hMvbtcTj9gAKcfFhN0uvx8evP2/gvofuYsrYd/nfstX06NWNSa9Op9u9t5JRtyZ+n/+43jeJyfEs+HYmGo0GvUHPoGf6otFICKLATyvX8tzjowkGgmh1WibPeIXWbVtUqyePNcpyyjUOVP69HFy3kw3zVhA6nNTQXepgw7wVAGclDHJycqhZ86gSIz09nXXr1p3dYi8QzmkcgaIo3yqK0lBRlHqKoow53DbisBBAUZTtiqJcrShKS0VRWimKsvzEI/59KLJMwO3EsX8X5Tu34Mo+eNSD5iTIoWDVXkInQxDxFOQi6fSgyGEPJEEg5PehBIOIhnD7Xw3bfn+AbdsP8M3iFXz69bvUql2DdT//TnZWLlMnzqK83IaiyASDQXbt2MemDVt5oN891G2QwZz35tOsRSMGPtMHj9vLjDc/pKzUdpwFgtliRm/QH/5sQm/QYyuzM/K5CZHcQQF/gBHPjuPAvqzj2iBUVM6ULUvWRITAEUL+IFuWrDnOGadGVe+gQlUJH/+FqJHFx0EJBXHs2x1+GCsKAVsZ7vzsKiJ7jxKO4i3BmbkPd0EOoYD/lEpFHp1UQQ4GMMQn4ispQmOyENP4ErRmK56ifEStHqGKXYmi0VJcWMLMaR8x8ZVpTJ00m9u6Xk/bNs2IjYtGK0DQ7cZiNfPQoz3YtmUXtnI7e3cfwBplYceW3ezbncnMaR/x08pfCIWCFBeV4nScWh3iQCBYyXuntKQcOSSz5sffTu8eHKa81EZRYQkej7fK46XFZWE7h90RaXO5Ksd2nAmKLEcCDlX+ebhLHafVfqqkp6dz6NBRR8fs7Gxq1KhxVmNeKKiC4DjIgUCl4hcBh+2wH39lFEXBX16KJz8HY1IqGoOJgN2GHAic9EHocro4dDCX775eRa4bbGV29HEJGJNSsO3diSm9Nua0WkjasEHakHSMwVUUiUpM4MprLuO2Ozvy2y9/MHXmGDReJ56s/fR9qCuB3IO4c7NAljFbjPR+5P/4dskKbu/WieVrF3J9p2v47quVdO1+Ex8smoocklm84FtGPjeewvyTu+sajHoaNqnoIdThlvYkpSTQ6rLm/LB8DQV5RZQUlx5nhKMEA0F279jHoD5DuavTQ7z+6nRKio+61no8Xjb+9icjnhtPbnY+8z74gpLiMvLzCvl0zheUlx1/N3MqyMEA3qJ8bHu249i/C7/DdkLhr/L3Y4qr2s50vPZTpU2bNuzZs4cDBw7g9/uZP38+Xbp0OasxLxRUQXAcqoq6lQzG45acVIJBvCWFmGvWwZ2bhevQAdw5B7Hv2VZl7nS7Lfz2EgqFIpG4UTFWhgx8mYVfrMThCeAtLsRSqw6ipIm4mopaHYbEZKIbX0JUvcZEN2xGIKSwf+9Bvl+6ilcmDeXDWQvJdwaRTGZ8eYdQFAVzrXoUFZVRmF9MbFw0Q4YP5Kmhj+LxeHlm2ACuua4d27bsIvtgLnd06EWderWQJIkXnx5DedmJC+vExccydfZY2t94JbFx0Vzf6RpeevUZBvcfweSxM2jYtB6P9XqOWW/PO+mDuqzMRu+7H2fzH9spL7Ox4OMlzHjzQ7yHdwblZTYe7vE0Op2Wwvxi3n3zQ8aOmELfe59i8YJvCYXOPBW1oij47eV4CnJRggFCPi/OA3vOusKcSvVySderkXQV/z4lnYZLul59VuNqNBqmTZtG586dadKkCffccw/NmjU7qzEvFFRBcBwEScKYWpMj4RCCVos5rTbi8aJYBQGN0UzI560QXayEQngL8yvYDArzi3lpyDgK8osoKijh9THvMHbKMFYuW81rk4dx9XXtGD18Ci5dFNoqooDD7qB6NGYLkk6PIogUFZRw650duap9G+598A6ioswofu/hNQTxe9z8/MM6nnx4GBvX/YnJbMRitVCYX8T6tZs4sD+LsSPe5MFuA2nZuhmx8TGsXvUroZBMoKo4h7+QmpbMqHHP8ebMMTRu1oCy0nIGPN2bH1eu5ZZreyDLMt3vu5383ALKy2zH3SUVFRRXUkmt/P5HHIfbtv25k2AwxIrvfmLH1j0MGtKX5d/8QHZWLnO/ePuME9nB4WpyZZV3LUHX2akcVKqX2u0ac/n9HSI7AFOclcvv73DWXkMAt9xyC7t372bfvn0MGzbsrMe7UFBj84+DKGnQxyWgj4497GYqImiO71oZVtmkELBVNo7KwUAk1QSEI2x379hH7+6PI0kigUAQWZbJycrlucdHo9Np8bi9FWoAnwizxcy1N1zBZVe04p0pH/Dks/3wlxSGI5pr10EuKyRQlEeHm66lXoMMFi/4ljr1apGYnED9RnWpWTuNvNwCJr82A0VRaHfNZcTGxnDTbTdwW7dOlaIAj0dCUhwGo56UtGSCgRCJyQnExkbjdnt45fWheNxe9AYddpuD/NxC6tSvHal7fIS/Vi4DqF2nZsSttVHTBjRv2Ri7zcG117fjhafGEB0ThdPh4r2pH9H/yV5VjnEqCIKIZDBWevCLesMZjady7qjdrnG1PPhVwqg7ghMgShKiToekNyBqdSf1IJB0enQxcZVKSxoSkisErKXUSGLKe6+ScyiPrMwcxkx+kS/mf8OgIf3Izc4nc/8hxk8bQVrNUw++MlvMJCbF8/DAB3h36jyyil2IyTV58tGXyHcrGNLq8H+3P8rD9w/mzv+7FZcrnFVUp9Pi9/npddcgrrz2ch55/EHeGPMOmfuzuPmODjz6wBC+WvQ9Bw8cYsabH/Lnxq0nVO9YrGZSUpOwWM2MHjoJBJg6+zV+Xb2RXt0HcWDvQV4eOokBvZ4jVIXKxRpl4bHBD0XudXRMFMPHDEan13HoYA7//fYH7upxO2+8M5rSknI0Wg2Lvn+ft+eMY+3qDbhdXrIycyg4bNsoLCiuVE/5eIQrzKUg6o4GqWmjY5H0atCayr8btUJZNaPIIUJ+P578HBQ5hCExBY3JXCEGoTC/mEd6DsZhcyKKIkaTgRkfTeLloRPZvXM/Wq0GrVbL7M+mkJKadILZqiY3O5+ighKyD+XSqEl9CgqKWPb1KhYv+BYIp4oeNKRvpM6v3ebgt19+JzUtmWAwRGF+ETGx0TzR70XaXX0Zjzz+IA/eNRD/4ULy/Z/qxQN97zmhT7/fH2Dntj0YDHo2bYBr9fEAACAASURBVNjKVf9pw5vj32PZ0lXo9DoWfDuL2nXSkaqI53DYnbicLuw2J7HxMcTFx7Bz214euHMAFquFHr3upO1VrUmvlYrRbCIqysKBvQeRNBrsNgeTx87A5XQz8e2RPN73BerWq81Lrz1D7DHBdSfiSHryIzWo/1qQR6X6Od2AMpUTc7oBZeqOoJoRRAmNwYi5Zh0steuhs0ZXCkSTZZn4hDg+XvwOH305ncTkBGRZJi4+lo++nM5HX04npUYSoeCZeavUSE8ho35NUGDDuk3Me39RRAgAmM0mjMcUcYmKtnJdh6uJT4xj+Tc/kFarBoMHjMDldFNaXIrX68VoPKoe+eCdT8nJzqO05PgxAjqdlqbNG5JcI5EaNZPxen0UFYQT8oWCIcpLbQSPc33WKAspNZJp2KQeiUnxuF0e3prwHiazianvj2XPrv080vMZHuv9PNkHc7DbHIwb9Ra3X3c/rw57g0FD+pKXk8+t7e/D5XTTu38PZk3/+JR3BqJWi8ZgDO8EVSGgchGgCoJzhChJEQEQLoTjx28rI+C0k5QYy+R3XyE1LZmUGklMfvcV0mvV4IXRT5JeM5XklEQmv/vKaamG/kp0dBTXd7qG/9x4Fdv+3Blpt1jN3PNAV3IO5fHdkhVk7j+Ew+5Eo9WQkprEY08/xBN9XuCa/7Tl8+UfcGDfIX5b8zu9Hr43MkYwGMLlcPPFp19jO4GaSKPVEB0dRcvWzVnzwzr27NrPwu9mc1u3Tjzz2MgqVUNVIcsKfp+fu+/vwrz3F7Hiu58I+APs2bmffj2exu1y4/OGYzbKy2xoJAmTOSzoLBYzSckJdLnrJjau+5P83EJ8vpMbv1VULiZU1dDfQMjvw75nO8ph469kMEaKy5xrZFmmuLCUH1asIRQMcX2na/h9w2aGPv5KpM9Lrz1Dl+6d0ev1yLJMQV4RBqOB6Bgr+bmFFBYU06/H0xHV0G13dqJm7Rr89L9fufeBrlx7wxUnzftTXmbD4/aSlJKAw+6MfK5KNVQVP/+wjoA/wEtDxkVcb48wa/4UXA4nTz48nA8/n8a0SbPJOZTH8DGDeWnIOFpd1ow77rmFx/u8gE6v44PP3uSSS5ue5p1UOZeoqqHq5XRVQ6ogOMcosowrJwt/WcVKYZaMBuiizsy75WwozC/m1vY9KrwVmy0mvvrfR8ctJF9WUs7yb39g3ZqNtLr8EurVr83g/iPodNv1mMxG2l55KTfe1P6crtthd1JcVMrLz0/k9/WbI+2SJDH382ms++V3Wrdtwc+rfqXTreF1LVn0Hbfe0QmH3cnI58azf89BAJo0b8g7cydWSMincn75pwiCPn36sHTpUpKSkti6dev5Xs4Zo9oI/mbKSsspKiyh/C/5eY7UQlYUBX1MbCXXUznoPyaVgb/K3EQOu5PiwhJKisI1hm1ldooLSyg9JtL2r9jKHeFzDvc5sr4j+YNCcqiSasTt8qAcnu/YuY8QGx/DLV1vpPNtN7B65VoG9HqO5NRE7rm/C0u/WE72obxTuFMVOTaNw6nkZbJGWahTrxYjxg0hPjG8+9BopHAcwbc/8NaEmaTVTKX/U72pkZ7M0CdeZe57C7CXOxg++LWIEAAoyC86ZddclYuL3r178/3335/vZfztqILgDFEUhYMHDjGozwvc2KYbj/d9gUMHw+UW5EAgkiYaWcZXXlqh2heCgNYShacoj/JdW7Dt2oa3pLBCMfviolJGPDueDu2688LTYzh0MJen+7/EDW268fB9g9mzc3+lh1lBXhHPDhzFDW268cqLk9i/9yCP9XqeG9t0Y9BDz3MoMwej0UDbqy6tcF7HW69DEATeGDuD/LxCykrLI5/D1+NHKc7jshb1eGnsM8xZNJWnhj7KsMGv4XZ5uL7jNad17+RgEG9xAeW7tlC+awveooIK134iatdJZ/7S95i35B3mLJxKcWEJH773GY2bNUCr1aDT6dBotTRsUg+fz4/P56uUg+j2bp2Jijq7dAQq55dvFv+XzlfdQ8uM6+h81T18s/i/1TJu+/btiYu7+NKbqwFlJ0EOBg/nFxIQpKOpqEuLy8jcd4inhz7K4P4j6Nn3bspKyzGZjMREmwg47Dg8uw+PEcCQmILWEo0ihzClpCEH/HgLwm/SCuDJy0ZjsiBqLLidbqZNmsUvP/7GiHFDaNm6GSOfHcfG38IqkT279vPoA8+w4JtZJCSFS2DabQ5GPT+BX38Oq81u7tKBpx4eRub+cBKtLZt28OTDw5g1fwrj3xrB3FkL2LjuT668tg09encjGAyyYe0f/Lp6PYlJCezZtZ/7e99FMCGAJzuToNOOiB1jVDyFuYXMmbmA+IRYXpn0AlHRlsNv2TJGo4HYuBOrvEIeN578nMh3T0FO2MXWGnWCs8JIkkRySiKSJPH+9Hn8snoDXe++mUFD+kbSbZtMRp54rh9x8TEsnPcVb38wnvemziVz3yE633499/S8A72hcqU6lQuDbxb/l5eHTsTr8QGQl1PAy0MnAnDrHR3P59IuWFRBcALkQABn1v5IpKkhIRlDUiqiRkMwGGTt6g3s23OARcveZ9qk2RTmFzFqwnO4PX6sGfWx790BQFT9Jkh6A6YaNUEQEEQRz6HMSvP5bWVIej320lLW/PAbw8cMZuWy1dSqnRYRAkcoLizF7T6aysLv8/Przxsj3+MTYiNC4Ah7dx/A5/WRmpbMoCF9cTndWCxmNNrwr8HMTyfT6Yq7yTmUz+R3XyWjXi1EJUTAEb5+rTUKnQhXt6pD2w/GImm1KIrCrGkfM++DzwmFQrS7qjXjpo44YaoHv62yastvK0VbhSBQFKVCIN+R7wmJcTz5/KP0HXg/JpOxgjsshPMf9X+qNw67A6PRyKuvv4jX6yM62hq5XpULk7cmzIwIgSN4PT7emjBTFQRniKoaOg6KIuMtLaqQbsBbXIDsD/8CarVaOtzcnu1bdnP7dT1Z+sUy7upxGyVFZUiigCvnIIIkIUgaXDkHw/UENBpESUIQBDTmysFYuuhYgm4XUshP6zaXEBcfw/+WrSY/r5C6DWpX6GsyGyuUaZQkiYZN6h5dq9dH3F8exknJCZFUDVqtliirCYIB5FCI0uIyXh46CaPJSGJSPG+89g75uQU43T40iSkE49NYsvIPJr29kL0FDiSNhuiYKLIOZDN31gJCoRCSJJF54BCLPvmaTRu3UlRYUuW91Vgqq2X+2ub1+jh4IJuJo6cxdeJMCvIK2bNzP6+9NIX3ps6lsKAYnV5LfEJcJSFgszkoKighLycfp9ONy+XG4/ESnxAbEQKlJWURO0phQTE5h/L4dvEKcg7l4XJWTzprlXNDfm7habWrnBxVEBwHRZYJupyV2oPucPKzqJgo0mrVoHnLxnjcHtJqptKydTM+n780rEpSFKLqNcZarxEoCoocqmAU1UXHoLGE34AFSYO1XuNwVLLPS2xyMk89/0jkQfXx7EUMHfVExMvFaDLy2uRhkchgCBt0x0weRkJSWL/52dzFjJ0yLBL9GxVtZeanb1BUWML8uV+Sl51PwOnEvmcbAaedgN9PaXEZHyx4k7dmv4bFasZuczC4/wg8go6Xh01hwivT+WL+N/S6+0nW/rwRRVH48/dw5VFJknjl9aG88+EE7OV2BMLqquLCykFcWosVrfWox47WGo3WUnE3kJdTwJ0de/Hx+4tYuWw1u3bso/tNffjso8VMmzSbHrc9QkkVAWIlRaUIgsAD3R7js4+WoNdpua/Lo3zz5X8jBnBbuYNXh03m2YGjKC+z8cKTrzJu5FskJMXxyP3PsH9P5gl+M1TONyk1qo62P167yslR3UePg6Io+EoKcedWVK9ENWyKxmDCbnPw/jufMHfmZ/R97H4+mfMFLS5tSp8B91EzPYWklASc2ZkowQDmmnVwHcrEUqsO0jEJzOTgUY8ZV9YBgu4jgkfAWrchxeUuut74IF6vj8uvaEW/gT2JjYtGURRMZiMZdWtVWFsoFKKspByX041eI6IjhB8Rj9ePJTqKxQu/Z+rEmQCIosiSFXNIMAj4SgoRdXqE5FqUlpQz57353P9Qdya9Op2WrZty+12duf26nhUyhtZrkMG78yaRdSCHPvc+Sb+BPYmOsfLBjE+Z9ekUFs5bwn+/+5HPl32ATqfDbDFVWOtR20s4GvvYrK7BQJAxL03m80+XAvDIEw+yfcsufl5VsWzgm7Ne4/qOFVMPb9u8k8z9h9DrdTwzYCSKolC/YR3e/nA8AX+AuPhYjCYDWQdyeKDbY9htDqxRFt6eMx6z2YTH7WHeB5/z5PMPY422YrWqpTH/Dk7HffSvNgII18QYOe7Zs1YN9ejRgx9++IHi4mKSk5N5+eWX6du371mNeT5Q3UerCUEQ0MXEoYuNBwQEUcKUVgtREzYymi0mbruzE9M/nMB1Ha/hrdmv8X8P3km9+rXRKT4Cbgf6mDhCXi/23dsIeVx4CvMq7ApEjTacRjoUOkYIACh4CnKIMun4cNE0LmvXkuLCEjZt2EJudgH3demP31e5epYkSSQkxVOzViqxVgOS14nOVkCyRYeiKLz31oeRviazMbxbkCQQRIzJNVB8HrIys6mVkU73m/rw688baH/DlYRCIRRFoUnzBiSnJIbXLokEAyGiY6MZ/OIAln2zihatm1EjPYVunXozf+5ihgx7jK2bd/Hf736gtKSiXUDUhFNpSzp9lam9xWNSbyuyjPiXOhD9n3iQOnXSKC4qxeVwRtx1RVFkxbc/0bhZAwyH02I0b9UEQRCY8+58nE4XkiQRExcVeYNMTkkkJTWJV158nbcmzuSBfvdQUlTGhrWbzqi62snw+9XKZ2fDrXd0ZOS4Z0lNS0YQBFLTkqtFCAB8+umn5OXlEQgEyM7OviCFwJmgWs1OgKjRYqpRC1NKGhBW4RypDSBJErXrpJFo1YLXg5xaE51eg2IrwZCQBIKAt7gAS0Y9nJl7w+qhYLBCOuojKFX4tCuhEFqthnp103huxCB2bNvD2p/WM3PaxzRqWo+ExKpd3Ow2BzmH8vjhv2to1rIxzVs0whAbjaOwJPIA0ul1LFj6HjqvHV1cAoa4BDwFuZgTkjBbzbw1YSY9encj+2Au/Xo8zZJVH/HMsP60aN0cSRQZMnAUD/XvwYhnx5Gdlcekt0fR9qpLSUiMp26DDLb+uROtTkuT5g2RJIl1qzfQ5opLOVCeRa2MtJNGE2u0Gno9ci9fLfoen8/P8m9+4MXRT7Hmx98IhUIMeOJB7rm7I0aTgd0HsqmZEovoN6CPjiUpJZHRk57n7pv7kl4zlW49bmPi6Gk0aFyX/k/2ZuIr0xj84gDemzqXvJwCRk98nkmvTmfM8MkMGtIXvUHPgX1Z5OXks2zpKlq2blbJ1nKmlJaUs3rVr/y86lfa33AlV1/XTg1qO0NuvaOjahiuRlTV0BmiKAq+4gLcedkAaKKiMSam4ti/G43RRMjnRdLrMabWxHFgN8gy1roNK+nCIeynb9uzAyV49E3RVKMmAbuNgNMO8TUoKHXwzZIV1G9Ul2uvb1dlSodgMMhXny9j1HMTIm033tyeka89gyhJjHx2PCuXrcZkNjJ/yQxi8SD7fUh6PUGPB2vdhmTlFrPtz50EAkGuub4dv/3yBxpJJDomiuceH02Hm/9D38fu4+vPlzHjzfAOw2Q28sXyD/lhxRomjp7GkJcG8t1XK8nNzuPTr99j66YdvDNlDqFgiI8WT8diMZ/0/vr9AYoKilm88DtMJiO33tEBt9vLkoXfckuXG6kRa8RXmIfWGh0uIWqNw5SUjNFspqiwhD0790eqrG3dvJOk5ASmjJvBgb1ZTJ09FqPJgKwoJCTGsX/vQULBEJ/O/ZJBz/RFQOGODr2pU68Ws+ZPOatiN0dw2J2MHfkmS79YHmnrevfNPD/ycSzWk9+Pfzv/lMjifwtqiom/CTkYxJm1j6DzqFeRITEFUauN2BVimrbCU5CLHPChj01AMpqQdJVz24eT0gXwFuYhB3zoouNQFAV3ztFoWGv9JgTs5eHaBsepklZcVMrdN/fFVmZDlhXkw2qo71Z/QmqNZMptDr5atIxfflpPp1uuo9u9N1G+/U8ATGm1wBjF0iX/xeV043S46Nr9JlDggW6PUVJcRotLmzL5vVcZ1Pt5dmzbU2Hur1Z9hNVq4eCBbNJrpeIPBMjLKWDLH9uZMu49omOimL/0vbNKpHeEkuIySotKSNYFCbqcaEwWikI6jBYTNdJSAPB5fQSCId6fPo+ud99Mvx5PUZBXxPQPJ7Dgo8WYrWaeGzGIkc9NAEXhscF9eGbASFLTknhscB96d3+c8VNH0Pm26yuoqc6UgrwiOl91T+RnAuFd5fe/fBZRt13MqIKgejldQaCqhs4QQRTRmCwRQSAZzWijonFm7kPU6ZEDAVzZmRiTUlEUBVGrRQkFCfnD9ZBF8ah6RBAEJJ0OU42aEQETcruQjCY8pjhcbi/2/FKMBi0+mxOv10coFMLl8hAdYyUpOQFRFBFFgZcnPIfJZESr07J7xz5eHzMdORT2WIqLj+WBfndze7fOWC0GnIcyQRARtVo8+bmYM8x0uuU6RFFEVmSyDmSjKERSUjgcLuSQTFqtGhUEgU6vw2QyEp8YR0xcNB63F2d+Eak1khn70psABAIBvB5vxM30bNDrNMSZdQTLy8MVxdxOYmKSMBzzZq036NFzuPZCn6EE/AESkuKY9OrbvDzheWZN+whRFHnxlaeQQzI10lOY+ckbuN0evv9qJXM/f5u6DWpXixCA8M9YlMQKgkCUxJMWO1JR+TtQjcVniCCKGOKTIvEAgiSBApLRGHYbrdMARQ4hSBJBtxPbzi3Y9+zAvmc7std73DEFSUJjMAECXksCTzw8nDs79KLL9T0ZPmQCPp+fj2Yv5JZre3D3TX24v0t/sjLDUbrBYIjXx7xDn3uf5IE7H2P1ql95Y8YraHV6gsFwOUyHzcn0KR+Qm50fTuuQUANTRgNEgwE5FKS0pAyn001UlJWMujUZ/cIkGjdrwOKVc/G4Pcx4cw4vvPwELS4NF/U2W0y8NnkYlqjwQ1iSJCxWM0kpiXw0eyF2m4PFK+fSonUzhjw2CqfDRWFBMV6vr8p7cCoYjQYMWgnFGovLGItijUOvFSPG4WORZRm9Qc+0D8Yx5d1XsRz2Auo3qCfRMVGkpCZRIz28i6iRnkL9hnV4bHAfWl3enKjo6ktDYbaYuP+huyq0PdjvnlNSk6monGtU1dBZcmwKCkQBAQFRoyEUCAAKKAq2nVsqnCMZTVhq16ukJpJDIZBDKArIcog5sxYxdeKsCn3emDGad9+ay67teyNt13W4ilfeeJGSgmIee2goHreHVyY+z2sj32L0xOcRgAXzvqJhk/rcemcH+v3f07icLmZ98gbvvzufhwf2RBRgyviZ/G/5z3S791Yef+5hNJJIXm4hFquZT+Z8wc1dbkQjSRQUFNK4aUPKSsoxWQxkZ+VzxTWXVXrTLy0pw+f1k5gcT35uEbZyGyOfm0DWgWxmz59C00saIWnObHcQDAQI+PyUlNqIi4tGr9chHSett93uRA7JbPljO3Xqh11uY+NiKrm0nmvKS23s3X2AX9ds5MprLqNewzpnXF/534aqGqpeVBvBP4ygx419z/aKjaJIdIOmFcogysEA7rwc/OUlCKKEvmZdRr04me+//l+FUx95/AF2bd/Hjyt/ibQ1b9mYOQum4CvIxaboCASCxOtkHIqetWv/4JsvlkdSVNSpX5vBL/bn8T4vAHBf77twOl18tahixsWlP85j/dpNrFr+Mx1v+Q8vDRnH9Z2u4aFHeyBpJKJjrAQDQVwuD1FRFhKT4zGZq36wFhWW0OuugShKWEXy2uQX2bxpB2Wl5dx+Z2eSayRiPs655xJFUcjLKcBg1BMbFxP5fCRnkcrfxz9REIwaNQqLxcKQIUOqPL548WIaNmxI06bVV9siMzOTX375hfvuu++sxlHjCP5hHEkzcSw6azQhnxfZH9a9K4qCr6wkXLNAUcK2hLIibu5yY6XxbrypPXt27qvQdkPna5FEkZDbhcVbTozsIuR0oNNKNGvRmF07jvY/sPcgOp0ukpYhpUYiB/Ye5K/YbQ62bNqBpJHYvXN/+FoEAaPJwO+//cndN/cjJzufj2cvpOedj53wHgQDQfJzC7n7/i68N+91Rg2dyKRX3mb22/O4s2Mvdmzdg63Mzv69B8ncf4iyE5TAPB6lJeVk7sviwN6DJ0zTfSwul5v+Dz7Lc4NGs3fXfu6/YwAzp32EU00xoXIKLF68mO3bt5+842mQmZnJJ598Uq1jngqqIDjHCBot1roN0ZjMCJKELiYOY2o67pwsQn5fJC9/wF7x4RewldG8RSMGvziApOQE0mqm8uobL2KJsvDalOE0btaA6Jgo7nmgK12734Sk02PJqI/s96H4vBCfQl5BGb/8+BtOh6vC2HEJsdSuk0ZcfAwJSfF0vOW6CsclSSIxOYHb7uzI9s27uPLa8EvE/5atZs1Pv3FV+7a0uqwZA3s/z/JvfmD81Jfweo9f/lGv1zFq/HM4bE52bd9XoTaAoihMmziLlctWc8eND9Ll+p4MHjAikl7jVCgtLuPpR4bT5YYH6Hrjgwzo9WyV6Sf+itFoYPK7r7D1zx3c1bkPiUnx9H2sJ5a/WWWk8s9hzJgxNGrUiA4dOrBr1y4AZs6cSZs2bWjZsiV33XUXbrebX375ha+++opnn32WVq1asW/fvir7ASxcuJDmzZvTsmVL2rcPF3AKhUI8++yztGnThhYtWvDuu+8CMHToUFavXk2rVq2YPHny33bdqtfQOUYURQSDEVN6BgCyz4tj3y7kQACNyYy/vJSAy4FkMFXKbRQbZeLe+26h0y3tEUQRqyQT9LixZtRgyruvgCAQFWXBEmUJeykdTnSHICDYimnarEGlXPyt27YgMSmed+ZOQpZloqKtuF1uSopL+fKzb4lLiOXF0U8SFWWlQeO69B14Pwf3H+KFl59k7er1XHr5JeTnFUZqAgsCxMRG4/P78XgqFrk/QlxCLJdc2pSpE2fRtEXDSseDoRBO51FhtXHdn6xf+wfXXn/FKenxf1m9gT82HLXD7Ni6h++XruKO7jdhPoGPviiK6HTaiG3DaDQgql48Fy0bN25k/vz5/PHHHwSDQVq3bs1ll11Gt27dePjhhwEYPnw4s2fP5vHHH6dLly7cdtttdO/eHYCYmJgq+40ePZply5aRlpZGeXn4hW/27NlER0ezfv16fD4fV199NZ06dWLcuHFMmjSJpUuX/q3XrgqCvwFBCBuQfSXF+EqLEDQarLXqAODKzgRBJKpuQ4JuFyFP+IFoSEhG1OkwSBpSDEeyayr4HXaUYABrchyiRhuJdFaUsGE6qn4TEAScB/choNCydVO+/O+HrPj+J+o3zODSyy+pFM2q1+sY+Exfej18L4IoEBcfG1EDdb/vdspLbWg0Gjreeh1Ou5Mtf+xg9ap1THnvVT7/dCmP9hzClys+5OdV67jm+nZVCoPS4jIK8oto1LQ+NdJTyM3OjxzrN/B+5syYX6H/lk07CAaCXHvDFRWS61XF7h17K7Xt2LobjUai4y3XHTd61+VyM/ChodTKSOeZYQN48uFhzHz7IwY+00/dFVyErF69mjvvvBOTKfyz79KlCwBbt25l+PDhlJeX43Q66dy5c5XnH6/f1VdfTe/evbnnnnvo1q0bAMuXL2fz5s0sWrQIAJvNxp49e9Dpzk+dDFUQ/E2IGi2GxGT0cQlhByONFr/jcHlLRcaZtQ9jShqiriaiVlshEZtwjDeMIa7qusKSToe1bkMEMZzm+shnk16gXsMM6jXMOOH6DAY9BkPlYDeNRhMpfgNgsZrofPv1XH5FKw4eOMSLrz5FYV4RE16eyqrlP/PNT59WKQhqZqTR9JJG7NudycRpI/lhxRoKC0roeMt/0Bv0laJrr2rfhhFDxtG0RaOTCoKbbr+ROe9WFCT/ufFKpk6aTXrNVK6+rl2V5xmNBt6aFc60Ghcfw7wlM7BYzaoQuIipKq6jd+/eLF68mJYtWzJnzhx++OGHKs89Xr8ZM2awbt06vvnmG1q1asWmTeEcVlOnTq0kVI439rlGtRH8jQhiOHjriKdQhUykgQCuQ5n4yorDAWfHiR4+EaKkifwiH/u5OjEYDOj1OqKiLQx94hW6dXyIKePe4/uv/4fPF1YPVUVsbDQTpo3kz9+30fueJ9i7OxNJEhk7YgoLP/6KXo/+H2k1U6hdJ52R455l8+/bKCosIetA9knXlF4rlfFTR1ArI420mqk8+9JACgtKyNyXxZZNO457niRJZNStSUJiHKIoRj6rXJy0b9+eL7/8Eo/Hg8Ph4OuvvwbA4XCQmppKIBBg3rx5kf5WqxWH42hmgeP127dvH+3atWP06NEkJCRw6NAhOnfuzDvvvPP/7J13dBXV2sZ/M6fX9ISEECB06Qg2LNfey4cdC6IiCjYQhKtixwZixYIduYoVvXbsBfRSFJQaSAik95xepuzvjwkHAgkda561stZkn5k9e07Z795veR4UxaCVKSgoIBQKbdfn74W2HcF+hK5pRpGYJDU73gzJZMbVoTPhsk0IXcPs8uDMymlWdfxnxObc90OPGMzC7xYn/POp6SnYbFZqq+tISvZisW7ZyVisFvI6tef4U47ixadf4+v5PwDGqvyy0eeTmZXBU69MY9OGUubOnseCbxdhMpnocUDXnY7Hm+ThxNOOpku3TqxbW8TnH3/LV599j8Vq4ZSzjqO2ug5ZlvcZeVwb/p4YNGgQ559/PgMGDKBjx44cccQRANxzzz0cfPDBdOzYkb59+yYm6gsuuIBRo0bx+OOP8/bbb7d63sSJE1m3bh1CCI499lj69+9Pv379KC4uZtCgQQghyMjI4L333qNfv36YzWb69+/PZZdd2du5KgAAIABJREFUxrhx436XZ9+vdQSSJJ0EPAaYgOeFEA+0cM55wJ0Y0r3LhRA7TKD9q9QR6JqK4vdhcjiRLVYUf6PBNWSzN5de1HWEpho59rKU2C382REMhKirbeCBOx7jpx+W0q1nPnc+OJFXX3iLRQt+5oIR/8e5w88geRv9Yr8vwOcff8MT055HkmWe+88M3pzzPp99+BXtO2Rz061jmP38mxSsXs9tU29i4JC+OLdRIGsNjQ0+Xn9lHq8+/yZ2u43nXnuEj9//nHff+JjUtGRuuftGDujXo0XXVRv+WPwZ6wj+yvjTFJRJkmQCCoDjgVJgMXChEGLVVud0A94EjhFCNEiSlCmE2KHe3F/GEKgqwU1FaOEQ1uRUYvU1OHI6YEtJR95Lrp0dobHBh6qoeLyenQq067qOLMuEQxHsDlvieHNG0I6wbk0RV18ygYsuP4e+A3qRnpXGpGvvZn3BBo4+/nA+//gbHn7mbo4+fijmJjfX5vupqkpjgx9Zkgxxn+ffTPTrcDp4/8vZWCxmUtKSd5vrJxaLEfAFMVvMfDjvcx6664nEa2aziQ+/fS1BKdGGPw/aDMG+xZ+JdO4gYL0QoqhpEHOBM4GtKzBGATOFEA0AOzMCfyXIZjPujvn4C1YSq6/BmpzaJFQTQRMCk82O3AolwuZdghqNIJstzeIKrUFRFIrWbWTqlEcoL6nk5DOP5fKrh5PSSsZMwB9k9YoC8rt1YuOGElRFpWv3znwwbz6nnHkcZrOZDYUbMZvM5HbM3o72+stPv6Omuo5HH3iWfoN6c+yJR7C+YAMPPXE7JpOJoUcNoVfvbqxduZ7cvBzi8Th1dY106doRi9VCekYqtdV1fP7Jt836jYQjbCjcRI8Duu4R4ZvNZsOWaaOx3scn73/R7DVV1Vj84y8M/ddBpKWnthG+taENTdifweL2wNY6j6VNbVujO9BdkqQFkiT91ORK2g6SJF0lSdISSZKW1NTU7Kfh7lvomoria0RXFCSTGcXvQ4tGiVSWEShai3/9anSl5SIsPR6jce0KghvW4V+3ilDpRnR1x6pWgUCIUcPHUVtdj8vj4pVZbzD7+TdbVcMKhyNcfelEHntwFj9+t5hRw8ezdnUhy5euZGNRCU9Of56R517PJcPGcOUF46ivb17w1r1Xl8RxTVUtHTrmcPhRB+Fw2Llh1K106NieubPfY+R517Pox1+4+pKJ3Dz2zmbjsdqsdOzcYbux2R02/n3DPTTU+3b4zDuC3WEjv1un7drTMlIZNXz8LhWctaEN/xTszx1BS8utbf1QZqAb8C8gF/hekqQ+Qohms44QYhYwCwzX0L4f6n6AgFhjPY7sXOypGQSK16OGg1jcHtRQAF2JE2uow5HZnJ9f11RDz2ArumLF34iu5CCbLdTXNbJpQwlIkN+1E7FojGAwTEpKEnM/fI7ysipKNpbRKb8DLz39OjVVdcTjMX77ZTU9encjNS2FjMxUklO8PDN7GldeaASjxowbyarf1nLI4YNAgrdfMzImOnXJ49Z7x7F8yQosVgs9D+iK2WKmW88uHDz0QP63YCkVZVXYbDYsFgurVhRw7YQrGHvZJB59birr1xZy0zW3403y8Oq8p/A1+tF1HY/XjTfJw7/vvoHLzrk2MelffMW5/LzoV378fgmRSIQU9oyUze6wM2bcSBYt/JmKsiqApsBxPYUFxRSt39gsLbYNbfgnY38aglJg6+VeLlDewjk/CSEUYIMkSWsxDMPi/Tiu3wWy2Yw7rzMgIZkMvWM16E+I1gBosaghXbm1i0IXLa7+RRNF9M3X3gXA6OtHcPwh5/L0Kw9RVVHDnZOn8fLbT6CqKvPe+IhNxWXMfudJFv/4C7dP3BKjv+r6S7n48nMwmUysW7sh0V5cVMKJpx3NzBkv8OisqeTktqOqooZ7p09m0vV3U1ZiFIBlZWfw+PP3cc2Im7nplmsYM24kHq+b1LRk+g7sRSwa46lHXiIpxYvL7aSqohaAaDRGeUkFb8x5n6OOPZTThp2IzWYlr1N73vjoeTYUbsLlcvDTgqU8Of0FZFnGtJdaANnts5j97kzKNlVgMptYsXwNU2+bAdAiZXUb2vBPxf40BIuBbpIkdQbKgAuAbTOC3gMuBF6WJCkdw1VUtB/H9LtiW7/+1kYAwJ6WuZ2fWjKbsaakE6nYcq4kmzDZ7FQUFbFo4S/YbFbC4QhDjxrCyPOuRwjBhSOGUV5SwYb1G5n25B1cceE4JFlm8KED+Gzhmyhxha8/X0C3nvmoqoaqqjw89SluvXcc6Rmp3Hzd3Zwz/HT6D+pDeWkVZ5xzIsuXruSnBUspK6kkPTOVUddeQo9ehu9+1NiLqaqooX1eNoqqYLFacHtcLFu6gg/enc/cD2fxwTufEQyG+PDb13hi2nNEojFuvedGzj35So445lCSkr3YbFZS01P4/uufuPfWGQmx+PMuOatVNtPdQVa7DGqr6xhx9rUJt1SvPt33iVJaG9rwd8H+Th89BXgUI330RSHEVEmS7gaWCCH+Kxmz4MPASYAGTBVCzG29x79O1tC20DUNLRImUlkGCOyZOZidrhYLx3RVId5YT6y+FtlixZmdi2yzsfC7xVxz6c2AQR+d360j995qrHCffPF+OnXJo66mgXfmfsiNk66itrYeVdV44ck5jL3pCpDgyekvcPWNl4GA9MwUlvy0nAMP6ocuBIsW/sygIf2Y/9E3HHPiEWiaRn1tA489NIsJt43liWnPsWjhL7g9LiZOuRZJkrhz0kNYLGYuH3MRF474P8xmM5FwlCWLltG9RxecLgeapqELwexZb3DE0YeQnJrEh+/O5+QzjqV3/x7YbDb8vgCV5dX8+MMS+g44gM5d8khJ3Tdc/ZFIlLqaer776key27ej38AD9okOcRv2Hf4MWUONjY289tprjBmzYzbdbXHKKafw2muvkZzccmLGH4E/Tfro/sKfzRAIIRC6jiRLSNLOXRm6qgLstHJYCIFQVWjiKQIjKHvWcSPo1acbo68fwVUX3cRZ55+C3xfguy8W8tYnL1BWWskNo26lR68umC1mJtw2hjEjJpGZlU51VS2dunRg/L+vAQQ9endl/kff4vG6eP3leSxa+DOdu+Zx97TJTLtnJr/+vJJuPfO566GbWfjdYp6c/kKzMc5+dyajLhyXkLJ87b/P0Ke/8eWLxeKEAiHMZjNTJjzAsAtO5bMPv+Kzj77hgL7dWfnrWmbNeZg+A3q1SG2xGVtLW+4LmcuWEA5HsFjMWFrJ4mrD/sefwRAUFxdz2mmnsWLFimbt++t7tz/RpkfwO0JXFWINtYQ2FRKpqkRXdpzZoytxEALZbEZX4js8X5KkprTRLQYjNT2F1//7LBlZGUiSoU98zQ0juObGy7j9gQmsWlFAceEmLrvqfH5btpqC1YXkdc7lhslXsW5tEb5GPw88NoWC1YWsW7uBSDjK0ccNpVN+HosW/gzAiKsu4P7bH+PXn1cCRr3A+Ktvp9/A7cU3igtLmgVcF/+0PHG82eXjTfZwx4MT6NCpPTffcR0ul5PlS1dy4Yhh9O7Xc4dGIBKO8tuy1dTV1hONNB3vw2wfny/Awu8WM+nau5l2z0wqyqqaaQq34c+LTz75hNNOO40hQ4Zw2mmn8cknn+x1n5MnT6awsJABAwYwZMgQjj76aIYPH07fvn0BOOusszjwwAPp3bs3s2bNSlzXqVMnamtrKS4uplevXowaNYrevXtzwgknEIlE9npcvwfaDMEeQtc1ItWVhEs3ogT8RKvLCRSvazXNU9dUgps2ENxYiK7ECWxYR7h8U2KHsCswmUzkdc5lyn3j6dK9E0efMBSnRcbptLNpQymLflxGx/wOvDLrDQ7o24OuPfIpKS7n8Qefo0u3TiQle7nlxql065VP915dcDjsJKV4SUr2JoqsOnbKZfWKgsQ9JUmisrwaj7e5fq8sy3TMz03QN3Tv1YV/HXcYoRZEXWRZRtd0pt/7FMFgiD79ezJ39jxWrVhLLNa6drGma9x41W2MH3078z/6hpHnXs/nH3+Lr9FPtBVOo93B4oU/c/UlE/j2y4XMfWUeF55+1S6L2rThj8Mnn3zC1KlTqaysRAhBZWUlU6dO3Wtj8MADD9ClSxeWLVvGtGnTWLRoEVOnTk2Iz7z44ossXbqUJUuW8Pjjj1NXV7ddH+vWrWPs2LGsXLmS5ORk3nnnnb0a0++FfzTXkK4qCFUDRBPR2665BnRFQddUrEnJmB0OwuUliKYYgND0Ft9VSTbhap+Hv3ANjat/RTJbcHfMTaz4tXgcoSoJPYHt9IxVBaFpCCGwW8w4nQ50JY5mktBDMX5btpo7HryZyrIqTjjtaCZOGUtleTWqqtL/wN7cfPu1JCV7eWLa86SlpZCcmkQsFicciiLL8NhzU7lh1K14kzy89ObjjB05iQm3jSU3L5vbbnqApGQPBx7Uj6WLfqVbz848O2cGoVCYjKx0Zr/zJIqqoioauq6zqbgUk9lMUpIHJR7n2Sde5ejjhyLLMk+9/CBuj4u5r8xDUzWqKw0he4/XjdlkJhyOEAqGSElLJj0jlVfefoKzT7ycX5b8xlnnnczgQwcwfvQU2rXPYsy4kWS3z9qjwrPGeh8vz3qjWVt9XSMFa4pIz0yjurKWgD+AADxeN1ntMlrtK+APEgyGiMcVUlOTsVot2Haw09lVbO1G3FWX4j8BM2fOJBptvhCIRqPMnDmTk08+eZ/d56CDDqJz586J/x9//HHmzZsHQElJCevWrSMtrXkKcufOnRkwYAAABx54IMXFxftsPPsT/9gdga4oBIrX4ytYga9gJYEN63bq2klcV7QWf8FKAoVriTXU4eqQv+WEVopVJUlqkq00fI1bDEAMLRYlULga//rV+NauIFJZhhbfslLWVYVQ2SZ8a1fgL1iJf/1qtHgcyWSmPhDh5WfncsWYixh14Y1kZKUx7IJTsVtMZNoE7bMzuHfazdTV1DP8jNGMvGY4lRXVXHTm1cSicSKRCAu+XUxGVhqz353Jt18s5MVnXue9L2ZTXLSJ2c+/yYtvPEooFOGeGbcw/8e3eO61R5g45g6+/ux75n44i4lj72Tl8rX4fQHOO+VKfA1+Cgs2cO7JV1BTXc/X839gzGWTOPTwwWzaWMZXn37Pv44fSlKyl1OPHM7ZJ4zE1+DnyenPc9pRwzn/1FFcfOY1VFfWUrqpHKUp26do/SZ8DX7Wrd3AB+98xvAzRu/xCt5kNuFqgUrD5XZSXVnL+Gtu5/+Ov4xhx1/GjaNuo7qqtsV+qqtqufD0q1i5fA2hQMg4/q0AVdX2aFyboasqodJiorVVCE0jVFpMrK56t3aQf1dUVVXtVvuewuXaQo3+zTff8MUXX/Djjz+yfPlyBg4cuJ0xAqOyfTNMJhPqX+Tz+scagnjAhxbeooqlRcLE/TvWyhVCEKuvQYtt+QKowQBCVTDZHVhT0pFaYQ7d7BoSQuDKy0dX4kQqSxGqSqSqvJkRijfWG4HizWOLxVB8WyY8XYkTra4AYP3aDbw5532uuOBGNhWX8c3nC/hl0W/c8e+HEQ43orIYUVVCdk4mZouZc0+6nGsuncjAIX2JRCLMuP8Z0tJTiEZimM0mDj58EEt++oXzT72S2c+9yenDTmTRwl9Y8tMveDxu2uVkoqoaJ55+DDPue4bT/3UR69ZuIL9rRzxeNx6vm9GXTGDc6Cn0HdCLyopq6mobUOIKk66/mwfvfIJDjhhMY4OfWU+8Chj5/rqu8+4bHyWe0e8LYLNZuXX8/QwfeTbvfzmbTRtKWbF8NecMPx2AhnofG3eBproleLxubpw8GrNlywq7V5/udOnWme+++jERIwFY+esavvj425a6IR6L039QH26+9i5GDR+P2WLGm+RG0/bOECBJ2FLSiFZX0LjmN5SgH4s3KSFE9E9GVlbWbrXvKnZEAe3z+UhJScHpdLJmzRp++umnvbrXnw3/2G/VZiWwnbU1gxCo0e2DP5oSw5XXGWd2+1a37ptdQ978HqhBP+6OXbGlZxncQ7HtVxZbt+nxll8Xuk5hwYZm7S88/RqnnX0Cp555LESN59GVOA5ZZ8So8wn4g6iqxtjxV/Dk9BcpLCjGk+QhHI6gazrpmWkcNHQQ9XWN5Obl0K1nPtPueZKS4nKSko04QSQU4aTTjyE9M5WGeh9HH384DqedBd/+jwsvG0YwEEKJK1wzbiQvzPwP8dgWKo3kZC9Z2ZmkZ6Ty+cffANChY3vKSiqaPUc0GmPGfU8z98NZjL7+UtKz0njl7SfIyErnpWdeT5zn9rYuRbkz5HftyIff/Ifbpo7nyRcfaHJbOSlYU7jduS21ARSsLuKKsRehqhoBf5Bzh5/Bz4uWN3vmPYFsMmF2e5BtNoSmYnF5kK22NkMAjB07Fru9eUGg3W5n7Nixe9VvWloaQ4cOpU+fPkycOLHZayeddBKqqtKvXz+mTJnCIYccslf3+rPhH+twtKWkEatrzltkTWlZ/WszJFnGlpLWbHUOYE1KxWzfMWOnJEnINju6ohCrr0WNhBG6jslmx+pNJhIJb30yZpc78a/Z5dmuP2tyKpLJxOFHH8LDU59GCIHZbGLmSw/w8NSnue2u69AqitGSM3F6k1hXUMw9t87g2BOPoHD9Ri479zpefusJvvz0ezas38iQwwYhyTL/fetTvv18IeddfCYfzpvPjPue5tFZ9zbb8nqS3Iy76jbiMYVzhp/O2699wFHHHka/gQdw2TnXMfSog6ipruOKC27ghdcf5epLJ1JRVoUkSdww6SrmvPAmp5x5PGAEkn9btoo7HpiIzW4jFt3iEsvrlGv43G0Gi2pleTV3TZ6WWG0fduQQMjN3/JntCDa7jZzcdpx38ZnN2k8+41jemP1eorhNkiROPev4Fvvo3b8HI86+lk5d8uiU34GH73uaZ1+dvteVy5tdQ7qiYEvLJFZXTay2Glta5j8+TrA5DjBz5kyqqqrIyspi7Nix+yQ+8Nprr7XYbrPZWg1Gb44DpKenN0s9nTBhwl6P5/fCP7KOwPCzCpRgAKFpmB0OtFgUiyd5pz8yXVWJNdYRq6kCWcLZLheT0wXCoIGQzWYks6VVZktdVQiWlyInp6NWlSCQsGZ3RIr4idVUIZvNOHM6IFtsgGgKHstokRDh8hJ0VcWeloEtLQPZbKGh3sfypSt49MFnCQXC3P/Ybawv2MC/jjuMjIxUfv1lFbmd2iN0wbtzP+Kci85AiSvMe/Njzhl+OiZZRtM0VFXDbrdRW1PPxuJS8jq1x9fgp7K8mv4H9sHhtNPY4CM5JQkJ+OGb/9Gnfy9MZhPLlqxg4OA+OF1O3vzP+ww5dCBut4tvPl/AeRefQX1dI4UFxfTu35OG+kY8HjdJKV7icYXkZA8N9T4cDjt2h51P//slT854kcuvGc7/nXcKNrsVs9lMOBRBkiX8jQGWLV1BZrt02uVkEQ1HcLmdZKQngywjm/Z+kvQ1+LA7bEyZ8CBms4k77p9AJBpLCPJsjbraBt6a8z5HHnsojfU+lv28kmHnn0q7nMy9GoOuaahBP7LVislqR9l8bHP8LXcFf4Y6gr8TdreOwChc+gv9HXjggWJvoCmKiNRUCd/6tUJTVRGurhC+9WuEpii73IeuaUKLx4QWjwtVUUS4qlzULV8s6pYvFvUrfhZKJLzD64vWbxQnDT1fFK4tFGtXrhMnDT1flGwsE2osJtRYVIQryxL9Na5bJbR43Bh7PC60eFzomtb8mTRNlJdWirKSCtFQ3ygqK6rFjVfdKq68aJyorKgWP/6wRJRsLBPVVTXitKOGi0uHjRWFBRvEB+/OFxeddY0oLakQc154S1x05tWiaP1GUVleLXy+gKisqBaV5dXikfufEeOvvl1UlleJe2+dISbfcI+oqa4Vvka/qK6qFdVVNeL5mXPEsUOGia8++14s/PZ/onRjmfj4/S/E4G7HiXNOulxUllc1G3NtTb0oWFMoThp6vli9okCs/HWtOGno+WLd2iJRU1UjNhWXipMPv0Cs+m1t4njdmiKh67qoq6kTk2+4V/TNO1L0zTtSnHXspaKirEoENhYm3qu9QTwcEg2rl4toMCCigYBoWL18h59pMBgS9XWNorqqVvh9gb2+/2Zoqpr4rLc+/jti1apVf/QQ/lZo6f3EYHRocV79x+0xJZMJi9tDpLIM39rfEKqKM7fTbnHTS7KMJBvuCi0eb6KNMCA0jXBpMe5O3VrdXXiTPGS1y2D4WWPQNZ0DDxmA0+XEZLUSra8hUrWFm08Lh4gHGrGnZrSqXyDLMtnts6iuquXJh19AkiS+/PR7Jt15PRPG3MHypSv54Js5/N9xl+H3BcjrnMt9tz/KtTddyUmnHc01l9xEcVEp02beyY/fLaaivIox40fibZdBbU09gw7qx5wX32bpouX4Gvw89OQdSJKEN8lwWb3x6ns89uAsHE4H8978mG8+X8Ct946jrLSCWCzO2lXreezB55h89/V4vR6EEDTUN9JQ76Nj51wuHTYW2WTUIrg9Lp557BWOOfFIuvfM59JhY7FYLXTK70ByahKSJPHrsjV8NG9+4vkVRaGxrgFXuptIbSX2jHaY9kLpLRyOgWwmtKEABEh2B6FwlKRW3H8ulxPXnocqWsXWAkb7U8yoDW34++0xdwJJkpAsVixJyQhVRbJYsCYlJ9I6dxdC2z49TIvFQLReoZqU7GXshCsIhyJEozGun3glySle49rw9gVZWmT7tpagxBVSUpIpLjQI67KyM9hYZGTVCGFk4px/yVkMHzGM0dePIDUtmV59e/DkSw9yz7RJeJM8ZLbLYEPhJgI+I6isaRoOh52Bg/tQX9tAl+6d6NqjM0t+XEZjgw8hBCt/XYPD6eDRWfdy7kVnMOq6S+g3qDeHHj6Yy0ZfAMCGwk34GwOGi0eS6JTfAVmWuXzMRUSjMcKhCFffMIL1azegqTrPz5zD1TdeRiwWJxgIMWbcSJKTjfeoYPWWwG2Hju157tVp5CTZsCenYEtKIVpdsVP9htYghOCzj79FcyUbVOBCR7hT+OLTH/aovza04a+Af5wh0FWVeEMd8YY6bKkZoOkEi4v2OD9bNpu3MyIWbzLsQIC+dGMZN1x5CwcdOpB+g3oz+uIJlJdWoitxrMmp251vTd413ny73UZlRRVHHXsoAMuW/MaRTcfRSIwBg/tw5bUXM/mGe3n28dn8vPhXrrzgRhZ+uxhPsofRF99EZrs0LhwxjDWr1lNfW49Jlvn68wUs+Wk5511yJsVFJTz9yEuYLRbenPNfFEXljLNP4rT/O57KimquHTkZj8fFzIdfYPzVtzP8srM56fRjuOWeGwj4g9TXGYF2f2MAl8vBhGvuoE//ngw+ZAA3XXMH7bIz6dilAxNuG8PVl06kV59uHHbkEG4acyfFRSUIITj6+MMSz9whLxuLWUb11RGpKCG4qQjF70sEencXkiRx5v8dh9xQhWRzItkcSPUVnH7WMXvUXxva8FfAPy5YLIRAj0VRI2Es3mSEEkeNhLF6t98V6Jq2hRtoq+Pm/elo0Sihso3osSgWbzLOdrmtunHACDDOeeEtLrnyPIQQzHnhLS4eeTZSbQnuDp0Rmm64n0wykqnJ0AgBSJis2+sQG5QLMYPKAUHx+o0s/mkZn37wJfc9chtvv/YBJlnmymsvIhAIEYvGGXnudaiqxtkXnsZBhw7ilnFTufn2aznquMPQdZ2qihoystKw2+2Ul1ZgtduIhqOEwxHad8jm2y8W8uac95j97lNYbRbmf/gNTpeDZUtWMHf2PCRJ4rX/PovL5aC6upbVKwroN6A3LreTrHYZ1NTUIXTDRZSbl0MoFKahzkfH/Fwa642g9NzZ8zhn+OmYzWbmzp7H8MuGgSyhKSq11fVMmXA/AX+Iex/5NwN6diRcthGApB59idZW4chsh2yxEovF8Tf60YXA4bAnXFqtQYnFiNVWUx1SMJlMpNtlrGkZ+PwhNF3HbrfhTfIgVBUhdCRJbvHz1jUN9KZ6AtnU5t7ZAdqCxfsW+4V0TpKkryVJ+mrbv30w3t8dm9M4Ld5kZJMpcdySEVDDQaK11eiauuV4m52DJMmYHU48nbqS1L0Pzpy8HRoBgLT0FEZdezGpacmkpadw5ZjhyHWluHLy0KIRZJOJcNlGAoVrCW0qQo8b3EShkg1o8eb56bU19Uy+/h6OP+QczjruUhYv/JmuPfIZftkwXpz7GJlZ6Vx70xWMuu4SwuEov/68iob6xkTla0lxGe07tMPpclC0fiOKojD3lXl06daJsk0VvPLcXNrn5bDq17WsXW3oDz8140X6DTyAh568k4fueoL6mgbOPPdkhhwygPIyQ8BGCMHqFQV8/N8vCQXCOBwOrrjgBi4682peee4NUpLd1FTVsmjhzzhdDmqq6li0cCklxWWcf+oozj/1Sg4/+mAWfreIS4eN5ZSzjueXJSs48dDzOPWoi5j/0Tc88+p0Xvvvswwe3IdoTSWS2QySRKBsI+aUdIKlG/E3+vnw3c8445hLOOGQc7ntpvup20k1ssVmw5GVTVJqCu4kL5b0TL6Yv4Azj72U4w8+h8k33EtdTT3+ogJ8a37DX7QWbZv6El1ViFSW0bjmNxrX/GYUDe6hu6oNvw8aGxt56qmn9ujaRx99lHALbt2/CnbVNTQBmNj0NwVYBvx5uKB3E5IkJVZnWx9vB00jWl1OsLiQ4IZ1CL1191FCZH4XV31bi67YbRYj7VHXMdudBDcVJfSMtWiEcPkm7OlZqKEAkcpStCZjFIvGeX7mHBZ8uwgwOG9uHXcf0UgUr9OGPViL0FTmzp7HM4++TDgU4ZgTDmfKTQ9w/iVn8fJbT7B65TrWrFrPs3Me5p3XP6Cx3seGwk2Mu3oKYy+fjL8xQCQc4e5/T0dRVHRdp7qylhtG3co9t0znh2/+h6Ia7Ut/vRTkAAAgAElEQVQX/8riH5fx4huPMeKq83l46lMMO/9Upk55lB4HdEVVNWIxY8w1NY1EI1Gen/kfxl99O9eOnERDvY/qqlp0Xae+rpGR515PTvt2xOJxzjv5CtplZyB0gRJXeHnWXAoLisnISkONx5FkmXhSFlpKOyRVQVVUJMlEQ72PuyZPJxQMI4Tgm88X8Por7yZoK1qDyWwmLT2FtPQUqqvrmXTd3QT8QQAWfPM/Xnz6PwiLUVuhx6IENhY2qw5XQ0FiddXGTk4IYrVVqH/hieKfgDZDsBMIIZZu9bdACDEeOHg/j22/Q1dVtHgcTVEQ2wR3ZZMJiycJa3IqaiiAbLXhzGq9cnhvIEkyFk8SajgIkrRdAFqLhDHZjAIlNRxMuBtCwRCLFvzc7FwhBIUFxQRLitBiUWpq6unSvRM/fr+EKRMeQNN0XnrzMfof2JtYLMY781+ixwFd8XjdfPz9XHI6ZJOZnc7S/y0nJSWJSXddz/DTRzP4kAGcec5J+Bv9zHj2Hvy+AKtXrGPilGvp3CUPm83KYUcM4b9fvcpb//kvnfLzmPPe09x9y3SqK2vwNfpxOLdk3cz/6GsOPLAXpw87gSU/LSOzXQajrx/BlAkPNHueFb+uoXN+BzRNo6qyBm/SlkK77776EUmSWLBgGVF3OpdfeBMP3T+LqDudGQ8+h7DbWbUVk+pm/Pjd4hZZUlvD+rXbi+b9b+EvxMSWn4/eJDu6GXG/b7trlMCOKUzasGtQFIXrrruO6667jnA4nDhWdoErbEfYmoZ64sSJTJs2jSFDhtCvXz/uuOMOAEKhEKeeeir9+/enT58+vPHGGzz++OOUl5dz9NFHc/TRR++LR/zdsUuzmiRJW0cwZeBAoN1+GdHvAKHraLEI4fJShKZiS0nH5HRhstkSDKSbXUPxxnpMDhdaJESkphJ7etY+NwayxYItPRM14AdhFJGJrbhqTHYHehMJndnhgqaCIqfLyaCD+rF+G5qJzl06oAeqQehkZuXw3df/Y/ChAzjnwtOZfP3dhIJh4opKY4OPWXOm8/QjL1FVUcPTrz7EujVFvP/WpxzQtwdrV63n8Yee49V5T3HmsZfy3Vc/cchhA7l13FScLgdZ2RnMuO9pBg7uQ17nXLxJHiTJEHq5+9/Tyc3LoWRjGWazieRkbzPq6ONOOoKVK4v46L3P6d2vJ6tXFPDqC29y673juPPmhxLn9ezdjTdffR9Zlslql4HfF0y8duiRQwBDp+H4Q88DoGRjGZ99+A233HU9juRkehzQdbv3e/AhA3C6d10Gs0vXTtu1DRrcF5ss2Dz1y1ZbsxRki8dLvKE5UZ3F7d3le7ahdYwfP56ffzYWQKecckrCAIwfP54nnnhij/t94IEHWLFiBcuWLWP+/Pm8/fbbLFq0CCEEZ5xxBt999x01NTXk5OTw0UcGL5bP5yMpKYkZM2bw9ddfk56+55XufyR21TW0FMMVtBT4EbgJuGJ/DWp/Q1cV/OvXoIYChuulogQtGkEJ+BBbC5NoGvb0LDz53XHn5RvphLt6D01r3tdOYLJYMXu8KJEwrtxOSCYzyDK29CxceZ1Rgn5MDieO7FwkSUYIHbvDxugbRjBgcB8AHA47t947jqQkdyJ91WU306t3Vy6+4lzsDhs2u41b7h3Hs3Om0/OArkiSzPhbriE9MxVdF8SiMc4YdiLPzJ7GjGfuJh6N4/a4mThlLOFgKEFl8fIbj/LCfx6m/6DeCdcQgNNmYfKUMXTrmU/JxjLcHhf3P3obq1etM57TZGL4ZcNIT0smFlc4/9L/Y9Z/HuaRZ+9BUVSycwziMIvVwmVXnU9VRQ3hcIR7pk9mQ+EmhBCYTCbOueiMhFhO5/w8Rl59IWazCUmSOO7kIznx9GPQMZGalsw90ydja6KpOOiwgVxy5XlYrbteZ5CcmsQt99yYENEZOLgvo667BGLGrkK2WHF37GLEKJpgcXuwpmzJ9rKmpDejDWnD3iMWixEMBneoabGnmD9/PvPnz2fgwIEMGjSINWvWsG7dOvr27csXX3zBpEmT+P7770lK2jdyqn80/nFZQwCxhjpCJc1X0Wa3B4s3GVtSaiLYuytZQ9tCVxWUgL9pJ+HEnpaBbNk+06fV6zXV0DQAQBgB6lgUa0oaZqcbNRIiXl+D2enG1lRk1lDvIxqNYjKZ8HrdWC1mIlXlxOqqMbu9WDKyCQUjqEJgtlgQqopNj6HZPQhAFzpmkwmH04G/0Y8ALBYzQhdomk5GVhqNDY0oDfWYIz5EajZSqAFiUeScfNxed0LKT1fiBIoLiVqcaCYLMgJrPIwmm1HNNmSTCafTgcvlIBpXDJqJlCTCoXBCXD4SDCEhkE0WwpEowUCIwvUbOXjoICQkkIwiLrdnSxVXKBgiFAwbmUFOJ0F/gBee+g91tQ1ccuV5dOiYg67rOBz2FqkidoZoJIrfH0TTDCqO5JSkZllDktm8XVHi1p+lZGrLGtoRdidrKBwOc8oppxAMbtkdut1uPvnkExyOHXN+7QhbS1XedNNNdO/endGjR293Xn19PR9//DHPPPMMJ5xwArfffjudOnViyZIlf5odwe5mDe2yj0OSpD7AAUCCTUsIMXsPx/mHoqWsHtliBQFs9WPe3cpOoetE66qJVhlMmkrAh+JvxNO5+04zibbcxwwmQ/fAv35NImisBHw4snNRQ0GUgD/x5+7UpUnkvfnk5sjKwZ6RZfAfWSzogUZitVv42lXA3dGDNam54HZGVjpCiO0mNY/bia+syNjl1JQab5XJhMftaPbeSGYLrtyOiE1F2FLSUQI+1FAAE7D5LGf3PsgWC06LBWfTXO50ORPHXreDaF0ti38r4NUX32bRwl+QJIl/HT+U26aOJyNz+7oKl9uFy210UF1Vy3mnXJkI7n49/weee+0Rhhw6YI9EbADsTVxIW0PayWe6+bNsw77FpEmTtosHKIrCzTffvFeuoa1pqE888USmTJnCRRddhNvtpqysDIvFgqqqpKamcvHFF+N2u3n55ZebXftnMQS7i12NEdwB/AvDEHwMnAz8APwlDYHJ7sDscqOGjIlCMpmxp2c1E4rfEwhNJVZb3axNi0YQugbsHuWBrioJI7AZsboaHJnZKE26CWo42Kr7yXgOM2C4M+zpWU06B8YPyORwYt6GF0FX4sQa6tDjMYPl0mpNkLjJJjPO7A6JXH0AZ06e4cLaCpIkYXY48eb3AAQWjxd/4ZqEW82anNrMhdIiJJmY2YbdbuPhx2/l/XlfkJGZzmFDB+APhoEdF9gtW/JbwghsxkvPvEa3zu2wm8Ceko7cQj1GG/5asNlsWCyWvQ4Sb8bWNNQnn3wyw4cP59BDjYJMt9vNnDlzWL9+PRMnTkSWZSwWC08//TQAV111FSeffDLZ2dl8/fXX+2Q8vyd2yTUkSdJvQH/gFyFEf0mSsoDnhRCn7+8Bbot9wj6qKE0ZOjJC15pW6zJmx94xO+pKvNkqfjOSevbdTnpyZ1CjEfwFK5u1mRxObKnphMs2bdV3vxaLzFoen4IWiyLJMrLF2myXYuxAVjcbu6dzdyyeLQFOw9WhocWimGx2JJN5pzsloesITUWNRo30WrNlh8ZWCEHc10AspiCZzShlG1DdqchCQw758HTrjWUn2/8F3y7imkub88mfcOq/uGXipRBoQLba8OT32OX3rQ37H7vjGlIUhfHjxwPw4IMPMmnSJABmzJiBZRd33n937C/XUEQIoUuSpEqS5AWqgfydXfRnhRoJE9xYaEhHyjK6omB2e3F3zEfaC9YNyWzBkd2B0KYtXDiWpJRWVct2BNlsxuz2oAa3KCY5snISymQA1tQMJNOuj1e2WFp1UWmxyHYGLFJdjsnhTEzchqvDvFtGbTNBn3UX4yRCVYlWlWP2JhEXFjRXMuZgvfFaciYxRdmpIeh5QFfyu3WkaJ2xe7HZrFx9/SXI0SA6oMdj6PGYYRD/4dz+f0VYLJZmLqC9cQe1wcCu/gqWSJKUDDyHkTkUBBbtt1HtbzS5v4WmJdI0JQnYy7i5JElYPB6SuvdGCfgxORyY7I49mmxkswV3Xj5aJNyklZAEsglnbkfUQGBLuus+4N9vGv0utu1nSBi1FKqK02NBjduJNQnHOZ02zKadjyktI5UXXn+U5T+vpK62gaFHHIg9FkCPbONXDgWxepN2i3m2DW34O2KXZhEhxJimw2ckSfoU8Aohft1/w9q/MNudyBZrsxWwYy+KxXRVRWgquqpislqRbTbs9r3TT4WmamVPkmEENsNiwWzf9Rx4MFw6CJqyn7Ycbw2TzY5stSXqFQAc7XJ+txWzrioGBYOQcGTlEGusR5YkYrWVOHPyDMqG8hKSevZFjUaQTeYdBuDTMlI55sQjAKO4K1i8ZScl2+xGjCAWRVeUNhfRnwQtJSm0YfexJ5mguxos/lIIcWzTTYq3bfurQbZY8HbtSdzXiK7EsaWk7zQDpDXoqkqkqiwheynJJjxde+5UuvL3gq6pxBvqiTXU4uncnVh9LXFfvZHJtNUkL1sseLv0JO5vQIvHsKWk71ba616NUVEIbiw04jaAIzsXR0Y7BIKk7r3RYlFkm52k7qmo4RAIQbC6HG9+j10ao8nhxNvtAGL1dZhsVizeZEKbilDDIUx2x25ldbVh/8But1NXV0daWlqbMdgLCCGoq6vbTtN5Z9ihIZAkyQ44gXRJklLY4ivwAjl7MtA/C2SLFXv63skJQlOm0Fbax0LXCJdtwt2xy5/C/yzJJiweL5HqChrX/Aq6jqtDpxa9PrLFgj1t79+T3YUaDiaMAECkohTatceWlkm0tsrQYxACXdPQwkFcnbsTc6Wz6KfleJI8ZLdvR2pacqv9mywWdMDs9SJJEr41vyVe06IR4r6GffJd2AxdVdDjcXRNw2y371C6tA0GcnNzKS0tpaamZucnt2GHsNvt5Obm7tY1O5upRgM3Ykz6S7dqDwAzd+tOf1O0pGOgx3csTPN7QpIkJLOlifKgDslkNrSZW4gt6EqcWGO9kT6amoFstSWygnRFMTKsrDajkKrpeFcmOF1VUIJBlIAPa1IyZqcrQeUBoMWi212jRsLYdB0l4EMLh7Y8j8lEbUOQ4WdeTUO9weczaEg/Hn7mbtLSU1odg2yxYJFcRKrKtntNi+47sjBdUQhuKkINBRLj9XbtleCKakPLsFgsdO7c+Y8exj8WO0w5EUI8JoTojME+OhNYjsE8+jLw/H4f3V8AJqt1u6wga0rqdvn1fwQMUr0Y8YZaQ4gnw6iVCGwoaGbAhBBo8Tj+wjXEG+qI1dUQqakEBELXm9xf5fjXr0ELhwgUrydQvH47yo2En3+rY13TiPsaiDfWoYYCBIvXE6muMCq1m2D1pmByOLF4khLvmz0tA8lsxp62TazF5WXWk68mjIDdbsPusFFdufOVpGw2Y0vZvuDHlrrvioC0eDRhBMBISIhUlTd73ja04c+GXZ2tjgR8wONN/1+IUUx23v4Y1F8JktmMp2tPwmWb0OMxrCmp2NOzWq1H0FUFLRpFCfoxu9yJoOfO3AexaIz6ukZcbic2mzVxvFlkRVcVtEgEJRTA4klCtlqJ1dWiBBpx5uThbN8Ri9uDPTUDNRJu5hrS4zHUSBjV6kKxOrF4TQibjaqKGuw2C3a7FWtKGmokhL9wDZJswpXfg3UFG4jHFX74+n+cdc6JuKU4eiyGp2MXwhWl6KqCOT2HX1YUs2zJbxx82EA65mQahXEZ7aBpt9EYCPNzQRVF6zdy7AmHk5KexIaSGr767F16HNCVvv26Y/HXIskSujuZijKjaO+oYw/jqusu4fuvf+LXX1aRnJrED1//D0mCI445lIy0ZJSQHz0Ww5qUimSxINtsuDt2MXShhcCelYO8D1fregvFTboSB9FkVJU4cV8DstlifE47iE3oqooWi6AE/FjcnqYMtH0Ty9hs4BVfPciyIczU5sL6x2JXC8qWCyH676zt98C+KCjbH9BVFYRuKIrJcmIFuHXBla5pRKsqiNZWJtps6ZlIkgl7+o45iRrqGzn+kHMZde3FDBzcl2tG3Mwjz9zD0H8dhIQgXFFGvH7LqtjbvXeiIM3kcGJ2ulACfjxdehr585tdPppGpKIMS1IypRV1DDvxcm6550bcbie3jLuPtz56jnZOo4YhWFqMHgkjySbc+T1YtHgFY0bcjBCCQw8fzAMzJkFNWVPWgsCS3ZHvvv+Zf984NTGukaMv4NILTyAltwOyxUp9XQM3jLqV5UuNsUqSxKPPTeWVZ+fy82IjMe2wIwczdfpkkpO9SCYTX32xkHv+PZ3Hnr+Pq4aPJxo1Mp0ys9J5+Jm7GXH2tbTvkM2LbzyKpWZL8Z2nSw8sLg9CiATVt2TawhHU0me2u9DicXxrf2tSlDPg6tAZW0oaajiEf/0aNucpyzYb3vyeraqbRWsqm9WN2NIyjUyufbDb1OIxfAUrE7s6yWwmqdsBv1uCQBt+f+y1QhnwiyRJh2zV4cHAgn0xuL8LZLMZyWxB6DpqNEyopIhQaTFqNIKuaYah0HWidVXNrovV1Rj++8Ydq2ZZrRbumTaZmQ+/yJUXjuPk04+h36ADkGW5iWZC4MjugDUlHWuTq2PzSleLhInV1aAr8SYyt60mOqGjRUNIEiQ5zIwZN5J7b53B5BvuZdR1l5DssmBLyyBWV4OIx7Hm5iPb7YRKiug/oFciVW3JouVUVhtEewgd2WrD4nTy4N1PNnuOOS+9g2J1JTSd62sbE0YADDfVUzNe5JSzjku0LfxuCaFwlGhdNUgSBx02kGdenc68uR+RlpFCrz7dAYNjaNnSFfQbdAAlG8tY+etazFtVRkcqytBVxRAjMhtVzpIkoaoqajhEuKqMWMCHGgmj61tcOaqi7jKNgWw24+3aC4vbi8nhxJXbCYsnCU0z3GuSyYTZ1bSLi8W2Uzbb8rEYhmBrxOqqd4vRtjUIIYjWVDVz7QlVJe5r00v4p2JXlxYHA5dKkrR5eZUHrG6inhBCiH4tXSRJ0knAYxjUW88LIR5o5bxzgLeAIUKIP99yfxsIIRCqiq6pTZWzhqZwrKEONRxsErRJI9ZQhyTLRKvL0eJGmqonvzuBwrVbdwYS2wnjbAuz2UxGuy0cO1nZmUg0BVp1HUdmNkLTsbjcIElEaypxtmuPFo0mAqTW5NTEBLwZksmMNTWdUOlGrFkdaNd+S/ZMdrt0ZFnGZHMgpZqwpaYTCYdxZuciySbKy2vxeN08N2c6mq7Tzm1GDfpwZLUnWlNJvLKUZ15+kAvOuDrRp6Zqhp6CrqFpLU+w8biCZRuaaDWuYMsyxhYJRbE77PTu15OzLzwNVdN47IFZ/LLkN5SYgrkpWysWjSFJW9Y6Lb3H1ZU11NbU0yE7nYjsoLakhux0L97UFBTZ0G5+edZcYpEYI0ZfQPvcbBzO1l1JkmxIl7o65jdpS5jRVQURVzC7Pdgz2xnflTozcV9Dq5+7BC0XOO4LsuAmN9V2zfvAyLThr4ldNQQn7W7HkiSZMALMxwOlwGJJkv4rhFi1zXke4Hrgf7t7jz8KelNgdTOBm6dLD8LlpWgRI7tF8Tdiz2iHKyePQOHaLQyivgacuZ2wpWclmECtyamowSDWlNSWb9aEcDjC1ZdM5MxzT2bg4D7cNXk6/QYewNAjBxMoWovJZseWkkaobBOOrBxMVhvBjYW4OuRjSUrBZLFiz2i3ndtDkiTDPyybKKtuYMpNDzBy9IU4XA7u/PfDvP3pC9iTY9gsZkMzORKGpBTsGe1IS3HxxofP4laC4EnHZLZgTc/EYndgcnuIR6OsWPBDs/udetZxOKxmQiXFKEE/aak5dOycy8YNpYlzLrniXL785LvE/z0O6IrLbkEICIbCPDH9eb79YiH3PXIrt4ybijfJw+33T2Dkeddz8NBBPPXoS6SkJjFwSD+U2i2uIUdmdjMfu6/RzztzP+LFp/7D1EduZfZzb1BVWcN7X8wmVl+LT7dw9gkjiTQJ6nw473Pe/uxFunTrtNPvyGb3ja6pxOtriVRX4OrQmUhFKZoSJ6lrL5RQALOjleJAWcaaktZM3MagK9lzCpTNkGQZR0YW8YY6EpZFlo2FQhv+kdhvegSSJB0K3CmEOLHp/38DCCHu3+a8R4EvMDKTJuxsR/BHxwh0TTUmMf+WbbSnS08ChWuanSdbbbg6dGq++sdgPnXl5ROpKsfi8mB2ugyueot1hz/yUDBE0fqNdOjYHovFQtH6YnLzcrCpESwuN4GiAhDC0FRISSO4qQiEwOx048rLN1xXO+hfCEHAF6CocBPtO2QT8AXx+fzEonFcbgc9urQnWLze0GSw2XHn5RPcWGjQQSgKlpxO6LIJj9dFtLYaJRYnbnFQXdvIr0tXsvinZRz+r4M4fOhAzIE6XO07ECxej2y1Efdm8t47n7F+7QbOHn46Xbp2ZNWva/hg3uf06t2V0848Fqu/BnfnbpjtDuprGxhz2SRW/baWjMw0nnl1Ol9++h0nnX4Mn3/yLfW1DZwz/Aw6ds4hXlfTxKaagcm2Pd1HTXUdd0+ezrdfLsThdPD6B8+S7pCwuz28/sZ8Hp7aXMN22PmnctvU8Zgtu7aG0uIxtFiMWG0VSsAHkoy3Sw/ioSC2pBQjUaCVAG1C28LfiMXtxZqUvM+CxbquIeJxIjVVSLJkLBLMln1iaNrw58Q+0SPYA7QHSrb6v5RtdI4lSRoIdBBCfChJ0oTWOpIk6SrgKoC8vLz9MNTdgC62y3tv+WcsNXNLbGmWkWQZd4fOiYtbPG8buNwu+vTvlZg0+vTvhdBUovVhhKomgpNCVRMBa6FpIEtIJnmnP3BJkvAme+k/qDdCVXFEfGR2zESoCs60TAIb1mJNSsGR1Z5A0VqjCCstg3BFKY527bEleRO7DUmWURtqMJlMtHd7yTvxYE4/9XBkTSFSVW5oGTS5qPR4DFuwliuuvhBNkFAOO3ToAPp1zUHWFdS6cmS3JzGJK4qKr9EPQDQaQ9d1ZFliwtg7GHBgX4KBEF9/8QNXjrkYU1aO4aJp5fmFrlNXW9/Ur0Jjg48UTyZml7tFF5DD5UCSdy+zRjLJW9J1hUDXVKxJyTultpDNFmwpaViTUkCS9mlGjyybwO7A1T5vl7+Dbfj7Yn9++i19axPbD8n45j2CIXu5QwghZgkhBgshBmdkZOzDIe4+JJPJ+GFirPo9XXqixWNY0zLxdOmZKByyZ2QhmS2YHM05/x3tDLeNEVuQd+sH2GwiEIK4vxF7Sjqhso1Yk9Pw5PdAi0VQw0FDXwFwtMvdpSyTzTUHQlUQkgSyRLyiBKWmksCGAtx5XXBk5xIs3WBk37g9RKorMTvdRKrK0WKRhI/ZmpSCZDYblNX+BpTaKmxOR1NtApicrmbG1OI2jMjW8pEmmx1PTg7W5BRDKrRDZ2SzBb8/wBPTn0eWZT7+/nW69cznrsnT+Nfxh1Owuog357zPgm8XccqZxyfes9aMwGbXUFlJBe/Mf4ljTjicSdfdjdXlRTZbOPr4oaRnbnGXOF0OLr78nIQa265ANptRA370eAxPl55Yk5IJlRbvVuaP8T3ZP2mdu/sdbMPfE3+Ya0iSpCSgEIPJFKAdUA+csSP30B/tGgJjyx6tq8bqSSJcUYYrtyNIEqGSYpztjR2LbLEgm8xo8ThqOIAWixkTpGzaZyRnepNWsLRNBFHoOoq/0bifxWKs/nbUz9ZcP//f3rnHxrbd9f3zW/sx7/Hz2MfH9jnH53XPvbk3VWkSBZQSIG0TUokUCJDwKIQgKiCU8lBJ1YqiINRWVUVVlYqmNC1FiLSkpYoKKH9AEBWQKBcR0tybe+45x+fl8/Tb856991r9Y4/HM/bYxx577LG9PpKlPXu29/7N3jPrt9Zv/db3J0Lq7BSJwaFmHF9cl8z0DG4qEzf4xlBfXiIxPIrjJyg/fURqdAyVSCIijcn0gPraKhiNlx+ksvCMYGkBN5MlfW6a4r1ZomoZLz9AZvLinrR+FheWCcOQ8bNn4u0gRCnF537v84gI73nvuxg5M7wrbfr5Z4sE9YCxs6MsL60S1APOjI/geR7GGBaeLfF/P/8FatUa3/x33sXo2Aiuu7f00qixjqBeXMNPZ6FRD8Lm7FsOk51CQ710BC7wJvAe4CHwJeB7jTGvbXP8H3MM5gjW0TrChBHFO2+ioyiWsRYVC6EdIzVLozWVJw+pLrSntQ5cezmuJGY28sxFVDNjCgxGBMf10GEY13bYoWFbX2dBowe6nseP2JoAFsthcBDrCPaMMSYEPgZ8Dvga8D+MMa+JyCdE5Nt6dd3DQjV69pkLlzFhgA6COHxxjJwAxPnqQYskwjphtYxy3UYlM78ZPhCRRoEbH6cxcanc9kVZOtqqv9Q8V2P+Yv28rU5gfbVrrzonFoulMz3tihljfp+4xnHrvl/Y5thv6qUtvSCq1+PMF88HEYr3Z8ldfqFZwWuj90wcDmjElrfbf1AYYxo9cIMIGARR0jkubSAzdZGwXKS68AzdiN1vm9a43TW1RtdrlJ88xEQRyTPjuOlsW0PfHBV0GAVE9XqsQVSt4A8O4Q8Od5Uhs14aE6Qxiuld+EVHUdvKXBvqsRxX7Jh8H4g00kHPxZkXpYf3kcYcudYRUblEae4eOgjwh4ZJj0+CUoTlYqxNFAQkhkYaBWAOKC0wDAmrZUQUUaUcN1COgw7q+PmhtgY4qtfj1c+lAk4yTWbyAuUnD0kOj+xZNE+HIfXVZRKDw0S1KqW5u2SmLuLnY3noqFal9OAuYaUUp7ROX2w6TB0EFGZvNIvihOUiOghIjZ/bUzqjDgOq80+pLj5DOQ6piWm8XP4Aq7i1X6v8+CH1lSWU55GZuoCTzjx3PsZi6UdsusA+UJ5PZuoiyvfbtgFMGFGYvdmUpK4vLVBdfIrREcU7G/trS/NUF+cPbFVnXOULwlKB8ssVpPIAACAASURBVKP7BGsrFO/eJlhbbQu56DCk9GCWsLgGxhBVSpQe3CF7fgZ/cGTvcXsdEZZLlB7eJ6yUyV24Qn1lKZ7QDgIKd27Gk9HGxCqk9243lUpNFLZVRgOoLS00y4iufy4d1Le9T3HR+5VYlkFrdBBQuj+LCcKWc4QNOe393WujNdWFp/FiLxOPhAqzNzGhVRi1HE/siGCftFX5au1tVyts1gMIVlfw81s184O1lVh2eY+LeWKlSwNIM+smLK7hJFM4iSTewFDcY/UTpCemQEdAY+RhNGGpuOl89R1z7neyo3h/tqmbE6ytoMO4R48STBhtaeijShmjN1a1bkYa93Jdu6n86AEmDEgMnSExMrplBGV0LHe9maC4hkok0LUapUf30LUqXn6I1PhE16MwE0UEW3R5DFG1YsteWo4ldkTQI9bDHm37UmnoEKZwkinYQy63MYawUmZt9g1WvvYVCnfebOblO8l03ONVimBtNa7NXK9RX1vZ1MALarON6vkLzzrbo7eIp0XlEo6fRKk4m0g2S1u0rKgV5eAPjbS9nz43jbguOgwp3L5BVC6h63UqTx9SX1neMqEsonDTW+c1nFQaEwas3X6DsFhABwG1xWdUnuyjRoBS8bPcfK3E1mdusRwHrCPokvUFWFG91gxxtCKuS/LM2eZr5SdInZ1EOU5zsVdz//jkniaMTRhQuHsTXYt72VG1EodaggCnUas0qlbxcnlyl66RGj9HWC5hWtb4ieuSPT+z0UCLkJ2a6aqgTseG3nGbK3DFcclMX9pwdkqRnb7U7PUr1yU9MUX+yotkpmcYuP4KbjobK4NWim2SzgC1lcWN9NP16ylFcmQsdqoN/KERnEQCHYVbjq+vLjVGSHtHOU78LFscaXLsbF8UI7JYusF+c7tAhwGlh/ea4QEvN0Bm+mJbqEE1HEFiZCyuU6CcZvgmOT5BYnR8y/7dYrTBbFLtjKqVWAfI83HTWZxkGn9wCKIIf3gUH8FpuY6I4CTTDFx7CybS4KhmaudeEcclM3WR4r1ZwIAImemLzYZRlMLL5hi8/jIm0rHkhdOeZbMuC+2m21diO16HkZWf6DiCUp5PbuYaRkexJINyUK67EYJqPdZPsJ04yG5w/AT5y9cb14pHUge1HmJ9QZ4xpllq1GYkWXqJdQRdEBSLbTHioLBKsLa6peThdg2DctxYmLtLRAniuG29XOUn4jSmzdfdwcfEMhf+jsfszh6Fm80zeP0VdBjEjs1x2pxKt9dSvo83METQiP+L6zVHVh2P9zw2X0QcRXJsYqPIi1Jkpi7s2QHv5lr7xRhDVClTuHsLEwaI55G7eBUnmbLOwNIzrCPogrDDAqygVMAfGjmUH6s4LtkLlyneu42JQsT1yF643Ay1HAXKccBxDnxBnXI9MpMXMGcnMVHULOu5N9tckmfGSQyPosMAx/P7NoxjwoDCvVtNiXMTBBTv3iJ/5UVkn45rt+gowkQRJgrjxYJdjhR3IqgH1IOAdDpFGITNbevsjgY7R9AF66Jz7fuGD+1LLErhpjMMXHuJgRdeYeDqS0faYzRaE9VrVBfnCQprHedM9oNyXZxEEjed6VqjRzkujp/AS2efK/l9lBizNeyng/pzCxcdFDqKqK8ssfrGV1i7+Torb3yVsFI+0NXexhjuzj7gg+/9CHP3H/HmG7N88L0f4cnjZwd2Dcve6M9uUZ/jJFOkzk5SaYQakmfObolt95pmqKUPCKtlCrdusJ4u62ayZM9f3nfo5TQSS3j4zWJGEIf9Dksh1OiI8qP7rTsoPbhD/vL1AxuRiAhDI4MMDQ/y3e//EYIg5N3v+XqSSZt1dVT0Z7eoz1GuS3J0nMEXXmHwhZdJnTl7aoXTdBhQeTRH65qJsFRsjgp0FBFWytRWlghKBUpzd6nMP2lr6HZ1nSCguvA0XgldLnbUMzoJiOuRvXilmZGkEglyF68cXthP6y1ZWpvXgBwEA4M5/sFP/RClYpl6rc7HfvajDA4NHPh1LLvDOoIuEaXAUXH2yjGKa7auql3f1mFAVK0QVit7D+uYuBe59TpRPPFZrVB+eB+MoXD7BkGxgIkiaivLjQVxz2ddgqL86AE6DAmKBaJq9VDE6Ywx6CAgrJSJatWNAjM9Is7mSpG/fJ2B628lf+n6oYb91gUBW/FyA7DHYjw7YYzh7u0H/OOf+EX+5re8kxdfvsZHvuenbGjoCDmd3dh9EjcOdSpPH6HrNfyhUfz8wIHpBfUKHQYExQJeNg8YgmIBN5OldG82ln8gDnvlZq7tOqwjrktidIzy3L2WfXG6Y215AcdL4A8MxfUbBodJDI02pDYMbjIF24nhbbI7qtfIzlwlKpcI1lbR9VqsgNrjlbw6qLN2a6M+tT80QnpiqqfPWkQObWJ4y7Vdj9yla5Qe3iOqVPBy+fjzHuDk+npo6Ad+5Lv5vh/+IFEU8enf+F0bGjpCelaPoFf0Qz0CHQSs3ny92TgApCamSI6M9e0kJEBYqbB28zUSw2cwRlNfWSJ/9aWNovQNUmen4gpru+yF6jAkLBWoLc6jfJ/E8Cilh/eJKmWS4+dwkilqC89In51kbfZGW+ghf+U6bjr7HLvL1JYXQBtqS/PN/U4iSe7SCz2bi9BRRPnhPeorS23781df2rM663Fjo36Ec+DquOuUSxXSmdSWbUtvOJJ6BCcZHdTbnABAbXG+TSStH1EJn+yFy9SW5qkvL5K9eIWoUm5zAgBRtbwlTrzjeV03rmd8bhqAwuzN5jnrywuIKJLj56gXVrect7rw7LkicMrz8PND1FYW2+2sVTuGpQ4Mo7fUpwbQ9b3NbxxHNupH9E5NtbXht07gaLGOoAs69frFdfezUPVw0DouH9kgWFvFzWztjSeGRrtbYYzEqqEtjbM4XkODx3TUXxLXe+4ci3I9lJ/oHJ7oYTaNOC7+4PCmndJRZ8hiOc5YR9AF4rp4DZ39eIeQnpju/zmCIKS+skTu0gtkZ65SW1oAY8hduoZKJFG+T3ryQtcNnbjO1vtybhonkcTP5vFyA236POLE2Ve7CUEpz2vWg14n0YVi614QERJDIyTHJhDXw0ml41DUKc0Qs5xc7BxBl+gwIKrV0PUabiaLcr2+nh+AuFhOXLVMYTDNbUSadYj3q2ujwwBdi8X4Ot0XHQSE1TJojZvO7Ol6OoowYUhYLuIkU/HcgAEdhYhykIZe0kFjtI6vIdL3zt5i2Y6d5ghs16ZL1kXS6BBa6Vdaq2dtbnoPKkulKR63zX1RnofvdZcvvi5jsS73HNWqrN2+0ZyvSZ45S7IHazpEKZw+WbxnsfSC/u7CWizboKOoWaxmner8ky1y0xaL5flYR2A5nuioc0bPLhepWSyWDawjsBxLxHG3lv0UsVXCLJYusHMElmOJKEXyzHijVvESyosznjZXSrNYLM/HOgLLsUV5HqmJKVLjE2AzeiyWrrGOwHKsWc8kslgs3WPnCCwWi+WUYx2BxWKxnHKsI7BYLJZTjp0jOMboIIgrfSkVq0X2YLJ0eWkFBSRTCYrFMoMDOUQJOghi3fyW6+owwIQhRuu4LrDrnuhi5MuLKywtrVCr1hk7O8romeHn/1MLOz0/YwwmDIiCOsqJC8h3u2LaaI2JQqJ6PZb8cByrl2Rpw34bjinrBVPWSz66mRzZC5cO1BksLS7zZ3/8Rb7+7S9SXSjinZmKS06uxBLWq2/8P7zsAJnzFwEozd0jWFsBYlXR/JXrHRVHTwKLC8t8/B/+El/8078AYHL6LL/xmV9l7Ozorv4/qtcp3G55ftkc2elLzdoKul5j7dbXmtLm/tBooyDO3n+ysRTHG3EZSiB5ZpzkmQnrDCxNbGjoGGK0pjL/tK3ub1gqbKkrsF9u3bjDb/z67xAqDx2GRA9nqT6Zwx8abdQQEILiKlGtSlSvN50AgAmDuIJbL+sFHCE3Xr/ZdAIADx884bf+y2cIg+dLXBitqS60120OiwWiagWIi8KUHz1oq29RX17YexlR4lFa+eG9phMAqM4/7W0dB8uxwzqCY4gxBt1BXiGqHWyR8ft357jx+i3+6stvQCqD0RHiOPj5QXRQb6qK6lqtoV7ajq7VQB8vddvdcnf2wZZ9szfvUa8/v7E2Rnd+fvXq+gEdC8Z3I59hjCHqUEin34soWQ4X6wiOIcpxSAxvDUF4ufyBXued73obP/7TP8TfeOtlTGEFyQ2BKIr3buEmU41epeBmczjJ5JYCM/7w6Ild6fuub3onapPs+Hd86O/uqtKWclz8oQ7PLxs/P3Ec/KGR9jdF4SaTe7ZTOS7+YLsUh50jsGymp45ARN4nIjdE5JaIfLzD+z8jIq+LyFdE5A9F5EIv7TlJuJkc6XPnUX6iUTDlWlzt6wAZGR3mG9/zDeCnkOGzrIQO2ZmrJEfHCYoFnFSG3OVrcS0AEQauvYXE2ATKT5CamMLPD5yoyeJ4cjdAhyGjY8N88rf+DS++fI2Ll6b5Z7/8M3zd29/63HMYrdFBgJvJkjo33fL8Xmg+P1GKxPAoyfEJlOfjprPkr1xHuqi1IEqRGpsgOToenyubI3/5+rbfFR1Fzc+521olOgwb98UK/h1XelaYRkQc4E3gbwNzwJeADxtjXm855puBLxpjyiLyY8A3GWO+Z6fz9kthmn4gziwJQeipvMLaagElQiLh4ThOXMxAm2ZRg9riAtX5JyCQHD+Hnx9CuW7fF+rZLcYYomqF0oM7RNUKXjZPZuoiyvdZXlxBG83g0EB8b3ZAhwHVhWdUF54iokhPz+AmU4jqLI+xnu2DqH334HdzLh0GlJ88pL68iHJd0pMXcDO5HesWR/UapQd3CUsFnFSa7PQMKpE8UR2Ak8JRFa9/B3DLGDNrjKkDnwY+0HqAMebzxpj1Gc4vAFM9tOfEISIoz+u5xk5+IEc2n8VLJOI0R8dtXjcsl6g8fYjRESaKqDx60DZ/cBIwYUBh9s3mZG5QXKM0dxcdhgyNDDIyOvxcJwDxhHD12WNoNMqluzcxYbDt8xOl4gLyBxDGed65jNbUluapN8qX6iCgePfWjvUddBhQun+HsFQAIKqUKdx5s+N8kaW/6eWvdRJonVGba+zbjo8Cf9DpDRH5URF5VURenZ+fP0ATLfvBGEN9ZWnL/vrqUrymoDHa1GFIVK1SW1kiqlXRx6yhaPamWwiKa2DiTBwdBs2J3NbtzeeorS5v2V9fW+3KJh2FRLWWe7rPgjyxiuvKlv1hubTDPxnCcrHdriCwGUnHkF7OGHUaG3aMQ4nI9wNvA97d6X1jzCeBT0IcGjooAy37Q0RwM7ktzsBJpCjev0Nm6iLiONSWF6g8nmu+n568QGJo5NiMGkTFdZ1pCaM6yRQg6CikMv+EsLBG7tILlB/PEVUr5C5da6+fLIKXzhBscgZuOrNne7SOqC0tUnm80c9KT54nMTTa9T0V5eCkMltSkJ0dJ6gF5SfaM5yUOjbP1bJBL5/YHDDd8noKeLT5IBH5W8A/Bb7NGHOw+Y+WnuMPDOJmcs3XXm4A5XmExTVqS88wOqLy5GHb/1Qezx2vkpKOQ2Z6ppkVJY5LZnomDo85LsmRMXQYsvL6l6mvLJE+N41I+09LRPAHR3DTG7WcvYEh3HR67/ZEW+9peZ/3VJQiPTaBk9ho+JOj4yh3+1rN4rpkz1/ayAwTRXb6UleT2pajpZdP7EvAVRGZAR4CHwK+t/UAEfnrwH8E3meMedZDWyw9Qrke2QuX4oyRSBNWyhTvzwKg6/W4F70pIeG4hQ6UcvDyAwxefwWjNaJUW9aNKAc3mSIoBojr4vjJjr1i5XlkL15uLMaL/6+b+L8xNMNSTbTefJv3jPJ9cpdeiJ+PqDjNdIe5DxHBSaUYuPaWjfvinJwkgdNEzxyBMSYUkY8BnwMc4FPGmNdE5BPAq8aYzwL/GsgCv9PIMrhvjPm2Xtlk6Q3K9TBRxOrtr9Ea/UuOjiFK4WayhKWNWLKXGwA5Xo2FUg6orY1iHBp6TFAqkD53nsr8Ywp3b24NDa2f5wAm9kUp3GyOsFho7vOy+QNpgGOJi93bKKIQb/tRg+V40LP00V5h00d3h44iaCz4EsfpeS9N6whdrVJ58hBjDMmxCdxUGuW66CCgOv+EoFTAy+VJjow3NXUO6tpEh/dZNxNPgAc4iXiRnQ4C3FQaUartOcROUhrV1PbXB2u7p9l8Y52ArdBm2Z6d0kdtMO8EosOAyrPH1BbnEcchPTEdx+57uJpUKQeVzpC5cBmMabuW8jxSZydJ6ihefHaADbUOA6rzT6kuPEOUkDo7hT8wdCgrZ43WhNUylaePm5kRmamLG06g8RyiSoXU+ATlh/eJalXcbJ5sYx1Ct/TynlpOH/bbc8IwxlBfXaG28AwaC85KD+4c2qpPtY18gSgVSyAfcIMVFAvxYjajMVFE+eG9NjG3XmKikMLsm4SFVYLGX+nRfYzRjeewTG3hGamxCYr3Zoka+kJhyzqE/dCre2o5fdhv0AnD6GhLiiLQFk8+KRitO65jaFVB7SU6DNtUPSFu5OMFYy15+SLbrEM4XmFZy8nFOoIThojC6ZCb7qS6SFPsd0RwM9ktu7vJze+GTiMfJ5mKM26U2kgNFdkiyBcfdxhWWizPxzqCE4YoRXJkDCe10Rj6w6M4iZNXIEZESGzKzfcHhw/P6SmH9OSFjfUFnhdrEDV0lpIj4zipNLWledLnzm8c57pkzh9sESGLZT/YyeITiPI8cjNXmsVjRO1ftKxfOajc/K6u7Tj4g8N4+QHQOp603TRJnpu52nwOAy+8AmbrcRbLUWO/jSeU09TbPMrPqhwHdlh0dZqeg+X4YkNDFovFcsqxIwKL5ZAwWqPDkKC4hjgOXjrb9SIwHQSE5RI6DJprRPotjVRHESYICIprOMkUTjLZcYSko7BxXAE3m0M5LuI4sXrteiitB58tLqhTJywVcNNZlJ84sSHU53E6P7XFcgTooM7qzdebKafKT5C/fH3PzkAHAYXZG811CYhi4OqLDUXU/sAYQ1gqULx7q7nPGxgiM3m+zRkYYwjWVik9uIOXzeMkkqzcfJ3cxatxvYO5uwy88DKOf7DJDrGC63ybeF9y/Fy8QvuEllfdif7qQlgsJxSjNZVnT9rWHeh6jWCTnv9uCKvlDScQn5zy00exnEWfYMKQ8qMHbfuC1eXmpH7bcU9iifKgVMDoCH9giMKdNyk9uENybALpoPG0b6KIytPHbbviokH9cw8PE+sILJZDwBjTUSa6m2peplODH0V9tkDNdFaZ3eQIwGx8HmMIK+W29F83nelJWMjAVgVXY/rrFh4i1hFYLIeAchySZ85u2qliJdY94mWyW3rJyTNn+yq+LY06Da2oRHJLrYLW47xsHi+To/J4juTYBP7QKMW7t3oijyJK4eWH2vZ5+YG+m2c5LPrnm2OxnHCcZJLc5Reozj9FHIfU2ERXjbe4HvlrL1F59hgTBiRHx/tu5bgoRWJkDOUnqK8s4iTTJEfHtsyHiFIkz4yjEkmClSXEcchevNpcHe4PDPUkNKQcl8zUeerLGYLCGm42T2J4pK+c6WFyOj+1xXIEKMdFZXI4yTQi0n1ZSREcP0Hm3HmMMX07ualcl8TQSNzTlu1LWCrXIzE0gj8wGEukiNCoT4KXyze3D94+j8ToOP7waJyZ1KPrHAesIzgGtOrt7yXDRIdhHAdVTqxrs+kcJoqaZQZbt/eK0RGGWIq6dXvX/78LO1o/y34avs3XMsZgjAYTN7DiND6D1iCC0yi6sl5XoFm/Qzk4XfYeW+3v9tlC3Jvu1HTpIA6lHEVthk50KtCzmfjed1Ct7XHjvN11Txv2DvQ5OgyoPH1MfWUJ5ftkJi/gJFM7/sCNMUS1KuW5e0T1GrmZK9SWFjfOMXURcVzqywskRsZAa2qN7b0OjY2OCCsVjI7wMtnmtpvO7qrB1vV689qd7DDGoGtVSnP3iGpVvPwA6bNTXeXfr9cuSI6Og0B1/in+wBDF+7dxkmlSZycRoyk/ekBYKuCkMmQmzyPKobo0H8evnzyM7cjlSU1MNR1FN6zXK6gv7/7Z7ni+KCIsF6k8eoCOIpIjZ0iMnLGrmy3PxTqCPsZoTXX+KbXFuJxzVAlZu32DwesvI2r7BsiEAYXbNzBRiD80Sm15se0claePSI6OU3n6OE5FrFQASAyf6cJGQ7C2THX+KYmRMWpL8/gDw7ip5yuAGq2JgtomO0ybHSYMWGt8FoD68iIA6XPn9zwyMFpTW1qIF3Qph7BSisMWjkewtkJqbILSw3vNspphcY3C3VtkL1zGy2Qp3ru9YUdD/jp1bhqni4bWaE114WlcN4LdP9sdzxmGFO/cbL6uPH2EeB6JodFTHfawPJ+jHzdatiXWtN9UW8Boolptx//TUdRssLxMlmBtte39YG0FcV3Sk+cJVlfQ9VpXC5sgjgMnxyZwMzlqi89wEknSk9O7GlmIUripzI52tH6Wpv2rK13leyvPJ3fpGlGlTFgqkJ26SG1xnqhSiu1xnLbaygC6Vm2GXzbbUV9b6ZAOuTtMFFJf6fRsq53/YReEpa01J+rLS53TOC2WFqwj6GeUdJSPfl6D3ZploYP6lnMo30eUorrwpBEvFypPH3VVMcvoiKhaJSwXEcclqlZi6YNdLm4yYbjJjsdtdnTKGFGJBN2I+ZsojFeSioBSVBeekhg504wRG2OQzb17pWCbiV0nkdyzDRvndTr+v9pHqEl1OJ+TTCJif+aWnbHfkD5GOS7pc+fbJIuTZ8afO7kljiJ1dgqA2tICybFz7ecYm0DX43KOA9feQu7SVYJSdxWz1kNDXn6IweuvkBgdo768tKtzrYeGAAaudrZDHEVqYmrjtXJizf8uRi9Ga6JqhfyVFxm48lJzUlX5CRCF1prM1MWWIjJCZvICBqivrpIaP9dux+SFrqUPlOOQPjfd/lxGn/9sd8JJJPAGNnLjlZ8gNTbRFxPGlv5GzDFbSve2t73NvPrqq0dtxqFhjMGEAToMG1kgu9Pb11EYZ8VEUbOxMS3nEKWaqYdG632lIcY9eINyvbbtXX2+lmtvZ0frZ1Gu13U2jDEmDuU0KoaZRklJEwWI48bXVgpj4rkJcV0QFdsWhWitEZH4Prou4rj7y2Bq1JTWYbCnZ7sTOgya2VDKcbsWtbOcPETkL4wxb+v0np0s7nNEBPH8PYcMlOPC5t7lpnM0+73bpCHu+lqtxVj22JC1Xns7Ozp+li4QkbbaAdKsJdDh3vqb7pXyN4bPBySAFj9b70Aba+V6YLOELHvEjhktFovllGMdgcVisZxyrCOwWCyWU451BBaLxXLKsY7AYrFYTjk2a8jSN8TCcgaEQ9PHMVHUTFsVAUSee20dBnFlE5FTJ1u8ns4MAo7aEBpspKu2bnfDurgfSJyi20EaYz3tF0Bc58AWzMXX1o3zdr72SeV0fYstfUtUr1Oau0NYLOCk0mSnZ+JCJj38MeogoPLsEf7gCJXHc4TlIm46Q2Z6puOq33UBvOKDO0SVMm4uv69FZccNHYUEhTXKjx5goojEyCjJMxPoeg1dq+IPDBFWK+haFW9gaM9rLHQYUH7ykPryIsrzSZ87j5tpFy9cFw6sLj5DlEN6YgovN7D/9RdBQPnxA+qryygvFmbsVXW0fuR0fEpLX6PDkNKDWcJirJUTVcoU7rzZVRnHXV8ziig/mcNNZyk/vEfYqB0clksU7t5qrjpuxYQBhTs3cVMZ8leukxodx4QhUYdjTyImCCndn41HBEZTW3iGrlUJKyVKc3cpPbxHYfYGQXFtzxpMRmuqi/Poeo3czDUykxdQroOJInQYxAvlGoXuq/Nx7WcTBpQe3Nl3BbO4nnSs8Isx6Hot/v51KC26EzoMiGpVomo1trflHmyu1azDkKheix1nEKCDgKhaIapV0WGI0Trev0cbusWOCCxHj9Fbxd6CoCGW1psQkdERQWGVxNAoUbXSfu1aNa5RsOV/NG42h5NKsXbrBnERA0Vu5grqFIQSgg6idpVnj0hPTBPmBxsy5wlS4+coP3lE+uzErhdCxppVFVJnJijeu9UM/cTyIkJ9ZZHkmYkW+Y8NwsIabjLV9ecyUURQWNm00xDVaru2XwcBxfuzhKUCyvfJnr/ckE0fBB0RlArxyMVx45HP44fUlxeAWF8qe+Fy7Hy0JnfpBcLiWvN+ps9No/xET79fPR0RiMj7ROSGiNwSkY93eD8hIv+98f4XReRiL+2x9CsS6/20oravaHUgVxSFk0xhdLRFaE6cbRp1pUgMjVJ+NEej/DkYTenB3Z6OXvqFTo2tNzCMDgOCwirK99H1GkFhDcf3KN6b3X1vXRr39sncRjF7oPJ4Di+TIaqUKd2/jbhuQ3Rwg32X6RTB6fDZ9rKaPygXm+qvXm4wHiU9uEP12WPWZm/EYoeNr4wOgqYTiF/XqS4+wx8cITE0Qn11mcrTR0S1KkFhlbVbb/T8+9WzX5qIOMCvAt8KvAR8WERe2nTYR4FlY8wV4FeAf9Ureyz9i7gu2fOXNiqTiSI7PdPTylHKdclMXqC6vEBm8nysMgqgVMOWrddWjhvrD20aLeigTvNXfoJRiQT+8GjztZNM4WeyRJUyfn6Q3Mw1UuPnCMtFnGSKsFzcEhLZ9tyOg5NMdpThbj1HfXkRf3Ck+dofHMFJ7kMFlvi7kJ4439bwp85OIu7u5zjWpcyBZu2PxOgY1fkn6Hqd/OUXm/MYnT6jrlVRno+bzVNfXWp7z0QhOqzv6TPtlV6Ght4B3DLGzAKIyKeBDwCvtxzzAeAXG9ufAf69iIg5bkp4ln0hjR7ZwLW3YLSONYcct+cTdcpPkD13AaM1A9feAlrH4m/biNqJigXolJ9A1zdqQrjZHJwCqWfleqTPTpEaOxc7QxEKs2+SGDmDPzTC6puvkb14GTebpzB7Ix7V7SGcIY6LnxtskSepEwAAB79JREFUawhjh7xxDuUnSYycITE4AsKBCPVBrNyav/JiPEIUBc7eSqL6A0NUnz1p2OjjJtNUF57GoSxjqK8t4w8OoxwXN721aJOXGyQsF/FUHuX5W+adRPU2it/Lb+8k8KDl9VxjX8djjDEhsAqMbDoGEflREXlVRF6dn5/vkbmWo0SUQnk+TiKJ8vxDydYQiesEO4kEjp/ASaYa196+ARDXIzdzFTeTQ5SDlx+MM5xOSRqpcl0cv/GcXJfM9Az15UVKD+6SGB5FULETMIbMuek9jerWpbn9oRHEcXDTGbIXLlN5+jB+3/NJjoziuBvP7CDve/xdSKJ8f88ZT8pPkJmeQfk+/sAwUa0CxjB4/RXS56bjCe5G91Zcl9ylaziJJOK4JM+cxcsPEJZL1AurpCem2zoW/vBo1/XEd0vPZKhF5LuA9xpjfqTx+geAdxhjfrLlmNcax8w1Xt9uHLO43XlPmwy1pT+J1zzoWNK7xz/Sfqd1XYXREVGt2mjknK7WEzTXEoiAiUNvxmgcP9nXstrrsuJAYxATrzPRUQhmqzJvnJlmNgojRWH8j0qBjgirVZTnoVz3QNbVHJUM9Rww3fJ6Cni0zTFzIuICA8ASFkufc1pGALuhvZFy972uQjXlwRuv+7jxb2VdVnwz2znDzZ+rrVa14+Dvo1rdXunl+PtLwFURmRERH/gQ8NlNx3wW+MHG9geBP7LzAxaLxXK49KxbY4wJReRjwOcAB/iUMeY1EfkE8Kox5rPAfwZ+U0RuEY8EPtQreywWi8XSmZ6Ob40xvw/8/qZ9v9CyXQW+q5c2WCwWi2VnTn7Om8VisVh2xDoCi8ViOeVYR2CxWCynHOsILBaL5ZRjHYHFYrGccqwjsFgsllNOzyQmeoWIzAP3uvjXUWDhuUcdHda+/dHv9kH/22jt2x/9bt8FY8yZTm8cO0fQLSLy6nY6G/2AtW9/9Lt90P82Wvv2R7/btxM2NGSxWCynHOsILBaL5ZRzmhzBJ4/agOdg7dsf/W4f9L+N1r790e/2bcupmSOwWCwWS2dO04jAYrFYLB2wjsBisVhOOSfOEYjI+0TkhojcEpGPd3j/V0Tky42/N0Vkpc/sOy8inxeRvxSRr4jI+/vMvgsi8ocN2/5YRKYO2b5PicgzEfnqNu+LiPy7hv1fEZGv6zP7rovIn4tITUR+7jBt26V939e4b18RkT8Tkb/WZ/Z9oGHblxt1zN/VT/a1HPd2EYlE5IOHZdu+MMacmD/iAji3gUuAD/wV8NIOx/8kccGcvrGPeMLpxxrbLwF3+8y+3wF+sLH9LcBvHvIz/kbg64CvbvP++4E/IK4a+07gi31m3xjwduCXgZ87TNt2ad83AEON7W/tw/uXZWNu863AG/1kX+MYB/gj4losHzzsZ9zN30kbEbwDuGWMmTXG1IFPAx/Y4fgPA799KJbF7MY+A+Qb2wNsrfN81Pa9BPxhY/vzHd7vKcaYP2HnutYfAP6bifkCMCgiE4dj3fPtM8Y8M8Z8CQgOy6ZN13+efX9mjFluvPwCca3xQ2MX9hVNo7UFMsS/l0NjF98/iDuY/xN41nuLDoaT5ggmgQctr+ca+7YgIheAGWLPfVjsxr5fBL5fROaIexQ/eTimAbuz76+A72xsfzuQE5GRQ7Btt+z6O2B5Lh8lHl31FSLy7SLyBvB7wA8ftT2tiMgk8e/i147alr1w0hyBdNi3XY/hQ8BnjDFRD+3ZzG7s+zDwX40xU8Rhjt8UkcN6Trux7+eAd4vIXwLvBh4CYa8N2wN7+Q5YtkFEvpnYEfz8UduyGWPM7xpjrgN/D/ilo7ZnE/8W+PlDblf2TU9rFh8Bc8B0y+sptg+tfAj4iZ5b1M5u7Pso8D4AY8yfi0iSWMzqMIaZz7XPGPMI+A4AEckC32mMWT0E23bLXr4Dlg6IyFuBXwe+1RizeNT2bIcx5k9E5LKIjBpj+kXs7W3Ap0UE4t/t+0UkNMb876M1a2dO2ojgS8BVEZkREZ+4sf/s5oNE5AVgCPjzPrTvPvAeABF5EUgC8/1in4iMtoxQ/gnwqUOybbd8Fvj7jeyhdwKrxpjHR23UcUFEzgP/C/gBY8ybR23PZkTkijRa2UZGmA/0jbMyxswYYy4aYy4CnwF+vN+dAJywEYExJhSRjwGfI565/5Qx5jUR+QTwqjFmvVH7MPDplkmnfrLvZ4H/JCI/TRzS+KHDsnOX9n0T8C9ExAB/wiGPqkTktxs2jDbmUf454DXs/zXieZX3A7eAMvCRfrJPRM4CrxInBGgR+UfEmVlr/WAf8AvACPAfGu1taA5RUXMX9n0nsaMPgArwPYf5O96FfccSKzFhsVgsp5yTFhqyWCwWyx6xjsBisVhOOdYRWCwWyynHOgKLxWI55VhHYLFYLKcc6wgslgNARAZF5MeP2g6LpRusI7BYDoZBwDoCy7HEOgKL5WD4l8Dlhk7+vz5qYyyWvWAXlFksB4CIXAT+jzHm5SM2xWLZM3ZEYLFYLKcc6wgsFovllGMdgcVyMBSA3FEbYbF0g3UEFssB0NDt/1MR+aqdLLYcN+xkscVisZxy7IjAYrFYTjnWEVgsFsspxzoCi8ViOeVYR2CxWCynHOsILBaL5ZRjHYHFYrGccqwjsFgsllPO/wc4ekmkQ1qK4wAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#plot\n",
    "concat=pd.concat([train.assign(dataset='train'), test.assign(dataset='test')])\n",
    "sns.scatterplot(x='t', y='ptau', data=concat, \n",
    "                hue='exp_label', style='dataset',\n",
    "               )"
   ]
  },
  {
   "cell_type": "code",
1854
   "execution_count": 21,
Luigi's avatar
Luigi committed
1855
1856
1857
1858
1859
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
1860
       "<matplotlib.axes._subplots.AxesSubplot at 0x7fc395968820>"
Luigi's avatar
Luigi committed
1861
1862
      ]
     },
1863
     "execution_count": 21,
Luigi's avatar
Luigi committed
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#plot\n",
    "sns.scatterplot(x='tau', y='ptau', data=concat, \n",
    "                hue='exp_label', style='dataset',\n",
    "               )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Predict stability of new compositions using tau"
   ]
  },
  {
   "cell_type": "code",
1896
   "execution_count": 22,
Luigi's avatar
Luigi committed
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "81 candidate formulas\n",
      "9 single perovskite candidates: ['LiTiO3', 'LiMnO3', 'LiAlO3', 'SrTiO3', 'SrMnO3', 'SrAlO3', 'LaTiO3', 'LaMnO3', 'LaAlO3']\n",
      "18 A2BB'X6 candidates: ['Li2TiMnO6', 'Li2TiAlO6', 'Li2MnTiO6', 'Li2MnAlO6', 'Li2AlTiO6', 'Li2AlMnO6', 'Sr2TiMnO6', 'Sr2TiAlO6', 'Sr2MnTiO6', 'Sr2MnAlO6', 'Sr2AlTiO6', 'Sr2AlMnO6', 'La2TiMnO6', 'La2TiAlO6', 'La2MnTiO6', 'La2MnAlO6', 'La2AlTiO6', 'La2AlMnO6']\n"
     ]
    }
   ],
   "source": [
    "# generate some potential single and double perovskites\n",
    "\n",
    "A_cations = ['Li', 'Sr', 'La']\n",
    "B_cations = ['Ti', 'Mn', 'Al']\n",
    "X_anions = ['O']\n",
    "\n",
    "count = 0\n",
    "candidates = {}\n",
    "X1 = X_anions[0]\n",
    "for A1 in A_cations:\n",
    "    for A2 in A_cations:\n",
    "        for B1 in B_cations:\n",
    "            for B2 in B_cations:\n",
    "                if (A1 != A2) and (B1 != B2):\n",
    "                    candidate = ''.join([A1, A2, B1, B2, X1, '6'])\n",
    "                    tag = 'double_AB'\n",
    "                elif (A1 != A2):\n",
    "                    candidate = ''.join([A1, A2, B1, '2', X1, '6'])\n",
    "                    tag = 'double_A'\n",
    "                elif (B1 != B2):\n",
    "                    candidate = ''.join([A1, '2', B1, B2, X1, '6'])\n",
    "                    tag = 'double_B'\n",
    "                else:\n",
    "                    candidate = ''.join([A1, B1, X1, '3'])\n",
    "                    tag = 'single'\n",
    "                tmp_dict = {}\n",
    "                tmp_dict['A1'] = A1\n",
    "                tmp_dict['A2'] = A2\n",
    "                tmp_dict['B1'] = B1\n",
    "                tmp_dict['B2'] = B2\n",
    "                tmp_dict['X1'] = X1\n",
    "                tmp_dict['X2'] = X1\n",
    "                tmp_dict['tag'] = tag\n",
    "                tmp_dict['formula'] = candidate\n",
    "                candidates[candidate] = tmp_dict\n",
    "                count += 1\n",
    "\n",
    "print('%i candidate formulas' % count)\n",
    "CCX3s = [k for k in candidates if candidates[k]['tag'] == 'single']\n",
    "A2BBX6s = [k for k in candidates if candidates[k]['tag'] == 'double_B']\n",
    "print('%i single perovskite candidates: %s' % (len(CCX3s), CCX3s))\n",
    "print(\"%i A2BB'X6 candidates: %s\" % (len(A2BBX6s), A2BBX6s))"
   ]
  },
  {
   "cell_type": "code",
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
   "execution_count": 24,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LiTiO3 could not be charge-balanced...\n"
     ]
    },
    {
     "ename": "FileNotFoundError",
     "evalue": "[Errno 2] No such file or directory: 'electronegativities.csv'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-24-048c911ab7cf>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m     19\u001b[0m     \u001b[0mclassifier\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mPredictAABBXX6\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mA1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mA2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mB1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mB2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mX1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mX2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     20\u001b[0m     \u001b[0;32mfor\u001b[0m \u001b[0mprop\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mproperties\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 21\u001b[0;31m         \u001b[0mtmp_dict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mprop\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclassifier\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprop\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     22\u001b[0m     \u001b[0mtmp_dict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'tau_prob'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mclassifier\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtau_prob\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     23\u001b[0m     \u001b[0mresults\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcandidate\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtmp_dict\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/analytics/tutorials/analytics-perovskites-tolerance-factor/perovskites_tolerance_factor/PredictPerovskites.py\u001b[0m in \u001b[0;36mnA\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m   1046\u001b[0m             \u001b[0mCCX3\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m''\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mAs\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mBs\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mXs\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m'3'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1047\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mPredictABX3\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mCCX3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnA\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1048\u001b[0;31m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mAB_radii_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1049\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnan\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1050\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/analytics/tutorials/analytics-perovskites-tolerance-factor/perovskites_tolerance_factor/PredictPerovskites.py\u001b[0m in \u001b[0;36mAB_radii_dict\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    990\u001b[0m                              'B_rad' : radius if B (float)}}\n\u001b[1;32m    991\u001b[0m         \"\"\"\n\u001b[0;32m--> 992\u001b[0;31m         \u001b[0mox_dict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mchosen_ox_states\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    993\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mox_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfloat\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    994\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnan\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/analytics/tutorials/analytics-perovskites-tolerance-factor/perovskites_tolerance_factor/PredictPerovskites.py\u001b[0m in \u001b[0;36mchosen_ox_states\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    944\u001b[0m             \u001b[0mspread_combos\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mcombo\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mcombo\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mgood_combos\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcombo\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcombo\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mbiggest_spread\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    945\u001b[0m             \u001b[0mtight_combos\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mcombo\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mcombo\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mgood_combos\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcombo\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcombo\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0msmallest_spread\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 946\u001b[0;31m             \u001b[0mchi_dict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mchi_dict\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    947\u001b[0m             \u001b[0mchis\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mchi_dict\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mel\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mel\u001b[0m \u001b[0;32min\u001b[0m \u001b[0munspec_els\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    948\u001b[0m             \u001b[0mmaxdex\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mchis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/analytics/tutorials/analytics-perovskites-tolerance-factor/perovskites_tolerance_factor/PredictPerovskites.py\u001b[0m in \u001b[0;36mchi_dict\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    714\u001b[0m         \u001b[0mcations\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcations\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    715\u001b[0m         \u001b[0mchi_dict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 716\u001b[0;31m         \u001b[0;32mwith\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'electronegativities.csv'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    717\u001b[0m             \u001b[0;32mfor\u001b[0m \u001b[0mline\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    718\u001b[0m                 \u001b[0mline\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mline\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msplit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m','\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'electronegativities.csv'"
     ]
    }
   ],
Luigi's avatar
Luigi committed
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
   "source": [
    "# if single, assign A/B and classify; if double, use given A/B and classify\n",
    "\n",
    "properties = ['A', 'B',\n",
    "              'nA', 'nB', 'nX',\n",
    "              'rA', 'rB', 'rX',\n",
    "              't', 't_pred',\n",
    "              'tau', 'tau_pred']\n",
    "\n",
    "results = {}\n",
Luigi's avatar
Luigi committed
1994
    "# clf = PredictABX3('').calibrate_tau\n",
Luigi's avatar
Luigi committed
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
    "for candidate in candidates:\n",
    "    tmp_dict = candidates[candidate]\n",
    "    A1 = tmp_dict['A1']\n",
    "    A2 = tmp_dict['A2']\n",
    "    B1 = tmp_dict['B1']\n",
    "    B2 = tmp_dict['B2']\n",
    "    X1 = tmp_dict['X1']\n",
    "    X2 = tmp_dict['X2']\n",
    "    classifier = PredictAABBXX6(A1, A2, B1, B2, X1, X2)\n",
    "    for prop in properties:\n",
    "        tmp_dict[prop] = getattr(classifier, prop)\n",
    "    tmp_dict['tau_prob'] = classifier.tau_prob(clf)\n",
    "    results[candidate] = tmp_dict        \n",
    "    if not math.isnan(tmp_dict['tau']):\n",
    "        print('%s classified as %s (tau = %.2f; P = %.2f)' % (candidate, ['perovskite' if tmp_dict['tau_pred'] == 1 else 'nonperovskite'][0],\n",
    "                                                  tmp_dict['tau'], tmp_dict['tau_prob']))\n",
    "    else:\n",
    "        print('%s could not be charge-balanced...' % candidate)"
   ]
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "ename": "FileNotFoundError",
     "evalue": "[Errno 2] File ./TableS1.csv does not exist: './TableS1.csv'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mFileNotFoundError\u001b[0m                         Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-2-d38e4acb6c40>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mclf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mPredictABX3\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m''\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcalibrate_tau\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;32m~/analytics/tutorials/analytics-perovskites-tolerance-factor/perovskites_tolerance_factor/PredictPerovskites.py\u001b[0m in \u001b[0;36mcalibrate_tau\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    448\u001b[0m         \u001b[0mf_clf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'save_clf.p'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    449\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexists\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf_clf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 450\u001b[0;31m             \u001b[0mdf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'./TableS1.csv'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    451\u001b[0m             \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'tau'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mPredictABX3\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mABX3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtau\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mABX3\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mABX3\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    452\u001b[0m             \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'tau'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreshape\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'exp_label'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/sisso/lib/python3.8/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36mparser_f\u001b[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, dialect, error_bad_lines, warn_bad_lines, delim_whitespace, low_memory, memory_map, float_precision)\u001b[0m\n\u001b[1;32m    674\u001b[0m         )\n\u001b[1;32m    675\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 676\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0m_read\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    677\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    678\u001b[0m     \u001b[0mparser_f\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/sisso/lib/python3.8/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m    446\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    447\u001b[0m     \u001b[0;31m# Create the parser.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 448\u001b[0;31m     \u001b[0mparser\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mTextFileReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfp_or_buf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    449\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    450\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mchunksize\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0miterator\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/sisso/lib/python3.8/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[1;32m    878\u001b[0m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"has_index_names\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"has_index_names\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    879\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 880\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_make_engine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mengine\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    881\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    882\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/sisso/lib/python3.8/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m_make_engine\u001b[0;34m(self, engine)\u001b[0m\n\u001b[1;32m   1112\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m_make_engine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mengine\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"c\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1113\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mengine\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"c\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1114\u001b[0;31m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCParserWrapper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1115\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1116\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mengine\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"python\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32m~/anaconda3/envs/sisso/lib/python3.8/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, src, **kwds)\u001b[0m\n\u001b[1;32m   1889\u001b[0m         \u001b[0mkwds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"usecols\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0musecols\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1890\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1891\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_reader\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mparsers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTextReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msrc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1892\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munnamed_cols\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_reader\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munnamed_cols\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1893\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;32mpandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader.__cinit__\u001b[0;34m()\u001b[0m\n",
      "\u001b[0;32mpandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader._setup_parser_source\u001b[0;34m()\u001b[0m\n",
      "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] File ./TableS1.csv does not exist: './TableS1.csv'"
     ]
    }
   ],
   "source": [
    "clf = PredictABX3('').calibrate_tau\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
Luigi's avatar
Luigi committed
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}