From 8c9a9c1969eb745abfba264d8539b89bda9ced47 Mon Sep 17 00:00:00 2001 From: Github Actions Date: Mon, 22 Nov 2021 22:38:52 +0000 Subject: [PATCH] Ravin Kohli: [FIX formatting in docs (#342) --- .../example_resampling_strategy.py | 30 +- .../example_custom_configuration_space.ipynb | 130 +++++- .../example_resampling_strategy.ipynb | 39 +- .../example_custom_configuration_space.py | 153 ++++--- .../example_run_with_portfolio.py | 84 ++-- .../example_parallel_n_jobs.py | 11 +- .../example_parallel_n_jobs.ipynb | 4 +- .../example_run_with_portfolio.ipynb | 74 +++- .../examples_python.zip | Bin 27643 -> 27621 bytes .../examples_jupyter.zip | Bin 39410 -> 41169 bytes .../sphx_glr_example_visualization_001.png | Bin 39089 -> 41341 bytes .../sphx_glr_example_visualization_002.png | Bin 18518 -> 16987 bytes .../sphx_glr_example_visualization_thumb.png | Bin 32784 -> 34066 bytes .../example_image_classification.rst.txt | 17 +- .../example_tabular_classification.rst.txt | 34 +- .../example_tabular_regression.rst.txt | 10 +- .../20_basics/sg_execution_times.rst.txt | 8 +- ...example_custom_configuration_space.rst.txt | 381 +++++++++++------- .../example_parallel_n_jobs.rst.txt | 215 +--------- .../example_resampling_strategy.rst.txt | 154 ++++--- .../example_run_with_portfolio.rst.txt | 226 +++++++---- .../40_advanced/example_visualization.rst.txt | 4 +- .../40_advanced/sg_execution_times.rst.txt | 12 +- development/_sources/examples/index.rst.txt | 40 +- .../example_image_classification.html | 17 +- .../example_tabular_classification.html | 34 +- .../20_basics/example_tabular_regression.html | 10 +- .../20_basics/sg_execution_times.html | 8 +- .../example_custom_configuration_space.html | 283 +++++++------ .../40_advanced/example_parallel_n_jobs.html | 213 +--------- .../example_resampling_strategy.html | 115 +++--- .../example_run_with_portfolio.html | 166 ++++---- .../40_advanced/example_visualization.html | 4 +- .../40_advanced/sg_execution_times.html | 14 +- development/examples/index.html | 24 +- development/manual.html | 2 +- .../example_custom_configuration_space.ipynb | 130 +++++- .../40_advanced/example_parallel_n_jobs.ipynb | 4 +- .../example_resampling_strategy.ipynb | 39 +- .../example_run_with_portfolio.ipynb | 74 +++- development/objects.inv | Bin 2743 -> 2919 bytes development/searchindex.js | 2 +- 42 files changed, 1546 insertions(+), 1219 deletions(-) diff --git a/development/_downloads/307f532dbef0476f85afc6b64b65f087/example_resampling_strategy.py b/development/_downloads/307f532dbef0476f85afc6b64b65f087/example_resampling_strategy.py index 6735fffee..d02859f1b 100644 --- a/development/_downloads/307f532dbef0476f85afc6b64b65f087/example_resampling_strategy.py +++ b/development/_downloads/307f532dbef0476f85afc6b64b65f087/example_resampling_strategy.py @@ -26,10 +26,13 @@ from autoPyTorch.api.tabular_classification import TabularClassificationTask from autoPyTorch.datasets.resampling_strategy import CrossValTypes, HoldoutValTypes +############################################################################ +# Default Resampling Strategy +# ============================ ############################################################################ # Data Loading -# ============ +# ------------ X, y = sklearn.datasets.fetch_openml(data_id=40981, return_X_y=True, as_frame=True) X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split( X, @@ -39,7 +42,7 @@ ############################################################################ # Build and fit a classifier with default resampling strategy -# =========================================================== +# ----------------------------------------------------------- api = TabularClassificationTask( # 'HoldoutValTypes.holdout_validation' with 'val_share': 0.33 # is the default argument setting for TabularClassificationTask. @@ -51,7 +54,7 @@ ############################################################################ # Search for an ensemble of machine learning algorithms -# ===================================================== +# ----------------------------------------------------- api.search( X_train=X_train, y_train=y_train, @@ -64,7 +67,7 @@ ############################################################################ # Print the final ensemble performance -# ==================================== +# ------------------------------------ y_pred = api.predict(X_test) score = api.score(y_pred, y_test) print(score) @@ -76,9 +79,13 @@ ############################################################################ +############################################################################ +# Cross validation Resampling Strategy +# ===================================== + ############################################################################ # Build and fit a classifier with Cross validation resampling strategy -# ==================================================================== +# -------------------------------------------------------------------- api = TabularClassificationTask( resampling_strategy=CrossValTypes.k_fold_cross_validation, resampling_strategy_args={'num_splits': 3} @@ -86,7 +93,8 @@ ############################################################################ # Search for an ensemble of machine learning algorithms -# ===================================================== +# ----------------------------------------------------------------------- + api.search( X_train=X_train, y_train=y_train, @@ -99,7 +107,7 @@ ############################################################################ # Print the final ensemble performance -# ==================================== +# ------------ y_pred = api.predict(X_test) score = api.score(y_pred, y_test) print(score) @@ -111,9 +119,13 @@ ############################################################################ +############################################################################ +# Stratified Resampling Strategy +# =============================== + ############################################################################ # Build and fit a classifier with Stratified resampling strategy -# ============================================================== +# -------------------------------------------------------------- api = TabularClassificationTask( # For demonstration purposes, we use # Stratified hold out validation. However, @@ -124,7 +136,7 @@ ############################################################################ # Search for an ensemble of machine learning algorithms -# ===================================================== +# ----------------------------------------------------- api.search( X_train=X_train, y_train=y_train, diff --git a/development/_downloads/3f9c66ebcc4532fdade3cdaa4d769bde/example_custom_configuration_space.ipynb b/development/_downloads/3f9c66ebcc4532fdade3cdaa4d769bde/example_custom_configuration_space.ipynb index 57a84b7a5..d019dfb3a 100644 --- a/development/_downloads/3f9c66ebcc4532fdade3cdaa4d769bde/example_custom_configuration_space.ipynb +++ b/development/_downloads/3f9c66ebcc4532fdade3cdaa4d769bde/example_custom_configuration_space.ipynb @@ -15,7 +15,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n# Tabular Classification with Custom Configuration Space\n\nThe following example shows how adjust the configuration space of\nthe search. Currently, there are two changes that can be made to the space:-\n1. Adjust individual hyperparameters in the pipeline\n2. Include or exclude components:\n a) include: Dictionary containing components to include. Key is the node\n name and Value is an Iterable of the names of the components\n to include. Only these components will be present in the\n search space.\n b) exclude: Dictionary containing components to exclude. Key is the node\n name and Value is an Iterable of the names of the components\n to exclude. All except these components will be present in\n the search space.\n" + "\n# Tabular Classification with Custom Configuration Space\n\nThe following example shows how adjust the configuration space of\nthe search. Currently, there are two changes that can be made to the space:-\n\n1. Adjust individual hyperparameters in the pipeline\n2. Include or exclude components:\n a) include: Dictionary containing components to include. Key is the node\n name and Value is an Iterable of the names of the components\n to include. Only these components will be present in the\n search space.\n b) exclude: Dictionary containing components to exclude. Key is the node\n name and Value is an Iterable of the names of the components\n to exclude. All except these components will be present in\n the search space.\n" ] }, { @@ -26,7 +26,133 @@ }, "outputs": [], "source": [ - "import os\nimport tempfile as tmp\nimport warnings\n\nos.environ['JOBLIB_TEMP_FOLDER'] = tmp.gettempdir()\nos.environ['OMP_NUM_THREADS'] = '1'\nos.environ['OPENBLAS_NUM_THREADS'] = '1'\nos.environ['MKL_NUM_THREADS'] = '1'\n\nwarnings.simplefilter(action='ignore', category=UserWarning)\nwarnings.simplefilter(action='ignore', category=FutureWarning)\n\nimport sklearn.datasets\nimport sklearn.model_selection\n\nfrom autoPyTorch.api.tabular_classification import TabularClassificationTask\nfrom autoPyTorch.utils.hyperparameter_search_space_update import HyperparameterSearchSpaceUpdates\n\n\ndef get_search_space_updates():\n \"\"\"\n Search space updates to the task can be added using HyperparameterSearchSpaceUpdates\n Returns:\n HyperparameterSearchSpaceUpdates\n \"\"\"\n updates = HyperparameterSearchSpaceUpdates()\n updates.append(node_name=\"data_loader\",\n hyperparameter=\"batch_size\",\n value_range=[16, 512],\n default_value=32)\n updates.append(node_name=\"lr_scheduler\",\n hyperparameter=\"CosineAnnealingLR:T_max\",\n value_range=[50, 60],\n default_value=55)\n updates.append(node_name='network_backbone',\n hyperparameter='ResNetBackbone:dropout',\n value_range=[0, 0.5],\n default_value=0.2)\n return updates\n\n\nif __name__ == '__main__':\n\n ############################################################################\n # Data Loading\n # ============\n X, y = sklearn.datasets.fetch_openml(data_id=40981, return_X_y=True, as_frame=True)\n X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(\n X,\n y,\n random_state=1,\n )\n\n ############################################################################\n # Build and fit a classifier with include components\n # ==================================================\n api = TabularClassificationTask(\n search_space_updates=get_search_space_updates(),\n include_components={'network_backbone': ['MLPBackbone', 'ResNetBackbone'],\n 'encoder': ['OneHotEncoder']}\n )\n\n ############################################################################\n # Search for an ensemble of machine learning algorithms\n # =====================================================\n api.search(\n X_train=X_train.copy(),\n y_train=y_train.copy(),\n X_test=X_test.copy(),\n y_test=y_test.copy(),\n optimize_metric='accuracy',\n total_walltime_limit=150,\n func_eval_time_limit_secs=30\n )\n\n ############################################################################\n # Print the final ensemble performance\n # ====================================\n y_pred = api.predict(X_test)\n score = api.score(y_pred, y_test)\n print(score)\n print(api.show_models())\n\n # Print statistics from search\n print(api.sprint_statistics())\n\n ############################################################################\n # Build and fit a classifier with exclude components\n # ==================================================\n api = TabularClassificationTask(\n search_space_updates=get_search_space_updates(),\n exclude_components={'network_backbone': ['MLPBackbone'],\n 'encoder': ['OneHotEncoder']}\n )\n\n ############################################################################\n # Search for an ensemble of machine learning algorithms\n # =====================================================\n api.search(\n X_train=X_train,\n y_train=y_train,\n X_test=X_test.copy(),\n y_test=y_test.copy(),\n optimize_metric='accuracy',\n total_walltime_limit=150,\n func_eval_time_limit_secs=30\n )\n\n ############################################################################\n # Print the final ensemble performance\n # ====================================\n y_pred = api.predict(X_test)\n score = api.score(y_pred, y_test)\n print(score)\n print(api.show_models())\n\n # Print statistics from search\n print(api.sprint_statistics())" + "import os\nimport tempfile as tmp\nimport warnings\n\nos.environ['JOBLIB_TEMP_FOLDER'] = tmp.gettempdir()\nos.environ['OMP_NUM_THREADS'] = '1'\nos.environ['OPENBLAS_NUM_THREADS'] = '1'\nos.environ['MKL_NUM_THREADS'] = '1'\n\nwarnings.simplefilter(action='ignore', category=UserWarning)\nwarnings.simplefilter(action='ignore', category=FutureWarning)\n\nimport sklearn.datasets\nimport sklearn.model_selection\n\nfrom autoPyTorch.api.tabular_classification import TabularClassificationTask\nfrom autoPyTorch.utils.hyperparameter_search_space_update import HyperparameterSearchSpaceUpdates\n\n\ndef get_search_space_updates():\n \"\"\"\n Search space updates to the task can be added using HyperparameterSearchSpaceUpdates\n Returns:\n HyperparameterSearchSpaceUpdates\n \"\"\"\n updates = HyperparameterSearchSpaceUpdates()\n updates.append(node_name=\"data_loader\",\n hyperparameter=\"batch_size\",\n value_range=[16, 512],\n default_value=32)\n updates.append(node_name=\"lr_scheduler\",\n hyperparameter=\"CosineAnnealingLR:T_max\",\n value_range=[50, 60],\n default_value=55)\n updates.append(node_name='network_backbone',\n hyperparameter='ResNetBackbone:dropout',\n value_range=[0, 0.5],\n default_value=0.2)\n return updates" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Loading\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "X, y = sklearn.datasets.fetch_openml(data_id=40981, return_X_y=True, as_frame=True)\nX_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(\n X,\n y,\n random_state=1,\n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Build and fit a classifier with include components\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "api = TabularClassificationTask(\n search_space_updates=get_search_space_updates(),\n include_components={'network_backbone': ['MLPBackbone', 'ResNetBackbone'],\n 'encoder': ['OneHotEncoder']}\n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Search for an ensemble of machine learning algorithms\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "api.search(\n X_train=X_train.copy(),\n y_train=y_train.copy(),\n X_test=X_test.copy(),\n y_test=y_test.copy(),\n optimize_metric='accuracy',\n total_walltime_limit=150,\n func_eval_time_limit_secs=30\n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Print the final ensemble performance\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "y_pred = api.predict(X_test)\nscore = api.score(y_pred, y_test)\nprint(score)\nprint(api.show_models())\n\n# Print statistics from search\nprint(api.sprint_statistics())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Build and fit a classifier with exclude components\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "api = TabularClassificationTask(\n search_space_updates=get_search_space_updates(),\n exclude_components={'network_backbone': ['MLPBackbone'],\n 'encoder': ['OneHotEncoder']}\n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Search for an ensemble of machine learning algorithms\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "api.search(\n X_train=X_train,\n y_train=y_train,\n X_test=X_test.copy(),\n y_test=y_test.copy(),\n optimize_metric='accuracy',\n total_walltime_limit=150,\n func_eval_time_limit_secs=30\n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Print the final ensemble performance\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "y_pred = api.predict(X_test)\nscore = api.score(y_pred, y_test)\nprint(score)\nprint(api.show_models())\n\n# Print statistics from search\nprint(api.sprint_statistics())" ] } ], diff --git a/development/_downloads/4cbefcc88d68bf84110d315dc5fdb8e1/example_resampling_strategy.ipynb b/development/_downloads/4cbefcc88d68bf84110d315dc5fdb8e1/example_resampling_strategy.ipynb index 102baac50..9c163af7c 100644 --- a/development/_downloads/4cbefcc88d68bf84110d315dc5fdb8e1/example_resampling_strategy.ipynb +++ b/development/_downloads/4cbefcc88d68bf84110d315dc5fdb8e1/example_resampling_strategy.ipynb @@ -33,7 +33,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Data Loading\n\n" + "## Default Resampling Strategy\n\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Data Loading\n\n" ] }, { @@ -51,7 +58,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Build and fit a classifier with default resampling strategy\n\n" + "### Build and fit a classifier with default resampling strategy\n\n" ] }, { @@ -69,7 +76,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Search for an ensemble of machine learning algorithms\n\n" + "### Search for an ensemble of machine learning algorithms\n\n" ] }, { @@ -87,7 +94,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Print the final ensemble performance\n\n" + "### Print the final ensemble performance\n\n" ] }, { @@ -105,7 +112,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Build and fit a classifier with Cross validation resampling strategy\n\n" + "## Cross validation Resampling Strategy\n\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Build and fit a classifier with Cross validation resampling strategy\n\n" ] }, { @@ -123,7 +137,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Search for an ensemble of machine learning algorithms\n\n" + "### Search for an ensemble of machine learning algorithms\n\n" ] }, { @@ -141,7 +155,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Print the final ensemble performance\n\n" + "### Print the final ensemble performance\n\n" ] }, { @@ -159,7 +173,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Build and fit a classifier with Stratified resampling strategy\n\n" + "## Stratified Resampling Strategy\n\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Build and fit a classifier with Stratified resampling strategy\n\n" ] }, { @@ -177,7 +198,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Search for an ensemble of machine learning algorithms\n\n" + "### Search for an ensemble of machine learning algorithms\n\n" ] }, { diff --git a/development/_downloads/5517f58caf37183d75ea0dc7cedf8b58/example_custom_configuration_space.py b/development/_downloads/5517f58caf37183d75ea0dc7cedf8b58/example_custom_configuration_space.py index c64a4fca1..985d9d9ff 100644 --- a/development/_downloads/5517f58caf37183d75ea0dc7cedf8b58/example_custom_configuration_space.py +++ b/development/_downloads/5517f58caf37183d75ea0dc7cedf8b58/example_custom_configuration_space.py @@ -5,6 +5,7 @@ The following example shows how adjust the configuration space of the search. Currently, there are two changes that can be made to the space:- + 1. Adjust individual hyperparameters in the pipeline 2. Include or exclude components: a) include: Dictionary containing components to include. Key is the node @@ -57,80 +58,78 @@ def get_search_space_updates(): return updates -if __name__ == '__main__': - - ############################################################################ - # Data Loading - # ============ - X, y = sklearn.datasets.fetch_openml(data_id=40981, return_X_y=True, as_frame=True) - X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split( - X, - y, - random_state=1, - ) - - ############################################################################ - # Build and fit a classifier with include components - # ================================================== - api = TabularClassificationTask( - search_space_updates=get_search_space_updates(), - include_components={'network_backbone': ['MLPBackbone', 'ResNetBackbone'], - 'encoder': ['OneHotEncoder']} - ) - - ############################################################################ - # Search for an ensemble of machine learning algorithms - # ===================================================== - api.search( - X_train=X_train.copy(), - y_train=y_train.copy(), - X_test=X_test.copy(), - y_test=y_test.copy(), - optimize_metric='accuracy', - total_walltime_limit=150, - func_eval_time_limit_secs=30 - ) - - ############################################################################ - # Print the final ensemble performance - # ==================================== - y_pred = api.predict(X_test) - score = api.score(y_pred, y_test) - print(score) - print(api.show_models()) - - # Print statistics from search - print(api.sprint_statistics()) - - ############################################################################ - # Build and fit a classifier with exclude components - # ================================================== - api = TabularClassificationTask( - search_space_updates=get_search_space_updates(), - exclude_components={'network_backbone': ['MLPBackbone'], - 'encoder': ['OneHotEncoder']} - ) - - ############################################################################ - # Search for an ensemble of machine learning algorithms - # ===================================================== - api.search( - X_train=X_train, - y_train=y_train, - X_test=X_test.copy(), - y_test=y_test.copy(), - optimize_metric='accuracy', - total_walltime_limit=150, - func_eval_time_limit_secs=30 - ) - - ############################################################################ - # Print the final ensemble performance - # ==================================== - y_pred = api.predict(X_test) - score = api.score(y_pred, y_test) - print(score) - print(api.show_models()) - - # Print statistics from search - print(api.sprint_statistics()) +############################################################################ +# Data Loading +# ============ +X, y = sklearn.datasets.fetch_openml(data_id=40981, return_X_y=True, as_frame=True) +X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split( + X, + y, + random_state=1, +) + +############################################################################ +# Build and fit a classifier with include components +# ================================================== +api = TabularClassificationTask( + search_space_updates=get_search_space_updates(), + include_components={'network_backbone': ['MLPBackbone', 'ResNetBackbone'], + 'encoder': ['OneHotEncoder']} +) + +############################################################################ +# Search for an ensemble of machine learning algorithms +# ===================================================== +api.search( + X_train=X_train.copy(), + y_train=y_train.copy(), + X_test=X_test.copy(), + y_test=y_test.copy(), + optimize_metric='accuracy', + total_walltime_limit=150, + func_eval_time_limit_secs=30 +) + +############################################################################ +# Print the final ensemble performance +# ==================================== +y_pred = api.predict(X_test) +score = api.score(y_pred, y_test) +print(score) +print(api.show_models()) + +# Print statistics from search +print(api.sprint_statistics()) + +############################################################################ +# Build and fit a classifier with exclude components +# ================================================== +api = TabularClassificationTask( + search_space_updates=get_search_space_updates(), + exclude_components={'network_backbone': ['MLPBackbone'], + 'encoder': ['OneHotEncoder']} +) + +############################################################################ +# Search for an ensemble of machine learning algorithms +# ===================================================== +api.search( + X_train=X_train, + y_train=y_train, + X_test=X_test.copy(), + y_test=y_test.copy(), + optimize_metric='accuracy', + total_walltime_limit=150, + func_eval_time_limit_secs=30 +) + +############################################################################ +# Print the final ensemble performance +# ==================================== +y_pred = api.predict(X_test) +score = api.score(y_pred, y_test) +print(score) +print(api.show_models()) + +# Print statistics from search +print(api.sprint_statistics()) diff --git a/development/_downloads/6e1b08ae2c5784892d9641cc2992248d/example_run_with_portfolio.py b/development/_downloads/6e1b08ae2c5784892d9641cc2992248d/example_run_with_portfolio.py index 01d8bef15..fef230fc5 100644 --- a/development/_downloads/6e1b08ae2c5784892d9641cc2992248d/example_run_with_portfolio.py +++ b/development/_downloads/6e1b08ae2c5784892d9641cc2992248d/example_run_with_portfolio.py @@ -24,50 +24,48 @@ from autoPyTorch.api.tabular_classification import TabularClassificationTask -if __name__ == '__main__': +############################################################################ +# Data Loading +# ============ +X, y = sklearn.datasets.fetch_openml(data_id=40981, return_X_y=True, as_frame=True) +X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split( + X, + y, + random_state=42, +) - ############################################################################ - # Data Loading - # ============ - X, y = sklearn.datasets.fetch_openml(data_id=40981, return_X_y=True, as_frame=True) - X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split( - X, - y, - random_state=42, - ) +############################################################################ +# Build and fit a classifier +# ========================== +api = TabularClassificationTask( + seed=42, +) - ############################################################################ - # Build and fit a classifier - # ========================== - api = TabularClassificationTask( - seed=42, - ) +############################################################################ +# Search for an ensemble of machine learning algorithms +# ===================================================== +api.search( + X_train=X_train, + y_train=y_train, + X_test=X_test.copy(), + y_test=y_test.copy(), + optimize_metric='accuracy', + total_walltime_limit=300, + func_eval_time_limit_secs=50, + # Setting this option to "greedy" + # will make smac run the configurations + # present in 'autoPyTorch/configs/greedy_portfolio.json' + portfolio_selection="greedy" +) - ############################################################################ - # Search for an ensemble of machine learning algorithms - # ===================================================== - api.search( - X_train=X_train, - y_train=y_train, - X_test=X_test.copy(), - y_test=y_test.copy(), - optimize_metric='accuracy', - total_walltime_limit=300, - func_eval_time_limit_secs=50, - # Setting this option to "greedy" - # will make smac run the configurations - # present in 'autoPyTorch/configs/greedy_portfolio.json' - portfolio_selection="greedy" - ) +############################################################################ +# Print the final ensemble performance +# ==================================== +y_pred = api.predict(X_test) +score = api.score(y_pred, y_test) +print(score) +# Print the final ensemble built by AutoPyTorch +print(api.show_models()) - ############################################################################ - # Print the final ensemble performance - # ==================================== - y_pred = api.predict(X_test) - score = api.score(y_pred, y_test) - print(score) - # Print the final ensemble built by AutoPyTorch - print(api.show_models()) - - # Print statistics from search - print(api.sprint_statistics()) +# Print statistics from search +print(api.sprint_statistics()) diff --git a/development/_downloads/87ab5d5bc35882bb85e7300281424079/example_parallel_n_jobs.py b/development/_downloads/87ab5d5bc35882bb85e7300281424079/example_parallel_n_jobs.py index 698f3ad61..d345c6fca 100644 --- a/development/_downloads/87ab5d5bc35882bb85e7300281424079/example_parallel_n_jobs.py +++ b/development/_downloads/87ab5d5bc35882bb85e7300281424079/example_parallel_n_jobs.py @@ -1,10 +1,11 @@ """ -====================== -Tabular Classification -====================== +============================================ +Tabular Classification with n parallel jobs +============================================ The following example shows how to fit a sample classification model parallely on 2 cores with AutoPyTorch + """ import os import tempfile as tmp @@ -60,9 +61,9 @@ ############################################################################ # Print the final ensemble performance # ==================================== - print(api.run_history, api.trajectory) y_pred = api.predict(X_test) score = api.score(y_pred, y_test) print(score) # Print the final ensemble built by AutoPyTorch - print(api.show_models()) + print(api.sprint_statistics()) + diff --git a/development/_downloads/8cd648e2e60261ebda890b9c337a59bb/example_parallel_n_jobs.ipynb b/development/_downloads/8cd648e2e60261ebda890b9c337a59bb/example_parallel_n_jobs.ipynb index ab9914d14..5e8dc507d 100644 --- a/development/_downloads/8cd648e2e60261ebda890b9c337a59bb/example_parallel_n_jobs.ipynb +++ b/development/_downloads/8cd648e2e60261ebda890b9c337a59bb/example_parallel_n_jobs.ipynb @@ -15,7 +15,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n# Tabular Classification\n\nThe following example shows how to fit a sample classification model parallely on 2 cores\nwith AutoPyTorch\n" + "\n# Tabular Classification with n parallel jobs\n\nThe following example shows how to fit a sample classification model parallely on 2 cores\nwith AutoPyTorch\n" ] }, { @@ -26,7 +26,7 @@ }, "outputs": [], "source": [ - "import os\nimport tempfile as tmp\nimport warnings\n\nos.environ['JOBLIB_TEMP_FOLDER'] = tmp.gettempdir()\nos.environ['OMP_NUM_THREADS'] = '1'\nos.environ['OPENBLAS_NUM_THREADS'] = '1'\nos.environ['MKL_NUM_THREADS'] = '1'\n\nwarnings.simplefilter(action='ignore', category=UserWarning)\nwarnings.simplefilter(action='ignore', category=FutureWarning)\n\nimport sklearn.datasets\nimport sklearn.model_selection\n\nfrom autoPyTorch.api.tabular_classification import TabularClassificationTask\n\nif __name__ == '__main__':\n ############################################################################\n # Data Loading\n # ============\n X, y = sklearn.datasets.fetch_openml(data_id=40981, return_X_y=True, as_frame=True)\n X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(\n X,\n y,\n random_state=1,\n )\n\n ############################################################################\n # Build and fit a classifier\n # ==========================\n api = TabularClassificationTask(\n n_jobs=2,\n seed=42,\n )\n\n ############################################################################\n # Search for an ensemble of machine learning algorithms\n # =====================================================\n api.search(\n X_train=X_train,\n y_train=y_train,\n X_test=X_test.copy(),\n y_test=y_test.copy(),\n optimize_metric='accuracy',\n total_walltime_limit=300,\n func_eval_time_limit_secs=50,\n # Each one of the 2 jobs is allocated 3GB\n memory_limit=3072,\n )\n\n ############################################################################\n # Print the final ensemble performance\n # ====================================\n print(api.run_history, api.trajectory)\n y_pred = api.predict(X_test)\n score = api.score(y_pred, y_test)\n print(score)\n # Print the final ensemble built by AutoPyTorch\n print(api.show_models())" + "import os\nimport tempfile as tmp\nimport warnings\n\nos.environ['JOBLIB_TEMP_FOLDER'] = tmp.gettempdir()\nos.environ['OMP_NUM_THREADS'] = '1'\nos.environ['OPENBLAS_NUM_THREADS'] = '1'\nos.environ['MKL_NUM_THREADS'] = '1'\n\nwarnings.simplefilter(action='ignore', category=UserWarning)\nwarnings.simplefilter(action='ignore', category=FutureWarning)\n\nimport sklearn.datasets\nimport sklearn.model_selection\n\nfrom autoPyTorch.api.tabular_classification import TabularClassificationTask\n\nif __name__ == '__main__':\n ############################################################################\n # Data Loading\n # ============\n X, y = sklearn.datasets.fetch_openml(data_id=40981, return_X_y=True, as_frame=True)\n X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(\n X,\n y,\n random_state=1,\n )\n\n ############################################################################\n # Build and fit a classifier\n # ==========================\n api = TabularClassificationTask(\n n_jobs=2,\n seed=42,\n )\n\n ############################################################################\n # Search for an ensemble of machine learning algorithms\n # =====================================================\n api.search(\n X_train=X_train,\n y_train=y_train,\n X_test=X_test.copy(),\n y_test=y_test.copy(),\n optimize_metric='accuracy',\n total_walltime_limit=300,\n func_eval_time_limit_secs=50,\n # Each one of the 2 jobs is allocated 3GB\n memory_limit=3072,\n )\n\n ############################################################################\n # Print the final ensemble performance\n # ====================================\n y_pred = api.predict(X_test)\n score = api.score(y_pred, y_test)\n print(score)\n # Print the final ensemble built by AutoPyTorch\n print(api.sprint_statistics())" ] } ], diff --git a/development/_downloads/a33a692c4a7e96947d47bf5940ec46a7/example_run_with_portfolio.ipynb b/development/_downloads/a33a692c4a7e96947d47bf5940ec46a7/example_run_with_portfolio.ipynb index 6613341fd..4e10c80b4 100644 --- a/development/_downloads/a33a692c4a7e96947d47bf5940ec46a7/example_run_with_portfolio.ipynb +++ b/development/_downloads/a33a692c4a7e96947d47bf5940ec46a7/example_run_with_portfolio.ipynb @@ -26,7 +26,79 @@ }, "outputs": [], "source": [ - "import os\nimport tempfile as tmp\nimport warnings\n\nos.environ['JOBLIB_TEMP_FOLDER'] = tmp.gettempdir()\nos.environ['OMP_NUM_THREADS'] = '1'\nos.environ['OPENBLAS_NUM_THREADS'] = '1'\nos.environ['MKL_NUM_THREADS'] = '1'\n\nwarnings.simplefilter(action='ignore', category=UserWarning)\nwarnings.simplefilter(action='ignore', category=FutureWarning)\n\nimport sklearn.datasets\nimport sklearn.model_selection\n\nfrom autoPyTorch.api.tabular_classification import TabularClassificationTask\n\n\nif __name__ == '__main__':\n\n ############################################################################\n # Data Loading\n # ============\n X, y = sklearn.datasets.fetch_openml(data_id=40981, return_X_y=True, as_frame=True)\n X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(\n X,\n y,\n random_state=42,\n )\n\n ############################################################################\n # Build and fit a classifier\n # ==========================\n api = TabularClassificationTask(\n seed=42,\n )\n\n ############################################################################\n # Search for an ensemble of machine learning algorithms\n # =====================================================\n api.search(\n X_train=X_train,\n y_train=y_train,\n X_test=X_test.copy(),\n y_test=y_test.copy(),\n optimize_metric='accuracy',\n total_walltime_limit=300,\n func_eval_time_limit_secs=50,\n # Setting this option to \"greedy\"\n # will make smac run the configurations\n # present in 'autoPyTorch/configs/greedy_portfolio.json'\n portfolio_selection=\"greedy\"\n )\n\n ############################################################################\n # Print the final ensemble performance\n # ====================================\n y_pred = api.predict(X_test)\n score = api.score(y_pred, y_test)\n print(score)\n # Print the final ensemble built by AutoPyTorch\n print(api.show_models())\n\n # Print statistics from search\n print(api.sprint_statistics())" + "import os\nimport tempfile as tmp\nimport warnings\n\nos.environ['JOBLIB_TEMP_FOLDER'] = tmp.gettempdir()\nos.environ['OMP_NUM_THREADS'] = '1'\nos.environ['OPENBLAS_NUM_THREADS'] = '1'\nos.environ['MKL_NUM_THREADS'] = '1'\n\nwarnings.simplefilter(action='ignore', category=UserWarning)\nwarnings.simplefilter(action='ignore', category=FutureWarning)\n\nimport sklearn.datasets\nimport sklearn.model_selection\n\nfrom autoPyTorch.api.tabular_classification import TabularClassificationTask" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Data Loading\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "X, y = sklearn.datasets.fetch_openml(data_id=40981, return_X_y=True, as_frame=True)\nX_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(\n X,\n y,\n random_state=42,\n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Build and fit a classifier\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "api = TabularClassificationTask(\n seed=42,\n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Search for an ensemble of machine learning algorithms\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "api.search(\n X_train=X_train,\n y_train=y_train,\n X_test=X_test.copy(),\n y_test=y_test.copy(),\n optimize_metric='accuracy',\n total_walltime_limit=300,\n func_eval_time_limit_secs=50,\n # Setting this option to \"greedy\"\n # will make smac run the configurations\n # present in 'autoPyTorch/configs/greedy_portfolio.json'\n portfolio_selection=\"greedy\"\n)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Print the final ensemble performance\n\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "y_pred = api.predict(X_test)\nscore = api.score(y_pred, y_test)\nprint(score)\n# Print the final ensemble built by AutoPyTorch\nprint(api.show_models())\n\n# Print statistics from search\nprint(api.sprint_statistics())" ] } ], diff --git a/development/_downloads/bc82bea3a5dd7bdba60b65220891d9e5/examples_python.zip b/development/_downloads/bc82bea3a5dd7bdba60b65220891d9e5/examples_python.zip index 0539a321662c664e77b4bb8a9c419502dcf065ad..32f0c5113977f972e4d8d6e63c6535b9bd0a5c63 100644 GIT binary patch delta 1282 zcmex;o$={)MxFp~W)=|!5HMQ5k>?mYlf=f&SJ*GHGo@|Vyn_D&hoH^ovS16dhs^b& z3=ANwHM!15eDeW`8s^EuHUYw^X^EvdB?>{Q#fiBEIhlFs3c-^<%BoEkv`OIAMFL!t zFZzc}=CjS2JV7{r^1pbt$#-StY>*U?%H*1S-cWUOjNCa!Q&P2p)o+ehaAs5?M(gCW z+E*w0tIv~lF3K-1Rwzr%$xKNs$;{6~_qG1yh4O)uFW5?f{THdM?n;dDgw%jNI{B6I z7Y{-ziInF8dz}YaHO!0R!6ijNucc+Crl5OH6UB498jAMF29VB%#NQ;1`Q*o+4b$X4 z2`)jIjb*{ni&)ePI2af}SQC^&C!fv|-TYGLF4N{zA#KLVRkrIUzc*yvoGoh3IQg7{ z>EsENltfK_br2MJmJJcWY9qQsn>)EtGZ{G{T^iJ{_Px%WP~6YrRB zwwGGLxY^2|m36YN>Ga9g>Y~z!JXgD^EV#B*dgpQ>1_lr|1Uvmiw(R7%(4U*b!j7>6 zGglH*fp==$l$?-{YljpE%Pu`HkzxkblD&yn=_6T5l_M3dpR%Y_O6bw_Rr3NCI`W9JV z)MUL(E+(V(ldUp?fhEP{{>)HdK{5GRW;h>eIWgHg%S!y>0!oMjLtPC;dzdd!v4&27HzSh>Go%E=2u&0X3SnT= MPh{(|iDiOh0H&U4K>z>% delta 841 zcmah{-%C?b9KYu}yINBxu6d`nu5N0xITbhUAq1hYwAJn2Eql^!vgVzobD1%!hn{>W z1pQPHBt-a7FQT45ARQDHS|)+M1Yr~*JxByS6wU_B`JC^s&*#$$`ME-j zaz~cI%;{@=Y{vLp;M+mp3CjXMF-{*BY~&Qq+!6~~y3*knY z-snC{5VhH`Zm)!?t{4Z*)%1&Pfnan0Bt|`6Iu$h$I#E$Y5OlQZuyKzalDPt(Ys{#u z{O}jxLucz&Jc||6VFN=uXj{!hW=t&Bju&RL>PGzDaD6Vv>E=vVH{$-rBQBR>UOA67 z`8)C8sXv5fMWeIIBEg2o0h6~LN4>2`ddq3bf0E#uP+*YQf-D}yuYet+;$HsNJt{Vz zu;lqLtiHVc<5+JF$MxcpuMHbwF3)=R7DBbo zXTo+85wC<9pAkG`OqJChg)N16UA9184hc_qa6u3ppqEbOutWdwDzpo1x6OB<|rScwUA1Fvw?*h(NZdjy}fEK_u@pB@d;51`Neo>H2hy*YBCl4KAreT_Vzm<#G|rLFck3b>D1!5{%13^xdu!1 zxokpMbA6LGScXy1z`*=mBj!&}l;WeqI|TC=hY9No^YX+30l&@M+JIh*nu61#fijUR zY4C+1;yDKQWW4j(!QkaVuw20{>q~j}Uu6jP2}$E$?m2_2{VHiV1<6KliY&mSGf_3l6ZF z;n8r`EN9!vLGSb;l9|V9Aes^6jnxz$BvpX3Rq(^~40KKtG^g5VC=61{40mrd!dl9R zf@O-p_DvQ(oYVn(i^VVPO%%HApJ65Wmk>r$J--z%N@PMv{^ACKinN9Xm*8N!Pi_-L z(*1IoAeTP>PnY2MTsL1Fd7+GjV_~MfQx3%jz;>Gh@diK>%-$QE20ovf%j{>TX|n7#KiUhhcL4e7(&*o)s)iF?o|qs}v@Gs*alcw(8g93pHtz zeQI(xpRT#hIC*)n`s7o=hLgVsJ54qXQQ7>uE{Jh*mAxQ~0uW4g3{%*w*C5BlBshI@ zZG@Ms5G&9c(fS&Gf1nj0tO>G4Z1ellc*e;)r9C#UF8|K1R#23gSE7+vkf~Qxnirpu zSzMA|RH>r?5-2H3%t}oL@iiyUsb2`RiFb1`&mTsi?rCMg3%_Y!VwYfG0AUlb!INh% zP}saJ!h~`10WX=!Pny?np4zgN1Ia_1-&R#JPPR8L|G=sPn4hhx;k;PS?!$3zbElcW}U1!`EzZ}52JY|4dJRgGKU9~24Y!p1QZjK-_Ms< mz>FkhZ8Aj=g{7jCBNy-}Ue_=G8GvMnKGmdWr!$+kfF@V91#_z zG7m|ag-m;0z3<-NcYOQX$Nppgx!N&laT@cva{)1Fa9Iza7fSLxXpQotHyTb)KOyxTWcE!YfBS;Cv!V{OPk9( z#CM8Iit$@GIM~|DNl0A!zuq8jV|PJ9!Btlj7g=GedfJ|%*o?{lX;KuPSW?u(pGTAr z=w6HY_5G@A{WRb5(bn(g$F?a6t~RL*D85m_qJ8M;=>yu^cIxcZ56DZ&JLzbVds{no zLHm==HcnAL?ktnQ!z+|(HHYn{XBSpYAJzO*VxKY46Q**#V`N}%*1aUY@Jze>aUpMZ zenI^2k$}VqE&HlftF*tEP^!wx%4TNV)N1^`ZXJUsepNo~OT&*}!@`XJfAF$){>0eW zfu5?{b%oq!W#7JilXRKgviLUYiuJc26|Haj0cxteP*O$$}}S@$b}-<9O}w>UZzbb>nWPWCrso1p6>^b$`je z(06u?;LQsh^jmr(b$!O5HcayN)068vpSvf5)y%ZAtdl-(Fp@`0$vu-DPO|VASo~M{7A_ zQn<-i9tvD*Jo%$3MJwS(L%vn(^8?}+9x!MhkfJuzvU76!^i+qK4m89@NgC7cvS|;Z zXI^{vYL=b3jZMhz_G<@S_8Y%h_A%oe-#Pc$E%JYVY>K*nzyE>C@3vg+LZ?fyrX0eW z%J{``T>M#5(q=sa1FpUCkw;xz+9>^7K*q$O^IJ`Z$F_U!rD|9xO7HP>G06G z$^g!$C&&0$cw`vy%ncDjn>R0$j%E=M5Rj`L`Ib+Iah@7#rK1jqY`mRO@|THnDA38h zbLY-z!`_jy%1ZkF{{ED6rSkGi^Y)Aa0cYH|ZQGV()w=S?kt1Z3ZqPFuUA!3Z`SWLM z%MOf(Zi*Jo)2C1A-_Cu@xBv0IaQClYzl=;xZ(jah(A8TTE@zqZy;dcd_ceaj&b@fz zV~X}cxut=4k2hbxuFuQM%goL`IMkA!WnLFyJsl7fq#P-J*2vtP{=$U|u73xg(2JUC zX|WeL{SJ6`BK6I;Z@jGQcUA1}a1A$YyK#4mm>7$@yL*aWmS9?XdQ*<&@ifC?eYugI z9y&h0cx&g7jr;YV)Sa38GBZEXn04`!=&QoQa$F-UEKE!E-c09Bw)Zd0)jxmzTHe;i z6D#NVrmOr`c3*0fMW)NtMH$QHWoy^2wY9ZX%rGpr{X1z%dA@wPd*A;3_O9(%edVpK zyGunYuyAi5zRmL*m(|qNjFL7F&^%?Os7P5`TZhKP#QbhEF858)&%LOX`l&ffVQHQN z-*Y23cc=BGOJtJHl(@QW_tSe!$I6(rn76s&-h*KaO0x1QcrFl zoc`GmyO(+qLi5pGC}hK4->1i)ym|eahEr6x%zFjLLtW9aUtf02%*{PQC?n%>{@wk1 zzprXNYBKut?1aU~lvQG4Vx2#J_^sd&>Ky#=WVS^(ti+U3^$wy&b6X8>Mn|vnWnJ&P ze)nbmefx@3osULI((HGcq$umQoFji}D1l{$Zc``H&g8EycA0t;z`0GU)ZMLUZn%(< zg+;7o$F~x<^-MmrDgOleF||KG#v2{`zP-{vNg~@$zn?9Ue=@!{72} zdc%*sPdmNi*VmWF2HKt+i%&e2VK_QDSux&M*YxlJU47jC^&X3}7fSl(`ybeJ{`?s* z-F}^|E>hxFU?8*5u{bgMZhiW#b+2zOZ_2m7pnUkSNn4Jk9>%}GVep2+;>@NFyIvs? z5k{+)wAThU#Xfy?k&kqe)%-$2s;4_V*!cMP#0>ISn7PE2t*yme-P{nm6YLj0XPHX5 z{dIWt>Xp%#7v@nrF090(Bq_S~)`Y#X?V=SwTaaXb_S&^Q&(D>{*#r*1@nM!Sf4gRn ztgP|ucpvv3TmF)TKL(S(zHo@%W1=L@YS=e#*<#!nw_mPRNLaWBUtIn0z|DtRB9xiy z@Z97e-TL+G$!$ywG^&`HZI*NTB|>klKR7rzIyH3&Q$0325O3O9<|P|3hIuW|G%ly8 zZKs~!bhT*{}5Vy9m$+pyQE;zGPz z#3j`VtgO-D!jU(1bb)t2U)%mbok}Y_Hqj9EyMC#(g5*>`ITC z{CIX=^t1f%crar5tI;FC|Y-zO@nMzJ3_aG*JB>+#2aG491qzuUG@ejy5rdIK|f zIByLhj@>rx^)HLs+uIWl+++~kwd-U>RaF4)+YjrUiAuETDA6hS^ZRQc^25(Fh4upt zyzvL>+S>Gkcy_9}d@uFzFg|}?2oYz?hC+{}lFZy(&e*+IBZBGa=~qyRrq#iM`}d!f zTf`PIwzAsRmUn5Jj*gDQaB`D{L);3_&#$gLauD0T{its0$)ha1dn7yLj%aE&IMuhd zp8ELwY@wFcWaxZ>b{rvg!ZtNcCh}N%P_kP{4a+_z%nX_k;TiY6aV`F2lP5ube zY@3{P2#bh#Z2t>yeACpVT{PSOpgF5_@vl0?e*B5%J12!p(Q*5)3t^d5{Q8pZ*l;XX z?gV0cU`0iRb?Zg!I@PG?Xn(wgDOZ2{hNba333_U*CqzMQ+Rn+T;g9<~f*Gyn9+$}! zb|pV=?`7HvO7v3h^Veb>*f#EC|MTaMTs65d%1_q5zgNE`O@8jz4jM(}Lx;@w4*dN2 zY~sr&cOf@7H^=ruj3{%ohLDhEjK~IcJmSuaAKyD4TUwm6p;5GMFFHLSKlkT%-PoS6 z1Y>6Yb;a)<>@II=T6MO-fhM%+(q61p>#uo7pQxv9{`I|(3;Q3B_epjUSwxXh`(cYX z^~z;R6w9u&vy)5C&R z5u!VG?8veF!0^(hqv2&*L_|dMQgvlz7d|lh=T8;F(JC&kQ=Knj_Fi47t*sp;@8*(s zgh3+Wr6j{j-l+6swFE8I9%?5K>*CyqLei5bk4~hX+;ja;+TF|5!5czr&18d*e2S=T zZ{N7^cd8trI{C6juKsOY_L0ZZqI2-my$(Ov@2YKid@TO?4u6yRnK9(GaQ%5R>2-!4 z3yx%b{QdoP3h;sQFJIPSk1Y$;Zp1bxJ9Knr%ydvCLF?hAuX(agSB~A6**d}`=9^_& z{j=yQ{>_J-76WiEcH+WN3B~(4YFTI(Cs!e(N z=_2NZ71MM;S9i_j_9B0Rd~ls>Gou1GZr)U%bYGgEU_){;va(9G|5jdpP>zkl?Ohw~ z^qQRL)|218dpGaCYwWjHZg_*680~ybHxJyEqLUnO_k2yLfaLDokySgYFuIt^GQU-u znAX%|zY5CAt^=-UbZRIsr{lTJaCM~pldK_YKoi;#d6xMyFyS4E;Qr;#xIUbLth25S(Wy46|+_H9NajljL_7WwH=g*%{Ia`?L zu(4)FBRMI_XnOcNB`yEt`t)$+P)4bE@l}LEigNhfcH*x}z@LFKFFLY^8{9NBG#sh| zBXaKVwE9_;_wwa(3h~`+Z`@S2Q%@CZMP+5e#ZS+^#BGw2lKN`TzK*AXR_M_mAOQg( zA%?Gcm&y^QUc`1_S-brCwSs?o?ZZ2lw=DB)R9NB-T)X{_VPQeR&!E^Bd3lF%LlgBR zXJ6~PcZvj8*U{I@|K-e_oSfCsT@N0lZNK7kFSk!}TUcXnl)=l(3HZOo`-e0bMH((H zE`$nWz*)U~JM)B=!(t-Q8WE=Xc5`CAx)KTtlN?LL$+ldpUeoRqpmD{tY?Co2o*5_yIoQ8jX zN)4^+`=YOH*gHJDl6r;5&1yMOUpG>^6r7VI^Q*ns;7RU4rFa40qt*Q)+9v=r{hxQn zez+j8dugs?NejsP*SGxR0~6yWr!oo)_x>5_2ti1cXgsOtqvVAJW{MD?muI~WY3yFQ zy1Z~(<2O8vL&4vBYFiQ$6JLBP?|gkT3kb5Jy4n;0)YjhqV4>4*hqufWhGu(HCx?jP zZdc>{!or^S2?s~V$3r<;Slb#&@zFx74$L)LJ)kycEqN0Gw zAXHR`?}?tswEiN^D{GgemF|IXz5n{33Y*e}#~=RAjCLKg{_=tzamhP2_H3Lp0VDwD zdIb)adFB_!t-fs2kUdu~AuhfWiQGqA9m|-&(lq^C(XZDdcY0jCdi6}P%ZVpeivSah ztgPEl=9j;DW7}P^BG!R!`AVRJCx`Ytk)~Of?FB>^02InEC6%Q(aupi@soPhgWJXE2 zl+S&J=E{{TKR!GO(fliL(3gMvcEEk>vJ$sB$!nuVu@faFC5Wr#cebe8#cX}>p;?*! z-q(>6mfZWUNg{8cf_h{<(EQ;;{`wW`_T^D`n%au5?_RxnH9VeLpE zcLDbIOtqe?#vVt7**QEMOfX<|mg07Uyk(R|tQ;r4O-p1Ax158>-#@Eh@QBo;LmCp@}1Auo;mlhW&PZUWU+fJr= zW@JcI1#bvc3E60jS`wvzcAmdfzB7q8_5+$M+>#WMGRYJz&(8*;2>7Y-;zx5b^Wk7# zf6NLkA|$DQ9yVEw0*pRVj}&KQWDIS_mgc>^es`5b={zlRdyYkuV22%|xDkN5UXH~o zm#LpVr_Q-?VpEor5(z2u0<)k&j)j+;<4-b{`=srYKXgSS@tJbk(q&uk#d9DM!yb<;QAE3iVhf@^u7 zec>32=WdknGkuZgNd1QLH>F}kUHAN3)1Ojd@;|=5%*f2lWJeX7|9IVgmmJBRJ2^x6 z6xJ#+u3Eo-8&H5qT3VViCZQ6rw<1|R^2K(#@VGefcK5kUxG8=!>F9<#k}FoMFsTY! z_olY?2)-`>lM>J(>KO33ATJ0?`3}0m1b@_)}?a{+R=QJe5Q|~;$P7XvO zWMXD!?&|LsLdF+zM@r_6WU0*%Q)0aG>$6nTBNa9RZjn$AeRzDd63g15d4BT4u|&kF zH}&-zGFB}bzdA}4TFs4s2(zutTP$QuYVT}$^Xb!xs0R-Mu`L4s?SKoKfP(REf1(k9 zyd-z*;8?kGWg?P!cYXAZFXIciBt4a7R(r>FXnQKAUq{B`y&}efNkv6P%Cb4hTD{An z7y*;kGX;3?`RoRHS3Q&rOqeiZV`G7D-@jM>XnIr$bet^n=?ZkuCb zV|~tuw>o>+8!+@&Hui#PSVm!TQtkJ>eBnC%{c0jef`22_))pXi^uFKe?DPI}(<5BZ zzA67bETp_*s+>K{P|jml!d@F$^!afWW#?{g#l*;uBxTgpsFH8Snl~DqUahXC_Gb8d;gy+D z<1)LXS=lM_PMPsVsPU<@P)b# zN{pK~Z!W8?U167hCC^8S67$95mseIM7X==`8xGk{51+*be^eBxEzV7?z3FuNcHz~L zHw_KX%UYl6it_HURcte8*2~%`oh45GWd8dBe{;SR@9yd8>h3oASZ9jsGF*C@fkco% zr-1-WiYLTX5WV@MEx=>GkHzmFgJ9yc^Y5mss8BppO^qb=zkjCx;z3^(UeGE|L&dk6U_~2AfgQJ6P602i~Xwzcy;CH$ESBB z_7UndPRfsx+`4r|TwEMs^qB6-i;6Olcm@^;)T-04j7i>u`a73c%)r7EZW@gCZPz9K3!kE!MIalbk9Vm~`0Cd#8efw;&$p`_0tU!4J zwip5AbMH7GM8!;FgeVy^PsV`6gTd8k3_eI?^!V?oUg$1ty{ zP=Cj;*Lp**KQc*nZ`i9Acwm{Qk0X+#!$|wtfha_3)DJ5ua8rBi`&s%MVz%&NrF(o$7jJ>0Omx|*)$^PR)VI-IXu+j8>HhOb$DBPldAh)Y`5dajtM?)*EZ zm{NJI_E$H&zho$;OlY>QF6$YoOHy?SaSX#f{P#|{hhC5W&M^939NCaHzZl&AB&D@j z!|*LN3Xa6q!QrE9KNzE#nQK6Qgfs$$CHpuZq4oJJlHnR)fVWQbz|5I1UWhu#VkbrQ zjHxYWOL&`buzBd#6V0ySyR|+IrTb(v&an-xZ|OVBf|YLja_Mtmwc63(0lT@q_v3qe zU0qUw%GB3U5fSy0S}q&-_}Bn#2?lX;a-wfgN!IBCq(anC34WmWWRIL+a>DZF zk?$(=!5cD8GE`PV0Ge`nhE4x!nT}7g;ZVFJYZ-%N01qU19rC zr@Wx1qM)YCh5T)lHr4s<*#f#m9UV>c7S~6EzTiGirk-SFwxk6^V7!M!`r+1uMAU|!gJ`QkG1e4M?qxX4o&IUdiB8d1g8 zHnSn?=5n?~><)?|rLFZB9pT%DA05CecMtQ`#4UfoW3Dg1bxOTEY!gL2Xo$6EUBvE7 znderf05$L{B%sfm&0)ko5-hYQ`526%lR<9%Pm^c)`5|Tykw&4eCNRf8cO+oR}LlmXjsv4THNgMYtYiCI6^Z2eS;QxpRXi? z39A#aH4&eK%giSD_QU)g7Sd7N=?cZn2*4$gKrw#3RQJ=VHwZ%LLRKSop5jgPKo%mbJ9y+tlP;7FaA z9v1jrbyQLO*3s(VzO%d-Tv2{981dDV&_0`mZ0mMjrt5Qd;;gt$&NXz3`-NM3q&$Bu zVi8MgU>0ID_A+QS>Qg(PK2?>6jz$zT&{Md_oFVGsr1ff5J3Ve?eIAWxr*1hH7yS1t zmi-&=Wr-Kgmg!8}3^ahy={v(izMKWGh}&;aT(G2Bqr@-e-Lr(dXW{(!#pUKkcX!(; zIWEbYoj;#>xizmSkSutg3QDW7cG6bhN5w#)hhFX_=KOmnWFvj?L8d_RoK7@WlNK!e zg&s)pEbGao9BGDXxfLB<_uXlXqo+P!yDC1=OvX=}j9;6%(c~6NgNc>?js2G}Nxxz4r`c$<&gYko_&^sW|IIC%o}p)Vy)iD=7_L z-nZ$z7#&?#a)FPue&ex>f{sg0{oRdZ0R)p37ac`0(R+@6U8yN@ZymEDUFKNVi~?ri zU^VrgGHX~S9>2D%H~T`u5w#nMcIJ9Am(PfsBQq!7DaY$IxnE!3`@mgRu}Ov8jobmD z0TqmS&HJ&8e40>ws?L(-q0C~)zojfe&)~_RsL!0qORL!Ty-=&YgjHls=J5N3`jKO} zn=K(U4{2(?t$hBg&@-1zp#_ak?Ahp!cs!okMmj}0{vF#&kMRFnbuP1#lnm9DOVt%H z>xIVz^&Wph+0O08T}7_IJ40nxBv}`FhHLsB5Vt&wj+@?68 zbs8BPdw~<`{x}iwG$ut?)ODuomhIK6w|so)0Xws7I^<(zP+5SLltZ0wY-#Dga)TUE zVsiK%shTx&m%X?|bGN{wc<(`>@Oy*BSXU{Ni1V-9=A4!>Fqpi)K@YA{443K}8X}cm zUzB@$k@L)-uQpld-|-Nsqr1YNThfRE92HJpxBD_LID5aN4|a8RR|fw0k}X_tbtD+9 z*u77toKa`6!%jGD_f+x|qxsJwHWUI@d#;y73pukID!}_ppzWeISXlyQ{Do@{ z?bZ-S>cjJMDt~V-4?V3{_UzJE=|TzY|9kS`%DeV zU!MmgxBi z_uf_d{$x-0k{k<_Y5jrWq7Us)omV!-LtW-o{}Vg_NYMROV6=f&TEJUmM5(tAESjy8 zQx*8+rV_X7gEL^WZF_50dHeX77oG=yvIk`c04zP2kY&r46P^liNr!4pIJlf}bafHi zfv74_21{N1DDv^?@#TcB$`XT|Q~@pK#fFX-=FBKS)qePArxsXoiN@^l7ye$@btGhC zvQvE8Mc3@LC$A278ZRySS#>7=qZPcj2=$P zVZ_A6#jzkRB*-g5kRtR20J72FB1Z{{tVr=q!xcwfwK^O!P$;GCc#`t*$`!x+a~r9L z?~?o_9qmN#&8^AXXm~y?P$MmnCGFOK|E^4DzQh(M^3>Z$5bfrAdsMKw@c`x~o! z%+3D;!472X$jVtp)ij?lA6Jiem1cQwVPyDnW!jmu>I?3N(n}*({V$aZ0b6^Enne-Qk&|Iju=oh{F0LFsA!c^Po}?rd~`j?F($ALs1aDGvW^bEhK2^hR#4D7 zSy1jD%s&6lcBFm3*qK-CU`_Gco$+s_9tz&9JR-5}CL?u=W!;U>pY;f54DOzWRK389uc6UU>>D<)=I_gv+JRA>=zmuZz-Me~ zN~fTp07Z8Ngxb(%ESrC_D!3Kxr#f38e6a^|Nwn0R@2W5MR4=8M?0Z9>62JfEx0baL zP?P^Ikl_DooifEpft5r>Tr+k?Rn@P-%Erb9A*MgN11L@kH*!bR@M-gNx)kjQcjkwA zbFBrBxXfI*SvZjJ#s(L-6-B>FdHSma(;7|x8@nI`W06!T&u6#T!kqe;_`_d6wja4wtLogb+OmhYVFbWI&?7P ze}4HSL%8A#r=_>O^Lj|r#q~3h?bO{$?y}9|OG-$?GWY_@d20xbZhJmmpTZIaaEj!j zJ4}l3zW`S>HEr}_-Xdf3x!+4qZZ}XeHa*@wi{}q>H>NBoAQdG>#bnX3`Q$N=|3Dii z7K+s~kDgs*_KN4vip`sS;u*>alB>}p*+++&U(KD@XuOugQ;q(^{hh`q>(Z4cgpfHG zDoAEDdr|+pQ|%SK)`eNF=(PXwisIcWeNS)(cC%b~?;~VUMGHE`qx!YE)Z?@HHzrj= z__K4oPdsSZ5<%ka;BE|!lDH#Ho7;8ELRoy$WmbxkVNY(N7ehiHK4anx3>&s+ zN?Gvdge%HySwlTma0|FQF@U_>{*TBABB?R#3$32CDHXoBxSpN1ABKq>m#NjY;aEj1 zba+`nqRZT9^}+w3%q$aJENN}o>ZoOc%^$+JVGzq4`)7+Xv&LZi)tegy@KKLr6xfcQ z;qCqNCljmq^DOQ;%oroeZ`R*f=&5eR^6=xr*Q`xuLPC`dA>@0Q$@lEumTzv9^tRAsED{Y$)|c*pZhQb zg5_lN?tbJ}d^#5ysDQa#2ObHdwVm$xB&8J|;hPjLOk=x1;EZV%-da;1P`c7+{ONJ_ zty?9pICwkXWY}^-2Cqs>Vy=~s1kv1$@EH8IP8t*TmaJuhk-bEQxfKPLtq$2pU-l0; zR{=M9g;r5(v*@+fangVKUKkpE|4o70+#N9<-0(VX+(Y6kAm2idbp4mU-`WZ){>R10 z##ocZ998InMI5%4jKyslu{Y9^KfRZ2j+dqLtSiL}tLPMOYR5=<9;rS?4Gv1$JNiVY zS{>oKO~#Lfd}iBWs%H2c?)+`Qe{bdmvz~>_=?IVi_}1_^zGw88XWDM}d>Xka!F~Q; zF$1ca=g=m6ijEB2np|eRuM1YcKON9lBS1L_u$V4^wVmlJecJEE+~NA~3iwx%n@60v zI?aW>72$FEcrn*OBU$HlMa44Mi{z>&?udsUI9@DA@o$k`C+)nLb^Y&$C#v|i6vGWd zzxVR*+?i{^rmYsB!zQt<<&aRzA>TXCmis8taBy%8FCA5uSLt1!!*o+c(=?R!)!{WidMqikm zHNzi~S{E=LN=OFARmS|vlQI9rc|>R5cWsmc7p0edo)zYja8vzzYCfQnO-Ma`b!6ku z){GEvm>38<_dV}CF1#a6iuA=g&i62ZBcn6q@z`=%(f3lEK z)zI+1eVetH-lCRHdXYP6zYV=)#%T`e@c9n8z6EXzjiU)Ex+@-^c(!K2SnY`R&o1-I ze~3nF^%TFir_NL2TY*5O_44xBN6(M{tD`$naIZqm4*`oP#Co|GIYD1u`Q5ftH(h_H z!C&Wz{w{KZ;JM$!VuQ@bN5{ZYMo&J~dEMx{-5o}FK4LP`jF-O+u9axh;C{C| zMMDyUR}JDmEM3X=nva?kpXx%+O|(5%Wk*lZfJv!2dUQfVRECFtC%uyRE$3vlPy@X+ zU0c;og$;FW0Z)TJS~^okmX<4yA3qL7QbETZrRv!40+ULnAU=hSKsN{Q?O9I0_4Q7l z?yBbVsFzv*S3cT)edKjxBO9KqD(Of#NTOR{^3*MfY0rJ(Z^E&7c?fgm@ShOvAV$vd znR1{NY@XD*LC&EJIsDd8YsMqPVi$rCgJInQci5{R z0WC7g{Iu^Dd3jTfSheIEYRSzmhf8s(58aO4#%GZ z=HXvID>4dvKOVm(ccbCq|KO}Gr`Z4>lo(M~h^z^?BVric>|RszlZ> z5nGU95%;FUK{dHz;CL$k!Bqv@PQ|>-hS*#%&9K5epw<7vL0w5n>G||q|8>+l&x)CA zey$Am4=O7UFz}y9@DwsE74j%b$(#xehrmW;q8XR~?T${=3db8k=$e@uDGhWhZN3v4 z>It_)0xUnT><3o<`u#gF<`e`CQd4N$mwCEOJtb9UC}*=gm&DCGDa)~=QDE?bM}`M# zi`KL8E3hk!i{CIb+HWR$@odo^*$>=q%kwhETK9YmkT zO+5s2g(y@8Nv{jL5x@0C!7pi#4I)w;91=o&WJJ*4yLWGF4q_65hd6A0FLDnv2|%%? z3=F<19o?fX@477EWO-GaT;t`l2|5R6=hfS*5=0-qZyb(KY&ocjk_CF>i(7}`>U}L+Lo9me85wqr=QbHNl&wIF?20vdP zDZX{J-T8?!hC+eMH*NC}!OyV0U^cT41k(T^?YTC}505R)2iGcv()#}_hB23RNu9Nm z@>H5mGSeC+`i=6gDfaUawNp-}>j$?I0S|SF>d~W>;ljsANP>sxA<7z^`vi>I_t(FM zL`Op%y)W|`19ualt)GXw|KI^UWWl_rqwn88KSw?LbP*$5(>HG2W0Uh;7Hc@doW;nn zHCb5b{N|T0ZhX`A=;#(~J-9Nbb>LpepOBQ2+qdr2n(2Ij1c1T8x9a|KJ!idBVugfz zocg9H@!G~ir@@IQzbH~Wvg8i5!&{ol;-3&%nnaX~TyZ@Q2FVo__4O>6LuK%z4jPD_ zd-iYx^EOWC|KG5Dl6`G$?Uxc=P9`725ZOEWG~??UpR_P|=H(qK2s!-db#t=1HneR$ zef>8dK5!6E07XHR0B6Lwa^+!wd&Dvy)aRWjQJSX)8sk-nW!1`x8S4Tx?P@p^BO3Vj zIH+&hRQfKLOz)3X!rwlK4YV->AJkxZdLY!s%DG0-ixF zZy@J9M2VOA^5rc!WgFu5r-pM;L}8YW)^I7d?NTBdq}mfm$z8Yj5}}pCNu+|pCldt7 z;C$?Wl^((Z2aHQz_wI3m&9L9lIF~4VEY9e2rZI|dU;OKR8Os|GMt>$XS;)*liX<8l z$oNN4!S#x+WjQRuELsUql@=-*nCgg)i;)8a-Bi%j`Z%(ZWIm?lx1E+tG&$9aYlNSq-_EjvAewZjIi&dhJ?YjCVJ(E{S(dsi!0? zWO(ZD?^IX&00$h%MglC81prA(H=N#iv-YWpv-_1A|j=0XP8KKb(#GmH*Er^}!>t9bkR z3i9(SK4F0~(>pSf3vALYdAGkt@Vesps@K~Td1YT{d;`t_>szidA|@uNGLXv@_X0~u zC0ie4mGd8fxf7pfd>aKz<`dy@WLZ`23suTgXm@Q!T0C*8+&G?(k#sui>0QYluJIq?(?9j7ofq$OD;xs4)s2 z8?jGBCl%%~PDBsFRG5Hiqonn}l+1K9!$!W2IAstOk|$zOop`}nnE)AQ&y{X(nU>>l z2*K-eOFz8|@^$hgIGr~zWhafu3MQ`J!cqa|K>6MMoj%dg(P(qHy~lYx$)VxvSA&1{ z+6}8$3qt?&&d<+JIg|f_+%>RloTmHO*ch=;Ct~jb(<#9!YfuE?UvT^O^fL2+z(5X4 z8OSfse(Tn)P`GuVBC1y3Y1Vz?_=nGYG5qdh&~nL-A2UH={%3~hLE7g8l;Z$1w3e!X znj@=l6#yJ5aO z43H$CTy^0phC}Bpet8-Uo71xiYxtV)jz>!x-$2E%8Vql<6ymuQx;_STQ&UrkYcKBw ze1gYeW;{aL9rESl@mO$Pb%T|O45nd+Z#Y%6fNSU@3?~Q=dcsGsRx8m<;lr*3OYaJ* z8>=m{;arL9X^Q>S^D|+?>FI$th=c0dKiMAX(fgZSriZr|F9L-7 zJb3Ux_1Lk-X~Wst!MU1Hk$Y-cR;}U*x}tT3B7Ff~;|K34(RT1piCt;96NSQ;(h&B zM5Quhei&1lr6eRsgg#T~bW}9{$&)7yn}ZO$;rm<#LyS*qs#VE!(~B1`?)=o6n4_UlzV`;y=Tf z-ptP4K@7J5gX^c1xdlb{GjLEPEMiAF{pR0up~P4*wjwh(d;7=E%YENH5;Xm8S?2x( z6({x8SzuZ7vvvU6SvR#2C_lS8;OEl}T?7 zuQf71Pka0DO@|%yY4sXRoYeiOtq*sFm48%b;K=@E6Dzcn(=LVPIK7x?+kunbijNVj z2^?~8kSQuI&W>$m@SJ^mDq|y(+%2M=0|GHJF}?Amp?jZrh#7n<>1BIwA%pgmTX5?5 z*ZrSUnkY%B#J#-JG(c4!V_oaq;_xIxKXdveLtGLl8pFeWY)k( z2+MY4b1V`J!gMp=63`C`Xgos~&Yyq0CEct>d5QFpY!E8T*X_7FJK;VPd1MhmflX_aJgzE(eYTRYyI`>unon|m7Mu2 z2J?F3m*EY(yfHociTVH+<(N&vq&p0?u%d;bW}*aED0B93#UHY#tG-T|F#AOG&w9G$ z=Q@VnP~d-L86WJwzKie% z@QeWpkxs1{APBqP?Gh{?C5jMNficUG@(JultDJair)g8-A;R|mOU`I0#0V;DX=%k3 zzP7l{Ek%pQGUSmpu+ezK`q_i4RiSapG2$FrrbswKh|Ib=VkoAUNw{{M&`#71NLeUG zmqR1jntS>Oe7G}+f`s=#wMBR*7;r-Ml@R6viLgh|5^f6a{1>@;NZkS`i13awtao{0i>!Gv zZpcE=G5IJ8N&6t$V@PERTtd(-thwKLtKNDw2}e$!c0j=I@GWw;ZII?%{T$MX}ovE{KA5EhT(pejr+I(sUr0E z-`{m9V3SI4Co&*#mM^jr`t9@thuTk{K5dNWB*u4Gr%59t?s4G0J67ooDlni3Z@6O0 z(7XshBJti{AMc0Xb_Qm__XUntr0EjLwmkBj`_u5}7^M`0m*PbCgq^wb)2Va!A`EFf zu~L+v!CmR8A{NPns&AZCVVhJQo=hEshbPYFX?~m?CSEuovE5`dRJd>+gU~f+K&@^+oCyXh5T$U$J4JJfaAzW)zCZ1 z^TB_(#$w&t-zM!)G!J6)Wg+*9oh{H6K8kTCS0GsRQd`ae+{GCD&aW#rXYcF)AxLcC z=$y?Pfa~IjbeMtt>b`9d_0X^67Z_M~MK~0>`{T0{+YGK6Xcx+#kdjjM7+)rI;#t|G z&!NmiE^;~c0#-}28NO&N2q0H{rwE9 z=2wM1M-4BCu2}>EAN|l6zZ8+6k@!~MU(Q^%nz!?GrZbL?6?kkVK6EUQ@SbBZ4b~N2 zlSpqbzFywYuo6MY6a8SC#S*7qBozgodInS#Ovqhy2+DCly;q|%pjiEKHhyO2p!a5f zzuDrYN4E2rwCD|g4q+1zSh8_-HnME#Bs3fO2bE*>hrosv+vk-NQ0Nq2f(AHEXD%PTxm)-ItR z(1Z&>L7IbOr> zHf5YsfYtjUSRXm(izw5WfnI!I_8{Ckpw_;eNax+y02Gj z&7{!}yGG;~m`&sx-3-GGqzf5+G02Bt-X83t|1YJ&0>C*N(SvOCqcww%cf$qK`9OK7&|b^Q79HJidbe{8AithAwXA15(30)dmJXFy1b0x1IbNr9&O z!rXK<0BmwAu0HeQQAp>=2pfnkQm;~;02PGECh`Zdc_5HrXT=tg4k3afaieGwV`5<8 zrYJ(rB>$~>29GvMG53-w2&c}blwO24b@#|Rg=f9>OAxLGK+lW+v?V9PSY%b=0)_ApGJ?7C*?)In{H*zF{~Wy>KT z(tx{n@7CY6^j8wg+%^}VQ$ee6{NlxDr1Gr};cJzZ$Jq)})}JMbd!9xSypF2eOB4Y# ziY_M&3=Fa$%J5ErHch)Wl>QP8L#U#O*@Cc@0+DseLub#Ptpvj)a26B3iSnDB7*MZ< zEn0x`1BHWH9z%$(STGlN`+XWg{5gR~m7y|jt9 z*?;I?0S({*b+K*&AZ#ssD4aaE4-4PU6Q}%$Gqz)HAQ?h{3D^-OMgcSf3sHW^y!}y5 zpehqVnkzlk?Z4KJ@)_Xi=m5a=LIpgoNv((miD(U-jTp*ql;;4cbJq~9sfIz^Qi29@ zm(F5Z)gfmbky}Jj&WzIvTt_Beyl=UwpDylXDC^F*jy+jtD>1|m4Sdx5k3oO@@7yJ^ z&$Oy?#2bRz5ywu@fiiAx1Sgq%`2Z#N-5y2Ha%!K;BqPNRQ4jbc0gM;vn|FA=7wQw@ zFB|&DvG)_OQOH>h5a*x>+SPXu&&d0K6?4w?G73YC{jBfu9TE^Z-vNuD_D>AVEUz4g z)}oszbs~n(V?ImMnfVdFbMVIfM2jY_mB*T~0m$=f1`YK=U`5H=3xPP&LVqWsVJBuq zhuH{JB6J6oIQB*IAjlAa?&wPjB5`3wnWCNOhphfUNSCO=7-xnKE3tS3dzrA%| z_3iby5UT`1q^TvZCUa?NDI}PfxMS-GEjQ=!ZJot)>mGa;-dxtulBf0HJM(P@)KBsr zTL@|>+||2w?QF+O&(-k~+dxEaguQ1dW(OKsX`|C^1~Ko)JoxgZa9o|5LleHj9Ri8qW9a?Pa6>UrK=9gwUIXQGmt-zwMA}zvh5@0PU zPpof;IJo*r%}(f7wEGh^oWN%z6BAmLQ?dIdI8b;2E~$qLgL}I&(6C|96CPtJXQ56qNf0PX7481i`QX*4o5 zIBLZE`>(+A_j&k`pE&b=yib^AxD7iU@n!gF2-PwEiF;WiVtq;7b(RZ(sXj)QW5@Y= z$g&5}$+wD&>(=}CS|ojb`n0og=(vs!IU>OXS)4fC7Z;|_dEdH4PGF#<&->=#*c8-n z*T51Acq^i`M^GO_f7;sAUymO@zBc#!B_XQIU~#~^ELxw(u3;}h^UEQKETT|8i9V2& zoZJPj{@UNkt+aG>6Gf-cgFpLw3E1`eY+gW;N+b<(@&gLU`gnzNPfmP%_l}jY-%thqHUA-PkV1I$ zN7E)!I^iaXv%z=eh5(S(WC=o?Q3fYRP6I&~HK&)C*XQgDY*3T4AkSkdh;>XSqMY;# z4z2>pLkbAe*!PdrypO|h9wM8;2V0FaNe&G`Y1U1+vSv_ynoOMs4<4K-hB1kgrJCZ2 zN~4J{@{aUqLX&3*NwX+A)?lIi_>{^;y27`+-QhxiE^df;?FjDOTZ`kVI;o--#>Mnr}1FSJcm5El|8}L`;*>uEN{YCKX0!UK<LSg;uk1$K z(ar;aVGmJ=%|@6)(;?@x5Xeb(EvhRtKE6MK71CjZMHIEqS(-=2!V|QLdfl+@^E2y6 zMkiDF`}b`)6$z88W7SC}2x;jx9u*B;A7|eXgWC5%QKIaTlUP$-3?(;AAJt z(bqr;O$b+{+x`C8^b>G_IQ)1|14gu_C0!GYi7g&6B}=jUYdivo{}T+HQ(>`5G*bX5)Gy6CZv+iJf|+RuQ9hGBd(a^=4djh_4I zG4o?y#ZSAcH(u}9ZyXu6v;9zDK_cLVQo>siTAQ*=ab$_!L!zqT zw2%KbEDkM5fW#w(KT1Hbt&qnyZ&YwU(>V^gU=zqh5FDf^0zt(l;O!ufmi8SN8oWWa zlOwD0E*YR2RUKHG9pIb%{gnux-Z&hJSO!QiM0_T_*wjNv!SEk&?{{%1={usXUjAPu zh};f{X_P#X4Y$0_(gt%qmfRt-v!D_~I@thzadRvm49M8c7=Qdpa&gaM))NZvLhVoq zeS#M18>)^@2xYIFCxnRLed*F|;%-1C*}PK%y(}YPQ#fUfRq-(U4j_0?G|a#%1nr&7 zFia0`MHU{##g4T4dVBYNrpLiYtH?PlbAgQQlL5f7IUM_U_<}N=Ee0b8sfWkF=XE13QPMYj78mBqacBj31^8hU zC}qHT=|W>%0*DBU_99Z+-bRk^f*g~7xh}#W8fTK&{`|O=I5*JNUj|M{B9;w422e(s zm%i>g^U9V6#Jn77ya(4xQI9pEZ@^?mtWku%hf@z+6&?C2NjC;%3#f*>{;^CUKN^&- z)3487xYtf>P|}$Jo?;9}ioqlUs58XZ2uxFsOx1kpoX4w*u*( ze?C3;AG!c65+iY_fY`1^E4}2^;WL1TJW7nqmM!abDgLt&A0TTDUA#B3!0Boj1Bm$m zXW-G}U^c=^67OCYa0f$ZQ!JQmBT_8AeFO;oW%vrvA6iSuS%Ab(M=0X?(Q>w#nVt~G z=Dw-fw;^Z5t4V!K&Orb#J%jRE5}l5Nu2?YeX82;cq8El^kJB%1oFu>uQydkA?mKs1k)wLeU;gB+`Mx{Pk`MD&_86B9lOP_Z&7k=CNZ!MO%w z7(ynLa;s1<$0}SKeMs@UFHD_+qF9OQnVur_0t#o)=V561c%m5xO_P(V05vhbz4YbF zm!qSj=u9{)w+lQHoJV+TH%ggROg>8A3a=g;C;+hY2M%Ns@Wzhz*L!7a96Za1Zhwj$ zy8OGBIG7+TDoO;}P$kY5NH$eV*1@r7{=iAP!i_lU;{XxOz1g8>tU^FB0bh&?`^JqM z-oUeY^Q7EI#hBbmRTMc-B$4tbbiAdlz%dn&H`Gu*=l?`lZ}&_phc=C+cMv7fC=?)5f(Rq^ zG@)obn<&8c#}P)WJcCY3W2?tzog-AdVMDw^2)3hoPcxpJ7s+OV093sB=$PaiBW#*flW&GRu^<>;Pp;$K=cJRnwWX|dusF$#|NWuBnJ!x zH}Tj%k}iEO$emomK{HC=n6i_%`lXHd=T$yC5-ucHt#kbND)1Z^Wv$5Vis_DQT-=N;Ke=D$aOb5`gGm}G#m+#o+#{pQnaA_1jlyw zrzH3XQ1yz)2X^(@s3-}!OZ+v|%;1xF93Uu~+kDZ|n_n~OE+9u!7bRm zIaJ!r(!@Wr%NPPIj_2`APrnq+!uV1qt6rhW9=zdu4fg^s9GOe#$UKCa$h6kKBKq@M7BpR`G zp`(seje%}UFG8pGH!nU61 zZhk)D1z^UGn`OvV-46_V{t53@Fw~;rzzU$rF57>}aiemr&ZJ-)i9_7_XSH5&8aWQU zVz)eoQ~R0`G?Y6z4W}A*j2ZsClGSwxs5hEZd$hiQDMf){kp4}0*c%*M1hLFG1#50z zJ3H6C2IM!1oq$f`pgQ#|0^-=f?w<~d$#b@+nJlV;DjnMjAh1Q7e_3sov9+-w;UfZ_ zruG!{3!tXq7EjUT4p1?c)9mi=>hzBK&YvsH^k$ zYWG;#5d3o2?E^{2lF@FdwF3&ShPlt^qPhsQ0BcaAWZ$k7PQBJpCT+!$P8dN$18E$K z4+*neU0X~74P&d3>HvI=bgfIUJZ1-KL!UHWtLE=Y6%ZKNFdtO&*F)U!BnYowa zHFGq?Ao8K#B)@MjH$m-w1QZ0q4@1Ehw#Hi^RpIeu&7+98BGoM-jc~emq`G-{RJi4S zh?3r5@Y8g_8X0{ta#lfLjVWdg;axBhT$>g$4Z&g>l$nGklz?H<_Z4`H%=T#)jxvr@ z<{TRxoQsq87%H*Gd@nv+F8M}zMH$^SYv#cwhs}*r^vInG+;kFSf-MKoC_8k6uaMIM zOpxW+DtICSS?00q`#A z1%dHT!`ny3Ix+Qw0nq3&B7xOVLEJ=*O&P&pMV|}T-pk9Q8$c{N%Ki)6DqevW2gzeg zvH)VS5C8nKoOpa-BMWL|?4VZ#XF|IIA!DGDvcTXcsE`E{ibuqhh5?#*hc)s8A*PfJ zh#LRj5bvoYSl(HX)qq3#Pswx4U3L0yCIToI-BEnVyNhcKr1{M}-BF2-fmPS}|xa1dBa;n&V zu!u0obNQ-_e1az?Je}yEHgF))hO<<}BH{wS7=KbvQ%V896 zitso5EtLwdH$8LnYw7nM4k0~85otms^d>n4o&C30><5rSu^MovBJ45%B~Ff(m#HN- z^a z`bwnTNTbpjcW{Fp8JK*ur4OOE&?Hluo64TXnTU5RLCxt^17Kz{w}5C7s=I33l^h)G zh$xzEWTdQDLd7j@fkarL;iELanggeBc<1hEItfWsGBy{a+F9j_ROSu+XWc}pygD6C({cQ@4dgAdxl+G8JB*&^R@1zt8q+)CJxiV3T}I|I>3IU;LN3ugqESKk z)Nl$#CTx}uMA}WyjvCPyxG}bVL#?rDPw8GLIXnrm=~3FzFx6T!of;I_dzFfU8 zMQB0SUFlI^1HUmO9R^D#n>j6TY{dx7FUTU;FRfJZ);nc44nQ zi2nD%JvG`-|1q_vM%5W;CPI!-T$#o<4JOan^u=GKxTM4Zh$@{lbY}sWen6jGXBCv1 z_>BUlu&h?q_v1Va2n{v7Sz$ACf$8OIABMu-FEKUoep!qoDXgfdNc4H$-Mb%$BUY~- zaM1AUD_aP@Hcv&Qy|~rSTqjt?t3=a$sr0NTS4viAm`g5Lz$vu6n_6{(_KeFx7+V6=yc^CBn;t{hI$DygWBl+!n}69L?c3vfuvc zff4WK$skZ`mTgwWk$ARbZ*=q-nW>sn<9N+xK*+0htKydO(xoH;brHU4H0|4x-ud5n z#1?1<-OgCLv%xvcbshR167tW?{n~tx?c1E)U)N}TpJP1`4J4E@s8iNN>@wsKnL7Sd zb^ZL*ubO8B0Vm$&Ul<+?mzhO|87D%A-o%b#3-M^Od5iv=d?8SALf^=acZs$vG;7ad zzN0OBNP174B7PMPd-ez*m2=lqe1ltum|J^Bezkn$+&qW82B$IDHeRoS6-Auh-U>wf41ZJC-!W^5!*)bA()Y;2JK3 zUc|I3=-YPYRsbYJB#}t?b{8}vn2r9=J{-!<@oN9%oaf=?)d6XNwDU_-6jlnETA5{R z)Hih+aDNs5+IgiysuvS}FFG!SKao?A0mVW22#C4mMdR`ifbQw2sH1p|5M=Zn$+=e6 zZ4&>LeO_<-yo2KNPV++{3HG(TpzCxc1HAKHcJozG}N@Asu z0fA0+3Qt54Ui0KMG6xeDpQ)`iuROneGLGhBU;@B~XF;8Y<3@X7GvEibC2CK-a$t;I zSJ$NJo*XG0wD^`JQpl7;7<_kjc6VFP<^QO1{u7P(#j1W)MHY)Qxh_32)qp+m-p@4_ zv-Y!1t@iNI?@9h}zbs(bA_)$DP-epphaxV6V0~j}SD<&o2qqZVeRPF2` z(zJNA8G*Z{zK*u5gg5R3`b0}u zH_(G1&N0VBzpfp4nwpf+xy1epdG{w10sJ>S)BC{+A(@4EfO>!7g|K^V!}oao{qYDe zp=xkh1izw+gm5Cj`2L@WpGSBGX?W2K0F%;W7!dB4cE=E?=(#@&0Eq-eG+>7kgIe;; z{?gZQry#*S1e&Nsx{+`0D4_E7>>I|`OG*j20>(8*ICoLW?L*%N%9*Ivg`;>g(4g*A z@#Wc`FnYfJhC~BXbyPlpr57O|;Dpm7^30i=s=fxiDpFEfBA7WOf+A$cUo-$#jpBpFG(Th!=407M->bn05yEhyod3MhO9U>5;!9WH$SQxjM! z+Mr^zMAUggI7>w;1+hX`p2@BO=xw$l;9?kSdGX?xP@q2Hx1gjzj7F_NBn{|mk|v`h zJqfy*l4wXP3D}Yy(kJYWkMN9vjgU_cn>8Vnu&lJ;DS&rAlIGNXU0zG?&JZ+m)py;t zQKAl`y#K0quj*M$vLH$p#4e$KeSUMDpItZsd_o*@Lx6Bh0G?UvW(CT(g%%nl-oD-z zU2+lO-_#7Bqe>bwYl39Sx&+0y+Rx(QpFckUHvG{Nsz9w$dV0DJXB)Gxzil1CspyN2 z>O|g@)diM}EsQ2nps8@cYN0M|A5vZM;P7u~<^>Q7l8F&lg~f%`{33wskOdLb2*!3n z(?XQ6xcp@&Z8shj8lLXQz#cIe4xR z_&-G*FZJb017sXFFP86amh;|-Wh!QK#t>L9rzXLmDhIvqqd{XY>i zPnK@t*VMk_yoa`wvp#c+LRGFSRyCX|3-HpAe;pYi4zN$m)I6-7oRUI%SZtjr)7coh z&D3|{`y0l{X@l;jR8@@wb@CH#2U_3=xOMwr>k|MlIDnuEs(GFNwYa@@hYE4ZvzG4( zL%&Ul+Rq0mat~RDd3%nZI}6ry?HJi6K@riCF=Or?>~)~#43*588gCyTb_TN*PT>d? z0qnv86L9OLp|*6i!LG);LSX!BZerPVrczByI}8FnRd8z{AJK*#9(v)l;Yn`IPQd_qdRA-i`WHP7{3eF&NM-o#8$rfHfKC#onjE-Uj@{(y)DgBK zNbVG|^}x(E8#tNS)(rX0K+ee)Kk{l$r&me8rEw1aseOj<>AS?bzA=IVi~JdO;J|h>S!TC7xolSCkrqD zN%|n!s!$pYoxQWdG20>hp25FI$V4*u%qmc4Yw3laf%gtu&k^X3wszE{ku2~ndTxhi zO;^?IRaYR}aBz^MsMcPvd2EHtd!e4Jmb;^*rc%~;xX53 zm%KA5p{S_%RK4FF!NkD#T5!h2o*D%cujWExdB{gxBEDQBEd)$0v>-*Y1j||DlK32VI*V6hN z3k-@u*kldlqX2S}ON2h{GepFYVUPh91rI;7<4vwSpxSY!3_u!jR)KY4*H8ozpWXA| zrvR*nPjIJ$v2S*!is00z69<I>c@ErLv>#eXrXfn7$w(y_|$$)W>ntU6|tfM*~CToL7^th5g!PA5Cwy!0cV52DLa9N zI!(T*eCMPqdHoWGz4^pv1W8GvsS^@8_vqQLmo?9ZFkB0fmU6_A@5sjB-A`>&K;Mlu0%k4T=g;MJs}Xucxkrti?+a7M5=~vU zO5b5&+`vWei4vGa7KT5F7mwHE>Luo#P8A(T=0F=KF{$Dvh7$u3qk@L6Eq_7060%c% zM;(=Bh#eI?cy2^+R#ISz*%6lRugya2WS})cI#7D?HU^tR2!fSl0K}s_Nx>>s^Syl) zN#g)|0e&p&eA#FzXR}=|Wk0-737qu>o?Oik^bj|2mRj$t)$=0MV>}?kN zXj=;@Wk#kaR1eoz=WPp&_4ke(9?DMreO*(8L;~J@+RA9v$J>TpIIhC;yTd}}Y~;nz zlcA5k+5G56v#^o=+zI2)mye_ofiPFkGJCRBtfB$xWeQm!u~h*n$5lJ{$fhSrpLlsl0K*C_KFGVh_67J z*E{=8(`4^I=sRd^S7dt!{*e=>E%oH6fLC~Rn%{8QC^LQ4$k)|(G4>BLgm3^L4`NHM zCwhd(6jlL!!DF-9+A(dS7%j>Pv>$Y6 z0+o>a1LoFpy*Hz8Zdk88S5|4DvKP-RGDdqs0O@;h`k;83sj};pAS$Y0xRegl#D^C& zeuo%zU{f@z1|9+)Fe>Avt269n``p~L(MS>_k7hCn@Dud43gbVjE%TlT+t#(%o*ZT< z3c18Z9boHAF_&?}c~qIOa+8`=Y(@2b-vbv=G(L3&)Pm63B#%nmA3*SD?I4t#O?24k zw|cToS;Zsjd331`Jw-qxY`zv;7ytua8{|lc=XB7yTi>J(L&{9 zHi*67^w=;*EXTG;CuLds@Y1&DEDHpNA}X{_LVRk=kS5Q!TF55efBqbXvMB{!Wlb+M zdGCSWP?NC#PZVP`EQQJ<@VFGr1Lp-Clxd9dY;i6wt`=}RYe1-xR|{pI19UQ~F-}0E zEOU04=6*o?hm4txYt%-&}BU%=bO-{Im+ir%UF%9E#S} zlfz&uV6ba!Y(yaxL#A@84&pvT9Z-Kz9Ray6^BZwS@t}95!ZM{g5&NoTwj&QiqF)+8 zbdl{HM3es%BxRL8`Sjnx;K}FWV;ZMSK6Y$;NI==Su9o`Mh3pwcMVC3MAKzbdqW&?r zkUtyd{Pli6cJGMSiH}yoVM9wIe``Z@-W=Ip`M*hZqD>nWvs%43C?P!OyqIF}`q1vZ zK6O4mUbut9vbM`^*?5$zQHjNjv9w>uJ#LCjed$wMK9XW_=38Q&<4ApDrD9jzt5s9; z?2)S(d@UU0@Q4a?s8ey_02CPB0I0wG9OPHkn$NA#Y2ekh+m@-A0)#oZxuOFdes=I&ZkPDwjXsWarJ9Str8+&wbuvtokFA?jd)*}a zp1l~#}lchX8#YiT*(?MZzYqn$Bvj( z&Uh>9%9nUy9J0i=ZmK%ewWs8Bv++{3hc=Oi&X=7@UBX3;hhD_^uU4NL>*_SiZz>Gv zmfKq5KYn_pi#DFR7oL81(YexfRT+9$%nC2*-J5iQKP|UTTu4M<{HJQ&`{D6s=Wcsf z=gpmi8$4#C%m^C)z!jpl%WnDK&S4W@7$7J_VXNtt8b&@Ld=Uy-Tq5~*J*Ch3?z|U3 z7sk+4E6;FWK7pyKO_CP9CR+aSBEazEYjnm%E4h5%E8;cAj)Pm$cKjxo6ex?mpZti8 zY1+A8_SVnKuA3QEK>g!C#Awdw;G!B`wZ<<^?{~IaI}b)n1!i&n?H951q$|3&hy5Hl{omP(mZ`scp=OiGcc9=FX2C9-TgOk$sKq8kK8}Sw=kxuQ_cl z-&r83QJl$+uYAVq`(CTPPo@53cgBv7T2{z3&cwC0X4v1UY4p6CzcIVS?=!!=C~r;s zSCuc)p#7^J-PDb1-h%M^kVTkl0Q2xW92~d&583!_m02#||I-6qh*L4$uqYl04LT!3y)B(4}S8CJGAfofua%LYW&`x*pRXD z$Is?MwogxgXo?&1C5lZ*VVT2KjYX98mHWNE$%4deT_+W<9oBD)*@{pr>Cd1WG39%G zQ`qZ5+nxIZZ7$E95SFtH0JcIwdsJLty4|Uc zc5I`7U4@Ykp$%OVrjwGulg>}I4id&wVplr^Yfil@SOaHja(~^v{#JOI^D<0yu>Fe# znZUurY`SI{2uy}z9!VOG>1KS;x{pB2sCv1X!q9zt#+Ae{t&tLrxIVuj_XJNVDJjVQ z;|DgR8AN9v6qWQ@>%yUR$ZAAYmR^@@IAzU$&*wo9{o*-i|6@MSho!)*Ax^DQb#`%y zyB^#F^cDoixKkP;96+zJBOHQ}rU%ar2+o+h^Yo5f3ijy)h(w4BzA448{pTorssE0KcQ1I3hfR~2QU7iQ zaiV&eq62}#Mt%7K0WVbf8=owkpB$@g;vl#utvM(&SV7I|Q~d-%=EqR3Xwu}?uh)|T zFNI#lAP(~z|CoON>;^D}#RCsG{~sgf+kGw(`3C+8igf22E`*jA6=`*Nfscm^1<|n2 zbq)n!a1YH(03B9TTbol~rP$KG7tz-W+g0k-gd6P zt0YRT0J#J`+Ows*fvf=x2?jyh7GLsjYqVqLGoGeI%(G2RF%DMSmuZvzaAVoa)g`Yq zmrMA$pnm= zssfzt2|4S)O^RwB7KKX`j6xAo!^%g7LQ1pdJn)?v@Js&Jh3Vt_u1_=jMCQLPrczHx z0Hr-$v1Hrpe@ns}^n*Kf07yxZE*LCa1;P6Tb?+%)dB!WLBC{78+&t4JK9GTajmm16Z;g zsm#>F!&c0oyc*W1|mtB!3cE@ar>1$Y{SmvyT`~LS`4?bqyXkLAFDV>5=G&N0z zUE=68rnCR^7Wt*LS^xeq?;2jX-o4~GSD2U2b6=+kJ}!26=<+4PD8`2Y=q4wOzIm9z z0kK0xp2|?gg$ZWQI3*%T7U zX_+<=0M_rrZu*(rZ<*2CWM7?s6YJr^dknb7@54JdbrN&0_OlsHfXd)Ihn*Z_bubR6 zZ+9m{HV(XrO6T_xJJG-C z(5j#H0oG&8slOFYyo=UGADue5o?-IyKaF+IwHiN|3<{TLs+gUZTyDSNxc}~e%S%5)4i}Q{NmUNA z-6LsHVK9Ls)e?w>$6zGaXjoC-ZN5cN{=cXFDyoG z>t90+L8DCnk&o$eAgkV?RU4Xccgn2HEVnkn$cfa(*P2 zLA$@G?;GeVy)i@nEU~}h*?)tV6#r~&JJYq|QjFWN`{Oqw?C&?jQUFFV0&bssbxU$z<8A}~xC(sO0%KRZlhsHJI#E$_VE7~RT0w*kaF%XP6i?kLPwFkcVecxh> zxNRDaE#sfUHU5!NO4`NyF)NZBKuU1yxIvfD3zn7_Oc{mIkYc=Vv0WS*bjsyKciKW} z7a-ePAitObx{eYmreUqL+7>83#u}Dxx)P;k~6aeACWuY)*?Ox(oFLD{+} z);%T{lm`=FbFo)Rxz2|P0K&zFADMdjax%2&NW+V*A^Rb?87T@;19H^2$T`E8JTaBe zkKU}~DC#+J?T2k-VDr?tAGVZfBurtiAjFrG-k0iHagwtw z34(&bUG7jBoG?YG%W1(O1W$lu*f^(A*Byf}<1dxVQ>=EoPM@llK^E8HO^(0+_9?0F zOW-no7{m~trjOCf8`buMg|5!nu#oc4kD-4LaOkM!OgXXxtxIBrFB&uAX8qtNn zgFKQ@-b{dTlZ8SLfEH1+WQgDmP970UoB-okBDMfZ6ogVnZq9lG10CEGy7};UlAar( zKMK1wcECu3$+V{JOHBL6zBGB8o41Q_ecfIp7`;xGYyRTWSxLN-(Oe$pA)NJ3LJV#7 zZQ^SurZ)JTa+#*$620S^O2bYw&ZD`>CxlXRw&pC{In~M3X3A<4w}&z^AzW;xfp`3k z+U(Zot`nVk?B~d{_oaRZ+J>8szi&;5yXV<+>d6xpg}(t;qW~?KB~M322BOkWEGQ6# zlxWk>&2}p3cC4xXG;s8d%CrwSZF#om! zG;TYWTQ>8Q<&qIuNq2;K@l2d3hyWKTQ>TDSjzjQOwmK|lFI%@(RaJ?D9gjiO)M~ED zVsg``PcOe4@+;xgrIC*d%SU4swk!rK-_q43OMinYa%gDCIqqIYY-=-s(bo}~=}vnq59Z$Fxn#WpQc^H*;~-}&Z|wu`+G6qQ2^ z$YQ1D*5D6go1qcI{ZjGxlpq3j9? z4=;x2_7tep*2B10RUMvaIvY%V*aZXiHD4cKh1T)4HiTTQJ8dEZb^a$!*0gd$}R zCSYX5k5moFAwbZpa=x&WlM`kAW+9iFhD~Err_fTeaw54?dhi~in0D^mNz+T1n7HDU zk6$s0F9p1Cb^8-&IUp7Zgl^i>k&BDIIGS0~7ZHk5E_4#f{_$6*7Ns~P1zSf(M+Zah z;s7rXg%x1~?`7X~fX|rt~z+j{5Gmu{W3Y0`K!mdd=h=j2g7_8ASM#9Rt{F~?b%7`*;)>w5L ze!de<+9{aKp@4{0jUF-UlPDWPFI~C>*@NjXyoH7vH%7x3q-%G0$jN2Ljw&NO;{rLB z^``4ER7Q}c97`iDJKN0N-Th^~ z!_p98j#yks*S-cuT)%qt4B(eChzS-z^o@vxc%S@rZEo&}tIMXSTD?=E(r8V~pQ^@u zhDO9;?_LF3@*yE3zXl6q;hZ+m(Ft;o4+896xCH_y%sACS+QcjVTf5aXmmP;K>*L4y(CnOs zqp1vxB8xR&L18^TVyHAX)b+xGdlH^`fFdPwZ?^JYu6&>AKl(?AW%sGi2e#WEywczO z1sa{{@Zm`>T6A~&oa;!?KDUg|@W%85?KF;DNQkz2^}$9D9GsGLxWIpmrbiiURR?%7 zym&HQuOJXDuICYY;cVY=J9(+gZSKIR*jP$XCL;2pcbf>A{7B*m(<7C!AjE+?Zi8M1 z@3zhr;{>Q6!%#ru@kp**x!GzHFj!D#)u=$1?5U1;F-=u{bl?S38+vf_$&zeD+&_Yg z2_Xl^VP(hIEVxAMUfYjt*Ze7hgUtT|dgytr2?CQNwrZNFAqNY4D-?ZuYvfT|-iXx4Z8PJs%7iSRo`)8p<#0k}Ov8ACH zEx;!tBC<$9VU4%9Dx~2I1C#SpQkijcb29{xz=SZ_NtTtnv}$b1Q==sP%Kjc-P(&p%g0FVh?=qP`q1ENL#rH% znEvd~-0-pMA_fJPY-(I%gLLPw#?0s!lkek=RYI&b0e>Z ziH2NgdAY$j`FZ%~n`U~fdFn4Ai^n7+ZI-UCba+IXgTU3}PBhia>Dq$_c0*((+PHD! zpQPZyve!P^V)gV+2?<*}6*g;1fv^QC*zO586~oO?mP%2Z6+#Ny%OJBuE(En(kO2Vo!0fx(pA zT#Ji`hh2KVem#x6m{7cBkfAjlxTJ6RSS}~&<)I0?4(d8MIdKXF8ee&gFQJIY5OVRT zB?thK$0F9jDyOhH45`4|kb*!;nq+iA)uXatdPKzdgU69g`8()v2`c-OwOSi&1Ktf+gFx5TP=FFNk>+2&v1&ZKte#`#C9$&X@kd(w^*{6sD zu>bbM10Bw9d0%W5o@M{wZGUg$p;gL{Wn=t*^+nuT6l+=ZC)%>ZA-*DqL0Kk z!oxntDWY_M+eh=#q3>}|N=ghI9Fnu=bvEHbKEhB}gRT9iovRY+PAc7dHW-Q!P6+|zIU?E?o^=bSshpq7nTc*$=H-2S?VcQxIFY|xpj z{8mtA4%5k5+||`(x_NUbQceg;m^5h;jp4zm82$LQJeJ)*eYwLS!d`-J+T?eDFo zih){b$&&5!*Bcs6O)y@FGCCXCLLTcfUn}C0s>WB-Uk~upVQWtgOB)+Gcxc>_t>N?; zk_!w7fN*y$9%GzyUBSQHi`sL-ubEkPNdSmWB5_$6`HGT5-!lE>QC_#jTi zC;bpJiN9W~vZ7)&2uPBK*W39{TDo*8*xNAyI4_qx&+`7)ZO` zS&zwd7^1)J6*I*&bU9>lz=j$cUx-WYTx$LCcEAb!mHhQ`yDLHFQgr6y#w&7Q6lGA{ zA49TGyq6e@b-4&1QF#^Z+|Xg*Q22jJ-jx|?R>5M7OWM$xfU5XU-=TcD|Rm{rM}V9cFhd>oD{ z4hGAE8xM|&*>O$wroU~Oz0_S?4~r+o#>7n$});5EahB8^bzS37Rt z2%#|r_!{KOfsSw+@-;7yu?a>>-NbDTjf#)w#d`SI+A0C!lhPIN_>ZF=o;Gb7=C_Md za$-gX+qm@yEE+ldD9YvY=Uu4KdC;+NC;BgRC#wdglkxKL-NdjbsK~e^gU}w3S#BoA zUl|x0nxdA$r!oN3HSoejkn|i}*eWV{0K25*3D1}@Pga)i_3PK-U)4}IIkPat_ z<|^6U7l}cAjULaX?{sx`KB=p-KocExv!=$3O&p;dGlU{FN8V4KA||#c=PeA#JdCuA z%o&iDybR)CDi5{q9~7O{54L?R6nar_P`pIJ+GL1%pvuBRLK3KS&9-dG41;%6pW30> z0Z6WSv7?EA3*e}lo|ry1`SBsrrK#P-f;|5wZ0lh((ypPB4{oInz}wMCl-e7>GD)dQF>fmjD3>{ zxO!EF_D~G2S~jfa)-nNI&_smxQtS-MOVWvwU-QFW;! z1Hjy2ZI7j4B5ek&+FHDxky5Z^(qwyzZlTIE7O)y~XzDVglTf+{r4Zs|2g=6Az$K}D z=+OOYwZSiMj)SNs$1GrkAmF%&>~PIiZU6YO(c>QaZmG?hLM}6~Yt)c&&)nRcoI<6~ zkqzXAoAfFW{SCbe7#TteMp~@^gaE~H;-(lpZiN#Moqck8`b5ksB9s}3vaiysm3WXz66binwQ_LXr4=72u zqT|GizU1`<^xC_DjR_HKPSFi7UcB$>a?SoWHFAFktJ2Tskfdb(apNm!X}J^v*Ra+F z^^B8eF8sfD)bRJ-*hj6!yAxKk)}8pLU$X~|2t-Ti|9Yzx5)%6R2mgQg!~Omjl|FRc T$q)8p@SnB1#;hAUTZ8@&+lzyt literal 39089 zcmd?Rc{G=6*fxA4LkOva6saVchlL^Q~hC^DsiWC%r4 zhGa@bXpreUF51ttzxREfwZ8XR-&)@v-(G94y>b8U-+f=hc^>C+9OrdfS4VvjGcPkm zQHwNotLak|Z6HO_bTKjDH*$^dKjA;}$95VY+jqp_*l}xjdrI5-nA@Qv#|}B!2zc4M zdpI3&l@XT{mlPE^ctC#!+A>rV z%0a7!f9zyGg(cGn;vb(!+!W{H#fy1(7y`*(cAcUTz>nw8TT{Eqg?9gc__M*l)YO!2 zf%BWndIlazc6Rphq1K$-d=)!My!~|l|K|2;d6*I5Uazl@g%H_d99+_us1?kk18UJ~r=F`M<-QcDz$4REOL*zx^KTYhCd z^ZCaz8@{k|EL-N%ayKYEoH2UU_A{AAIhF10TRZ#T<=HZpO@4c{nQOr%u>)NBjtvad zHs9YInTA=F6+v`ICr0gkCwk+3lG9A`9gItT3R((PLKv=Fl=}Q0NQ=2~c+;j$^zlbi zTipg;t=77xxDwC2<22{G`#;T#k1ceUZW{Q+rGV^aM4PI zrB|y2|lV&XC{!!tLgIyU$9^&Jt|toCgAteK$d zuAyroA$0E^9EoxLP;6b7Bxlm3wsWV7Q0!_E5lxrLs1=(9VqfIiJY%Mm%l)TEJ{<3) z2{bgivrAu}Q*nBH-@~G!$M4_sE!$}LbaSUK-Dqa)*r6)Wx^YU7-p8jCUH)jmEt zGd(Hg``ax}+??0`<)w>1hu;@1!LWp9Wr=2Y^8}A}aih`mkIy1KGv2J1P><$QQC6n-`1q_2ACCI` zCe!wDFnyChmdx*o348hDc*Fa}wQ|3n<6S}~#`>SUe93~*ia32bNdNZJ*SGiSJ@PvI zw!QtyyLY_Wmp45t^P9YP#VE^=+~$^H7O$wNXxG3%MB(A~kH5e7P=S4Qm!Gt@8aaAn z@i7Gi%)YbuCMJ6s_;;l1DnW-9OyU<|nCblr+{nF7-K+A+le~kCg1+O8 z>P##wJ6>E^x0s(l2CMaPLj$`aWO$;Axyz9{=)I%B;*+zLo34t5>>bxus~u#l^|(TeHo-KVer& z!K&N6XAd1UKF~;~p`r1%%SDN{~CPOPRIC|w))pUL9mb)egn{F&DoB1;&x6T@$ch<&3t3+CEjDAt*p$*Bg6Ud$v@+_ z-Q3+d=@?kg6;4m|U!x7gezm(aE7l{><4?6ufQW3o`dwSN5dLMfKP>^Ea&!494A;G~5C@Jg8&_iSKZLO98VpPQ2w{Jx!-+%Z}@Xfq#`{3|!&W|>^ zLvMAFQl*X!=sF$n@hKKQP({Tp zf3T5OdDnx(F{`%c`cM00iDw1p+E%e)fu7})*LRt`dCi}Bb*M#_Ipy~K%bN}dYY8>W3+<0xfAZwXW1n9y9BRpm zEtc9ZvTW0#w}DuD{aZ3zhdWAjMJ{s7ImflEJ%c%XQeUs*{5|%C-S4gtb}~SiUd=&# zfHE>Nl67iYpuB6l(#fB50T&N>BVP5oGVp_^*HQKrn?(DWeHYO&vc3NE<#THe`|1S@ zY<$9p_X#h(weMzhOX*Jp!HSNKRaplfw1}vGeOG{(ke1JUMT^K^DWvUv5W_24R=9{M5WCqA^J$ASJaJ%O}<% zC%SiRWJFm_ZNblPA0qJ#T^*$--xeNTf$P?#4>qPT*4EXfe?LnG7ZLN-&At4k!HL+c zg7We_fD5(va`e+Rbu-^Q^c=d>@)MiJskC*$wLf>i8xFBR-=65a2 zS78x0+zY@KI@p}CDDcaHK<46$92AMnfQjZl!{5GT%X!rRY-E`h)O_b-V`Ce5b)60y zEadjSn;)@ZcRD*e2i1<$>GWNCSW@%eJt48$-n|x)>D4{^J&2H2-`*Fwd3c0i(R+P) z8{|FK*Xwjx&F_Vsbn-;aH;Y&MC6s2TWDqOEu{>>&%t>Zg%1rOja5d|VbEX6W8*o5( z|FwW!`3`j>c=RW2ZSt*?YbAJP4^qJ72r`Sw&f^c53R*5lCmWwoAO6?N|HyCgXm-Qr_| zqOtUp)mUHM@2?L!bM0Pm8k?F{K7LF?-4j*4Tok6Z=8;w7hYu@H{`$64RW;afW7o6D z<>}MPyIi6(_AIInuv&(Ip_8o8{Wi~*;AiKSyQf9=-x=_{o0hib?%lg?m=DoOaf=eB zBD1UM%X;@)SXfYjNWG;k#b@LvkVMZVC7r>3aW42-@^0tNy%y3pUuun{%j<25qqsppZ&w5<5j`*EC^OHi&ku^c=Cj95wGm48VL%Bw^%u3Z`Y6F z?y(x&n!G5$kL3{iiqzCI<`s7LElN%VAq1xF2xl9>LcL_<<|fI>$$8_OIFb&c>(q}{ zOVj=d;I#ZJ2W0v_zp;`M5TFn)JN+lIjj;p(?ys9a@}i_$23+3Uxj63p{^8NGnzz~J zTjNCbGXuIj2K*j-{pY5x@T&~%6;rsCX;uvOOcla#;|+}^Z`;~>PegAz{H_A16xC4u zy)Rm>Vkf;{^k?>;oSBjbG#a}SZ(87d-K@wRkkbEBgZS7)X-Nr*^jX;x%{TYMJo!Ncu&v&43eiR{r{U55OhZW-nJ1NDECuzyn)fPo z0~sFdEGsqqvueAKfSla2jYio|5uRU_o;;p44SbWEpa0~pN&d0=xHko|=gaO*7WphG zK0eHbkjEqAVAmFZ^=kdi^XDGhvIy{GVYUTVuciTFy;?twX$ZtpAzKXhCc%^6cZ7yZ z%ydDb7K4O@#G&>=?SA7F3O?&03g`D%c6PpF z;WFOV)@I#N;>|64kmGYpRwTmf6KsT=d#~+scb7)YOYBV5cz5544uIy^m$!P%zL&(! z&!Fh(`S#(FcTJ?3cooW?#ynf~*SGZOrYC=?CraCs3AmyZunH@dfnw#Bq_FhE%FC6I zHzF9>S6KnY-a=TubXuxy5RnEr>ns*z3h*S!5f|3&(JgYf&(gqn+*d{b&2#Hk#T3&Y zZZ8Zo&3XjQD3lD$q zI62&nCniOO-UHVUqAGR>bX{M+Mrp(ft(KG9pE+r?uOV`|#4dc7UZ$ZK8RzKe=!nS3 zCqKWoH$FVtBN{*r?iurt!>E%#k|BPZ*R#UJ4Y;e1TiT8Zkt}Lp;2>ZU1O7-5t^Y*t za#7=43W##!$Pj0#T$t34gj>S+Tv~2!E(cI`TgG5(&NWFaEPxkIRi^JF-8%sHjI8bL z*P&v1iX!}Jkw^bMQM%ZxSH%@)e%p2r3<%pvC$?OWT)1$d4ZwNjvu8UK5K2aSUq&Ki zn7Z6Pb43=Y)!?@N&S7^fEdz?<@Vomjw2av7wk34HR*+jzu&kw}CDrH0XPd^S_HKIT!Ha?SRd`9`M_>4y9G^H4a*=J_6XxT(2CqW~D5j zpvLLy>jQ-(ASjsX3#i3a0|x7DoA6TnHN?Rr>c9in$3URNJxxtbxsDC12HP$?fByC* zdoCN*5|kIuZ?%&9xSaTy4iv!mf1|NDn> z=xkS&*a zuBgfsm5|(%zg#!ep=jjbH5LS;`W95`x~UBB0BFc)V)1kHnSp4GkmI6q4Yuv!^pw5%XK<>RSI)6 zPcyd&s!Q2Km1fvlvfgnG$c>F|ee_V|5=|FiU)QHkHwx-ryjb}C`}Y&yKhj@S^kcrL znJ!ZYRF=Pe7@I)K@6Whs`>!u;bQ?EjZtIs36jbg1d13KMJ?CMI!RcffN4Ng+OEpGC zGxzyg;wAbg-W`edv~~=Ph&Xe8sNJjUyuNu#zm`r*+Jid@8}Xf&rH_781B1lj@?L4Uo9v|OG=%Ik)h=}Iw$msIOAHg*BqVnio2Jq78OV(_ZJs9i0RY3 z^%|h|HMo0=?+fCjUe}n#-rnzQ_Q-#w#nr3lHnQ4qI|tdW%w;=UIz?QT8t&InOsP&!K?2I4a(Bq~iPUbLL<}g)9UPs6NLk%vju52D2 zW1{Vt6i){Cq8Hz`G&3x+YE7Zx{57op@#oh-{lw{sS(oSHjklK^O4{_oV-@obQ&ZmP zZ*PPC(9lfWdGImNvqC}g=P2D>I$H@P-4mWxcYh?Cw*vLpn95VC2zXWzsrNxe!_XD94BA@;DwbP=t;fD?TA z^jzgynaLb_-NciWaC4)aHg@HWNRw3*`Ziy~3O>HGU^ZLp zI##Ti%{gFXXX?|pU*b_957AZ5`?IF9yft3H~C5M z#o)PU)w`IkLQv~-i}s$7SKn{2pT8=;ohCF^8DqKIl9h^-OdNcfqSLB&uGahsasux0 z$A&TveNpGZM!iWa%wtKwm7w->g=M5@?4+qc(<(KN4Z^ZgL0Z>OT$W#h7)AG-%4I_J zFL8|_wN_zqXr%Iz#f$a)B`ML577T%H4=DF3eiGa1@gO=5m%djxo4e3B7l+Bu#Nghe z!8BHj*Ee(@bvs0}76EU{iZXtx5vekiwBW)WlLha_v-(csGS(IN^taxgu44t1vrtej z{WW>-WxR2R%-~5hzFg8>!?J0P~#8bE!r#sbjo<% zCVt#Xyh=kLN!+TCjHTWx@~m4HhT@jYyyPjf6Bkr^Quy9mf#gqi4sA-z(Q|_)tVHgZ z)TL85{{_nA$0kv$WLrw6@I@QF7QWTH0*}?atxvmEAu!3+I&s4Ra;x0|8160JY(tc$ zE!9R#hI;P8mrk4!x*5~)AfE868%pF2WEZNnax34aKQ}jpgE3@?nr&Aq>(C-Vq?XJL zkuBwsw4hSl3U5?HM?N$zyd^nSS+;@JfrX^pxli3p?9ObFUl_`wLgu7H3NIt;GBs$% z^rzg_TK-WWo=cdWyn?(AZMOn>fH-zM=EEyOLARP^|9Q?owwRM%Jd_(J6PZc6xw%+- z?n(=d-G6@9`t8g*c;nkY8=VC~uk%^BKH0HC{vhFAb4k+PK?|KR5y)KV3I(i}^cgk0Yd zp1LPqe2eGjxHyMbDJpoj3UEe8e||9`r2)#0O2{jnhI!*cGSd=Ntt`X2`6XKpAaZ5v zad8IrRcBEary*_`-?Li?E+Lly>_MX(i>L<0Nmd#fnvwBwf^a!FI0AEXC8-J&F1b$4 zLcTxV7!etvq_lJ~FE8_vBS%CnN`4>a(w1oAR?ZT)sYL|(~HUEAxbv3F}~ zs`~nFgG58vhJ)$e7mJGIYdy7!QG3?4Mr95kJu_Q;r+08r-^Zj_^PS@@OTLM$2OmTK zjSNP9VyuQ%NCs*MI5;@mf-EYyW=;Cxc_?u3ZLW26m8r2Y85T$zZ|^%TQNSKp7gbOo zN4^$xf(`gwh32K3>hvX?R}N9`^I>ZL`6Dz70?(b}SU^vI9gG?Z&Q*O4*J1#t$A>%l zDGqLKCNR{sSGTXA+&)z=eqZLdLeBYh1$Gfx~2cZGCOQWSY-5pZIDn z3o0?3vnU+B?WxF|Jy2jwa$nJ>Hcg?1)KPPd+mP zHf^`)T(((30_XANlIw#waDy31#M&zhR1s3?Pt&B(oM@v>5IWqmmV?}i#MrLhwHzyL zsX5r9w~9pOVxgej<`o(9AM$>J`+wTD5QIL-EsGGRN8CAgw}hn>v9gliEF+OSipIdf zoGEEOpyhB=yi`$QwuZppToaD(J%Puyzp zU?eWAeqXmSuI4N?qV%s9td=PlJ^k81IqOnK{v5U#JwubSTGDT##PYg<>a7_TY8i92 z*6+n+$U59OBWSR3O_!*IUT~R15Hol!jwDJq%b?7RZa!=G(oM223T^4>nz_87QjQ=1 zf*p97iV}GYUS0hsbF*WB1U*<%95|WgP{RB*POMgaT*@Bv=mc3?mIDwYU7wli&0w9o z(=fSHqRDg9K*9YBZy~{xj2lCf5_ImelPR^&GMeVo`~)!0-T&`gH4a%(2L)ua{64=n z=qjgl>*p{G$@q&x9iHdx-cS3noa-;h@FkbtZ~1#4pGCN4!Tf})AVmrs+e@5|6qDRS?%a&lUTbW)ojMW-6E**wnoynWJwR6`M& zLih{-C440#D7Po47BMYc_!tS=ZS<1{s`$#zPJZ@P+g>I5kA8abyE~je7Yh8-r%$aQ ziwrcSvmj2bO9zX>#wB5K_DK0O7b#S($a{>uF|xD<;dLa_*gI8jq1qBE>E8Sp)dNL< z%Cmu>GtgPCBx00(cHN#!6*V=?Fb=gQ`oqxh`%8WUaykXppLNA1lIS7G$2RdP9AipW z@Ki++)7{-21ozB!i1YG=qFh2ws}H7g3d$|3coW;Y`sr( z6+mGs>H3dfywGrY6dSt)lE|$wZlI^yLaR%Bt&X(i{N}7LjeJ2*7{kx z}$tUcpP8Q(G30HXeV zd4Q$MB%$uUe7QTu4GQ~E+dcXX8#bJn`YmNV9m7U-O$Tc@kuLk#En&pkL zOxWfvO?*Kxf-P9EfcS_&iiXBHVACc@+cOh(6#7KPvuE@>PO&})K+K{n5ic2P8=LS97hO zO8`E82-gv3=MwlWiag<8%n*cUd-4AB`u_QZMQ*%ytk!Zqk@zF`35?bPEc|5$kb9Kx zxBe|Vdr3aPo9uOPFpZE03>Mr0G!tmIicZ*Zt}g8*uPW#`&ka!Ik%#8ewF;7(@_nJ8 z5t9m1^6tf>?e0s7nXi)PzBAEr=5KfcH-8a7eL0(W+ zxspJvitFM1Z`;Vz&;dFH!gdm8E?ExOC%%e-RK>^Ee`ou)wu6RBsMgj^H&~WXc zSv&dESWNvI^W>RL`L|*N1EtNAU5a6RG}DRNdAeQQ+Q#O}1A%{UbLDb{kz5HDqXVrE zuH=8*D-_BRmb`GsG6Yq4H?{@L@OgQ8`S8bIx^xPB(HThVbHrt49R2FS-;X;eP2TWt^Eg ze5^2#m+s$XN}#`|mD8OQFN>tvzz|5v?0jw-py~OOCPiq=>l{%PSP|U z^j7u`wEOn;l+c^}J4W9PseI~5J~|OVW5p&G==51O>pmt#t;ia5mxfrN&oP?iVRQIb znw5Nq$Ij=?imd5#DVCKG9<>JNr34I{Yi>p^rRJB$_)`#H&G)H{+fDbh(-u;4P5^lk z?oZ}^`#JrN{&km9*VUn~x8HRV10WErS%lkY$z<^Xt8mU1x>gGU~vzXhyTdFj*v{%RT z)T(P>Ai`<|QbEQ3PuPe)SQQ?g{FOa^CL)5Od`BKL9!b~w)1>w7)iTO`@j>$H>>*4P zj86Y(3b)LPq%Vn@&~Dtgk(i_$|3FWg^Dm+vf)7~g&|68wP}mi}s8h~3GkYXLJnt5>fEfd7j{Zc9{scve+KS3Tgav*)FMR+*7g(`S#f4u>q= zo!u{uzqtKEKdHp5JhwM}>e;e?@4){l@1W3p1nHOfSK-!muYLKyhzuL2nd44pw9Bs_ zyv_5nTy14UrDyDr>7;8$=K|_R`VH$ULNoYVHzV(_{P*K@eQkyRcJx50g`NT6(G>A9 zg7aa8dWj%J#tv#un-|aQc=O(at=TJ)_}#Y+gQ;1}$thSG6B84D`SJ=P$8X)bwRDUG z4v-!9T|e+)bn$z%F3GxrjyYfThF8ih=+w_(b3YCzM1oZnWE*3CiS-W2KEJ?n7+o{ae%r9DI^NWX9H8W~17_NJH zuu*nj0?(&-b^oEPE!O|mJxZn_Km1`}wc?C`eaN{rJF2>Rx6@_QEMSqfyqgXs^yC4z zx_Nr;^zl)E4igF#V6U-c)v9Pn`e_hB>976@P63DN!ILn{72Y?Wq9O%5X_+W2Atq*K zRp4jc9E*Od4nyAuFT3BaiZsTa6u6V+9He$7L_$xY6$Zv{a{TO%vG6to7U+Gd3u zJjRI=TY`gwt!(sVGgb4sW#fa8Hd2H2Wz()25qs?aj7d0{d>j@%;xGuLq3dusI=Z&X z-fE`(`8-+x>Gp!hgB;9Yy|%k2y83v3ryI$eh2td$!^I=bJoBgyUZnkcwe(?t06jwU>WAz(+5Nj*1m^4Sxm(w*g_Km0WOdGVj;NUXo%Tll|3poc zY<{38q=0^kFa;Kb50cNKtDdKxHj*#yk5zshiU__a0UO}^BZF;>jTTsL9^9&`bX=-_Un83LB*aj56#3KODB7Hd9N>!A{G!&XHh%pcK z3CkBWr-14u-XgezI=sHSr@LUgBn2L#xskdHYCT*vyLEKxrII;lVTvS%S3Q4?760*Y z`JPs2nUS`ysi-}>BmI~Zm=DzY+}ln_!bs0f5xJr8NM|&x-L~M5O`3?g5{@xdqb-d>_Jr%n@D1! zNulLu{Oa`S)8JEK8}Uuk`w!i_BvFAwm6#3SK!E#e=fr4lRH46z{wF%+bbZhmI#wXp zn>H1hMH^*!^!)TD7>=zwjE0K1EPf~%e@kbxl?j(G@3^ijATG{^idb@U>o>8DuAQZTI{zoM zN7i@x)*MUXp+klbCK3;z!xLmAYX^r@^P~fE6xt)M+E2m}>^^OObB~%@sKsD*hB-a8 z&F2pj{KFKr?Q{Sw6`{B)DztgwKl(=gM?*#-At5&}FJk3uYHt3aAhi0i@aDjccI^h6(E7(7BcN}m^D5^AFH>LIaMcW z+L1bu?%cS0IAJC;I~jnE``cEx5Lg?@Zz<1M{4wMlX; z#HS4N$9F;> zk(L3|%P34DeWKPWfL72&jBr&Re0}S@;oeG2Dv8?YoU5#_X9KtP9L-7T(~N9<$`F#R zK}^F)O_B~EX_G(Pl)iB3GO@CTqU#Qml!uT;>?y#m!T8M`qnvC{ohY#bg(yPZ4P(?q2F^5rcU59u7O42^ITT3hM=dYnwcDVJ3 zVhTeg6RHSSbaQH^>%S`xnDrMmd&mLzKam)Z_M9@PO8WK%D>wx$5v1ip1l@%w29FK3 zEJDCDE^=Ro%9Zr>p(n~&dlY>d6;l&q=^oW~_e66r(-cou7>rW8ZtJI89XS$%Vxb3? zH`9LFK;k|Ziq#n2v112uNp47ns~6_~XxMWqVY&Nd-(M`4|$=Wi@RPOG92Ra+0a2F#>KYB>t2+chKvy=Q_4>x?BMGH}5rjbOP zs0k-*sc2eZi{_J0{gG%7$S;hROpW2`sVNRvdGIjTA+e79`o(xI&)@*mT{LhmLY`yg zS2P>)rvgJ5*(=d^hgo)Wb0bp#E7}=2<49kJOV}c6;C+$IpPyedjXvlqF06Ub-*AnE z`UpbMTS4cx!5PdRQ@Z|bqd$xq>}qe8?ce$1;u{#6xtt434b1iSlYh5q`6pbvyZp}I zJT!u~u*FN3tbrSU_2GS)Zv;2UiM`y|z4OjPkJ|9AEmV!KD8o8k-@ z_sHWN-s+^o?bvXKIehCDXiDTKU2kZfvB+H2Uw3(ZC!x2=@$&=UB_&`yvnGtcI&P z`QeH0soa}guMi7(yo4o}D%0W>D>hPd(+DQz=wQ>FzzhSTkp8}X9$CKvW~Yq^w*81u z^ARRdo9@am)$6*XcWt*5ti|hzZ5-~mr=V({L82CeS6>8=j_x!_2WQaceWrYN<^a6F zI}g3hRe`p&`%f)k?hVg6(k4lq<363}PeTLO8psSAA=e0#e?vKJ&?4}$L1}g=V4a|} zw7$VzV?8qK3g7T3*t2Hj2V}NLfPvGnm7ga4l24z4WOTgwW8wp}4Kie;3#irS#p&$f zHBocSB{x-e>cKKfagVnUy|3m){TmrKHHUll^^C>-P~C49a;-!-+cRZ|W%C9(?T0a) zhQc{FUdxt_UA=HY5KfO9mJz%N;Y-mZd?7d%9zM-U09bKqcW*&KLEWYZ-Ysq^bDippmb^h`q1({%dQQHoB+4f`^7x3lppic%5iR$yK&9lVzM2>R)Kli5Qz z73y4Yh*8KgNQik}Urn>7>Jp@Oz>Ff<>hlLnBrGH(1X1<%9mXOvapaiwq18-6nwLa3 zT)1%IhAh?`7h3Ys#<~!9J&hoF1~v%I_G9#c6q%s(F*Hf5A*h{(8_DT1Z24#;0Cw`A z658-*VlQ}xaCY(Vgn`IK;x-SM`W}9NQ6Onqy5Cf4dJ{dnHo)PgPUzd%2$U~jWSlUV*Avm8{kMjqMca`Y%RzTl9Dtj4q_nR-yThfryk<1=U!1_<+*^W8(xkOKQjX-EwTG1R0nwH+dyq z`*}V?v)N}Y-?as*29m^q@#&KtNGVg^PJ6TmBR+OxvFaBir0kiM*av+aZ8?mT^z)7E zys}Kh6os$7?fD)lGY>}q43>ZuN7E6G6j*BB-^%K78_56C;UpJYo*@ZrTO%LXazkLp z=t8TGNljv0T&PQHwl#L1Y46m>NQwKSmy^+|TY)xgg!`sKY>XXQhAy7rlYjm=XT`kB zwcdg5$G&%R(;`S`;M_EZldoKXb?my_Og;8)rs6Sgv=`yzhCo0U(yrD-%r>N)5VkDa z_T}qWtm<$qZumt8ldFFJK7l>Wh`87C4*Fq_=rt9cUwd^7M3y1ZLpK`mod?_QrPueQrKRbifrW(9VfR6O02a}9(&q^Cd?lPTg@uI!Xxj!<70oJG zzH(*q;WA12&K*CoIDwEMsUwQdK<-G z4fo8U=dD(xDfB8la%dszo_%2*PI9)FuvOSl-(>j#=IXn}c~3CaNeI{Jb6vlFo%EKG zQV>AF23(_Yx&L;w%mw3(Nn1aH4JxK>w0mT-MIVjzAFC^Ait|9j8)W&i7R4~t**`u9 zEX=caEbcQF%G+IDwWj za>N19SD9>wD?qTmqL`SN$2P?W)9yuls!Umji?3cfFF(R4{d|+xz$+RE_fJs6>){Lz zlz|jtL8$)i(2E!MXSZSzDv;{m`HcuM-XRfJVJ~-|qm`hHO7ZS+RDZO} z`-(Qqs-_C=g%VsNI%EVKv8y()oD;sM|-qxqGhkvwTAQure=T}Stm zNt1%S{9{OssQ(&TZ#+PlRriA4Oi_|y70M==su0-YC}!Tg>k=e@j2?3s*-nbkK?)T5R0zf-|1FF09ABW&bU`Jt1EO>A*nnZ&KP{4vbg-+ywL-fbc z8w(Bge&J4(F~t@gsL)dkGZ%Al34N$SpGmFzS0Lf!y-iKrl2#O#xLE|!F6kX;@>4yc z(;YB$!9sRudczw{r|rsKvz*KL;O;xiBg256%;M*Q@@X*H;EY?$Hez?Z$W4=`lQx~i7g@{4{Ls&&ktvU?l#szdpL^Y zB7lJT9P6(<#(d=AEQ>5!ZalMc~d^_s7I8)H1p6P8>X^*)+Qia!Ck8 zinT)Fbj#p2=exqgks#mFfIx~?W$FqO!{P!4hE&xs<^j0kNPky>4?4_NBHmVEIg*1p zUT2%HKv!^ZWaLYi{&rYqda7d7L7t;8&lc2x6{0{}20z*t$s!#YaWlv?B+dI(z(M08 zH_I@Ow6eCaIbho=awo2y`ETvJLqr>Tm)O4Fg3wNxZ05~b0mc^Z_SOY#~V;DHED z{2_Ho#r&o6?w@v}m!u0Rcqb|fa#RTV=$7H_B+j{$iWI*LMk#@&f*V%i`4}y7=`-Le zz1#Zhu)TNiS{?)$1iYC7ZjgzINg1CQ>5aG4`~cVN3^6Vs#f2Ap4v_}aprD|lzL&^- zKw{5eO2W}b`_ZJj%QV&~4Z}>jMTyl1(darlJV^JLwaw@~N793eZr!k`DD6w`jh9z1 z$?^IV+X2oDEpsslpZyai73BCMW#zz*m^7!NymhNeP6S4++@vb@dZ4Iu{gt~{a({)C zPSp8df3bHW^72PhM))lVp$8k5yC0XEidPVC>PNE~?8a`Oc$2GFzu)<2#`uTyp1kuU z)DS8!dgN`lW(eg-bB@}k`D~tmx+D{_RoT+IJ{xt3b z^_z|E#zLz3HJS*z;c5^$h~?5`x=Ls)le|%KsSWvWTgxPdfqCo6BL?`hBoGZ!hq{a4 z;!=}CG_o9tRn#4|=Z9orayNK&if!c?Y|5ec@$K%bcyX$Za0MSvI1XLu#`0JARr>9n z-_8#(fSoN~Q34A#Y=tHjiLErBc*%zW08PHoMW+tDDOi8H12<$)UGjxQyrKp3WxWXD9WNeza>Q`znt?IqedZ=r~EoTk0CW6fIP~kM)y#GIMIqqL9t34-XkN`a{SQacfjKWllcNzga|W)&iFT) zv1qXcd-DXxf&eYScm5okf9+SLfSGMTi4<5AazGN&!b7jGyi^4k0#w&c3YJjQ8*?m` z220@tAdwKv7|P`Cv=~KNibU;YA_jp7P()3)uUU%TGNonv{9fW>TGLTf8Ya{xai4-xQ# z8ktl*HgJRMCy};i1gWYR{&1)m46NJ&Ux%7+vZH4+5(nFKBjP7WTGMK2%Lut(<1B(i zvJ(Syw6B&2JPRADb#{^(v$la7U^H0DwFNIrR$v9(q~iP{*s4tguYRvHoco%W_GV7Ew$QJtUgif@oMgnJFSV zpiqlMKp*m~$2B%M?c^<7dIU(3lUi^}!<;dkQby(_SK>W= zZv8+9n7lxX2>|K=$5vpLq{xXz2_&&$x`=H5bGQ>mI3@^B>=d~TsUQngXib zyJm%+&K8!p%69YS@AX0FRCe!Sa452C6J^x>sBJl!zcnziz(NC9Mhe67<-?=pFn%mJ z*C_1?_vRGFSbwM<5v&pAI#mInKxW{^jT;r90fAMyw|a>}PogNKnfQ8~>~aW%aqX#ot|Y;P3X}JD<*b5?Lvn2=xTV z|3m^z&{5Ib=y6|;RQ1LAWH-~g- z3zP$WR2jW0RLLQy1%bn5lWaI)2n9;%(i=v%bX9U(9Dkw>h?Ki;-fe=mHaNR#)hcco z2iBGx%NUfiG}RBoeSUs9jQ|OX2B+e%VG%8$;&9#`QYo6+)zPnyvs<2H!L`;XH4fRZ zz_4vf?bp0FDUpc{%OdGKz#q^W^Twv=q##gn9+o zQ@!Lav~C?KqPf9o7|NHEv#O^0!W8?zwC3=qqKbr?iSv#)aaPfb)&g11B}=3nYPk&{ zWvtVT3j}{GZuU^1fZC<54#jHs<3E}B48c|#e!t8C|6|uyX#Ipi*7ZF%ghNuQf~PGo z6+(I12uk))gFLLVWa}fN<5VHzM_yTmdt~%ftS~m!eAGSqbF61>@87lO{YFSbAD3`i zIl8bEO)Z)hb9PQY-h{14@qF-r+ro5`kPpg29u@FAQOZ7w$8mU>&#!M$*g3X{l?j^; z^OAYO-X;eC5ep`Suyk9z4mnat4&8ba9>oq8PBldUowuLq;$=$mJX-GTX8|qsw#Z{W zDV~wI(~zo7ZAV9KVEo2{sUT+tf)&OgFRAE6Z&G93v*#sWOvB-FGx65X4vgpQ`S>a0 z11=9F`4xS+(MtT7(Bs3y5(Uzy!omjqzTz}8!b=mC0BXcJxNd+Ydrz>=N#h(zJmt4P z8w^HXv!z}LRNEClvVP-SVQ?{TSeri3o1A2Un6gG(T*ooJ!C4I&ZlGD&& z>L!+Q&;(%#3ETkTbiXC2nViXCPr5F!m3&J6W}m;69vkF@_(y1ddyOF^Cn#6s3@JS7 zi?M>*TIsUm1|s{fHaLNoK+Q*v$010UpzR}N6AYkJKry~iaCAlC7XbjK5xX8^itVt- zDF9d!%P|?}? z>xP*m1P}`(GD0W_QCaKNTgjJ`RT*;G1QnNYO|1RNz?f(}Lhyk@%|cTL`Wf zdI~h-#TTL6Mei>QRt;ojdJsGw+xt-j>Sbv0yuNF)1mpubU*t-1GH${yV0+h$Sd%up zvf^~bEnBvHN{AuV9s1R9xW^ixAsk?r`bOk4#5~X)4sM(y#(?EZqkKsAFiHco@)AV*YzOR5CZo-P~0u;>EqZxn%jKIW+=@5Ae$L050sGH`egtwT z21!#7AKE1g#2P^#;a2kBMz%I8lPAxgGpyKjsCv^hIR)WRn>1VlY2Zr0r^w?7qw7ZU z+FDw*V$8ugctcZh&##%=8xUo5+ z2>8UYjJDaft51(ciUl$RzpUVBY?s72eMB$mFMA-r#1p0kg?Musi|jCCv!ixgrKA@r z)PaXPU320di!o_h6EQ}|iyANo%hnY|^~FM|t#c)ZKUZ!B{W;tbMx(jH=nJh7@z+(N z9@)*Jl4%)z+Irp+&*(_Ag2_C~@5;RIh;R)9&R^&KRTJc=gzAEmL%q`8mkz6qJKz*w zB6Nzs^60=ZNf0$b6N#T2o0yoGQ`gf*4lbA`f96AS8KGD}3#jS={$#NrA+wDRS0J*EG&CojVU!OzeC8 z*5MSC2w)Fun(p=V_lHAou)zsY!Y23DB5GRy~Glc^I@ zD-*&4N??Qx8h}Y0X}f_^&NA%D%qa_g@L)5r&-e1#X?9cqaf-1<2Z8~wVCrx~7N#T) z90nXb^PgPv7OyYdrVm`Bz!N_PGeh_+bfgxH{`kL|JM*xd_jc|7Dk@}XiL_Rz$SfjC zG9^ z@&56yWAA-zYw7O3fA{x$4d;1Y=Y>_LfbbNI^57^uPZAVc8XIG;Q!n}Zmt&*9z%r-c z<%dU)S9X0jnStn{;Txt{2U=_T<;P9g9iv;+>C`jF1~G|N_Qe!SukRnzr3dsSNf~gi z-zWcAex^{^{o_$l^BK97!E%wUgK4Q4v=}24w^-cqU%n9sx0}tdU!M)(q?hAUF)+4<{cBN-Abpf=N+P9;o6O;U?2rsy&_uo|L`&(xlBVxZX%f3DRyM z_IP}nIv})yVIlYswb|^)akUh@^^ApwZU6b&E!dV5jJ_YoD+GXV6%YAaRaHs;wT4j( z1ti31m-0cKQ7W9vv{Bz9&Cq7L7+k(5FQE&9nTn+4R8kJ7nbGJ zEe(!S^n4_SG+F{e;trsLkWL2sMf2fY#cBbF#d?vZO4dP z9Llqt{m$TM^x<~$zn0%0m=3?%*toLeiuv~Aip4+Cs8y?hiAzeXA8$SI`^I-q;;U@! zTNUlD;BILuFDVn8%4^oFxrQEjh|E)&>@=IPZ_7a*m+QCBCDxjTi{3qL%SpOIAdRfz zEUH!$q4@lcJHKeC(g0tu2G*LUlhd^BAdrq)kdxqPr!)XWzuxT!w?`NAq+ifkJQm_W za8(?F&E0c!u+m|qd~ESqz~i-4l(+*DQFm(At$TmzcQFl9UV>wtdo@7Qkcv3~<_^Ed zKjVfTai~oVUc$g+(e&(y-GseHDUoj-p*n4yRv?^S}h z#&++?#}LjD%fAeHjFp$AnC~V<{FFo7^q7ky8g!BoTKJA2C$Sy#xDhr)vdD^;8E1xe8V%mNwEluot4Q<|4I8LadVtKiHaZYGX1%es6yfM=r zLt0LnJJ$q#z|jTC(O+|^vQ&LRYa3ZlSvFO%f#q3WX@A7w(t`)1Y5a!qS|^dF8g9#o zO?tjTzlRYI?(BlX^~fwh>gzOY*pLhm*){3!#J<+Sn*Wm#7&36I*{83cKPMKsCT_j4 zVR@cWrcF&jv596j0(W23Xzl{ZXuoZ{2@yWqYa+Ed792|7f$ewf+O_M!!x#|lf+bbd zrjxPp%Q|ZYs#Dan?Sgo>VPYam(nxZDc)~Dx+&NVkN#G}l`Mm(*&e;!>S0pd|PC9}+ zzR(wp!4%UsqRzmW;x`@;Qs8oXxr_B-^Wni{=>QHLC)ol7U|7gg^tGqWga_ z4Ql*prjTvB8vF#6Q5@54@bljxF|l=IF0|)1rNV zwVziN*Cva%HX^!9(hc=Vc)24wPeI&9!((l z>|TVnPNhe%F8@RNM?&+)=wt7@P0U8LZ8|;EK>9!mKfebTNKN}lpG|r%vp{KF%iaBb zhmNsd@<(;;VZ1=`WY2}*?i8>w;{(Yf6k9^RVXi6&%e=x{O{2^R7Pl8w?ve|UmDS}* z)y_xRr1vdniq5CW+c$-rleA2++S%MZduP5wl9%T<81%Db=QD-XSa#W~p@J5ZVi_jN zDt^3qRA~MGoU^Cb9P+=NvyYks$LbdxTnCW<4s@ZFc|r0VdK|9>LIb0renFQmb3pR! zFaT}a;94+um)OWtC^D=oonNE&K=&-5!I5qzM$5#UH<;)D{J7{DoI;(MhHLUab6 zuwl7R%OrxP)hffX?>>FbOvY6KE8HQL~GxljtFi${BRpu#fNxfm4@AfG!@X2xdjCQ zJg;ioXS+C%I;8y$Z3&#`-#~TdY0K<)?S|F~YUMNO?z+{xkcYwVzIgX; zy?}&-dT?}~t;^nc#XKVPp1_kqWW&M+2tkD`LCoec|G`b&>H2&4spKEue-pz7tzXRsTbAR-e+kk;f&}J-Po$+pm%72%S3wpI z*D{$!C6fANeSy!mqxWaBjYAzplJHS7e}Iqc)E%LfN4YoHO6-;2GI(%bG}0#)6b@r! z%B=er<>gtUkxMTnz|C@;k-^gm4g1l6NLlao@wFd4%4B930GxN;x@}PAv#s*^UuR}S z$AHJ<;w54)`s1u7T@6}%NLpTHDJhl9v5)T#s!-gOiRFQCV?zp?TFf)xldJ|sAKdTQ zR6V_$-7+vdf-{>$-8zP`9va%rZ3Ad*?3 zQ8CJbo{`>0YW+e_61zGF1HTXRjERSSmG82*kJr|>+?N29TD|QKC!ZcNOM6peHRZ6Y zbIqjV-bp31ekll;IwpX!?w;FVJq%u&3+hORXM>iYcF&#zR!*%9MQk+he7Y-L|Ty zZy&n(*_${2oq^Vka!crw>Rf_!XZBtBzKF0{)T!c9D@H6!6a4<+{V`4N^{!2%ETdOb z2P&`My;<)&P{phH*v~SFC}V}j@BUNGRJKKq_PU@@_fs=eT8%)-55G?!jnt)F6FAN{`O$(eEX+w49Z$Wc>H$zKv6>5 z=nX-(wzijm;suo^>hC3vifzsHo!d&Urlz{>un2Xct^8h*{G-vhSD!{SSeo_iQm5#O zzH>{}&!z+I-H-a52`c`{>$`9)Rs(v=Y-RN#=zWI z6i`H|%wvvs-j2RW@pN0YRlCRV#M(`oj4>$mm_Ps8{DYCf!FGP*T6d~#G#n#Pu$?0# z&wMY)Ml-aU6IlGz@u@$mi%hFtzijZB+Caqxle-V3b78k7>-}v<&S zdy%}NSr~xkPNY$+D-pa-vQq7Ql|1*_5jB6G5=Iw{dHMK%M*~rsZ+%^^n|N}V1# zynd)UU51hG?D~W`^FFu&A$%~#_9vPd^6c!6ZHkC!E|M!6Gtt*FWm0tthdZiK zU$-;3o{J_9UQS>@sTrxl_LIOEq!WZuBE}2;tNaW_!_K@<5%8ajpZn;-XI-LylgSv7 z(8%Z*VA&BzJ$aJAV=rMB@pZT8{pEFwZ|_(9xD559GNr@e<|KA_v&)EJg~yerK#15! z&~0MsT4S@VF*~L@@%d%h*H4Y@W#%O^G58zD`aC*mj^GW`PI9KvRDk7=66-NV0bPvp zfF>3NC}3is!>zF1tHGf}oDK>w2>48q?J(ya1jA^-cc}mzh4u1oOri*6<;}+>nG~2J z905xGh4WpL9EKar;Hw(y>Mxmh6-pB+GX?stLn-=-Xb(s{lf)jgjgHbKT(=kLUuKKR z4BIU|+ldkxAd_JSRPOsgo$yXbr6UkU5k-u3)ac9jsG+(S*)l~?i}9_ktn`TzU9V4T z|3{A4{_Gg5^iU7c3RqI2x^3qDTZ?{FnJ;;}w)OD7Q{5sRA5)8pACy$L910Z$5IUo~ z4;fN$6QwU@atR{}Oo{v=(_gIa0Syks0ueStO%XpQ-VB!fVw?tWa0OM~fjJcY;%s3u z@xr>=joRfqs{{9nyaXL|e=P%Av7S$(0&S$XXWW*cRddtH{rZX|?!oAhfbedTn>a!Ifv>yx}*9 zl=dQ>oHmWg5SggH%-|`}_%Q1L9z>512Fb0KF;`7n{w)XOLbx<>L_=I=v9z@1t?*vK zT$En7D_i7U?xU?0^neNU8bclSa10P+*oneb_Jv4^M@u<%*9EXI=l4=~LN6;KGOxk& zi!z90&Z@_RAE+5b&kW*pVB3Zb^_3|_jc*L&9>qCZ!OI4LH#2H2y9Bs=Si!A)(2d%z z({9-W_8Ckp6QS+zySmp!{(Gl5VQJ{OFm40exjJBD*I`T7m)j$K4T^ zt(Pxf9;mu==T7yY!(>qGy<}MKZT5Bl^XI*{PP;jgg&v~V2efBK7&1;pvCk1H3+3qS zu{{{Y*8*r@n@rul0~aqumVBVBLBT45j}24rHOViR4PxVLQa81(jy^%d2m9`hdiz^( z^u~g$p*wc4zKVkfYr6`$sEgQpak*sbuWQngBjvaE{NBntYQ7^tn^5))(QI;?h;FCU zC+9|?V;dcd`7c-9t9b;`iJHOw0oUlysE)2u%63Lb1yb|^;BNWb;%T>59}N4axpouT zed6&=pVnhrVR6&{MN3kjGbp>52;ufS!xCZ_6u;S;QQ#C%j3En#PTkT7X*O$AqHIY=3P@qZfQ884F%>B`xhGV5-bzIxOdj2nqY-OkGF;8_oeaDkRz8yay%Mctc`S?2Y)`K%Qu5atK;p|xpIaq{2SzQ!c;}c?# z%P=;biN=CeK;&$3b_I-Sprf-2>tb0KCAw_5R^peYB6gY(dLJH5ix7pGsJkZ28fa-@ zkxPYek+Uod+e9^iN#-5fyY!6&^8El77E3-DV5Ya8Y$U!6_B#R5WYD5o`tj+_mRZLP zL)8%UwL%jq zCM=1S0K?gVfPu2v)hj+ko$Ls!B!7kT zf-;yO*P>-hn|9OYMo3{Hzd-~l{1u*t%lf6&8%dFNiQ1T@eim&170!H18k%6y5Xs^e zG`zXYW~WjxL{?F;4g}JYy-ZM#;Z2;tu%y zCCs>qJ40_1#y);Z`}=O4Z_{IG_!s@556o2*{WqSPXQrN6dTYVRkmsekt$#W)upIT+ z=?6}W%)0iS`1X7IXn`kN4c(bb8^$&2l2BUg`j_X35d{(K4Q2<@HuEks3Ws`cs^~lH z`Jl?Gs_|j-wDzc+G(GJXd%EkCkc-!Ck|R3?9iI2C{E0it!+ul`a^9AeUTZ!5=~>gn z#KhV?XF2>%DI*-=XZ{wH=|r7Hi_%k?JdYTs{=1=LZhXb^%kI0E`&&n+S1CsA%%Hxd zrbGXV+Mo|AZu95Gv8k!4Gdeyiebc^dV=H&Nk=O20Fr2#Ce|f_DxKOkHG=l-Ih=ol!q2N$z4bwHKesfbr?dBGpX$}rnn8z8lz6w9hNI)*l<8aJ zh722Kk{{L}^yJ-T^&1_EJX8A@I62`7{XrY&9)TLWU-BK$XMHv&bcVo=lXk+!vvuu{Z!AKc;AKkQc?S&9Yb zM;{v}EOGa#8gIHb0&0z;WO=nP?qFo(3wAJBlatq-3jVpVhaXMZbxaL1?98`_j&E>q@Ewy&Hyfv9W4bYtC6UXTyTh);_4%m$%f6x`YLn+w-tBzr#5O)%dQi2e zFmIw`(ZE8dqce}pXj}IaZ1PRUVs=$im ze=4L}@X+Ie&UI=+8VA1CC)x5@>AD@%FEVAI+;O+Pft?Umx~Tj6{1 zxtg^mRD&y0L#laWA+#atE>jg_S`dgI4{eEvZYYn&7C%Jt%I$PP&K32e9`HfHqnCrJ^;%g*3Q?7)vSsCQ$tCl zGE_kuDFRFpaPs^yh?bSvxg0SWWD6e8yH1xk&2!GXpaI({4J8AZ90FC^Rv9BDYRJK+ z2HOWdfi7BDOM%sooW6}d8Koe^g-O1Bh&pdwtdAMEmhYcTB+g!NQZlqa)u$*($^jc) z`KV)(yiPBijja$T3Oue(`>!>pQic(e20>16{&KmGuyrqKn$tvCjQ$Kp)@Jr3;u-XcGLV4mL_l-tqEBzZLfi8DH6L-HT?KOHS7lTMKBd z$Wt@lsTi&je-W^gqYaGq*JH(u4c5*~ZEV>bzP6saZx2}5bq%b)s*91#=`1Xx`cbM) z>CwH+G_Y@()#u_ghq8e$YFY zX23H3w+wkNe-<@klxhF1w`m^rr#LR3oS*?y*peZU-ELpGVF7#ymdwarPmaU@5xw!6 zZf4YPa`f1R}^ zf~&d!CyL8F&ycZ|f4*oY;YF5j(hkYTV^f_iAl3{WVEzL0KyMdr0uNY=df0dNZ@@$ zm9O|xVHiP#u-{pF7bGnKvJ{epLH^yee!o$4=UvU~TqYBwwvJe4L~qrKci3)@dv^40 zanp&cz|he7>Ws8iqIP0B&lZMPFyP=Al=p9^Br1R>ze~R^Q^-#fm;UiM2lz>jT9MBy z%goJvSe(mm8^rk3Xu7F>s4;B)BkB%Ve!Y`TNrFa~o>(=>!c#g&Z4RT3IC7OY%Jw$s z>XT9ZH#lNOObK*EX6;}SY2Owx|Nd@Hh6{A3&QH)N{bRY|+U#C?&Lxvj+hVKKo=e8M zRq*_A&I|1_|=RErJne^Q> zdVAo1ihjFRyo)}klSzed8ok67ntL&p902`k1Ap_;a@*eLYQI);GR|o*c+v`JCzX?s z%J(n&VH*ypyyGi$z6T-#{tBNo>vcs+@#f^SPsz9JsjUWrq#ltlEH)V>XuN}nhrwXQ zwG2=F7$1TU4$f#&%yiHNi}uid-Zp~a+w5;HD~PKvk=JHE#(Z4Vi8R0= z>Kd($jn_b^CPw|G8+5~S&#XmHpiE^{TMU(eosL5LM~e|h+z$?^L%n_RcT6`f17h+5jf}Q|Vi6peU|@Yoy94CVQHoitZ?e zH<5pC*r3aCZ^YARWSuxpJxJ@1lXaE6moIGqI0CQ$0*6?3X2r#sa;U#dx*b*yx*=8L zJ_=NKvt;*`7d&N(el71J7)WR>7<4ca(6t<=wdhTdffxHw=^4>ni z_!CZp8RY0Mz4ayJBQ(a22)4UsJa!8lUHt(*9%BdA6p<1sUZ)a7SZKyKU;gcCuSPBbFke|nZGCR+j2&o_$k&m{nY0t*wx6AyBV5$g}&WX}j zsGZC1Cu|xXd`x~7HMx2FA{ae3TL(XVbMAjk7GZ{XHx=IrWRhvT^OG{P6c8{8GaSVi zH8n~VL3gq$yL4L7Up@Lni%fGjvEpjAX$}7xnVP#uBJg=P27@?I(tGFB4{*aj;urrg z9htpCKP95M;cr))>h67cIR9l~;+iJ=8V5EiQ0bmA;9Qf-Cq@sP;a~Sy-CBQXj2@=- zb<)jme&>8$^~V0za_;vUWrNmsywufQ=S=5G>j!UKnfIy6fBy4f*PDA@eO9@=clYkS zBhG*Q?A7bp$!wo@W&JTCFybDtx20t*NO@`|uT#smo!zJv`03N9AuCoSJB%8&=F#k} ztb2>-nO5j}w4#$okydG0*?=jpS8WGoweTr*pFTYVm21$=sbvmDCVRbp7&%tNpNNSW z4*qr^A;H;o@?+^bfd3oi7_~;J3 z+tR=wrS2PPdG=}j~UaZ;^~47pllhi!d>5-KELu!Rq(j+>c}%%toJVUSq%c{dO^^^3{%W0{bL|S$f(Mk#@hc+a4Cy0g-y|#RE6B@4BQoDt-zuT<h!xOwZ=R{Ac>=(iP)mo>_<6?De1J)e-X(5ig6do%Zf^;#y2tNOd|<2B!1OWAff zCt35k1|Rd~7cGmAM^dM~yPx&!*`GIV{GMM}*aAriiDQtHlitjkGZkgver-0^04!bt z%&~m=>2iGJk*KItrXD&|r(d1CqL=b;*SW6#FB%#q?s!wB_U>ki?%|w1DHVJ&wRagV zpKCO+Uv;Q;X8Y5a?7(rXy=(H87W^7HvT25okI%3eJ$?Pn7cchfvF!5+2S-OcXJ=L{ zu1cq~8gy*-Hv3*`_rK~+Qs>=X(&8Ifr57@5NtK(6O^uxgCxHTF7A^cx@ngj`^Jfbi zB6u%(;+}lbrE@ORO^dCXH~C`L)xsi(fGnf`titX$cIi&lwS2{Y}?)&Mx%2b}S z(se}A3SYgD;6K0LSh|!k=+G};ybfi|lUR#_!O+Rc=@j0EraOLjHT%_#wN71-^Dbp{ zwCU|R?(W;T{u#g}Y@CdZ{e$kg=Nq4Ix<{wU7kGnTF<`rV#hukWn#cSqZVzq%{_DSX zIdl4Sk6sf-jx;njHulKq7@to2(gv0+6fNrDe*OHIFeknQ2L&;`?}$Z4)9lJpW6S9^^Lnh^Dr9#3pc#Q^ElsV->PdprxAN|7&8I`n7y#f*e2 zL+>`w(<>Td&I7yC;kog@JkQKFB_C^ianzmY--bO8;a+drQZddy&f4L|L+>6qe0VSt zBV&Qx5i(~ixZSHYrTd4<;wDGJe?G8(eC_E~i8B@b?uom;((h}t0qW7o$*b??QK6p_ z+d!faC3Phziq*)2WB<*M`(sTpHBmGRpifUfopXU4G<8?KAz!wd zeC;Yz`_6s&sA-7fRCwThGj{SJ?RR-v6iPUVT7R&aHQ>@5|)sMhtv{h8-#^ z+I8l~zdJ%nrr|kiOWPtMVnDF3qoZ#4l9#oHZ_CrJJ{W&H$8!0!(my4ZS1;)?@~9t^ zQ@vNvCi<$1YzrD}s$UHf>RkRm{xNaFuwnJseVkj=B`7Fb?|Zn3Z_vGiGx*v%nV1Y* zy0nLt&&@AkVfqUfFV2JVtC-%@#wI$2m$f>&fB)qYZ%@x|6TFIy$3%_3YMC^le$s^Z zYqEGDr*E~l2U*Pon_1s{{~gVtcf%eOefpw3QH3?>&&HgYt%uWuOksmRh?`YXQqq{j zC8k>HYIu;2aC9vE=7)9QX}8#DL1t)S@j46p2LE zfgzd2pO(DZG0i3ZNeQ@#D{oiM{{-*1-3~c-8+w`AEi^oQJ^E8%Qf#wEp#b)zC({rXpY?oiLL&d-m^F!vt7S{4e^F zbaN?I`t!XAr%vT$d4Fc?Bc9l50-D3<(XPy=oMkY+1eNk68rdbB{u8dLwb9pS7I_XB zFo08)LIoPSWlO-I<~}-P!2Ka6+T+Vs1*O}Gu6W(Ryr54TdX;at0<&CSaQnLK{bpw&tUE8HnWj@#DwePX_Y54BEG^gD^+bwth0`aN&u(c(O1u#K${+je$!es9%~%Mi94rJ;&e-ASUz7q*o_SSedUMl=-pe-@p8 zHe(n2-9`1noEVh|4!wUuxZiQ>wt{N8#a0@*zfQev7@A;&Ds|{bW(eh32ePiuT%0`-^io&JJ~~GWUr-B%}AxrlXZ~)zy9&Y a4@K)^%RY@=_MKJuXUKqIHqq8DEB^!6VIP$M diff --git a/development/_images/sphx_glr_example_visualization_002.png b/development/_images/sphx_glr_example_visualization_002.png index 061eda077f4602ae6693fb708374030271a2e290..4e1219c4fc798f4a0edd49cdd052773e900df46d 100644 GIT binary patch literal 16987 zcmeHvcUaX~w&fKw1`H^oB9?#(2nYxW3aE&95kztZm7FCDl8lssgeyUbDoPG2Ia^vH zh=?S~ppvs>$+M2#^LpO&`(AgyN&n3ERW&8v`wQpnv-jF-t=)GooR`@^zmuLqp=_X@ zJ*`Bc(0NfP%f7Bzh2IEOwRGZ#sDreIgR+gWgYzXjBZ~Ybhbxvg4whz@_c|Hb*_+u| z3-Su_9zL|!)WPA3y%-;#)xUj!*T&9-Ptr|=3l~{?<*cSXg~D)&{JSh(GR}-bIax|Q zeNyFW#89h?+j*14rO|1gK-Dez4J&`E+9#XBVU}<~NR=l=$wE8DoVi*$a}AH;`ZJD? z!k(H6KIApl%2ai@m$)VIPu_!y=cuRG&<3Wx^@r26x8FVFd^D}6Bk+CXT*QD*kNqdd zxHj=-E5VW-%P5rB0UT$G!S zv=n~#{ykHl>-fNAy}r87cAf~`RS~|FHH@!(J=q03jvqg+lBOrVfkjNkbAHr2y*!^I z-)X2i$F^f^lA+xs+C7$8(3nv}e&rL-rA02)#Gv%@93xIn&YdFG5tlDtj?k426m#ee z=>GU9Mx^bk6peBF_U<1dp{*T0d-lx*%N((M%4@C? zf7UcFFN$uS166YIXN<(pugl%%hO%devfDemy1E9(#tiFIb?^E5s%U6DG_Ol^Jm>B< z)o4Qg{s=DU-6v%6rS_cte(+RZk%FUF=7FKQLKPJU2t z$1`N>{{HcNiK0@co~vsfuYS?spg_d;55e488K!|zo{KJX8M_o#Ub}j=cf@lke~;Ub zKX%_7y}gd9b7&}Xz%f53r}W)Bj!Ge>)#BHtRQ&gdJN)>1vMyD(xv}f@+M_GiA1zzX zaC~oHQ(w~hbxgb}HL>zteSHb9jLQ4*0<~2!GAtqM)~%~)b#71L(awt3&376b8>`-B zQ*f!+$r^7HCVnl;ygrqOkB`rBut8DAe@`&~nXUWfE@Yb5b>d1gdt6R?F3!YBwKqm? zPf|?^nVlZt>ucg1+9U3ImNs0xsA>n~ruvG$Rm$yg=>t{UH65nf(ie$MDakRr}YhFzDew{UqVU$%dwzrR0O zn#g0$Vi}^g-*2s2zvD6Dm)si`2$?WHkZ&Q`j);vccmodZVadGGJrbL2jOit3=J>3^3>s^{`a_q0H z*mQ-4H#$p0Y#yMx_Cz{Qe9^W^FsY1k?S5q9&|k}05hiqQs3}v~(lS{#l-Ejs3a6^S zB{x0FZHzkES0fY5rTVH;8)1zoPY%^{rINsDbD!3o9Bfo(IR3*6>0zSDBFzlT7$#&9 zvTxtM2}EgU!Z6;VuPapllY=ZzhhtlT3rQ6=)#pRAT+xi z+<*MB+V$IQritDd|HNz4!?eYbBRz?#N#w|H*m3y8;^Jacu6^9%sK2La&!@=QzPM<^ z^v1CQ1~xV}A)K8|>sGCf_x_>b;o-toP0vP(m-JYUIR&xvXuLSFFgvM?)39G5Dmf^K zk=!Y7q-c(D*Dedz{P%mV$sKbZu06+B_)II)ysxwD0e%Gg?G~kV7_HhRY#C5tto&fV zy!9o+=Q#EU4R7Ma$eV3m z$2HkscW$UTJA0%jC+BF2ez6|T>jQ@&Q%_UVc&tb4A2(Mgow>iW>BXg+`0@PKtrZmy z`K7jTsg#bU@1=TpcqA&v`F%;#M`E2!%gz|N5-v!guWQM*zt5hI&9_Hz+E4TlCEd8pR3CD?I_Y+6d>7s^{wQBe^g=J;WU z!AEs{cO&*k+3g<9mlnt_y==5J#_r&4m?Kv+|3`BjiKTgawlbtx zhAFe$R&P9}Act(wVSkC)c-fkrAl7|tJ>zKuy z22F3=ylJ1j)|vPGvgOjxaDoyqJh_pmo|bwb+6^fqxH?qdBLN4epOgkvUDv6>1Uyo+ zC(8J?9XsN&XJQjw!^5elErz*Ki0RVG%F0EF4qFEI*@?iUq@=eKNZkY2@RfOySn#R# z%4o?nTq4P;IZKvGtr~94A8*k=b?QczRdej(!d#MN4+Y~Pd*9g?> zGwi40^L3~Z$X-D`ljoFfuG&zWsLDMz=j%TEdO1TpqWw`U>+!3Hm09r`nM+Z&^wVQq z4}3nnI}Ow+12i@8%1 z6G6xp$jc5>gN-^iOYy8QZt4O_GaKBBzO$D)kNRp|Z zTQ@I*S10GOYLc2!vvC=XgM8vc5NF2=g<}rAk25lkEFh3XQuw6Ku)f$&Hp&pUz$QiM z=<2E_C~?%K>9;R3^c1)0%A){cI_}ZSoAW!8e3Y*@FWXouz?^DhV{L zEXxE`3=Q|Wso>(`CHd@%mMixS^$asv$Me#x9Xg60qz)B_FQjZ>7C7z0#HWV*t(s}B zN-!4zc5&w;2d$=tn&W_@>OAhZ-?vT{IZ*O2JnBD#wb+S%517HNgX z#b*m&beU+6SL>flJHTf*yWa3QN<7KDdM;htZr{2Uuacl7tDvBcM|!n8^hQILuLsj1 zjR2#7{KelVka+4cE!5p7>(sSgUcTMtI>19pW4q^)yI=h@& zX@OL<5cx@DpyLdHc@Xc0Nk~(6;Hgfn+CpzB|%}W{PI|nZUrnor1=`?ye=9^RyM?&a(hQSpb~T zuU%V~b>D%fp|hK}70YajSlB6Q_l)c#3ch@}usksNN2f=RAMfSS$~b%X?%j={5-o{u z8q{6Bb$7?6>gFfnI#}%bfZwE${8{@_vfGq^(^PR2jspkU9Xz|cM+QDWkuq<|u{{~= z*Sx--Lig^(^l)p}_wP?jOH1Ws*81{4+9Ro`0WANZZ|76b`3}}ceiY*ssk`1@E(!D> z$o__!Xaxq z|8w+_-#w$`1ILf+6crVP9kqR$s*_7g@K=sIPt9{O8F+p!ba!`Mg0hT+goLcTe8o#Y zwG=I&C3Gh(V_7YFwFJE1YTi@Vf&1Uu^OA{&PI5E|1V}VBQp1;3(wsmV~M@I~DYhO8Eajku&c--&5 z|9&d1^J)p(_38o@pc5c?G;6B~zOs<6{@CgpZK)6j&)vu;3Bnc6bhZHA-E){)x62OR7uHEyZ z#aW9DtP(9AM|cjPAen!Dd>v58GXeRLOFJuhxM&ZOMSzrq$1=W0RA0;0PYaMSEyXx7hm=Os^V$ z;iQb;?kbUXw-^A*-ooj&nzq7gbw%#i2%<*`3P7nWnjbs2fR4m0M+hB_HTe+>9>1$gJ6OX|BB+ zHz%m6q`A3y#mbeBnDpJM1{>4gx9vZ2q_zcU^ifE~RksiK{i`*A%L5HV4r$ue~n0FUb(LKH|YzXrK8-J+h? zTbS8@s`P5chx^U03msywXsrep0UBuuDeU9lefY%W%FWjc%#y;>*YGlCbZkrjy_Eo< zV#UPIpz)r{aDszl5o)o9WwiZ=4}V5zzFX7?j`$LZ#&1KcSxqbff#3M|l0M0W;7amb z(b3U;RWaV89`jdYWo~ymvU*_8VyO@I6C{RkExC2)P8h;QG(!{XvzCED1kk(W?c2At z3Ciy$M%vrw$IAIib{L$Gmax)u8gjFGf~&S6%~xZ9z8Y&&v_+a{ zM8#KimkfO@FZwXde^}F9@0663ys4?FU-L_cKBbzM1~SSoFH3iHcN?46#$Q^+u*Y)C zmMy!RA|*ZBe0K_cz%}Y~a&sRcfraDzg(oP-g#nf|HycfB9xi!!AnNLy7W7@BUv3@? zuXwmGM~j(qDA99iQ7g|Of%f1*r0xe6lIZE_>8o*xp}5+>Li8;M_wGGWRaLcnS;pbi zWh*ExU$DI?KscOSTpt>rw`@25`0xpcg)NJR{MfuG7k)oVx90KD?`!rFrVdRqA>{C@ zzfpDHPJYh5J~83IBI%)noaSaLLZJlkpFuHE$EK+~J>BNtvzcPE{JlS`I{KhUUC^2b zjs5nBC*l}%xrowzwc6X^^9|Gv7b4_<`f>^-f`^ln3M`y$a;sn;rEQhK`MKHI*)5<6 zy;@WBc9zKFVg3a|@V~$z{ujTZ6RC?Q%Ml!G&Q>7R)QS1_C#Ol;ahiXxQo>Gw)IE(^ zIxkjkY02{O!%4oDAbk78ue%C*xy*jj7oRx!n>a?q$6$+j9A*sED2JO@? z2`mOL#&z^)Ls=aoZ>9aU=d7zNs-8;cX^0Jc-o?ZeC*eNJ*v$5nT=v36;6cYq@#&-a zzHb~0ZcW@|+|9_Yy4Kc7DEn48KJYK`t)G<0hq#Kaeih>xl*)_k4hNe zqgNigxw)ytoY}C@!MapBw{aCheeX)w6<6>%J4eSl6o6!OL;W_MbKxL}*{I~jgsofR zdwWe6W(U&xk(~&u0u-Hqk`=~pa0hK+a6rIgPy%?>vowH-r)#(FH$~LU0yZ+TvZkT^ z>dA{;S{U&pxDrP<7W7SDjK4&6fy?;Br(+{WGkgH*E2G3G@v{9-y!R-Lv=vVFM0?88 zHnNC4LyFe{=Bfc~6T152;{841O+}XHC(l(Qan~km3cf2TF)t1HjW9DA03+J171)^> z1NyTdFV=3{D2%Rq$}FvLDvbQWn}JoBw5wmWTuTOUwH)bn~ zK#Id}0ax#{+oLZ!G-uXcRQL#JNs4vd_Ctq(q_c`c4cpwt<>%%)I}O>&4(S)Q6tN)P zWlOQf$oPMv(%uuEm?JPUVH9a#i=Ki5YRQNNWV8T%u~B9o-vm*>@%-7d zQp6Aqn2c@C&Bn$C1Z9(g&`4vt3_(m%#TDTq#eI2#I_=pN#t({%J^kWd9*_@v27IeC zjnfdov~njU{Xs;;A>cAA+#3tLaU9hzc*qXS>jf0-H*epfquuvc#G;7bfP;(}aFjW7 zhA?T5y1|t;c=Bn!diM5sc!e=T_)KtpkqoG&&1`2H+7EDWBml3hR9Z)&oVdQ~H87oM z!4l{-Mvw*j<--p0@W>xfh*Ci(ldkinqC(!x%xq(g(@0y2pvk9$s2h8{JZ8E=kJmXM zVl4Hs}lRPi*0}Y4g$V@4`fEqSzZ1Tuf9Yu^P52kC(l`Gvr+zeTu(H1*B30!l(g~ zK0pmS=A1e^HIx*{CX)#6um4L*IDwQqh0HOQnW6w&KRe zXRYaSw-x}5=OIp2Q*}fMb*UUHSA~u&Qg=I+Cu%dr9w*n`6+#usD2X6+NDGJ`U4yUi zd}GP4=`NPk=d~t)txg3|b1Z*7kc1oe=U-Lm!u;m{S^NvILC0WsH8byfkt9+6_O^r0 zWYJ4W%^6|%$Kv1L6>fDCCK73$$j`KADcad$xwJPuF4k!`INlAlrT84EPPg33#H5}f z-L?5wnQaEO#X+ruy z3KN5tgXy#x#jAP6vQ0ViD_5*I_%rGnWMj%#;XnUHFnZ7sk=T^yn53kn1g&^K6Q7>L z)s+;D<;yl5G(;*=gM^uRZQ9x-lty)PD|pLIdA*YygZ~WgI$KhF@7@grWXZMfu{Lvo z_MKKV%hfysmUlh7UxDn*@HQi z&j9H`$;z%&0G*VSR+I=0_(OYpd(j5G!KVxCab5uAeCq1zzp4nN!NsZUVzW;XqO@mt zC3BSXdw!5uiWd_>hsT4hX#&})m2I5@wZF8!UVZJ_wIJLsoIZVvy$`HH*x^ez2xo$I zmL*{L$$%>!0P0}+>hg4xN-kdB^Vr!8&tq>v&p3cp0*d6W87nI*bN%_vyYBJH<)o0~ zuIcr^kyfW31;B<{jUpHXv)VWc&T}%*;%gak`Nh$FVD4 zPt1)F!LS|re=Dkv?D_L*2};ie>NaiP9t+9iEN$W~gJe9K1brs_bx;pbvXM6?XAfQidVrw z8l~Z%f@Q|L?=}~?=YNV4PeMORtwvd{eSGq!+>n%%l#pe^VQ^!z$l1z>WO2&Iokz|> z+WU-93G2!OC?MzzDCwxBl(mp~ZRt1nt`EWK;<`Lo0eK}uL&MZLnbD9@@q8#GoB@kr zKSMuD-8|R#bF_n=Ghoj$idsi)_z85~gqTDDhil>8B|SBnQ30KtD<{8w`$o^eP!DyT zggMzA{3g$B#xA7%h-JeCtX3VuB*VH@tZ@9(F)VmJnv+Z*Wx`{jXz_j?D!=f`km@}x z9A2?UBVE9}_8*w_!&z)OZOGt zfZc6N(8}r8uUEl4!J82K;DACR6dFz50RSgR7T#tA3?cd$w{0_GI8zL2%TK7mQkZaN z#NpsH+>$UioUed_2kx>?hSmL|oZA!SHqGR0o#vq8c7{U9P6pBtwd?$yXx@+mdV!qklQq+^ zHivOG6p*3S05T@uG3oaLddvbQ3PHYeynS$`gf>MEPr<=u?i5;8foeI#q-NNSyR5UuHsH@ zm7(|eTIM!Mx(niQASN4hkK?+#D347$MRqaHrQIL}<&S-UL=+9VC+#aEMu&Fc#s~NO zJDTX<99;(uPo6y4^vcKw3566uW_{(*QF_XYRdF6nhcB)~XssNZFMbm+D&)wVMxj`I z{R{QW<<*HTN6)&MFNL%Ao8vO5}oK2GlBJ#5^b6 zUc0XU5z3`op>-w%SufOkY1N%*g4pQxjFPJ%Wxb} zL(XZb8h|;meiP*h5!%2$BkZPG3W24rZ1_h6ncqe);`V}4V{O(5%VGj31JNvIxCx;R z*jaAbn<$7u3lXZVHBs4$YVq0MiIjI{ruEWA&Hd? zs6iY5nVt>nLk+4Z!a!am=!`2BBAm?a<0*b;_VFRVYsY<&jH{#H4-J?>#Qy}V z1HMD8MoCsFa&z$x$U`-992Yd^Z^|-xJip`-@e*(69q`M)W4!c zEZopIyo4#g|Gox0Cy!@WPSY!Nz)$VQOzh%}l4+dR)-7A`8&$`VHr-!REilRj+7YKg z4e&4WM51Cxr(p`AbrvjSEqpH5h)JT(z+Zenb@uB`h6xz2`cMqwhzvu-N-!K#SNCn=MpnlnL!WOB_%LqDM`!v9Vl2LUja` zaOSt_?B&%fI7o%Fu{^8du9P?9{E|hvjedP)r71YAd*`vM*yAKno#qWMo&dPkK@SmM z{MkW@H*`(%7~*q-=~GiMZ3IJNkzxg7JX?H9SGNwVr1wSsYg3l)5OBl*9B`|6NFzO0 z)vduwB0i4Tb)E$yx>WOw`T$#ddEsY=|14ky@j@br80T6dj!=bXTFA?-ahOoTQdQ#96rdO!3D?-mO61 z3KBD?o3m}yVJO+g$oTBVi^FK9dLiO9?pfeo!*MPoW63(bkzM!L{m5WEvDu%$Z~g_J z6Cs2?sZ&c*r3uuF^Y*mJ4JJ})Rq0ne+|vc(cdY@J1=VntTU@Q zLtKKe7pf2s0N5RL4OKXab-;nULkR^~o2q+^TJN`saGr?1V0Q8;K+-Re><5P!b{`Ee z@MNxE21%@S&lErkkmGYSK<4lQH1h7+y*nAfoB#rCc&jrBq3eZY?9=sdAJq8GJ0PInYgbaJF!9~y!(9)cvE zAsBM-p{(o#*n%O?6XZ%P(2vfWA^kG0zP+8|?(RN`F3J=Xq^zv0622^C)pUe-HEFPP zKgZ7Z2CM4@qR|888UO9A_pyo1SU)g>Bx?}S8eJ^OK~&<-+_r0165$ikXhJZm#s*}- z)3JL1W|unnum+vy;Ko#gEd80)bN&fnr%8UxR)ynFkTrYj)b;C-eJ2_W{QGV*>3xPV zWzZ_heM)mqem|O0_%wOqjxM8|fW@z5hY6Ey%+H@!3C|%cJQb^-X}l608d>Sfm!CqA zSXZ!w2uLJ#4vpDVoL8~G+7E`C+v z5Z(4xkRWL16|gM)z0Lm?fMEt&qC>@@KhJ9&fSwks(YE5oQ+VK2J1f82mxwK+ycXIG z?ed=*2lyN4czg44AUFJCH1?skLT#pVHWgXA(6tqVaV2Z8f4P_&NZU^XYy7xjYoLhL zNJoeAPicsb+NUU|Q#0Hh0*dC9T=`}tTz&>syi9?VM7MmoPdu5gYHrO6eM}Xa< z`v(~8KOQ}irRIM9fvKEf%M~YjUthnu5#7kwPiH9qdEDi)(Oo3|U+DjHb4cIBv|=`? z!?%AwVW{96vUlP{?9+w=C>lD9abMRWdRXZ865z>rmZAgc9;x6UkQVaJd3fPJ-(FW= zq)d=Ht8H3zb z|6c-eI`u~#dM{YDy~cQHb_<0x7exr!qoR8L*=|y;33xAe4ihJswKg)C{zhFVIIP;HoOEt5Zda{Wy?H z?H^Tu7i~hdrb$wzAXG(v3a(xpwbVlGG~X zqK=C;I~M)??$iD9{hsvV5m=*KIs;_}M?hUwytwohR+`-sZVfp(IS=825uK=l2T2el zkby5hEMYKELj)cgNAa_QpUKcuAO2E7qYsR8b4luHVJK^c`EBcAtilJOs}0o<1&yst zr{F4o`A|N5H&i*fjHTV;uC-?c;Q4ACelY*LTTwp0fqPmZgpSL62owFr*Fwe1UcruK z4yBfqs~6AX!a3M^Gifx-_&ych$rm1+jDN z-`|g0UO>6g0p}C+mq-A-bZwThf0J>P>uqbk&p`av9a0L@u9iX>pDis%gHeX zO+vh$L~6qmnN9Ro%~pCYvQcM&56Se4TzRJ&P84F|2r4z{8{laP6EM05CN?Ok>%qSf ze1=*!;9>@g;exNe6oo#9e}BDW+sDZT;410|;p2Wgg=8UXz9?3Zm9;w>3DGNnb!MYi zb><0Ry-I%%oaafDI=K^H?Vp{M^*`tn;Koqut5?ad<5f8ZD6--Ugl(5fOR*{CR7&SZdGk zFt4-owA(ZQNzT)|(Kz3rg zzmcISlsUu8HZEbDnGA_k>bI3?b!|5c8hE*AN%Cu}0AdV8+5jY=U zbm+f(Ac{Kwq(K`vqC0H(YyMW{O%%E1Uq_&~VW zJs(ikB>UnFLt8lYB$XS~F6?JSKuJrpxjrqqc>Dd4*lP3pOEEV~+Jg<&of7}HW%`}%Y=roWK62jF4Fd-MEQR6M#PyLoGe z)3wVj)(XyJIm`wQi}Nldk8sF#F5HvwgKZ9`{U;Cww#~W%vybFRZsNX(5BoL`-L=gZ zZ%ycM;+9zy_@7BHQ1upr4KLx*aCYJ>U0yOY^=D3N)UTU`h+ESEV7=J!AHw#(z@o>} zAEU&zkvD08D#YCz?YSuWe(GGvA;k+90*H9`;*t~@Yn4{vObrdSZH6Ob&$U5*GKQe7X`ZA1F#K5W4GBL9CHXHs5IzT+~17V+_I1)mC<+|;RmoiHO z>OI>9PRq!Y8>c6La=)#8kzbmU;pMq7pudy<@~sj-mL$@+pokGU2IC9qmc^Iet|HVD z=qV)(_5sqwTDRu)K?3If{vm}Yts{g+dkUWtHFuA;!dBi#!=*GzS(Z3@P%c9L#>VnU7z+^5n}}85fr90ni{d za?uino06oQ#ssZ_EWjppbaWVCwm@HlW8b%)qO`9=m8A(+IY(VsHI?9&AdEM;J|4uv*?Qj)qx#j;gqiPN{G z`0k2G+grlJ!6A*xtcbT=mn7G+x46UDw+i?VKCwM$jZ+Vwd*^8F*h0oI$Rq^VC22+D zmt9boFXVtRNI|^^;ZSzTl~gVGln#YrKJ;|RkOKHMQ^z+|f4$96X1$&=aR4tU?4Ykq z@zX{d3J{wJ|6guSPVd5Wdp*XEG#a|TFXac@&LMIpQPh=@RD{5* z2C5N37@@n-`VBZqQU$<*!EzJ>BNQ1Xg^kAE$*lAZ2+Bz^2HoK=sRsXbq^@7hX3EGF zpp{S%Jz%LAy!$X7E|Vof|8s7xC*iMa!YA1w?AWgY{l*M20l7!WJD38a$1>orhHVutPlTvUq;m450Q~fh#Q0RKnM1aU! zoH%%7ke9#YA+SnQ!Q$+|)YL$Inn-GDsxct%eqP>BzAVSS1OXc%m%P;szeq*EV!O6t z;PSG8fjk&8dDO?d_wNe81RBsy&XP_p= z07PL4Z_Km^eI(|Xh+#${5FIbmh5w+9iCK%h8qzZR^6Ejd}8LWQd(;wqS!|uE8i9W-fVG|Yyf=nbUf|<=-?#VLYt1$1T;7wHm0G)sc@>31 zSxY^8T7g1gaHCKbeOs{%-w~{8?!;e5Z6q(+D4Ofr*j={Lqny8NV_|A;V`_9|=XE_R zYa{b(hj|2f4jtHOXk%kxEyBxd_P;LRF}E_{m2gtx!iTK1IICt&p)g)1|63F(5n)83 zNaayapHR9HIMm|kRAIYNINDm{PmPY6v~0S z6kK?TZ^?1|{QfQquD-Zt(RvEy{gr>>S9qRydF>7;3%4KdPS4n+DRt(-){xBMj2O)} z>((s$cVA7VsZ`E}se^G_bet}jH6~fwZc96}fwE|SF@4XIsfwm1jfdNX>x-W3q0vWj zGc&Sc-WgP|K4g=~QF8q`KR4oP(p~yoHl}#nGDg+|uCA`CewKCb-n|oWnZ1!;SeTjN zZDreAxhs2Np6<{W=EqLuIdhX5+2iHMX2wc*Y2y_VB@GP?bzMG1L1K=Zwrq)b_H1ii zg3dzp%+IOZg}7kXd9@1B@dtSm4z&Kh(&vYxm7)~-RwqA;jXjW`pHI!$dMoxyeXQE5 z)vIfUQrmc_%!lr1n1)Zmm4Wn;lwIbe2BRT^8Wi@4PV6klP>P&g$jo zry4cGxmt2)^{!pJGNxJ`1M&6yrJQW6JU1S^ zP-_tE9PTnV;}bm+8yh>ob9(c>5e`ldUSVO?p7Iygw%d3t=V$E?swbWGl$cL*ZtRM< zm7SeUE7)${8=pDM#lJOJ+*#el#U&{54VjgU*3!< z`5^ea;``&l!(*MH+fdrf{ecKfF!df zA>001YEDiL*_y$I^78>g=gqTezRUuKJ9Tt)Z2PJu-5J?@`Oa+IFI&4-xOpcV8(WLx zNcIf&fMtefFzMpl3{CLHk4w}oaz+wAzuooDJM}4Q=69>Wr9y0qLtI=NJLl`^>FFDM6UlMSnOx7_G>I5sv`ojH;d(_a^J&g=X4?_)2z zXZs?81@P{IhLy)#TU%GHTv_#a*D0IXpQ8$Kd3RQC>95x?_en@d;8Kl`m3<*%ROT9bu_No~i}Yb_$=Io2`@R3eCM zyGyr~1&L{}h}cw44mFLxxI0`E;ra37M*;h>t7dIES|hm&ImWe-Ar0D&ai?|55)pA? zvp@2f#huc~YZ%ppM;TNEIZUgI6e)F-9&}yfM=*p}Bc}Vd1s4l~rw= zhH$c3lS)GFe1=M#dYENLLEpzatNjmMzQta=^>yxS7jNU6%eU{YV~LK8>5oaM z4Li4mT77HjY5~K_owh@b$_d$%{z%yq<;O;PQ<|$ zOT=L!vOZobrna_rH}Bz}!#lGjoBrWjSvq&VLJ{&1u zn^8ko8=EAuCdNO1v`1^C#^c?OJ!BPAH!?EvKWZHwt(u_SnX{96;=~D(R)owNLvt7A zMpToB4F-7CtFCj!`-8Vq_4Dqooo>|E)9VTla{6h} zF)%RjLtD&Y;t;LBuB1W8e1~;Ud9vJn4-bB%pF@S7Y^ich>DCdJ*4Bp?FJG4=w_W&J z;FGI&*KGS<+2cIbVi2to=RcCoBaA)k=;`S>gxGO7<28+a7_3oA&^BY=hU7esOK}usEG*t^6Ec04H@ipb(X*E?chV--aBt&&W(f(2MDsRr_ded7pRX+K?1ZDDq6(h9nz|#Zm0`p8MBMRVJ> zZF^l@sm6^-QFt-~*B7a>BWWG$>X1g-CU9W72Xs4&o=mol%eDs{vy&aDk9*4QJl*AI zWoOr*C@0qSraAJ$>#Gl{KKpR9giA?D#UNAVv*v|0bq#(^{PkcdW*XFLlJk;tt3@<( zoYJkVtp%?SUUYx`!oK4v4{Mc({aEM>ZJ_6kPG)9i3{K(XTw`IOR8UY5$<0`F53zlH z->ZJ$7Ji1$&uNL5XE}^*GSJeB$G!T$ynQ`qi*>FGr9Netx_@rz^5p{)eKqQt*UduA z#HTwq+75oX;KQwY{bB^!5n0(s2%`b+dcXY%jNcRj8I}bO#-+9@bQC=7YHtrgxrnAd z-8U%_SX^ApUw~c7dauWuyC>!PP~+Id#DOHTyy~O+| zqcg2eb(%rd!NK7koepflP9@n$n3tblAx1T!+-`KfYhWku&cGvx}X`r^O z>|ooSNx)lQb~;TrcXsUl$y2A8*029o$um;x(CSdMar0)CSA4UmSswTA*L=^vZ#&U@ z!QFnTnICst9*${ISy^1sdjG({1APk#cG;S(DL()dOcJugFT6ezrC;W6+>{bGoZiE_ zcE=HUU`Ev)0qKLx#a?Z2rYS#Zm_jK_R$ADoSm|(}FC(M5ERAXz5fI1bh$yol8A1)FLvx#VsUIXybJ)AXHw>piVr;ikD&7STKKtl5x&Kj4c zRwFjz2%5j{C7@fd=Bud?@YbBi$djo9Mc+-gP{U^S`JzM>mzA9d)Go49Ixym#aeXNI z{rlrMnADz%;EIMqAV_wttVFzY;<|BWA=5}VH;SHt!4@^C%LNRYmNf0oW-dD4o3)8_1Rf!eiF&fv>CFkeo`@bd{+_XLaLPQyGO%<;vVACs4*S&P>)~)#a3FBjv zll9TcF$9t&8`YfQR*kPkKOW+z?NID;P_-gR%$7csYEt@)58ZkdfJm&MNqsLqz6NJc zSHfRq6RJPDQKf}(iG|k%54Xoi`*4va&!*J~hx`gCt2u)Gv)xJ3gkP-BK|4AP(=knz%G%lco~wN?RKswSI$RUoJy;48kiR>>JH zTz_TAZ4w(;2RXY|`v}DLYcx-v^YTuia!0u=%-NCBD_L)eUL^{xC^}=UkOpSo)0Zy2 ztZ7iT6r1UNO?pY&LKeH;yW6i-^5)LI!a8wtaea0<*lS%O7Qw`=(i`MB{8mD}8)XGG z($AMiE85$86FIp>&L=W{8t&D7FpQ3gpKVM0;V#D-K6%S7F|I2(yQ-%2+y#1WH!$sC zw9f?<6%{yj&-Mp9RS&jgHni>o;A=*6H|<;I==8bEv-%65`ID=tT2Hy_eV#tmC7DqX zKpf!B1hH#8Inow9!gr`(>v*f<$a8=_f+F3eOide;iqTEi6MR`&DL;3c4(a#-_#uYh1vo8HO~-wl(cqiM%3b)TVHk9{ZSfC5J4b-(pfU~(;IvIoS@)+ z0s^&4(MrX?ySoQq;~Uvx6lxuN2u_s2iam&kh{)4D?lMPHwQh5sdj9R(rHz|5U1fFp zabg^;dzYiqS!x41Ocz7-B*V*DSy?g&@bf4eYMIyLP6Z&LJd4-L^arx*7#cFei8Tc6 zW9l+HDg{jGIy>r49`yX_)4z|7j~@m;M>q)S7klkp`e@WjPK@SlR2z9AWc{Ij zD$YzCO_!T-NZWi+J@oL0^0j{D-smgQa~z@d_9Q7DDbnG6V+NZzz< z!>&7Ljz-8GSt@)J&-X9Ts>kp6`S^q(^>K4^m(+!Q6H&b|xfi7E%a7-zr4?}0yuH0U z`xPu+#Bk7m`!C4a?hHn^(a}*95CX>8jnFWFO}TD#-Y;4wH%Grbu#W@>Wib9Z#XiJ>`n7Ep^DHY;$nS&ZB z-ha_cX=z8a(kwoRx9KPL%}up6pg-LYzVME_yGgzW(>mwai*HY&qb4;C(H}oO-qR!} zwnaJDW;Ck()ZH}~KuGo1$HlnL4e0FE`G7Z*{a(ArZM>(#4?UL4&-Ufusm?9T_DIlB ziqCnSd9)*{EI`;~^n3mc7y`n2f)%(XEi0=+*bVD$85An6g9p!p9{_>m!~R0TRhv+j zE)@kXfXIM;<}0nw2PhSEi~ zYjaMWnHos|5>oU+rrt%k3^e$D*N2;YCg7aU(7r@_5z*NHu69#n3W z6Aj6BoYEdLhGfCP#At9`1r2D~Grm(o0q22xs*pViTq3j!T1jPN<7m{{z0|jF-y)s) zbeF$~LI1P7-XyvTpd;a4Wt z_x1Iu8P0jxfZj6sMQv@-zH#EPere_1wcBykQwEdr@^Tdf(wyy?GX+eAD=8e!&kq~0 zQ}5lo#}nV#=#zSFtlr1R`|3g@$3St^qBmwuDG27thM~sf8kBADRXkmtosnR})(s^l zCW08R+f8pyF$*a0WJ>_d>c`WgCHG+u3lEP*Td5jLusjm`)4UD20GThu997iR)W&Eu zA9g|W)@JdxiV8U-zDdP0$Eo4EgQ?BmD@V{rI^<84TN}06?|K_q^X2J&ITgU+xAf(d zO$YbxmGlz0^q$hN*^1>Xm3qN_9gC*cne+_*xef;%IoY*tcZy3(z0m;!a_%El-CmL< z|CsYk62Yw4G-F`(XzlC_1w}WFB^N?U>GmysH!M<&AomV zyFX&tdmObRS@Vc}CRWyXWHXNa`=z8jS(VWLNtY;S1ElA10YYfZ#8A-^v|DXz5Ysw zTU4#hN;FhetOV(Ww49(ohmB_uo8|YL5pw4@tiVP$ZD{A zFTsWm+~>`CY{Tblps#NXVSvyN-pG+C;-B%%KsfcF;FGW9uR0%iI^2EVUnCKkWoB}S zu=xYD1|3y^d_s5AqagU!?E%Gz^4u1C2UF#rbZ&J{rPn7;`dYs#X%n@ z0aK7gKz3?4Hj<^AyZXq;S*^bw&~)F(3Foj)8#lfN)m!2;^cA#qG%|}SG!>rlsn114 z@<`R_Cz!Twz1TgnoWfLwx>gsh%#GVTRD6Gj~~m zQbiwG4T|lr3yvP7bUVjsND3k&AxGua=^+<;`zx9=Ky`ed?D@aTj$B!P{ILQLcYec$ z4e>ln8`3@A@mg*K z+u^c#-?3v&?fWTdtAOC7Irr|(Z#TFM-bC0vnDUK_MB_iur zD;PR3WOvHtsMIHr7ay@4^BCN}Z{HcH)uqaH_$>L&@zaze$V6aK{pj@Yu&^kUxBP25 zjqg`#npjy`q03J|^12AH__?^)(w3T5@WzwUz{{w*#Uc)n&C+(ITgd?=B%E`r8}V91 zo^_tFL1*7&d#Bz1gE)g`+vnL8mtb<#Yl3PBn}OGR>$wQv9>o%34E(}U|=lL zFmW}kTC+w8bYgXN^``CHxv3(q^I1f~CbSUt5k!pT3N1h295iH4#V!(J5O_$$y88ht zGdmRmPA!1RZXKOArxKLJe$W^fYQoP$9wcbHRok7Nh|VA=7PzTIM8tgrOzID~kJ6{7 zjqnffJCP*Cgq0(Mx4gklv%3d5(1zJ=< zNir4E$WeR;p#FBD_2r4h*`o#9Ns;k>{+!d*b-_vS)2B~{<$*`NLZNc1L)?`=d-jj- z9UV*?HiZ2Ac|%f4YRkn1P!Z-}rTd`_K1SDYEo=15+{{3N!}ojp*{Q?B!_f+19_&%5 z&(ra0rmb1&pse;&S1~d+0HR0H1{y#B4|DyPdzYBVlEW>qXV2?O+to*Egxj26gZps? z*nx~OyKqWaSeOWdXu}%F&(H-mY+C7eg>4bnU8|!EUm$*W-6xRbVNTEIZERfBM9M(~7f4 zA_1CY=E((JA9R>#AxfH>nl7)&uY=O#-awXf!X}xWaNyuTCS9SBb51%g3VY(~yN^m( zxmAI|!eR+5vF^@GBDZQfY_R~QZ*FNJp)vI3ZQeXD+z;)W`nzO<#p8fMxDFkXzrXol zH5v^X8X##eG&ZW=_|YXP`fw?eXLF~d;s4EAGL#YTMDs1V8i*fR-7ri1>KzcEVMwof zEyXP+)-pfxqdiYgVT(n2*1#3l`RN{po}Tl$6EkWTSJPL>^LdwWe*3S`=i#_yooV2Yd-tkvNh}Z?j0Ytk zvtNkVRzvk(l|3)##p?3&GU5xYm<)*%blg$EjYpHBR1<=5=)@Oht>J2sdH(!)n1+$t z>a@&E6Lgp}NN50%yza+D9clex6%q@YNDEJi`gZQledKedQ|U_(mdpELUdo`=YtTBM z%JpO4>vcWF_EG)OdMpF*B?=SzJJOY=Tx*F2%9i#5R8GL-YJwJ12L7Sp#Kl0w_7^q} zB3c|Fh!w+SinkQ4`i+I<7kh6qcjd~JvGbXMuvg5(t7O;^uZ3Rc4id#{m?6qS&Z8DE zq0b@iFwl*)fS2cTUb&eZ$C?vL4L?4IH>%iHD7bZ5WTBcIZ$@cbt1#s*dBfJ2Qr)Uc$u*DxpSaflZiO`sDINHv|P-GF1e9v z4}`a+akzwW-@tI5;)LFdEw)pYRb3Y^f5lw_V?-BP$ItJitm+&dF4q;6XD7Mew#*gC zltKxNDfI-(r2}A6;@9q2^dFk*!jy7doZW-(tX#X+_UB4U{7K3ZH-)j$QOlod&$1G3 zbjGkQN@M;nNSyz`r1!u*W;MlaKubl%m)!`5QZnV3Rqx~7C9ii<(inhMydg(;u^WMQ zmP|3(@I5@!onBH=ks$h+!R;j6WG}t3cYCQ|Djz2#n1>9RZYk%g+o9UB+0Iu{k0O5v z2Ew$A6`Kz3*>ehM21*jygqRXwcfFTb66=j1y#8A(g#QTT{P!6Z|L?pDYdjC-KO-$C zwyj_P626y+iKP^`m<^P61<2MU`6$v&v7JMCb9Gj-;lDlV6p3rYk=%f`iiu&-dLAFU zPIH*^JRUr-kq#E$KSkAHY(P%2*#{+%pO5bX+y)l?7o^eU-lP0sa`I0=+ZR~wV*ND7 zclVy%p`;mHNjbjsBclFav5d<8JI?Y*{x6WrK(WZ)L;2VT)KZJ)bMM~0@QI@RqFUl8 zyr=!*P5*)URB;!>H()iA(dYvxz+&U2hk0Up6#h1_W&m3(qfz zZGseuJ@7{AL-q`Z$lw?NF1a@Q-{d0W8-i!5O}!2?}jWo2dNzj~IcDv0c&c*8s8 zHr^C;@CopqD%lP+b}DemQ+8~NEc!B4;#s4@$4j(vVCvUc&ad>XN3BAKa~E8w)nH9t zL(1y|POJpek^rF3$-`6LDg-@-pmVRi=V~M5f?*iJqo-T88dO2BPWRt{ zafFG51tAAXv+lJNBOx1MjevQ}z$P;{|%E5-KyS7Ka?^2rLx6q7YBS;+*RVR#p-? zr*7OBh)bP-;6~odpggb&uegbcNjY`~mxZA$q8I*h*#XomqS4rO2tp*ItCv!Y%0U(} z2PH3W$lYzO3tGen;+z8nL6qm_=H@GPRRoFV?Ck^DL%8ys6u_tJE3z8`vJ~5pUO1}w z;f3UQ?E#)AOqzw#0`Pf#NF7AJoqD4FLxO|&bPIYV7N$Mf`yj58qce6;Q4sUk#2fw_90v$v= ze^6Rs*^q~Gl-FvS_#Oexylh5Sw4*T+uc-v^b z65qY*02JQYIOl-NhUl~VA;}U4DZcE5Hx+qB3H*GJLqF%zrAwo*1)s~y>(RSMLYO$R zqul}f4z(*DHglp5?3WFE)5g95-+*=ZEDTG4y3aNrxcCydnd`uT*o!m-!bQAl173r) z^e`r$1lq0vh9yl04f}j?Zg$ArwFZX8y2uNAkTnfqs1>pN{`;I^kj-dO19r(985Et5 za+E^Y5|iJ+r8#+vP?kaEA4tfp2ihc#T3`<1Qt5}2J@kGfUV33BvkDI^A9C|8Ex-rpp~Ho#oMyov;>Jc1qg<%!$1Nk)nQH|IgAx{$)>k8iRX$Mjzj3VLBVB8nQq5H%&OxnD z;SOTpp*CHio4HRU81}t=s9>lRm8p?r_=GrqVc^ytwZb09tJu$H+kF;vQ~3do#1Og7 zeRA+=T^L^ZW=o8wXcF>e~kvwQbRlo>^6>M`dmJ+cy_ItKbF6sDz~H*eNV z&&-I7Ja=hu`}?;cPXDV4@Q?sImh!J)Po`($X^0)z9~&hYh0_eLEq!h+?sJ z7v*EvFKPqUR%`XY$+D!;TC#u1dr_!{vIDCr6xH3hjv&{*?^Da^c)~EbraOt!r80HP z?HYVWe_WRiCITZPqn)%4g_7o9wpCYCYl(+1Vh^b~EFyyY(4oq@E-V+ne30u%`bt3d ze`?a@|4sn8pZKm(ZRKtL@316w1<_*wH^>S(lIMrs`KQiZe1YGPQ1t785%|#KdySamiDZ zPlCH}7@r)}$jDfO7`*wfk*+WEVW1^l5_AA7TTWSPc=kcFQr>S^RQdhiV^gpX1e;QJ zph^0N!Omqv*#X>!V6;^(DGv~q!w89F$~Fm?EZFosOrQPFnghnCVFFFd($eyC zX{nNfLk0|E3BA3&426ebQdr9(qJ+5uA9i9!gca_^9LGzv9*8UN7cb%-KYr{~Qixs! zLa$dS92R8ks4>?yclYkyW65QI*Wb@vj!CZ_%i$G9UM_8Y%^|gpMIp5FkT&Fll+On! zC`)A-n3W?<6>%BB7hkoQQFJG~r7TA*j^hF9pq&j4@oJ{MM7nhsho^38;f}+NNR+8{ zC%T}bSHu4m33`~6T*&a;WAV+sy@r_PGa==>JHVVw&7k)<-R44%Bg!IpWUgOU?Ts5Z z5(i~Zj5$g~zB(HMEpeA(w;Gpq_DkKo>sp3mS}u`PB-29? zk+Bh_3@-s>$*2i%yDYqlRd9z2>X&Yv>ycP^!cJzRjKP=X=y?!B2pJf{se`TY7=#Ez zQ1Ok>z(Y#FQTM{XLM$LaJ9~kK{>I%}em@-|wGbErwSKbAOei4qe#G0={0UbdUfdo|tPg{R1uz`dKcZHq#P5!Wgv>J*6Vfe<9! z9e}9Ckui{t=A0ObKpGGdi6c-V<$}*izujtP44{oLmO$z6zS_K{LSr1gxD2dPPi{ z8RsZABJDQZ;$Q6sj|b^niN^;$Y9tKB{^HIV8FnK)RFce~{m`1ND~jO;K_(_%*pA9V zZ%#!4z0aFKq@RLZQjMunc*g~))gZoo9zTAW<4lKFJ__R}%zRgVhyPsdsum20B+brU zYvWRmj>PWFKq4Z2O)m?)HQ>X#1}Y*pQ2nGT@>D}!v;?xB;czZ8K*)*4v>7W@~DQ-9a`%LF6ba@Avt z65P4p*6fgM9eu1gqxo-fC_m6;Jd@t^)V!4w6J+VXk$TSx`{W&v}(K+pkBRMcM=7JL_^`CI0 z|7ZXiX2*5~td0*m*rPs~AJ-!$o+J$$5lN5*)*|__0FK_?9rvt_+Xz$~Vx+iv z+@h@T>%Y+^?>rMV(fz%tlSMw?Xl@x4MN!daqq#*C`6plCm#ve0Y54D!PfKeZ@b==a z>8YT94P*e!{B8061HSg3AFBR`@C;bXjr(xHSuYq0G&O-!IJoUyd&cL7{r1As`3*tq z6^faJv@~>J^7Y6KVaUWVdIpU=SeQHM-=Vl=tRg+X4L)@ATw74I3THdm77js%;|HboF7-M3=9Q~f z@srUzjJpfCPM7G&pv}jOhm8H&nB#hU^&rQdW5VV+zzaQ>jA3NmRf_a_L_*x)?yzYn^@A4+Jj(_!6YYDMn(X6R|pD0 zH=ZjwHHss+?mM>ANk!Q7%O#Kk`k)DPfmF<)&lo|4EJHUxXcnJ8q`tW$mZM3a0ti(G zGS7MN4P_|51BVh0q;f8*e043GrZNs~s!^w>vy&L#58ID*GBi!~)f9r^$-AtMT3Cv( zeaKhPi2=mNkJlfz?N_4D0t7IFRT;-_i2T>P;>q@l5Rdl(!4Fu)DXO@yl zFx}GROsyAUvbtRLLfIDWw~SC|?Xf@O4`X6eIV0Q-_96}%VLlYG8#WE@?(Pmp#F=26 zWGPRg{kXpSq*pB*evWiNr9P-#>&!5sQHwtPB>ey*_DB?HFZ#mkyM$yWg#e?QcJmbJ zZ^i}v9^&U>4ww*MDh?usTZ=9TvN1dgzuW^5p_KtGV7}|BsW@Ouc{cv`o5EFkR`A|Fa?CESu7(i; z{mOaz)CjM0m1^H#yPahWqqYhMg&td$_@_G$$*B_AkIdpuwnzzTE@4-DpnB1A<+J24GOs6cL&STcAD z1R~$vW@4S?!1`rsrn*Bgr zHT36OjDhFtN0!71_qAS?yGr%2it2=#dY7^y$XndQLhD)$l7tp9PvaVr9o_Aj`VzUA z#OiNh&y6vbhJF6Gk9`K%0-EtJ_|&E|KemN5n&c}$amC4|q}tRc-!gus&8{vz?5F|B zHmr_=d?al`y14RyuRFnYF2)}0`_PcES>si_eQA4-)`!-0#_VcHL0)Mm_0XVJCQ6rw?ZT%t1S)(2Hd%!10E%bl!!VI(| z$%RpP?RyU&3W6`(hYIt>IpZV}44RsK;^M74L~M%4Adk&(^H&h;Wjo;CZ7#Hn@_Jg6=xcgmm_>$wR1H>FtzzD~WPD}_8=6)JZ-=XnWuV0se>)g@EtM={_ zs_z#v00ZxK75UdP))6OE83;&IYyU?e7sIc+%(7Jvr1u9ebm-#V6sn}`>G+eEZvB64;3Gr; diff --git a/development/_images/sphx_glr_example_visualization_thumb.png b/development/_images/sphx_glr_example_visualization_thumb.png index 1d085b21ea27add4cc14b67025b1f4568a47aaab..ca145837e30e2273f38b3eb0f1d5077fea0fb72f 100644 GIT binary patch literal 34066 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 literal 32784 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 diff --git a/development/_sources/examples/20_basics/example_image_classification.rst.txt b/development/_sources/examples/20_basics/example_image_classification.rst.txt index 555389979..9e152f2d8 100644 --- a/development/_sources/examples/20_basics/example_image_classification.rst.txt +++ b/development/_sources/examples/20_basics/example_image_classification.rst.txt @@ -86,16 +86,17 @@ Image Classification ________________________________________ Configuration: image_augmenter:GaussianBlur:use_augmenter, Value: False - image_augmenter:GaussianNoise:use_augmenter, Value: False - image_augmenter:RandomAffine:rotate, Value: 65 - image_augmenter:RandomAffine:scale_offset, Value: 0.10364752234694663 - image_augmenter:RandomAffine:shear, Value: 5 - image_augmenter:RandomAffine:translate_percent_offset, Value: 0.12303023778688212 + image_augmenter:GaussianNoise:sigma_offset, Value: 2.939416777169848 + image_augmenter:GaussianNoise:use_augmenter, Value: True + image_augmenter:RandomAffine:rotate, Value: 182 + image_augmenter:RandomAffine:scale_offset, Value: 0.2653043460236015 + image_augmenter:RandomAffine:shear, Value: 7 + image_augmenter:RandomAffine:translate_percent_offset, Value: 0.2981323677443226 image_augmenter:RandomAffine:use_augmenter, Value: True - image_augmenter:RandomCutout:p, Value: 0.9516838776905963 + image_augmenter:RandomCutout:p, Value: 0.46400105311756495 image_augmenter:RandomCutout:use_augmenter, Value: True image_augmenter:Resize:use_augmenter, Value: False - image_augmenter:ZeroPadAndCrop:percent, Value: 0.2732380932749452 + image_augmenter:ZeroPadAndCrop:percent, Value: 0.05116366366228997 normalizer:__choice__, Value: 'ImageNormalizer' Fitting the pipeline... @@ -175,7 +176,7 @@ Image Classification .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 6.216 seconds) + **Total running time of the script:** ( 0 minutes 7.489 seconds) .. _sphx_glr_download_examples_20_basics_example_image_classification.py: diff --git a/development/_sources/examples/20_basics/example_tabular_classification.rst.txt b/development/_sources/examples/20_basics/example_tabular_classification.rst.txt index f17476a79..8e420a9b1 100644 --- a/development/_sources/examples/20_basics/example_tabular_classification.rst.txt +++ b/development/_sources/examples/20_basics/example_tabular_classification.rst.txt @@ -134,7 +134,7 @@ Search for an ensemble of machine learning algorithms .. code-block:: none - + @@ -165,26 +165,28 @@ Print the final ensemble performance .. code-block:: none - {'accuracy': 0.8554913294797688} - | | Preprocessing | Estimator | Weight | - |---:|:----------------------------------------------------------|:----------------------------------------------------------------|---------:| - | 0 | None | RFLearner | 0.24 | - | 1 | SimpleImputer,OneHotEncoder,Normalizer,KernelPCA | embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.22 | - | 2 | None | SVMLearner | 0.18 | - | 3 | None | CBLearner | 0.1 | - | 4 | None | ETLearner | 0.08 | - | 5 | None | KNNLearner | 0.08 | - | 6 | SimpleImputer,OneHotEncoder,MinMaxScaler,PowerTransformer | embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.04 | - | 7 | SimpleImputer,NoEncoder,Normalizer,Nystroem | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.04 | - | 8 | None | LGBMLearner | 0.02 | + {'accuracy': 0.838150289017341} + | | Preprocessing | Estimator | Weight | + |---:|:------------------------------------------------------------------|:----------------------------------------------------------------|---------:| + | 0 | SimpleImputer,OneHotEncoder,Normalizer,KernelPCA | embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.2 | + | 1 | None | KNNLearner | 0.16 | + | 2 | None | CBLearner | 0.14 | + | 3 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.12 | + | 4 | SimpleImputer,OneHotEncoder,Normalizer,PowerTransformer | embedding,ResNetBackbone,FullyConnectedHead,nn.Sequential | 0.08 | + | 5 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.08 | + | 6 | SimpleImputer,OneHotEncoder,MinMaxScaler,PowerTransformer | embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.06 | + | 7 | SimpleImputer,NoEncoder,Normalizer,Nystroem | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.06 | + | 8 | None | SVMLearner | 0.04 | + | 9 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.04 | + | 10 | SimpleImputer,OneHotEncoder,MinMaxScaler,TruncSVD | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.02 | autoPyTorch results: Dataset name: Australian Optimisation Metric: accuracy Best validation score: 0.8713450292397661 - Number of target algorithm runs: 23 + Number of target algorithm runs: 22 Number of successful target algorithm runs: 19 Number of crashed target algorithm runs: 2 - Number of target algorithms that exceeded the time limit: 2 + Number of target algorithms that exceeded the time limit: 1 Number of target algorithms that exceeded the memory limit: 0 @@ -194,7 +196,7 @@ Print the final ensemble performance .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 5 minutes 22.150 seconds) + **Total running time of the script:** ( 5 minutes 35.087 seconds) .. _sphx_glr_download_examples_20_basics_example_tabular_classification.py: diff --git a/development/_sources/examples/20_basics/example_tabular_regression.rst.txt b/development/_sources/examples/20_basics/example_tabular_regression.rst.txt index 75bc0b157..213ed65af 100644 --- a/development/_sources/examples/20_basics/example_tabular_regression.rst.txt +++ b/development/_sources/examples/20_basics/example_tabular_regression.rst.txt @@ -125,7 +125,7 @@ Search for an ensemble of machine learning algorithms .. code-block:: none - + @@ -159,7 +159,7 @@ Print the final ensemble performance .. code-block:: none - {'r2': 0.9445248186059718} + {'r2': 0.944631023189658} | | Preprocessing | Estimator | Weight | |---:|:------------------------------------------------------------------|:----------------------------------------------------------------|---------:| | 0 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.44 | @@ -167,9 +167,9 @@ Print the final ensemble performance | 2 | None | LGBMLearner | 0.08 | | 3 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.06 | autoPyTorch results: - Dataset name: 2b8bcd39-4bc0-11ec-8727-df8c3c818998 + Dataset name: 37d86b62-4bdf-11ec-877d-1fe05d8e2eef Optimisation Metric: r2 - Best validation score: 0.8645385039886702 + Best validation score: 0.8644967965917701 Number of target algorithm runs: 24 Number of successful target algorithm runs: 20 Number of crashed target algorithm runs: 2 @@ -183,7 +183,7 @@ Print the final ensemble performance .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 5 minutes 37.415 seconds) + **Total running time of the script:** ( 5 minutes 36.563 seconds) .. _sphx_glr_download_examples_20_basics_example_tabular_regression.py: diff --git a/development/_sources/examples/20_basics/sg_execution_times.rst.txt b/development/_sources/examples/20_basics/sg_execution_times.rst.txt index 205b1e5f8..26d8d9f10 100644 --- a/development/_sources/examples/20_basics/sg_execution_times.rst.txt +++ b/development/_sources/examples/20_basics/sg_execution_times.rst.txt @@ -5,12 +5,12 @@ Computation times ================= -**11:05.781** total execution time for **examples_20_basics** files: +**11:19.139** total execution time for **examples_20_basics** files: +--------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_examples_20_basics_example_tabular_regression.py` (``example_tabular_regression.py``) | 05:37.415 | 0.0 MB | +| :ref:`sphx_glr_examples_20_basics_example_tabular_regression.py` (``example_tabular_regression.py``) | 05:36.563 | 0.0 MB | +--------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_examples_20_basics_example_tabular_classification.py` (``example_tabular_classification.py``) | 05:22.150 | 0.0 MB | +| :ref:`sphx_glr_examples_20_basics_example_tabular_classification.py` (``example_tabular_classification.py``) | 05:35.087 | 0.0 MB | +--------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_examples_20_basics_example_image_classification.py` (``example_image_classification.py``) | 00:06.216 | 0.0 MB | +| :ref:`sphx_glr_examples_20_basics_example_image_classification.py` (``example_image_classification.py``) | 00:07.489 | 0.0 MB | +--------------------------------------------------------------------------------------------------------------+-----------+--------+ diff --git a/development/_sources/examples/40_advanced/example_custom_configuration_space.rst.txt b/development/_sources/examples/40_advanced/example_custom_configuration_space.rst.txt index aa417947f..64ea8b736 100644 --- a/development/_sources/examples/40_advanced/example_custom_configuration_space.rst.txt +++ b/development/_sources/examples/40_advanced/example_custom_configuration_space.rst.txt @@ -24,6 +24,7 @@ Tabular Classification with Custom Configuration Space The following example shows how adjust the configuration space of the search. Currently, there are two changes that can be made to the space:- + 1. Adjust individual hyperparameters in the pipeline 2. Include or exclude components: a) include: Dictionary containing components to include. Key is the node @@ -35,64 +36,7 @@ the search. Currently, there are two changes that can be made to the space:- to exclude. All except these components will be present in the search space. -.. GENERATED FROM PYTHON SOURCE LINES 19-137 - - - - -.. rst-class:: sphx-glr-script-out - - Out: - - .. code-block:: none - - {'accuracy': 0.8554913294797688} - | | Preprocessing | Estimator | Weight | - |---:|:------------------------------------------------------------------|:----------------------------------------------------------|---------:| - | 0 | None | CBLearner | 0.46 | - | 1 | SimpleImputer,OneHotEncoder,Normalizer,PolynomialFeatures | no embedding,MLPBackbone,FullyConnectedHead,nn.Sequential | 0.38 | - | 2 | None | SVMLearner | 0.06 | - | 3 | None | KNNLearner | 0.06 | - | 4 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,MLPBackbone,FullyConnectedHead,nn.Sequential | 0.04 | - autoPyTorch results: - Dataset name: 85726e36-4bc4-11ec-8727-df8c3c818998 - Optimisation Metric: accuracy - Best validation score: 0.8654970760233918 - Number of target algorithm runs: 18 - Number of successful target algorithm runs: 14 - Number of crashed target algorithm runs: 3 - Number of target algorithms that exceeded the time limit: 1 - Number of target algorithms that exceeded the memory limit: 0 - - {'accuracy': 0.861271676300578} - | | Preprocessing | Estimator | Weight | - |---:|:--------------------------------------------------------------|:----------------------------------------------------------------|---------:| - | 0 | SimpleImputer,NoEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.28 | - | 1 | None | RFLearner | 0.24 | - | 2 | None | KNNLearner | 0.16 | - | 3 | SimpleImputer,NoEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.12 | - | 4 | None | CBLearner | 0.08 | - | 5 | SimpleImputer,NoEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.06 | - | 6 | SimpleImputer,NoEncoder,StandardScaler,KernelPCA | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.02 | - | 7 | None | ETLearner | 0.02 | - | 8 | None | SVMLearner | 0.02 | - autoPyTorch results: - Dataset name: ea262f4f-4bc4-11ec-8727-df8c3c818998 - Optimisation Metric: accuracy - Best validation score: 0.8654970760233918 - Number of target algorithm runs: 21 - Number of successful target algorithm runs: 15 - Number of crashed target algorithm runs: 5 - Number of target algorithms that exceeded the time limit: 1 - Number of target algorithms that exceeded the memory limit: 0 - - - - - - - -| +.. GENERATED FROM PYTHON SOURCE LINES 20-61 .. code-block:: default @@ -137,88 +81,253 @@ the search. Currently, there are two changes that can be made to the space:- return updates - if __name__ == '__main__': - - ############################################################################ - # Data Loading - # ============ - X, y = sklearn.datasets.fetch_openml(data_id=40981, return_X_y=True, as_frame=True) - X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split( - X, - y, - random_state=1, - ) - - ############################################################################ - # Build and fit a classifier with include components - # ================================================== - api = TabularClassificationTask( - search_space_updates=get_search_space_updates(), - include_components={'network_backbone': ['MLPBackbone', 'ResNetBackbone'], - 'encoder': ['OneHotEncoder']} - ) - - ############################################################################ - # Search for an ensemble of machine learning algorithms - # ===================================================== - api.search( - X_train=X_train.copy(), - y_train=y_train.copy(), - X_test=X_test.copy(), - y_test=y_test.copy(), - optimize_metric='accuracy', - total_walltime_limit=150, - func_eval_time_limit_secs=30 - ) - - ############################################################################ - # Print the final ensemble performance - # ==================================== - y_pred = api.predict(X_test) - score = api.score(y_pred, y_test) - print(score) - print(api.show_models()) - - # Print statistics from search - print(api.sprint_statistics()) - - ############################################################################ - # Build and fit a classifier with exclude components - # ================================================== - api = TabularClassificationTask( - search_space_updates=get_search_space_updates(), - exclude_components={'network_backbone': ['MLPBackbone'], - 'encoder': ['OneHotEncoder']} - ) - - ############################################################################ - # Search for an ensemble of machine learning algorithms - # ===================================================== - api.search( - X_train=X_train, - y_train=y_train, - X_test=X_test.copy(), - y_test=y_test.copy(), - optimize_metric='accuracy', - total_walltime_limit=150, - func_eval_time_limit_secs=30 - ) - - ############################################################################ - # Print the final ensemble performance - # ==================================== - y_pred = api.predict(X_test) - score = api.score(y_pred, y_test) - print(score) - print(api.show_models()) - - # Print statistics from search - print(api.sprint_statistics()) + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 62-64 + +Data Loading +============ + +.. GENERATED FROM PYTHON SOURCE LINES 64-71 + +.. code-block:: default + + X, y = sklearn.datasets.fetch_openml(data_id=40981, return_X_y=True, as_frame=True) + X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split( + X, + y, + random_state=1, + ) + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 72-74 + +Build and fit a classifier with include components +================================================== + +.. GENERATED FROM PYTHON SOURCE LINES 74-80 + +.. code-block:: default + + api = TabularClassificationTask( + search_space_updates=get_search_space_updates(), + include_components={'network_backbone': ['MLPBackbone', 'ResNetBackbone'], + 'encoder': ['OneHotEncoder']} + ) + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 81-83 + +Search for an ensemble of machine learning algorithms +===================================================== + +.. GENERATED FROM PYTHON SOURCE LINES 83-93 + +.. code-block:: default + + api.search( + X_train=X_train.copy(), + y_train=y_train.copy(), + X_test=X_test.copy(), + y_test=y_test.copy(), + optimize_metric='accuracy', + total_walltime_limit=150, + func_eval_time_limit_secs=30 + ) + + + + + +.. rst-class:: sphx-glr-script-out + + Out: + + .. code-block:: none + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 94-96 + +Print the final ensemble performance +==================================== + +.. GENERATED FROM PYTHON SOURCE LINES 96-104 + +.. code-block:: default + + y_pred = api.predict(X_test) + score = api.score(y_pred, y_test) + print(score) + print(api.show_models()) + + # Print statistics from search + print(api.sprint_statistics()) + + + + + +.. rst-class:: sphx-glr-script-out + + Out: + + .. code-block:: none + + {'accuracy': 0.8670520231213873} + | | Preprocessing | Estimator | Weight | + |---:|:------------------------------------------------------------------|:----------------------------------------------------------|---------:| + | 0 | None | RFLearner | 0.44 | + | 1 | None | ETLearner | 0.26 | + | 2 | None | LGBMLearner | 0.1 | + | 3 | None | SVMLearner | 0.08 | + | 4 | None | KNNLearner | 0.08 | + | 5 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,MLPBackbone,FullyConnectedHead,nn.Sequential | 0.02 | + | 6 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,MLPBackbone,FullyConnectedHead,nn.Sequential | 0.02 | + autoPyTorch results: + Dataset name: 5482ec4e-4be2-11ec-877d-1fe05d8e2eef + Optimisation Metric: accuracy + Best validation score: 0.8596491228070176 + Number of target algorithm runs: 16 + Number of successful target algorithm runs: 10 + Number of crashed target algorithm runs: 4 + Number of target algorithms that exceeded the time limit: 2 + Number of target algorithms that exceeded the memory limit: 0 + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 105-107 + +Build and fit a classifier with exclude components +================================================== + +.. GENERATED FROM PYTHON SOURCE LINES 107-113 + +.. code-block:: default + + api = TabularClassificationTask( + search_space_updates=get_search_space_updates(), + exclude_components={'network_backbone': ['MLPBackbone'], + 'encoder': ['OneHotEncoder']} + ) + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 114-116 + +Search for an ensemble of machine learning algorithms +===================================================== + +.. GENERATED FROM PYTHON SOURCE LINES 116-126 + +.. code-block:: default + + api.search( + X_train=X_train, + y_train=y_train, + X_test=X_test.copy(), + y_test=y_test.copy(), + optimize_metric='accuracy', + total_walltime_limit=150, + func_eval_time_limit_secs=30 + ) + + + + + +.. rst-class:: sphx-glr-script-out + + Out: + + .. code-block:: none + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 127-129 + +Print the final ensemble performance +==================================== + +.. GENERATED FROM PYTHON SOURCE LINES 129-136 + +.. code-block:: default + + y_pred = api.predict(X_test) + score = api.score(y_pred, y_test) + print(score) + print(api.show_models()) + + # Print statistics from search + print(api.sprint_statistics()) + + + + +.. rst-class:: sphx-glr-script-out + + Out: + + .. code-block:: none + + {'accuracy': 0.8728323699421965} + | | Preprocessing | Estimator | Weight | + |---:|:--------------------------------------------------------------|:----------------------------------------------------------------|---------:| + | 0 | None | RFLearner | 0.34 | + | 1 | None | ETLearner | 0.26 | + | 2 | None | LGBMLearner | 0.2 | + | 3 | None | KNNLearner | 0.08 | + | 4 | SimpleImputer,NoEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.06 | + | 5 | None | SVMLearner | 0.04 | + | 6 | SimpleImputer,NoEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.02 | + autoPyTorch results: + Dataset name: c0472c05-4be2-11ec-877d-1fe05d8e2eef + Optimisation Metric: accuracy + Best validation score: 0.8596491228070176 + Number of target algorithm runs: 20 + Number of successful target algorithm runs: 13 + Number of crashed target algorithm runs: 6 + Number of target algorithms that exceeded the time limit: 1 + Number of target algorithms that exceeded the memory limit: 0 + + + + .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 5 minutes 45.859 seconds) + **Total running time of the script:** ( 5 minutes 57.148 seconds) .. _sphx_glr_download_examples_40_advanced_example_custom_configuration_space.py: diff --git a/development/_sources/examples/40_advanced/example_parallel_n_jobs.rst.txt b/development/_sources/examples/40_advanced/example_parallel_n_jobs.rst.txt index 453fac4c9..c5dd6f475 100644 --- a/development/_sources/examples/40_advanced/example_parallel_n_jobs.rst.txt +++ b/development/_sources/examples/40_advanced/example_parallel_n_jobs.rst.txt @@ -18,14 +18,14 @@ .. _sphx_glr_examples_40_advanced_example_parallel_n_jobs.py: -====================== -Tabular Classification -====================== +============================================ +Tabular Classification with n parallel jobs +============================================ The following example shows how to fit a sample classification model parallely on 2 cores with AutoPyTorch -.. GENERATED FROM PYTHON SOURCE LINES 9-69 +.. GENERATED FROM PYTHON SOURCE LINES 10-70 @@ -36,196 +36,17 @@ with AutoPyTorch .. code-block:: none - [TrajEntry(train_perf=2147483648, incumbent_id=1, incumbent=Configuration: - data_loader:batch_size, Value: 64 - encoder:__choice__, Value: 'OneHotEncoder' - feature_preprocessor:__choice__, Value: 'NoFeaturePreprocessor' - imputer:categorical_strategy, Value: 'most_frequent' - imputer:numerical_strategy, Value: 'mean' - lr_scheduler:ReduceLROnPlateau:factor, Value: 0.1 - lr_scheduler:ReduceLROnPlateau:mode, Value: 'min' - lr_scheduler:ReduceLROnPlateau:patience, Value: 10 - lr_scheduler:__choice__, Value: 'ReduceLROnPlateau' - network_backbone:ShapedMLPBackbone:activation, Value: 'relu' - network_backbone:ShapedMLPBackbone:max_units, Value: 200 - network_backbone:ShapedMLPBackbone:mlp_shape, Value: 'funnel' - network_backbone:ShapedMLPBackbone:num_groups, Value: 5 - network_backbone:ShapedMLPBackbone:output_dim, Value: 200 - network_backbone:ShapedMLPBackbone:use_dropout, Value: False - network_backbone:__choice__, Value: 'ShapedMLPBackbone' - network_embedding:__choice__, Value: 'NoEmbedding' - network_head:__choice__, Value: 'fully_connected' - network_head:fully_connected:activation, Value: 'relu' - network_head:fully_connected:num_layers, Value: 2 - network_head:fully_connected:units_layer_1, Value: 128 - network_init:XavierInit:bias_strategy, Value: 'Normal' - network_init:__choice__, Value: 'XavierInit' - optimizer:AdamOptimizer:beta1, Value: 0.9 - optimizer:AdamOptimizer:beta2, Value: 0.9 - optimizer:AdamOptimizer:lr, Value: 0.01 - optimizer:AdamOptimizer:weight_decay, Value: 0.0 - optimizer:__choice__, Value: 'AdamOptimizer' - scaler:__choice__, Value: 'StandardScaler' - trainer:StandardTrainer:weighted_loss, Value: True - trainer:__choice__, Value: 'StandardTrainer' - , ta_runs=0, ta_time_used=0.0, wallclock_time=0.001379251480102539, budget=0), TrajEntry(train_perf=0.4444444444444444, incumbent_id=1, incumbent=Configuration: - data_loader:batch_size, Value: 142 - encoder:__choice__, Value: 'NoEncoder' - feature_preprocessor:PowerTransformer:standardize, Value: True - feature_preprocessor:__choice__, Value: 'PowerTransformer' - imputer:categorical_strategy, Value: 'constant_!missing!' - imputer:numerical_strategy, Value: 'median' - lr_scheduler:__choice__, Value: 'NoScheduler' - network_backbone:ShapedResNetBackbone:activation, Value: 'relu' - network_backbone:ShapedResNetBackbone:blocks_per_group, Value: 1 - network_backbone:ShapedResNetBackbone:max_shake_drop_probability, Value: 0.7993610769045779 - network_backbone:ShapedResNetBackbone:max_units, Value: 175 - network_backbone:ShapedResNetBackbone:num_groups, Value: 3 - network_backbone:ShapedResNetBackbone:output_dim, Value: 550 - network_backbone:ShapedResNetBackbone:resnet_shape, Value: 'funnel' - network_backbone:ShapedResNetBackbone:use_dropout, Value: False - network_backbone:ShapedResNetBackbone:use_shake_drop, Value: True - network_backbone:ShapedResNetBackbone:use_shake_shake, Value: True - network_backbone:__choice__, Value: 'ShapedResNetBackbone' - network_embedding:__choice__, Value: 'NoEmbedding' - network_head:__choice__, Value: 'fully_connected' - network_head:fully_connected:activation, Value: 'sigmoid' - network_head:fully_connected:num_layers, Value: 2 - network_head:fully_connected:units_layer_1, Value: 308 - network_init:KaimingInit:bias_strategy, Value: 'Normal' - network_init:__choice__, Value: 'KaimingInit' - optimizer:AdamOptimizer:beta1, Value: 0.8660298289969375 - optimizer:AdamOptimizer:beta2, Value: 0.9517157453274235 - optimizer:AdamOptimizer:lr, Value: 1.0377748473731365e-05 - optimizer:AdamOptimizer:weight_decay, Value: 0.07437634123996516 - optimizer:__choice__, Value: 'AdamOptimizer' - scaler:Normalizer:norm, Value: 'mean_abs' - scaler:__choice__, Value: 'Normalizer' - trainer:MixUpTrainer:alpha, Value: 0.13179357367568267 - trainer:MixUpTrainer:weighted_loss, Value: True - trainer:__choice__, Value: 'MixUpTrainer' - , ta_runs=1, ta_time_used=4.371152400970459, wallclock_time=5.563146114349365, budget=5.555555555555555), TrajEntry(train_perf=0.1578947368421053, incumbent_id=2, incumbent=Configuration: - data_loader:batch_size, Value: 64 - encoder:__choice__, Value: 'OneHotEncoder' - feature_preprocessor:__choice__, Value: 'NoFeaturePreprocessor' - imputer:categorical_strategy, Value: 'most_frequent' - imputer:numerical_strategy, Value: 'mean' - lr_scheduler:ReduceLROnPlateau:factor, Value: 0.1 - lr_scheduler:ReduceLROnPlateau:mode, Value: 'min' - lr_scheduler:ReduceLROnPlateau:patience, Value: 10 - lr_scheduler:__choice__, Value: 'ReduceLROnPlateau' - network_backbone:ShapedMLPBackbone:activation, Value: 'relu' - network_backbone:ShapedMLPBackbone:max_units, Value: 200 - network_backbone:ShapedMLPBackbone:mlp_shape, Value: 'funnel' - network_backbone:ShapedMLPBackbone:num_groups, Value: 5 - network_backbone:ShapedMLPBackbone:output_dim, Value: 200 - network_backbone:ShapedMLPBackbone:use_dropout, Value: False - network_backbone:__choice__, Value: 'ShapedMLPBackbone' - network_embedding:__choice__, Value: 'NoEmbedding' - network_head:__choice__, Value: 'fully_connected' - network_head:fully_connected:activation, Value: 'relu' - network_head:fully_connected:num_layers, Value: 2 - network_head:fully_connected:units_layer_1, Value: 128 - network_init:XavierInit:bias_strategy, Value: 'Normal' - network_init:__choice__, Value: 'XavierInit' - optimizer:AdamOptimizer:beta1, Value: 0.9 - optimizer:AdamOptimizer:beta2, Value: 0.9 - optimizer:AdamOptimizer:lr, Value: 0.01 - optimizer:AdamOptimizer:weight_decay, Value: 0.0 - optimizer:__choice__, Value: 'AdamOptimizer' - scaler:__choice__, Value: 'StandardScaler' - trainer:StandardTrainer:weighted_loss, Value: True - trainer:__choice__, Value: 'StandardTrainer' - , ta_runs=2, ta_time_used=9.677488327026367, wallclock_time=6.544711351394653, budget=5.555555555555555), TrajEntry(train_perf=0.14035087719298245, incumbent_id=3, incumbent=Configuration: - data_loader:batch_size, Value: 32 - encoder:__choice__, Value: 'OneHotEncoder' - feature_preprocessor:PowerTransformer:standardize, Value: False - feature_preprocessor:__choice__, Value: 'PowerTransformer' - imputer:categorical_strategy, Value: 'most_frequent' - imputer:numerical_strategy, Value: 'median' - lr_scheduler:CosineAnnealingLR:T_max, Value: 103 - lr_scheduler:__choice__, Value: 'CosineAnnealingLR' - network_backbone:MLPBackbone:activation, Value: 'sigmoid' - network_backbone:MLPBackbone:num_groups, Value: 2 - network_backbone:MLPBackbone:num_units_1, Value: 464 - network_backbone:MLPBackbone:num_units_2, Value: 434 - network_backbone:MLPBackbone:use_dropout, Value: False - network_backbone:__choice__, Value: 'MLPBackbone' - network_embedding:__choice__, Value: 'NoEmbedding' - network_head:__choice__, Value: 'fully_connected' - network_head:fully_connected:activation, Value: 'sigmoid' - network_head:fully_connected:num_layers, Value: 3 - network_head:fully_connected:units_layer_1, Value: 434 - network_head:fully_connected:units_layer_2, Value: 118 - network_init:KaimingInit:bias_strategy, Value: 'Zero' - network_init:__choice__, Value: 'KaimingInit' - optimizer:AdamWOptimizer:beta1, Value: 0.9175282300716818 - optimizer:AdamWOptimizer:beta2, Value: 0.9148484215934113 - optimizer:AdamWOptimizer:lr, Value: 0.0010242582346087676 - optimizer:AdamWOptimizer:weight_decay, Value: 0.07425046847093834 - optimizer:__choice__, Value: 'AdamWOptimizer' - scaler:__choice__, Value: 'StandardScaler' - trainer:MixUpTrainer:alpha, Value: 0.9660122415558304 - trainer:MixUpTrainer:weighted_loss, Value: True - trainer:__choice__, Value: 'MixUpTrainer' - , ta_runs=6, ta_time_used=27.81866765022278, wallclock_time=30.25464129447937, budget=5.555555555555555), TrajEntry(train_perf=0.1286549707602339, incumbent_id=4, incumbent=Configuration: - data_loader:batch_size, Value: 268 - encoder:__choice__, Value: 'OneHotEncoder' - feature_preprocessor:TruncatedSVD:target_dim, Value: 5 - feature_preprocessor:__choice__, Value: 'TruncatedSVD' - imputer:categorical_strategy, Value: 'constant_!missing!' - imputer:numerical_strategy, Value: 'mean' - lr_scheduler:CosineAnnealingLR:T_max, Value: 290 - lr_scheduler:__choice__, Value: 'CosineAnnealingLR' - network_backbone:MLPBackbone:activation, Value: 'tanh' - network_backbone:MLPBackbone:num_groups, Value: 9 - network_backbone:MLPBackbone:num_units_1, Value: 854 - network_backbone:MLPBackbone:num_units_2, Value: 409 - network_backbone:MLPBackbone:num_units_3, Value: 904 - network_backbone:MLPBackbone:num_units_4, Value: 89 - network_backbone:MLPBackbone:num_units_5, Value: 875 - network_backbone:MLPBackbone:num_units_6, Value: 352 - network_backbone:MLPBackbone:num_units_7, Value: 687 - network_backbone:MLPBackbone:num_units_8, Value: 863 - network_backbone:MLPBackbone:num_units_9, Value: 422 - network_backbone:MLPBackbone:use_dropout, Value: False - network_backbone:__choice__, Value: 'MLPBackbone' - network_embedding:__choice__, Value: 'NoEmbedding' - network_head:__choice__, Value: 'fully_connected' - network_head:fully_connected:activation, Value: 'relu' - network_head:fully_connected:num_layers, Value: 2 - network_head:fully_connected:units_layer_1, Value: 229 - network_init:KaimingInit:bias_strategy, Value: 'Zero' - network_init:__choice__, Value: 'KaimingInit' - optimizer:AdamOptimizer:beta1, Value: 0.8670243442016202 - optimizer:AdamOptimizer:beta2, Value: 0.9877701057476191 - optimizer:AdamOptimizer:lr, Value: 0.0005235907018237285 - optimizer:AdamOptimizer:weight_decay, Value: 0.061106742612507106 - optimizer:__choice__, Value: 'AdamOptimizer' - scaler:Normalizer:norm, Value: 'mean_abs' - scaler:__choice__, Value: 'Normalizer' - trainer:StandardTrainer:weighted_loss, Value: False - trainer:__choice__, Value: 'StandardTrainer' - , ta_runs=25, ta_time_used=190.4385905265808, wallclock_time=151.50818800926208, budget=50.0)] - {'accuracy': 0.861271676300578} - | | Preprocessing | Estimator | Weight | - |---:|:------------------------------------------------------------------|:----------------------------------------------------------------|---------:| - | 0 | None | SVMLearner | 0.12 | - | 1 | SimpleImputer,OneHotEncoder,StandardScaler,PolynomialFeatures | embedding,MLPBackbone,FullyConnectedHead,nn.Sequential | 0.1 | - | 2 | SimpleImputer,OneHotEncoder,StandardScaler,PowerTransformer | embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.1 | - | 3 | SimpleImputer,OneHotEncoder,StandardScaler,PowerTransformer | no embedding,MLPBackbone,FullyConnectedHead,nn.Sequential | 0.08 | - | 4 | SimpleImputer,OneHotEncoder,StandardScaler,PowerTransformer | no embedding,MLPBackbone,FullyConnectedHead,nn.Sequential | 0.08 | - | 5 | SimpleImputer,OneHotEncoder,NoScaler,TruncSVD | embedding,ShapedResNetBackbone,FullyConnectedHead,nn.Sequential | 0.08 | - | 6 | SimpleImputer,OneHotEncoder,NoScaler,Nystroem | embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.08 | - | 7 | SimpleImputer,OneHotEncoder,NoScaler,Nystroem | embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.06 | - | 8 | None | CBLearner | 0.06 | - | 9 | None | RFLearner | 0.06 | - | 10 | None | KNNLearner | 0.06 | - | 11 | None | ETLearner | 0.04 | - | 12 | SimpleImputer,OneHotEncoder,StandardScaler,PowerTransformer | no embedding,MLPBackbone,FullyConnectedHead,nn.Sequential | 0.02 | - | 13 | SimpleImputer,OneHotEncoder,NoScaler,PolynomialFeatures | embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.02 | - | 14 | SimpleImputer,NoEncoder,MinMaxScaler,KernelPCA | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.02 | - | 15 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.02 | + {'accuracy': 0.8728323699421965} + autoPyTorch results: + Dataset name: 8cc9600d-4be1-11ec-877d-1fe05d8e2eef + Optimisation Metric: accuracy + Best validation score: 0.8713450292397661 + Number of target algorithm runs: 40 + Number of successful target algorithm runs: 31 + Number of crashed target algorithm runs: 6 + Number of target algorithms that exceeded the time limit: 3 + Number of target algorithms that exceeded the memory limit: 0 + @@ -290,17 +111,17 @@ with AutoPyTorch ############################################################################ # Print the final ensemble performance # ==================================== - print(api.run_history, api.trajectory) y_pred = api.predict(X_test) score = api.score(y_pred, y_test) print(score) # Print the final ensemble built by AutoPyTorch - print(api.show_models()) + print(api.sprint_statistics()) + .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 5 minutes 43.309 seconds) + **Total running time of the script:** ( 5 minutes 34.761 seconds) .. _sphx_glr_download_examples_40_advanced_example_parallel_n_jobs.py: diff --git a/development/_sources/examples/40_advanced/example_resampling_strategy.rst.txt b/development/_sources/examples/40_advanced/example_resampling_strategy.rst.txt index 910e80b90..7a4da47ed 100644 --- a/development/_sources/examples/40_advanced/example_resampling_strategy.rst.txt +++ b/development/_sources/examples/40_advanced/example_resampling_strategy.rst.txt @@ -27,7 +27,7 @@ with different resampling strategies in AutoPyTorch By default, AutoPyTorch uses Holdout Validation with a 67% train size split. -.. GENERATED FROM PYTHON SOURCE LINES 11-30 +.. GENERATED FROM PYTHON SOURCE LINES 11-29 .. code-block:: default @@ -56,13 +56,17 @@ a 67% train size split. +.. GENERATED FROM PYTHON SOURCE LINES 30-32 -.. GENERATED FROM PYTHON SOURCE LINES 31-33 +Default Resampling Strategy +============================ + +.. GENERATED FROM PYTHON SOURCE LINES 34-36 Data Loading -============ +------------ -.. GENERATED FROM PYTHON SOURCE LINES 33-40 +.. GENERATED FROM PYTHON SOURCE LINES 36-43 .. code-block:: default @@ -80,12 +84,12 @@ Data Loading -.. GENERATED FROM PYTHON SOURCE LINES 41-43 +.. GENERATED FROM PYTHON SOURCE LINES 44-46 Build and fit a classifier with default resampling strategy -=========================================================== +----------------------------------------------------------- -.. GENERATED FROM PYTHON SOURCE LINES 43-52 +.. GENERATED FROM PYTHON SOURCE LINES 46-55 .. code-block:: default @@ -105,12 +109,12 @@ Build and fit a classifier with default resampling strategy -.. GENERATED FROM PYTHON SOURCE LINES 53-55 +.. GENERATED FROM PYTHON SOURCE LINES 56-58 Search for an ensemble of machine learning algorithms -===================================================== +----------------------------------------------------- -.. GENERATED FROM PYTHON SOURCE LINES 55-65 +.. GENERATED FROM PYTHON SOURCE LINES 58-68 .. code-block:: default @@ -135,16 +139,16 @@ Search for an ensemble of machine learning algorithms .. code-block:: none - + -.. GENERATED FROM PYTHON SOURCE LINES 66-68 +.. GENERATED FROM PYTHON SOURCE LINES 69-71 Print the final ensemble performance -==================================== +------------------------------------ -.. GENERATED FROM PYTHON SOURCE LINES 68-77 +.. GENERATED FROM PYTHON SOURCE LINES 71-80 .. code-block:: default @@ -170,32 +174,38 @@ Print the final ensemble performance {'accuracy': 0.8670520231213873} | | Preprocessing | Estimator | Weight | |---:|:--------------------------------------------------------------|:----------------------------------------------------------------|---------:| - | 0 | None | CBLearner | 0.36 | - | 1 | SimpleImputer,OneHotEncoder,StandardScaler,PolynomialFeatures | embedding,ShapedResNetBackbone,FullyConnectedHead,nn.Sequential | 0.22 | - | 2 | None | ETLearner | 0.2 | - | 3 | SimpleImputer,OneHotEncoder,Normalizer,KitchenSink | embedding,MLPBackbone,FullyConnectedHead,nn.Sequential | 0.14 | - | 4 | SimpleImputer,OneHotEncoder,Normalizer,KitchenSink | embedding,MLPBackbone,FullyConnectedHead,nn.Sequential | 0.06 | - | 5 | None | RFLearner | 0.02 | + | 0 | None | RFLearner | 0.44 | + | 1 | None | ETLearner | 0.22 | + | 2 | SimpleImputer,OneHotEncoder,StandardScaler,PolynomialFeatures | embedding,ShapedResNetBackbone,FullyConnectedHead,nn.Sequential | 0.16 | + | 3 | SimpleImputer,OneHotEncoder,Normalizer,KitchenSink | embedding,MLPBackbone,FullyConnectedHead,nn.Sequential | 0.06 | + | 4 | None | KNNLearner | 0.06 | + | 5 | None | LGBMLearner | 0.04 | + | 6 | None | SVMLearner | 0.02 | autoPyTorch results: - Dataset name: 42a87b39-4bc3-11ec-8727-df8c3c818998 + Dataset name: 2991f4d3-4be3-11ec-877d-1fe05d8e2eef Optimisation Metric: accuracy - Best validation score: 0.8654970760233918 - Number of target algorithm runs: 19 - Number of successful target algorithm runs: 17 + Best validation score: 0.8596491228070176 + Number of target algorithm runs: 16 + Number of successful target algorithm runs: 13 Number of crashed target algorithm runs: 2 - Number of target algorithms that exceeded the time limit: 0 + Number of target algorithms that exceeded the time limit: 1 Number of target algorithms that exceeded the memory limit: 0 -.. GENERATED FROM PYTHON SOURCE LINES 80-82 +.. GENERATED FROM PYTHON SOURCE LINES 83-85 + +Cross validation Resampling Strategy +===================================== + +.. GENERATED FROM PYTHON SOURCE LINES 87-89 Build and fit a classifier with Cross validation resampling strategy -==================================================================== +-------------------------------------------------------------------- -.. GENERATED FROM PYTHON SOURCE LINES 82-87 +.. GENERATED FROM PYTHON SOURCE LINES 89-94 .. code-block:: default @@ -211,15 +221,16 @@ Build and fit a classifier with Cross validation resampling strategy -.. GENERATED FROM PYTHON SOURCE LINES 88-90 +.. GENERATED FROM PYTHON SOURCE LINES 95-97 Search for an ensemble of machine learning algorithms -===================================================== +----------------------------------------------------------------------- -.. GENERATED FROM PYTHON SOURCE LINES 90-100 +.. GENERATED FROM PYTHON SOURCE LINES 97-108 .. code-block:: default + api.search( X_train=X_train, y_train=y_train, @@ -241,16 +252,16 @@ Search for an ensemble of machine learning algorithms .. code-block:: none - + -.. GENERATED FROM PYTHON SOURCE LINES 101-103 +.. GENERATED FROM PYTHON SOURCE LINES 109-111 Print the final ensemble performance -==================================== +------------ -.. GENERATED FROM PYTHON SOURCE LINES 103-112 +.. GENERATED FROM PYTHON SOURCE LINES 111-120 .. code-block:: default @@ -273,17 +284,21 @@ Print the final ensemble performance .. code-block:: none - {'accuracy': 0.884393063583815} - | | Preprocessing | Estimator | Weight | - |---:|:----------------|:------------------------|---------:| - | 0 | None | TabularTraditionalModel | 0.98 | - | 1 | None | TabularTraditionalModel | 0.02 | + {'accuracy': 0.8728323699421965} + | | Preprocessing | Estimator | Weight | + |---:|:------------------------------------------------------------------|:----------------------------------------------------------------|---------:| + | 0 | None | TabularTraditionalModel | 0.42 | + | 1 | None | TabularTraditionalModel | 0.3 | + | 2 | None | TabularTraditionalModel | 0.14 | + | 3 | None | TabularTraditionalModel | 0.1 | + | 4 | None | TabularTraditionalModel | 0.02 | + | 5 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.02 | autoPyTorch results: - Dataset name: aad5970e-4bc3-11ec-8727-df8c3c818998 + Dataset name: 927e5856-4be3-11ec-877d-1fe05d8e2eef Optimisation Metric: accuracy - Best validation score: 0.8742452475491833 - Number of target algorithm runs: 14 - Number of successful target algorithm runs: 11 + Best validation score: 0.8626733083495604 + Number of target algorithm runs: 12 + Number of successful target algorithm runs: 9 Number of crashed target algorithm runs: 2 Number of target algorithms that exceeded the time limit: 1 Number of target algorithms that exceeded the memory limit: 0 @@ -292,12 +307,17 @@ Print the final ensemble performance -.. GENERATED FROM PYTHON SOURCE LINES 115-117 +.. GENERATED FROM PYTHON SOURCE LINES 123-125 + +Stratified Resampling Strategy +=============================== + +.. GENERATED FROM PYTHON SOURCE LINES 127-129 Build and fit a classifier with Stratified resampling strategy -============================================================== +-------------------------------------------------------------- -.. GENERATED FROM PYTHON SOURCE LINES 117-125 +.. GENERATED FROM PYTHON SOURCE LINES 129-137 .. code-block:: default @@ -316,12 +336,12 @@ Build and fit a classifier with Stratified resampling strategy -.. GENERATED FROM PYTHON SOURCE LINES 126-128 +.. GENERATED FROM PYTHON SOURCE LINES 138-140 Search for an ensemble of machine learning algorithms -===================================================== +----------------------------------------------------- -.. GENERATED FROM PYTHON SOURCE LINES 128-138 +.. GENERATED FROM PYTHON SOURCE LINES 140-150 .. code-block:: default @@ -346,16 +366,16 @@ Search for an ensemble of machine learning algorithms .. code-block:: none - + -.. GENERATED FROM PYTHON SOURCE LINES 139-141 +.. GENERATED FROM PYTHON SOURCE LINES 151-153 Print the final ensemble performance ==================================== -.. GENERATED FROM PYTHON SOURCE LINES 141-149 +.. GENERATED FROM PYTHON SOURCE LINES 153-161 .. code-block:: default @@ -380,21 +400,23 @@ Print the final ensemble performance {'accuracy': 0.861271676300578} | | Preprocessing | Estimator | Weight | |---:|:------------------------------------------------------------------|:----------------------------------------------------------------|---------:| - | 0 | None | LGBMLearner | 0.34 | - | 1 | SimpleImputer,OneHotEncoder,Normalizer,KitchenSink | embedding,MLPBackbone,FullyConnectedHead,nn.Sequential | 0.22 | - | 2 | None | CBLearner | 0.14 | - | 3 | SimpleImputer,OneHotEncoder,StandardScaler,PolynomialFeatures | embedding,ShapedResNetBackbone,FullyConnectedHead,nn.Sequential | 0.12 | - | 4 | None | ETLearner | 0.08 | - | 5 | None | SVMLearner | 0.06 | - | 6 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.02 | - | 7 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.02 | + | 0 | None | RFLearner | 0.28 | + | 1 | SimpleImputer,OneHotEncoder,StandardScaler,PolynomialFeatures | embedding,ShapedResNetBackbone,FullyConnectedHead,nn.Sequential | 0.2 | + | 2 | None | KNNLearner | 0.16 | + | 3 | None | SVMLearner | 0.1 | + | 4 | SimpleImputer,OneHotEncoder,Normalizer,KitchenSink | embedding,MLPBackbone,FullyConnectedHead,nn.Sequential | 0.08 | + | 5 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.06 | + | 6 | None | LGBMLearner | 0.04 | + | 7 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.04 | + | 8 | None | ETLearner | 0.02 | + | 9 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.02 | autoPyTorch results: - Dataset name: 1e21343e-4bc4-11ec-8727-df8c3c818998 + Dataset name: 050d416d-4be4-11ec-877d-1fe05d8e2eef Optimisation Metric: accuracy - Best validation score: 0.847953216374269 + Best validation score: 0.8362573099415205 Number of target algorithm runs: 18 - Number of successful target algorithm runs: 15 - Number of crashed target algorithm runs: 2 + Number of successful target algorithm runs: 14 + Number of crashed target algorithm runs: 3 Number of target algorithms that exceeded the time limit: 1 Number of target algorithms that exceeded the memory limit: 0 @@ -405,7 +427,7 @@ Print the final ensemble performance .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 9 minutes 1.230 seconds) + **Total running time of the script:** ( 9 minutes 0.433 seconds) .. _sphx_glr_download_examples_40_advanced_example_resampling_strategy.py: diff --git a/development/_sources/examples/40_advanced/example_run_with_portfolio.rst.txt b/development/_sources/examples/40_advanced/example_run_with_portfolio.rst.txt index b5c067e3b..a79d35cde 100644 --- a/development/_sources/examples/40_advanced/example_run_with_portfolio.rst.txt +++ b/development/_sources/examples/40_advanced/example_run_with_portfolio.rst.txt @@ -25,7 +25,101 @@ Tabular Classification with Greedy Portfolio The following example shows how to fit a sample classification model with AutoPyTorch using the greedy portfolio -.. GENERATED FROM PYTHON SOURCE LINES 9-74 +.. GENERATED FROM PYTHON SOURCE LINES 9-27 + +.. code-block:: default + + import os + import tempfile as tmp + import warnings + + os.environ['JOBLIB_TEMP_FOLDER'] = tmp.gettempdir() + os.environ['OMP_NUM_THREADS'] = '1' + os.environ['OPENBLAS_NUM_THREADS'] = '1' + os.environ['MKL_NUM_THREADS'] = '1' + + warnings.simplefilter(action='ignore', category=UserWarning) + warnings.simplefilter(action='ignore', category=FutureWarning) + + import sklearn.datasets + import sklearn.model_selection + + from autoPyTorch.api.tabular_classification import TabularClassificationTask + + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 28-30 + +Data Loading +============ + +.. GENERATED FROM PYTHON SOURCE LINES 30-37 + +.. code-block:: default + + X, y = sklearn.datasets.fetch_openml(data_id=40981, return_X_y=True, as_frame=True) + X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split( + X, + y, + random_state=42, + ) + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 38-40 + +Build and fit a classifier +========================== + +.. GENERATED FROM PYTHON SOURCE LINES 40-44 + +.. code-block:: default + + api = TabularClassificationTask( + seed=42, + ) + + + + + + + + +.. GENERATED FROM PYTHON SOURCE LINES 45-47 + +Search for an ensemble of machine learning algorithms +===================================================== + +.. GENERATED FROM PYTHON SOURCE LINES 47-61 + +.. code-block:: default + + api.search( + X_train=X_train, + y_train=y_train, + X_test=X_test.copy(), + y_test=y_test.copy(), + optimize_metric='accuracy', + total_walltime_limit=300, + func_eval_time_limit_secs=50, + # Setting this option to "greedy" + # will make smac run the configurations + # present in 'autoPyTorch/configs/greedy_portfolio.json' + portfolio_selection="greedy" + ) + @@ -36,112 +130,68 @@ with AutoPyTorch using the greedy portfolio .. code-block:: none - {'accuracy': 0.861271676300578} - | | Preprocessing | Estimator | Weight | - |---:|:------------------------------------------------------------------|:-------------------------------------------------------------------|---------:| - | 0 | None | CBLearner | 0.34 | - | 1 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedResNetBackbone,FullyConnectedHead,nn.Sequential | 0.12 | - | 2 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.1 | - | 3 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedResNetBackbone,FullyConnectedHead,nn.Sequential | 0.1 | - | 4 | None | RFLearner | 0.08 | - | 5 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedResNetBackbone,FullyConnectedHead,nn.Sequential | 0.08 | - | 6 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedResNetBackbone,FullyConnectedHead,nn.Sequential | 0.04 | - | 7 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.04 | - | 8 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedResNetBackbone,FullyConnectedHead,nn.Sequential | 0.02 | - | 9 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedResNetBackbone,FullyConnectedHead,nn.Sequential | 0.02 | - | 10 | SimpleImputer,OneHotEncoder,StandardScaler,PolynomialFeatures | embedding,ResNetBackbone,FullyConnectedHead,nn.Sequential | 0.02 | - | 11 | SimpleImputer,OneHotEncoder,NoScaler,NoFeaturePreprocessing | embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.02 | - | 12 | None | ETLearner | 0.02 | - autoPyTorch results: - Dataset name: 81fb4553-4bc2-11ec-8727-df8c3c818998 - Optimisation Metric: accuracy - Best validation score: 0.8771929824561403 - Number of target algorithm runs: 31 - Number of successful target algorithm runs: 28 - Number of crashed target algorithm runs: 3 - Number of target algorithms that exceeded the time limit: 0 - Number of target algorithms that exceeded the memory limit: 0 + +.. GENERATED FROM PYTHON SOURCE LINES 62-64 +Print the final ensemble performance +==================================== - -| +.. GENERATED FROM PYTHON SOURCE LINES 64-72 .. code-block:: default - import os - import tempfile as tmp - import warnings + y_pred = api.predict(X_test) + score = api.score(y_pred, y_test) + print(score) + # Print the final ensemble built by AutoPyTorch + print(api.show_models()) - os.environ['JOBLIB_TEMP_FOLDER'] = tmp.gettempdir() - os.environ['OMP_NUM_THREADS'] = '1' - os.environ['OPENBLAS_NUM_THREADS'] = '1' - os.environ['MKL_NUM_THREADS'] = '1' + # Print statistics from search + print(api.sprint_statistics()) - warnings.simplefilter(action='ignore', category=UserWarning) - warnings.simplefilter(action='ignore', category=FutureWarning) - import sklearn.datasets - import sklearn.model_selection - from autoPyTorch.api.tabular_classification import TabularClassificationTask + +.. rst-class:: sphx-glr-script-out + + Out: + + .. code-block:: none + + {'accuracy': 0.8670520231213873} + | | Preprocessing | Estimator | Weight | + |---:|:------------------------------------------------------------------|:-------------------------------------------------------------------|---------:| + | 0 | None | CBLearner | 0.54 | + | 1 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedResNetBackbone,FullyConnectedHead,nn.Sequential | 0.12 | + | 2 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential | 0.08 | + | 3 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedResNetBackbone,FullyConnectedHead,nn.Sequential | 0.08 | + | 4 | None | RFLearner | 0.06 | + | 5 | None | ETLearner | 0.04 | + | 6 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedResNetBackbone,FullyConnectedHead,nn.Sequential | 0.04 | + | 7 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedResNetBackbone,FullyConnectedHead,nn.Sequential | 0.02 | + | 8 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedResNetBackbone,FullyConnectedHead,nn.Sequential | 0.02 | + autoPyTorch results: + Dataset name: c9873975-4be0-11ec-877d-1fe05d8e2eef + Optimisation Metric: accuracy + Best validation score: 0.8771929824561403 + Number of target algorithm runs: 23 + Number of successful target algorithm runs: 20 + Number of crashed target algorithm runs: 1 + Number of target algorithms that exceeded the time limit: 2 + Number of target algorithms that exceeded the memory limit: 0 + + - if __name__ == '__main__': - - ############################################################################ - # Data Loading - # ============ - X, y = sklearn.datasets.fetch_openml(data_id=40981, return_X_y=True, as_frame=True) - X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split( - X, - y, - random_state=42, - ) - - ############################################################################ - # Build and fit a classifier - # ========================== - api = TabularClassificationTask( - seed=42, - ) - - ############################################################################ - # Search for an ensemble of machine learning algorithms - # ===================================================== - api.search( - X_train=X_train, - y_train=y_train, - X_test=X_test.copy(), - y_test=y_test.copy(), - optimize_metric='accuracy', - total_walltime_limit=300, - func_eval_time_limit_secs=50, - # Setting this option to "greedy" - # will make smac run the configurations - # present in 'autoPyTorch/configs/greedy_portfolio.json' - portfolio_selection="greedy" - ) - - ############################################################################ - # Print the final ensemble performance - # ==================================== - y_pred = api.predict(X_test) - score = api.score(y_pred, y_test) - print(score) - # Print the final ensemble built by AutoPyTorch - print(api.show_models()) - - # Print statistics from search - print(api.sprint_statistics()) .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 5 minutes 22.967 seconds) + **Total running time of the script:** ( 5 minutes 27.265 seconds) .. _sphx_glr_download_examples_40_advanced_example_run_with_portfolio.py: diff --git a/development/_sources/examples/40_advanced/example_visualization.rst.txt b/development/_sources/examples/40_advanced/example_visualization.rst.txt index defbe3f43..ca72a45d4 100644 --- a/development/_sources/examples/40_advanced/example_visualization.rst.txt +++ b/development/_sources/examples/40_advanced/example_visualization.rst.txt @@ -135,7 +135,7 @@ Build and fit a classifier .. code-block:: none - + @@ -272,7 +272,7 @@ Plotting the model performance .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 4 minutes 11.809 seconds) + **Total running time of the script:** ( 3 minutes 47.282 seconds) .. _sphx_glr_download_examples_40_advanced_example_visualization.py: diff --git a/development/_sources/examples/40_advanced/sg_execution_times.rst.txt b/development/_sources/examples/40_advanced/sg_execution_times.rst.txt index 8e94f9bcb..7eb25058b 100644 --- a/development/_sources/examples/40_advanced/sg_execution_times.rst.txt +++ b/development/_sources/examples/40_advanced/sg_execution_times.rst.txt @@ -5,16 +5,16 @@ Computation times ================= -**30:05.174** total execution time for **examples_40_advanced** files: +**29:46.891** total execution time for **examples_40_advanced** files: +------------------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_examples_40_advanced_example_resampling_strategy.py` (``example_resampling_strategy.py``) | 09:01.230 | 0.0 MB | +| :ref:`sphx_glr_examples_40_advanced_example_resampling_strategy.py` (``example_resampling_strategy.py``) | 09:00.433 | 0.0 MB | +------------------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_examples_40_advanced_example_custom_configuration_space.py` (``example_custom_configuration_space.py``) | 05:45.859 | 0.0 MB | +| :ref:`sphx_glr_examples_40_advanced_example_custom_configuration_space.py` (``example_custom_configuration_space.py``) | 05:57.148 | 0.0 MB | +------------------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_examples_40_advanced_example_parallel_n_jobs.py` (``example_parallel_n_jobs.py``) | 05:43.309 | 0.0 MB | +| :ref:`sphx_glr_examples_40_advanced_example_parallel_n_jobs.py` (``example_parallel_n_jobs.py``) | 05:34.761 | 0.0 MB | +------------------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_examples_40_advanced_example_run_with_portfolio.py` (``example_run_with_portfolio.py``) | 05:22.967 | 0.0 MB | +| :ref:`sphx_glr_examples_40_advanced_example_run_with_portfolio.py` (``example_run_with_portfolio.py``) | 05:27.265 | 0.0 MB | +------------------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_examples_40_advanced_example_visualization.py` (``example_visualization.py``) | 04:11.809 | 0.0 MB | +| :ref:`sphx_glr_examples_40_advanced_example_visualization.py` (``example_visualization.py``) | 03:47.282 | 0.0 MB | +------------------------------------------------------------------------------------------------------------------------+-----------+--------+ diff --git a/development/_sources/examples/index.rst.txt b/development/_sources/examples/index.rst.txt index ace8d26a0..b0abcbcc5 100644 --- a/development/_sources/examples/index.rst.txt +++ b/development/_sources/examples/index.rst.txt @@ -115,14 +115,14 @@ Advanced examples for using *Auto-PyTorch* on tabular datasets. .. raw:: html -
+
.. only:: html - .. figure:: /examples/40_advanced/images/thumb/sphx_glr_example_parallel_n_jobs_thumb.png - :alt: Tabular Classification + .. figure:: /examples/40_advanced/images/thumb/sphx_glr_example_run_with_portfolio_thumb.png + :alt: Tabular Classification with Greedy Portfolio - :ref:`sphx_glr_examples_40_advanced_example_parallel_n_jobs.py` + :ref:`sphx_glr_examples_40_advanced_example_run_with_portfolio.py` .. raw:: html @@ -132,18 +132,18 @@ Advanced examples for using *Auto-PyTorch* on tabular datasets. .. toctree:: :hidden: - /examples/40_advanced/example_parallel_n_jobs + /examples/40_advanced/example_run_with_portfolio .. raw:: html -
+
.. only:: html - .. figure:: /examples/40_advanced/images/thumb/sphx_glr_example_run_with_portfolio_thumb.png - :alt: Tabular Classification with Greedy Portfolio + .. figure:: /examples/40_advanced/images/thumb/sphx_glr_example_parallel_n_jobs_thumb.png + :alt: Tabular Classification with n parallel jobs - :ref:`sphx_glr_examples_40_advanced_example_run_with_portfolio.py` + :ref:`sphx_glr_examples_40_advanced_example_parallel_n_jobs.py` .. raw:: html @@ -153,18 +153,18 @@ Advanced examples for using *Auto-PyTorch* on tabular datasets. .. toctree:: :hidden: - /examples/40_advanced/example_run_with_portfolio + /examples/40_advanced/example_parallel_n_jobs .. raw:: html -
+
.. only:: html - .. figure:: /examples/40_advanced/images/thumb/sphx_glr_example_resampling_strategy_thumb.png - :alt: Tabular Classification with different resampling strategy + .. figure:: /examples/40_advanced/images/thumb/sphx_glr_example_custom_configuration_space_thumb.png + :alt: Tabular Classification with Custom Configuration Space - :ref:`sphx_glr_examples_40_advanced_example_resampling_strategy.py` + :ref:`sphx_glr_examples_40_advanced_example_custom_configuration_space.py` .. raw:: html @@ -174,18 +174,18 @@ Advanced examples for using *Auto-PyTorch* on tabular datasets. .. toctree:: :hidden: - /examples/40_advanced/example_resampling_strategy + /examples/40_advanced/example_custom_configuration_space .. raw:: html -
+
.. only:: html - .. figure:: /examples/40_advanced/images/thumb/sphx_glr_example_custom_configuration_space_thumb.png - :alt: Tabular Classification with Custom Configuration Space + .. figure:: /examples/40_advanced/images/thumb/sphx_glr_example_resampling_strategy_thumb.png + :alt: Tabular Classification with different resampling strategy - :ref:`sphx_glr_examples_40_advanced_example_custom_configuration_space.py` + :ref:`sphx_glr_examples_40_advanced_example_resampling_strategy.py` .. raw:: html @@ -195,7 +195,7 @@ Advanced examples for using *Auto-PyTorch* on tabular datasets. .. toctree:: :hidden: - /examples/40_advanced/example_custom_configuration_space + /examples/40_advanced/example_resampling_strategy .. raw:: html diff --git a/development/examples/20_basics/example_image_classification.html b/development/examples/20_basics/example_image_classification.html index bb4d22290..58ea9a3ec 100644 --- a/development/examples/20_basics/example_image_classification.html +++ b/development/examples/20_basics/example_image_classification.html @@ -30332,16 +30332,17 @@ ________________________________________ Configuration: image_augmenter:GaussianBlur:use_augmenter, Value: False - image_augmenter:GaussianNoise:use_augmenter, Value: False - image_augmenter:RandomAffine:rotate, Value: 65 - image_augmenter:RandomAffine:scale_offset, Value: 0.10364752234694663 - image_augmenter:RandomAffine:shear, Value: 5 - image_augmenter:RandomAffine:translate_percent_offset, Value: 0.12303023778688212 + image_augmenter:GaussianNoise:sigma_offset, Value: 2.939416777169848 + image_augmenter:GaussianNoise:use_augmenter, Value: True + image_augmenter:RandomAffine:rotate, Value: 182 + image_augmenter:RandomAffine:scale_offset, Value: 0.2653043460236015 + image_augmenter:RandomAffine:shear, Value: 7 + image_augmenter:RandomAffine:translate_percent_offset, Value: 0.2981323677443226 image_augmenter:RandomAffine:use_augmenter, Value: True - image_augmenter:RandomCutout:p, Value: 0.9516838776905963 + image_augmenter:RandomCutout:p, Value: 0.46400105311756495 image_augmenter:RandomCutout:use_augmenter, Value: True image_augmenter:Resize:use_augmenter, Value: False - image_augmenter:ZeroPadAndCrop:percent, Value: 0.2732380932749452 + image_augmenter:ZeroPadAndCrop:percent, Value: 0.05116366366228997 normalizer:__choice__, Value: 'ImageNormalizer' Fitting the pipeline... @@ -30414,7 +30415,7 @@ print(pipeline)
-

Total running time of the script: ( 0 minutes 6.216 seconds)

+

Total running time of the script: ( 0 minutes 7.489 seconds)

Out:

-
<autoPyTorch.api.tabular_classification.TabularClassificationTask object at 0x7f2f6f8c4940>
+
<autoPyTorch.api.tabular_classification.TabularClassificationTask object at 0x7f4c008a98e0>
 
@@ -204,30 +204,32 @@

Print the final ensemble performanceOut:

-
{'accuracy': 0.8554913294797688}
-|    | Preprocessing                                             | Estimator                                                       |   Weight |
-|---:|:----------------------------------------------------------|:----------------------------------------------------------------|---------:|
-|  0 | None                                                      | RFLearner                                                       |     0.24 |
-|  1 | SimpleImputer,OneHotEncoder,Normalizer,KernelPCA          | embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential    |     0.22 |
-|  2 | None                                                      | SVMLearner                                                      |     0.18 |
-|  3 | None                                                      | CBLearner                                                       |     0.1  |
-|  4 | None                                                      | ETLearner                                                       |     0.08 |
-|  5 | None                                                      | KNNLearner                                                      |     0.08 |
-|  6 | SimpleImputer,OneHotEncoder,MinMaxScaler,PowerTransformer | embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential    |     0.04 |
-|  7 | SimpleImputer,NoEncoder,Normalizer,Nystroem               | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential |     0.04 |
-|  8 | None                                                      | LGBMLearner                                                     |     0.02 |
+
{'accuracy': 0.838150289017341}
+|    | Preprocessing                                                     | Estimator                                                       |   Weight |
+|---:|:------------------------------------------------------------------|:----------------------------------------------------------------|---------:|
+|  0 | SimpleImputer,OneHotEncoder,Normalizer,KernelPCA                  | embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential    |     0.2  |
+|  1 | None                                                              | KNNLearner                                                      |     0.16 |
+|  2 | None                                                              | CBLearner                                                       |     0.14 |
+|  3 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential |     0.12 |
+|  4 | SimpleImputer,OneHotEncoder,Normalizer,PowerTransformer           | embedding,ResNetBackbone,FullyConnectedHead,nn.Sequential       |     0.08 |
+|  5 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential |     0.08 |
+|  6 | SimpleImputer,OneHotEncoder,MinMaxScaler,PowerTransformer         | embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential    |     0.06 |
+|  7 | SimpleImputer,NoEncoder,Normalizer,Nystroem                       | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential |     0.06 |
+|  8 | None                                                              | SVMLearner                                                      |     0.04 |
+|  9 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential |     0.04 |
+| 10 | SimpleImputer,OneHotEncoder,MinMaxScaler,TruncSVD                 | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential |     0.02 |
 autoPyTorch results:
         Dataset name: Australian
         Optimisation Metric: accuracy
         Best validation score: 0.8713450292397661
-        Number of target algorithm runs: 23
+        Number of target algorithm runs: 22
         Number of successful target algorithm runs: 19
         Number of crashed target algorithm runs: 2
-        Number of target algorithms that exceeded the time limit: 2
+        Number of target algorithms that exceeded the time limit: 1
         Number of target algorithms that exceeded the memory limit: 0
 
-

Total running time of the script: ( 5 minutes 22.150 seconds)

+

Total running time of the script: ( 5 minutes 35.087 seconds)

Out:

-
<autoPyTorch.api.tabular_regression.TabularRegressionTask object at 0x7f30125fdca0>
+
<autoPyTorch.api.tabular_regression.TabularRegressionTask object at 0x7f4ca3439dc0>
 
@@ -198,7 +198,7 @@

Print the final ensemble performanceOut:

-
{'r2': 0.9445248186059718}
+
{'r2': 0.944631023189658}
 |    | Preprocessing                                                     | Estimator                                                       |   Weight |
 |---:|:------------------------------------------------------------------|:----------------------------------------------------------------|---------:|
 |  0 | SimpleImputer,OneHotEncoder,StandardScaler,NoFeaturePreprocessing | no embedding,ShapedMLPBackbone,FullyConnectedHead,nn.Sequential |     0.44 |
@@ -206,9 +206,9 @@ 

Print the final ensemble performanceTotal running time of the script: ( 5 minutes 37.415 seconds)

+

Total running time of the script: ( 5 minutes 36.563 seconds)