From 66e5d3cd93416c3a02041e7bc217af96dff71dcd Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Wed, 22 Sep 2021 17:23:14 +0000 Subject: [PATCH 01/60] Change TF and Cuda versions --- recommenders/README.md | 4 ++-- recommenders/__init__.py | 2 +- setup.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/recommenders/README.md b/recommenders/README.md index d520b3d6f2..7c1a2f9d38 100644 --- a/recommenders/README.md +++ b/recommenders/README.md @@ -52,9 +52,9 @@ pip install recommenders[examples,gpu] ## GPU Support -You will need CUDA Toolkit v10.0 and CuDNN >= 7.6 to enable both Tensorflow and PyTorch to use the GPU. For example, if you are using a conda enviroment, this can be installed with +You will need CUDA Toolkit v11.2 and CuDNN = 8.1 to enable both Tensorflow and PyTorch to use the GPU. For example, if you are using a conda enviroment, this can be installed with ```bash -conda install cudatoolkit=10.0 "cudnn>=7.6" +conda install -c conda-forge cudatoolkit=11.2 cudnn=8.1 ``` For a virtual environment, you may use a [docker container by Nvidia](../SETUP.md#using-a-virtual-environment). diff --git a/recommenders/__init__.py b/recommenders/__init__.py index f96b0e4011..195e30efa3 100644 --- a/recommenders/__init__.py +++ b/recommenders/__init__.py @@ -2,7 +2,7 @@ # Licensed under the MIT License. __title__ = "Microsoft Recommenders" -__version__ = "0.7.0" +__version__ = "0.8.0" __author__ = "RecoDev Team at Microsoft" __license__ = "MIT" __copyright__ = "Copyright 2018-present Microsoft Corporation" diff --git a/setup.py b/setup.py index 0aba6982be..f35031776d 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ version += ".post" + str(int(time.time())) install_requires = [ - "numpy>=1.14", + "numpy>=1.20", "pandas>1.0.3,<2", "scipy>=1.0.0,<2", "tqdm>=4.31.1,<5", @@ -60,7 +60,7 @@ ], "gpu": [ "nvidia-ml-py3>=7.352.0", - "tensorflow-gpu>=1.15.0,<2", # compiled with CUDA 10.0 + "tensorflow>=2.6", # compiled with CUDA 11.2, cudnn 8.1 "torch==1.2.0", # last os-common version with CUDA 10.0 support "fastai>=1.0.46,<2", ], From 3396f2c4bd430b1017ab8fc2a7ee432ea0ad2667 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Mon, 27 Sep 2021 11:51:30 +0000 Subject: [PATCH 02/60] Fix numpy version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f35031776d..0377c49eb7 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ version += ".post" + str(int(time.time())) install_requires = [ - "numpy>=1.20", + "numpy>=1.19", "pandas>1.0.3,<2", "scipy>=1.0.0,<2", "tqdm>=4.31.1,<5", From 153099e52e63d4b571af5f407d6bcf2e5e267bac Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Mon, 27 Sep 2021 11:52:20 +0000 Subject: [PATCH 03/60] Explain numpy version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 0377c49eb7..cf16bd88c5 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ version += ".post" + str(int(time.time())) install_requires = [ - "numpy>=1.19", + "numpy>=1.19", # 1.19 required by tensorflow "pandas>1.0.3,<2", "scipy>=1.0.0,<2", "tqdm>=4.31.1,<5", From 68af5162432cea36b60ef84ea93acf2ed4b2ceb7 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Mon, 11 Oct 2021 15:55:21 +0000 Subject: [PATCH 04/60] Specify no-binary install for Surprise --- README.md | 2 +- SETUP.md | 2 +- docs/README.md | 2 +- recommenders/README.md | 14 +++++++------- tools/docker/Dockerfile | 18 +++++++++--------- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index f9fad2d13b..e93f4c5bad 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ On Windows you will need [Microsoft C++ Build Tools](https://visualstudio.micros ```bash pip install --upgrade pip pip install --upgrade setuptools -pip install recommenders[examples] +pip install --no-cache --no-binary scikit-surprise recommenders[examples] ``` 4. Register your (conda or virtual) environment with Jupyter: diff --git a/SETUP.md b/SETUP.md index b39283380a..dde2f9c831 100644 --- a/SETUP.md +++ b/SETUP.md @@ -179,7 +179,7 @@ In the following `3.6` should be replaced with the Python version you are using export PYSPARK_DRIVER_PYTHON=/venv/bin/python export PYSPARK_PYTHON=/venv/bin/python - pip install recommenders[all] + pip install --no-cache --no-binary scikit-surprise recommenders[all] If you prefer to use [virtualenv](https://virtualenv.pypa.io/en/latest/index.html#) instead of venv, you may follow the above steps, except you will need to replace the line diff --git a/docs/README.md b/docs/README.md index c1855fdd2c..45b05565b6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,7 +4,7 @@ To setup the documentation, first you need to install the dependencies of the fu conda create -n reco_full python=3.6 cudatoolkit=10.0 "cudnn>=7.6" conda activate reco_full - pip install .[all] + pip install --no-cache --no-binary scikit-surprise .[all] pip install sphinx_rtd_theme diff --git a/recommenders/README.md b/recommenders/README.md index 0c19f49a45..4d50b0216c 100644 --- a/recommenders/README.md +++ b/recommenders/README.md @@ -20,7 +20,7 @@ For more details about the software requirements that must be pre-installed on e To install core utilities, CPU-based algorithms, and dependencies ```bash pip install --upgrade pip -pip install recommenders +pip install --no-cache --no-binary scikit-surprise recommenders ``` ## Optional Dependencies @@ -39,10 +39,10 @@ Note that, currently, NNI and Vowpal Wabbit are in the experimental group. These groups can be installed alone or in combination: ```bash # install recommenders with core requirements and support for CPU-based recommender algorithms and notebooks -pip install recommenders[examples] +pip install --no-cache --no-binary scikit-surprise recommenders[examples] # add support for running example notebooks and GPU functionality -pip install recommenders[examples,gpu] +pip install --no-cache --no-binary scikit-surprise recommenders[examples,gpu] ``` ## GPU Support @@ -57,7 +57,7 @@ For manual installation of the necessary requirements see [TensorFlow](https://w When installing with GPU support you will need to point to the PyTorch index to ensure you are downloading a version of PyTorch compiled with CUDA support. This can be done using the --find-links or -f option below. -`pip install recommenders[gpu] -f https://download.pytorch.org/whl/cu100/torch_stable.html` +`pip install --no-cache --no-binary scikit-surprise recommenders[gpu] -f https://download.pytorch.org/whl/cu100/torch_stable.html` ## Experimental dependencies @@ -74,12 +74,12 @@ a [setup.py](../setup.py) file is provided in order to simplify the installation This still requires an environment to be installed as described in the [setup guide](../SETUP.md). Once the necessary dependencies are installed, you can use the following command to install `recommenders` as a python package. - pip install -e . + pip install --no-cache --no-binary scikit-surprise -e . It is also possible to install directly from GitHub. Or from a specific branch as well. - pip install -e git+https://github.com/microsoft/recommenders/#egg=pkg - pip install -e git+https://github.com/microsoft/recommenders/@staging#egg=pkg + pip install --no-cache --no-binary scikit-surprise -e git+https://github.com/microsoft/recommenders/#egg=pkg + pip install --no-cache --no-binary scikit-surprise -e git+https://github.com/microsoft/recommenders/@staging#egg=pkg **NOTE** - The pip installation does not install all of the pre-requisites; it is assumed that the environment has already been set up according to the [setup guide](../SETUP.md), for the utilities to be used. diff --git a/tools/docker/Dockerfile b/tools/docker/Dockerfile index 3d7525617f..97ecb30422 100644 --- a/tools/docker/Dockerfile +++ b/tools/docker/Dockerfile @@ -61,8 +61,8 @@ RUN if [ "${VIRTUAL_ENV}" = "virtualenv" ] ; then python3.7 -m virtualenv $HOME/ FROM base AS cpu RUN if [ "${VIRTUAL_ENV}" = "venv" ] || [ "${VIRTUAL_ENV}" = "virtualenv" ]; then source $HOME/${VIRTUAL_ENV}/bin/activate; \ - pip install recommenders[xlearn,examples]; fi -RUN if [ "${VIRTUAL_ENV}" = "conda" ] ; then pip install recommenders[xlearn,examples]; fi + pip install --no-cache --no-binary scikit-surprise recommenders[xlearn,examples]; fi +RUN if [ "${VIRTUAL_ENV}" = "conda" ] ; then pip install --no-cache --no-binary scikit-surprise recommenders[xlearn,examples]; fi ############### @@ -80,8 +80,8 @@ ENV JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64" \ # Install dependencies in virtual environment RUN if [ "${VIRTUAL_ENV}" = "venv" ] || [ "${VIRTUAL_ENV}" = "virtualenv" ]; then source $HOME/${VIRTUAL_ENV}/bin/activate; \ - pip install recommenders[spark,xlearn,examples]; fi -RUN if [ "${VIRTUAL_ENV}" = "conda" ] ; then pip install recommenders[spark,xlearn,examples]; fi + pip install --no-cache --no-binary scikit-surprise recommenders[spark,xlearn,examples]; fi +RUN if [ "${VIRTUAL_ENV}" = "conda" ] ; then pip install --no-cache --no-binary scikit-surprise recommenders[spark,xlearn,examples]; fi ########### @@ -129,15 +129,15 @@ RUN if [ "${VIRTUAL_ENV}" = "venv" ] ; then python3.7 -m venv --system-site-pack source $HOME/${VIRTUAL_ENV}/bin/activate; \ pip install --upgrade pip; \ pip install --upgrade setuptools; \ - pip install recommenders[gpu,xlearn,examples]; fi + pip install --no-cache --no-binary scikit-surprise recommenders[gpu,xlearn,examples]; fi RUN if [ "${VIRTUAL_ENV}" = "virtualenv" ] ; then python3.7 -m virtualenv $HOME/${VIRTUAL_ENV}; \ source $HOME/${VIRTUAL_ENV}/bin/activate; \ pip install --upgrade pip; \ pip install --upgrade setuptools; \ - pip install recommenders[gpu,xlearn,examples]; fi + pip install --no-cache --no-binary scikit-surprise recommenders[gpu,xlearn,examples]; fi RUN if [ "${VIRTUAL_ENV}" = "conda" ] ; then \ - pip install recommenders[gpu,xlearn,examples] -f https://download.pytorch.org/whl/cu100/torch_stable.html ; fi + pip install --no-cache --no-binary scikit-surprise recommenders[gpu,xlearn,examples] -f https://download.pytorch.org/whl/cu100/torch_stable.html ; fi ############ @@ -160,8 +160,8 @@ ENV JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64" \ # Install dependencies in virtual environment RUN if [ "${VIRTUAL_ENV}" = "venv" ] || [ "${VIRTUAL_ENV}" = "virtualenv" ]; then source $HOME/${VIRTUAL_ENV}/bin/activate; \ - pip install recommenders[all]; fi -RUN if [ "${VIRTUAL_ENV}" = "conda" ] ; then pip install recommenders[all]; fi + pip install --no-cache --no-binary scikit-surprise recommenders[all]; fi +RUN if [ "${VIRTUAL_ENV}" = "conda" ] ; then pip install --no-cache --no-binary scikit-surprise recommenders[all]; fi ############# From aafbe1a7e0dd59196ef7a96e8714b88c4ae20762 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Mon, 11 Oct 2021 16:22:19 +0000 Subject: [PATCH 05/60] Update CUDA version --- SETUP.md | 2 +- docs/README.md | 2 +- recommenders/README.md | 2 +- setup.py | 2 +- tests/ci/azure_pipeline_test/dsvm_nightly_linux_gpu.yml | 2 +- tests/ci/azure_pipeline_test/dsvm_notebook_linux_gpu.yml | 2 +- tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml | 2 +- tests/ci/azure_pipeline_test/release_pipeline.yml | 6 +++--- tools/docker/Dockerfile | 2 +- tools/generate_conda_file.py | 6 +++--- 10 files changed, 14 insertions(+), 14 deletions(-) diff --git a/SETUP.md b/SETUP.md index dde2f9c831..ea823c6fa2 100644 --- a/SETUP.md +++ b/SETUP.md @@ -157,7 +157,7 @@ In the following `3.6` should be replaced with the Python version you are using sudo dockerd & # Pull the image from the Nvidia docker hub (https://hub.docker.com/r/nvidia/cuda) that is suitable for your system # E.g. for Ubuntu 18.04 do - sudo docker run --gpus all -it --rm nvidia/cuda:10.0-cudnn7-runtime-ubuntu18.04 + sudo docker run --gpus all -it --rm nvidia/cuda:11.2-cudnn8.1-runtime-ubuntu18.04 # Within the container: diff --git a/docs/README.md b/docs/README.md index 45b05565b6..763bb71adb 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,7 +2,7 @@ To setup the documentation, first you need to install the dependencies of the full environment. For it please follow the [SETUP.md](../SETUP.md). Then type: - conda create -n reco_full python=3.6 cudatoolkit=10.0 "cudnn>=7.6" + conda create -n reco_full -c conda-forge python=3.6 cudatoolkit=11.2 cudnn=8.1 conda activate reco_full pip install --no-cache --no-binary scikit-surprise .[all] pip install sphinx_rtd_theme diff --git a/recommenders/README.md b/recommenders/README.md index 4d50b0216c..0852c35045 100644 --- a/recommenders/README.md +++ b/recommenders/README.md @@ -47,7 +47,7 @@ pip install --no-cache --no-binary scikit-surprise recommenders[examples,gpu] ## GPU Support -You will need CUDA Toolkit v11.2 and CuDNN = 8.1 to enable both Tensorflow and PyTorch to use the GPU. For example, if you are using a conda enviroment, this can be installed with +You will need CUDA Toolkit v11.2 and CuDNN v8.1 to enable both Tensorflow and PyTorch to use the GPU. For example, if you are using a conda enviroment, this can be installed with ```bash conda install -c conda-forge cudatoolkit=11.2 cudnn=8.1 ``` diff --git a/setup.py b/setup.py index fc1610da5b..e9ed873fad 100644 --- a/setup.py +++ b/setup.py @@ -67,7 +67,7 @@ "gpu": [ "nvidia-ml-py3>=7.352.0", "tensorflow>=2.6", # compiled with CUDA 11.2, cudnn 8.1 - "torch==1.2.0", # last os-common version with CUDA 10.0 support + "torch>=1.8", # for CUDA 11 support "fastai>=1.0.46,<2", ], "spark": [ diff --git a/tests/ci/azure_pipeline_test/dsvm_nightly_linux_gpu.yml b/tests/ci/azure_pipeline_test/dsvm_nightly_linux_gpu.yml index c43e8ec981..ef26fb5425 100644 --- a/tests/ci/azure_pipeline_test/dsvm_nightly_linux_gpu.yml +++ b/tests/ci/azure_pipeline_test/dsvm_nightly_linux_gpu.yml @@ -31,7 +31,7 @@ extends: task_name: "Test - Nightly Linux GPU" timeout: 240 conda_env: "nightly_linux_gpu" - conda_opts: "python=3.6 cudatoolkit=10.0 \"cudnn>=7.6\"" + conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" pip_opts: "[gpu,examples,dev] -f https://download.pytorch.org/whl/cu100/torch_stable.html" pytest_markers: "not spark and gpu" pytest_params: "-x" diff --git a/tests/ci/azure_pipeline_test/dsvm_notebook_linux_gpu.yml b/tests/ci/azure_pipeline_test/dsvm_notebook_linux_gpu.yml index 6d7594a143..2029e53817 100644 --- a/tests/ci/azure_pipeline_test/dsvm_notebook_linux_gpu.yml +++ b/tests/ci/azure_pipeline_test/dsvm_notebook_linux_gpu.yml @@ -59,6 +59,6 @@ extends: - unit task_name: "Test - Unit Notebook Linux GPU" conda_env: "unit_notebook_linux_gpu" - conda_opts: "python=3.6 cudatoolkit=10.0 \"cudnn>=7.6\"" + conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" pip_opts: "[gpu,examples,dev] -f https://download.pytorch.org/whl/cu100/torch_stable.html" pytest_markers: "notebooks and not spark and gpu" diff --git a/tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml b/tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml index 9aa46047e6..f8ace02538 100644 --- a/tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml +++ b/tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml @@ -59,6 +59,6 @@ extends: - unit task_name: "Test - Unit Linux GPU" conda_env: "unit_linux_gpu" - conda_opts: "python=3.6 cudatoolkit=10.0 \"cudnn>=7.6\"" + conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" pip_opts: "[gpu,dev] -f https://download.pytorch.org/whl/cu100/torch_stable.html" pytest_markers: "not notebooks and not spark and gpu" diff --git a/tests/ci/azure_pipeline_test/release_pipeline.yml b/tests/ci/azure_pipeline_test/release_pipeline.yml index 1248e5d66d..874b812668 100644 --- a/tests/ci/azure_pipeline_test/release_pipeline.yml +++ b/tests/ci/azure_pipeline_test/release_pipeline.yml @@ -45,7 +45,7 @@ jobs: - unit task_name: "Test - Unit Linux GPU" conda_env: "release_unit_linux_gpu" - conda_opts: "python=3.6 cudatoolkit=10.0 \"cudnn>=7.6\"" + conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" pip_opts: "[gpu] -f https://download.pytorch.org/whl/cu100/torch_stable.html" pytest_markers: "not notebooks and not spark and gpu" install: "release" @@ -56,7 +56,7 @@ jobs: - unit task_name: "Test - Unit Notebook Linux GPU" conda_env: "release_unit_notebook_linux_gpu" - conda_opts: "python=3.6 cudatoolkit=10.0 \"cudnn>=7.6\"" + conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" pip_opts: "[gpu,examples] -f https://download.pytorch.org/whl/cu100/torch_stable.html" pytest_markers: "notebooks and not spark and gpu" install: "release" @@ -105,7 +105,7 @@ jobs: task_name: "Test - Nightly Linux GPU" timeout: 240 conda_env: "release_nightly_linux_gpu" - conda_opts: "python=3.6 cudatoolkit=10.0 \"cudnn>=7.6\"" + conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" pip_opts: "[gpu,examples] -f https://download.pytorch.org/whl/cu100/torch_stable.html" pytest_markers: "not spark and gpu" install: "release" diff --git a/tools/docker/Dockerfile b/tools/docker/Dockerfile index 97ecb30422..1a2a29f564 100644 --- a/tools/docker/Dockerfile +++ b/tools/docker/Dockerfile @@ -87,7 +87,7 @@ RUN if [ "${VIRTUAL_ENV}" = "conda" ] ; then pip install --no-cache --no-binary ########### # GPU Stage ########### -FROM nvidia/cuda:10.0-cudnn7-runtime-ubuntu18.04 AS gpu +FROM nvidia/cuda:11.2-cudnn8.1-runtime-ubuntu18.04 AS gpu ARG HOME ARG VIRTUAL_ENV diff --git a/tools/generate_conda_file.py b/tools/generate_conda_file.py index 6c5978a96a..d86c64e02b 100644 --- a/tools/generate_conda_file.py +++ b/tools/generate_conda_file.py @@ -65,9 +65,9 @@ CONDA_GPU = { "fastai": "fastai==1.0.46", "numba": "numba>=0.38.1", - "pytorch": "pytorch>=1.0.0,<=1.2.0", # For cudatoolkit=10.0 - "cudatoolkit": "cudatoolkit=10.0", - "cudnn": "cudnn>=7.6" + "pytorch": "pytorch>=1.8.0", # For cudatoolkit=11 + "cudatoolkit": "cudatoolkit=11.2", + "cudnn": "cudnn=8.1" } PIP_BASE = { From 899b43ac8fc27bf7f2f33c709ee6c54dba0a0443 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 12 Oct 2021 12:10:55 +0000 Subject: [PATCH 06/60] Modifications made by tf_upgrade_v2 script provided by TF + fix for inserted loss_reduction arg --- .../deeprec/io/dkn_item2item_iterator.py | 234 +++---- recommenders/models/deeprec/io/iterator.py | 18 +- .../models/deeprec/io/nextitnet_iterator.py | 22 +- .../models/deeprec/io/sequential_iterator.py | 22 +- .../models/deeprec/models/base_model.py | 98 +-- recommenders/models/deeprec/models/dkn.py | 32 +- .../models/deeprec/models/dkn_item2item.py | 250 ++++---- .../deeprec/models/graphrec/lightgcn.py | 42 +- .../models/deeprec/models/sequential/asvd.py | 10 +- .../models/deeprec/models/sequential/caser.py | 24 +- .../deeprec/models/sequential/gru4rec.py | 16 +- .../deeprec/models/sequential/nextitnet.py | 56 +- .../sequential/sequential_base_model.py | 42 +- .../deeprec/models/sequential/sli_rec.py | 32 +- .../models/deeprec/models/sequential/sum.py | 24 +- .../deeprec/models/sequential/sum_cells.py | 26 +- recommenders/models/deeprec/models/xDeepFM.py | 130 ++-- recommenders/models/ncf/ncf_singlenode.py | 32 +- recommenders/models/rbm/rbm.py | 82 +-- .../models/rlrmc/conjugate_gradient_ms.py | 510 ++++++++-------- recommenders/models/vae/multinomial_vae.py | 10 +- .../models/wide_deep/wide_deep_utils.py | 12 +- recommenders/tuning/nni/nni_utils.py | 1 - recommenders/utils/k8s_utils.py | 162 ++--- recommenders/utils/tf_utils.py | 32 +- setup.py | 6 +- .../recommenders/datasets/test_movielens.py | 578 +++++++++--------- .../recommenders/dataset/test_movielens.py | 470 +++++++------- .../unit/recommenders/datasets/test_sparse.py | 268 ++++---- .../models/test_wide_deep_utils.py | 6 +- .../unit/recommenders/utils/test_k8s_utils.py | 50 +- .../unit/recommenders/utils/test_tf_utils.py | 30 +- 32 files changed, 1663 insertions(+), 1664 deletions(-) diff --git a/recommenders/models/deeprec/io/dkn_item2item_iterator.py b/recommenders/models/deeprec/io/dkn_item2item_iterator.py index 09972d7042..a2a2383a64 100644 --- a/recommenders/models/deeprec/io/dkn_item2item_iterator.py +++ b/recommenders/models/deeprec/io/dkn_item2item_iterator.py @@ -1,117 +1,117 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - - -import tensorflow as tf -from recommenders.models.deeprec.io.dkn_iterator import DKNTextIterator - - -class DKNItem2itemTextIterator(DKNTextIterator): - def __init__(self, hparams, graph): - """This new iterator is for DKN's item-to-item recommendations version. - The tutorial can be found `on this notebook `_. - - Compared with user-to-item recommendations, we don't need the user behavior module. - So the placeholder can be simplified from the original DKNTextIterator. - - Args: - hparams (object): Global hyper-parameters. - graph (object): The running graph. - """ - self.hparams = hparams - self.graph = graph - self.neg_num = hparams.neg_num - self.batch_size = hparams.batch_size * (self.neg_num + 2) - self.doc_size = hparams.doc_size - with self.graph.as_default(): - self.candidate_news_index_batch = tf.placeholder( - tf.int64, [self.batch_size, self.doc_size], name="candidate_news_index" - ) - self.candidate_news_entity_index_batch = tf.placeholder( - tf.int64, - [self.batch_size, self.doc_size], - name="candidate_news_entity_index", - ) - - self._loading_nessary_files() - - def _loading_nessary_files(self): - """Only one feature file is needed: `news_feature_file`. - This function loads the news article's features into two dictionaries: `self.news_word_index` and `self.news_entity_index`. - """ - hparams = self.hparams - self.news_word_index = {} - self.news_entity_index = {} - with open(hparams.news_feature_file, "r") as rd: - while True: - line = rd.readline() - if not line: - break - newsid, word_index, entity_index = line.strip().split(" ") - self.news_word_index[newsid] = [ - int(item) for item in word_index.split(",") - ] - self.news_entity_index[newsid] = [ - int(item) for item in entity_index.split(",") - ] - - def load_data_from_file(self, infile): - """This function will return a mini-batch of data with features, - by looking up `news_word_index` dictionary and `news_entity_index` dictionary according to the news article's ID. - - Args: - infile (str): File path. Each line of `infile` is a news article's ID. - - Yields: - dict, list, int: - - A dictionary that maps graph elements to numpy arrays. - - A list with news article's ID. - - Size of the data in a batch. - """ - newsid_list = [] - candidate_news_index_batch = [] - candidate_news_entity_index_batch = [] - cnt = 0 - with open(infile, "r") as rd: - while True: - line = rd.readline() - if not line: - break - newsid = line.strip() - word_index, entity_index = ( - self.news_word_index[newsid], - self.news_entity_index[newsid], - ) - newsid_list.append(newsid) - - candidate_news_index_batch.append(word_index) - candidate_news_entity_index_batch.append(entity_index) - - cnt += 1 - if cnt >= self.batch_size: - res = self._convert_infer_data( - candidate_news_index_batch, - candidate_news_entity_index_batch, - ) - data_size = self.batch_size - yield self.gen_infer_feed_dict(res), newsid_list, data_size - candidate_news_index_batch = [] - candidate_news_entity_index_batch = [] - newsid_list = [] - cnt = 0 - - if cnt > 0: - data_size = cnt - while cnt < self.batch_size: - candidate_news_index_batch.append( - candidate_news_index_batch[cnt % data_size] - ) - candidate_news_entity_index_batch.append( - candidate_news_entity_index_batch[cnt % data_size] - ) - cnt += 1 - res = self._convert_infer_data( - candidate_news_index_batch, - candidate_news_entity_index_batch, - ) - yield self.gen_infer_feed_dict(res), newsid_list, data_size +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + + +import tensorflow as tf +from recommenders.models.deeprec.io.dkn_iterator import DKNTextIterator + + +class DKNItem2itemTextIterator(DKNTextIterator): + def __init__(self, hparams, graph): + """This new iterator is for DKN's item-to-item recommendations version. + The tutorial can be found `on this notebook `_. + + Compared with user-to-item recommendations, we don't need the user behavior module. + So the placeholder can be simplified from the original DKNTextIterator. + + Args: + hparams (object): Global hyper-parameters. + graph (object): The running graph. + """ + self.hparams = hparams + self.graph = graph + self.neg_num = hparams.neg_num + self.batch_size = hparams.batch_size * (self.neg_num + 2) + self.doc_size = hparams.doc_size + with self.graph.as_default(): + self.candidate_news_index_batch = tf.compat.v1.placeholder( + tf.int64, [self.batch_size, self.doc_size], name="candidate_news_index" + ) + self.candidate_news_entity_index_batch = tf.compat.v1.placeholder( + tf.int64, + [self.batch_size, self.doc_size], + name="candidate_news_entity_index", + ) + + self._loading_nessary_files() + + def _loading_nessary_files(self): + """Only one feature file is needed: `news_feature_file`. + This function loads the news article's features into two dictionaries: `self.news_word_index` and `self.news_entity_index`. + """ + hparams = self.hparams + self.news_word_index = {} + self.news_entity_index = {} + with open(hparams.news_feature_file, "r") as rd: + while True: + line = rd.readline() + if not line: + break + newsid, word_index, entity_index = line.strip().split(" ") + self.news_word_index[newsid] = [ + int(item) for item in word_index.split(",") + ] + self.news_entity_index[newsid] = [ + int(item) for item in entity_index.split(",") + ] + + def load_data_from_file(self, infile): + """This function will return a mini-batch of data with features, + by looking up `news_word_index` dictionary and `news_entity_index` dictionary according to the news article's ID. + + Args: + infile (str): File path. Each line of `infile` is a news article's ID. + + Yields: + dict, list, int: + - A dictionary that maps graph elements to numpy arrays. + - A list with news article's ID. + - Size of the data in a batch. + """ + newsid_list = [] + candidate_news_index_batch = [] + candidate_news_entity_index_batch = [] + cnt = 0 + with open(infile, "r") as rd: + while True: + line = rd.readline() + if not line: + break + newsid = line.strip() + word_index, entity_index = ( + self.news_word_index[newsid], + self.news_entity_index[newsid], + ) + newsid_list.append(newsid) + + candidate_news_index_batch.append(word_index) + candidate_news_entity_index_batch.append(entity_index) + + cnt += 1 + if cnt >= self.batch_size: + res = self._convert_infer_data( + candidate_news_index_batch, + candidate_news_entity_index_batch, + ) + data_size = self.batch_size + yield self.gen_infer_feed_dict(res), newsid_list, data_size + candidate_news_index_batch = [] + candidate_news_entity_index_batch = [] + newsid_list = [] + cnt = 0 + + if cnt > 0: + data_size = cnt + while cnt < self.batch_size: + candidate_news_index_batch.append( + candidate_news_index_batch[cnt % data_size] + ) + candidate_news_entity_index_batch.append( + candidate_news_entity_index_batch[cnt % data_size] + ) + cnt += 1 + res = self._convert_infer_data( + candidate_news_index_batch, + candidate_news_entity_index_batch, + ) + yield self.gen_infer_feed_dict(res), newsid_list, data_size diff --git a/recommenders/models/deeprec/io/iterator.py b/recommenders/models/deeprec/io/iterator.py index b814b67063..b239439e37 100644 --- a/recommenders/models/deeprec/io/iterator.py +++ b/recommenders/models/deeprec/io/iterator.py @@ -64,24 +64,24 @@ def __init__(self, hparams, graph, col_spliter=" ", ID_spliter="%"): self.graph = graph with self.graph.as_default(): - self.labels = tf.placeholder(tf.float32, [None, 1], name="label") - self.fm_feat_indices = tf.placeholder( + self.labels = tf.compat.v1.placeholder(tf.float32, [None, 1], name="label") + self.fm_feat_indices = tf.compat.v1.placeholder( tf.int64, [None, 2], name="fm_feat_indices" ) - self.fm_feat_values = tf.placeholder( + self.fm_feat_values = tf.compat.v1.placeholder( tf.float32, [None], name="fm_feat_values" ) - self.fm_feat_shape = tf.placeholder(tf.int64, [None], name="fm_feat_shape") - self.dnn_feat_indices = tf.placeholder( + self.fm_feat_shape = tf.compat.v1.placeholder(tf.int64, [None], name="fm_feat_shape") + self.dnn_feat_indices = tf.compat.v1.placeholder( tf.int64, [None, 2], name="dnn_feat_indices" ) - self.dnn_feat_values = tf.placeholder( + self.dnn_feat_values = tf.compat.v1.placeholder( tf.int64, [None], name="dnn_feat_values" ) - self.dnn_feat_weights = tf.placeholder( + self.dnn_feat_weights = tf.compat.v1.placeholder( tf.float32, [None], name="dnn_feat_weights" ) - self.dnn_feat_shape = tf.placeholder( + self.dnn_feat_shape = tf.compat.v1.placeholder( tf.int64, [None], name="dnn_feat_shape" ) @@ -127,7 +127,7 @@ def load_data_from_file(self, infile): impression_id_list = [] cnt = 0 - with tf.gfile.GFile(infile, "r") as rd: + with tf.io.gfile.GFile(infile, "r") as rd: for line in rd: label, features, impression_id = self.parser_one_line(line) diff --git a/recommenders/models/deeprec/io/nextitnet_iterator.py b/recommenders/models/deeprec/io/nextitnet_iterator.py index 7b130bec06..548228ebd9 100644 --- a/recommenders/models/deeprec/io/nextitnet_iterator.py +++ b/recommenders/models/deeprec/io/nextitnet_iterator.py @@ -43,27 +43,27 @@ def __init__(self, hparams, graph, col_spliter="\t"): self.graph = graph with self.graph.as_default(): - self.labels = tf.placeholder(tf.float32, [None, None], name="label") - self.users = tf.placeholder(tf.int32, [None], name="users") - self.items = tf.placeholder(tf.int32, [None, None], name="items") - self.cates = tf.placeholder(tf.int32, [None, None], name="cates") - self.item_history = tf.placeholder( + self.labels = tf.compat.v1.placeholder(tf.float32, [None, None], name="label") + self.users = tf.compat.v1.placeholder(tf.int32, [None], name="users") + self.items = tf.compat.v1.placeholder(tf.int32, [None, None], name="items") + self.cates = tf.compat.v1.placeholder(tf.int32, [None, None], name="cates") + self.item_history = tf.compat.v1.placeholder( tf.int32, [None, self.max_seq_length], name="item_history" ) - self.item_cate_history = tf.placeholder( + self.item_cate_history = tf.compat.v1.placeholder( tf.int32, [None, self.max_seq_length], name="item_cate_history" ) - self.mask = tf.placeholder( + self.mask = tf.compat.v1.placeholder( tf.int32, [None, self.max_seq_length], name="mask" ) - self.time = tf.placeholder(tf.float32, [None], name="time") - self.time_diff = tf.placeholder( + self.time = tf.compat.v1.placeholder(tf.float32, [None], name="time") + self.time_diff = tf.compat.v1.placeholder( tf.float32, [None, self.max_seq_length], name="time_diff" ) - self.time_from_first_action = tf.placeholder( + self.time_from_first_action = tf.compat.v1.placeholder( tf.float32, [None, self.max_seq_length], name="time_from_first_action" ) - self.time_to_now = tf.placeholder( + self.time_to_now = tf.compat.v1.placeholder( tf.float32, [None, self.max_seq_length], name="time_to_now" ) diff --git a/recommenders/models/deeprec/io/sequential_iterator.py b/recommenders/models/deeprec/io/sequential_iterator.py index 93e680af60..79c9c4f584 100644 --- a/recommenders/models/deeprec/io/sequential_iterator.py +++ b/recommenders/models/deeprec/io/sequential_iterator.py @@ -43,27 +43,27 @@ def __init__(self, hparams, graph, col_spliter="\t"): self.graph = graph with self.graph.as_default(): - self.labels = tf.placeholder(tf.float32, [None, 1], name="label") - self.users = tf.placeholder(tf.int32, [None], name="users") - self.items = tf.placeholder(tf.int32, [None], name="items") - self.cates = tf.placeholder(tf.int32, [None], name="cates") - self.item_history = tf.placeholder( + self.labels = tf.compat.v1.placeholder(tf.float32, [None, 1], name="label") + self.users = tf.compat.v1.placeholder(tf.int32, [None], name="users") + self.items = tf.compat.v1.placeholder(tf.int32, [None], name="items") + self.cates = tf.compat.v1.placeholder(tf.int32, [None], name="cates") + self.item_history = tf.compat.v1.placeholder( tf.int32, [None, self.max_seq_length], name="item_history" ) - self.item_cate_history = tf.placeholder( + self.item_cate_history = tf.compat.v1.placeholder( tf.int32, [None, self.max_seq_length], name="item_cate_history" ) - self.mask = tf.placeholder( + self.mask = tf.compat.v1.placeholder( tf.int32, [None, self.max_seq_length], name="mask" ) - self.time = tf.placeholder(tf.float32, [None], name="time") - self.time_diff = tf.placeholder( + self.time = tf.compat.v1.placeholder(tf.float32, [None], name="time") + self.time_diff = tf.compat.v1.placeholder( tf.float32, [None, self.max_seq_length], name="time_diff" ) - self.time_from_first_action = tf.placeholder( + self.time_from_first_action = tf.compat.v1.placeholder( tf.float32, [None, self.max_seq_length], name="time_from_first_action" ) - self.time_to_now = tf.placeholder( + self.time_to_now = tf.compat.v1.placeholder( tf.float32, [None, self.max_seq_length], name="time_to_now" ) diff --git a/recommenders/models/deeprec/models/base_model.py b/recommenders/models/deeprec/models/base_model.py index 68cd57e5d1..0c3465931b 100644 --- a/recommenders/models/deeprec/models/base_model.py +++ b/recommenders/models/deeprec/models/base_model.py @@ -137,12 +137,12 @@ def _l1_loss(self): # embedding_layer l2 loss for param in self.embed_params: l1_loss = tf.add( - l1_loss, tf.multiply(self.hparams.embed_l1, tf.norm(param, ord=1)) + l1_loss, tf.multiply(self.hparams.embed_l1, tf.norm(tensor=param, ord=1)) ) params = self.layer_params for param in params: l1_loss = tf.add( - l1_loss, tf.multiply(self.hparams.layer_l1, tf.norm(param, ord=1)) + l1_loss, tf.multiply(self.hparams.layer_l1, tf.norm(tensor=param, ord=1)) ) return l1_loss @@ -155,47 +155,47 @@ def _cross_l_loss(self): cross_l_loss = tf.zeros([1], dtype=tf.float32) for param in self.cross_params: cross_l_loss = tf.add( - cross_l_loss, tf.multiply(self.hparams.cross_l1, tf.norm(param, ord=1)) + cross_l_loss, tf.multiply(self.hparams.cross_l1, tf.norm(tensor=param, ord=1)) ) cross_l_loss = tf.add( - cross_l_loss, tf.multiply(self.hparams.cross_l2, tf.norm(param, ord=2)) + cross_l_loss, tf.multiply(self.hparams.cross_l2, tf.norm(tensor=param, ord=2)) ) return cross_l_loss def _get_initializer(self): if self.hparams.init_method == "tnormal": - return tf.truncated_normal_initializer( + return tf.compat.v1.truncated_normal_initializer( stddev=self.hparams.init_value, seed=self.seed ) elif self.hparams.init_method == "uniform": - return tf.random_uniform_initializer( + return tf.compat.v1.random_uniform_initializer( -self.hparams.init_value, self.hparams.init_value, seed=self.seed ) elif self.hparams.init_method == "normal": - return tf.random_normal_initializer( + return tf.compat.v1.random_normal_initializer( stddev=self.hparams.init_value, seed=self.seed ) elif self.hparams.init_method == "xavier_normal": - return tf.contrib.layers.xavier_initializer(uniform=False, seed=self.seed) + return tf.compat.v1.keras.initializers.VarianceScaling(scale=1.0, mode="fan_avg", distribution=("uniform" if False else "truncated_normal"), seed=self.seed) elif self.hparams.init_method == "xavier_uniform": - return tf.contrib.layers.xavier_initializer(uniform=True, seed=self.seed) + return tf.compat.v1.keras.initializers.VarianceScaling(scale=1.0, mode="fan_avg", distribution=("uniform" if True else "truncated_normal"), seed=self.seed) elif self.hparams.init_method == "he_normal": - return tf.contrib.layers.variance_scaling_initializer( - factor=2.0, mode="FAN_IN", uniform=False, seed=self.seed + return tf.compat.v1.keras.initializers.VarianceScaling( + scale=2.0, mode=("FAN_IN").lower(), distribution=("uniform" if False else "truncated_normal"), seed=self.seed ) elif self.hparams.init_method == "he_uniform": - return tf.contrib.layers.variance_scaling_initializer( - factor=2.0, mode="FAN_IN", uniform=True, seed=self.seed + return tf.compat.v1.keras.initializers.VarianceScaling( + scale=2.0, mode=("FAN_IN").lower(), distribution=("uniform" if True else "truncated_normal"), seed=self.seed ) else: - return tf.truncated_normal_initializer( + return tf.compat.v1.truncated_normal_initializer( stddev=self.hparams.init_value, seed=self.seed ) def _compute_data_loss(self): if self.hparams.loss == "cross_entropy_loss": data_loss = tf.reduce_mean( - tf.nn.sigmoid_cross_entropy_with_logits( + input_tensor=tf.nn.sigmoid_cross_entropy_with_logits( logits=tf.reshape(self.logit, [-1]), labels=tf.reshape(self.iterator.labels, [-1]), ) @@ -203,7 +203,7 @@ def _compute_data_loss(self): elif self.hparams.loss == "square_loss": data_loss = tf.sqrt( tf.reduce_mean( - tf.squared_difference( + input_tensor=tf.math.squared_difference( tf.reshape(self.pred, [-1]), tf.reshape(self.iterator.labels, [-1]), ) @@ -211,7 +211,7 @@ def _compute_data_loss(self): ) elif self.hparams.loss == "log_loss": data_loss = tf.reduce_mean( - tf.compat.v1.losses.log_loss( + input_tensor=tf.compat.v1.losses.log_loss( predictions=tf.reshape(self.pred, [-1]), labels=tf.reshape(self.iterator.labels, [-1]), ) @@ -222,11 +222,11 @@ def _compute_data_loss(self): if self.hparams.model_type == "NextItNet": labels = ( tf.transpose( - tf.reshape( + a=tf.reshape( self.iterator.labels, (-1, group, self.hparams.max_seq_length), ), - [0, 2, 1], + perm=[0, 2, 1], ), ) labels = tf.reshape(labels, (-1, group)) @@ -235,8 +235,8 @@ def _compute_data_loss(self): softmax_pred = tf.nn.softmax(logits, axis=-1) boolean_mask = tf.equal(labels, tf.ones_like(labels)) mask_paddings = tf.ones_like(softmax_pred) - pos_softmax = tf.where(boolean_mask, softmax_pred, mask_paddings) - data_loss = -group * tf.reduce_mean(tf.math.log(pos_softmax)) + pos_softmax = tf.compat.v1.where(boolean_mask, softmax_pred, mask_paddings) + data_loss = -group * tf.reduce_mean(input_tensor=tf.math.log(pos_softmax)) else: raise ValueError("this loss not defined {0}".format(self.hparams.loss)) return data_loss @@ -249,7 +249,7 @@ def _compute_regular_loss(self): object: Regular loss. """ regular_loss = self._l2_loss() + self._l1_loss() + self._cross_l_loss() - return tf.reduce_sum(regular_loss) + return tf.reduce_sum(input_tensor=regular_loss) def _train_opt(self): """Get the optimizer according to configuration. Usually we will use Adam. @@ -261,27 +261,27 @@ def _train_opt(self): optimizer = self.hparams.optimizer if optimizer == "adadelta": - train_step = tf.train.AdadeltaOptimizer(lr) + train_step = tf.compat.v1.train.AdadeltaOptimizer(lr) elif optimizer == "adagrad": - train_step = tf.train.AdagradOptimizer(lr) + train_step = tf.compat.v1.train.AdagradOptimizer(lr) elif optimizer == "sgd": - train_step = tf.train.GradientDescentOptimizer(lr) + train_step = tf.compat.v1.train.GradientDescentOptimizer(lr) elif optimizer == "adam": train_step = tf.compat.v1.train.AdamOptimizer(lr) elif optimizer == "ftrl": - train_step = tf.train.FtrlOptimizer(lr) + train_step = tf.compat.v1.train.FtrlOptimizer(lr) elif optimizer == "gd": - train_step = tf.train.GradientDescentOptimizer(lr) + train_step = tf.compat.v1.train.GradientDescentOptimizer(lr) elif optimizer == "padagrad": - train_step = tf.train.ProximalAdagradOptimizer(lr) + train_step = tf.compat.v1.train.ProximalAdagradOptimizer(lr) elif optimizer == "pgd": - train_step = tf.train.ProximalGradientDescentOptimizer(lr) + train_step = tf.compat.v1.train.ProximalGradientDescentOptimizer(lr) elif optimizer == "rmsprop": - train_step = tf.train.RMSPropOptimizer(lr) + train_step = tf.compat.v1.train.RMSPropOptimizer(lr) elif optimizer == "lazyadam": train_step = tf.contrib.opt.LazyAdamOptimizer(lr) else: - train_step = tf.train.GradientDescentOptimizer(lr) + train_step = tf.compat.v1.train.GradientDescentOptimizer(lr) return train_step def _build_train_opt(self): @@ -344,7 +344,7 @@ def _dropout(self, logit, keep_prob): Returns: object: A tensor of the same shape of logit. """ - return tf.nn.dropout(x=logit, keep_prob=keep_prob) + return tf.nn.dropout(x=logit, rate=1 - (keep_prob)) def train(self, sess, feed_dict): """Go through the optimization step once with training data in `feed_dict`. @@ -428,7 +428,7 @@ def fit(self, train_file, valid_file, test_file=None): object: An instance of self. """ if self.hparams.write_tfevents: - self.writer = tf.summary.FileWriter( + self.writer = tf.compat.v1.summary.FileWriter( self.hparams.SUMMARIES_DIR, self.sess.graph ) @@ -589,7 +589,7 @@ def predict(self, infile_name, outfile_name): object: An instance of self. """ load_sess = self.sess - with tf.gfile.GFile(outfile_name, "w") as wt: + with tf.io.gfile.GFile(outfile_name, "w") as wt: for batch_data_input, _, data_size in self.iterator.load_data_from_file( infile_name ): @@ -615,14 +615,14 @@ def _attention(self, inputs, attention_size): if not attention_size: attention_size = hidden_size - attention_mat = tf.get_variable( + attention_mat = tf.compat.v1.get_variable( name="attention_mat", shape=[inputs.shape[-1].value, hidden_size], initializer=self.initializer, ) att_inputs = tf.tensordot(inputs, attention_mat, [[2], [0]]) - query = tf.get_variable( + query = tf.compat.v1.get_variable( name="query", shape=[attention_size], dtype=tf.float32, @@ -645,28 +645,28 @@ def _fcn_net(self, model_output, layer_sizes, scope): object: Prediction logit after fully connected layer. """ hparams = self.hparams - with tf.variable_scope(scope): + with tf.compat.v1.variable_scope(scope): last_layer_size = model_output.shape[-1] layer_idx = 0 hidden_nn_layers = [] hidden_nn_layers.append(model_output) - with tf.variable_scope("nn_part", initializer=self.initializer) as scope: + with tf.compat.v1.variable_scope("nn_part", initializer=self.initializer) as scope: for idx, layer_size in enumerate(layer_sizes): - curr_w_nn_layer = tf.get_variable( + curr_w_nn_layer = tf.compat.v1.get_variable( name="w_nn_layer" + str(layer_idx), shape=[last_layer_size, layer_size], dtype=tf.float32, ) - curr_b_nn_layer = tf.get_variable( + curr_b_nn_layer = tf.compat.v1.get_variable( name="b_nn_layer" + str(layer_idx), shape=[layer_size], dtype=tf.float32, - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "nn_part/" + "w_nn_layer" + str(layer_idx), curr_w_nn_layer ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "nn_part/" + "b_nn_layer" + str(layer_idx), curr_b_nn_layer ) curr_hidden_nn_layer = ( @@ -680,7 +680,7 @@ def _fcn_net(self, model_output, layer_sizes, scope): activation = hparams.activation[idx] if hparams.enable_BN is True: - curr_hidden_nn_layer = tf.layers.batch_normalization( + curr_hidden_nn_layer = tf.compat.v1.layers.batch_normalization( curr_hidden_nn_layer, momentum=0.95, epsilon=0.0001, @@ -694,19 +694,19 @@ def _fcn_net(self, model_output, layer_sizes, scope): layer_idx += 1 last_layer_size = layer_size - w_nn_output = tf.get_variable( + w_nn_output = tf.compat.v1.get_variable( name="w_nn_output", shape=[last_layer_size, 1], dtype=tf.float32 ) - b_nn_output = tf.get_variable( + b_nn_output = tf.compat.v1.get_variable( name="b_nn_output", shape=[1], dtype=tf.float32, - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "nn_part/" + "w_nn_output" + str(layer_idx), w_nn_output ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "nn_part/" + "b_nn_output" + str(layer_idx), b_nn_output ) nn_output = ( diff --git a/recommenders/models/deeprec/models/dkn.py b/recommenders/models/deeprec/models/dkn.py index 19a855e59d..2baae07566 100644 --- a/recommenders/models/deeprec/models/dkn.py +++ b/recommenders/models/deeprec/models/dkn.py @@ -31,7 +31,7 @@ def __init__(self, hparams, iterator_creator): """ self.graph = tf.Graph() with self.graph.as_default(): - with tf.name_scope("embedding"): + with tf.compat.v1.name_scope("embedding"): word2vec_embedding = self._init_embedding(hparams.wordEmb_file) self.embedding = tf.Variable( word2vec_embedding, trainable=True, name="word" @@ -121,22 +121,22 @@ def _l1_loss(self): l1_loss = tf.zeros([1], dtype=tf.float32) # embedding_layer l2 loss l1_loss = tf.add( - l1_loss, tf.multiply(hparams.embed_l1, tf.norm(self.embedding, ord=1)) + l1_loss, tf.multiply(hparams.embed_l1, tf.norm(tensor=self.embedding, ord=1)) ) if hparams.use_entity: l1_loss = tf.add( l1_loss, - tf.multiply(hparams.embed_l1, tf.norm(self.entity_embedding, ord=1)), + tf.multiply(hparams.embed_l1, tf.norm(tensor=self.entity_embedding, ord=1)), ) if hparams.use_entity and hparams.use_context: l1_loss = tf.add( l1_loss, - tf.multiply(hparams.embed_l1, tf.norm(self.context_embedding, ord=1)), + tf.multiply(hparams.embed_l1, tf.norm(tensor=self.context_embedding, ord=1)), ) params = self.layer_params for param in params: l1_loss = tf.add( - l1_loss, tf.multiply(hparams.layer_l1, tf.norm(param, ord=1)) + l1_loss, tf.multiply(hparams.layer_l1, tf.norm(tensor=param, ord=1)) ) return l1_loss @@ -191,7 +191,7 @@ def _build_dkn(self): hidden_nn_layers[layer_idx], curr_w_nn_layer, curr_b_nn_layer ) if hparams.enable_BN is True: - curr_hidden_nn_layer = tf.layers.batch_normalization( + curr_hidden_nn_layer = tf.compat.v1.layers.batch_normalization( curr_hidden_nn_layer, momentum=0.95, epsilon=0.0001, @@ -275,7 +275,7 @@ def _build_pair_attention( avg_strategy = False if avg_strategy: click_field_embed_final = tf.reduce_mean( - click_field_embed, axis=1, keepdims=True + input_tensor=click_field_embed, axis=1, keepdims=True ) else: news_field_embed = tf.expand_dims(news_field_embed, 1) @@ -303,7 +303,7 @@ def _build_pair_attention( ) if hparams.enable_BN is True: - curr_attention_layer = tf.layers.batch_normalization( + curr_attention_layer = tf.compat.v1.layers.batch_normalization( curr_attention_layer, momentum=0.95, epsilon=0.0001, @@ -330,7 +330,7 @@ def _build_pair_attention( ) norm_attention_weight = tf.nn.softmax(attention_weight, axis=1) click_field_embed_final = tf.reduce_sum( - tf.multiply(click_field_embed, norm_attention_weight), + input_tensor=tf.multiply(click_field_embed, norm_attention_weight), axis=1, keepdims=True, ) @@ -363,20 +363,20 @@ def _kims_cnn(self, word, entity, hparams): num_filters = hparams.num_filters dim = hparams.dim - embedded_chars = tf.nn.embedding_lookup(self.embedding, word) + embedded_chars = tf.nn.embedding_lookup(params=self.embedding, ids=word) if hparams.use_entity and hparams.use_context: entity_embedded_chars = tf.nn.embedding_lookup( - self.entity_embedding, entity + params=self.entity_embedding, ids=entity ) context_embedded_chars = tf.nn.embedding_lookup( - self.context_embedding, entity + params=self.context_embedding, ids=entity ) concat = tf.concat( [embedded_chars, entity_embedded_chars, context_embedded_chars], axis=-1 ) elif hparams.use_entity: entity_embedded_chars = tf.nn.embedding_lookup( - self.entity_embedding, entity + params=self.entity_embedding, ids=entity ) concat = tf.concat([embedded_chars, entity_embedded_chars], axis=-1) else: @@ -400,7 +400,7 @@ def _kims_cnn(self, word, entity, hparams): name="W" + "_filter_size_" + str(filter_size), shape=filter_shape, dtype=tf.float32, - initializer=tf.contrib.layers.xavier_initializer(uniform=False), + initializer=tf.compat.v1.keras.initializers.VarianceScaling(scale=1.0, mode="fan_avg", distribution=("uniform" if False else "truncated_normal")), ) b = tf.compat.v1.get_variable( name="b" + "_filter_size_" + str(filter_size), @@ -412,8 +412,8 @@ def _kims_cnn(self, word, entity, hparams): if b not in self.layer_params: self.layer_params.append(b) conv = tf.nn.conv2d( - concat_expanded, - W, + input=concat_expanded, + filters=W, strides=[1, 1, 1, 1], padding="VALID", name="conv", diff --git a/recommenders/models/deeprec/models/dkn_item2item.py b/recommenders/models/deeprec/models/dkn_item2item.py index 90b8e295fd..00f72afd8a 100644 --- a/recommenders/models/deeprec/models/dkn_item2item.py +++ b/recommenders/models/deeprec/models/dkn_item2item.py @@ -1,125 +1,125 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - - -import numpy as np -import tensorflow as tf -from recommenders.models.deeprec.models.dkn import DKN -from recommenders.models.deeprec.deeprec_utils import cal_metric - - -r""" -This new model adapts DKN's structure for item-to-item recommendations. -The tutorial can be found at: https://github.com/microsoft/recommenders/blob/main/examples/07_tutorials/KDD2020-tutorial/step4_run_dkn_item2item.ipynb - """ - - -class DKNItem2Item(DKN): - """Class for item-to-item recommendations using DKN. - See https://github.com/microsoft/recommenders/blob/main/examples/07_tutorials/KDD2020-tutorial/step4_run_dkn_item2item.ipynb""" - - def _compute_data_loss(self): - logits = self.pred - data_loss = -1 * tf.reduce_sum(tf.math.log(logits[:, 0] + 1e-10)) - return data_loss - - def _build_dkn(self): - """The main function to create DKN's logic. - - Returns: - object: Prediction of item2item relation scores made by the DKN model, in the shape of (`batch_size`, `num_negative` + 1). - """ - news_field_embed_final_batch = self._build_doc_embedding( - self.iterator.candidate_news_index_batch, - self.iterator.candidate_news_entity_index_batch, - ) - - self.news_field_embed_final_batch = tf.math.l2_normalize( - news_field_embed_final_batch, axis=-1, epsilon=1e-12 - ) - - item_embs_train = tf.reshape( - self.news_field_embed_final_batch, - [ - -1, - self.iterator.neg_num + 2, - self.news_field_embed_final_batch.shape[-1], - ], - ) # (B, group, D) - - item_embs_source = item_embs_train[:, 0, :] # get the source item - item_embs_source = tf.expand_dims(item_embs_source, 1) - - item_embs_target = item_embs_train[:, 1:, :] - - item_relation = tf.math.multiply(item_embs_target, item_embs_source) - item_relation = tf.reduce_sum(item_relation, -1) # (B, neg_num + 1) - - self.pred_logits = item_relation - - return self.pred_logits - - def _get_pred(self, logit, task): - return tf.nn.softmax(logit, axis=-1) - - def _build_doc_embedding(self, candidate_word_batch, candidate_entity_batch): - """ - To make the document embedding be dense, we add one tanh layer on top of the `kims_cnn` module. - """ - with tf.variable_scope("kcnn", initializer=self.initializer): - news_field_embed = self._kims_cnn( - candidate_word_batch, candidate_entity_batch, self.hparams - ) - W = tf.get_variable( - name="W_doc_trans", - shape=(news_field_embed.shape[-1], self.num_filters_total), - dtype=tf.float32, - initializer=tf.contrib.layers.xavier_initializer(uniform=False), - ) - if W not in self.layer_params: - self.layer_params.append(W) - news_field_embed = tf.tanh(tf.matmul(news_field_embed, W)) - return news_field_embed - - def eval(self, sess, feed_dict): - """Evaluate the data in `feed_dict` with current model. - - Args: - sess (object): The model session object. - feed_dict (dict): Feed values for evaluation. This is a dictionary that maps graph elements to values. - - Returns: - numpy.ndarray, numpy.ndarray: A tuple with predictions and labels arrays. - """ - feed_dict[self.layer_keeps] = self.keep_prob_test - feed_dict[self.is_train_stage] = False - preds = sess.run(self.pred, feed_dict=feed_dict) - labels = np.zeros_like(preds, dtype=np.int32) - labels[:, 0] = 1 - return (preds, labels) - - def run_eval(self, filename): - """Evaluate the given file and returns some evaluation metrics. - - Args: - filename (str): A file name that will be evaluated. - - Returns: - dict: A dictionary containing evaluation metrics. - """ - load_sess = self.sess - group_preds = [] - group_labels = [] - - for ( - batch_data_input, - newsid_list, - data_size, - ) in self.iterator.load_data_from_file(filename): - if batch_data_input: - step_pred, step_labels = self.eval(load_sess, batch_data_input) - group_preds.extend(step_pred) - group_labels.extend(step_labels) - - res = cal_metric(group_labels, group_preds, self.hparams.pairwise_metrics) - return res +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + + +import numpy as np +import tensorflow as tf +from recommenders.models.deeprec.models.dkn import DKN +from recommenders.models.deeprec.deeprec_utils import cal_metric + + +r""" +This new model adapts DKN's structure for item-to-item recommendations. +The tutorial can be found at: https://github.com/microsoft/recommenders/blob/main/examples/07_tutorials/KDD2020-tutorial/step4_run_dkn_item2item.ipynb + """ + + +class DKNItem2Item(DKN): + """Class for item-to-item recommendations using DKN. + See https://github.com/microsoft/recommenders/blob/main/examples/07_tutorials/KDD2020-tutorial/step4_run_dkn_item2item.ipynb""" + + def _compute_data_loss(self): + logits = self.pred + data_loss = -1 * tf.reduce_sum(input_tensor=tf.math.log(logits[:, 0] + 1e-10)) + return data_loss + + def _build_dkn(self): + """The main function to create DKN's logic. + + Returns: + object: Prediction of item2item relation scores made by the DKN model, in the shape of (`batch_size`, `num_negative` + 1). + """ + news_field_embed_final_batch = self._build_doc_embedding( + self.iterator.candidate_news_index_batch, + self.iterator.candidate_news_entity_index_batch, + ) + + self.news_field_embed_final_batch = tf.math.l2_normalize( + news_field_embed_final_batch, axis=-1, epsilon=1e-12 + ) + + item_embs_train = tf.reshape( + self.news_field_embed_final_batch, + [ + -1, + self.iterator.neg_num + 2, + self.news_field_embed_final_batch.shape[-1], + ], + ) # (B, group, D) + + item_embs_source = item_embs_train[:, 0, :] # get the source item + item_embs_source = tf.expand_dims(item_embs_source, 1) + + item_embs_target = item_embs_train[:, 1:, :] + + item_relation = tf.math.multiply(item_embs_target, item_embs_source) + item_relation = tf.reduce_sum(input_tensor=item_relation, axis=-1) # (B, neg_num + 1) + + self.pred_logits = item_relation + + return self.pred_logits + + def _get_pred(self, logit, task): + return tf.nn.softmax(logit, axis=-1) + + def _build_doc_embedding(self, candidate_word_batch, candidate_entity_batch): + """ + To make the document embedding be dense, we add one tanh layer on top of the `kims_cnn` module. + """ + with tf.compat.v1.variable_scope("kcnn", initializer=self.initializer): + news_field_embed = self._kims_cnn( + candidate_word_batch, candidate_entity_batch, self.hparams + ) + W = tf.compat.v1.get_variable( + name="W_doc_trans", + shape=(news_field_embed.shape[-1], self.num_filters_total), + dtype=tf.float32, + initializer=tf.compat.v1.keras.initializers.VarianceScaling(scale=1.0, mode="fan_avg", distribution=("uniform" if False else "truncated_normal")), + ) + if W not in self.layer_params: + self.layer_params.append(W) + news_field_embed = tf.tanh(tf.matmul(news_field_embed, W)) + return news_field_embed + + def eval(self, sess, feed_dict): + """Evaluate the data in `feed_dict` with current model. + + Args: + sess (object): The model session object. + feed_dict (dict): Feed values for evaluation. This is a dictionary that maps graph elements to values. + + Returns: + numpy.ndarray, numpy.ndarray: A tuple with predictions and labels arrays. + """ + feed_dict[self.layer_keeps] = self.keep_prob_test + feed_dict[self.is_train_stage] = False + preds = sess.run(self.pred, feed_dict=feed_dict) + labels = np.zeros_like(preds, dtype=np.int32) + labels[:, 0] = 1 + return (preds, labels) + + def run_eval(self, filename): + """Evaluate the given file and returns some evaluation metrics. + + Args: + filename (str): A file name that will be evaluated. + + Returns: + dict: A dictionary containing evaluation metrics. + """ + load_sess = self.sess + group_preds = [] + group_labels = [] + + for ( + batch_data_input, + newsid_list, + data_size, + ) in self.iterator.load_data_from_file(filename): + if batch_data_input: + step_pred, step_labels = self.eval(load_sess, batch_data_input) + group_preds.extend(step_pred) + group_labels.extend(step_labels) + + res = cal_metric(group_labels, group_preds, self.hparams.pairwise_metrics) + return res diff --git a/recommenders/models/deeprec/models/graphrec/lightgcn.py b/recommenders/models/deeprec/models/graphrec/lightgcn.py index cc604623d0..7b01e5f85b 100644 --- a/recommenders/models/deeprec/models/graphrec/lightgcn.py +++ b/recommenders/models/deeprec/models/graphrec/lightgcn.py @@ -36,7 +36,7 @@ def __init__(self, hparams, data, seed=None): """ - tf.set_random_seed(seed) + tf.compat.v1.set_random_seed(seed) np.random.seed(seed) self.data = data @@ -67,28 +67,28 @@ def __init__(self, hparams, data, seed=None): self.n_users = data.n_users self.n_items = data.n_items - self.users = tf.placeholder(tf.int32, shape=(None,)) - self.pos_items = tf.placeholder(tf.int32, shape=(None,)) - self.neg_items = tf.placeholder(tf.int32, shape=(None,)) + self.users = tf.compat.v1.placeholder(tf.int32, shape=(None,)) + self.pos_items = tf.compat.v1.placeholder(tf.int32, shape=(None,)) + self.neg_items = tf.compat.v1.placeholder(tf.int32, shape=(None,)) self.weights = self._init_weights() self.ua_embeddings, self.ia_embeddings = self._create_lightgcn_embed() - self.u_g_embeddings = tf.nn.embedding_lookup(self.ua_embeddings, self.users) + self.u_g_embeddings = tf.nn.embedding_lookup(params=self.ua_embeddings, ids=self.users) self.pos_i_g_embeddings = tf.nn.embedding_lookup( - self.ia_embeddings, self.pos_items + params=self.ia_embeddings, ids=self.pos_items ) self.neg_i_g_embeddings = tf.nn.embedding_lookup( - self.ia_embeddings, self.neg_items + params=self.ia_embeddings, ids=self.neg_items ) self.u_g_embeddings_pre = tf.nn.embedding_lookup( - self.weights["user_embedding"], self.users + params=self.weights["user_embedding"], ids=self.users ) self.pos_i_g_embeddings_pre = tf.nn.embedding_lookup( - self.weights["item_embedding"], self.pos_items + params=self.weights["item_embedding"], ids=self.pos_items ) self.neg_i_g_embeddings_pre = tf.nn.embedding_lookup( - self.weights["item_embedding"], self.neg_items + params=self.weights["item_embedding"], ids=self.neg_items ) self.batch_ratings = tf.matmul( @@ -103,12 +103,12 @@ def __init__(self, hparams, data, seed=None): ) self.loss = self.mf_loss + self.emb_loss - self.opt = tf.train.AdamOptimizer(learning_rate=self.lr).minimize(self.loss) - self.saver = tf.train.Saver(max_to_keep=1) + self.opt = tf.compat.v1.train.AdamOptimizer(learning_rate=self.lr).minimize(self.loss) + self.saver = tf.compat.v1.train.Saver(max_to_keep=1) - gpu_options = tf.GPUOptions(allow_growth=True) - self.sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) - self.sess.run(tf.global_variables_initializer()) + gpu_options = tf.compat.v1.GPUOptions(allow_growth=True) + self.sess = tf.compat.v1.Session(config=tf.compat.v1.ConfigProto(gpu_options=gpu_options)) + self.sess.run(tf.compat.v1.global_variables_initializer()) def _init_weights(self): """Initialize user and item embeddings. @@ -118,7 +118,7 @@ def _init_weights(self): """ all_weights = dict() - initializer = tf.contrib.layers.xavier_initializer() + initializer = tf.compat.v1.keras.initializers.VarianceScaling(scale=1.0, mode="fan_avg", distribution="uniform") all_weights["user_embedding"] = tf.Variable( initializer([self.n_users, self.emb_dim]), name="user_embedding" @@ -145,11 +145,11 @@ def _create_lightgcn_embed(self): all_embeddings = [ego_embeddings] for k in range(0, self.n_layers): - ego_embeddings = tf.sparse_tensor_dense_matmul(A_hat, ego_embeddings) + ego_embeddings = tf.sparse.sparse_dense_matmul(A_hat, ego_embeddings) all_embeddings += [ego_embeddings] all_embeddings = tf.stack(all_embeddings, 1) - all_embeddings = tf.reduce_mean(all_embeddings, axis=1, keepdims=False) + all_embeddings = tf.reduce_mean(input_tensor=all_embeddings, axis=1, keepdims=False) u_g_embeddings, i_g_embeddings = tf.split( all_embeddings, [self.n_users, self.n_items], 0 ) @@ -167,8 +167,8 @@ def _create_bpr_loss(self, users, pos_items, neg_items): tf.Tensor, tf.Tensor: Matrix factorization loss. Embedding regularization loss. """ - pos_scores = tf.reduce_sum(tf.multiply(users, pos_items), axis=1) - neg_scores = tf.reduce_sum(tf.multiply(users, neg_items), axis=1) + pos_scores = tf.reduce_sum(input_tensor=tf.multiply(users, pos_items), axis=1) + neg_scores = tf.reduce_sum(input_tensor=tf.multiply(users, neg_items), axis=1) regularizer = ( tf.nn.l2_loss(self.u_g_embeddings_pre) @@ -176,7 +176,7 @@ def _create_bpr_loss(self, users, pos_items, neg_items): + tf.nn.l2_loss(self.neg_i_g_embeddings_pre) ) regularizer = regularizer / self.batch_size - mf_loss = tf.reduce_mean(tf.nn.softplus(-(pos_scores - neg_scores))) + mf_loss = tf.reduce_mean(input_tensor=tf.nn.softplus(-(pos_scores - neg_scores))) emb_loss = self.decay * regularizer return mf_loss, emb_loss diff --git a/recommenders/models/deeprec/models/sequential/asvd.py b/recommenders/models/deeprec/models/sequential/asvd.py index 26f5d266c8..a4ed8d7dc9 100644 --- a/recommenders/models/deeprec/models/sequential/asvd.py +++ b/recommenders/models/deeprec/models/sequential/asvd.py @@ -33,15 +33,15 @@ def _build_seq_graph(self): object: The output of A2SVD section. """ hparams = self.hparams - with tf.variable_scope("a2svd"): + with tf.compat.v1.variable_scope("a2svd"): hist_input = tf.concat( [self.item_history_embedding, self.cate_history_embedding], 2 ) - with tf.variable_scope("Attention_layer"): + with tf.compat.v1.variable_scope("Attention_layer"): att_outputs1 = self._attention(hist_input, hparams.attention_size) - asvd_output = tf.reduce_sum(att_outputs1, 1) - tf.summary.histogram("a2svd_output", asvd_output) + asvd_output = tf.reduce_sum(input_tensor=att_outputs1, axis=1) + tf.compat.v1.summary.histogram("a2svd_output", asvd_output) model_output = tf.concat([asvd_output, self.target_item_embedding], 1) self.model_output = model_output - tf.summary.histogram("model_output", model_output) + tf.compat.v1.summary.histogram("model_output", model_output) return model_output diff --git a/recommenders/models/deeprec/models/sequential/caser.py b/recommenders/models/deeprec/models/sequential/caser.py index c2472113ad..aa881832bf 100644 --- a/recommenders/models/deeprec/models/sequential/caser.py +++ b/recommenders/models/deeprec/models/sequential/caser.py @@ -42,10 +42,10 @@ def _build_seq_graph(self): Returns: object: The output of caser section. """ - with tf.variable_scope("caser"): + with tf.compat.v1.variable_scope("caser"): cnn_output = self._caser_cnn() model_output = tf.concat([cnn_output, self.target_item_embedding], 1) - tf.summary.histogram("model_output", model_output) + tf.compat.v1.summary.histogram("model_output", model_output) return model_output def _add_cnn(self, hist_matrix, vertical_dim, scope): @@ -59,17 +59,17 @@ def _add_cnn(self, hist_matrix, vertical_dim, scope): Returns: object: The output of CNN layers. """ - with tf.variable_scope(scope): - with tf.variable_scope("vertical"): - embedding_T = tf.transpose(hist_matrix, [0, 2, 1]) + with tf.compat.v1.variable_scope(scope): + with tf.compat.v1.variable_scope("vertical"): + embedding_T = tf.transpose(a=hist_matrix, perm=[0, 2, 1]) out_v = self._build_cnn(embedding_T, self.n_v, vertical_dim) - out_v = tf.layers.flatten(out_v) - with tf.variable_scope("horizonal"): + out_v = tf.compat.v1.layers.flatten(out_v) + with tf.compat.v1.variable_scope("horizonal"): out_hs = [] for h in self.lengths: conv_out = self._build_cnn(hist_matrix, self.n_h, h) max_pool_out = tf.reduce_max( - conv_out, reduction_indices=[1], name="max_pool_{0}".format(h) + input_tensor=conv_out, axis=[1], name="max_pool_{0}".format(h) ) out_hs.append(max_pool_out) out_h = tf.concat(out_hs, 1) @@ -84,13 +84,13 @@ def _caser_cnn(self): item_out = self._add_cnn( self.item_history_embedding, self.item_embedding_dim, "item" ) - tf.summary.histogram("item_out", item_out) + tf.compat.v1.summary.histogram("item_out", item_out) cate_out = self._add_cnn( self.cate_history_embedding, self.cate_embedding_dim, "cate" ) - tf.summary.histogram("cate_out", cate_out) + tf.compat.v1.summary.histogram("cate_out", cate_out) cnn_output = tf.concat([item_out, cate_out], 1) - tf.summary.histogram("cnn_output", cnn_output) + tf.compat.v1.summary.histogram("cnn_output", cnn_output) return cnn_output def _build_cnn(self, history_matrix, nums, shape): @@ -99,7 +99,7 @@ def _build_cnn(self, history_matrix, nums, shape): Returns: object: The output of cnn section. """ - return tf.layers.conv1d( + return tf.compat.v1.layers.conv1d( history_matrix, nums, shape, diff --git a/recommenders/models/deeprec/models/sequential/gru4rec.py b/recommenders/models/deeprec/models/sequential/gru4rec.py index 8e203c9cd2..6d8c645469 100644 --- a/recommenders/models/deeprec/models/sequential/gru4rec.py +++ b/recommenders/models/deeprec/models/sequential/gru4rec.py @@ -26,11 +26,11 @@ def _build_seq_graph(self): Returns: object:the output of GRU4Rec section. """ - with tf.variable_scope("gru4rec"): + with tf.compat.v1.variable_scope("gru4rec"): # final_state = self._build_lstm() final_state = self._build_gru() model_output = tf.concat([final_state, self.target_item_embedding], 1) - tf.summary.histogram("model_output", model_output) + tf.compat.v1.summary.histogram("model_output", model_output) return model_output def _build_lstm(self): @@ -39,9 +39,9 @@ def _build_lstm(self): Returns: object: The output of LSTM section. """ - with tf.name_scope("lstm"): + with tf.compat.v1.name_scope("lstm"): self.mask = self.iterator.mask - self.sequence_length = tf.reduce_sum(self.mask, 1) + self.sequence_length = tf.reduce_sum(input_tensor=self.mask, axis=1) self.history_embedding = tf.concat( [self.item_history_embedding, self.cate_history_embedding], 2 ) @@ -52,7 +52,7 @@ def _build_lstm(self): dtype=tf.float32, scope="lstm", ) - tf.summary.histogram("LSTM_outputs", rnn_outputs) + tf.compat.v1.summary.histogram("LSTM_outputs", rnn_outputs) return final_state[1] def _build_gru(self): @@ -61,9 +61,9 @@ def _build_gru(self): Returns: object: The output of GRU section. """ - with tf.name_scope("gru"): + with tf.compat.v1.name_scope("gru"): self.mask = self.iterator.mask - self.sequence_length = tf.reduce_sum(self.mask, 1) + self.sequence_length = tf.reduce_sum(input_tensor=self.mask, axis=1) self.history_embedding = tf.concat( [self.item_history_embedding, self.cate_history_embedding], 2 ) @@ -74,5 +74,5 @@ def _build_gru(self): dtype=tf.float32, scope="gru", ) - tf.summary.histogram("GRU_outputs", rnn_outputs) + tf.compat.v1.summary.histogram("GRU_outputs", rnn_outputs) return final_state diff --git a/recommenders/models/deeprec/models/sequential/nextitnet.py b/recommenders/models/deeprec/models/sequential/nextitnet.py index e5abc06414..8490ddf36d 100644 --- a/recommenders/models/deeprec/models/sequential/nextitnet.py +++ b/recommenders/models/deeprec/models/sequential/nextitnet.py @@ -30,17 +30,17 @@ def _build_seq_graph(self): hparams = self.hparams is_training = tf.equal(self.is_train_stage, True) item_history_embedding = tf.cond( - is_training, - lambda: self.item_history_embedding[:: self.hparams.train_num_ngs + 1], - lambda: self.item_history_embedding, + pred=is_training, + true_fn=lambda: self.item_history_embedding[:: self.hparams.train_num_ngs + 1], + false_fn=lambda: self.item_history_embedding, ) cate_history_embedding = tf.cond( - is_training, - lambda: self.cate_history_embedding[:: self.hparams.train_num_ngs + 1], - lambda: self.cate_history_embedding, + pred=is_training, + true_fn=lambda: self.cate_history_embedding[:: self.hparams.train_num_ngs + 1], + false_fn=lambda: self.cate_history_embedding, ) - with tf.variable_scope("nextitnet", reuse=tf.AUTO_REUSE): + with tf.compat.v1.variable_scope("nextitnet", reuse=tf.compat.v1.AUTO_REUSE): dilate_input = tf.concat( [item_history_embedding, cate_history_embedding], 2 @@ -48,8 +48,8 @@ def _build_seq_graph(self): for layer_id, dilation in enumerate(hparams.dilations): dilate_input = tf.cond( - is_training, - lambda: self._nextitnet_residual_block_one( + pred=is_training, + true_fn=lambda: self._nextitnet_residual_block_one( dilate_input, dilation, layer_id, @@ -58,7 +58,7 @@ def _build_seq_graph(self): causal=True, train=True, ), - lambda: self._nextitnet_residual_block_one( + false_fn=lambda: self._nextitnet_residual_block_one( dilate_input, dilation, layer_id, @@ -71,7 +71,7 @@ def _build_seq_graph(self): self.dilate_input = dilate_input model_output = tf.cond( - is_training, self._training_output, self._normal_output + pred=is_training, true_fn=self._training_output, false_fn=self._normal_output ) return model_output @@ -90,7 +90,7 @@ def _training_output(self): model_output.get_shape()[-1], ), ) - model_output = tf.transpose(model_output, [0, 2, 1, 3]) + model_output = tf.transpose(a=model_output, perm=[0, 2, 1, 3]) model_output = tf.reshape(model_output, (-1, model_output.get_shape()[-1])) return model_output @@ -129,7 +129,7 @@ def _nextitnet_residual_block_one( resblock_name = "nextitnet_residual_block_one_{}_layer_{}_{}".format( resblock_type, layer_id, dilation ) - with tf.variable_scope(resblock_name): + with tf.compat.v1.variable_scope(resblock_name): input_ln = self._layer_norm(input_, name="layer_norm1", trainable=train) relu1 = tf.nn.relu(input_ln) conv1 = self._conv1d( @@ -168,20 +168,20 @@ def _conv1d( Returns: object: The output of dilated CNN layers. """ - with tf.variable_scope(name): - weight = tf.get_variable( + with tf.compat.v1.variable_scope(name): + weight = tf.compat.v1.get_variable( "weight", [1, kernel_size, input_.get_shape()[-1], output_channels], - initializer=tf.truncated_normal_initializer(stddev=0.02, seed=1), + initializer=tf.compat.v1.truncated_normal_initializer(stddev=0.02, seed=1), ) - bias = tf.get_variable( - "bias", [output_channels], initializer=tf.constant_initializer(0.0) + bias = tf.compat.v1.get_variable( + "bias", [output_channels], initializer=tf.compat.v1.constant_initializer(0.0) ) if causal: padding = [[0, 0], [(kernel_size - 1) * dilation, 0], [0, 0]] - padded = tf.pad(input_, padding) - input_expanded = tf.expand_dims(padded, dim=1) + padded = tf.pad(tensor=input_, paddings=padding) + input_expanded = tf.expand_dims(padded, axis=1) out = ( tf.nn.atrous_conv2d( input_expanded, weight, rate=dilation, padding="VALID" @@ -189,10 +189,10 @@ def _conv1d( + bias ) else: - input_expanded = tf.expand_dims(input_, dim=1) + input_expanded = tf.expand_dims(input_, axis=1) out = ( tf.nn.conv2d( - input_expanded, weight, strides=[1, 1, 1, 1], padding="SAME" + input=input_expanded, filters=weight, strides=[1, 1, 1, 1], padding="SAME" ) + bias ) @@ -206,22 +206,22 @@ def _layer_norm(self, x, name, epsilon=1e-8, trainable=True): Returns: object: Normalized data """ - with tf.variable_scope(name): + with tf.compat.v1.variable_scope(name): shape = x.get_shape() - beta = tf.get_variable( + beta = tf.compat.v1.get_variable( "beta", [int(shape[-1])], - initializer=tf.constant_initializer(0), + initializer=tf.compat.v1.constant_initializer(0), trainable=trainable, ) - gamma = tf.get_variable( + gamma = tf.compat.v1.get_variable( "gamma", [int(shape[-1])], - initializer=tf.constant_initializer(1), + initializer=tf.compat.v1.constant_initializer(1), trainable=trainable, ) - mean, variance = tf.nn.moments(x, axes=[len(shape) - 1], keep_dims=True) + mean, variance = tf.nn.moments(x=x, axes=[len(shape) - 1], keepdims=True) x = (x - mean) / tf.sqrt(variance + epsilon) diff --git a/recommenders/models/deeprec/models/sequential/sequential_base_model.py b/recommenders/models/deeprec/models/sequential/sequential_base_model.py index e8404ba7db..275b873d5e 100644 --- a/recommenders/models/deeprec/models/sequential/sequential_base_model.py +++ b/recommenders/models/deeprec/models/sequential/sequential_base_model.py @@ -42,7 +42,7 @@ def __init__(self, hparams, iterator_creator, graph=None, seed=None): self.graph = tf.Graph() if not graph else graph with self.graph.as_default(): - self.sequence_length = tf.placeholder( + self.sequence_length = tf.compat.v1.placeholder( tf.int32, [None], name="sequence_length" ) @@ -63,7 +63,7 @@ def _build_graph(self): self.keep_prob_train = 1 - np.array(hparams.dropout) self.keep_prob_test = np.ones_like(hparams.dropout) - with tf.variable_scope("sequential") as self.sequential_scope: + with tf.compat.v1.variable_scope("sequential") as self.sequential_scope: self._build_embedding() self._lookup_from_embedding() model_output = self._build_seq_graph() @@ -108,7 +108,7 @@ def fit( if not os.path.exists(self.hparams.SUMMARIES_DIR): os.makedirs(self.hparams.SUMMARIES_DIR) - self.writer = tf.summary.FileWriter( + self.writer = tf.compat.v1.summary.FileWriter( self.hparams.SUMMARIES_DIR, self.sess.graph ) @@ -234,7 +234,7 @@ def predict(self, infile_name, outfile_name): """ load_sess = self.sess - with tf.gfile.GFile(outfile_name, "w") as wt: + with tf.io.gfile.GFile(outfile_name, "w") as wt: for batch_data_input in self.iterator.load_data_from_file( infile_name, batch_num_ngs=0 ): @@ -255,18 +255,18 @@ def _build_embedding(self): self.item_embedding_dim = hparams.item_embedding_dim self.cate_embedding_dim = hparams.cate_embedding_dim - with tf.variable_scope("embedding", initializer=self.initializer): - self.user_lookup = tf.get_variable( + with tf.compat.v1.variable_scope("embedding", initializer=self.initializer): + self.user_lookup = tf.compat.v1.get_variable( name="user_embedding", shape=[self.user_vocab_length, self.user_embedding_dim], dtype=tf.float32, ) - self.item_lookup = tf.get_variable( + self.item_lookup = tf.compat.v1.get_variable( name="item_embedding", shape=[self.item_vocab_length, self.item_embedding_dim], dtype=tf.float32, ) - self.cate_lookup = tf.get_variable( + self.cate_lookup = tf.compat.v1.get_variable( name="cate_embedding", shape=[self.cate_vocab_length, self.cate_embedding_dim], dtype=tf.float32, @@ -275,27 +275,27 @@ def _build_embedding(self): def _lookup_from_embedding(self): """Lookup from embedding variables. A dropout layer follows lookup operations.""" self.user_embedding = tf.nn.embedding_lookup( - self.user_lookup, self.iterator.users + params=self.user_lookup, ids=self.iterator.users ) - tf.summary.histogram("user_embedding_output", self.user_embedding) + tf.compat.v1.summary.histogram("user_embedding_output", self.user_embedding) self.item_embedding = tf.nn.embedding_lookup( - self.item_lookup, self.iterator.items + params=self.item_lookup, ids=self.iterator.items ) self.item_history_embedding = tf.nn.embedding_lookup( - self.item_lookup, self.iterator.item_history + params=self.item_lookup, ids=self.iterator.item_history ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "item_history_embedding_output", self.item_history_embedding ) self.cate_embedding = tf.nn.embedding_lookup( - self.cate_lookup, self.iterator.cates + params=self.cate_lookup, ids=self.iterator.cates ) self.cate_history_embedding = tf.nn.embedding_lookup( - self.cate_lookup, self.iterator.item_cate_history + params=self.cate_lookup, ids=self.iterator.item_cate_history ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "cate_history_embedding_output", self.cate_history_embedding ) @@ -308,7 +308,7 @@ def _lookup_from_embedding(self): ) self.involved_items, _ = tf.unique(involved_items) involved_item_embedding = tf.nn.embedding_lookup( - self.item_lookup, self.involved_items + params=self.item_lookup, ids=self.involved_items ) self.embed_params.append(involved_item_embedding) @@ -321,20 +321,20 @@ def _lookup_from_embedding(self): ) self.involved_cates, _ = tf.unique(involved_cates) involved_cate_embedding = tf.nn.embedding_lookup( - self.cate_lookup, self.involved_cates + params=self.cate_lookup, ids=self.involved_cates ) self.embed_params.append(involved_cate_embedding) self.target_item_embedding = tf.concat( [self.item_embedding, self.cate_embedding], -1 ) - tf.summary.histogram("target_item_embedding_output", self.target_item_embedding) + tf.compat.v1.summary.histogram("target_item_embedding_output", self.target_item_embedding) def _add_norm(self): """Regularization for embedding variables and other variables.""" all_variables, embed_variables = ( - tf.trainable_variables(), - tf.trainable_variables(self.sequential_scope._name + "/embedding"), + tf.compat.v1.trainable_variables(), + tf.compat.v1.trainable_variables(self.sequential_scope._name + "/embedding"), ) layer_params = list(set(all_variables) - set(embed_variables)) layer_params = [a for a in layer_params if "_no_reg" not in a.name] diff --git a/recommenders/models/deeprec/models/sequential/sli_rec.py b/recommenders/models/deeprec/models/sequential/sli_rec.py index 4d330852e1..86e5d59813 100644 --- a/recommenders/models/deeprec/models/sequential/sli_rec.py +++ b/recommenders/models/deeprec/models/sequential/sli_rec.py @@ -31,17 +31,17 @@ def _build_seq_graph(self): object: the output of sli_rec section. """ hparams = self.hparams - with tf.variable_scope("sli_rec"): + with tf.compat.v1.variable_scope("sli_rec"): hist_input = tf.concat( [self.item_history_embedding, self.cate_history_embedding], 2 ) self.mask = self.iterator.mask - self.sequence_length = tf.reduce_sum(self.mask, 1) + self.sequence_length = tf.reduce_sum(input_tensor=self.mask, axis=1) - with tf.variable_scope("long_term_asvd"): + with tf.compat.v1.variable_scope("long_term_asvd"): att_outputs1 = self._attention(hist_input, hparams.attention_size) - att_fea1 = tf.reduce_sum(att_outputs1, 1) - tf.summary.histogram("att_fea1", att_fea1) + att_fea1 = tf.reduce_sum(input_tensor=att_outputs1, axis=1) + tf.compat.v1.summary.histogram("att_fea1", att_fea1) item_history_embedding_new = tf.concat( [ @@ -57,7 +57,7 @@ def _build_seq_graph(self): ], -1, ) - with tf.variable_scope("rnn"): + with tf.compat.v1.variable_scope("rnn"): rnn_outputs, final_state = dynamic_rnn( Time4LSTMCell(hparams.hidden_size), inputs=item_history_embedding_new, @@ -65,17 +65,17 @@ def _build_seq_graph(self): dtype=tf.float32, scope="time4lstm", ) - tf.summary.histogram("LSTM_outputs", rnn_outputs) + tf.compat.v1.summary.histogram("LSTM_outputs", rnn_outputs) - with tf.variable_scope("attention_fcn"): + with tf.compat.v1.variable_scope("attention_fcn"): att_outputs2 = self._attention_fcn( self.target_item_embedding, rnn_outputs ) - att_fea2 = tf.reduce_sum(att_outputs2, 1) - tf.summary.histogram("att_fea2", att_fea2) + att_fea2 = tf.reduce_sum(input_tensor=att_outputs2, axis=1) + tf.compat.v1.summary.histogram("att_fea2", att_fea2) # ensemble - with tf.name_scope("alpha"): + with tf.compat.v1.name_scope("alpha"): concat_all = tf.concat( [ self.target_item_embedding, @@ -92,7 +92,7 @@ def _build_seq_graph(self): alpha_output = tf.sigmoid(alpha_logit) user_embed = att_fea1 * alpha_output + att_fea2 * (1.0 - alpha_output) model_output = tf.concat([user_embed, self.target_item_embedding], 1) - tf.summary.histogram("model_output", model_output) + tf.compat.v1.summary.histogram("model_output", model_output) return model_output def _attention_fcn(self, query, user_embedding): @@ -106,11 +106,11 @@ def _attention_fcn(self, query, user_embedding): object: Weighted sum of user modeling. """ hparams = self.hparams - with tf.variable_scope("attention_fcn"): + with tf.compat.v1.variable_scope("attention_fcn"): query_size = query.shape[1].value boolean_mask = tf.equal(self.mask, tf.ones_like(self.mask)) - attention_mat = tf.get_variable( + attention_mat = tf.compat.v1.get_variable( name="attention_mat", shape=[user_embedding.shape.as_list()[-1], query_size], initializer=self.initializer, @@ -118,7 +118,7 @@ def _attention_fcn(self, query, user_embedding): att_inputs = tf.tensordot(user_embedding, attention_mat, [[2], [0]]) queries = tf.reshape( - tf.tile(query, [1, att_inputs.shape[1].value]), tf.shape(att_inputs) + tf.tile(query, [1, att_inputs.shape[1].value]), tf.shape(input=att_inputs) ) last_hidden_nn_layer = tf.concat( [att_inputs, queries, att_inputs - queries, att_inputs * queries], -1 @@ -129,7 +129,7 @@ def _attention_fcn(self, query, user_embedding): att_fnc_output = tf.squeeze(att_fnc_output, -1) mask_paddings = tf.ones_like(att_fnc_output) * (-(2 ** 32) + 1) att_weights = tf.nn.softmax( - tf.where(boolean_mask, att_fnc_output, mask_paddings), + tf.compat.v1.where(boolean_mask, att_fnc_output, mask_paddings), name="att_weights", ) output = user_embedding * tf.expand_dims(att_weights, -1) diff --git a/recommenders/models/deeprec/models/sequential/sum.py b/recommenders/models/deeprec/models/sequential/sum.py index 9882369a95..20f063bab4 100644 --- a/recommenders/models/deeprec/models/sequential/sum.py +++ b/recommenders/models/deeprec/models/sequential/sum.py @@ -28,7 +28,7 @@ def _build_seq_graph(self): object: The output of SUM section, which is a concatenation of user vector and target item vector. """ hparams = self.hparams - with tf.variable_scope("sum"): + with tf.compat.v1.variable_scope("sum"): self.history_embedding = tf.concat( [self.item_history_embedding, self.cate_history_embedding], 2 ) @@ -38,17 +38,17 @@ def _build_seq_graph(self): final_state = self._build_sum(cell) for _p in cell.parameter_set: - tf.summary.histogram(_p.name, _p) + tf.compat.v1.summary.histogram(_p.name, _p) if hasattr(cell, "_alpha") and hasattr(cell._alpha, "name"): - tf.summary.histogram(cell._alpha.name, cell._alpha) + tf.compat.v1.summary.histogram(cell._alpha.name, cell._alpha) if hasattr(cell, "_beta") and hasattr(cell._beta, "name"): - tf.summary.histogram(cell._beta.name, cell._beta) + tf.compat.v1.summary.histogram(cell._beta.name, cell._beta) final_state, att_weights = self._attention_query_by_state( final_state, self.target_item_embedding ) model_output = tf.concat([final_state, self.target_item_embedding], 1) - tf.summary.histogram("model_output", model_output) + tf.compat.v1.summary.histogram("model_output", model_output) return model_output def _attention_query_by_state(self, seq_output, query): @@ -63,9 +63,9 @@ def _attention_query_by_state(self, seq_output, query): """ dim_q = query.shape[-1].value att_weights = tf.constant(1.0, dtype=tf.float32) - with tf.variable_scope("query_att"): + with tf.compat.v1.variable_scope("query_att"): if self.hparams.slots > 1: - query_att_W = tf.get_variable( + query_att_W = tf.compat.v1.get_variable( name="query_att_W", shape=[self.hidden_size, dim_q], initializer=self.initializer, @@ -88,7 +88,7 @@ def _attention_query_by_state(self, seq_output, query): ) # merge the memory states, the final shape is (BatchSize, HiddenSize) att_res = tf.reduce_sum( - memory_state * tf.expand_dims(att_weights, -1), 1 + input_tensor=memory_state * tf.expand_dims(att_weights, -1), axis=1 ) else: @@ -129,9 +129,9 @@ def _build_sum(self, cell): object: A flatten representation of user memory states, in the shape of (BatchSize, SlotsNum x HiddenSize) """ hparams = self.hparams - with tf.variable_scope("sum"): + with tf.compat.v1.variable_scope("sum"): self.mask = self.iterator.mask - self.sequence_length = tf.reduce_sum(self.mask, 1) + self.sequence_length = tf.reduce_sum(input_tensor=self.mask, axis=1) rum_outputs, final_state = dynamic_rnn( cell, @@ -140,7 +140,7 @@ def _build_sum(self, cell): sequence_length=self.sequence_length, scope="sum", initial_state=cell.zero_state( - tf.shape(self.history_embedding)[0], tf.float32 + tf.shape(input=self.history_embedding)[0], tf.float32 ), ) @@ -149,6 +149,6 @@ def _build_sum(self, cell): self.heads = cell.heads self.alpha = cell._alpha self.beta = cell._beta - tf.summary.histogram("SUM_outputs", rum_outputs) + tf.compat.v1.summary.histogram("SUM_outputs", rum_outputs) return final_state diff --git a/recommenders/models/deeprec/models/sequential/sum_cells.py b/recommenders/models/deeprec/models/sequential/sum_cells.py index 156435648b..8f61ef707f 100644 --- a/recommenders/models/deeprec/models/sequential/sum_cells.py +++ b/recommenders/models/deeprec/models/sequential/sum_cells.py @@ -122,12 +122,12 @@ def _basic_build(self, inputs_shape): self._beta = self.add_variable( name="_beta_no_reg", shape=(), - initializer=tf.constant_initializer(np.array([1.02]), dtype=np.float32), + initializer=tf.compat.v1.constant_initializer(np.array([1.02]), dtype=np.float32), ) self._alpha = self.add_variable( name="_alpha_no_reg", shape=(), - initializer=tf.constant_initializer(np.array([0.98]), dtype=np.float32), + initializer=tf.compat.v1.constant_initializer(np.array([0.98]), dtype=np.float32), ) @tf_utils.shape_type_conversion @@ -183,27 +183,27 @@ def call(self, inputs, state): att_weights = tf.nn.softmax(self._beta * att_logit_mat, axis=-1) att_weights = tf.expand_dims(att_weights, 2) - h_hat = tf.reduce_sum(tf.multiply(state[:, : self._slots, :], att_weights), 1) + h_hat = tf.reduce_sum(input_tensor=tf.multiply(state[:, : self._slots, :], att_weights), axis=1) h_hat = (h_hat + state[:, self._slots, :]) / 2 n_a, n_b = tf.nn.l2_normalize(last, 1), tf.nn.l2_normalize(inputs, 1) - dist = tf.expand_dims(tf.reduce_sum(n_a * n_b, 1), 1) + dist = tf.expand_dims(tf.reduce_sum(input_tensor=n_a * n_b, axis=1), 1) dist = tf.math.pow(self._alpha, dist) att_weights = att_weights * tf.expand_dims(dist, 1) reset = tf.sigmoid( - tf.nn.xw_plus_b( + tf.compat.v1.nn.xw_plus_b( tf.concat([inputs, h_hat], axis=-1), self._reset_W, self._reset_b ) ) erase = tf.sigmoid( - tf.nn.xw_plus_b( + tf.compat.v1.nn.xw_plus_b( tf.concat([inputs, h_hat], axis=-1), self._erase_W, self._erase_b ) ) add = tf.tanh( - tf.nn.xw_plus_b( + tf.compat.v1.nn.xw_plus_b( tf.concat([inputs, reset * h_hat], axis=-1), self._add_W, self._add_b ) ) @@ -309,35 +309,35 @@ def call(self, inputs, state): att_weights = tf.nn.softmax(self._beta * att_logit_mat, axis=-1) att_weights = tf.expand_dims(att_weights, 2) - h_hat = tf.reduce_sum(tf.multiply(state[:, : self._slots, :], att_weights), 1) + h_hat = tf.reduce_sum(input_tensor=tf.multiply(state[:, : self._slots, :], att_weights), axis=1) h_hat = (h_hat + state[:, self._slots, :]) / 2 ## get the true writing attentions writing_input = tf.concat([inputs, h_hat], axis=1) - att_weights = tf.nn.xw_plus_b(writing_input, self._writing_W, self._writing_b) + att_weights = tf.compat.v1.nn.xw_plus_b(writing_input, self._writing_W, self._writing_b) att_weights = tf.nn.relu(att_weights) att_weights = tf.matmul(att_weights, self._writing_W02) att_weights = tf.nn.softmax(att_weights, axis=-1) att_weights = tf.expand_dims(att_weights, 2) n_a, n_b = tf.nn.l2_normalize(last, 1), tf.nn.l2_normalize(inputs, 1) - dist = tf.expand_dims(tf.reduce_sum(n_a * n_b, 1), 1) + dist = tf.expand_dims(tf.reduce_sum(input_tensor=n_a * n_b, axis=1), 1) dist = tf.math.pow(self._alpha, dist) att_weights = att_weights * tf.expand_dims(dist, 1) reset = tf.sigmoid( - tf.nn.xw_plus_b( + tf.compat.v1.nn.xw_plus_b( tf.concat([inputs, h_hat], axis=-1), self._reset_W, self._reset_b ) ) erase = tf.sigmoid( - tf.nn.xw_plus_b( + tf.compat.v1.nn.xw_plus_b( tf.concat([inputs, h_hat], axis=-1), self._erase_W, self._erase_b ) ) add = tf.tanh( - tf.nn.xw_plus_b( + tf.compat.v1.nn.xw_plus_b( tf.concat([inputs, reset * h_hat], axis=-1), self._add_W, self._add_b ) ) diff --git a/recommenders/models/deeprec/models/xDeepFM.py b/recommenders/models/deeprec/models/xDeepFM.py index 9c77f70dcc..26f690e03d 100644 --- a/recommenders/models/deeprec/models/xDeepFM.py +++ b/recommenders/models/deeprec/models/xDeepFM.py @@ -31,9 +31,9 @@ def _build_graph(self): self.keep_prob_train = 1 - np.array(hparams.dropout) self.keep_prob_test = np.ones_like(hparams.dropout) - with tf.variable_scope("XDeepFM") as scope: - with tf.variable_scope("embedding", initializer=self.initializer) as escope: - self.embedding = tf.get_variable( + with tf.compat.v1.variable_scope("XDeepFM") as scope: + with tf.compat.v1.variable_scope("embedding", initializer=self.initializer) as escope: + self.embedding = tf.compat.v1.get_variable( name="embedding_layer", shape=[hparams.FEATURE_COUNT, hparams.dim], dtype=tf.float32, @@ -88,7 +88,7 @@ def _build_embedding(self): self.iterator.dnn_feat_shape, ) w_fm_nn_input_orgin = tf.nn.embedding_lookup_sparse( - self.embedding, fm_sparse_index, fm_sparse_weight, combiner="sum" + params=self.embedding, sp_ids=fm_sparse_index, sp_weights=fm_sparse_weight, combiner="sum" ) embedding = tf.reshape( w_fm_nn_input_orgin, [-1, hparams.dim * hparams.FIELD_COUNT] @@ -103,26 +103,26 @@ def _build_linear(self): Returns: object: Prediction score made by linear regression. """ - with tf.variable_scope("linear_part", initializer=self.initializer) as scope: - w = tf.get_variable( + with tf.compat.v1.variable_scope("linear_part", initializer=self.initializer) as scope: + w = tf.compat.v1.get_variable( name="w", shape=[self.hparams.FEATURE_COUNT, 1], dtype=tf.float32 ) - b = tf.get_variable( + b = tf.compat.v1.get_variable( name="b", shape=[1], dtype=tf.float32, - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), ) x = tf.SparseTensor( self.iterator.fm_feat_indices, self.iterator.fm_feat_values, self.iterator.fm_feat_shape, ) - linear_output = tf.add(tf.sparse_tensor_dense_matmul(x, w), b) + linear_output = tf.add(tf.sparse.sparse_dense_matmul(x, w), b) self.layer_params.append(w) self.layer_params.append(b) - tf.summary.histogram("linear_part/w", w) - tf.summary.histogram("linear_part/b", b) + tf.compat.v1.summary.histogram("linear_part/w", w) + tf.compat.v1.summary.histogram("linear_part/b", b) return linear_output def _build_fm(self): @@ -132,7 +132,7 @@ def _build_fm(self): Returns: object: Prediction score made by factorization machine. """ - with tf.variable_scope("fm_part") as scope: + with tf.compat.v1.variable_scope("fm_part") as scope: x = tf.SparseTensor( self.iterator.fm_feat_indices, self.iterator.fm_feat_values, @@ -144,10 +144,10 @@ def _build_fm(self): self.iterator.fm_feat_shape, ) fm_output = 0.5 * tf.reduce_sum( - tf.pow(tf.sparse_tensor_dense_matmul(x, self.embedding), 2) - - tf.sparse_tensor_dense_matmul(xx, tf.pow(self.embedding, 2)), - 1, - keep_dims=True, + input_tensor=tf.pow(tf.sparse.sparse_dense_matmul(x, self.embedding), 2) + - tf.sparse.sparse_dense_matmul(xx, tf.pow(self.embedding, 2)), + axis=1, + keepdims=True, ) return fm_output @@ -178,7 +178,7 @@ def _build_CIN( hidden_nn_layers.append(nn_input) final_result = [] split_tensor0 = tf.split(hidden_nn_layers[0], hparams.dim * [1], 2) - with tf.variable_scope("exfm_part", initializer=self.initializer) as scope: + with tf.compat.v1.variable_scope("exfm_part", initializer=self.initializer) as scope: for idx, layer_size in enumerate(hparams.cross_layer_sizes): split_tensor = tf.split(hidden_nn_layers[-1], hparams.dim * [1], 2) dot_result_m = tf.matmul( @@ -188,9 +188,9 @@ def _build_CIN( dot_result_m, shape=[hparams.dim, -1, field_nums[0] * field_nums[-1]], ) # shape: (D,B,FH) - dot_result = tf.transpose(dot_result_o, perm=[1, 0, 2]) # (B,D,FH) + dot_result = tf.transpose(a=dot_result_o, perm=[1, 0, 2]) # (B,D,FH) - filters = tf.get_variable( + filters = tf.compat.v1.get_variable( name="f_" + str(idx), shape=[1, field_nums[-1] * field_nums[0], layer_size], dtype=tf.float32, @@ -198,7 +198,7 @@ def _build_CIN( if is_masked and idx == 0: ones = tf.ones([field_nums[0], field_nums[0]], dtype=tf.float32) - mask_matrix = tf.matrix_band_part(ones, 0, -1) - tf.diag( + mask_matrix = tf.linalg.band_part(ones, 0, -1) - tf.linalg.tensor_diag( tf.ones(field_nums[0]) ) mask_matrix = tf.reshape( @@ -209,21 +209,21 @@ def _build_CIN( self.dot_result = dot_result curr_out = tf.nn.conv1d( - dot_result, filters=filters, stride=1, padding="VALID" + input=dot_result, filters=filters, stride=1, padding="VALID" ) # shape : (B,D,H`) if bias: - b = tf.get_variable( + b = tf.compat.v1.get_variable( name="f_b" + str(idx), shape=[layer_size], dtype=tf.float32, - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), ) curr_out = tf.nn.bias_add(curr_out, b) self.cross_params.append(b) if hparams.enable_BN is True: - curr_out = tf.layers.batch_normalization( + curr_out = tf.compat.v1.layers.batch_normalization( curr_out, momentum=0.95, epsilon=0.0001, @@ -232,7 +232,7 @@ def _build_CIN( curr_out = self._activate(curr_out, hparams.cross_activation) - curr_out = tf.transpose(curr_out, perm=[0, 2, 1]) # shape : (B,H,D) + curr_out = tf.transpose(a=curr_out, perm=[0, 2, 1]) # shape : (B,H,D) if direct: direct_connect = curr_out @@ -258,25 +258,25 @@ def _build_CIN( self.cross_params.append(filters) result = tf.concat(final_result, axis=1) - result = tf.reduce_sum(result, -1) # shape : (B,H) + result = tf.reduce_sum(input_tensor=result, axis=-1) # shape : (B,H) if res: - base_score = tf.reduce_sum(result, 1, keepdims=True) # (B,1) + base_score = tf.reduce_sum(input_tensor=result, axis=1, keepdims=True) # (B,1) else: base_score = 0 - w_nn_output = tf.get_variable( + w_nn_output = tf.compat.v1.get_variable( name="w_nn_output", shape=[final_len, 1], dtype=tf.float32 ) - b_nn_output = tf.get_variable( + b_nn_output = tf.compat.v1.get_variable( name="b_nn_output", shape=[1], dtype=tf.float32, - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), ) self.layer_params.append(w_nn_output) self.layer_params.append(b_nn_output) - exFM_out = base_score + tf.nn.xw_plus_b(result, w_nn_output, b_nn_output) + exFM_out = base_score + tf.compat.v1.nn.xw_plus_b(result, w_nn_output, b_nn_output) return exFM_out def _build_fast_CIN(self, nn_input, res=False, direct=False, bias=False): @@ -304,14 +304,14 @@ def _build_fast_CIN(self, nn_input, res=False, direct=False, bias=False): nn_input = tf.reshape( nn_input, shape=[-1, int(field_num), hparams.dim] ) # (B,F,D) - nn_input = tf.transpose(nn_input, perm=[0, 2, 1]) # (B,D,F) + nn_input = tf.transpose(a=nn_input, perm=[0, 2, 1]) # (B,D,F) field_nums.append(int(field_num)) hidden_nn_layers.append(nn_input) final_result = [] - with tf.variable_scope("exfm_part", initializer=self.initializer) as scope: + with tf.compat.v1.variable_scope("exfm_part", initializer=self.initializer) as scope: for idx, layer_size in enumerate(hparams.cross_layer_sizes): if idx == 0: - fast_w = tf.get_variable( + fast_w = tf.compat.v1.get_variable( "fast_CIN_w_" + str(idx), shape=[1, field_nums[0], fast_CIN_d * layer_size], dtype=tf.float32, @@ -319,10 +319,10 @@ def _build_fast_CIN(self, nn_input, res=False, direct=False, bias=False): self.cross_params.append(fast_w) dot_result_1 = tf.nn.conv1d( - nn_input, filters=fast_w, stride=1, padding="VALID" + input=nn_input, filters=fast_w, stride=1, padding="VALID" ) # shape: (B,D,d*H) dot_result_2 = tf.nn.conv1d( - tf.pow(nn_input, 2), + input=tf.pow(nn_input, 2), filters=tf.pow(fast_w, 2), stride=1, padding="VALID", @@ -332,15 +332,15 @@ def _build_fast_CIN(self, nn_input, res=False, direct=False, bias=False): shape=[-1, hparams.dim, layer_size, fast_CIN_d], ) curr_out = tf.reduce_sum( - dot_result, 3, keepdims=False + input_tensor=dot_result, axis=3, keepdims=False ) # shape: ((B,D,H) else: - fast_w = tf.get_variable( + fast_w = tf.compat.v1.get_variable( "fast_CIN_w_" + str(idx), shape=[1, field_nums[0], fast_CIN_d * layer_size], dtype=tf.float32, ) - fast_v = tf.get_variable( + fast_v = tf.compat.v1.get_variable( "fast_CIN_v_" + str(idx), shape=[1, field_nums[-1], fast_CIN_d * layer_size], dtype=tf.float32, @@ -350,31 +350,31 @@ def _build_fast_CIN(self, nn_input, res=False, direct=False, bias=False): self.cross_params.append(fast_v) dot_result_1 = tf.nn.conv1d( - nn_input, filters=fast_w, stride=1, padding="VALID" + input=nn_input, filters=fast_w, stride=1, padding="VALID" ) # shape: ((B,D,d*H) dot_result_2 = tf.nn.conv1d( - hidden_nn_layers[-1], filters=fast_v, stride=1, padding="VALID" + input=hidden_nn_layers[-1], filters=fast_v, stride=1, padding="VALID" ) # shape: ((B,D,d*H) dot_result = tf.reshape( tf.multiply(dot_result_1, dot_result_2), shape=[-1, hparams.dim, layer_size, fast_CIN_d], ) curr_out = tf.reduce_sum( - dot_result, 3, keepdims=False + input_tensor=dot_result, axis=3, keepdims=False ) # shape: ((B,D,H) if bias: - b = tf.get_variable( + b = tf.compat.v1.get_variable( name="f_b" + str(idx), shape=[1, 1, layer_size], dtype=tf.float32, - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), ) curr_out = tf.nn.bias_add(curr_out, b) self.cross_params.append(b) if hparams.enable_BN is True: - curr_out = tf.layers.batch_normalization( + curr_out = tf.compat.v1.layers.batch_normalization( curr_out, momentum=0.95, epsilon=0.0001, @@ -406,25 +406,25 @@ def _build_fast_CIN(self, nn_input, res=False, direct=False, bias=False): hidden_nn_layers.append(next_hidden) result = tf.concat(final_result, axis=2) - result = tf.reduce_sum(result, 1, keepdims=False) # (B,H) + result = tf.reduce_sum(input_tensor=result, axis=1, keepdims=False) # (B,H) if res: - base_score = tf.reduce_sum(result, 1, keepdims=True) # (B,1) + base_score = tf.reduce_sum(input_tensor=result, axis=1, keepdims=True) # (B,1) else: base_score = 0 - w_nn_output = tf.get_variable( + w_nn_output = tf.compat.v1.get_variable( name="w_nn_output", shape=[final_len, 1], dtype=tf.float32 ) - b_nn_output = tf.get_variable( + b_nn_output = tf.compat.v1.get_variable( name="b_nn_output", shape=[1], dtype=tf.float32, - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), ) self.layer_params.append(w_nn_output) self.layer_params.append(b_nn_output) - exFM_out = tf.nn.xw_plus_b(result, w_nn_output, b_nn_output) + base_score + exFM_out = tf.compat.v1.nn.xw_plus_b(result, w_nn_output, b_nn_output) + base_score return exFM_out @@ -445,33 +445,33 @@ def _build_dnn(self, embed_out, embed_layer_size): layer_idx = 0 hidden_nn_layers = [] hidden_nn_layers.append(w_fm_nn_input) - with tf.variable_scope("nn_part", initializer=self.initializer) as scope: + with tf.compat.v1.variable_scope("nn_part", initializer=self.initializer) as scope: for idx, layer_size in enumerate(hparams.layer_sizes): - curr_w_nn_layer = tf.get_variable( + curr_w_nn_layer = tf.compat.v1.get_variable( name="w_nn_layer" + str(layer_idx), shape=[last_layer_size, layer_size], dtype=tf.float32, ) - curr_b_nn_layer = tf.get_variable( + curr_b_nn_layer = tf.compat.v1.get_variable( name="b_nn_layer" + str(layer_idx), shape=[layer_size], dtype=tf.float32, - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "nn_part/" + "w_nn_layer" + str(layer_idx), curr_w_nn_layer ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "nn_part/" + "b_nn_layer" + str(layer_idx), curr_b_nn_layer ) - curr_hidden_nn_layer = tf.nn.xw_plus_b( + curr_hidden_nn_layer = tf.compat.v1.nn.xw_plus_b( hidden_nn_layers[layer_idx], curr_w_nn_layer, curr_b_nn_layer ) scope = "nn_part" + str(idx) activation = hparams.activation[idx] if hparams.enable_BN is True: - curr_hidden_nn_layer = tf.layers.batch_normalization( + curr_hidden_nn_layer = tf.compat.v1.layers.batch_normalization( curr_hidden_nn_layer, momentum=0.95, epsilon=0.0001, @@ -487,22 +487,22 @@ def _build_dnn(self, embed_out, embed_layer_size): self.layer_params.append(curr_w_nn_layer) self.layer_params.append(curr_b_nn_layer) - w_nn_output = tf.get_variable( + w_nn_output = tf.compat.v1.get_variable( name="w_nn_output", shape=[last_layer_size, 1], dtype=tf.float32 ) - b_nn_output = tf.get_variable( + b_nn_output = tf.compat.v1.get_variable( name="b_nn_output", shape=[1], dtype=tf.float32, - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "nn_part/" + "w_nn_output" + str(layer_idx), w_nn_output ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "nn_part/" + "b_nn_output" + str(layer_idx), b_nn_output ) self.layer_params.append(w_nn_output) self.layer_params.append(b_nn_output) - nn_output = tf.nn.xw_plus_b(hidden_nn_layers[-1], w_nn_output, b_nn_output) + nn_output = tf.compat.v1.nn.xw_plus_b(hidden_nn_layers[-1], w_nn_output, b_nn_output) return nn_output diff --git a/recommenders/models/ncf/ncf_singlenode.py b/recommenders/models/ncf/ncf_singlenode.py index 1c8f9af790..5f5ba5216d 100644 --- a/recommenders/models/ncf/ncf_singlenode.py +++ b/recommenders/models/ncf/ncf_singlenode.py @@ -156,10 +156,10 @@ def _create_model( # get user embedding p and item embedding q self.gmf_p = tf.reduce_sum( - tf.nn.embedding_lookup(self.embedding_gmf_P, self.user_input), 1 + input_tensor=tf.nn.embedding_lookup(params=self.embedding_gmf_P, ids=self.user_input), axis=1 ) self.gmf_q = tf.reduce_sum( - tf.nn.embedding_lookup(self.embedding_gmf_Q, self.item_input), 1 + input_tensor=tf.nn.embedding_lookup(params=self.embedding_gmf_Q, ids=self.item_input), axis=1 ) # get gmf vector @@ -169,10 +169,10 @@ def _create_model( # get user embedding p and item embedding q self.mlp_p = tf.reduce_sum( - tf.nn.embedding_lookup(self.embedding_mlp_P, self.user_input), 1 + input_tensor=tf.nn.embedding_lookup(params=self.embedding_mlp_P, ids=self.user_input), axis=1 ) self.mlp_q = tf.reduce_sum( - tf.nn.embedding_lookup(self.embedding_mlp_Q, self.item_input), 1 + input_tensor=tf.nn.embedding_lookup(params=self.embedding_mlp_Q, ids=self.item_input), axis=1 ) # concatenate user and item vector @@ -184,8 +184,8 @@ def _create_model( output, num_outputs=layer_size, activation_fn=tf.nn.relu, - weights_initializer=tf.contrib.layers.xavier_initializer( - seed=self.seed + weights_initializer=tf.compat.v1.keras.initializers.VarianceScaling( + scale=1.0, mode="fan_avg", distribution="uniform", seed=self.seed ), ) self.mlp_vector = output @@ -201,8 +201,8 @@ def _create_model( num_outputs=1, activation_fn=None, biases_initializer=None, - weights_initializer=tf.contrib.layers.xavier_initializer( - seed=self.seed + weights_initializer=tf.compat.v1.keras.initializers.VarianceScaling( + scale=1.0, mode="fan_avg", distribution="uniform", seed=self.seed ), ) self.output = tf.sigmoid(output) @@ -214,8 +214,8 @@ def _create_model( num_outputs=1, activation_fn=None, biases_initializer=None, - weights_initializer=tf.contrib.layers.xavier_initializer( - seed=self.seed + weights_initializer=tf.compat.v1.keras.initializers.VarianceScaling( + scale=1.0, mode="fan_avg", distribution="uniform", seed=self.seed ), ) self.output = tf.sigmoid(output) @@ -229,8 +229,8 @@ def _create_model( num_outputs=1, activation_fn=None, biases_initializer=None, - weights_initializer=tf.contrib.layers.xavier_initializer( - seed=self.seed + weights_initializer=tf.compat.v1.keras.initializers.VarianceScaling( + scale=1.0, mode="fan_avg", distribution="uniform", seed=self.seed ), ) self.output = tf.sigmoid(output) @@ -326,17 +326,17 @@ def _load_neumf(self, gmf_dir, mlp_dir, alpha): saver.restore(self.sess, os.path.join(mlp_dir, MODEL_CHECKPOINT)) # concat pretrain h_from_gmf and h_from_mlp - vars_list = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="ncf") + vars_list = tf.compat.v1.get_collection(tf.compat.v1.GraphKeys.GLOBAL_VARIABLES, scope="ncf") assert len(vars_list) == 1 ncf_fc = vars_list[0] # get weight from gmf and mlp - gmf_fc = tf.contrib.framework.load_variable(gmf_dir, ncf_fc.name) - mlp_fc = tf.contrib.framework.load_variable(mlp_dir, ncf_fc.name) + gmf_fc = tf.train.load_variable(gmf_dir, ncf_fc.name) + mlp_fc = tf.train.load_variable(mlp_dir, ncf_fc.name) # load fc layer by tf.concat - assign_op = tf.assign( + assign_op = tf.compat.v1.assign( ncf_fc, tf.concat([alpha * gmf_fc, (1 - alpha) * mlp_fc], axis=0) ) self.sess.run(assign_op) diff --git a/recommenders/models/rbm/rbm.py b/recommenders/models/rbm/rbm.py index 50c9d2587b..67aeec1830 100644 --- a/recommenders/models/rbm/rbm.py +++ b/recommenders/models/rbm/rbm.py @@ -106,7 +106,7 @@ def __init__( # Seed self.seed = seed np.random.seed(self.seed) - tf.set_random_seed(self.seed) + tf.compat.v1.set_random_seed(self.seed) def time(self): """Time a particular section of the code - call this once to set the state somewhere @@ -146,7 +146,7 @@ def binomial_sampling(self, pr): """ # sample from a Bernoulli distribution with same dimensions as input distribution - g = tf.convert_to_tensor(np.random.uniform(size=pr.shape[1]), dtype=tf.float32) + g = tf.convert_to_tensor(value=np.random.uniform(size=pr.shape[1]), dtype=tf.float32) # sample the value of the hidden units h_sampled = tf.nn.relu(tf.sign(pr - g)) @@ -178,12 +178,12 @@ def multinomial_sampling(self, pr): """ g = np.random.uniform(size=pr.shape[2]) # sample from a uniform distribution f = tf.convert_to_tensor( - g / g.sum(), dtype=tf.float32 + value=g / g.sum(), dtype=tf.float32 ) # normalize and convert to tensor samp = tf.nn.relu(tf.sign(pr - f)) # apply rejection method v_samp = tf.cast( - tf.argmax(samp, axis=2) + 1, "float32" + tf.argmax(input=samp, axis=2) + 1, "float32" ) # select sampled element return v_samp @@ -206,11 +206,11 @@ def multinomial_distribution(self, phi): for k in range(1, self.ratings + 1) ] - denominator = tf.reduce_sum(numerator, axis=0) + denominator = tf.reduce_sum(input_tensor=numerator, axis=0) - prob = tf.div(numerator, denominator) + prob = tf.compat.v1.div(numerator, denominator) - return tf.transpose(prob, perm=[1, 2, 0]) + return tf.transpose(a=prob, perm=[1, 2, 0]) def free_energy(self, x): """Free energy of the visible units given the hidden units. Since the sum is over the hidden units' @@ -223,10 +223,10 @@ def free_energy(self, x): tf.Tensor: Free energy of the model. """ - bias = -tf.reduce_sum(tf.matmul(x, tf.transpose(self.bv))) + bias = -tf.reduce_sum(input_tensor=tf.matmul(x, tf.transpose(a=self.bv))) phi_x = tf.matmul(x, self.w) + self.bh - f = -tf.reduce_sum(tf.nn.softplus(phi_x)) + f = -tf.reduce_sum(input_tensor=tf.nn.softplus(phi_x)) F = bias + f # free energy density per training example @@ -234,7 +234,7 @@ def free_energy(self, x): def placeholder(self): """Initialize the placeholders for the visible units""" - self.vu = tf.placeholder(shape=[None, self.Nvisible], dtype="float32") + self.vu = tf.compat.v1.placeholder(shape=[None, self.Nvisible], dtype="float32") def init_parameters(self): """Initialize the parameters of the model. @@ -252,28 +252,28 @@ def init_parameters(self): - `bv` of size (1, Nvisible): visible units' bias, initialized to zero. - `bh` of size (1, Nhidden): hidden units' bias, initiliazed to zero. """ - with tf.variable_scope("Network_parameters"): + with tf.compat.v1.variable_scope("Network_parameters"): - self.w = tf.get_variable( + self.w = tf.compat.v1.get_variable( "weight", [self.Nvisible, self.Nhidden], - initializer=tf.random_normal_initializer( + initializer=tf.compat.v1.random_normal_initializer( stddev=self.stdv, seed=self.seed ), dtype="float32", ) - self.bv = tf.get_variable( + self.bv = tf.compat.v1.get_variable( "v_bias", [1, self.Nvisible], - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), dtype="float32", ) - self.bh = tf.get_variable( + self.bh = tf.compat.v1.get_variable( "h_bias", [1, self.Nhidden], - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), dtype="float32", ) @@ -296,11 +296,11 @@ def sample_hidden_units(self, vv): - `h_`: The sampled value of the hidden unit from a Bernoulli distributions having success probability `phv`. """ - with tf.name_scope("sample_hidden_units"): + with tf.compat.v1.name_scope("sample_hidden_units"): phi_v = tf.matmul(vv, self.w) + self.bh # create a linear combination phv = tf.nn.sigmoid(phi_v) # conditional probability of h given v - phv_reg = tf.nn.dropout(phv, self.keep) + phv_reg = tf.nn.dropout(phv, 1 - (self.keep)) # Sampling h_ = self.binomial_sampling( @@ -334,9 +334,9 @@ def sample_visible_units(self, h): - `v_`: The sampled value of the visible unit from a Multinomial distributions having success probability `pvh`. """ - with tf.name_scope("sample_visible_units"): + with tf.compat.v1.name_scope("sample_visible_units"): - phi_h = tf.matmul(h, tf.transpose(self.w)) + self.bv # linear combination + phi_h = tf.matmul(h, tf.transpose(a=self.w)) + self.bv # linear combination pvh = self.multinomial_distribution( phi_h ) # conditional probability of v given h @@ -348,7 +348,7 @@ def sample_visible_units(self, h): mask = tf.equal(self.v, 0) # selects the inactive units in the input vector - v_ = tf.where( + v_ = tf.compat.v1.where( mask, x=self.v, y=v_tmp ) # enforce inactive units in the reconstructed vector @@ -369,7 +369,7 @@ def gibbs_sampling(self): - `v_k`: The sampled value of the visible unit at step k, float32. """ - with tf.name_scope("gibbs_sampling"): + with tf.compat.v1.name_scope("gibbs_sampling"): self.v_k = ( self.v @@ -394,7 +394,7 @@ def losses(self, vv): - Objective function of Contrastive divergence: the difference between the free energy clamped on the data (v) and the model Free energy (v_k). """ - with tf.variable_scope("losses"): + with tf.compat.v1.variable_scope("losses"): obj = self.free_energy(vv) - self.free_energy(self.v_k) return obj @@ -412,7 +412,7 @@ def gibbs_protocol(self, i): i (int): Current epoch in the loop """ - with tf.name_scope("gibbs_protocol"): + with tf.compat.v1.name_scope("gibbs_protocol"): epoch_percentage = ( i / self.epochs @@ -449,15 +449,15 @@ def accuracy(self, vp): """ - with tf.name_scope("accuracy"): + with tf.compat.v1.name_scope("accuracy"): # 1) define and apply the mask mask = tf.not_equal(self.v, 0) - n_values = tf.reduce_sum(tf.cast(mask, "float32"), axis=1) + n_values = tf.reduce_sum(input_tensor=tf.cast(mask, "float32"), axis=1) # 2) Take the difference between the input data and the inferred ones. This value is zero whenever # the two values coincides - vd = tf.where( + vd = tf.compat.v1.where( mask, x=tf.abs(tf.subtract(self.v, vp)), y=tf.ones_like(self.v) ) @@ -465,7 +465,7 @@ def accuracy(self, vp): corr = tf.cast(tf.equal(vd, 0), "float32") # 3) evaluate the accuracy - ac_score = tf.reduce_mean(tf.div(tf.reduce_sum(corr, axis=1), n_values)) + ac_score = tf.reduce_mean(input_tensor=tf.compat.v1.div(tf.reduce_sum(input_tensor=corr, axis=1), n_values)) return ac_score @@ -482,21 +482,21 @@ def rmse(self, vp): """ - with tf.name_scope("re"): + with tf.compat.v1.name_scope("re"): mask = tf.not_equal(self.v, 0) # selects only the rated items n_values = tf.reduce_sum( - tf.cast(mask, "float32"), axis=1 + input_tensor=tf.cast(mask, "float32"), axis=1 ) # number of rated items # evaluate the square difference between the inferred and the input data on the rated items - e = tf.where( - mask, x=tf.squared_difference(self.v, vp), y=tf.zeros_like(self.v) + e = tf.compat.v1.where( + mask, x=tf.math.squared_difference(self.v, vp), y=tf.zeros_like(self.v) ) # evaluate the msre err = tf.sqrt( - tf.reduce_mean(tf.div(tf.reduce_sum(e, axis=1), n_values)) / 2 + tf.reduce_mean(input_tensor=tf.compat.v1.div(tf.reduce_sum(input_tensor=e, axis=1), n_values)) / 2 ) return err @@ -505,7 +505,7 @@ def data_pipeline(self): """Define the data pipeline""" # placeholder for the batch_size - self.batch_size = tf.placeholder(tf.int64) + self.batch_size = tf.compat.v1.placeholder(tf.int64) # Create the data pipeline for faster training self.dataset = tf.data.Dataset.from_tensor_slices(self.vu) @@ -517,7 +517,7 @@ def data_pipeline(self): self.dataset = self.dataset.batch(batch_size=self.batch_size).repeat() # define iterator - self.iter = self.dataset.make_initializable_iterator() + self.iter = tf.compat.v1.data.make_initializable_iterator(self.dataset) self.v = self.iter.get_next() def init_metrics(self): @@ -605,7 +605,7 @@ def generate_graph(self): def init_gpu(self): """Config GPU memory""" - self.config_gpu = tf.ConfigProto( + self.config_gpu = tf.compat.v1.ConfigProto( log_device_placement=True, allow_soft_placement=True ) self.config_gpu.gpu_options.allow_growth = True # dynamic memory allocation @@ -617,10 +617,10 @@ def init_training_session(self, xtr): xtr (numpy.ndarray, int32): The user/affinity matrix for the train set. """ - init_graph = tf.global_variables_initializer() + init_graph = tf.compat.v1.global_variables_initializer() # Start TF training session on default graph - self.sess = tf.Session(config=self.config_gpu) + self.sess = tf.compat.v1.Session(config=self.config_gpu) self.sess.run(init_graph) self.sess.run( @@ -685,7 +685,7 @@ def fit(self, xtr, xtst): m, self.Nvisible = xtr.shape # m= # users, Nvisible= # items num_minibatches = int(m / self.minibatch) # number of minibatches - tf.reset_default_graph() + tf.compat.v1.reset_default_graph() # ----------------------Initializers------------------------------------- self.generate_graph() @@ -724,7 +724,7 @@ def eval_out(self): # sample v phi_h = ( - tf.transpose(tf.matmul(self.w, tf.transpose(h))) + self.bv + tf.transpose(a=tf.matmul(self.w, tf.transpose(a=h))) + self.bv ) # linear combination pvh = self.multinomial_distribution( phi_h diff --git a/recommenders/models/rlrmc/conjugate_gradient_ms.py b/recommenders/models/rlrmc/conjugate_gradient_ms.py index b7376fcb74..23d2cb4d7c 100644 --- a/recommenders/models/rlrmc/conjugate_gradient_ms.py +++ b/recommenders/models/rlrmc/conjugate_gradient_ms.py @@ -1,255 +1,255 @@ -# This code is modified from Pymanopt: Copyright (c) 2015-2016, Pymanopt Developers. All rights reserved. -# Online code of Pymanopt: https://github.com/pymanopt/pymanopt -# Pymanopt is licensed under the BSD 3-Clause "New" or "Revised" License -# Online license link: https://github.com/pymanopt/pymanopt/blob/master/LICENSE - -from __future__ import print_function, division - -import time -from copy import deepcopy - -import numpy as np - -from pymanopt.solvers.linesearch import LineSearchAdaptive -from pymanopt.solvers.solver import Solver -from pymanopt import tools - - -BetaTypes = tools.make_enum( - "BetaTypes", "FletcherReeves PolakRibiere HestenesStiefel HagerZhang".split() -) - - -class ConjugateGradientMS(Solver): - """ - Module containing conjugate gradient algorithm based on - conjugategradient.m from the manopt MATLAB package. - """ - - def __init__( - self, - beta_type=BetaTypes.HestenesStiefel, - orth_value=np.inf, - linesearch=None, - *args, - **kwargs - ): - """Instantiate gradient solver class. - - Args: - beta_type (object): Conjugate gradient beta rule used to construct the new search direction. - orth_value (float): Parameter for Powell's restart strategy. An infinite value disables this strategy. - See in code formula for the specific criterion used. - - linesearch (object): The linesearch method to used. - """ - super(ConjugateGradientMS, self).__init__(*args, **kwargs) - - self._beta_type = beta_type - self._orth_value = orth_value - - if linesearch is None: - self._linesearch = LineSearchAdaptive() - else: - self._linesearch = linesearch # LineSearchBackTracking() - self.linesearch = None - - def solve(self, problem, x=None, reuselinesearch=False, compute_stats=None): - """Perform optimization using nonlinear conjugate gradient method with - linesearch. - - This method first computes the gradient of obj w.r.t. arg, and then - optimizes by moving in a direction that is conjugate to all previous - search directions. - - Args: - problem (object): Pymanopt problem setup using the Problem class, this must - have a .manifold attribute specifying the manifold to optimize - over, as well as a cost and enough information to compute - the gradient of that cost. - x (numpy.ndarray): Optional parameter. Starting point on the manifold. If none - then a starting point will be randomly generated. - reuselinesearch (bool): Whether to reuse the previous linesearch object. Allows to - use information from a previous solve run. - - Returns: - numpy.ndarray: Local minimum of obj, or if algorithm terminated before convergence x will be the point at which it terminated. - """ - man = problem.manifold - verbosity = problem.verbosity - objective = problem.cost - gradient = problem.grad - - if not reuselinesearch or self.linesearch is None: - self.linesearch = deepcopy(self._linesearch) - linesearch = self.linesearch - - if verbosity >= 1: - print("Optimizing...") - if verbosity >= 2: - print(" iter\t\t cost val\t grad. norm") - - # Initialize iteration counter and timer - iter = 0 - stats = {} - # stats = {'iteration': [],'time': [],'objective': [],'trainRMSE': [],'testRMSE': []} - stepsize = np.nan - cumulative_time = 0.0 - - time0 = time.time() - t0 = time.time() - - # If no starting point is specified, generate one at random. - if x is None: - x = man.rand() - - # Calculate initial cost-related quantities - cost = objective(x) - grad = gradient(x) - gradnorm = man.norm(x, grad) - Pgrad = problem.precon(x, grad) - gradPgrad = man.inner(x, grad, Pgrad) - - # Initial descent direction is the negative gradient - desc_dir = -Pgrad - time_iter = time.time() - t0 - cumulative_time += time_iter - - self._start_optlog( - extraiterfields=["gradnorm"], - solverparams={ - "beta_type": self._beta_type, - "orth_value": self._orth_value, - "linesearcher": linesearch, - }, - ) - - while True: - if verbosity >= 2: - print("%5d\t%+.16e\t%.8e" % (iter, cost, gradnorm)) - if compute_stats is not None: - compute_stats(x, [iter, cost, gradnorm, cumulative_time], stats) - - if self._logverbosity >= 2: - self._append_optlog(iter, x, cost, gradnorm=gradnorm) - - t0 = time.time() - # stop_reason = self._check_stopping_criterion( - # time0, gradnorm=gradnorm, iter=iter + 1, stepsize=stepsize) - stop_reason = self._check_stopping_criterion( - time.time() - cumulative_time, - gradnorm=gradnorm, - iter=iter + 1, - stepsize=stepsize, - ) - - if stop_reason: - if verbosity >= 1: - print(stop_reason) - print("") - break - - # The line search algorithms require the directional derivative of - # the cost at the current point x along the search direction. - df0 = man.inner(x, grad, desc_dir) - - # If we didn't get a descent direction: restart, i.e., switch to - # the negative gradient. Equivalent to resetting the CG direction - # to a steepest descent step, which discards the past information. - if df0 >= 0: - # Or we switch to the negative gradient direction. - if verbosity >= 3: - print( - "Conjugate gradient info: got an ascent direction " - "(df0 = %.2f), reset to the (preconditioned) " - "steepest descent direction." % df0 - ) - # Reset to negative gradient: this discards the CG memory. - desc_dir = -Pgrad - df0 = -gradPgrad - - # Execute line search - stepsize, newx = linesearch.search(objective, man, x, desc_dir, cost, df0) - - # Compute the new cost-related quantities for newx - newcost = objective(newx) - newgrad = gradient(newx) - newgradnorm = man.norm(newx, newgrad) - Pnewgrad = problem.precon(newx, newgrad) - newgradPnewgrad = man.inner(newx, newgrad, Pnewgrad) - - # Apply the CG scheme to compute the next search direction - oldgrad = man.transp(x, newx, grad) - orth_grads = man.inner(newx, oldgrad, Pnewgrad) / newgradPnewgrad - - # Powell's restart strategy (see page 12 of Hager and Zhang's - # survey on conjugate gradient methods, for example) - if abs(orth_grads) >= self._orth_value: - beta = 0 - desc_dir = -Pnewgrad - else: - desc_dir = man.transp(x, newx, desc_dir) - - if self._beta_type == BetaTypes.FletcherReeves: - beta = newgradPnewgrad / gradPgrad - elif self._beta_type == BetaTypes.PolakRibiere: - diff = newgrad - oldgrad - ip_diff = man.inner(newx, Pnewgrad, diff) - beta = max(0, ip_diff / gradPgrad) - elif self._beta_type == BetaTypes.HestenesStiefel: - diff = newgrad - oldgrad - ip_diff = man.inner(newx, Pnewgrad, diff) - try: - beta = max(0, ip_diff / man.inner(newx, diff, desc_dir)) - # if ip_diff = man.inner(newx, diff, desc_dir) = 0 - except ZeroDivisionError: - beta = 1 - elif self._beta_type == BetaTypes.HagerZhang: - diff = newgrad - oldgrad - Poldgrad = man.transp(x, newx, Pgrad) - Pdiff = Pnewgrad - Poldgrad - deno = man.inner(newx, diff, desc_dir) - numo = man.inner(newx, diff, Pnewgrad) - numo -= ( - 2 - * man.inner(newx, diff, Pdiff) - * man.inner(newx, desc_dir, newgrad) - / deno - ) - beta = numo / deno - # Robustness (see Hager-Zhang paper mentioned above) - desc_dir_norm = man.norm(newx, desc_dir) - eta_HZ = -1 / (desc_dir_norm * min(0.01, gradnorm)) - beta = max(beta, eta_HZ) - else: - types = ", ".join(["BetaTypes.%s" % t for t in BetaTypes._fields]) - raise ValueError( - "Unknown beta_type %s. Should be one of %s." - % (self._beta_type, types) - ) - - desc_dir = -Pnewgrad + beta * desc_dir - - # Update the necessary variables for the next iteration. - x = newx - cost = newcost - grad = newgrad - Pgrad = Pnewgrad - gradnorm = newgradnorm - gradPgrad = newgradPnewgrad - iter += 1 - time_iter = time.time() - t0 - cumulative_time += time_iter - - if self._logverbosity <= 0: - return x, stats - else: - self._stop_optlog( - x, - cost, - stop_reason, - time0, - stepsize=stepsize, - gradnorm=gradnorm, - iter=iter, - ) - return x, stats, self._optlog +# This code is modified from Pymanopt: Copyright (c) 2015-2016, Pymanopt Developers. All rights reserved. +# Online code of Pymanopt: https://github.com/pymanopt/pymanopt +# Pymanopt is licensed under the BSD 3-Clause "New" or "Revised" License +# Online license link: https://github.com/pymanopt/pymanopt/blob/master/LICENSE + +from __future__ import print_function, division + +import time +from copy import deepcopy + +import numpy as np + +from pymanopt.solvers.linesearch import LineSearchAdaptive +from pymanopt.solvers.solver import Solver +from pymanopt import tools + + +BetaTypes = tools.make_enum( + "BetaTypes", "FletcherReeves PolakRibiere HestenesStiefel HagerZhang".split() +) + + +class ConjugateGradientMS(Solver): + """ + Module containing conjugate gradient algorithm based on + conjugategradient.m from the manopt MATLAB package. + """ + + def __init__( + self, + beta_type=BetaTypes.HestenesStiefel, + orth_value=np.inf, + linesearch=None, + *args, + **kwargs + ): + """Instantiate gradient solver class. + + Args: + beta_type (object): Conjugate gradient beta rule used to construct the new search direction. + orth_value (float): Parameter for Powell's restart strategy. An infinite value disables this strategy. + See in code formula for the specific criterion used. + - linesearch (object): The linesearch method to used. + """ + super(ConjugateGradientMS, self).__init__(*args, **kwargs) + + self._beta_type = beta_type + self._orth_value = orth_value + + if linesearch is None: + self._linesearch = LineSearchAdaptive() + else: + self._linesearch = linesearch # LineSearchBackTracking() + self.linesearch = None + + def solve(self, problem, x=None, reuselinesearch=False, compute_stats=None): + """Perform optimization using nonlinear conjugate gradient method with + linesearch. + + This method first computes the gradient of obj w.r.t. arg, and then + optimizes by moving in a direction that is conjugate to all previous + search directions. + + Args: + problem (object): Pymanopt problem setup using the Problem class, this must + have a .manifold attribute specifying the manifold to optimize + over, as well as a cost and enough information to compute + the gradient of that cost. + x (numpy.ndarray): Optional parameter. Starting point on the manifold. If none + then a starting point will be randomly generated. + reuselinesearch (bool): Whether to reuse the previous linesearch object. Allows to + use information from a previous solve run. + + Returns: + numpy.ndarray: Local minimum of obj, or if algorithm terminated before convergence x will be the point at which it terminated. + """ + man = problem.manifold + verbosity = problem.verbosity + objective = problem.cost + gradient = problem.grad + + if not reuselinesearch or self.linesearch is None: + self.linesearch = deepcopy(self._linesearch) + linesearch = self.linesearch + + if verbosity >= 1: + print("Optimizing...") + if verbosity >= 2: + print(" iter\t\t cost val\t grad. norm") + + # Initialize iteration counter and timer + iter = 0 + stats = {} + # stats = {'iteration': [],'time': [],'objective': [],'trainRMSE': [],'testRMSE': []} + stepsize = np.nan + cumulative_time = 0.0 + + time0 = time.time() + t0 = time.time() + + # If no starting point is specified, generate one at random. + if x is None: + x = man.rand() + + # Calculate initial cost-related quantities + cost = objective(x) + grad = gradient(x) + gradnorm = man.norm(x, grad) + Pgrad = problem.precon(x, grad) + gradPgrad = man.inner(x, grad, Pgrad) + + # Initial descent direction is the negative gradient + desc_dir = -Pgrad + time_iter = time.time() - t0 + cumulative_time += time_iter + + self._start_optlog( + extraiterfields=["gradnorm"], + solverparams={ + "beta_type": self._beta_type, + "orth_value": self._orth_value, + "linesearcher": linesearch, + }, + ) + + while True: + if verbosity >= 2: + print("%5d\t%+.16e\t%.8e" % (iter, cost, gradnorm)) + if compute_stats is not None: + compute_stats(x, [iter, cost, gradnorm, cumulative_time], stats) + + if self._logverbosity >= 2: + self._append_optlog(iter, x, cost, gradnorm=gradnorm) + + t0 = time.time() + # stop_reason = self._check_stopping_criterion( + # time0, gradnorm=gradnorm, iter=iter + 1, stepsize=stepsize) + stop_reason = self._check_stopping_criterion( + time.time() - cumulative_time, + gradnorm=gradnorm, + iter=iter + 1, + stepsize=stepsize, + ) + + if stop_reason: + if verbosity >= 1: + print(stop_reason) + print("") + break + + # The line search algorithms require the directional derivative of + # the cost at the current point x along the search direction. + df0 = man.inner(x, grad, desc_dir) + + # If we didn't get a descent direction: restart, i.e., switch to + # the negative gradient. Equivalent to resetting the CG direction + # to a steepest descent step, which discards the past information. + if df0 >= 0: + # Or we switch to the negative gradient direction. + if verbosity >= 3: + print( + "Conjugate gradient info: got an ascent direction " + "(df0 = %.2f), reset to the (preconditioned) " + "steepest descent direction." % df0 + ) + # Reset to negative gradient: this discards the CG memory. + desc_dir = -Pgrad + df0 = -gradPgrad + + # Execute line search + stepsize, newx = linesearch.search(objective, man, x, desc_dir, cost, df0) + + # Compute the new cost-related quantities for newx + newcost = objective(newx) + newgrad = gradient(newx) + newgradnorm = man.norm(newx, newgrad) + Pnewgrad = problem.precon(newx, newgrad) + newgradPnewgrad = man.inner(newx, newgrad, Pnewgrad) + + # Apply the CG scheme to compute the next search direction + oldgrad = man.transp(x, newx, grad) + orth_grads = man.inner(newx, oldgrad, Pnewgrad) / newgradPnewgrad + + # Powell's restart strategy (see page 12 of Hager and Zhang's + # survey on conjugate gradient methods, for example) + if abs(orth_grads) >= self._orth_value: + beta = 0 + desc_dir = -Pnewgrad + else: + desc_dir = man.transp(x, newx, desc_dir) + + if self._beta_type == BetaTypes.FletcherReeves: + beta = newgradPnewgrad / gradPgrad + elif self._beta_type == BetaTypes.PolakRibiere: + diff = newgrad - oldgrad + ip_diff = man.inner(newx, Pnewgrad, diff) + beta = max(0, ip_diff / gradPgrad) + elif self._beta_type == BetaTypes.HestenesStiefel: + diff = newgrad - oldgrad + ip_diff = man.inner(newx, Pnewgrad, diff) + try: + beta = max(0, ip_diff / man.inner(newx, diff, desc_dir)) + # if ip_diff = man.inner(newx, diff, desc_dir) = 0 + except ZeroDivisionError: + beta = 1 + elif self._beta_type == BetaTypes.HagerZhang: + diff = newgrad - oldgrad + Poldgrad = man.transp(x, newx, Pgrad) + Pdiff = Pnewgrad - Poldgrad + deno = man.inner(newx, diff, desc_dir) + numo = man.inner(newx, diff, Pnewgrad) + numo -= ( + 2 + * man.inner(newx, diff, Pdiff) + * man.inner(newx, desc_dir, newgrad) + / deno + ) + beta = numo / deno + # Robustness (see Hager-Zhang paper mentioned above) + desc_dir_norm = man.norm(newx, desc_dir) + eta_HZ = -1 / (desc_dir_norm * min(0.01, gradnorm)) + beta = max(beta, eta_HZ) + else: + types = ", ".join(["BetaTypes.%s" % t for t in BetaTypes._fields]) + raise ValueError( + "Unknown beta_type %s. Should be one of %s." + % (self._beta_type, types) + ) + + desc_dir = -Pnewgrad + beta * desc_dir + + # Update the necessary variables for the next iteration. + x = newx + cost = newcost + grad = newgrad + Pgrad = Pnewgrad + gradnorm = newgradnorm + gradPgrad = newgradPnewgrad + iter += 1 + time_iter = time.time() - t0 + cumulative_time += time_iter + + if self._logverbosity <= 0: + return x, stats + else: + self._stop_optlog( + x, + cost, + stop_reason, + time0, + stepsize=stepsize, + gradnorm=gradnorm, + iter=iter, + ) + return x, stats, self._optlog diff --git a/recommenders/models/vae/multinomial_vae.py b/recommenders/models/vae/multinomial_vae.py index 2aabe017e1..936f47f579 100644 --- a/recommenders/models/vae/multinomial_vae.py +++ b/recommenders/models/vae/multinomial_vae.py @@ -287,8 +287,8 @@ def _create_model(self): self.h = Dense( self.intermediate_dim, activation="tanh", - kernel_initializer=tf.keras.initializers.glorot_uniform(seed=self.seed), - bias_initializer=tf.keras.initializers.truncated_normal( + kernel_initializer=tf.compat.v1.keras.initializers.glorot_uniform(seed=self.seed), + bias_initializer=tf.compat.v1.keras.initializers.truncated_normal( stddev=0.001, seed=self.seed ), )(self.dropout_encoder) @@ -304,8 +304,8 @@ def _create_model(self): self.h_decoder = Dense( self.intermediate_dim, activation="tanh", - kernel_initializer=tf.keras.initializers.glorot_uniform(seed=self.seed), - bias_initializer=tf.keras.initializers.truncated_normal( + kernel_initializer=tf.compat.v1.keras.initializers.glorot_uniform(seed=self.seed), + bias_initializer=tf.compat.v1.keras.initializers.truncated_normal( stddev=0.001, seed=self.seed ), ) @@ -325,7 +325,7 @@ def _create_model(self): def _get_vae_loss(self, x, x_bar): """Calculate negative ELBO (NELBO).""" log_softmax_var = tf.nn.log_softmax(x_bar) - self.neg_ll = -tf.reduce_mean(tf.reduce_sum(log_softmax_var * x, axis=-1)) + self.neg_ll = -tf.reduce_mean(input_tensor=tf.reduce_sum(input_tensor=log_softmax_var * x, axis=-1)) a = tf.keras.backend.print_tensor(self.neg_ll) # calculate positive Kullback–Leibler divergence divergence term kl_loss = K.mean( diff --git a/recommenders/models/wide_deep/wide_deep_utils.py b/recommenders/models/wide_deep/wide_deep_utils.py index bc32cdb79e..9443deaa99 100644 --- a/recommenders/models/wide_deep/wide_deep_utils.py +++ b/recommenders/models/wide_deep/wide_deep_utils.py @@ -169,24 +169,24 @@ def build_model( ) if len(wide_columns) > 0 and len(deep_columns) == 0: - model = tf.estimator.LinearRegressor( + model = tf.compat.v1.estimator.LinearRegressor( model_dir=model_dir, config=config, feature_columns=wide_columns, - optimizer=linear_optimizer, + optimizer=linear_optimizer ) elif len(wide_columns) == 0 and len(deep_columns) > 0: - model = tf.estimator.DNNRegressor( + model = tf.compat.v1.estimator.DNNRegressor( model_dir=model_dir, config=config, feature_columns=deep_columns, hidden_units=dnn_hidden_units, optimizer=dnn_optimizer, dropout=dnn_dropout, - batch_norm=dnn_batch_norm, + batch_norm=dnn_batch_norm ) elif len(wide_columns) > 0 and len(deep_columns) > 0: - model = tf.estimator.DNNLinearCombinedRegressor( + model = tf.compat.v1.estimator.DNNLinearCombinedRegressor( model_dir=model_dir, config=config, # wide settings @@ -197,7 +197,7 @@ def build_model( dnn_hidden_units=dnn_hidden_units, dnn_optimizer=dnn_optimizer, dnn_dropout=dnn_dropout, - batch_norm=dnn_batch_norm, + batch_norm=dnn_batch_norm ) else: raise ValueError( diff --git a/recommenders/tuning/nni/nni_utils.py b/recommenders/tuning/nni/nni_utils.py index 474c1f7a26..bf8de9b5d2 100644 --- a/recommenders/tuning/nni/nni_utils.py +++ b/recommenders/tuning/nni/nni_utils.py @@ -154,4 +154,3 @@ def start_nni(config_path, wait=WAITING_TIME, max_retries=MAX_RETRIES): raise RuntimeError("'nnictl create' failed with code %d" % proc.returncode) check_experiment_status(wait=wait, max_retries=max_retries) - \ No newline at end of file diff --git a/recommenders/utils/k8s_utils.py b/recommenders/utils/k8s_utils.py index 3810d7bdcb..5f6b3791c9 100644 --- a/recommenders/utils/k8s_utils.py +++ b/recommenders/utils/k8s_utils.py @@ -1,81 +1,81 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -from math import ceil, floor -import logging - -logger = logging.getLogger(__name__) - - -def qps_to_replicas( - target_qps, processing_time, max_qp_replica=1, target_utilization=0.7 -): - """Provide a rough estimate of the number of replicas to support a given - load (queries per second) - - Args: - target_qps (int): target queries per second that you want to support - processing_time (float): the estimated amount of time (in seconds) - your service call takes - max_qp_replica (int): maximum number of concurrent queries per replica - target_utilization (float): proportion of CPU utilization you think is ideal - - Returns: - int: Number of estimated replicas required to support a target number of queries per second. - """ - concurrent_queries = target_qps * processing_time / target_utilization - replicas = ceil(concurrent_queries / max_qp_replica) - logger.info( - "Approximately {} replicas are estimated to support {} queries per second.".format( - replicas, target_qps - ) - ) - return replicas - - -def replicas_to_qps( - num_replicas, processing_time, max_qp_replica=1, target_utilization=0.7 -): - """Provide a rough estimate of the queries per second supported by a number of replicas - - Args: - num_replicas (int): number of replicas - processing_time (float): the estimated amount of time (in seconds) your service call takes - max_qp_replica (int): maximum number of concurrent queries per replica - target_utilization (float): proportion of CPU utilization you think is ideal - - Returns: - int: queries per second supported by the number of replicas - """ - qps = floor(num_replicas * max_qp_replica * target_utilization / processing_time) - logger.info( - "Approximately {} queries per second are supported by {} replicas.".format( - qps, num_replicas - ) - ) - return qps - - -def nodes_to_replicas(n_cores_per_node, n_nodes=3, cpu_cores_per_replica=0.1): - """Provide a rough estimate of the number of replicas supported by a - given number of nodes with n_cores_per_node cores each - - Args: - n_cores_per_node (int): Total number of cores per node within an AKS - cluster that you want to use - n_nodes (int): Number of nodes (i.e. VMs) used in the AKS cluster - cpu_cores_per_replica (float): Cores assigned to each replica. This - can be fractional and corresponds to the - cpu_cores argument passed to AksWebservice.deploy_configuration() - - Returns: - int: Total number of replicas supported by the configuration - """ - n_cores_avail = (n_cores_per_node - 0.5) * n_nodes - 4.45 - replicas = floor(n_cores_avail / cpu_cores_per_replica) - logger.info( - "Approximately {} replicas are supported by {} nodes with {} cores each.".format( - replicas, n_nodes, n_cores_per_node - ) - ) - return replicas +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +from math import ceil, floor +import logging + +logger = logging.getLogger(__name__) + + +def qps_to_replicas( + target_qps, processing_time, max_qp_replica=1, target_utilization=0.7 +): + """Provide a rough estimate of the number of replicas to support a given + load (queries per second) + + Args: + target_qps (int): target queries per second that you want to support + processing_time (float): the estimated amount of time (in seconds) + your service call takes + max_qp_replica (int): maximum number of concurrent queries per replica + target_utilization (float): proportion of CPU utilization you think is ideal + + Returns: + int: Number of estimated replicas required to support a target number of queries per second. + """ + concurrent_queries = target_qps * processing_time / target_utilization + replicas = ceil(concurrent_queries / max_qp_replica) + logger.info( + "Approximately {} replicas are estimated to support {} queries per second.".format( + replicas, target_qps + ) + ) + return replicas + + +def replicas_to_qps( + num_replicas, processing_time, max_qp_replica=1, target_utilization=0.7 +): + """Provide a rough estimate of the queries per second supported by a number of replicas + + Args: + num_replicas (int): number of replicas + processing_time (float): the estimated amount of time (in seconds) your service call takes + max_qp_replica (int): maximum number of concurrent queries per replica + target_utilization (float): proportion of CPU utilization you think is ideal + + Returns: + int: queries per second supported by the number of replicas + """ + qps = floor(num_replicas * max_qp_replica * target_utilization / processing_time) + logger.info( + "Approximately {} queries per second are supported by {} replicas.".format( + qps, num_replicas + ) + ) + return qps + + +def nodes_to_replicas(n_cores_per_node, n_nodes=3, cpu_cores_per_replica=0.1): + """Provide a rough estimate of the number of replicas supported by a + given number of nodes with n_cores_per_node cores each + + Args: + n_cores_per_node (int): Total number of cores per node within an AKS + cluster that you want to use + n_nodes (int): Number of nodes (i.e. VMs) used in the AKS cluster + cpu_cores_per_replica (float): Cores assigned to each replica. This + can be fractional and corresponds to the + cpu_cores argument passed to AksWebservice.deploy_configuration() + + Returns: + int: Total number of replicas supported by the configuration + """ + n_cores_avail = (n_cores_per_node - 0.5) * n_nodes - 4.45 + replicas = floor(n_cores_avail / cpu_cores_per_replica) + logger.info( + "Approximately {} replicas are supported by {} nodes with {} cores each.".format( + replicas, n_nodes, n_cores_per_node + ) + ) + return replicas diff --git a/recommenders/utils/tf_utils.py b/recommenders/utils/tf_utils.py index 156cfb1853..c744e8fb46 100644 --- a/recommenders/utils/tf_utils.py +++ b/recommenders/utils/tf_utils.py @@ -10,13 +10,13 @@ OPTIMIZERS = dict( - adadelta=tf.train.AdadeltaOptimizer, - adagrad=tf.train.AdagradOptimizer, - adam=tf.train.AdamOptimizer, - ftrl=tf.train.FtrlOptimizer, - momentum=tf.train.MomentumOptimizer, - rmsprop=tf.train.RMSPropOptimizer, - sgd=tf.train.GradientDescentOptimizer, + adadelta=tf.compat.v1.train.AdadeltaOptimizer, + adagrad=tf.compat.v1.train.AdagradOptimizer, + adam=tf.compat.v1.train.AdamOptimizer, + ftrl=tf.compat.v1.train.FtrlOptimizer, + momentum=tf.compat.v1.train.MomentumOptimizer, + rmsprop=tf.compat.v1.train.RMSPropOptimizer, + sgd=tf.compat.v1.train.GradientDescentOptimizer, ) @@ -165,7 +165,7 @@ def export_model(model, train_input_fn, eval_input_fn, tf_feat_cols, base_dir): Returns: str: Exported model path """ - tf.logging.set_verbosity(tf.logging.ERROR) + tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR) train_rcvr_fn = ( tf.contrib.estimator.build_supervised_input_receiver_fn_from_input_fn( train_input_fn @@ -244,7 +244,7 @@ def evaluation_log_hook( ) -class _TrainLogHook(tf.train.SessionRunHook): +class _TrainLogHook(tf.estimator.SessionRunHook): def __init__( self, estimator, @@ -276,15 +276,15 @@ def __init__( def begin(self): if self.model_dir is not None: - self.summary_writer = tf.summary.FileWriterCache.get(self.model_dir) - self.global_step_tensor = tf.train.get_or_create_global_step() + self.summary_writer = tf.compat.v1.summary.FileWriterCache.get(self.model_dir) + self.global_step_tensor = tf.compat.v1.train.get_or_create_global_step() else: self.step = 0 def before_run(self, run_context): if self.global_step_tensor is not None: requests = {"global_step": self.global_step_tensor} - return tf.train.SessionRunArgs(requests) + return tf.estimator.SessionRunArgs(requests) else: return None @@ -295,8 +295,8 @@ def after_run(self, run_context, run_values): self.step += 1 if self.step % self.every_n_iter == 0: - _prev_log_level = tf.logging.get_verbosity() - tf.logging.set_verbosity(tf.logging.ERROR) + _prev_log_level = tf.compat.v1.logging.get_verbosity() + tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR) if self.eval_fns is None: result = self.model.evaluate( @@ -322,7 +322,7 @@ def after_run(self, run_context, run_values): result = fn(self.true_df, prediction_df, **self.eval_kwargs) self._log(fn.__name__, result) - tf.logging.set_verbosity(_prev_log_level) + tf.compat.v1.logging.set_verbosity(_prev_log_level) def end(self, session): if self.summary_writer is not None: @@ -331,7 +331,7 @@ def end(self, session): def _log(self, tag, value): self.logger.log(tag, value) if self.summary_writer is not None: - summary = tf.Summary(value=[tf.Summary.Value(tag=tag, simple_value=value)]) + summary = tf.compat.v1.Summary(value=[tf.compat.v1.Summary.Value(tag=tag, simple_value=value)]) self.summary_writer.add_summary(summary, self.step) diff --git a/setup.py b/setup.py index e9ed873fad..7e406eed92 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ version += ".post" + str(int(time.time())) install_requires = [ - "numpy>=1.19", # 1.19 required by tensorflow + "numpy>=1.19", "pandas>1.0.3,<2", "scipy>=1.0.0,<2", "tqdm>=4.31.1,<5", @@ -66,8 +66,8 @@ ], "gpu": [ "nvidia-ml-py3>=7.352.0", - "tensorflow>=2.6", # compiled with CUDA 11.2, cudnn 8.1 - "torch>=1.8", # for CUDA 11 support + "tensorflow-gpu>=1.15.0,<2", # compiled with CUDA 10.0 + "torch==1.2.0", # last os-common version with CUDA 10.0 support "fastai>=1.0.46,<2", ], "spark": [ diff --git a/tests/integration/recommenders/datasets/test_movielens.py b/tests/integration/recommenders/datasets/test_movielens.py index 6428e34264..1891d6b2f1 100644 --- a/tests/integration/recommenders/datasets/test_movielens.py +++ b/tests/integration/recommenders/datasets/test_movielens.py @@ -1,289 +1,289 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import os -import pytest -from recommenders.datasets.movielens import ( - load_pandas_df, - load_spark_df, - load_item_df, - download_movielens, - extract_movielens, -) - -try: - from pyspark.sql.types import ( - StructType, - StructField, - IntegerType, - StringType, - FloatType, - DoubleType, - ) - from pyspark.sql.functions import col -except ImportError: - pass # skip this import if we are in pure python environment - - -@pytest.mark.integration -@pytest.mark.parametrize( - "size, num_samples, num_movies, movie_example, title_example, genres_example, year_example", - [ - ( - "1m", - 1000209, - 3883, - 1, - "Toy Story (1995)", - "Animation|Children's|Comedy", - "1995", - ), - ( - "10m", - 10000054, - 10681, - 1, - "Toy Story (1995)", - "Adventure|Animation|Children|Comedy|Fantasy", - "1995", - ), - ( - "20m", - 20000263, - 27278, - 1, - "Toy Story (1995)", - "Adventure|Animation|Children|Comedy|Fantasy", - "1995", - ), - ], -) -def test_load_pandas_df( - size, - num_samples, - num_movies, - movie_example, - title_example, - genres_example, - year_example, - tmp, -): - """Test MovieLens dataset load as pd.DataFrame""" - # Test if correct data are loaded - header = ["a", "b", "c"] - df = load_pandas_df(size=size, local_cache_path=tmp, header=header) - assert len(df) == num_samples - assert len(df.columns) == len(header) - # Test if raw-zip file, rating file, and item file are cached - assert len(os.listdir(tmp)) == 3 - - # Test title, genres, and released year load - header = ["a", "b", "c", "d", "e"] - with pytest.warns(Warning): - df = load_pandas_df( - size=size, - header=header, - local_cache_path=tmp, - title_col="Title", - genres_col="Genres", - year_col="Year", - ) - assert len(df) == num_samples - assert ( - len(df.columns) == 7 - ) # 4 header columns (user, item, rating, timestamp) and 3 feature columns - assert "e" not in df.columns # only the first 4 header columns are used - # Get two records of the same items and check if the item-features are the same. - head = df.loc[df["b"] == movie_example][:2] - title = head["Title"].values - assert title[0] == title[1] - assert title[0] == title_example - genres = head["Genres"].values - assert genres[0] == genres[1] - assert genres[0] == genres_example - year = head["Year"].values - assert year[0] == year[1] - assert year[0] == year_example - - # Test default arguments - df = load_pandas_df(size) - assert len(df) == num_samples - # user, item, rating and timestamp - assert len(df.columns) == 4 - - -@pytest.mark.integration -@pytest.mark.parametrize( - "size, num_movies, movie_example, title_example, genres_example, year_example", - [ - ("1m", 3883, 1, "Toy Story (1995)", "Animation|Children's|Comedy", "1995"), - ( - "10m", - 10681, - 1, - "Toy Story (1995)", - "Adventure|Animation|Children|Comedy|Fantasy", - "1995", - ), - ( - "20m", - 27278, - 1, - "Toy Story (1995)", - "Adventure|Animation|Children|Comedy|Fantasy", - "1995", - ), - ], -) -def test_load_item_df( - size, - num_movies, - movie_example, - title_example, - genres_example, - year_example, - tmp, -): - """Test movielens item data load (not rating data)""" - df = load_item_df(size, local_cache_path=tmp, title_col="title") - assert len(df) == num_movies - # movie_col and title_col should be loaded - assert len(df.columns) == 2 - assert df["title"][0] == title_example - - # Test title and genres - df = load_item_df( - size, - local_cache_path=tmp, - movie_col="item", - genres_col="genres", - year_col="year", - ) - assert len(df) == num_movies - # movile_col, genres_col and year_col - assert len(df.columns) == 3 - - assert df["item"][0] == movie_example - assert df["genres"][0] == genres_example - assert df["year"][0] == year_example - - -@pytest.mark.integration -@pytest.mark.spark -@pytest.mark.parametrize( - "size, num_samples, num_movies, movie_example, title_example, genres_example, year_example", - [ - ( - "1m", - 1000209, - 3883, - 1, - "Toy Story (1995)", - "Animation|Children's|Comedy", - "1995", - ), - ( - "10m", - 10000054, - 10681, - 1, - "Toy Story (1995)", - "Adventure|Animation|Children|Comedy|Fantasy", - "1995", - ), - ( - "20m", - 20000263, - 27278, - 1, - "Toy Story (1995)", - "Adventure|Animation|Children|Comedy|Fantasy", - "1995", - ), - ], -) -def test_load_spark_df( - size, - num_samples, - num_movies, - movie_example, - title_example, - genres_example, - year_example, - tmp, - spark, -): - """Test MovieLens dataset load into pySpark.DataFrame""" - - # Test if correct data are loaded - header = ["1", "2", "3"] - schema = StructType( - [ - StructField("u", IntegerType()), - StructField("m", IntegerType()), - ] - ) - with pytest.warns(Warning): - df = load_spark_df( - spark, size=size, local_cache_path=tmp, header=header, schema=schema - ) - assert df.count() == num_samples - # Test if schema is used when both schema and header are provided - assert len(df.columns) == len(schema) - # Test if raw-zip file, rating file, and item file are cached - assert len(os.listdir(tmp)) == 3 - - # Test title, genres, and released year load - header = ["a", "b", "c", "d", "e"] - with pytest.warns(Warning): - df = load_spark_df( - spark, - size=size, - local_cache_path=tmp, - header=header, - title_col="Title", - genres_col="Genres", - year_col="Year", - ) - assert df.count() == num_samples - assert ( - len(df.columns) == 7 - ) # 4 header columns (user, item, rating, timestamp) and 3 feature columns - assert "e" not in df.columns # only the first 4 header columns are used - # Get two records of the same items and check if the item-features are the same. - head = df.filter(col("b") == movie_example).limit(2) - title = head.select("Title").collect() - assert title[0][0] == title[1][0] - assert title[0][0] == title_example - genres = head.select("Genres").collect() - assert genres[0][0] == genres[1][0] - assert genres[0][0] == genres_example - year = head.select("Year").collect() - assert year[0][0] == year[1][0] - assert year[0][0] == year_example - - # Test default arguments - df = load_spark_df(spark, size) - assert df.count() == num_samples - # user, item, rating and timestamp - assert len(df.columns) == 4 - - -@pytest.mark.integration -@pytest.mark.parametrize("size", ["1m", "10m", "20m"]) -def test_download_and_extract_movielens(size, tmp): - """Test movielens data download and extract""" - zip_path = os.path.join(tmp, "ml.zip") - download_movielens(size, dest_path=zip_path) - assert len(os.listdir(tmp)) == 1 - assert os.path.exists(zip_path) - - rating_path = os.path.join(tmp, "rating.dat") - item_path = os.path.join(tmp, "item.dat") - extract_movielens( - size, rating_path=rating_path, item_path=item_path, zip_path=zip_path - ) - # Test if raw-zip file, rating file, and item file are cached - assert len(os.listdir(tmp)) == 3 - assert os.path.exists(rating_path) - assert os.path.exists(item_path) +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import os +import pytest +from recommenders.datasets.movielens import ( + load_pandas_df, + load_spark_df, + load_item_df, + download_movielens, + extract_movielens, +) + +try: + from pyspark.sql.types import ( + StructType, + StructField, + IntegerType, + StringType, + FloatType, + DoubleType, + ) + from pyspark.sql.functions import col +except ImportError: + pass # skip this import if we are in pure python environment + + +@pytest.mark.integration +@pytest.mark.parametrize( + "size, num_samples, num_movies, movie_example, title_example, genres_example, year_example", + [ + ( + "1m", + 1000209, + 3883, + 1, + "Toy Story (1995)", + "Animation|Children's|Comedy", + "1995", + ), + ( + "10m", + 10000054, + 10681, + 1, + "Toy Story (1995)", + "Adventure|Animation|Children|Comedy|Fantasy", + "1995", + ), + ( + "20m", + 20000263, + 27278, + 1, + "Toy Story (1995)", + "Adventure|Animation|Children|Comedy|Fantasy", + "1995", + ), + ], +) +def test_load_pandas_df( + size, + num_samples, + num_movies, + movie_example, + title_example, + genres_example, + year_example, + tmp, +): + """Test MovieLens dataset load as pd.DataFrame""" + # Test if correct data are loaded + header = ["a", "b", "c"] + df = load_pandas_df(size=size, local_cache_path=tmp, header=header) + assert len(df) == num_samples + assert len(df.columns) == len(header) + # Test if raw-zip file, rating file, and item file are cached + assert len(os.listdir(tmp)) == 3 + + # Test title, genres, and released year load + header = ["a", "b", "c", "d", "e"] + with pytest.warns(Warning): + df = load_pandas_df( + size=size, + header=header, + local_cache_path=tmp, + title_col="Title", + genres_col="Genres", + year_col="Year", + ) + assert len(df) == num_samples + assert ( + len(df.columns) == 7 + ) # 4 header columns (user, item, rating, timestamp) and 3 feature columns + assert "e" not in df.columns # only the first 4 header columns are used + # Get two records of the same items and check if the item-features are the same. + head = df.loc[df["b"] == movie_example][:2] + title = head["Title"].values + assert title[0] == title[1] + assert title[0] == title_example + genres = head["Genres"].values + assert genres[0] == genres[1] + assert genres[0] == genres_example + year = head["Year"].values + assert year[0] == year[1] + assert year[0] == year_example + + # Test default arguments + df = load_pandas_df(size) + assert len(df) == num_samples + # user, item, rating and timestamp + assert len(df.columns) == 4 + + +@pytest.mark.integration +@pytest.mark.parametrize( + "size, num_movies, movie_example, title_example, genres_example, year_example", + [ + ("1m", 3883, 1, "Toy Story (1995)", "Animation|Children's|Comedy", "1995"), + ( + "10m", + 10681, + 1, + "Toy Story (1995)", + "Adventure|Animation|Children|Comedy|Fantasy", + "1995", + ), + ( + "20m", + 27278, + 1, + "Toy Story (1995)", + "Adventure|Animation|Children|Comedy|Fantasy", + "1995", + ), + ], +) +def test_load_item_df( + size, + num_movies, + movie_example, + title_example, + genres_example, + year_example, + tmp, +): + """Test movielens item data load (not rating data)""" + df = load_item_df(size, local_cache_path=tmp, title_col="title") + assert len(df) == num_movies + # movie_col and title_col should be loaded + assert len(df.columns) == 2 + assert df["title"][0] == title_example + + # Test title and genres + df = load_item_df( + size, + local_cache_path=tmp, + movie_col="item", + genres_col="genres", + year_col="year", + ) + assert len(df) == num_movies + # movile_col, genres_col and year_col + assert len(df.columns) == 3 + + assert df["item"][0] == movie_example + assert df["genres"][0] == genres_example + assert df["year"][0] == year_example + + +@pytest.mark.integration +@pytest.mark.spark +@pytest.mark.parametrize( + "size, num_samples, num_movies, movie_example, title_example, genres_example, year_example", + [ + ( + "1m", + 1000209, + 3883, + 1, + "Toy Story (1995)", + "Animation|Children's|Comedy", + "1995", + ), + ( + "10m", + 10000054, + 10681, + 1, + "Toy Story (1995)", + "Adventure|Animation|Children|Comedy|Fantasy", + "1995", + ), + ( + "20m", + 20000263, + 27278, + 1, + "Toy Story (1995)", + "Adventure|Animation|Children|Comedy|Fantasy", + "1995", + ), + ], +) +def test_load_spark_df( + size, + num_samples, + num_movies, + movie_example, + title_example, + genres_example, + year_example, + tmp, + spark, +): + """Test MovieLens dataset load into pySpark.DataFrame""" + + # Test if correct data are loaded + header = ["1", "2", "3"] + schema = StructType( + [ + StructField("u", IntegerType()), + StructField("m", IntegerType()), + ] + ) + with pytest.warns(Warning): + df = load_spark_df( + spark, size=size, local_cache_path=tmp, header=header, schema=schema + ) + assert df.count() == num_samples + # Test if schema is used when both schema and header are provided + assert len(df.columns) == len(schema) + # Test if raw-zip file, rating file, and item file are cached + assert len(os.listdir(tmp)) == 3 + + # Test title, genres, and released year load + header = ["a", "b", "c", "d", "e"] + with pytest.warns(Warning): + df = load_spark_df( + spark, + size=size, + local_cache_path=tmp, + header=header, + title_col="Title", + genres_col="Genres", + year_col="Year", + ) + assert df.count() == num_samples + assert ( + len(df.columns) == 7 + ) # 4 header columns (user, item, rating, timestamp) and 3 feature columns + assert "e" not in df.columns # only the first 4 header columns are used + # Get two records of the same items and check if the item-features are the same. + head = df.filter(col("b") == movie_example).limit(2) + title = head.select("Title").collect() + assert title[0][0] == title[1][0] + assert title[0][0] == title_example + genres = head.select("Genres").collect() + assert genres[0][0] == genres[1][0] + assert genres[0][0] == genres_example + year = head.select("Year").collect() + assert year[0][0] == year[1][0] + assert year[0][0] == year_example + + # Test default arguments + df = load_spark_df(spark, size) + assert df.count() == num_samples + # user, item, rating and timestamp + assert len(df.columns) == 4 + + +@pytest.mark.integration +@pytest.mark.parametrize("size", ["1m", "10m", "20m"]) +def test_download_and_extract_movielens(size, tmp): + """Test movielens data download and extract""" + zip_path = os.path.join(tmp, "ml.zip") + download_movielens(size, dest_path=zip_path) + assert len(os.listdir(tmp)) == 1 + assert os.path.exists(zip_path) + + rating_path = os.path.join(tmp, "rating.dat") + item_path = os.path.join(tmp, "item.dat") + extract_movielens( + size, rating_path=rating_path, item_path=item_path, zip_path=zip_path + ) + # Test if raw-zip file, rating file, and item file are cached + assert len(os.listdir(tmp)) == 3 + assert os.path.exists(rating_path) + assert os.path.exists(item_path) diff --git a/tests/smoke/recommenders/dataset/test_movielens.py b/tests/smoke/recommenders/dataset/test_movielens.py index fdab5beebd..58605bc558 100644 --- a/tests/smoke/recommenders/dataset/test_movielens.py +++ b/tests/smoke/recommenders/dataset/test_movielens.py @@ -1,235 +1,235 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import os -import pytest -from recommenders.datasets.movielens import ( - load_pandas_df, - load_spark_df, - load_item_df, - download_movielens, - extract_movielens, -) - -try: - from pyspark.sql.types import ( - StructType, - StructField, - IntegerType, - StringType, - FloatType, - DoubleType, - ) - from pyspark.sql.functions import col -except ImportError: - pass # skip this import if we are in pure python environment - - -@pytest.mark.smoke -@pytest.mark.parametrize( - "size, num_samples, num_movies, movie_example, title_example, genres_example, year_example", - [ - ( - "100k", - 100000, - 1682, - 1, - "Toy Story (1995)", - "Animation|Children's|Comedy", - "1995", - ) - ], -) -def test_load_pandas_df( - size, - num_samples, - num_movies, - movie_example, - title_example, - genres_example, - year_example, - tmp, -): - """Test MovieLens dataset load as pd.DataFrame""" - # Test if correct data are loaded - header = ["a", "b", "c"] - df = load_pandas_df(size=size, local_cache_path=tmp, header=header) - assert len(df) == num_samples - assert len(df.columns) == len(header) - # Test if raw-zip file, rating file, and item file are cached - assert len(os.listdir(tmp)) == 3 - - # Test title, genres, and released year load - header = ["a", "b", "c", "d", "e"] - with pytest.warns(Warning): - df = load_pandas_df( - size=size, - header=header, - local_cache_path=tmp, - title_col="Title", - genres_col="Genres", - year_col="Year", - ) - assert len(df) == num_samples - assert ( - len(df.columns) == 7 - ) # 4 header columns (user, item, rating, timestamp) and 3 feature columns - assert "e" not in df.columns # only the first 4 header columns are used - # Get two records of the same items and check if the item-features are the same. - head = df.loc[df["b"] == movie_example][:2] - title = head["Title"].values - assert title[0] == title[1] - assert title[0] == title_example - genres = head["Genres"].values - assert genres[0] == genres[1] - assert genres[0] == genres_example - year = head["Year"].values - assert year[0] == year[1] - assert year[0] == year_example - - # Test default arguments - df = load_pandas_df(size) - assert len(df) == num_samples - # user, item, rating and timestamp - assert len(df.columns) == 4 - - -@pytest.mark.smoke -@pytest.mark.parametrize( - "size, num_movies, movie_example, title_example, genres_example, year_example", - [("100k", 1682, 1, "Toy Story (1995)", "Animation|Children's|Comedy", "1995")], -) -def test_load_item_df( - size, - num_movies, - movie_example, - title_example, - genres_example, - year_example, - tmp, -): - """Test movielens item data load (not rating data)""" - df = load_item_df(size, local_cache_path=tmp, title_col="title") - assert len(df) == num_movies - # movie_col and title_col should be loaded - assert len(df.columns) == 2 - assert df["title"][0] == title_example - - # Test title and genres - df = load_item_df( - size, - local_cache_path=tmp, - movie_col="item", - genres_col="genres", - year_col="year", - ) - assert len(df) == num_movies - # movile_col, genres_col and year_col - assert len(df.columns) == 3 - - assert df["item"][0] == movie_example - assert df["genres"][0] == genres_example - assert df["year"][0] == year_example - - -@pytest.mark.smoke -@pytest.mark.spark -@pytest.mark.parametrize( - "size, num_samples, num_movies, movie_example, title_example, genres_example, year_example", - [ - ( - "100k", - 100000, - 1682, - 1, - "Toy Story (1995)", - "Animation|Children's|Comedy", - "1995", - ) - ], -) -def test_load_spark_df( - size, - num_samples, - num_movies, - movie_example, - title_example, - genres_example, - year_example, - tmp, - spark, -): - """Test MovieLens dataset load into pySpark.DataFrame""" - - # Test if correct data are loaded - header = ["1", "2", "3"] - schema = StructType( - [ - StructField("u", IntegerType()), - StructField("m", IntegerType()), - ] - ) - with pytest.warns(Warning): - df = load_spark_df( - spark, size=size, local_cache_path=tmp, header=header, schema=schema - ) - assert df.count() == num_samples - # Test if schema is used when both schema and header are provided - assert len(df.columns) == len(schema) - # Test if raw-zip file, rating file, and item file are cached - assert len(os.listdir(tmp)) == 3 - - # Test title, genres, and released year load - header = ["a", "b", "c", "d", "e"] - with pytest.warns(Warning): - df = load_spark_df( - spark, - size=size, - local_cache_path=tmp, - header=header, - title_col="Title", - genres_col="Genres", - year_col="Year", - ) - assert df.count() == num_samples - assert ( - len(df.columns) == 7 - ) # 4 header columns (user, item, rating, timestamp) and 3 feature columns - assert "e" not in df.columns # only the first 4 header columns are used - # Get two records of the same items and check if the item-features are the same. - head = df.filter(col("b") == movie_example).limit(2) - title = head.select("Title").collect() - assert title[0][0] == title[1][0] - assert title[0][0] == title_example - genres = head.select("Genres").collect() - assert genres[0][0] == genres[1][0] - assert genres[0][0] == genres_example - year = head.select("Year").collect() - assert year[0][0] == year[1][0] - assert year[0][0] == year_example - - # Test default arguments - df = load_spark_df(spark, size) - assert df.count() == num_samples - # user, item, rating and timestamp - assert len(df.columns) == 4 - - -@pytest.mark.smoke -@pytest.mark.parametrize("size", ["100k"]) -def test_download_and_extract_movielens(size, tmp): - """Test movielens data download and extract""" - zip_path = os.path.join(tmp, "ml.zip") - download_movielens(size, dest_path=zip_path) - assert len(os.listdir(tmp)) == 1 - assert os.path.exists(zip_path) - - rating_path = os.path.join(tmp, "rating.dat") - item_path = os.path.join(tmp, "item.dat") - extract_movielens( - size, rating_path=rating_path, item_path=item_path, zip_path=zip_path - ) - # Test if raw-zip file, rating file, and item file are cached - assert len(os.listdir(tmp)) == 3 - assert os.path.exists(rating_path) - assert os.path.exists(item_path) +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import os +import pytest +from recommenders.datasets.movielens import ( + load_pandas_df, + load_spark_df, + load_item_df, + download_movielens, + extract_movielens, +) + +try: + from pyspark.sql.types import ( + StructType, + StructField, + IntegerType, + StringType, + FloatType, + DoubleType, + ) + from pyspark.sql.functions import col +except ImportError: + pass # skip this import if we are in pure python environment + + +@pytest.mark.smoke +@pytest.mark.parametrize( + "size, num_samples, num_movies, movie_example, title_example, genres_example, year_example", + [ + ( + "100k", + 100000, + 1682, + 1, + "Toy Story (1995)", + "Animation|Children's|Comedy", + "1995", + ) + ], +) +def test_load_pandas_df( + size, + num_samples, + num_movies, + movie_example, + title_example, + genres_example, + year_example, + tmp, +): + """Test MovieLens dataset load as pd.DataFrame""" + # Test if correct data are loaded + header = ["a", "b", "c"] + df = load_pandas_df(size=size, local_cache_path=tmp, header=header) + assert len(df) == num_samples + assert len(df.columns) == len(header) + # Test if raw-zip file, rating file, and item file are cached + assert len(os.listdir(tmp)) == 3 + + # Test title, genres, and released year load + header = ["a", "b", "c", "d", "e"] + with pytest.warns(Warning): + df = load_pandas_df( + size=size, + header=header, + local_cache_path=tmp, + title_col="Title", + genres_col="Genres", + year_col="Year", + ) + assert len(df) == num_samples + assert ( + len(df.columns) == 7 + ) # 4 header columns (user, item, rating, timestamp) and 3 feature columns + assert "e" not in df.columns # only the first 4 header columns are used + # Get two records of the same items and check if the item-features are the same. + head = df.loc[df["b"] == movie_example][:2] + title = head["Title"].values + assert title[0] == title[1] + assert title[0] == title_example + genres = head["Genres"].values + assert genres[0] == genres[1] + assert genres[0] == genres_example + year = head["Year"].values + assert year[0] == year[1] + assert year[0] == year_example + + # Test default arguments + df = load_pandas_df(size) + assert len(df) == num_samples + # user, item, rating and timestamp + assert len(df.columns) == 4 + + +@pytest.mark.smoke +@pytest.mark.parametrize( + "size, num_movies, movie_example, title_example, genres_example, year_example", + [("100k", 1682, 1, "Toy Story (1995)", "Animation|Children's|Comedy", "1995")], +) +def test_load_item_df( + size, + num_movies, + movie_example, + title_example, + genres_example, + year_example, + tmp, +): + """Test movielens item data load (not rating data)""" + df = load_item_df(size, local_cache_path=tmp, title_col="title") + assert len(df) == num_movies + # movie_col and title_col should be loaded + assert len(df.columns) == 2 + assert df["title"][0] == title_example + + # Test title and genres + df = load_item_df( + size, + local_cache_path=tmp, + movie_col="item", + genres_col="genres", + year_col="year", + ) + assert len(df) == num_movies + # movile_col, genres_col and year_col + assert len(df.columns) == 3 + + assert df["item"][0] == movie_example + assert df["genres"][0] == genres_example + assert df["year"][0] == year_example + + +@pytest.mark.smoke +@pytest.mark.spark +@pytest.mark.parametrize( + "size, num_samples, num_movies, movie_example, title_example, genres_example, year_example", + [ + ( + "100k", + 100000, + 1682, + 1, + "Toy Story (1995)", + "Animation|Children's|Comedy", + "1995", + ) + ], +) +def test_load_spark_df( + size, + num_samples, + num_movies, + movie_example, + title_example, + genres_example, + year_example, + tmp, + spark, +): + """Test MovieLens dataset load into pySpark.DataFrame""" + + # Test if correct data are loaded + header = ["1", "2", "3"] + schema = StructType( + [ + StructField("u", IntegerType()), + StructField("m", IntegerType()), + ] + ) + with pytest.warns(Warning): + df = load_spark_df( + spark, size=size, local_cache_path=tmp, header=header, schema=schema + ) + assert df.count() == num_samples + # Test if schema is used when both schema and header are provided + assert len(df.columns) == len(schema) + # Test if raw-zip file, rating file, and item file are cached + assert len(os.listdir(tmp)) == 3 + + # Test title, genres, and released year load + header = ["a", "b", "c", "d", "e"] + with pytest.warns(Warning): + df = load_spark_df( + spark, + size=size, + local_cache_path=tmp, + header=header, + title_col="Title", + genres_col="Genres", + year_col="Year", + ) + assert df.count() == num_samples + assert ( + len(df.columns) == 7 + ) # 4 header columns (user, item, rating, timestamp) and 3 feature columns + assert "e" not in df.columns # only the first 4 header columns are used + # Get two records of the same items and check if the item-features are the same. + head = df.filter(col("b") == movie_example).limit(2) + title = head.select("Title").collect() + assert title[0][0] == title[1][0] + assert title[0][0] == title_example + genres = head.select("Genres").collect() + assert genres[0][0] == genres[1][0] + assert genres[0][0] == genres_example + year = head.select("Year").collect() + assert year[0][0] == year[1][0] + assert year[0][0] == year_example + + # Test default arguments + df = load_spark_df(spark, size) + assert df.count() == num_samples + # user, item, rating and timestamp + assert len(df.columns) == 4 + + +@pytest.mark.smoke +@pytest.mark.parametrize("size", ["100k"]) +def test_download_and_extract_movielens(size, tmp): + """Test movielens data download and extract""" + zip_path = os.path.join(tmp, "ml.zip") + download_movielens(size, dest_path=zip_path) + assert len(os.listdir(tmp)) == 1 + assert os.path.exists(zip_path) + + rating_path = os.path.join(tmp, "rating.dat") + item_path = os.path.join(tmp, "item.dat") + extract_movielens( + size, rating_path=rating_path, item_path=item_path, zip_path=zip_path + ) + # Test if raw-zip file, rating file, and item file are cached + assert len(os.listdir(tmp)) == 3 + assert os.path.exists(rating_path) + assert os.path.exists(item_path) diff --git a/tests/unit/recommenders/datasets/test_sparse.py b/tests/unit/recommenders/datasets/test_sparse.py index 2184763d87..9ba82eed16 100644 --- a/tests/unit/recommenders/datasets/test_sparse.py +++ b/tests/unit/recommenders/datasets/test_sparse.py @@ -1,134 +1,134 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import pandas as pd -import numpy as np -import pytest - -from recommenders.datasets.sparse import AffinityMatrix -from recommenders.utils.constants import ( - DEFAULT_USER_COL, - DEFAULT_ITEM_COL, - DEFAULT_RATING_COL, - DEFAULT_TIMESTAMP_COL, -) - - -@pytest.fixture(scope="module") -def test_specs(): - return {"number_of_items": 50, "number_of_users": 20, "seed": 123} - - -# generate a syntetic dataset -@pytest.fixture(scope="module") -def python_dataset(test_specs): - - """Get Python labels""" - - def random_date_generator(start_date, range_in_days): - """Helper function to generate random timestamps. - - Reference: https://stackoverflow.com/questions/41006182/generate-random-dates-within-a-range-in-numpy - """ - - days_to_add = np.arange(0, range_in_days) - random_dates = [] - - for i in range(range_in_days): - random_date = np.datetime64(start_date) + np.random.choice(days_to_add) - random_dates.append(random_date) - - return random_dates - - # fix the the random seed - np.random.seed(test_specs["seed"]) - - # generates the user/item affinity matrix. Ratings are from 1 to 5, with 0s denoting unrated items - X = np.random.randint( - low=0, - high=6, - size=(test_specs["number_of_users"], test_specs["number_of_items"]), - ) - - # In the main code, input data are passed as pandas dataframe. Below we generate such df from the above matrix - userids = [] - - for i in range(1, test_specs["number_of_users"] + 1): - userids.extend([i] * test_specs["number_of_items"]) - - itemids = [i for i in range(1, test_specs["number_of_items"] + 1)] * test_specs[ - "number_of_users" - ] - ratings = np.reshape(X, -1) - - # create dataframe - results = pd.DataFrame.from_dict( - { - DEFAULT_USER_COL: userids, - DEFAULT_ITEM_COL: itemids, - DEFAULT_RATING_COL: ratings, - DEFAULT_TIMESTAMP_COL: random_date_generator( - "2018-01-01", - test_specs["number_of_users"] * test_specs["number_of_items"], - ), - } - ) - - # here we eliminate the missing ratings to obtain a standard form of the df as that of real data. - results = results[results.rating != 0] - - return results - - -def test_df_to_sparse(test_specs, python_dataset): - # initialize the splitter - header = { - "col_user": DEFAULT_USER_COL, - "col_item": DEFAULT_ITEM_COL, - "col_rating": DEFAULT_RATING_COL, - } - - # instantiate the affinity matrix - am = AffinityMatrix(df=python_dataset, **header) - - # obtain the sparse matrix representation of the input dataframe - X, _, _ = am.gen_affinity_matrix() - - # check that the generated matrix has the correct dimensions - assert (X.shape[0] == python_dataset.userID.unique().shape[0]) & ( - X.shape[1] == python_dataset.itemID.unique().shape[0] - ) - - -def test_sparse_to_df(test_specs, python_dataset): - # initialize the splitter - header = { - "col_user": DEFAULT_USER_COL, - "col_item": DEFAULT_ITEM_COL, - "col_rating": DEFAULT_RATING_COL, - } - - # instantiate the the affinity matrix - am = AffinityMatrix(df=python_dataset, **header) - - # generate the sparse matrix representation - X, _, _ = am.gen_affinity_matrix() - - # use the inverse function to generate a pandas df from a sparse matrix ordered by userID - DF = am.map_back_sparse(X, kind="ratings") - - # tests: check that the two dataframes have the same elements in the same positions. - assert ( - DF.userID.values.all() - == python_dataset.sort_values(by=["userID"]).userID.values.all() - ) - - assert ( - DF.itemID.values.all() - == python_dataset.sort_values(by=["userID"]).itemID.values.all() - ) - - assert ( - DF.rating.values.all() - == python_dataset.sort_values(by=["userID"]).rating.values.all() - ) +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import pandas as pd +import numpy as np +import pytest + +from recommenders.datasets.sparse import AffinityMatrix +from recommenders.utils.constants import ( + DEFAULT_USER_COL, + DEFAULT_ITEM_COL, + DEFAULT_RATING_COL, + DEFAULT_TIMESTAMP_COL, +) + + +@pytest.fixture(scope="module") +def test_specs(): + return {"number_of_items": 50, "number_of_users": 20, "seed": 123} + + +# generate a syntetic dataset +@pytest.fixture(scope="module") +def python_dataset(test_specs): + + """Get Python labels""" + + def random_date_generator(start_date, range_in_days): + """Helper function to generate random timestamps. + + Reference: https://stackoverflow.com/questions/41006182/generate-random-dates-within-a-range-in-numpy + """ + + days_to_add = np.arange(0, range_in_days) + random_dates = [] + + for i in range(range_in_days): + random_date = np.datetime64(start_date) + np.random.choice(days_to_add) + random_dates.append(random_date) + + return random_dates + + # fix the the random seed + np.random.seed(test_specs["seed"]) + + # generates the user/item affinity matrix. Ratings are from 1 to 5, with 0s denoting unrated items + X = np.random.randint( + low=0, + high=6, + size=(test_specs["number_of_users"], test_specs["number_of_items"]), + ) + + # In the main code, input data are passed as pandas dataframe. Below we generate such df from the above matrix + userids = [] + + for i in range(1, test_specs["number_of_users"] + 1): + userids.extend([i] * test_specs["number_of_items"]) + + itemids = [i for i in range(1, test_specs["number_of_items"] + 1)] * test_specs[ + "number_of_users" + ] + ratings = np.reshape(X, -1) + + # create dataframe + results = pd.DataFrame.from_dict( + { + DEFAULT_USER_COL: userids, + DEFAULT_ITEM_COL: itemids, + DEFAULT_RATING_COL: ratings, + DEFAULT_TIMESTAMP_COL: random_date_generator( + "2018-01-01", + test_specs["number_of_users"] * test_specs["number_of_items"], + ), + } + ) + + # here we eliminate the missing ratings to obtain a standard form of the df as that of real data. + results = results[results.rating != 0] + + return results + + +def test_df_to_sparse(test_specs, python_dataset): + # initialize the splitter + header = { + "col_user": DEFAULT_USER_COL, + "col_item": DEFAULT_ITEM_COL, + "col_rating": DEFAULT_RATING_COL, + } + + # instantiate the affinity matrix + am = AffinityMatrix(df=python_dataset, **header) + + # obtain the sparse matrix representation of the input dataframe + X, _, _ = am.gen_affinity_matrix() + + # check that the generated matrix has the correct dimensions + assert (X.shape[0] == python_dataset.userID.unique().shape[0]) & ( + X.shape[1] == python_dataset.itemID.unique().shape[0] + ) + + +def test_sparse_to_df(test_specs, python_dataset): + # initialize the splitter + header = { + "col_user": DEFAULT_USER_COL, + "col_item": DEFAULT_ITEM_COL, + "col_rating": DEFAULT_RATING_COL, + } + + # instantiate the the affinity matrix + am = AffinityMatrix(df=python_dataset, **header) + + # generate the sparse matrix representation + X, _, _ = am.gen_affinity_matrix() + + # use the inverse function to generate a pandas df from a sparse matrix ordered by userID + DF = am.map_back_sparse(X, kind="ratings") + + # tests: check that the two dataframes have the same elements in the same positions. + assert ( + DF.userID.values.all() + == python_dataset.sort_values(by=["userID"]).userID.values.all() + ) + + assert ( + DF.itemID.values.all() + == python_dataset.sort_values(by=["userID"]).itemID.values.all() + ) + + assert ( + DF.rating.values.all() + == python_dataset.sort_values(by=["userID"]).rating.values.all() + ) diff --git a/tests/unit/recommenders/models/test_wide_deep_utils.py b/tests/unit/recommenders/models/test_wide_deep_utils.py index 2c08851a17..d6d1a8dfb5 100644 --- a/tests/unit/recommenders/models/test_wide_deep_utils.py +++ b/tests/unit/recommenders/models/test_wide_deep_utils.py @@ -76,7 +76,7 @@ def test_wide_model(pd_df, tmp): ) # Close the event file so that the model folder can be cleaned up. - summary_writer = tf.summary.FileWriterCache.get(model.model_dir) + summary_writer = tf.compat.v1.summary.FileWriterCache.get(model.model_dir) summary_writer.close() @@ -100,7 +100,7 @@ def test_deep_model(pd_df, tmp): ) # Close the event file so that the model folder can be cleaned up. - summary_writer = tf.summary.FileWriterCache.get(model.model_dir) + summary_writer = tf.compat.v1.summary.FileWriterCache.get(model.model_dir) summary_writer.close() @@ -134,5 +134,5 @@ def test_wide_deep_model(pd_df, tmp): ) # Close the event file so that the model folder can be cleaned up. - summary_writer = tf.summary.FileWriterCache.get(model.model_dir) + summary_writer = tf.compat.v1.summary.FileWriterCache.get(model.model_dir) summary_writer.close() diff --git a/tests/unit/recommenders/utils/test_k8s_utils.py b/tests/unit/recommenders/utils/test_k8s_utils.py index 161cef698a..dd58a9d834 100644 --- a/tests/unit/recommenders/utils/test_k8s_utils.py +++ b/tests/unit/recommenders/utils/test_k8s_utils.py @@ -1,25 +1,25 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -from recommenders.utils.k8s_utils import ( - qps_to_replicas, - replicas_to_qps, - nodes_to_replicas, -) - - -def test_qps_to_replicas(): - replicas = qps_to_replicas(target_qps=25, processing_time=0.1) - assert replicas == 4 - - -def test_replicas_to_qps(): - qps = replicas_to_qps(num_replicas=4, processing_time=0.1) - assert qps == 27 - - -def test_nodes_to_replicas(): - max_replicas = nodes_to_replicas( - n_cores_per_node=4, n_nodes=3, cpu_cores_per_replica=0.1 - ) - assert max_replicas == 60 +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +from recommenders.utils.k8s_utils import ( + qps_to_replicas, + replicas_to_qps, + nodes_to_replicas, +) + + +def test_qps_to_replicas(): + replicas = qps_to_replicas(target_qps=25, processing_time=0.1) + assert replicas == 4 + + +def test_replicas_to_qps(): + qps = replicas_to_qps(num_replicas=4, processing_time=0.1) + assert qps == 27 + + +def test_nodes_to_replicas(): + max_replicas = nodes_to_replicas( + n_cores_per_node=4, n_nodes=3, cpu_cores_per_replica=0.1 + ) + assert max_replicas == 60 diff --git a/tests/unit/recommenders/utils/test_tf_utils.py b/tests/unit/recommenders/utils/test_tf_utils.py index 60f32e244d..6b45020731 100644 --- a/tests/unit/recommenders/utils/test_tf_utils.py +++ b/tests/unit/recommenders/utils/test_tf_utils.py @@ -63,8 +63,8 @@ def test_pandas_input_fn(pd_df): # check dataset dataset = pandas_input_fn(df)() - batch = dataset.make_one_shot_iterator().get_next() - with tf.Session() as sess: + batch = tf.compat.v1.data.make_one_shot_iterator(dataset).get_next() + with tf.compat.v1.Session() as sess: features = sess.run(batch) # check the input function returns all the columns @@ -80,8 +80,8 @@ def test_pandas_input_fn(pd_df): # check dataset with shuffles dataset = pandas_input_fn(df, shuffle=True, seed=SEED)() - batch = dataset.make_one_shot_iterator().get_next() - with tf.Session() as sess: + batch = tf.compat.v1.data.make_one_shot_iterator(dataset).get_next() + with tf.compat.v1.Session() as sess: features = sess.run(batch) print(features) # check the input function returns all the columns @@ -97,8 +97,8 @@ def test_pandas_input_fn(pd_df): # check dataset w/ label dataset_with_label = pandas_input_fn(df, y_col=DEFAULT_RATING_COL)() - batch = dataset_with_label.make_one_shot_iterator().get_next() - with tf.Session() as sess: + batch = tf.compat.v1.data.make_one_shot_iterator(dataset_with_label).get_next() + with tf.compat.v1.Session() as sess: features, label = sess.run(batch) assert ( len(features) == len(df.columns) - 1 @@ -108,25 +108,25 @@ def test_pandas_input_fn(pd_df): @pytest.mark.gpu def test_build_optimizer(): adadelta = build_optimizer("Adadelta") - assert isinstance(adadelta, tf.train.AdadeltaOptimizer) + assert isinstance(adadelta, tf.compat.v1.train.AdadeltaOptimizer) adagrad = build_optimizer("Adagrad") - assert isinstance(adagrad, tf.train.AdagradOptimizer) + assert isinstance(adagrad, tf.compat.v1.train.AdagradOptimizer) adam = build_optimizer("Adam") - assert isinstance(adam, tf.train.AdamOptimizer) + assert isinstance(adam, tf.compat.v1.train.AdamOptimizer) ftrl = build_optimizer("Ftrl", **{"l1_regularization_strength": 0.001}) - assert isinstance(ftrl, tf.train.FtrlOptimizer) + assert isinstance(ftrl, tf.compat.v1.train.FtrlOptimizer) momentum = build_optimizer("Momentum", **{"momentum": 0.5}) - assert isinstance(momentum, tf.train.MomentumOptimizer) + assert isinstance(momentum, tf.compat.v1.train.MomentumOptimizer) rmsprop = build_optimizer("RMSProp") - assert isinstance(rmsprop, tf.train.RMSPropOptimizer) + assert isinstance(rmsprop, tf.compat.v1.train.RMSPropOptimizer) sgd = build_optimizer("SGD") - assert isinstance(sgd, tf.train.GradientDescentOptimizer) + assert isinstance(sgd, tf.compat.v1.train.GradientDescentOptimizer) @pytest.mark.gpu @@ -177,7 +177,7 @@ def test_evaluation_log_hook(pd_df, tmp): assert len(evaluation_logger.get_log()[rmse.__name__]) == hook_frequency # Close the event file so that the model folder can be cleaned up. - summary_writer = tf.summary.FileWriterCache.get(model.model_dir) + summary_writer = tf.compat.v1.summary.FileWriterCache.get(model.model_dir) summary_writer.close() @@ -230,5 +230,5 @@ def test_pandas_input_fn_for_saved_model(pd_df, tmp): ) # Close the event file so that the model folder can be cleaned up. - summary_writer = tf.summary.FileWriterCache.get(model.model_dir) + summary_writer = tf.compat.v1.summary.FileWriterCache.get(model.model_dir) summary_writer.close() From cb60a2f7bbbd511d4c098d620213b792347490b3 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 12 Oct 2021 17:30:40 +0000 Subject: [PATCH 07/60] Modifications made by tf_upgrade_v2 script provided by TF + fix for inserted loss_reduction arg --- .../deeprec/io/dkn_item2item_iterator.py | 234 +++---- recommenders/models/deeprec/io/iterator.py | 18 +- .../models/deeprec/io/nextitnet_iterator.py | 22 +- .../models/deeprec/io/sequential_iterator.py | 22 +- .../models/deeprec/models/base_model.py | 98 +-- recommenders/models/deeprec/models/dkn.py | 32 +- .../models/deeprec/models/dkn_item2item.py | 250 ++++---- .../deeprec/models/graphrec/lightgcn.py | 42 +- .../models/deeprec/models/sequential/asvd.py | 10 +- .../models/deeprec/models/sequential/caser.py | 24 +- .../deeprec/models/sequential/gru4rec.py | 16 +- .../deeprec/models/sequential/nextitnet.py | 56 +- .../sequential/sequential_base_model.py | 42 +- .../deeprec/models/sequential/sli_rec.py | 32 +- .../models/deeprec/models/sequential/sum.py | 24 +- .../deeprec/models/sequential/sum_cells.py | 26 +- recommenders/models/deeprec/models/xDeepFM.py | 130 ++-- recommenders/models/ncf/ncf_singlenode.py | 32 +- recommenders/models/rbm/rbm.py | 82 +-- .../models/rlrmc/conjugate_gradient_ms.py | 510 ++++++++-------- recommenders/models/vae/multinomial_vae.py | 10 +- .../models/wide_deep/wide_deep_utils.py | 12 +- recommenders/tuning/nni/nni_utils.py | 1 - recommenders/utils/k8s_utils.py | 162 ++--- recommenders/utils/tf_utils.py | 32 +- .../recommenders/datasets/test_movielens.py | 578 +++++++++--------- .../recommenders/dataset/test_movielens.py | 470 +++++++------- .../unit/recommenders/datasets/test_sparse.py | 268 ++++---- .../models/test_wide_deep_utils.py | 6 +- .../unit/recommenders/utils/test_k8s_utils.py | 50 +- .../unit/recommenders/utils/test_tf_utils.py | 30 +- 31 files changed, 1660 insertions(+), 1661 deletions(-) diff --git a/recommenders/models/deeprec/io/dkn_item2item_iterator.py b/recommenders/models/deeprec/io/dkn_item2item_iterator.py index 09972d7042..a2a2383a64 100644 --- a/recommenders/models/deeprec/io/dkn_item2item_iterator.py +++ b/recommenders/models/deeprec/io/dkn_item2item_iterator.py @@ -1,117 +1,117 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - - -import tensorflow as tf -from recommenders.models.deeprec.io.dkn_iterator import DKNTextIterator - - -class DKNItem2itemTextIterator(DKNTextIterator): - def __init__(self, hparams, graph): - """This new iterator is for DKN's item-to-item recommendations version. - The tutorial can be found `on this notebook `_. - - Compared with user-to-item recommendations, we don't need the user behavior module. - So the placeholder can be simplified from the original DKNTextIterator. - - Args: - hparams (object): Global hyper-parameters. - graph (object): The running graph. - """ - self.hparams = hparams - self.graph = graph - self.neg_num = hparams.neg_num - self.batch_size = hparams.batch_size * (self.neg_num + 2) - self.doc_size = hparams.doc_size - with self.graph.as_default(): - self.candidate_news_index_batch = tf.placeholder( - tf.int64, [self.batch_size, self.doc_size], name="candidate_news_index" - ) - self.candidate_news_entity_index_batch = tf.placeholder( - tf.int64, - [self.batch_size, self.doc_size], - name="candidate_news_entity_index", - ) - - self._loading_nessary_files() - - def _loading_nessary_files(self): - """Only one feature file is needed: `news_feature_file`. - This function loads the news article's features into two dictionaries: `self.news_word_index` and `self.news_entity_index`. - """ - hparams = self.hparams - self.news_word_index = {} - self.news_entity_index = {} - with open(hparams.news_feature_file, "r") as rd: - while True: - line = rd.readline() - if not line: - break - newsid, word_index, entity_index = line.strip().split(" ") - self.news_word_index[newsid] = [ - int(item) for item in word_index.split(",") - ] - self.news_entity_index[newsid] = [ - int(item) for item in entity_index.split(",") - ] - - def load_data_from_file(self, infile): - """This function will return a mini-batch of data with features, - by looking up `news_word_index` dictionary and `news_entity_index` dictionary according to the news article's ID. - - Args: - infile (str): File path. Each line of `infile` is a news article's ID. - - Yields: - dict, list, int: - - A dictionary that maps graph elements to numpy arrays. - - A list with news article's ID. - - Size of the data in a batch. - """ - newsid_list = [] - candidate_news_index_batch = [] - candidate_news_entity_index_batch = [] - cnt = 0 - with open(infile, "r") as rd: - while True: - line = rd.readline() - if not line: - break - newsid = line.strip() - word_index, entity_index = ( - self.news_word_index[newsid], - self.news_entity_index[newsid], - ) - newsid_list.append(newsid) - - candidate_news_index_batch.append(word_index) - candidate_news_entity_index_batch.append(entity_index) - - cnt += 1 - if cnt >= self.batch_size: - res = self._convert_infer_data( - candidate_news_index_batch, - candidate_news_entity_index_batch, - ) - data_size = self.batch_size - yield self.gen_infer_feed_dict(res), newsid_list, data_size - candidate_news_index_batch = [] - candidate_news_entity_index_batch = [] - newsid_list = [] - cnt = 0 - - if cnt > 0: - data_size = cnt - while cnt < self.batch_size: - candidate_news_index_batch.append( - candidate_news_index_batch[cnt % data_size] - ) - candidate_news_entity_index_batch.append( - candidate_news_entity_index_batch[cnt % data_size] - ) - cnt += 1 - res = self._convert_infer_data( - candidate_news_index_batch, - candidate_news_entity_index_batch, - ) - yield self.gen_infer_feed_dict(res), newsid_list, data_size +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + + +import tensorflow as tf +from recommenders.models.deeprec.io.dkn_iterator import DKNTextIterator + + +class DKNItem2itemTextIterator(DKNTextIterator): + def __init__(self, hparams, graph): + """This new iterator is for DKN's item-to-item recommendations version. + The tutorial can be found `on this notebook `_. + + Compared with user-to-item recommendations, we don't need the user behavior module. + So the placeholder can be simplified from the original DKNTextIterator. + + Args: + hparams (object): Global hyper-parameters. + graph (object): The running graph. + """ + self.hparams = hparams + self.graph = graph + self.neg_num = hparams.neg_num + self.batch_size = hparams.batch_size * (self.neg_num + 2) + self.doc_size = hparams.doc_size + with self.graph.as_default(): + self.candidate_news_index_batch = tf.compat.v1.placeholder( + tf.int64, [self.batch_size, self.doc_size], name="candidate_news_index" + ) + self.candidate_news_entity_index_batch = tf.compat.v1.placeholder( + tf.int64, + [self.batch_size, self.doc_size], + name="candidate_news_entity_index", + ) + + self._loading_nessary_files() + + def _loading_nessary_files(self): + """Only one feature file is needed: `news_feature_file`. + This function loads the news article's features into two dictionaries: `self.news_word_index` and `self.news_entity_index`. + """ + hparams = self.hparams + self.news_word_index = {} + self.news_entity_index = {} + with open(hparams.news_feature_file, "r") as rd: + while True: + line = rd.readline() + if not line: + break + newsid, word_index, entity_index = line.strip().split(" ") + self.news_word_index[newsid] = [ + int(item) for item in word_index.split(",") + ] + self.news_entity_index[newsid] = [ + int(item) for item in entity_index.split(",") + ] + + def load_data_from_file(self, infile): + """This function will return a mini-batch of data with features, + by looking up `news_word_index` dictionary and `news_entity_index` dictionary according to the news article's ID. + + Args: + infile (str): File path. Each line of `infile` is a news article's ID. + + Yields: + dict, list, int: + - A dictionary that maps graph elements to numpy arrays. + - A list with news article's ID. + - Size of the data in a batch. + """ + newsid_list = [] + candidate_news_index_batch = [] + candidate_news_entity_index_batch = [] + cnt = 0 + with open(infile, "r") as rd: + while True: + line = rd.readline() + if not line: + break + newsid = line.strip() + word_index, entity_index = ( + self.news_word_index[newsid], + self.news_entity_index[newsid], + ) + newsid_list.append(newsid) + + candidate_news_index_batch.append(word_index) + candidate_news_entity_index_batch.append(entity_index) + + cnt += 1 + if cnt >= self.batch_size: + res = self._convert_infer_data( + candidate_news_index_batch, + candidate_news_entity_index_batch, + ) + data_size = self.batch_size + yield self.gen_infer_feed_dict(res), newsid_list, data_size + candidate_news_index_batch = [] + candidate_news_entity_index_batch = [] + newsid_list = [] + cnt = 0 + + if cnt > 0: + data_size = cnt + while cnt < self.batch_size: + candidate_news_index_batch.append( + candidate_news_index_batch[cnt % data_size] + ) + candidate_news_entity_index_batch.append( + candidate_news_entity_index_batch[cnt % data_size] + ) + cnt += 1 + res = self._convert_infer_data( + candidate_news_index_batch, + candidate_news_entity_index_batch, + ) + yield self.gen_infer_feed_dict(res), newsid_list, data_size diff --git a/recommenders/models/deeprec/io/iterator.py b/recommenders/models/deeprec/io/iterator.py index b814b67063..b239439e37 100644 --- a/recommenders/models/deeprec/io/iterator.py +++ b/recommenders/models/deeprec/io/iterator.py @@ -64,24 +64,24 @@ def __init__(self, hparams, graph, col_spliter=" ", ID_spliter="%"): self.graph = graph with self.graph.as_default(): - self.labels = tf.placeholder(tf.float32, [None, 1], name="label") - self.fm_feat_indices = tf.placeholder( + self.labels = tf.compat.v1.placeholder(tf.float32, [None, 1], name="label") + self.fm_feat_indices = tf.compat.v1.placeholder( tf.int64, [None, 2], name="fm_feat_indices" ) - self.fm_feat_values = tf.placeholder( + self.fm_feat_values = tf.compat.v1.placeholder( tf.float32, [None], name="fm_feat_values" ) - self.fm_feat_shape = tf.placeholder(tf.int64, [None], name="fm_feat_shape") - self.dnn_feat_indices = tf.placeholder( + self.fm_feat_shape = tf.compat.v1.placeholder(tf.int64, [None], name="fm_feat_shape") + self.dnn_feat_indices = tf.compat.v1.placeholder( tf.int64, [None, 2], name="dnn_feat_indices" ) - self.dnn_feat_values = tf.placeholder( + self.dnn_feat_values = tf.compat.v1.placeholder( tf.int64, [None], name="dnn_feat_values" ) - self.dnn_feat_weights = tf.placeholder( + self.dnn_feat_weights = tf.compat.v1.placeholder( tf.float32, [None], name="dnn_feat_weights" ) - self.dnn_feat_shape = tf.placeholder( + self.dnn_feat_shape = tf.compat.v1.placeholder( tf.int64, [None], name="dnn_feat_shape" ) @@ -127,7 +127,7 @@ def load_data_from_file(self, infile): impression_id_list = [] cnt = 0 - with tf.gfile.GFile(infile, "r") as rd: + with tf.io.gfile.GFile(infile, "r") as rd: for line in rd: label, features, impression_id = self.parser_one_line(line) diff --git a/recommenders/models/deeprec/io/nextitnet_iterator.py b/recommenders/models/deeprec/io/nextitnet_iterator.py index 7b130bec06..548228ebd9 100644 --- a/recommenders/models/deeprec/io/nextitnet_iterator.py +++ b/recommenders/models/deeprec/io/nextitnet_iterator.py @@ -43,27 +43,27 @@ def __init__(self, hparams, graph, col_spliter="\t"): self.graph = graph with self.graph.as_default(): - self.labels = tf.placeholder(tf.float32, [None, None], name="label") - self.users = tf.placeholder(tf.int32, [None], name="users") - self.items = tf.placeholder(tf.int32, [None, None], name="items") - self.cates = tf.placeholder(tf.int32, [None, None], name="cates") - self.item_history = tf.placeholder( + self.labels = tf.compat.v1.placeholder(tf.float32, [None, None], name="label") + self.users = tf.compat.v1.placeholder(tf.int32, [None], name="users") + self.items = tf.compat.v1.placeholder(tf.int32, [None, None], name="items") + self.cates = tf.compat.v1.placeholder(tf.int32, [None, None], name="cates") + self.item_history = tf.compat.v1.placeholder( tf.int32, [None, self.max_seq_length], name="item_history" ) - self.item_cate_history = tf.placeholder( + self.item_cate_history = tf.compat.v1.placeholder( tf.int32, [None, self.max_seq_length], name="item_cate_history" ) - self.mask = tf.placeholder( + self.mask = tf.compat.v1.placeholder( tf.int32, [None, self.max_seq_length], name="mask" ) - self.time = tf.placeholder(tf.float32, [None], name="time") - self.time_diff = tf.placeholder( + self.time = tf.compat.v1.placeholder(tf.float32, [None], name="time") + self.time_diff = tf.compat.v1.placeholder( tf.float32, [None, self.max_seq_length], name="time_diff" ) - self.time_from_first_action = tf.placeholder( + self.time_from_first_action = tf.compat.v1.placeholder( tf.float32, [None, self.max_seq_length], name="time_from_first_action" ) - self.time_to_now = tf.placeholder( + self.time_to_now = tf.compat.v1.placeholder( tf.float32, [None, self.max_seq_length], name="time_to_now" ) diff --git a/recommenders/models/deeprec/io/sequential_iterator.py b/recommenders/models/deeprec/io/sequential_iterator.py index 93e680af60..79c9c4f584 100644 --- a/recommenders/models/deeprec/io/sequential_iterator.py +++ b/recommenders/models/deeprec/io/sequential_iterator.py @@ -43,27 +43,27 @@ def __init__(self, hparams, graph, col_spliter="\t"): self.graph = graph with self.graph.as_default(): - self.labels = tf.placeholder(tf.float32, [None, 1], name="label") - self.users = tf.placeholder(tf.int32, [None], name="users") - self.items = tf.placeholder(tf.int32, [None], name="items") - self.cates = tf.placeholder(tf.int32, [None], name="cates") - self.item_history = tf.placeholder( + self.labels = tf.compat.v1.placeholder(tf.float32, [None, 1], name="label") + self.users = tf.compat.v1.placeholder(tf.int32, [None], name="users") + self.items = tf.compat.v1.placeholder(tf.int32, [None], name="items") + self.cates = tf.compat.v1.placeholder(tf.int32, [None], name="cates") + self.item_history = tf.compat.v1.placeholder( tf.int32, [None, self.max_seq_length], name="item_history" ) - self.item_cate_history = tf.placeholder( + self.item_cate_history = tf.compat.v1.placeholder( tf.int32, [None, self.max_seq_length], name="item_cate_history" ) - self.mask = tf.placeholder( + self.mask = tf.compat.v1.placeholder( tf.int32, [None, self.max_seq_length], name="mask" ) - self.time = tf.placeholder(tf.float32, [None], name="time") - self.time_diff = tf.placeholder( + self.time = tf.compat.v1.placeholder(tf.float32, [None], name="time") + self.time_diff = tf.compat.v1.placeholder( tf.float32, [None, self.max_seq_length], name="time_diff" ) - self.time_from_first_action = tf.placeholder( + self.time_from_first_action = tf.compat.v1.placeholder( tf.float32, [None, self.max_seq_length], name="time_from_first_action" ) - self.time_to_now = tf.placeholder( + self.time_to_now = tf.compat.v1.placeholder( tf.float32, [None, self.max_seq_length], name="time_to_now" ) diff --git a/recommenders/models/deeprec/models/base_model.py b/recommenders/models/deeprec/models/base_model.py index 68cd57e5d1..0c3465931b 100644 --- a/recommenders/models/deeprec/models/base_model.py +++ b/recommenders/models/deeprec/models/base_model.py @@ -137,12 +137,12 @@ def _l1_loss(self): # embedding_layer l2 loss for param in self.embed_params: l1_loss = tf.add( - l1_loss, tf.multiply(self.hparams.embed_l1, tf.norm(param, ord=1)) + l1_loss, tf.multiply(self.hparams.embed_l1, tf.norm(tensor=param, ord=1)) ) params = self.layer_params for param in params: l1_loss = tf.add( - l1_loss, tf.multiply(self.hparams.layer_l1, tf.norm(param, ord=1)) + l1_loss, tf.multiply(self.hparams.layer_l1, tf.norm(tensor=param, ord=1)) ) return l1_loss @@ -155,47 +155,47 @@ def _cross_l_loss(self): cross_l_loss = tf.zeros([1], dtype=tf.float32) for param in self.cross_params: cross_l_loss = tf.add( - cross_l_loss, tf.multiply(self.hparams.cross_l1, tf.norm(param, ord=1)) + cross_l_loss, tf.multiply(self.hparams.cross_l1, tf.norm(tensor=param, ord=1)) ) cross_l_loss = tf.add( - cross_l_loss, tf.multiply(self.hparams.cross_l2, tf.norm(param, ord=2)) + cross_l_loss, tf.multiply(self.hparams.cross_l2, tf.norm(tensor=param, ord=2)) ) return cross_l_loss def _get_initializer(self): if self.hparams.init_method == "tnormal": - return tf.truncated_normal_initializer( + return tf.compat.v1.truncated_normal_initializer( stddev=self.hparams.init_value, seed=self.seed ) elif self.hparams.init_method == "uniform": - return tf.random_uniform_initializer( + return tf.compat.v1.random_uniform_initializer( -self.hparams.init_value, self.hparams.init_value, seed=self.seed ) elif self.hparams.init_method == "normal": - return tf.random_normal_initializer( + return tf.compat.v1.random_normal_initializer( stddev=self.hparams.init_value, seed=self.seed ) elif self.hparams.init_method == "xavier_normal": - return tf.contrib.layers.xavier_initializer(uniform=False, seed=self.seed) + return tf.compat.v1.keras.initializers.VarianceScaling(scale=1.0, mode="fan_avg", distribution=("uniform" if False else "truncated_normal"), seed=self.seed) elif self.hparams.init_method == "xavier_uniform": - return tf.contrib.layers.xavier_initializer(uniform=True, seed=self.seed) + return tf.compat.v1.keras.initializers.VarianceScaling(scale=1.0, mode="fan_avg", distribution=("uniform" if True else "truncated_normal"), seed=self.seed) elif self.hparams.init_method == "he_normal": - return tf.contrib.layers.variance_scaling_initializer( - factor=2.0, mode="FAN_IN", uniform=False, seed=self.seed + return tf.compat.v1.keras.initializers.VarianceScaling( + scale=2.0, mode=("FAN_IN").lower(), distribution=("uniform" if False else "truncated_normal"), seed=self.seed ) elif self.hparams.init_method == "he_uniform": - return tf.contrib.layers.variance_scaling_initializer( - factor=2.0, mode="FAN_IN", uniform=True, seed=self.seed + return tf.compat.v1.keras.initializers.VarianceScaling( + scale=2.0, mode=("FAN_IN").lower(), distribution=("uniform" if True else "truncated_normal"), seed=self.seed ) else: - return tf.truncated_normal_initializer( + return tf.compat.v1.truncated_normal_initializer( stddev=self.hparams.init_value, seed=self.seed ) def _compute_data_loss(self): if self.hparams.loss == "cross_entropy_loss": data_loss = tf.reduce_mean( - tf.nn.sigmoid_cross_entropy_with_logits( + input_tensor=tf.nn.sigmoid_cross_entropy_with_logits( logits=tf.reshape(self.logit, [-1]), labels=tf.reshape(self.iterator.labels, [-1]), ) @@ -203,7 +203,7 @@ def _compute_data_loss(self): elif self.hparams.loss == "square_loss": data_loss = tf.sqrt( tf.reduce_mean( - tf.squared_difference( + input_tensor=tf.math.squared_difference( tf.reshape(self.pred, [-1]), tf.reshape(self.iterator.labels, [-1]), ) @@ -211,7 +211,7 @@ def _compute_data_loss(self): ) elif self.hparams.loss == "log_loss": data_loss = tf.reduce_mean( - tf.compat.v1.losses.log_loss( + input_tensor=tf.compat.v1.losses.log_loss( predictions=tf.reshape(self.pred, [-1]), labels=tf.reshape(self.iterator.labels, [-1]), ) @@ -222,11 +222,11 @@ def _compute_data_loss(self): if self.hparams.model_type == "NextItNet": labels = ( tf.transpose( - tf.reshape( + a=tf.reshape( self.iterator.labels, (-1, group, self.hparams.max_seq_length), ), - [0, 2, 1], + perm=[0, 2, 1], ), ) labels = tf.reshape(labels, (-1, group)) @@ -235,8 +235,8 @@ def _compute_data_loss(self): softmax_pred = tf.nn.softmax(logits, axis=-1) boolean_mask = tf.equal(labels, tf.ones_like(labels)) mask_paddings = tf.ones_like(softmax_pred) - pos_softmax = tf.where(boolean_mask, softmax_pred, mask_paddings) - data_loss = -group * tf.reduce_mean(tf.math.log(pos_softmax)) + pos_softmax = tf.compat.v1.where(boolean_mask, softmax_pred, mask_paddings) + data_loss = -group * tf.reduce_mean(input_tensor=tf.math.log(pos_softmax)) else: raise ValueError("this loss not defined {0}".format(self.hparams.loss)) return data_loss @@ -249,7 +249,7 @@ def _compute_regular_loss(self): object: Regular loss. """ regular_loss = self._l2_loss() + self._l1_loss() + self._cross_l_loss() - return tf.reduce_sum(regular_loss) + return tf.reduce_sum(input_tensor=regular_loss) def _train_opt(self): """Get the optimizer according to configuration. Usually we will use Adam. @@ -261,27 +261,27 @@ def _train_opt(self): optimizer = self.hparams.optimizer if optimizer == "adadelta": - train_step = tf.train.AdadeltaOptimizer(lr) + train_step = tf.compat.v1.train.AdadeltaOptimizer(lr) elif optimizer == "adagrad": - train_step = tf.train.AdagradOptimizer(lr) + train_step = tf.compat.v1.train.AdagradOptimizer(lr) elif optimizer == "sgd": - train_step = tf.train.GradientDescentOptimizer(lr) + train_step = tf.compat.v1.train.GradientDescentOptimizer(lr) elif optimizer == "adam": train_step = tf.compat.v1.train.AdamOptimizer(lr) elif optimizer == "ftrl": - train_step = tf.train.FtrlOptimizer(lr) + train_step = tf.compat.v1.train.FtrlOptimizer(lr) elif optimizer == "gd": - train_step = tf.train.GradientDescentOptimizer(lr) + train_step = tf.compat.v1.train.GradientDescentOptimizer(lr) elif optimizer == "padagrad": - train_step = tf.train.ProximalAdagradOptimizer(lr) + train_step = tf.compat.v1.train.ProximalAdagradOptimizer(lr) elif optimizer == "pgd": - train_step = tf.train.ProximalGradientDescentOptimizer(lr) + train_step = tf.compat.v1.train.ProximalGradientDescentOptimizer(lr) elif optimizer == "rmsprop": - train_step = tf.train.RMSPropOptimizer(lr) + train_step = tf.compat.v1.train.RMSPropOptimizer(lr) elif optimizer == "lazyadam": train_step = tf.contrib.opt.LazyAdamOptimizer(lr) else: - train_step = tf.train.GradientDescentOptimizer(lr) + train_step = tf.compat.v1.train.GradientDescentOptimizer(lr) return train_step def _build_train_opt(self): @@ -344,7 +344,7 @@ def _dropout(self, logit, keep_prob): Returns: object: A tensor of the same shape of logit. """ - return tf.nn.dropout(x=logit, keep_prob=keep_prob) + return tf.nn.dropout(x=logit, rate=1 - (keep_prob)) def train(self, sess, feed_dict): """Go through the optimization step once with training data in `feed_dict`. @@ -428,7 +428,7 @@ def fit(self, train_file, valid_file, test_file=None): object: An instance of self. """ if self.hparams.write_tfevents: - self.writer = tf.summary.FileWriter( + self.writer = tf.compat.v1.summary.FileWriter( self.hparams.SUMMARIES_DIR, self.sess.graph ) @@ -589,7 +589,7 @@ def predict(self, infile_name, outfile_name): object: An instance of self. """ load_sess = self.sess - with tf.gfile.GFile(outfile_name, "w") as wt: + with tf.io.gfile.GFile(outfile_name, "w") as wt: for batch_data_input, _, data_size in self.iterator.load_data_from_file( infile_name ): @@ -615,14 +615,14 @@ def _attention(self, inputs, attention_size): if not attention_size: attention_size = hidden_size - attention_mat = tf.get_variable( + attention_mat = tf.compat.v1.get_variable( name="attention_mat", shape=[inputs.shape[-1].value, hidden_size], initializer=self.initializer, ) att_inputs = tf.tensordot(inputs, attention_mat, [[2], [0]]) - query = tf.get_variable( + query = tf.compat.v1.get_variable( name="query", shape=[attention_size], dtype=tf.float32, @@ -645,28 +645,28 @@ def _fcn_net(self, model_output, layer_sizes, scope): object: Prediction logit after fully connected layer. """ hparams = self.hparams - with tf.variable_scope(scope): + with tf.compat.v1.variable_scope(scope): last_layer_size = model_output.shape[-1] layer_idx = 0 hidden_nn_layers = [] hidden_nn_layers.append(model_output) - with tf.variable_scope("nn_part", initializer=self.initializer) as scope: + with tf.compat.v1.variable_scope("nn_part", initializer=self.initializer) as scope: for idx, layer_size in enumerate(layer_sizes): - curr_w_nn_layer = tf.get_variable( + curr_w_nn_layer = tf.compat.v1.get_variable( name="w_nn_layer" + str(layer_idx), shape=[last_layer_size, layer_size], dtype=tf.float32, ) - curr_b_nn_layer = tf.get_variable( + curr_b_nn_layer = tf.compat.v1.get_variable( name="b_nn_layer" + str(layer_idx), shape=[layer_size], dtype=tf.float32, - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "nn_part/" + "w_nn_layer" + str(layer_idx), curr_w_nn_layer ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "nn_part/" + "b_nn_layer" + str(layer_idx), curr_b_nn_layer ) curr_hidden_nn_layer = ( @@ -680,7 +680,7 @@ def _fcn_net(self, model_output, layer_sizes, scope): activation = hparams.activation[idx] if hparams.enable_BN is True: - curr_hidden_nn_layer = tf.layers.batch_normalization( + curr_hidden_nn_layer = tf.compat.v1.layers.batch_normalization( curr_hidden_nn_layer, momentum=0.95, epsilon=0.0001, @@ -694,19 +694,19 @@ def _fcn_net(self, model_output, layer_sizes, scope): layer_idx += 1 last_layer_size = layer_size - w_nn_output = tf.get_variable( + w_nn_output = tf.compat.v1.get_variable( name="w_nn_output", shape=[last_layer_size, 1], dtype=tf.float32 ) - b_nn_output = tf.get_variable( + b_nn_output = tf.compat.v1.get_variable( name="b_nn_output", shape=[1], dtype=tf.float32, - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "nn_part/" + "w_nn_output" + str(layer_idx), w_nn_output ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "nn_part/" + "b_nn_output" + str(layer_idx), b_nn_output ) nn_output = ( diff --git a/recommenders/models/deeprec/models/dkn.py b/recommenders/models/deeprec/models/dkn.py index 19a855e59d..2baae07566 100644 --- a/recommenders/models/deeprec/models/dkn.py +++ b/recommenders/models/deeprec/models/dkn.py @@ -31,7 +31,7 @@ def __init__(self, hparams, iterator_creator): """ self.graph = tf.Graph() with self.graph.as_default(): - with tf.name_scope("embedding"): + with tf.compat.v1.name_scope("embedding"): word2vec_embedding = self._init_embedding(hparams.wordEmb_file) self.embedding = tf.Variable( word2vec_embedding, trainable=True, name="word" @@ -121,22 +121,22 @@ def _l1_loss(self): l1_loss = tf.zeros([1], dtype=tf.float32) # embedding_layer l2 loss l1_loss = tf.add( - l1_loss, tf.multiply(hparams.embed_l1, tf.norm(self.embedding, ord=1)) + l1_loss, tf.multiply(hparams.embed_l1, tf.norm(tensor=self.embedding, ord=1)) ) if hparams.use_entity: l1_loss = tf.add( l1_loss, - tf.multiply(hparams.embed_l1, tf.norm(self.entity_embedding, ord=1)), + tf.multiply(hparams.embed_l1, tf.norm(tensor=self.entity_embedding, ord=1)), ) if hparams.use_entity and hparams.use_context: l1_loss = tf.add( l1_loss, - tf.multiply(hparams.embed_l1, tf.norm(self.context_embedding, ord=1)), + tf.multiply(hparams.embed_l1, tf.norm(tensor=self.context_embedding, ord=1)), ) params = self.layer_params for param in params: l1_loss = tf.add( - l1_loss, tf.multiply(hparams.layer_l1, tf.norm(param, ord=1)) + l1_loss, tf.multiply(hparams.layer_l1, tf.norm(tensor=param, ord=1)) ) return l1_loss @@ -191,7 +191,7 @@ def _build_dkn(self): hidden_nn_layers[layer_idx], curr_w_nn_layer, curr_b_nn_layer ) if hparams.enable_BN is True: - curr_hidden_nn_layer = tf.layers.batch_normalization( + curr_hidden_nn_layer = tf.compat.v1.layers.batch_normalization( curr_hidden_nn_layer, momentum=0.95, epsilon=0.0001, @@ -275,7 +275,7 @@ def _build_pair_attention( avg_strategy = False if avg_strategy: click_field_embed_final = tf.reduce_mean( - click_field_embed, axis=1, keepdims=True + input_tensor=click_field_embed, axis=1, keepdims=True ) else: news_field_embed = tf.expand_dims(news_field_embed, 1) @@ -303,7 +303,7 @@ def _build_pair_attention( ) if hparams.enable_BN is True: - curr_attention_layer = tf.layers.batch_normalization( + curr_attention_layer = tf.compat.v1.layers.batch_normalization( curr_attention_layer, momentum=0.95, epsilon=0.0001, @@ -330,7 +330,7 @@ def _build_pair_attention( ) norm_attention_weight = tf.nn.softmax(attention_weight, axis=1) click_field_embed_final = tf.reduce_sum( - tf.multiply(click_field_embed, norm_attention_weight), + input_tensor=tf.multiply(click_field_embed, norm_attention_weight), axis=1, keepdims=True, ) @@ -363,20 +363,20 @@ def _kims_cnn(self, word, entity, hparams): num_filters = hparams.num_filters dim = hparams.dim - embedded_chars = tf.nn.embedding_lookup(self.embedding, word) + embedded_chars = tf.nn.embedding_lookup(params=self.embedding, ids=word) if hparams.use_entity and hparams.use_context: entity_embedded_chars = tf.nn.embedding_lookup( - self.entity_embedding, entity + params=self.entity_embedding, ids=entity ) context_embedded_chars = tf.nn.embedding_lookup( - self.context_embedding, entity + params=self.context_embedding, ids=entity ) concat = tf.concat( [embedded_chars, entity_embedded_chars, context_embedded_chars], axis=-1 ) elif hparams.use_entity: entity_embedded_chars = tf.nn.embedding_lookup( - self.entity_embedding, entity + params=self.entity_embedding, ids=entity ) concat = tf.concat([embedded_chars, entity_embedded_chars], axis=-1) else: @@ -400,7 +400,7 @@ def _kims_cnn(self, word, entity, hparams): name="W" + "_filter_size_" + str(filter_size), shape=filter_shape, dtype=tf.float32, - initializer=tf.contrib.layers.xavier_initializer(uniform=False), + initializer=tf.compat.v1.keras.initializers.VarianceScaling(scale=1.0, mode="fan_avg", distribution=("uniform" if False else "truncated_normal")), ) b = tf.compat.v1.get_variable( name="b" + "_filter_size_" + str(filter_size), @@ -412,8 +412,8 @@ def _kims_cnn(self, word, entity, hparams): if b not in self.layer_params: self.layer_params.append(b) conv = tf.nn.conv2d( - concat_expanded, - W, + input=concat_expanded, + filters=W, strides=[1, 1, 1, 1], padding="VALID", name="conv", diff --git a/recommenders/models/deeprec/models/dkn_item2item.py b/recommenders/models/deeprec/models/dkn_item2item.py index 90b8e295fd..00f72afd8a 100644 --- a/recommenders/models/deeprec/models/dkn_item2item.py +++ b/recommenders/models/deeprec/models/dkn_item2item.py @@ -1,125 +1,125 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - - -import numpy as np -import tensorflow as tf -from recommenders.models.deeprec.models.dkn import DKN -from recommenders.models.deeprec.deeprec_utils import cal_metric - - -r""" -This new model adapts DKN's structure for item-to-item recommendations. -The tutorial can be found at: https://github.com/microsoft/recommenders/blob/main/examples/07_tutorials/KDD2020-tutorial/step4_run_dkn_item2item.ipynb - """ - - -class DKNItem2Item(DKN): - """Class for item-to-item recommendations using DKN. - See https://github.com/microsoft/recommenders/blob/main/examples/07_tutorials/KDD2020-tutorial/step4_run_dkn_item2item.ipynb""" - - def _compute_data_loss(self): - logits = self.pred - data_loss = -1 * tf.reduce_sum(tf.math.log(logits[:, 0] + 1e-10)) - return data_loss - - def _build_dkn(self): - """The main function to create DKN's logic. - - Returns: - object: Prediction of item2item relation scores made by the DKN model, in the shape of (`batch_size`, `num_negative` + 1). - """ - news_field_embed_final_batch = self._build_doc_embedding( - self.iterator.candidate_news_index_batch, - self.iterator.candidate_news_entity_index_batch, - ) - - self.news_field_embed_final_batch = tf.math.l2_normalize( - news_field_embed_final_batch, axis=-1, epsilon=1e-12 - ) - - item_embs_train = tf.reshape( - self.news_field_embed_final_batch, - [ - -1, - self.iterator.neg_num + 2, - self.news_field_embed_final_batch.shape[-1], - ], - ) # (B, group, D) - - item_embs_source = item_embs_train[:, 0, :] # get the source item - item_embs_source = tf.expand_dims(item_embs_source, 1) - - item_embs_target = item_embs_train[:, 1:, :] - - item_relation = tf.math.multiply(item_embs_target, item_embs_source) - item_relation = tf.reduce_sum(item_relation, -1) # (B, neg_num + 1) - - self.pred_logits = item_relation - - return self.pred_logits - - def _get_pred(self, logit, task): - return tf.nn.softmax(logit, axis=-1) - - def _build_doc_embedding(self, candidate_word_batch, candidate_entity_batch): - """ - To make the document embedding be dense, we add one tanh layer on top of the `kims_cnn` module. - """ - with tf.variable_scope("kcnn", initializer=self.initializer): - news_field_embed = self._kims_cnn( - candidate_word_batch, candidate_entity_batch, self.hparams - ) - W = tf.get_variable( - name="W_doc_trans", - shape=(news_field_embed.shape[-1], self.num_filters_total), - dtype=tf.float32, - initializer=tf.contrib.layers.xavier_initializer(uniform=False), - ) - if W not in self.layer_params: - self.layer_params.append(W) - news_field_embed = tf.tanh(tf.matmul(news_field_embed, W)) - return news_field_embed - - def eval(self, sess, feed_dict): - """Evaluate the data in `feed_dict` with current model. - - Args: - sess (object): The model session object. - feed_dict (dict): Feed values for evaluation. This is a dictionary that maps graph elements to values. - - Returns: - numpy.ndarray, numpy.ndarray: A tuple with predictions and labels arrays. - """ - feed_dict[self.layer_keeps] = self.keep_prob_test - feed_dict[self.is_train_stage] = False - preds = sess.run(self.pred, feed_dict=feed_dict) - labels = np.zeros_like(preds, dtype=np.int32) - labels[:, 0] = 1 - return (preds, labels) - - def run_eval(self, filename): - """Evaluate the given file and returns some evaluation metrics. - - Args: - filename (str): A file name that will be evaluated. - - Returns: - dict: A dictionary containing evaluation metrics. - """ - load_sess = self.sess - group_preds = [] - group_labels = [] - - for ( - batch_data_input, - newsid_list, - data_size, - ) in self.iterator.load_data_from_file(filename): - if batch_data_input: - step_pred, step_labels = self.eval(load_sess, batch_data_input) - group_preds.extend(step_pred) - group_labels.extend(step_labels) - - res = cal_metric(group_labels, group_preds, self.hparams.pairwise_metrics) - return res +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + + +import numpy as np +import tensorflow as tf +from recommenders.models.deeprec.models.dkn import DKN +from recommenders.models.deeprec.deeprec_utils import cal_metric + + +r""" +This new model adapts DKN's structure for item-to-item recommendations. +The tutorial can be found at: https://github.com/microsoft/recommenders/blob/main/examples/07_tutorials/KDD2020-tutorial/step4_run_dkn_item2item.ipynb + """ + + +class DKNItem2Item(DKN): + """Class for item-to-item recommendations using DKN. + See https://github.com/microsoft/recommenders/blob/main/examples/07_tutorials/KDD2020-tutorial/step4_run_dkn_item2item.ipynb""" + + def _compute_data_loss(self): + logits = self.pred + data_loss = -1 * tf.reduce_sum(input_tensor=tf.math.log(logits[:, 0] + 1e-10)) + return data_loss + + def _build_dkn(self): + """The main function to create DKN's logic. + + Returns: + object: Prediction of item2item relation scores made by the DKN model, in the shape of (`batch_size`, `num_negative` + 1). + """ + news_field_embed_final_batch = self._build_doc_embedding( + self.iterator.candidate_news_index_batch, + self.iterator.candidate_news_entity_index_batch, + ) + + self.news_field_embed_final_batch = tf.math.l2_normalize( + news_field_embed_final_batch, axis=-1, epsilon=1e-12 + ) + + item_embs_train = tf.reshape( + self.news_field_embed_final_batch, + [ + -1, + self.iterator.neg_num + 2, + self.news_field_embed_final_batch.shape[-1], + ], + ) # (B, group, D) + + item_embs_source = item_embs_train[:, 0, :] # get the source item + item_embs_source = tf.expand_dims(item_embs_source, 1) + + item_embs_target = item_embs_train[:, 1:, :] + + item_relation = tf.math.multiply(item_embs_target, item_embs_source) + item_relation = tf.reduce_sum(input_tensor=item_relation, axis=-1) # (B, neg_num + 1) + + self.pred_logits = item_relation + + return self.pred_logits + + def _get_pred(self, logit, task): + return tf.nn.softmax(logit, axis=-1) + + def _build_doc_embedding(self, candidate_word_batch, candidate_entity_batch): + """ + To make the document embedding be dense, we add one tanh layer on top of the `kims_cnn` module. + """ + with tf.compat.v1.variable_scope("kcnn", initializer=self.initializer): + news_field_embed = self._kims_cnn( + candidate_word_batch, candidate_entity_batch, self.hparams + ) + W = tf.compat.v1.get_variable( + name="W_doc_trans", + shape=(news_field_embed.shape[-1], self.num_filters_total), + dtype=tf.float32, + initializer=tf.compat.v1.keras.initializers.VarianceScaling(scale=1.0, mode="fan_avg", distribution=("uniform" if False else "truncated_normal")), + ) + if W not in self.layer_params: + self.layer_params.append(W) + news_field_embed = tf.tanh(tf.matmul(news_field_embed, W)) + return news_field_embed + + def eval(self, sess, feed_dict): + """Evaluate the data in `feed_dict` with current model. + + Args: + sess (object): The model session object. + feed_dict (dict): Feed values for evaluation. This is a dictionary that maps graph elements to values. + + Returns: + numpy.ndarray, numpy.ndarray: A tuple with predictions and labels arrays. + """ + feed_dict[self.layer_keeps] = self.keep_prob_test + feed_dict[self.is_train_stage] = False + preds = sess.run(self.pred, feed_dict=feed_dict) + labels = np.zeros_like(preds, dtype=np.int32) + labels[:, 0] = 1 + return (preds, labels) + + def run_eval(self, filename): + """Evaluate the given file and returns some evaluation metrics. + + Args: + filename (str): A file name that will be evaluated. + + Returns: + dict: A dictionary containing evaluation metrics. + """ + load_sess = self.sess + group_preds = [] + group_labels = [] + + for ( + batch_data_input, + newsid_list, + data_size, + ) in self.iterator.load_data_from_file(filename): + if batch_data_input: + step_pred, step_labels = self.eval(load_sess, batch_data_input) + group_preds.extend(step_pred) + group_labels.extend(step_labels) + + res = cal_metric(group_labels, group_preds, self.hparams.pairwise_metrics) + return res diff --git a/recommenders/models/deeprec/models/graphrec/lightgcn.py b/recommenders/models/deeprec/models/graphrec/lightgcn.py index cc604623d0..7b01e5f85b 100644 --- a/recommenders/models/deeprec/models/graphrec/lightgcn.py +++ b/recommenders/models/deeprec/models/graphrec/lightgcn.py @@ -36,7 +36,7 @@ def __init__(self, hparams, data, seed=None): """ - tf.set_random_seed(seed) + tf.compat.v1.set_random_seed(seed) np.random.seed(seed) self.data = data @@ -67,28 +67,28 @@ def __init__(self, hparams, data, seed=None): self.n_users = data.n_users self.n_items = data.n_items - self.users = tf.placeholder(tf.int32, shape=(None,)) - self.pos_items = tf.placeholder(tf.int32, shape=(None,)) - self.neg_items = tf.placeholder(tf.int32, shape=(None,)) + self.users = tf.compat.v1.placeholder(tf.int32, shape=(None,)) + self.pos_items = tf.compat.v1.placeholder(tf.int32, shape=(None,)) + self.neg_items = tf.compat.v1.placeholder(tf.int32, shape=(None,)) self.weights = self._init_weights() self.ua_embeddings, self.ia_embeddings = self._create_lightgcn_embed() - self.u_g_embeddings = tf.nn.embedding_lookup(self.ua_embeddings, self.users) + self.u_g_embeddings = tf.nn.embedding_lookup(params=self.ua_embeddings, ids=self.users) self.pos_i_g_embeddings = tf.nn.embedding_lookup( - self.ia_embeddings, self.pos_items + params=self.ia_embeddings, ids=self.pos_items ) self.neg_i_g_embeddings = tf.nn.embedding_lookup( - self.ia_embeddings, self.neg_items + params=self.ia_embeddings, ids=self.neg_items ) self.u_g_embeddings_pre = tf.nn.embedding_lookup( - self.weights["user_embedding"], self.users + params=self.weights["user_embedding"], ids=self.users ) self.pos_i_g_embeddings_pre = tf.nn.embedding_lookup( - self.weights["item_embedding"], self.pos_items + params=self.weights["item_embedding"], ids=self.pos_items ) self.neg_i_g_embeddings_pre = tf.nn.embedding_lookup( - self.weights["item_embedding"], self.neg_items + params=self.weights["item_embedding"], ids=self.neg_items ) self.batch_ratings = tf.matmul( @@ -103,12 +103,12 @@ def __init__(self, hparams, data, seed=None): ) self.loss = self.mf_loss + self.emb_loss - self.opt = tf.train.AdamOptimizer(learning_rate=self.lr).minimize(self.loss) - self.saver = tf.train.Saver(max_to_keep=1) + self.opt = tf.compat.v1.train.AdamOptimizer(learning_rate=self.lr).minimize(self.loss) + self.saver = tf.compat.v1.train.Saver(max_to_keep=1) - gpu_options = tf.GPUOptions(allow_growth=True) - self.sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options)) - self.sess.run(tf.global_variables_initializer()) + gpu_options = tf.compat.v1.GPUOptions(allow_growth=True) + self.sess = tf.compat.v1.Session(config=tf.compat.v1.ConfigProto(gpu_options=gpu_options)) + self.sess.run(tf.compat.v1.global_variables_initializer()) def _init_weights(self): """Initialize user and item embeddings. @@ -118,7 +118,7 @@ def _init_weights(self): """ all_weights = dict() - initializer = tf.contrib.layers.xavier_initializer() + initializer = tf.compat.v1.keras.initializers.VarianceScaling(scale=1.0, mode="fan_avg", distribution="uniform") all_weights["user_embedding"] = tf.Variable( initializer([self.n_users, self.emb_dim]), name="user_embedding" @@ -145,11 +145,11 @@ def _create_lightgcn_embed(self): all_embeddings = [ego_embeddings] for k in range(0, self.n_layers): - ego_embeddings = tf.sparse_tensor_dense_matmul(A_hat, ego_embeddings) + ego_embeddings = tf.sparse.sparse_dense_matmul(A_hat, ego_embeddings) all_embeddings += [ego_embeddings] all_embeddings = tf.stack(all_embeddings, 1) - all_embeddings = tf.reduce_mean(all_embeddings, axis=1, keepdims=False) + all_embeddings = tf.reduce_mean(input_tensor=all_embeddings, axis=1, keepdims=False) u_g_embeddings, i_g_embeddings = tf.split( all_embeddings, [self.n_users, self.n_items], 0 ) @@ -167,8 +167,8 @@ def _create_bpr_loss(self, users, pos_items, neg_items): tf.Tensor, tf.Tensor: Matrix factorization loss. Embedding regularization loss. """ - pos_scores = tf.reduce_sum(tf.multiply(users, pos_items), axis=1) - neg_scores = tf.reduce_sum(tf.multiply(users, neg_items), axis=1) + pos_scores = tf.reduce_sum(input_tensor=tf.multiply(users, pos_items), axis=1) + neg_scores = tf.reduce_sum(input_tensor=tf.multiply(users, neg_items), axis=1) regularizer = ( tf.nn.l2_loss(self.u_g_embeddings_pre) @@ -176,7 +176,7 @@ def _create_bpr_loss(self, users, pos_items, neg_items): + tf.nn.l2_loss(self.neg_i_g_embeddings_pre) ) regularizer = regularizer / self.batch_size - mf_loss = tf.reduce_mean(tf.nn.softplus(-(pos_scores - neg_scores))) + mf_loss = tf.reduce_mean(input_tensor=tf.nn.softplus(-(pos_scores - neg_scores))) emb_loss = self.decay * regularizer return mf_loss, emb_loss diff --git a/recommenders/models/deeprec/models/sequential/asvd.py b/recommenders/models/deeprec/models/sequential/asvd.py index 26f5d266c8..a4ed8d7dc9 100644 --- a/recommenders/models/deeprec/models/sequential/asvd.py +++ b/recommenders/models/deeprec/models/sequential/asvd.py @@ -33,15 +33,15 @@ def _build_seq_graph(self): object: The output of A2SVD section. """ hparams = self.hparams - with tf.variable_scope("a2svd"): + with tf.compat.v1.variable_scope("a2svd"): hist_input = tf.concat( [self.item_history_embedding, self.cate_history_embedding], 2 ) - with tf.variable_scope("Attention_layer"): + with tf.compat.v1.variable_scope("Attention_layer"): att_outputs1 = self._attention(hist_input, hparams.attention_size) - asvd_output = tf.reduce_sum(att_outputs1, 1) - tf.summary.histogram("a2svd_output", asvd_output) + asvd_output = tf.reduce_sum(input_tensor=att_outputs1, axis=1) + tf.compat.v1.summary.histogram("a2svd_output", asvd_output) model_output = tf.concat([asvd_output, self.target_item_embedding], 1) self.model_output = model_output - tf.summary.histogram("model_output", model_output) + tf.compat.v1.summary.histogram("model_output", model_output) return model_output diff --git a/recommenders/models/deeprec/models/sequential/caser.py b/recommenders/models/deeprec/models/sequential/caser.py index c2472113ad..aa881832bf 100644 --- a/recommenders/models/deeprec/models/sequential/caser.py +++ b/recommenders/models/deeprec/models/sequential/caser.py @@ -42,10 +42,10 @@ def _build_seq_graph(self): Returns: object: The output of caser section. """ - with tf.variable_scope("caser"): + with tf.compat.v1.variable_scope("caser"): cnn_output = self._caser_cnn() model_output = tf.concat([cnn_output, self.target_item_embedding], 1) - tf.summary.histogram("model_output", model_output) + tf.compat.v1.summary.histogram("model_output", model_output) return model_output def _add_cnn(self, hist_matrix, vertical_dim, scope): @@ -59,17 +59,17 @@ def _add_cnn(self, hist_matrix, vertical_dim, scope): Returns: object: The output of CNN layers. """ - with tf.variable_scope(scope): - with tf.variable_scope("vertical"): - embedding_T = tf.transpose(hist_matrix, [0, 2, 1]) + with tf.compat.v1.variable_scope(scope): + with tf.compat.v1.variable_scope("vertical"): + embedding_T = tf.transpose(a=hist_matrix, perm=[0, 2, 1]) out_v = self._build_cnn(embedding_T, self.n_v, vertical_dim) - out_v = tf.layers.flatten(out_v) - with tf.variable_scope("horizonal"): + out_v = tf.compat.v1.layers.flatten(out_v) + with tf.compat.v1.variable_scope("horizonal"): out_hs = [] for h in self.lengths: conv_out = self._build_cnn(hist_matrix, self.n_h, h) max_pool_out = tf.reduce_max( - conv_out, reduction_indices=[1], name="max_pool_{0}".format(h) + input_tensor=conv_out, axis=[1], name="max_pool_{0}".format(h) ) out_hs.append(max_pool_out) out_h = tf.concat(out_hs, 1) @@ -84,13 +84,13 @@ def _caser_cnn(self): item_out = self._add_cnn( self.item_history_embedding, self.item_embedding_dim, "item" ) - tf.summary.histogram("item_out", item_out) + tf.compat.v1.summary.histogram("item_out", item_out) cate_out = self._add_cnn( self.cate_history_embedding, self.cate_embedding_dim, "cate" ) - tf.summary.histogram("cate_out", cate_out) + tf.compat.v1.summary.histogram("cate_out", cate_out) cnn_output = tf.concat([item_out, cate_out], 1) - tf.summary.histogram("cnn_output", cnn_output) + tf.compat.v1.summary.histogram("cnn_output", cnn_output) return cnn_output def _build_cnn(self, history_matrix, nums, shape): @@ -99,7 +99,7 @@ def _build_cnn(self, history_matrix, nums, shape): Returns: object: The output of cnn section. """ - return tf.layers.conv1d( + return tf.compat.v1.layers.conv1d( history_matrix, nums, shape, diff --git a/recommenders/models/deeprec/models/sequential/gru4rec.py b/recommenders/models/deeprec/models/sequential/gru4rec.py index 8e203c9cd2..6d8c645469 100644 --- a/recommenders/models/deeprec/models/sequential/gru4rec.py +++ b/recommenders/models/deeprec/models/sequential/gru4rec.py @@ -26,11 +26,11 @@ def _build_seq_graph(self): Returns: object:the output of GRU4Rec section. """ - with tf.variable_scope("gru4rec"): + with tf.compat.v1.variable_scope("gru4rec"): # final_state = self._build_lstm() final_state = self._build_gru() model_output = tf.concat([final_state, self.target_item_embedding], 1) - tf.summary.histogram("model_output", model_output) + tf.compat.v1.summary.histogram("model_output", model_output) return model_output def _build_lstm(self): @@ -39,9 +39,9 @@ def _build_lstm(self): Returns: object: The output of LSTM section. """ - with tf.name_scope("lstm"): + with tf.compat.v1.name_scope("lstm"): self.mask = self.iterator.mask - self.sequence_length = tf.reduce_sum(self.mask, 1) + self.sequence_length = tf.reduce_sum(input_tensor=self.mask, axis=1) self.history_embedding = tf.concat( [self.item_history_embedding, self.cate_history_embedding], 2 ) @@ -52,7 +52,7 @@ def _build_lstm(self): dtype=tf.float32, scope="lstm", ) - tf.summary.histogram("LSTM_outputs", rnn_outputs) + tf.compat.v1.summary.histogram("LSTM_outputs", rnn_outputs) return final_state[1] def _build_gru(self): @@ -61,9 +61,9 @@ def _build_gru(self): Returns: object: The output of GRU section. """ - with tf.name_scope("gru"): + with tf.compat.v1.name_scope("gru"): self.mask = self.iterator.mask - self.sequence_length = tf.reduce_sum(self.mask, 1) + self.sequence_length = tf.reduce_sum(input_tensor=self.mask, axis=1) self.history_embedding = tf.concat( [self.item_history_embedding, self.cate_history_embedding], 2 ) @@ -74,5 +74,5 @@ def _build_gru(self): dtype=tf.float32, scope="gru", ) - tf.summary.histogram("GRU_outputs", rnn_outputs) + tf.compat.v1.summary.histogram("GRU_outputs", rnn_outputs) return final_state diff --git a/recommenders/models/deeprec/models/sequential/nextitnet.py b/recommenders/models/deeprec/models/sequential/nextitnet.py index e5abc06414..8490ddf36d 100644 --- a/recommenders/models/deeprec/models/sequential/nextitnet.py +++ b/recommenders/models/deeprec/models/sequential/nextitnet.py @@ -30,17 +30,17 @@ def _build_seq_graph(self): hparams = self.hparams is_training = tf.equal(self.is_train_stage, True) item_history_embedding = tf.cond( - is_training, - lambda: self.item_history_embedding[:: self.hparams.train_num_ngs + 1], - lambda: self.item_history_embedding, + pred=is_training, + true_fn=lambda: self.item_history_embedding[:: self.hparams.train_num_ngs + 1], + false_fn=lambda: self.item_history_embedding, ) cate_history_embedding = tf.cond( - is_training, - lambda: self.cate_history_embedding[:: self.hparams.train_num_ngs + 1], - lambda: self.cate_history_embedding, + pred=is_training, + true_fn=lambda: self.cate_history_embedding[:: self.hparams.train_num_ngs + 1], + false_fn=lambda: self.cate_history_embedding, ) - with tf.variable_scope("nextitnet", reuse=tf.AUTO_REUSE): + with tf.compat.v1.variable_scope("nextitnet", reuse=tf.compat.v1.AUTO_REUSE): dilate_input = tf.concat( [item_history_embedding, cate_history_embedding], 2 @@ -48,8 +48,8 @@ def _build_seq_graph(self): for layer_id, dilation in enumerate(hparams.dilations): dilate_input = tf.cond( - is_training, - lambda: self._nextitnet_residual_block_one( + pred=is_training, + true_fn=lambda: self._nextitnet_residual_block_one( dilate_input, dilation, layer_id, @@ -58,7 +58,7 @@ def _build_seq_graph(self): causal=True, train=True, ), - lambda: self._nextitnet_residual_block_one( + false_fn=lambda: self._nextitnet_residual_block_one( dilate_input, dilation, layer_id, @@ -71,7 +71,7 @@ def _build_seq_graph(self): self.dilate_input = dilate_input model_output = tf.cond( - is_training, self._training_output, self._normal_output + pred=is_training, true_fn=self._training_output, false_fn=self._normal_output ) return model_output @@ -90,7 +90,7 @@ def _training_output(self): model_output.get_shape()[-1], ), ) - model_output = tf.transpose(model_output, [0, 2, 1, 3]) + model_output = tf.transpose(a=model_output, perm=[0, 2, 1, 3]) model_output = tf.reshape(model_output, (-1, model_output.get_shape()[-1])) return model_output @@ -129,7 +129,7 @@ def _nextitnet_residual_block_one( resblock_name = "nextitnet_residual_block_one_{}_layer_{}_{}".format( resblock_type, layer_id, dilation ) - with tf.variable_scope(resblock_name): + with tf.compat.v1.variable_scope(resblock_name): input_ln = self._layer_norm(input_, name="layer_norm1", trainable=train) relu1 = tf.nn.relu(input_ln) conv1 = self._conv1d( @@ -168,20 +168,20 @@ def _conv1d( Returns: object: The output of dilated CNN layers. """ - with tf.variable_scope(name): - weight = tf.get_variable( + with tf.compat.v1.variable_scope(name): + weight = tf.compat.v1.get_variable( "weight", [1, kernel_size, input_.get_shape()[-1], output_channels], - initializer=tf.truncated_normal_initializer(stddev=0.02, seed=1), + initializer=tf.compat.v1.truncated_normal_initializer(stddev=0.02, seed=1), ) - bias = tf.get_variable( - "bias", [output_channels], initializer=tf.constant_initializer(0.0) + bias = tf.compat.v1.get_variable( + "bias", [output_channels], initializer=tf.compat.v1.constant_initializer(0.0) ) if causal: padding = [[0, 0], [(kernel_size - 1) * dilation, 0], [0, 0]] - padded = tf.pad(input_, padding) - input_expanded = tf.expand_dims(padded, dim=1) + padded = tf.pad(tensor=input_, paddings=padding) + input_expanded = tf.expand_dims(padded, axis=1) out = ( tf.nn.atrous_conv2d( input_expanded, weight, rate=dilation, padding="VALID" @@ -189,10 +189,10 @@ def _conv1d( + bias ) else: - input_expanded = tf.expand_dims(input_, dim=1) + input_expanded = tf.expand_dims(input_, axis=1) out = ( tf.nn.conv2d( - input_expanded, weight, strides=[1, 1, 1, 1], padding="SAME" + input=input_expanded, filters=weight, strides=[1, 1, 1, 1], padding="SAME" ) + bias ) @@ -206,22 +206,22 @@ def _layer_norm(self, x, name, epsilon=1e-8, trainable=True): Returns: object: Normalized data """ - with tf.variable_scope(name): + with tf.compat.v1.variable_scope(name): shape = x.get_shape() - beta = tf.get_variable( + beta = tf.compat.v1.get_variable( "beta", [int(shape[-1])], - initializer=tf.constant_initializer(0), + initializer=tf.compat.v1.constant_initializer(0), trainable=trainable, ) - gamma = tf.get_variable( + gamma = tf.compat.v1.get_variable( "gamma", [int(shape[-1])], - initializer=tf.constant_initializer(1), + initializer=tf.compat.v1.constant_initializer(1), trainable=trainable, ) - mean, variance = tf.nn.moments(x, axes=[len(shape) - 1], keep_dims=True) + mean, variance = tf.nn.moments(x=x, axes=[len(shape) - 1], keepdims=True) x = (x - mean) / tf.sqrt(variance + epsilon) diff --git a/recommenders/models/deeprec/models/sequential/sequential_base_model.py b/recommenders/models/deeprec/models/sequential/sequential_base_model.py index e8404ba7db..275b873d5e 100644 --- a/recommenders/models/deeprec/models/sequential/sequential_base_model.py +++ b/recommenders/models/deeprec/models/sequential/sequential_base_model.py @@ -42,7 +42,7 @@ def __init__(self, hparams, iterator_creator, graph=None, seed=None): self.graph = tf.Graph() if not graph else graph with self.graph.as_default(): - self.sequence_length = tf.placeholder( + self.sequence_length = tf.compat.v1.placeholder( tf.int32, [None], name="sequence_length" ) @@ -63,7 +63,7 @@ def _build_graph(self): self.keep_prob_train = 1 - np.array(hparams.dropout) self.keep_prob_test = np.ones_like(hparams.dropout) - with tf.variable_scope("sequential") as self.sequential_scope: + with tf.compat.v1.variable_scope("sequential") as self.sequential_scope: self._build_embedding() self._lookup_from_embedding() model_output = self._build_seq_graph() @@ -108,7 +108,7 @@ def fit( if not os.path.exists(self.hparams.SUMMARIES_DIR): os.makedirs(self.hparams.SUMMARIES_DIR) - self.writer = tf.summary.FileWriter( + self.writer = tf.compat.v1.summary.FileWriter( self.hparams.SUMMARIES_DIR, self.sess.graph ) @@ -234,7 +234,7 @@ def predict(self, infile_name, outfile_name): """ load_sess = self.sess - with tf.gfile.GFile(outfile_name, "w") as wt: + with tf.io.gfile.GFile(outfile_name, "w") as wt: for batch_data_input in self.iterator.load_data_from_file( infile_name, batch_num_ngs=0 ): @@ -255,18 +255,18 @@ def _build_embedding(self): self.item_embedding_dim = hparams.item_embedding_dim self.cate_embedding_dim = hparams.cate_embedding_dim - with tf.variable_scope("embedding", initializer=self.initializer): - self.user_lookup = tf.get_variable( + with tf.compat.v1.variable_scope("embedding", initializer=self.initializer): + self.user_lookup = tf.compat.v1.get_variable( name="user_embedding", shape=[self.user_vocab_length, self.user_embedding_dim], dtype=tf.float32, ) - self.item_lookup = tf.get_variable( + self.item_lookup = tf.compat.v1.get_variable( name="item_embedding", shape=[self.item_vocab_length, self.item_embedding_dim], dtype=tf.float32, ) - self.cate_lookup = tf.get_variable( + self.cate_lookup = tf.compat.v1.get_variable( name="cate_embedding", shape=[self.cate_vocab_length, self.cate_embedding_dim], dtype=tf.float32, @@ -275,27 +275,27 @@ def _build_embedding(self): def _lookup_from_embedding(self): """Lookup from embedding variables. A dropout layer follows lookup operations.""" self.user_embedding = tf.nn.embedding_lookup( - self.user_lookup, self.iterator.users + params=self.user_lookup, ids=self.iterator.users ) - tf.summary.histogram("user_embedding_output", self.user_embedding) + tf.compat.v1.summary.histogram("user_embedding_output", self.user_embedding) self.item_embedding = tf.nn.embedding_lookup( - self.item_lookup, self.iterator.items + params=self.item_lookup, ids=self.iterator.items ) self.item_history_embedding = tf.nn.embedding_lookup( - self.item_lookup, self.iterator.item_history + params=self.item_lookup, ids=self.iterator.item_history ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "item_history_embedding_output", self.item_history_embedding ) self.cate_embedding = tf.nn.embedding_lookup( - self.cate_lookup, self.iterator.cates + params=self.cate_lookup, ids=self.iterator.cates ) self.cate_history_embedding = tf.nn.embedding_lookup( - self.cate_lookup, self.iterator.item_cate_history + params=self.cate_lookup, ids=self.iterator.item_cate_history ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "cate_history_embedding_output", self.cate_history_embedding ) @@ -308,7 +308,7 @@ def _lookup_from_embedding(self): ) self.involved_items, _ = tf.unique(involved_items) involved_item_embedding = tf.nn.embedding_lookup( - self.item_lookup, self.involved_items + params=self.item_lookup, ids=self.involved_items ) self.embed_params.append(involved_item_embedding) @@ -321,20 +321,20 @@ def _lookup_from_embedding(self): ) self.involved_cates, _ = tf.unique(involved_cates) involved_cate_embedding = tf.nn.embedding_lookup( - self.cate_lookup, self.involved_cates + params=self.cate_lookup, ids=self.involved_cates ) self.embed_params.append(involved_cate_embedding) self.target_item_embedding = tf.concat( [self.item_embedding, self.cate_embedding], -1 ) - tf.summary.histogram("target_item_embedding_output", self.target_item_embedding) + tf.compat.v1.summary.histogram("target_item_embedding_output", self.target_item_embedding) def _add_norm(self): """Regularization for embedding variables and other variables.""" all_variables, embed_variables = ( - tf.trainable_variables(), - tf.trainable_variables(self.sequential_scope._name + "/embedding"), + tf.compat.v1.trainable_variables(), + tf.compat.v1.trainable_variables(self.sequential_scope._name + "/embedding"), ) layer_params = list(set(all_variables) - set(embed_variables)) layer_params = [a for a in layer_params if "_no_reg" not in a.name] diff --git a/recommenders/models/deeprec/models/sequential/sli_rec.py b/recommenders/models/deeprec/models/sequential/sli_rec.py index 4d330852e1..86e5d59813 100644 --- a/recommenders/models/deeprec/models/sequential/sli_rec.py +++ b/recommenders/models/deeprec/models/sequential/sli_rec.py @@ -31,17 +31,17 @@ def _build_seq_graph(self): object: the output of sli_rec section. """ hparams = self.hparams - with tf.variable_scope("sli_rec"): + with tf.compat.v1.variable_scope("sli_rec"): hist_input = tf.concat( [self.item_history_embedding, self.cate_history_embedding], 2 ) self.mask = self.iterator.mask - self.sequence_length = tf.reduce_sum(self.mask, 1) + self.sequence_length = tf.reduce_sum(input_tensor=self.mask, axis=1) - with tf.variable_scope("long_term_asvd"): + with tf.compat.v1.variable_scope("long_term_asvd"): att_outputs1 = self._attention(hist_input, hparams.attention_size) - att_fea1 = tf.reduce_sum(att_outputs1, 1) - tf.summary.histogram("att_fea1", att_fea1) + att_fea1 = tf.reduce_sum(input_tensor=att_outputs1, axis=1) + tf.compat.v1.summary.histogram("att_fea1", att_fea1) item_history_embedding_new = tf.concat( [ @@ -57,7 +57,7 @@ def _build_seq_graph(self): ], -1, ) - with tf.variable_scope("rnn"): + with tf.compat.v1.variable_scope("rnn"): rnn_outputs, final_state = dynamic_rnn( Time4LSTMCell(hparams.hidden_size), inputs=item_history_embedding_new, @@ -65,17 +65,17 @@ def _build_seq_graph(self): dtype=tf.float32, scope="time4lstm", ) - tf.summary.histogram("LSTM_outputs", rnn_outputs) + tf.compat.v1.summary.histogram("LSTM_outputs", rnn_outputs) - with tf.variable_scope("attention_fcn"): + with tf.compat.v1.variable_scope("attention_fcn"): att_outputs2 = self._attention_fcn( self.target_item_embedding, rnn_outputs ) - att_fea2 = tf.reduce_sum(att_outputs2, 1) - tf.summary.histogram("att_fea2", att_fea2) + att_fea2 = tf.reduce_sum(input_tensor=att_outputs2, axis=1) + tf.compat.v1.summary.histogram("att_fea2", att_fea2) # ensemble - with tf.name_scope("alpha"): + with tf.compat.v1.name_scope("alpha"): concat_all = tf.concat( [ self.target_item_embedding, @@ -92,7 +92,7 @@ def _build_seq_graph(self): alpha_output = tf.sigmoid(alpha_logit) user_embed = att_fea1 * alpha_output + att_fea2 * (1.0 - alpha_output) model_output = tf.concat([user_embed, self.target_item_embedding], 1) - tf.summary.histogram("model_output", model_output) + tf.compat.v1.summary.histogram("model_output", model_output) return model_output def _attention_fcn(self, query, user_embedding): @@ -106,11 +106,11 @@ def _attention_fcn(self, query, user_embedding): object: Weighted sum of user modeling. """ hparams = self.hparams - with tf.variable_scope("attention_fcn"): + with tf.compat.v1.variable_scope("attention_fcn"): query_size = query.shape[1].value boolean_mask = tf.equal(self.mask, tf.ones_like(self.mask)) - attention_mat = tf.get_variable( + attention_mat = tf.compat.v1.get_variable( name="attention_mat", shape=[user_embedding.shape.as_list()[-1], query_size], initializer=self.initializer, @@ -118,7 +118,7 @@ def _attention_fcn(self, query, user_embedding): att_inputs = tf.tensordot(user_embedding, attention_mat, [[2], [0]]) queries = tf.reshape( - tf.tile(query, [1, att_inputs.shape[1].value]), tf.shape(att_inputs) + tf.tile(query, [1, att_inputs.shape[1].value]), tf.shape(input=att_inputs) ) last_hidden_nn_layer = tf.concat( [att_inputs, queries, att_inputs - queries, att_inputs * queries], -1 @@ -129,7 +129,7 @@ def _attention_fcn(self, query, user_embedding): att_fnc_output = tf.squeeze(att_fnc_output, -1) mask_paddings = tf.ones_like(att_fnc_output) * (-(2 ** 32) + 1) att_weights = tf.nn.softmax( - tf.where(boolean_mask, att_fnc_output, mask_paddings), + tf.compat.v1.where(boolean_mask, att_fnc_output, mask_paddings), name="att_weights", ) output = user_embedding * tf.expand_dims(att_weights, -1) diff --git a/recommenders/models/deeprec/models/sequential/sum.py b/recommenders/models/deeprec/models/sequential/sum.py index 9882369a95..20f063bab4 100644 --- a/recommenders/models/deeprec/models/sequential/sum.py +++ b/recommenders/models/deeprec/models/sequential/sum.py @@ -28,7 +28,7 @@ def _build_seq_graph(self): object: The output of SUM section, which is a concatenation of user vector and target item vector. """ hparams = self.hparams - with tf.variable_scope("sum"): + with tf.compat.v1.variable_scope("sum"): self.history_embedding = tf.concat( [self.item_history_embedding, self.cate_history_embedding], 2 ) @@ -38,17 +38,17 @@ def _build_seq_graph(self): final_state = self._build_sum(cell) for _p in cell.parameter_set: - tf.summary.histogram(_p.name, _p) + tf.compat.v1.summary.histogram(_p.name, _p) if hasattr(cell, "_alpha") and hasattr(cell._alpha, "name"): - tf.summary.histogram(cell._alpha.name, cell._alpha) + tf.compat.v1.summary.histogram(cell._alpha.name, cell._alpha) if hasattr(cell, "_beta") and hasattr(cell._beta, "name"): - tf.summary.histogram(cell._beta.name, cell._beta) + tf.compat.v1.summary.histogram(cell._beta.name, cell._beta) final_state, att_weights = self._attention_query_by_state( final_state, self.target_item_embedding ) model_output = tf.concat([final_state, self.target_item_embedding], 1) - tf.summary.histogram("model_output", model_output) + tf.compat.v1.summary.histogram("model_output", model_output) return model_output def _attention_query_by_state(self, seq_output, query): @@ -63,9 +63,9 @@ def _attention_query_by_state(self, seq_output, query): """ dim_q = query.shape[-1].value att_weights = tf.constant(1.0, dtype=tf.float32) - with tf.variable_scope("query_att"): + with tf.compat.v1.variable_scope("query_att"): if self.hparams.slots > 1: - query_att_W = tf.get_variable( + query_att_W = tf.compat.v1.get_variable( name="query_att_W", shape=[self.hidden_size, dim_q], initializer=self.initializer, @@ -88,7 +88,7 @@ def _attention_query_by_state(self, seq_output, query): ) # merge the memory states, the final shape is (BatchSize, HiddenSize) att_res = tf.reduce_sum( - memory_state * tf.expand_dims(att_weights, -1), 1 + input_tensor=memory_state * tf.expand_dims(att_weights, -1), axis=1 ) else: @@ -129,9 +129,9 @@ def _build_sum(self, cell): object: A flatten representation of user memory states, in the shape of (BatchSize, SlotsNum x HiddenSize) """ hparams = self.hparams - with tf.variable_scope("sum"): + with tf.compat.v1.variable_scope("sum"): self.mask = self.iterator.mask - self.sequence_length = tf.reduce_sum(self.mask, 1) + self.sequence_length = tf.reduce_sum(input_tensor=self.mask, axis=1) rum_outputs, final_state = dynamic_rnn( cell, @@ -140,7 +140,7 @@ def _build_sum(self, cell): sequence_length=self.sequence_length, scope="sum", initial_state=cell.zero_state( - tf.shape(self.history_embedding)[0], tf.float32 + tf.shape(input=self.history_embedding)[0], tf.float32 ), ) @@ -149,6 +149,6 @@ def _build_sum(self, cell): self.heads = cell.heads self.alpha = cell._alpha self.beta = cell._beta - tf.summary.histogram("SUM_outputs", rum_outputs) + tf.compat.v1.summary.histogram("SUM_outputs", rum_outputs) return final_state diff --git a/recommenders/models/deeprec/models/sequential/sum_cells.py b/recommenders/models/deeprec/models/sequential/sum_cells.py index 156435648b..8f61ef707f 100644 --- a/recommenders/models/deeprec/models/sequential/sum_cells.py +++ b/recommenders/models/deeprec/models/sequential/sum_cells.py @@ -122,12 +122,12 @@ def _basic_build(self, inputs_shape): self._beta = self.add_variable( name="_beta_no_reg", shape=(), - initializer=tf.constant_initializer(np.array([1.02]), dtype=np.float32), + initializer=tf.compat.v1.constant_initializer(np.array([1.02]), dtype=np.float32), ) self._alpha = self.add_variable( name="_alpha_no_reg", shape=(), - initializer=tf.constant_initializer(np.array([0.98]), dtype=np.float32), + initializer=tf.compat.v1.constant_initializer(np.array([0.98]), dtype=np.float32), ) @tf_utils.shape_type_conversion @@ -183,27 +183,27 @@ def call(self, inputs, state): att_weights = tf.nn.softmax(self._beta * att_logit_mat, axis=-1) att_weights = tf.expand_dims(att_weights, 2) - h_hat = tf.reduce_sum(tf.multiply(state[:, : self._slots, :], att_weights), 1) + h_hat = tf.reduce_sum(input_tensor=tf.multiply(state[:, : self._slots, :], att_weights), axis=1) h_hat = (h_hat + state[:, self._slots, :]) / 2 n_a, n_b = tf.nn.l2_normalize(last, 1), tf.nn.l2_normalize(inputs, 1) - dist = tf.expand_dims(tf.reduce_sum(n_a * n_b, 1), 1) + dist = tf.expand_dims(tf.reduce_sum(input_tensor=n_a * n_b, axis=1), 1) dist = tf.math.pow(self._alpha, dist) att_weights = att_weights * tf.expand_dims(dist, 1) reset = tf.sigmoid( - tf.nn.xw_plus_b( + tf.compat.v1.nn.xw_plus_b( tf.concat([inputs, h_hat], axis=-1), self._reset_W, self._reset_b ) ) erase = tf.sigmoid( - tf.nn.xw_plus_b( + tf.compat.v1.nn.xw_plus_b( tf.concat([inputs, h_hat], axis=-1), self._erase_W, self._erase_b ) ) add = tf.tanh( - tf.nn.xw_plus_b( + tf.compat.v1.nn.xw_plus_b( tf.concat([inputs, reset * h_hat], axis=-1), self._add_W, self._add_b ) ) @@ -309,35 +309,35 @@ def call(self, inputs, state): att_weights = tf.nn.softmax(self._beta * att_logit_mat, axis=-1) att_weights = tf.expand_dims(att_weights, 2) - h_hat = tf.reduce_sum(tf.multiply(state[:, : self._slots, :], att_weights), 1) + h_hat = tf.reduce_sum(input_tensor=tf.multiply(state[:, : self._slots, :], att_weights), axis=1) h_hat = (h_hat + state[:, self._slots, :]) / 2 ## get the true writing attentions writing_input = tf.concat([inputs, h_hat], axis=1) - att_weights = tf.nn.xw_plus_b(writing_input, self._writing_W, self._writing_b) + att_weights = tf.compat.v1.nn.xw_plus_b(writing_input, self._writing_W, self._writing_b) att_weights = tf.nn.relu(att_weights) att_weights = tf.matmul(att_weights, self._writing_W02) att_weights = tf.nn.softmax(att_weights, axis=-1) att_weights = tf.expand_dims(att_weights, 2) n_a, n_b = tf.nn.l2_normalize(last, 1), tf.nn.l2_normalize(inputs, 1) - dist = tf.expand_dims(tf.reduce_sum(n_a * n_b, 1), 1) + dist = tf.expand_dims(tf.reduce_sum(input_tensor=n_a * n_b, axis=1), 1) dist = tf.math.pow(self._alpha, dist) att_weights = att_weights * tf.expand_dims(dist, 1) reset = tf.sigmoid( - tf.nn.xw_plus_b( + tf.compat.v1.nn.xw_plus_b( tf.concat([inputs, h_hat], axis=-1), self._reset_W, self._reset_b ) ) erase = tf.sigmoid( - tf.nn.xw_plus_b( + tf.compat.v1.nn.xw_plus_b( tf.concat([inputs, h_hat], axis=-1), self._erase_W, self._erase_b ) ) add = tf.tanh( - tf.nn.xw_plus_b( + tf.compat.v1.nn.xw_plus_b( tf.concat([inputs, reset * h_hat], axis=-1), self._add_W, self._add_b ) ) diff --git a/recommenders/models/deeprec/models/xDeepFM.py b/recommenders/models/deeprec/models/xDeepFM.py index 9c77f70dcc..26f690e03d 100644 --- a/recommenders/models/deeprec/models/xDeepFM.py +++ b/recommenders/models/deeprec/models/xDeepFM.py @@ -31,9 +31,9 @@ def _build_graph(self): self.keep_prob_train = 1 - np.array(hparams.dropout) self.keep_prob_test = np.ones_like(hparams.dropout) - with tf.variable_scope("XDeepFM") as scope: - with tf.variable_scope("embedding", initializer=self.initializer) as escope: - self.embedding = tf.get_variable( + with tf.compat.v1.variable_scope("XDeepFM") as scope: + with tf.compat.v1.variable_scope("embedding", initializer=self.initializer) as escope: + self.embedding = tf.compat.v1.get_variable( name="embedding_layer", shape=[hparams.FEATURE_COUNT, hparams.dim], dtype=tf.float32, @@ -88,7 +88,7 @@ def _build_embedding(self): self.iterator.dnn_feat_shape, ) w_fm_nn_input_orgin = tf.nn.embedding_lookup_sparse( - self.embedding, fm_sparse_index, fm_sparse_weight, combiner="sum" + params=self.embedding, sp_ids=fm_sparse_index, sp_weights=fm_sparse_weight, combiner="sum" ) embedding = tf.reshape( w_fm_nn_input_orgin, [-1, hparams.dim * hparams.FIELD_COUNT] @@ -103,26 +103,26 @@ def _build_linear(self): Returns: object: Prediction score made by linear regression. """ - with tf.variable_scope("linear_part", initializer=self.initializer) as scope: - w = tf.get_variable( + with tf.compat.v1.variable_scope("linear_part", initializer=self.initializer) as scope: + w = tf.compat.v1.get_variable( name="w", shape=[self.hparams.FEATURE_COUNT, 1], dtype=tf.float32 ) - b = tf.get_variable( + b = tf.compat.v1.get_variable( name="b", shape=[1], dtype=tf.float32, - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), ) x = tf.SparseTensor( self.iterator.fm_feat_indices, self.iterator.fm_feat_values, self.iterator.fm_feat_shape, ) - linear_output = tf.add(tf.sparse_tensor_dense_matmul(x, w), b) + linear_output = tf.add(tf.sparse.sparse_dense_matmul(x, w), b) self.layer_params.append(w) self.layer_params.append(b) - tf.summary.histogram("linear_part/w", w) - tf.summary.histogram("linear_part/b", b) + tf.compat.v1.summary.histogram("linear_part/w", w) + tf.compat.v1.summary.histogram("linear_part/b", b) return linear_output def _build_fm(self): @@ -132,7 +132,7 @@ def _build_fm(self): Returns: object: Prediction score made by factorization machine. """ - with tf.variable_scope("fm_part") as scope: + with tf.compat.v1.variable_scope("fm_part") as scope: x = tf.SparseTensor( self.iterator.fm_feat_indices, self.iterator.fm_feat_values, @@ -144,10 +144,10 @@ def _build_fm(self): self.iterator.fm_feat_shape, ) fm_output = 0.5 * tf.reduce_sum( - tf.pow(tf.sparse_tensor_dense_matmul(x, self.embedding), 2) - - tf.sparse_tensor_dense_matmul(xx, tf.pow(self.embedding, 2)), - 1, - keep_dims=True, + input_tensor=tf.pow(tf.sparse.sparse_dense_matmul(x, self.embedding), 2) + - tf.sparse.sparse_dense_matmul(xx, tf.pow(self.embedding, 2)), + axis=1, + keepdims=True, ) return fm_output @@ -178,7 +178,7 @@ def _build_CIN( hidden_nn_layers.append(nn_input) final_result = [] split_tensor0 = tf.split(hidden_nn_layers[0], hparams.dim * [1], 2) - with tf.variable_scope("exfm_part", initializer=self.initializer) as scope: + with tf.compat.v1.variable_scope("exfm_part", initializer=self.initializer) as scope: for idx, layer_size in enumerate(hparams.cross_layer_sizes): split_tensor = tf.split(hidden_nn_layers[-1], hparams.dim * [1], 2) dot_result_m = tf.matmul( @@ -188,9 +188,9 @@ def _build_CIN( dot_result_m, shape=[hparams.dim, -1, field_nums[0] * field_nums[-1]], ) # shape: (D,B,FH) - dot_result = tf.transpose(dot_result_o, perm=[1, 0, 2]) # (B,D,FH) + dot_result = tf.transpose(a=dot_result_o, perm=[1, 0, 2]) # (B,D,FH) - filters = tf.get_variable( + filters = tf.compat.v1.get_variable( name="f_" + str(idx), shape=[1, field_nums[-1] * field_nums[0], layer_size], dtype=tf.float32, @@ -198,7 +198,7 @@ def _build_CIN( if is_masked and idx == 0: ones = tf.ones([field_nums[0], field_nums[0]], dtype=tf.float32) - mask_matrix = tf.matrix_band_part(ones, 0, -1) - tf.diag( + mask_matrix = tf.linalg.band_part(ones, 0, -1) - tf.linalg.tensor_diag( tf.ones(field_nums[0]) ) mask_matrix = tf.reshape( @@ -209,21 +209,21 @@ def _build_CIN( self.dot_result = dot_result curr_out = tf.nn.conv1d( - dot_result, filters=filters, stride=1, padding="VALID" + input=dot_result, filters=filters, stride=1, padding="VALID" ) # shape : (B,D,H`) if bias: - b = tf.get_variable( + b = tf.compat.v1.get_variable( name="f_b" + str(idx), shape=[layer_size], dtype=tf.float32, - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), ) curr_out = tf.nn.bias_add(curr_out, b) self.cross_params.append(b) if hparams.enable_BN is True: - curr_out = tf.layers.batch_normalization( + curr_out = tf.compat.v1.layers.batch_normalization( curr_out, momentum=0.95, epsilon=0.0001, @@ -232,7 +232,7 @@ def _build_CIN( curr_out = self._activate(curr_out, hparams.cross_activation) - curr_out = tf.transpose(curr_out, perm=[0, 2, 1]) # shape : (B,H,D) + curr_out = tf.transpose(a=curr_out, perm=[0, 2, 1]) # shape : (B,H,D) if direct: direct_connect = curr_out @@ -258,25 +258,25 @@ def _build_CIN( self.cross_params.append(filters) result = tf.concat(final_result, axis=1) - result = tf.reduce_sum(result, -1) # shape : (B,H) + result = tf.reduce_sum(input_tensor=result, axis=-1) # shape : (B,H) if res: - base_score = tf.reduce_sum(result, 1, keepdims=True) # (B,1) + base_score = tf.reduce_sum(input_tensor=result, axis=1, keepdims=True) # (B,1) else: base_score = 0 - w_nn_output = tf.get_variable( + w_nn_output = tf.compat.v1.get_variable( name="w_nn_output", shape=[final_len, 1], dtype=tf.float32 ) - b_nn_output = tf.get_variable( + b_nn_output = tf.compat.v1.get_variable( name="b_nn_output", shape=[1], dtype=tf.float32, - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), ) self.layer_params.append(w_nn_output) self.layer_params.append(b_nn_output) - exFM_out = base_score + tf.nn.xw_plus_b(result, w_nn_output, b_nn_output) + exFM_out = base_score + tf.compat.v1.nn.xw_plus_b(result, w_nn_output, b_nn_output) return exFM_out def _build_fast_CIN(self, nn_input, res=False, direct=False, bias=False): @@ -304,14 +304,14 @@ def _build_fast_CIN(self, nn_input, res=False, direct=False, bias=False): nn_input = tf.reshape( nn_input, shape=[-1, int(field_num), hparams.dim] ) # (B,F,D) - nn_input = tf.transpose(nn_input, perm=[0, 2, 1]) # (B,D,F) + nn_input = tf.transpose(a=nn_input, perm=[0, 2, 1]) # (B,D,F) field_nums.append(int(field_num)) hidden_nn_layers.append(nn_input) final_result = [] - with tf.variable_scope("exfm_part", initializer=self.initializer) as scope: + with tf.compat.v1.variable_scope("exfm_part", initializer=self.initializer) as scope: for idx, layer_size in enumerate(hparams.cross_layer_sizes): if idx == 0: - fast_w = tf.get_variable( + fast_w = tf.compat.v1.get_variable( "fast_CIN_w_" + str(idx), shape=[1, field_nums[0], fast_CIN_d * layer_size], dtype=tf.float32, @@ -319,10 +319,10 @@ def _build_fast_CIN(self, nn_input, res=False, direct=False, bias=False): self.cross_params.append(fast_w) dot_result_1 = tf.nn.conv1d( - nn_input, filters=fast_w, stride=1, padding="VALID" + input=nn_input, filters=fast_w, stride=1, padding="VALID" ) # shape: (B,D,d*H) dot_result_2 = tf.nn.conv1d( - tf.pow(nn_input, 2), + input=tf.pow(nn_input, 2), filters=tf.pow(fast_w, 2), stride=1, padding="VALID", @@ -332,15 +332,15 @@ def _build_fast_CIN(self, nn_input, res=False, direct=False, bias=False): shape=[-1, hparams.dim, layer_size, fast_CIN_d], ) curr_out = tf.reduce_sum( - dot_result, 3, keepdims=False + input_tensor=dot_result, axis=3, keepdims=False ) # shape: ((B,D,H) else: - fast_w = tf.get_variable( + fast_w = tf.compat.v1.get_variable( "fast_CIN_w_" + str(idx), shape=[1, field_nums[0], fast_CIN_d * layer_size], dtype=tf.float32, ) - fast_v = tf.get_variable( + fast_v = tf.compat.v1.get_variable( "fast_CIN_v_" + str(idx), shape=[1, field_nums[-1], fast_CIN_d * layer_size], dtype=tf.float32, @@ -350,31 +350,31 @@ def _build_fast_CIN(self, nn_input, res=False, direct=False, bias=False): self.cross_params.append(fast_v) dot_result_1 = tf.nn.conv1d( - nn_input, filters=fast_w, stride=1, padding="VALID" + input=nn_input, filters=fast_w, stride=1, padding="VALID" ) # shape: ((B,D,d*H) dot_result_2 = tf.nn.conv1d( - hidden_nn_layers[-1], filters=fast_v, stride=1, padding="VALID" + input=hidden_nn_layers[-1], filters=fast_v, stride=1, padding="VALID" ) # shape: ((B,D,d*H) dot_result = tf.reshape( tf.multiply(dot_result_1, dot_result_2), shape=[-1, hparams.dim, layer_size, fast_CIN_d], ) curr_out = tf.reduce_sum( - dot_result, 3, keepdims=False + input_tensor=dot_result, axis=3, keepdims=False ) # shape: ((B,D,H) if bias: - b = tf.get_variable( + b = tf.compat.v1.get_variable( name="f_b" + str(idx), shape=[1, 1, layer_size], dtype=tf.float32, - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), ) curr_out = tf.nn.bias_add(curr_out, b) self.cross_params.append(b) if hparams.enable_BN is True: - curr_out = tf.layers.batch_normalization( + curr_out = tf.compat.v1.layers.batch_normalization( curr_out, momentum=0.95, epsilon=0.0001, @@ -406,25 +406,25 @@ def _build_fast_CIN(self, nn_input, res=False, direct=False, bias=False): hidden_nn_layers.append(next_hidden) result = tf.concat(final_result, axis=2) - result = tf.reduce_sum(result, 1, keepdims=False) # (B,H) + result = tf.reduce_sum(input_tensor=result, axis=1, keepdims=False) # (B,H) if res: - base_score = tf.reduce_sum(result, 1, keepdims=True) # (B,1) + base_score = tf.reduce_sum(input_tensor=result, axis=1, keepdims=True) # (B,1) else: base_score = 0 - w_nn_output = tf.get_variable( + w_nn_output = tf.compat.v1.get_variable( name="w_nn_output", shape=[final_len, 1], dtype=tf.float32 ) - b_nn_output = tf.get_variable( + b_nn_output = tf.compat.v1.get_variable( name="b_nn_output", shape=[1], dtype=tf.float32, - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), ) self.layer_params.append(w_nn_output) self.layer_params.append(b_nn_output) - exFM_out = tf.nn.xw_plus_b(result, w_nn_output, b_nn_output) + base_score + exFM_out = tf.compat.v1.nn.xw_plus_b(result, w_nn_output, b_nn_output) + base_score return exFM_out @@ -445,33 +445,33 @@ def _build_dnn(self, embed_out, embed_layer_size): layer_idx = 0 hidden_nn_layers = [] hidden_nn_layers.append(w_fm_nn_input) - with tf.variable_scope("nn_part", initializer=self.initializer) as scope: + with tf.compat.v1.variable_scope("nn_part", initializer=self.initializer) as scope: for idx, layer_size in enumerate(hparams.layer_sizes): - curr_w_nn_layer = tf.get_variable( + curr_w_nn_layer = tf.compat.v1.get_variable( name="w_nn_layer" + str(layer_idx), shape=[last_layer_size, layer_size], dtype=tf.float32, ) - curr_b_nn_layer = tf.get_variable( + curr_b_nn_layer = tf.compat.v1.get_variable( name="b_nn_layer" + str(layer_idx), shape=[layer_size], dtype=tf.float32, - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "nn_part/" + "w_nn_layer" + str(layer_idx), curr_w_nn_layer ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "nn_part/" + "b_nn_layer" + str(layer_idx), curr_b_nn_layer ) - curr_hidden_nn_layer = tf.nn.xw_plus_b( + curr_hidden_nn_layer = tf.compat.v1.nn.xw_plus_b( hidden_nn_layers[layer_idx], curr_w_nn_layer, curr_b_nn_layer ) scope = "nn_part" + str(idx) activation = hparams.activation[idx] if hparams.enable_BN is True: - curr_hidden_nn_layer = tf.layers.batch_normalization( + curr_hidden_nn_layer = tf.compat.v1.layers.batch_normalization( curr_hidden_nn_layer, momentum=0.95, epsilon=0.0001, @@ -487,22 +487,22 @@ def _build_dnn(self, embed_out, embed_layer_size): self.layer_params.append(curr_w_nn_layer) self.layer_params.append(curr_b_nn_layer) - w_nn_output = tf.get_variable( + w_nn_output = tf.compat.v1.get_variable( name="w_nn_output", shape=[last_layer_size, 1], dtype=tf.float32 ) - b_nn_output = tf.get_variable( + b_nn_output = tf.compat.v1.get_variable( name="b_nn_output", shape=[1], dtype=tf.float32, - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "nn_part/" + "w_nn_output" + str(layer_idx), w_nn_output ) - tf.summary.histogram( + tf.compat.v1.summary.histogram( "nn_part/" + "b_nn_output" + str(layer_idx), b_nn_output ) self.layer_params.append(w_nn_output) self.layer_params.append(b_nn_output) - nn_output = tf.nn.xw_plus_b(hidden_nn_layers[-1], w_nn_output, b_nn_output) + nn_output = tf.compat.v1.nn.xw_plus_b(hidden_nn_layers[-1], w_nn_output, b_nn_output) return nn_output diff --git a/recommenders/models/ncf/ncf_singlenode.py b/recommenders/models/ncf/ncf_singlenode.py index 1c8f9af790..5f5ba5216d 100644 --- a/recommenders/models/ncf/ncf_singlenode.py +++ b/recommenders/models/ncf/ncf_singlenode.py @@ -156,10 +156,10 @@ def _create_model( # get user embedding p and item embedding q self.gmf_p = tf.reduce_sum( - tf.nn.embedding_lookup(self.embedding_gmf_P, self.user_input), 1 + input_tensor=tf.nn.embedding_lookup(params=self.embedding_gmf_P, ids=self.user_input), axis=1 ) self.gmf_q = tf.reduce_sum( - tf.nn.embedding_lookup(self.embedding_gmf_Q, self.item_input), 1 + input_tensor=tf.nn.embedding_lookup(params=self.embedding_gmf_Q, ids=self.item_input), axis=1 ) # get gmf vector @@ -169,10 +169,10 @@ def _create_model( # get user embedding p and item embedding q self.mlp_p = tf.reduce_sum( - tf.nn.embedding_lookup(self.embedding_mlp_P, self.user_input), 1 + input_tensor=tf.nn.embedding_lookup(params=self.embedding_mlp_P, ids=self.user_input), axis=1 ) self.mlp_q = tf.reduce_sum( - tf.nn.embedding_lookup(self.embedding_mlp_Q, self.item_input), 1 + input_tensor=tf.nn.embedding_lookup(params=self.embedding_mlp_Q, ids=self.item_input), axis=1 ) # concatenate user and item vector @@ -184,8 +184,8 @@ def _create_model( output, num_outputs=layer_size, activation_fn=tf.nn.relu, - weights_initializer=tf.contrib.layers.xavier_initializer( - seed=self.seed + weights_initializer=tf.compat.v1.keras.initializers.VarianceScaling( + scale=1.0, mode="fan_avg", distribution="uniform", seed=self.seed ), ) self.mlp_vector = output @@ -201,8 +201,8 @@ def _create_model( num_outputs=1, activation_fn=None, biases_initializer=None, - weights_initializer=tf.contrib.layers.xavier_initializer( - seed=self.seed + weights_initializer=tf.compat.v1.keras.initializers.VarianceScaling( + scale=1.0, mode="fan_avg", distribution="uniform", seed=self.seed ), ) self.output = tf.sigmoid(output) @@ -214,8 +214,8 @@ def _create_model( num_outputs=1, activation_fn=None, biases_initializer=None, - weights_initializer=tf.contrib.layers.xavier_initializer( - seed=self.seed + weights_initializer=tf.compat.v1.keras.initializers.VarianceScaling( + scale=1.0, mode="fan_avg", distribution="uniform", seed=self.seed ), ) self.output = tf.sigmoid(output) @@ -229,8 +229,8 @@ def _create_model( num_outputs=1, activation_fn=None, biases_initializer=None, - weights_initializer=tf.contrib.layers.xavier_initializer( - seed=self.seed + weights_initializer=tf.compat.v1.keras.initializers.VarianceScaling( + scale=1.0, mode="fan_avg", distribution="uniform", seed=self.seed ), ) self.output = tf.sigmoid(output) @@ -326,17 +326,17 @@ def _load_neumf(self, gmf_dir, mlp_dir, alpha): saver.restore(self.sess, os.path.join(mlp_dir, MODEL_CHECKPOINT)) # concat pretrain h_from_gmf and h_from_mlp - vars_list = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES, scope="ncf") + vars_list = tf.compat.v1.get_collection(tf.compat.v1.GraphKeys.GLOBAL_VARIABLES, scope="ncf") assert len(vars_list) == 1 ncf_fc = vars_list[0] # get weight from gmf and mlp - gmf_fc = tf.contrib.framework.load_variable(gmf_dir, ncf_fc.name) - mlp_fc = tf.contrib.framework.load_variable(mlp_dir, ncf_fc.name) + gmf_fc = tf.train.load_variable(gmf_dir, ncf_fc.name) + mlp_fc = tf.train.load_variable(mlp_dir, ncf_fc.name) # load fc layer by tf.concat - assign_op = tf.assign( + assign_op = tf.compat.v1.assign( ncf_fc, tf.concat([alpha * gmf_fc, (1 - alpha) * mlp_fc], axis=0) ) self.sess.run(assign_op) diff --git a/recommenders/models/rbm/rbm.py b/recommenders/models/rbm/rbm.py index 50c9d2587b..67aeec1830 100644 --- a/recommenders/models/rbm/rbm.py +++ b/recommenders/models/rbm/rbm.py @@ -106,7 +106,7 @@ def __init__( # Seed self.seed = seed np.random.seed(self.seed) - tf.set_random_seed(self.seed) + tf.compat.v1.set_random_seed(self.seed) def time(self): """Time a particular section of the code - call this once to set the state somewhere @@ -146,7 +146,7 @@ def binomial_sampling(self, pr): """ # sample from a Bernoulli distribution with same dimensions as input distribution - g = tf.convert_to_tensor(np.random.uniform(size=pr.shape[1]), dtype=tf.float32) + g = tf.convert_to_tensor(value=np.random.uniform(size=pr.shape[1]), dtype=tf.float32) # sample the value of the hidden units h_sampled = tf.nn.relu(tf.sign(pr - g)) @@ -178,12 +178,12 @@ def multinomial_sampling(self, pr): """ g = np.random.uniform(size=pr.shape[2]) # sample from a uniform distribution f = tf.convert_to_tensor( - g / g.sum(), dtype=tf.float32 + value=g / g.sum(), dtype=tf.float32 ) # normalize and convert to tensor samp = tf.nn.relu(tf.sign(pr - f)) # apply rejection method v_samp = tf.cast( - tf.argmax(samp, axis=2) + 1, "float32" + tf.argmax(input=samp, axis=2) + 1, "float32" ) # select sampled element return v_samp @@ -206,11 +206,11 @@ def multinomial_distribution(self, phi): for k in range(1, self.ratings + 1) ] - denominator = tf.reduce_sum(numerator, axis=0) + denominator = tf.reduce_sum(input_tensor=numerator, axis=0) - prob = tf.div(numerator, denominator) + prob = tf.compat.v1.div(numerator, denominator) - return tf.transpose(prob, perm=[1, 2, 0]) + return tf.transpose(a=prob, perm=[1, 2, 0]) def free_energy(self, x): """Free energy of the visible units given the hidden units. Since the sum is over the hidden units' @@ -223,10 +223,10 @@ def free_energy(self, x): tf.Tensor: Free energy of the model. """ - bias = -tf.reduce_sum(tf.matmul(x, tf.transpose(self.bv))) + bias = -tf.reduce_sum(input_tensor=tf.matmul(x, tf.transpose(a=self.bv))) phi_x = tf.matmul(x, self.w) + self.bh - f = -tf.reduce_sum(tf.nn.softplus(phi_x)) + f = -tf.reduce_sum(input_tensor=tf.nn.softplus(phi_x)) F = bias + f # free energy density per training example @@ -234,7 +234,7 @@ def free_energy(self, x): def placeholder(self): """Initialize the placeholders for the visible units""" - self.vu = tf.placeholder(shape=[None, self.Nvisible], dtype="float32") + self.vu = tf.compat.v1.placeholder(shape=[None, self.Nvisible], dtype="float32") def init_parameters(self): """Initialize the parameters of the model. @@ -252,28 +252,28 @@ def init_parameters(self): - `bv` of size (1, Nvisible): visible units' bias, initialized to zero. - `bh` of size (1, Nhidden): hidden units' bias, initiliazed to zero. """ - with tf.variable_scope("Network_parameters"): + with tf.compat.v1.variable_scope("Network_parameters"): - self.w = tf.get_variable( + self.w = tf.compat.v1.get_variable( "weight", [self.Nvisible, self.Nhidden], - initializer=tf.random_normal_initializer( + initializer=tf.compat.v1.random_normal_initializer( stddev=self.stdv, seed=self.seed ), dtype="float32", ) - self.bv = tf.get_variable( + self.bv = tf.compat.v1.get_variable( "v_bias", [1, self.Nvisible], - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), dtype="float32", ) - self.bh = tf.get_variable( + self.bh = tf.compat.v1.get_variable( "h_bias", [1, self.Nhidden], - initializer=tf.zeros_initializer(), + initializer=tf.compat.v1.zeros_initializer(), dtype="float32", ) @@ -296,11 +296,11 @@ def sample_hidden_units(self, vv): - `h_`: The sampled value of the hidden unit from a Bernoulli distributions having success probability `phv`. """ - with tf.name_scope("sample_hidden_units"): + with tf.compat.v1.name_scope("sample_hidden_units"): phi_v = tf.matmul(vv, self.w) + self.bh # create a linear combination phv = tf.nn.sigmoid(phi_v) # conditional probability of h given v - phv_reg = tf.nn.dropout(phv, self.keep) + phv_reg = tf.nn.dropout(phv, 1 - (self.keep)) # Sampling h_ = self.binomial_sampling( @@ -334,9 +334,9 @@ def sample_visible_units(self, h): - `v_`: The sampled value of the visible unit from a Multinomial distributions having success probability `pvh`. """ - with tf.name_scope("sample_visible_units"): + with tf.compat.v1.name_scope("sample_visible_units"): - phi_h = tf.matmul(h, tf.transpose(self.w)) + self.bv # linear combination + phi_h = tf.matmul(h, tf.transpose(a=self.w)) + self.bv # linear combination pvh = self.multinomial_distribution( phi_h ) # conditional probability of v given h @@ -348,7 +348,7 @@ def sample_visible_units(self, h): mask = tf.equal(self.v, 0) # selects the inactive units in the input vector - v_ = tf.where( + v_ = tf.compat.v1.where( mask, x=self.v, y=v_tmp ) # enforce inactive units in the reconstructed vector @@ -369,7 +369,7 @@ def gibbs_sampling(self): - `v_k`: The sampled value of the visible unit at step k, float32. """ - with tf.name_scope("gibbs_sampling"): + with tf.compat.v1.name_scope("gibbs_sampling"): self.v_k = ( self.v @@ -394,7 +394,7 @@ def losses(self, vv): - Objective function of Contrastive divergence: the difference between the free energy clamped on the data (v) and the model Free energy (v_k). """ - with tf.variable_scope("losses"): + with tf.compat.v1.variable_scope("losses"): obj = self.free_energy(vv) - self.free_energy(self.v_k) return obj @@ -412,7 +412,7 @@ def gibbs_protocol(self, i): i (int): Current epoch in the loop """ - with tf.name_scope("gibbs_protocol"): + with tf.compat.v1.name_scope("gibbs_protocol"): epoch_percentage = ( i / self.epochs @@ -449,15 +449,15 @@ def accuracy(self, vp): """ - with tf.name_scope("accuracy"): + with tf.compat.v1.name_scope("accuracy"): # 1) define and apply the mask mask = tf.not_equal(self.v, 0) - n_values = tf.reduce_sum(tf.cast(mask, "float32"), axis=1) + n_values = tf.reduce_sum(input_tensor=tf.cast(mask, "float32"), axis=1) # 2) Take the difference between the input data and the inferred ones. This value is zero whenever # the two values coincides - vd = tf.where( + vd = tf.compat.v1.where( mask, x=tf.abs(tf.subtract(self.v, vp)), y=tf.ones_like(self.v) ) @@ -465,7 +465,7 @@ def accuracy(self, vp): corr = tf.cast(tf.equal(vd, 0), "float32") # 3) evaluate the accuracy - ac_score = tf.reduce_mean(tf.div(tf.reduce_sum(corr, axis=1), n_values)) + ac_score = tf.reduce_mean(input_tensor=tf.compat.v1.div(tf.reduce_sum(input_tensor=corr, axis=1), n_values)) return ac_score @@ -482,21 +482,21 @@ def rmse(self, vp): """ - with tf.name_scope("re"): + with tf.compat.v1.name_scope("re"): mask = tf.not_equal(self.v, 0) # selects only the rated items n_values = tf.reduce_sum( - tf.cast(mask, "float32"), axis=1 + input_tensor=tf.cast(mask, "float32"), axis=1 ) # number of rated items # evaluate the square difference between the inferred and the input data on the rated items - e = tf.where( - mask, x=tf.squared_difference(self.v, vp), y=tf.zeros_like(self.v) + e = tf.compat.v1.where( + mask, x=tf.math.squared_difference(self.v, vp), y=tf.zeros_like(self.v) ) # evaluate the msre err = tf.sqrt( - tf.reduce_mean(tf.div(tf.reduce_sum(e, axis=1), n_values)) / 2 + tf.reduce_mean(input_tensor=tf.compat.v1.div(tf.reduce_sum(input_tensor=e, axis=1), n_values)) / 2 ) return err @@ -505,7 +505,7 @@ def data_pipeline(self): """Define the data pipeline""" # placeholder for the batch_size - self.batch_size = tf.placeholder(tf.int64) + self.batch_size = tf.compat.v1.placeholder(tf.int64) # Create the data pipeline for faster training self.dataset = tf.data.Dataset.from_tensor_slices(self.vu) @@ -517,7 +517,7 @@ def data_pipeline(self): self.dataset = self.dataset.batch(batch_size=self.batch_size).repeat() # define iterator - self.iter = self.dataset.make_initializable_iterator() + self.iter = tf.compat.v1.data.make_initializable_iterator(self.dataset) self.v = self.iter.get_next() def init_metrics(self): @@ -605,7 +605,7 @@ def generate_graph(self): def init_gpu(self): """Config GPU memory""" - self.config_gpu = tf.ConfigProto( + self.config_gpu = tf.compat.v1.ConfigProto( log_device_placement=True, allow_soft_placement=True ) self.config_gpu.gpu_options.allow_growth = True # dynamic memory allocation @@ -617,10 +617,10 @@ def init_training_session(self, xtr): xtr (numpy.ndarray, int32): The user/affinity matrix for the train set. """ - init_graph = tf.global_variables_initializer() + init_graph = tf.compat.v1.global_variables_initializer() # Start TF training session on default graph - self.sess = tf.Session(config=self.config_gpu) + self.sess = tf.compat.v1.Session(config=self.config_gpu) self.sess.run(init_graph) self.sess.run( @@ -685,7 +685,7 @@ def fit(self, xtr, xtst): m, self.Nvisible = xtr.shape # m= # users, Nvisible= # items num_minibatches = int(m / self.minibatch) # number of minibatches - tf.reset_default_graph() + tf.compat.v1.reset_default_graph() # ----------------------Initializers------------------------------------- self.generate_graph() @@ -724,7 +724,7 @@ def eval_out(self): # sample v phi_h = ( - tf.transpose(tf.matmul(self.w, tf.transpose(h))) + self.bv + tf.transpose(a=tf.matmul(self.w, tf.transpose(a=h))) + self.bv ) # linear combination pvh = self.multinomial_distribution( phi_h diff --git a/recommenders/models/rlrmc/conjugate_gradient_ms.py b/recommenders/models/rlrmc/conjugate_gradient_ms.py index b7376fcb74..23d2cb4d7c 100644 --- a/recommenders/models/rlrmc/conjugate_gradient_ms.py +++ b/recommenders/models/rlrmc/conjugate_gradient_ms.py @@ -1,255 +1,255 @@ -# This code is modified from Pymanopt: Copyright (c) 2015-2016, Pymanopt Developers. All rights reserved. -# Online code of Pymanopt: https://github.com/pymanopt/pymanopt -# Pymanopt is licensed under the BSD 3-Clause "New" or "Revised" License -# Online license link: https://github.com/pymanopt/pymanopt/blob/master/LICENSE - -from __future__ import print_function, division - -import time -from copy import deepcopy - -import numpy as np - -from pymanopt.solvers.linesearch import LineSearchAdaptive -from pymanopt.solvers.solver import Solver -from pymanopt import tools - - -BetaTypes = tools.make_enum( - "BetaTypes", "FletcherReeves PolakRibiere HestenesStiefel HagerZhang".split() -) - - -class ConjugateGradientMS(Solver): - """ - Module containing conjugate gradient algorithm based on - conjugategradient.m from the manopt MATLAB package. - """ - - def __init__( - self, - beta_type=BetaTypes.HestenesStiefel, - orth_value=np.inf, - linesearch=None, - *args, - **kwargs - ): - """Instantiate gradient solver class. - - Args: - beta_type (object): Conjugate gradient beta rule used to construct the new search direction. - orth_value (float): Parameter for Powell's restart strategy. An infinite value disables this strategy. - See in code formula for the specific criterion used. - - linesearch (object): The linesearch method to used. - """ - super(ConjugateGradientMS, self).__init__(*args, **kwargs) - - self._beta_type = beta_type - self._orth_value = orth_value - - if linesearch is None: - self._linesearch = LineSearchAdaptive() - else: - self._linesearch = linesearch # LineSearchBackTracking() - self.linesearch = None - - def solve(self, problem, x=None, reuselinesearch=False, compute_stats=None): - """Perform optimization using nonlinear conjugate gradient method with - linesearch. - - This method first computes the gradient of obj w.r.t. arg, and then - optimizes by moving in a direction that is conjugate to all previous - search directions. - - Args: - problem (object): Pymanopt problem setup using the Problem class, this must - have a .manifold attribute specifying the manifold to optimize - over, as well as a cost and enough information to compute - the gradient of that cost. - x (numpy.ndarray): Optional parameter. Starting point on the manifold. If none - then a starting point will be randomly generated. - reuselinesearch (bool): Whether to reuse the previous linesearch object. Allows to - use information from a previous solve run. - - Returns: - numpy.ndarray: Local minimum of obj, or if algorithm terminated before convergence x will be the point at which it terminated. - """ - man = problem.manifold - verbosity = problem.verbosity - objective = problem.cost - gradient = problem.grad - - if not reuselinesearch or self.linesearch is None: - self.linesearch = deepcopy(self._linesearch) - linesearch = self.linesearch - - if verbosity >= 1: - print("Optimizing...") - if verbosity >= 2: - print(" iter\t\t cost val\t grad. norm") - - # Initialize iteration counter and timer - iter = 0 - stats = {} - # stats = {'iteration': [],'time': [],'objective': [],'trainRMSE': [],'testRMSE': []} - stepsize = np.nan - cumulative_time = 0.0 - - time0 = time.time() - t0 = time.time() - - # If no starting point is specified, generate one at random. - if x is None: - x = man.rand() - - # Calculate initial cost-related quantities - cost = objective(x) - grad = gradient(x) - gradnorm = man.norm(x, grad) - Pgrad = problem.precon(x, grad) - gradPgrad = man.inner(x, grad, Pgrad) - - # Initial descent direction is the negative gradient - desc_dir = -Pgrad - time_iter = time.time() - t0 - cumulative_time += time_iter - - self._start_optlog( - extraiterfields=["gradnorm"], - solverparams={ - "beta_type": self._beta_type, - "orth_value": self._orth_value, - "linesearcher": linesearch, - }, - ) - - while True: - if verbosity >= 2: - print("%5d\t%+.16e\t%.8e" % (iter, cost, gradnorm)) - if compute_stats is not None: - compute_stats(x, [iter, cost, gradnorm, cumulative_time], stats) - - if self._logverbosity >= 2: - self._append_optlog(iter, x, cost, gradnorm=gradnorm) - - t0 = time.time() - # stop_reason = self._check_stopping_criterion( - # time0, gradnorm=gradnorm, iter=iter + 1, stepsize=stepsize) - stop_reason = self._check_stopping_criterion( - time.time() - cumulative_time, - gradnorm=gradnorm, - iter=iter + 1, - stepsize=stepsize, - ) - - if stop_reason: - if verbosity >= 1: - print(stop_reason) - print("") - break - - # The line search algorithms require the directional derivative of - # the cost at the current point x along the search direction. - df0 = man.inner(x, grad, desc_dir) - - # If we didn't get a descent direction: restart, i.e., switch to - # the negative gradient. Equivalent to resetting the CG direction - # to a steepest descent step, which discards the past information. - if df0 >= 0: - # Or we switch to the negative gradient direction. - if verbosity >= 3: - print( - "Conjugate gradient info: got an ascent direction " - "(df0 = %.2f), reset to the (preconditioned) " - "steepest descent direction." % df0 - ) - # Reset to negative gradient: this discards the CG memory. - desc_dir = -Pgrad - df0 = -gradPgrad - - # Execute line search - stepsize, newx = linesearch.search(objective, man, x, desc_dir, cost, df0) - - # Compute the new cost-related quantities for newx - newcost = objective(newx) - newgrad = gradient(newx) - newgradnorm = man.norm(newx, newgrad) - Pnewgrad = problem.precon(newx, newgrad) - newgradPnewgrad = man.inner(newx, newgrad, Pnewgrad) - - # Apply the CG scheme to compute the next search direction - oldgrad = man.transp(x, newx, grad) - orth_grads = man.inner(newx, oldgrad, Pnewgrad) / newgradPnewgrad - - # Powell's restart strategy (see page 12 of Hager and Zhang's - # survey on conjugate gradient methods, for example) - if abs(orth_grads) >= self._orth_value: - beta = 0 - desc_dir = -Pnewgrad - else: - desc_dir = man.transp(x, newx, desc_dir) - - if self._beta_type == BetaTypes.FletcherReeves: - beta = newgradPnewgrad / gradPgrad - elif self._beta_type == BetaTypes.PolakRibiere: - diff = newgrad - oldgrad - ip_diff = man.inner(newx, Pnewgrad, diff) - beta = max(0, ip_diff / gradPgrad) - elif self._beta_type == BetaTypes.HestenesStiefel: - diff = newgrad - oldgrad - ip_diff = man.inner(newx, Pnewgrad, diff) - try: - beta = max(0, ip_diff / man.inner(newx, diff, desc_dir)) - # if ip_diff = man.inner(newx, diff, desc_dir) = 0 - except ZeroDivisionError: - beta = 1 - elif self._beta_type == BetaTypes.HagerZhang: - diff = newgrad - oldgrad - Poldgrad = man.transp(x, newx, Pgrad) - Pdiff = Pnewgrad - Poldgrad - deno = man.inner(newx, diff, desc_dir) - numo = man.inner(newx, diff, Pnewgrad) - numo -= ( - 2 - * man.inner(newx, diff, Pdiff) - * man.inner(newx, desc_dir, newgrad) - / deno - ) - beta = numo / deno - # Robustness (see Hager-Zhang paper mentioned above) - desc_dir_norm = man.norm(newx, desc_dir) - eta_HZ = -1 / (desc_dir_norm * min(0.01, gradnorm)) - beta = max(beta, eta_HZ) - else: - types = ", ".join(["BetaTypes.%s" % t for t in BetaTypes._fields]) - raise ValueError( - "Unknown beta_type %s. Should be one of %s." - % (self._beta_type, types) - ) - - desc_dir = -Pnewgrad + beta * desc_dir - - # Update the necessary variables for the next iteration. - x = newx - cost = newcost - grad = newgrad - Pgrad = Pnewgrad - gradnorm = newgradnorm - gradPgrad = newgradPnewgrad - iter += 1 - time_iter = time.time() - t0 - cumulative_time += time_iter - - if self._logverbosity <= 0: - return x, stats - else: - self._stop_optlog( - x, - cost, - stop_reason, - time0, - stepsize=stepsize, - gradnorm=gradnorm, - iter=iter, - ) - return x, stats, self._optlog +# This code is modified from Pymanopt: Copyright (c) 2015-2016, Pymanopt Developers. All rights reserved. +# Online code of Pymanopt: https://github.com/pymanopt/pymanopt +# Pymanopt is licensed under the BSD 3-Clause "New" or "Revised" License +# Online license link: https://github.com/pymanopt/pymanopt/blob/master/LICENSE + +from __future__ import print_function, division + +import time +from copy import deepcopy + +import numpy as np + +from pymanopt.solvers.linesearch import LineSearchAdaptive +from pymanopt.solvers.solver import Solver +from pymanopt import tools + + +BetaTypes = tools.make_enum( + "BetaTypes", "FletcherReeves PolakRibiere HestenesStiefel HagerZhang".split() +) + + +class ConjugateGradientMS(Solver): + """ + Module containing conjugate gradient algorithm based on + conjugategradient.m from the manopt MATLAB package. + """ + + def __init__( + self, + beta_type=BetaTypes.HestenesStiefel, + orth_value=np.inf, + linesearch=None, + *args, + **kwargs + ): + """Instantiate gradient solver class. + + Args: + beta_type (object): Conjugate gradient beta rule used to construct the new search direction. + orth_value (float): Parameter for Powell's restart strategy. An infinite value disables this strategy. + See in code formula for the specific criterion used. + - linesearch (object): The linesearch method to used. + """ + super(ConjugateGradientMS, self).__init__(*args, **kwargs) + + self._beta_type = beta_type + self._orth_value = orth_value + + if linesearch is None: + self._linesearch = LineSearchAdaptive() + else: + self._linesearch = linesearch # LineSearchBackTracking() + self.linesearch = None + + def solve(self, problem, x=None, reuselinesearch=False, compute_stats=None): + """Perform optimization using nonlinear conjugate gradient method with + linesearch. + + This method first computes the gradient of obj w.r.t. arg, and then + optimizes by moving in a direction that is conjugate to all previous + search directions. + + Args: + problem (object): Pymanopt problem setup using the Problem class, this must + have a .manifold attribute specifying the manifold to optimize + over, as well as a cost and enough information to compute + the gradient of that cost. + x (numpy.ndarray): Optional parameter. Starting point on the manifold. If none + then a starting point will be randomly generated. + reuselinesearch (bool): Whether to reuse the previous linesearch object. Allows to + use information from a previous solve run. + + Returns: + numpy.ndarray: Local minimum of obj, or if algorithm terminated before convergence x will be the point at which it terminated. + """ + man = problem.manifold + verbosity = problem.verbosity + objective = problem.cost + gradient = problem.grad + + if not reuselinesearch or self.linesearch is None: + self.linesearch = deepcopy(self._linesearch) + linesearch = self.linesearch + + if verbosity >= 1: + print("Optimizing...") + if verbosity >= 2: + print(" iter\t\t cost val\t grad. norm") + + # Initialize iteration counter and timer + iter = 0 + stats = {} + # stats = {'iteration': [],'time': [],'objective': [],'trainRMSE': [],'testRMSE': []} + stepsize = np.nan + cumulative_time = 0.0 + + time0 = time.time() + t0 = time.time() + + # If no starting point is specified, generate one at random. + if x is None: + x = man.rand() + + # Calculate initial cost-related quantities + cost = objective(x) + grad = gradient(x) + gradnorm = man.norm(x, grad) + Pgrad = problem.precon(x, grad) + gradPgrad = man.inner(x, grad, Pgrad) + + # Initial descent direction is the negative gradient + desc_dir = -Pgrad + time_iter = time.time() - t0 + cumulative_time += time_iter + + self._start_optlog( + extraiterfields=["gradnorm"], + solverparams={ + "beta_type": self._beta_type, + "orth_value": self._orth_value, + "linesearcher": linesearch, + }, + ) + + while True: + if verbosity >= 2: + print("%5d\t%+.16e\t%.8e" % (iter, cost, gradnorm)) + if compute_stats is not None: + compute_stats(x, [iter, cost, gradnorm, cumulative_time], stats) + + if self._logverbosity >= 2: + self._append_optlog(iter, x, cost, gradnorm=gradnorm) + + t0 = time.time() + # stop_reason = self._check_stopping_criterion( + # time0, gradnorm=gradnorm, iter=iter + 1, stepsize=stepsize) + stop_reason = self._check_stopping_criterion( + time.time() - cumulative_time, + gradnorm=gradnorm, + iter=iter + 1, + stepsize=stepsize, + ) + + if stop_reason: + if verbosity >= 1: + print(stop_reason) + print("") + break + + # The line search algorithms require the directional derivative of + # the cost at the current point x along the search direction. + df0 = man.inner(x, grad, desc_dir) + + # If we didn't get a descent direction: restart, i.e., switch to + # the negative gradient. Equivalent to resetting the CG direction + # to a steepest descent step, which discards the past information. + if df0 >= 0: + # Or we switch to the negative gradient direction. + if verbosity >= 3: + print( + "Conjugate gradient info: got an ascent direction " + "(df0 = %.2f), reset to the (preconditioned) " + "steepest descent direction." % df0 + ) + # Reset to negative gradient: this discards the CG memory. + desc_dir = -Pgrad + df0 = -gradPgrad + + # Execute line search + stepsize, newx = linesearch.search(objective, man, x, desc_dir, cost, df0) + + # Compute the new cost-related quantities for newx + newcost = objective(newx) + newgrad = gradient(newx) + newgradnorm = man.norm(newx, newgrad) + Pnewgrad = problem.precon(newx, newgrad) + newgradPnewgrad = man.inner(newx, newgrad, Pnewgrad) + + # Apply the CG scheme to compute the next search direction + oldgrad = man.transp(x, newx, grad) + orth_grads = man.inner(newx, oldgrad, Pnewgrad) / newgradPnewgrad + + # Powell's restart strategy (see page 12 of Hager and Zhang's + # survey on conjugate gradient methods, for example) + if abs(orth_grads) >= self._orth_value: + beta = 0 + desc_dir = -Pnewgrad + else: + desc_dir = man.transp(x, newx, desc_dir) + + if self._beta_type == BetaTypes.FletcherReeves: + beta = newgradPnewgrad / gradPgrad + elif self._beta_type == BetaTypes.PolakRibiere: + diff = newgrad - oldgrad + ip_diff = man.inner(newx, Pnewgrad, diff) + beta = max(0, ip_diff / gradPgrad) + elif self._beta_type == BetaTypes.HestenesStiefel: + diff = newgrad - oldgrad + ip_diff = man.inner(newx, Pnewgrad, diff) + try: + beta = max(0, ip_diff / man.inner(newx, diff, desc_dir)) + # if ip_diff = man.inner(newx, diff, desc_dir) = 0 + except ZeroDivisionError: + beta = 1 + elif self._beta_type == BetaTypes.HagerZhang: + diff = newgrad - oldgrad + Poldgrad = man.transp(x, newx, Pgrad) + Pdiff = Pnewgrad - Poldgrad + deno = man.inner(newx, diff, desc_dir) + numo = man.inner(newx, diff, Pnewgrad) + numo -= ( + 2 + * man.inner(newx, diff, Pdiff) + * man.inner(newx, desc_dir, newgrad) + / deno + ) + beta = numo / deno + # Robustness (see Hager-Zhang paper mentioned above) + desc_dir_norm = man.norm(newx, desc_dir) + eta_HZ = -1 / (desc_dir_norm * min(0.01, gradnorm)) + beta = max(beta, eta_HZ) + else: + types = ", ".join(["BetaTypes.%s" % t for t in BetaTypes._fields]) + raise ValueError( + "Unknown beta_type %s. Should be one of %s." + % (self._beta_type, types) + ) + + desc_dir = -Pnewgrad + beta * desc_dir + + # Update the necessary variables for the next iteration. + x = newx + cost = newcost + grad = newgrad + Pgrad = Pnewgrad + gradnorm = newgradnorm + gradPgrad = newgradPnewgrad + iter += 1 + time_iter = time.time() - t0 + cumulative_time += time_iter + + if self._logverbosity <= 0: + return x, stats + else: + self._stop_optlog( + x, + cost, + stop_reason, + time0, + stepsize=stepsize, + gradnorm=gradnorm, + iter=iter, + ) + return x, stats, self._optlog diff --git a/recommenders/models/vae/multinomial_vae.py b/recommenders/models/vae/multinomial_vae.py index 2aabe017e1..936f47f579 100644 --- a/recommenders/models/vae/multinomial_vae.py +++ b/recommenders/models/vae/multinomial_vae.py @@ -287,8 +287,8 @@ def _create_model(self): self.h = Dense( self.intermediate_dim, activation="tanh", - kernel_initializer=tf.keras.initializers.glorot_uniform(seed=self.seed), - bias_initializer=tf.keras.initializers.truncated_normal( + kernel_initializer=tf.compat.v1.keras.initializers.glorot_uniform(seed=self.seed), + bias_initializer=tf.compat.v1.keras.initializers.truncated_normal( stddev=0.001, seed=self.seed ), )(self.dropout_encoder) @@ -304,8 +304,8 @@ def _create_model(self): self.h_decoder = Dense( self.intermediate_dim, activation="tanh", - kernel_initializer=tf.keras.initializers.glorot_uniform(seed=self.seed), - bias_initializer=tf.keras.initializers.truncated_normal( + kernel_initializer=tf.compat.v1.keras.initializers.glorot_uniform(seed=self.seed), + bias_initializer=tf.compat.v1.keras.initializers.truncated_normal( stddev=0.001, seed=self.seed ), ) @@ -325,7 +325,7 @@ def _create_model(self): def _get_vae_loss(self, x, x_bar): """Calculate negative ELBO (NELBO).""" log_softmax_var = tf.nn.log_softmax(x_bar) - self.neg_ll = -tf.reduce_mean(tf.reduce_sum(log_softmax_var * x, axis=-1)) + self.neg_ll = -tf.reduce_mean(input_tensor=tf.reduce_sum(input_tensor=log_softmax_var * x, axis=-1)) a = tf.keras.backend.print_tensor(self.neg_ll) # calculate positive Kullback–Leibler divergence divergence term kl_loss = K.mean( diff --git a/recommenders/models/wide_deep/wide_deep_utils.py b/recommenders/models/wide_deep/wide_deep_utils.py index bc32cdb79e..9443deaa99 100644 --- a/recommenders/models/wide_deep/wide_deep_utils.py +++ b/recommenders/models/wide_deep/wide_deep_utils.py @@ -169,24 +169,24 @@ def build_model( ) if len(wide_columns) > 0 and len(deep_columns) == 0: - model = tf.estimator.LinearRegressor( + model = tf.compat.v1.estimator.LinearRegressor( model_dir=model_dir, config=config, feature_columns=wide_columns, - optimizer=linear_optimizer, + optimizer=linear_optimizer ) elif len(wide_columns) == 0 and len(deep_columns) > 0: - model = tf.estimator.DNNRegressor( + model = tf.compat.v1.estimator.DNNRegressor( model_dir=model_dir, config=config, feature_columns=deep_columns, hidden_units=dnn_hidden_units, optimizer=dnn_optimizer, dropout=dnn_dropout, - batch_norm=dnn_batch_norm, + batch_norm=dnn_batch_norm ) elif len(wide_columns) > 0 and len(deep_columns) > 0: - model = tf.estimator.DNNLinearCombinedRegressor( + model = tf.compat.v1.estimator.DNNLinearCombinedRegressor( model_dir=model_dir, config=config, # wide settings @@ -197,7 +197,7 @@ def build_model( dnn_hidden_units=dnn_hidden_units, dnn_optimizer=dnn_optimizer, dnn_dropout=dnn_dropout, - batch_norm=dnn_batch_norm, + batch_norm=dnn_batch_norm ) else: raise ValueError( diff --git a/recommenders/tuning/nni/nni_utils.py b/recommenders/tuning/nni/nni_utils.py index 474c1f7a26..bf8de9b5d2 100644 --- a/recommenders/tuning/nni/nni_utils.py +++ b/recommenders/tuning/nni/nni_utils.py @@ -154,4 +154,3 @@ def start_nni(config_path, wait=WAITING_TIME, max_retries=MAX_RETRIES): raise RuntimeError("'nnictl create' failed with code %d" % proc.returncode) check_experiment_status(wait=wait, max_retries=max_retries) - \ No newline at end of file diff --git a/recommenders/utils/k8s_utils.py b/recommenders/utils/k8s_utils.py index 3810d7bdcb..5f6b3791c9 100644 --- a/recommenders/utils/k8s_utils.py +++ b/recommenders/utils/k8s_utils.py @@ -1,81 +1,81 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -from math import ceil, floor -import logging - -logger = logging.getLogger(__name__) - - -def qps_to_replicas( - target_qps, processing_time, max_qp_replica=1, target_utilization=0.7 -): - """Provide a rough estimate of the number of replicas to support a given - load (queries per second) - - Args: - target_qps (int): target queries per second that you want to support - processing_time (float): the estimated amount of time (in seconds) - your service call takes - max_qp_replica (int): maximum number of concurrent queries per replica - target_utilization (float): proportion of CPU utilization you think is ideal - - Returns: - int: Number of estimated replicas required to support a target number of queries per second. - """ - concurrent_queries = target_qps * processing_time / target_utilization - replicas = ceil(concurrent_queries / max_qp_replica) - logger.info( - "Approximately {} replicas are estimated to support {} queries per second.".format( - replicas, target_qps - ) - ) - return replicas - - -def replicas_to_qps( - num_replicas, processing_time, max_qp_replica=1, target_utilization=0.7 -): - """Provide a rough estimate of the queries per second supported by a number of replicas - - Args: - num_replicas (int): number of replicas - processing_time (float): the estimated amount of time (in seconds) your service call takes - max_qp_replica (int): maximum number of concurrent queries per replica - target_utilization (float): proportion of CPU utilization you think is ideal - - Returns: - int: queries per second supported by the number of replicas - """ - qps = floor(num_replicas * max_qp_replica * target_utilization / processing_time) - logger.info( - "Approximately {} queries per second are supported by {} replicas.".format( - qps, num_replicas - ) - ) - return qps - - -def nodes_to_replicas(n_cores_per_node, n_nodes=3, cpu_cores_per_replica=0.1): - """Provide a rough estimate of the number of replicas supported by a - given number of nodes with n_cores_per_node cores each - - Args: - n_cores_per_node (int): Total number of cores per node within an AKS - cluster that you want to use - n_nodes (int): Number of nodes (i.e. VMs) used in the AKS cluster - cpu_cores_per_replica (float): Cores assigned to each replica. This - can be fractional and corresponds to the - cpu_cores argument passed to AksWebservice.deploy_configuration() - - Returns: - int: Total number of replicas supported by the configuration - """ - n_cores_avail = (n_cores_per_node - 0.5) * n_nodes - 4.45 - replicas = floor(n_cores_avail / cpu_cores_per_replica) - logger.info( - "Approximately {} replicas are supported by {} nodes with {} cores each.".format( - replicas, n_nodes, n_cores_per_node - ) - ) - return replicas +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +from math import ceil, floor +import logging + +logger = logging.getLogger(__name__) + + +def qps_to_replicas( + target_qps, processing_time, max_qp_replica=1, target_utilization=0.7 +): + """Provide a rough estimate of the number of replicas to support a given + load (queries per second) + + Args: + target_qps (int): target queries per second that you want to support + processing_time (float): the estimated amount of time (in seconds) + your service call takes + max_qp_replica (int): maximum number of concurrent queries per replica + target_utilization (float): proportion of CPU utilization you think is ideal + + Returns: + int: Number of estimated replicas required to support a target number of queries per second. + """ + concurrent_queries = target_qps * processing_time / target_utilization + replicas = ceil(concurrent_queries / max_qp_replica) + logger.info( + "Approximately {} replicas are estimated to support {} queries per second.".format( + replicas, target_qps + ) + ) + return replicas + + +def replicas_to_qps( + num_replicas, processing_time, max_qp_replica=1, target_utilization=0.7 +): + """Provide a rough estimate of the queries per second supported by a number of replicas + + Args: + num_replicas (int): number of replicas + processing_time (float): the estimated amount of time (in seconds) your service call takes + max_qp_replica (int): maximum number of concurrent queries per replica + target_utilization (float): proportion of CPU utilization you think is ideal + + Returns: + int: queries per second supported by the number of replicas + """ + qps = floor(num_replicas * max_qp_replica * target_utilization / processing_time) + logger.info( + "Approximately {} queries per second are supported by {} replicas.".format( + qps, num_replicas + ) + ) + return qps + + +def nodes_to_replicas(n_cores_per_node, n_nodes=3, cpu_cores_per_replica=0.1): + """Provide a rough estimate of the number of replicas supported by a + given number of nodes with n_cores_per_node cores each + + Args: + n_cores_per_node (int): Total number of cores per node within an AKS + cluster that you want to use + n_nodes (int): Number of nodes (i.e. VMs) used in the AKS cluster + cpu_cores_per_replica (float): Cores assigned to each replica. This + can be fractional and corresponds to the + cpu_cores argument passed to AksWebservice.deploy_configuration() + + Returns: + int: Total number of replicas supported by the configuration + """ + n_cores_avail = (n_cores_per_node - 0.5) * n_nodes - 4.45 + replicas = floor(n_cores_avail / cpu_cores_per_replica) + logger.info( + "Approximately {} replicas are supported by {} nodes with {} cores each.".format( + replicas, n_nodes, n_cores_per_node + ) + ) + return replicas diff --git a/recommenders/utils/tf_utils.py b/recommenders/utils/tf_utils.py index 156cfb1853..c744e8fb46 100644 --- a/recommenders/utils/tf_utils.py +++ b/recommenders/utils/tf_utils.py @@ -10,13 +10,13 @@ OPTIMIZERS = dict( - adadelta=tf.train.AdadeltaOptimizer, - adagrad=tf.train.AdagradOptimizer, - adam=tf.train.AdamOptimizer, - ftrl=tf.train.FtrlOptimizer, - momentum=tf.train.MomentumOptimizer, - rmsprop=tf.train.RMSPropOptimizer, - sgd=tf.train.GradientDescentOptimizer, + adadelta=tf.compat.v1.train.AdadeltaOptimizer, + adagrad=tf.compat.v1.train.AdagradOptimizer, + adam=tf.compat.v1.train.AdamOptimizer, + ftrl=tf.compat.v1.train.FtrlOptimizer, + momentum=tf.compat.v1.train.MomentumOptimizer, + rmsprop=tf.compat.v1.train.RMSPropOptimizer, + sgd=tf.compat.v1.train.GradientDescentOptimizer, ) @@ -165,7 +165,7 @@ def export_model(model, train_input_fn, eval_input_fn, tf_feat_cols, base_dir): Returns: str: Exported model path """ - tf.logging.set_verbosity(tf.logging.ERROR) + tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR) train_rcvr_fn = ( tf.contrib.estimator.build_supervised_input_receiver_fn_from_input_fn( train_input_fn @@ -244,7 +244,7 @@ def evaluation_log_hook( ) -class _TrainLogHook(tf.train.SessionRunHook): +class _TrainLogHook(tf.estimator.SessionRunHook): def __init__( self, estimator, @@ -276,15 +276,15 @@ def __init__( def begin(self): if self.model_dir is not None: - self.summary_writer = tf.summary.FileWriterCache.get(self.model_dir) - self.global_step_tensor = tf.train.get_or_create_global_step() + self.summary_writer = tf.compat.v1.summary.FileWriterCache.get(self.model_dir) + self.global_step_tensor = tf.compat.v1.train.get_or_create_global_step() else: self.step = 0 def before_run(self, run_context): if self.global_step_tensor is not None: requests = {"global_step": self.global_step_tensor} - return tf.train.SessionRunArgs(requests) + return tf.estimator.SessionRunArgs(requests) else: return None @@ -295,8 +295,8 @@ def after_run(self, run_context, run_values): self.step += 1 if self.step % self.every_n_iter == 0: - _prev_log_level = tf.logging.get_verbosity() - tf.logging.set_verbosity(tf.logging.ERROR) + _prev_log_level = tf.compat.v1.logging.get_verbosity() + tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR) if self.eval_fns is None: result = self.model.evaluate( @@ -322,7 +322,7 @@ def after_run(self, run_context, run_values): result = fn(self.true_df, prediction_df, **self.eval_kwargs) self._log(fn.__name__, result) - tf.logging.set_verbosity(_prev_log_level) + tf.compat.v1.logging.set_verbosity(_prev_log_level) def end(self, session): if self.summary_writer is not None: @@ -331,7 +331,7 @@ def end(self, session): def _log(self, tag, value): self.logger.log(tag, value) if self.summary_writer is not None: - summary = tf.Summary(value=[tf.Summary.Value(tag=tag, simple_value=value)]) + summary = tf.compat.v1.Summary(value=[tf.compat.v1.Summary.Value(tag=tag, simple_value=value)]) self.summary_writer.add_summary(summary, self.step) diff --git a/tests/integration/recommenders/datasets/test_movielens.py b/tests/integration/recommenders/datasets/test_movielens.py index 6428e34264..1891d6b2f1 100644 --- a/tests/integration/recommenders/datasets/test_movielens.py +++ b/tests/integration/recommenders/datasets/test_movielens.py @@ -1,289 +1,289 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import os -import pytest -from recommenders.datasets.movielens import ( - load_pandas_df, - load_spark_df, - load_item_df, - download_movielens, - extract_movielens, -) - -try: - from pyspark.sql.types import ( - StructType, - StructField, - IntegerType, - StringType, - FloatType, - DoubleType, - ) - from pyspark.sql.functions import col -except ImportError: - pass # skip this import if we are in pure python environment - - -@pytest.mark.integration -@pytest.mark.parametrize( - "size, num_samples, num_movies, movie_example, title_example, genres_example, year_example", - [ - ( - "1m", - 1000209, - 3883, - 1, - "Toy Story (1995)", - "Animation|Children's|Comedy", - "1995", - ), - ( - "10m", - 10000054, - 10681, - 1, - "Toy Story (1995)", - "Adventure|Animation|Children|Comedy|Fantasy", - "1995", - ), - ( - "20m", - 20000263, - 27278, - 1, - "Toy Story (1995)", - "Adventure|Animation|Children|Comedy|Fantasy", - "1995", - ), - ], -) -def test_load_pandas_df( - size, - num_samples, - num_movies, - movie_example, - title_example, - genres_example, - year_example, - tmp, -): - """Test MovieLens dataset load as pd.DataFrame""" - # Test if correct data are loaded - header = ["a", "b", "c"] - df = load_pandas_df(size=size, local_cache_path=tmp, header=header) - assert len(df) == num_samples - assert len(df.columns) == len(header) - # Test if raw-zip file, rating file, and item file are cached - assert len(os.listdir(tmp)) == 3 - - # Test title, genres, and released year load - header = ["a", "b", "c", "d", "e"] - with pytest.warns(Warning): - df = load_pandas_df( - size=size, - header=header, - local_cache_path=tmp, - title_col="Title", - genres_col="Genres", - year_col="Year", - ) - assert len(df) == num_samples - assert ( - len(df.columns) == 7 - ) # 4 header columns (user, item, rating, timestamp) and 3 feature columns - assert "e" not in df.columns # only the first 4 header columns are used - # Get two records of the same items and check if the item-features are the same. - head = df.loc[df["b"] == movie_example][:2] - title = head["Title"].values - assert title[0] == title[1] - assert title[0] == title_example - genres = head["Genres"].values - assert genres[0] == genres[1] - assert genres[0] == genres_example - year = head["Year"].values - assert year[0] == year[1] - assert year[0] == year_example - - # Test default arguments - df = load_pandas_df(size) - assert len(df) == num_samples - # user, item, rating and timestamp - assert len(df.columns) == 4 - - -@pytest.mark.integration -@pytest.mark.parametrize( - "size, num_movies, movie_example, title_example, genres_example, year_example", - [ - ("1m", 3883, 1, "Toy Story (1995)", "Animation|Children's|Comedy", "1995"), - ( - "10m", - 10681, - 1, - "Toy Story (1995)", - "Adventure|Animation|Children|Comedy|Fantasy", - "1995", - ), - ( - "20m", - 27278, - 1, - "Toy Story (1995)", - "Adventure|Animation|Children|Comedy|Fantasy", - "1995", - ), - ], -) -def test_load_item_df( - size, - num_movies, - movie_example, - title_example, - genres_example, - year_example, - tmp, -): - """Test movielens item data load (not rating data)""" - df = load_item_df(size, local_cache_path=tmp, title_col="title") - assert len(df) == num_movies - # movie_col and title_col should be loaded - assert len(df.columns) == 2 - assert df["title"][0] == title_example - - # Test title and genres - df = load_item_df( - size, - local_cache_path=tmp, - movie_col="item", - genres_col="genres", - year_col="year", - ) - assert len(df) == num_movies - # movile_col, genres_col and year_col - assert len(df.columns) == 3 - - assert df["item"][0] == movie_example - assert df["genres"][0] == genres_example - assert df["year"][0] == year_example - - -@pytest.mark.integration -@pytest.mark.spark -@pytest.mark.parametrize( - "size, num_samples, num_movies, movie_example, title_example, genres_example, year_example", - [ - ( - "1m", - 1000209, - 3883, - 1, - "Toy Story (1995)", - "Animation|Children's|Comedy", - "1995", - ), - ( - "10m", - 10000054, - 10681, - 1, - "Toy Story (1995)", - "Adventure|Animation|Children|Comedy|Fantasy", - "1995", - ), - ( - "20m", - 20000263, - 27278, - 1, - "Toy Story (1995)", - "Adventure|Animation|Children|Comedy|Fantasy", - "1995", - ), - ], -) -def test_load_spark_df( - size, - num_samples, - num_movies, - movie_example, - title_example, - genres_example, - year_example, - tmp, - spark, -): - """Test MovieLens dataset load into pySpark.DataFrame""" - - # Test if correct data are loaded - header = ["1", "2", "3"] - schema = StructType( - [ - StructField("u", IntegerType()), - StructField("m", IntegerType()), - ] - ) - with pytest.warns(Warning): - df = load_spark_df( - spark, size=size, local_cache_path=tmp, header=header, schema=schema - ) - assert df.count() == num_samples - # Test if schema is used when both schema and header are provided - assert len(df.columns) == len(schema) - # Test if raw-zip file, rating file, and item file are cached - assert len(os.listdir(tmp)) == 3 - - # Test title, genres, and released year load - header = ["a", "b", "c", "d", "e"] - with pytest.warns(Warning): - df = load_spark_df( - spark, - size=size, - local_cache_path=tmp, - header=header, - title_col="Title", - genres_col="Genres", - year_col="Year", - ) - assert df.count() == num_samples - assert ( - len(df.columns) == 7 - ) # 4 header columns (user, item, rating, timestamp) and 3 feature columns - assert "e" not in df.columns # only the first 4 header columns are used - # Get two records of the same items and check if the item-features are the same. - head = df.filter(col("b") == movie_example).limit(2) - title = head.select("Title").collect() - assert title[0][0] == title[1][0] - assert title[0][0] == title_example - genres = head.select("Genres").collect() - assert genres[0][0] == genres[1][0] - assert genres[0][0] == genres_example - year = head.select("Year").collect() - assert year[0][0] == year[1][0] - assert year[0][0] == year_example - - # Test default arguments - df = load_spark_df(spark, size) - assert df.count() == num_samples - # user, item, rating and timestamp - assert len(df.columns) == 4 - - -@pytest.mark.integration -@pytest.mark.parametrize("size", ["1m", "10m", "20m"]) -def test_download_and_extract_movielens(size, tmp): - """Test movielens data download and extract""" - zip_path = os.path.join(tmp, "ml.zip") - download_movielens(size, dest_path=zip_path) - assert len(os.listdir(tmp)) == 1 - assert os.path.exists(zip_path) - - rating_path = os.path.join(tmp, "rating.dat") - item_path = os.path.join(tmp, "item.dat") - extract_movielens( - size, rating_path=rating_path, item_path=item_path, zip_path=zip_path - ) - # Test if raw-zip file, rating file, and item file are cached - assert len(os.listdir(tmp)) == 3 - assert os.path.exists(rating_path) - assert os.path.exists(item_path) +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import os +import pytest +from recommenders.datasets.movielens import ( + load_pandas_df, + load_spark_df, + load_item_df, + download_movielens, + extract_movielens, +) + +try: + from pyspark.sql.types import ( + StructType, + StructField, + IntegerType, + StringType, + FloatType, + DoubleType, + ) + from pyspark.sql.functions import col +except ImportError: + pass # skip this import if we are in pure python environment + + +@pytest.mark.integration +@pytest.mark.parametrize( + "size, num_samples, num_movies, movie_example, title_example, genres_example, year_example", + [ + ( + "1m", + 1000209, + 3883, + 1, + "Toy Story (1995)", + "Animation|Children's|Comedy", + "1995", + ), + ( + "10m", + 10000054, + 10681, + 1, + "Toy Story (1995)", + "Adventure|Animation|Children|Comedy|Fantasy", + "1995", + ), + ( + "20m", + 20000263, + 27278, + 1, + "Toy Story (1995)", + "Adventure|Animation|Children|Comedy|Fantasy", + "1995", + ), + ], +) +def test_load_pandas_df( + size, + num_samples, + num_movies, + movie_example, + title_example, + genres_example, + year_example, + tmp, +): + """Test MovieLens dataset load as pd.DataFrame""" + # Test if correct data are loaded + header = ["a", "b", "c"] + df = load_pandas_df(size=size, local_cache_path=tmp, header=header) + assert len(df) == num_samples + assert len(df.columns) == len(header) + # Test if raw-zip file, rating file, and item file are cached + assert len(os.listdir(tmp)) == 3 + + # Test title, genres, and released year load + header = ["a", "b", "c", "d", "e"] + with pytest.warns(Warning): + df = load_pandas_df( + size=size, + header=header, + local_cache_path=tmp, + title_col="Title", + genres_col="Genres", + year_col="Year", + ) + assert len(df) == num_samples + assert ( + len(df.columns) == 7 + ) # 4 header columns (user, item, rating, timestamp) and 3 feature columns + assert "e" not in df.columns # only the first 4 header columns are used + # Get two records of the same items and check if the item-features are the same. + head = df.loc[df["b"] == movie_example][:2] + title = head["Title"].values + assert title[0] == title[1] + assert title[0] == title_example + genres = head["Genres"].values + assert genres[0] == genres[1] + assert genres[0] == genres_example + year = head["Year"].values + assert year[0] == year[1] + assert year[0] == year_example + + # Test default arguments + df = load_pandas_df(size) + assert len(df) == num_samples + # user, item, rating and timestamp + assert len(df.columns) == 4 + + +@pytest.mark.integration +@pytest.mark.parametrize( + "size, num_movies, movie_example, title_example, genres_example, year_example", + [ + ("1m", 3883, 1, "Toy Story (1995)", "Animation|Children's|Comedy", "1995"), + ( + "10m", + 10681, + 1, + "Toy Story (1995)", + "Adventure|Animation|Children|Comedy|Fantasy", + "1995", + ), + ( + "20m", + 27278, + 1, + "Toy Story (1995)", + "Adventure|Animation|Children|Comedy|Fantasy", + "1995", + ), + ], +) +def test_load_item_df( + size, + num_movies, + movie_example, + title_example, + genres_example, + year_example, + tmp, +): + """Test movielens item data load (not rating data)""" + df = load_item_df(size, local_cache_path=tmp, title_col="title") + assert len(df) == num_movies + # movie_col and title_col should be loaded + assert len(df.columns) == 2 + assert df["title"][0] == title_example + + # Test title and genres + df = load_item_df( + size, + local_cache_path=tmp, + movie_col="item", + genres_col="genres", + year_col="year", + ) + assert len(df) == num_movies + # movile_col, genres_col and year_col + assert len(df.columns) == 3 + + assert df["item"][0] == movie_example + assert df["genres"][0] == genres_example + assert df["year"][0] == year_example + + +@pytest.mark.integration +@pytest.mark.spark +@pytest.mark.parametrize( + "size, num_samples, num_movies, movie_example, title_example, genres_example, year_example", + [ + ( + "1m", + 1000209, + 3883, + 1, + "Toy Story (1995)", + "Animation|Children's|Comedy", + "1995", + ), + ( + "10m", + 10000054, + 10681, + 1, + "Toy Story (1995)", + "Adventure|Animation|Children|Comedy|Fantasy", + "1995", + ), + ( + "20m", + 20000263, + 27278, + 1, + "Toy Story (1995)", + "Adventure|Animation|Children|Comedy|Fantasy", + "1995", + ), + ], +) +def test_load_spark_df( + size, + num_samples, + num_movies, + movie_example, + title_example, + genres_example, + year_example, + tmp, + spark, +): + """Test MovieLens dataset load into pySpark.DataFrame""" + + # Test if correct data are loaded + header = ["1", "2", "3"] + schema = StructType( + [ + StructField("u", IntegerType()), + StructField("m", IntegerType()), + ] + ) + with pytest.warns(Warning): + df = load_spark_df( + spark, size=size, local_cache_path=tmp, header=header, schema=schema + ) + assert df.count() == num_samples + # Test if schema is used when both schema and header are provided + assert len(df.columns) == len(schema) + # Test if raw-zip file, rating file, and item file are cached + assert len(os.listdir(tmp)) == 3 + + # Test title, genres, and released year load + header = ["a", "b", "c", "d", "e"] + with pytest.warns(Warning): + df = load_spark_df( + spark, + size=size, + local_cache_path=tmp, + header=header, + title_col="Title", + genres_col="Genres", + year_col="Year", + ) + assert df.count() == num_samples + assert ( + len(df.columns) == 7 + ) # 4 header columns (user, item, rating, timestamp) and 3 feature columns + assert "e" not in df.columns # only the first 4 header columns are used + # Get two records of the same items and check if the item-features are the same. + head = df.filter(col("b") == movie_example).limit(2) + title = head.select("Title").collect() + assert title[0][0] == title[1][0] + assert title[0][0] == title_example + genres = head.select("Genres").collect() + assert genres[0][0] == genres[1][0] + assert genres[0][0] == genres_example + year = head.select("Year").collect() + assert year[0][0] == year[1][0] + assert year[0][0] == year_example + + # Test default arguments + df = load_spark_df(spark, size) + assert df.count() == num_samples + # user, item, rating and timestamp + assert len(df.columns) == 4 + + +@pytest.mark.integration +@pytest.mark.parametrize("size", ["1m", "10m", "20m"]) +def test_download_and_extract_movielens(size, tmp): + """Test movielens data download and extract""" + zip_path = os.path.join(tmp, "ml.zip") + download_movielens(size, dest_path=zip_path) + assert len(os.listdir(tmp)) == 1 + assert os.path.exists(zip_path) + + rating_path = os.path.join(tmp, "rating.dat") + item_path = os.path.join(tmp, "item.dat") + extract_movielens( + size, rating_path=rating_path, item_path=item_path, zip_path=zip_path + ) + # Test if raw-zip file, rating file, and item file are cached + assert len(os.listdir(tmp)) == 3 + assert os.path.exists(rating_path) + assert os.path.exists(item_path) diff --git a/tests/smoke/recommenders/dataset/test_movielens.py b/tests/smoke/recommenders/dataset/test_movielens.py index fdab5beebd..58605bc558 100644 --- a/tests/smoke/recommenders/dataset/test_movielens.py +++ b/tests/smoke/recommenders/dataset/test_movielens.py @@ -1,235 +1,235 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import os -import pytest -from recommenders.datasets.movielens import ( - load_pandas_df, - load_spark_df, - load_item_df, - download_movielens, - extract_movielens, -) - -try: - from pyspark.sql.types import ( - StructType, - StructField, - IntegerType, - StringType, - FloatType, - DoubleType, - ) - from pyspark.sql.functions import col -except ImportError: - pass # skip this import if we are in pure python environment - - -@pytest.mark.smoke -@pytest.mark.parametrize( - "size, num_samples, num_movies, movie_example, title_example, genres_example, year_example", - [ - ( - "100k", - 100000, - 1682, - 1, - "Toy Story (1995)", - "Animation|Children's|Comedy", - "1995", - ) - ], -) -def test_load_pandas_df( - size, - num_samples, - num_movies, - movie_example, - title_example, - genres_example, - year_example, - tmp, -): - """Test MovieLens dataset load as pd.DataFrame""" - # Test if correct data are loaded - header = ["a", "b", "c"] - df = load_pandas_df(size=size, local_cache_path=tmp, header=header) - assert len(df) == num_samples - assert len(df.columns) == len(header) - # Test if raw-zip file, rating file, and item file are cached - assert len(os.listdir(tmp)) == 3 - - # Test title, genres, and released year load - header = ["a", "b", "c", "d", "e"] - with pytest.warns(Warning): - df = load_pandas_df( - size=size, - header=header, - local_cache_path=tmp, - title_col="Title", - genres_col="Genres", - year_col="Year", - ) - assert len(df) == num_samples - assert ( - len(df.columns) == 7 - ) # 4 header columns (user, item, rating, timestamp) and 3 feature columns - assert "e" not in df.columns # only the first 4 header columns are used - # Get two records of the same items and check if the item-features are the same. - head = df.loc[df["b"] == movie_example][:2] - title = head["Title"].values - assert title[0] == title[1] - assert title[0] == title_example - genres = head["Genres"].values - assert genres[0] == genres[1] - assert genres[0] == genres_example - year = head["Year"].values - assert year[0] == year[1] - assert year[0] == year_example - - # Test default arguments - df = load_pandas_df(size) - assert len(df) == num_samples - # user, item, rating and timestamp - assert len(df.columns) == 4 - - -@pytest.mark.smoke -@pytest.mark.parametrize( - "size, num_movies, movie_example, title_example, genres_example, year_example", - [("100k", 1682, 1, "Toy Story (1995)", "Animation|Children's|Comedy", "1995")], -) -def test_load_item_df( - size, - num_movies, - movie_example, - title_example, - genres_example, - year_example, - tmp, -): - """Test movielens item data load (not rating data)""" - df = load_item_df(size, local_cache_path=tmp, title_col="title") - assert len(df) == num_movies - # movie_col and title_col should be loaded - assert len(df.columns) == 2 - assert df["title"][0] == title_example - - # Test title and genres - df = load_item_df( - size, - local_cache_path=tmp, - movie_col="item", - genres_col="genres", - year_col="year", - ) - assert len(df) == num_movies - # movile_col, genres_col and year_col - assert len(df.columns) == 3 - - assert df["item"][0] == movie_example - assert df["genres"][0] == genres_example - assert df["year"][0] == year_example - - -@pytest.mark.smoke -@pytest.mark.spark -@pytest.mark.parametrize( - "size, num_samples, num_movies, movie_example, title_example, genres_example, year_example", - [ - ( - "100k", - 100000, - 1682, - 1, - "Toy Story (1995)", - "Animation|Children's|Comedy", - "1995", - ) - ], -) -def test_load_spark_df( - size, - num_samples, - num_movies, - movie_example, - title_example, - genres_example, - year_example, - tmp, - spark, -): - """Test MovieLens dataset load into pySpark.DataFrame""" - - # Test if correct data are loaded - header = ["1", "2", "3"] - schema = StructType( - [ - StructField("u", IntegerType()), - StructField("m", IntegerType()), - ] - ) - with pytest.warns(Warning): - df = load_spark_df( - spark, size=size, local_cache_path=tmp, header=header, schema=schema - ) - assert df.count() == num_samples - # Test if schema is used when both schema and header are provided - assert len(df.columns) == len(schema) - # Test if raw-zip file, rating file, and item file are cached - assert len(os.listdir(tmp)) == 3 - - # Test title, genres, and released year load - header = ["a", "b", "c", "d", "e"] - with pytest.warns(Warning): - df = load_spark_df( - spark, - size=size, - local_cache_path=tmp, - header=header, - title_col="Title", - genres_col="Genres", - year_col="Year", - ) - assert df.count() == num_samples - assert ( - len(df.columns) == 7 - ) # 4 header columns (user, item, rating, timestamp) and 3 feature columns - assert "e" not in df.columns # only the first 4 header columns are used - # Get two records of the same items and check if the item-features are the same. - head = df.filter(col("b") == movie_example).limit(2) - title = head.select("Title").collect() - assert title[0][0] == title[1][0] - assert title[0][0] == title_example - genres = head.select("Genres").collect() - assert genres[0][0] == genres[1][0] - assert genres[0][0] == genres_example - year = head.select("Year").collect() - assert year[0][0] == year[1][0] - assert year[0][0] == year_example - - # Test default arguments - df = load_spark_df(spark, size) - assert df.count() == num_samples - # user, item, rating and timestamp - assert len(df.columns) == 4 - - -@pytest.mark.smoke -@pytest.mark.parametrize("size", ["100k"]) -def test_download_and_extract_movielens(size, tmp): - """Test movielens data download and extract""" - zip_path = os.path.join(tmp, "ml.zip") - download_movielens(size, dest_path=zip_path) - assert len(os.listdir(tmp)) == 1 - assert os.path.exists(zip_path) - - rating_path = os.path.join(tmp, "rating.dat") - item_path = os.path.join(tmp, "item.dat") - extract_movielens( - size, rating_path=rating_path, item_path=item_path, zip_path=zip_path - ) - # Test if raw-zip file, rating file, and item file are cached - assert len(os.listdir(tmp)) == 3 - assert os.path.exists(rating_path) - assert os.path.exists(item_path) +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import os +import pytest +from recommenders.datasets.movielens import ( + load_pandas_df, + load_spark_df, + load_item_df, + download_movielens, + extract_movielens, +) + +try: + from pyspark.sql.types import ( + StructType, + StructField, + IntegerType, + StringType, + FloatType, + DoubleType, + ) + from pyspark.sql.functions import col +except ImportError: + pass # skip this import if we are in pure python environment + + +@pytest.mark.smoke +@pytest.mark.parametrize( + "size, num_samples, num_movies, movie_example, title_example, genres_example, year_example", + [ + ( + "100k", + 100000, + 1682, + 1, + "Toy Story (1995)", + "Animation|Children's|Comedy", + "1995", + ) + ], +) +def test_load_pandas_df( + size, + num_samples, + num_movies, + movie_example, + title_example, + genres_example, + year_example, + tmp, +): + """Test MovieLens dataset load as pd.DataFrame""" + # Test if correct data are loaded + header = ["a", "b", "c"] + df = load_pandas_df(size=size, local_cache_path=tmp, header=header) + assert len(df) == num_samples + assert len(df.columns) == len(header) + # Test if raw-zip file, rating file, and item file are cached + assert len(os.listdir(tmp)) == 3 + + # Test title, genres, and released year load + header = ["a", "b", "c", "d", "e"] + with pytest.warns(Warning): + df = load_pandas_df( + size=size, + header=header, + local_cache_path=tmp, + title_col="Title", + genres_col="Genres", + year_col="Year", + ) + assert len(df) == num_samples + assert ( + len(df.columns) == 7 + ) # 4 header columns (user, item, rating, timestamp) and 3 feature columns + assert "e" not in df.columns # only the first 4 header columns are used + # Get two records of the same items and check if the item-features are the same. + head = df.loc[df["b"] == movie_example][:2] + title = head["Title"].values + assert title[0] == title[1] + assert title[0] == title_example + genres = head["Genres"].values + assert genres[0] == genres[1] + assert genres[0] == genres_example + year = head["Year"].values + assert year[0] == year[1] + assert year[0] == year_example + + # Test default arguments + df = load_pandas_df(size) + assert len(df) == num_samples + # user, item, rating and timestamp + assert len(df.columns) == 4 + + +@pytest.mark.smoke +@pytest.mark.parametrize( + "size, num_movies, movie_example, title_example, genres_example, year_example", + [("100k", 1682, 1, "Toy Story (1995)", "Animation|Children's|Comedy", "1995")], +) +def test_load_item_df( + size, + num_movies, + movie_example, + title_example, + genres_example, + year_example, + tmp, +): + """Test movielens item data load (not rating data)""" + df = load_item_df(size, local_cache_path=tmp, title_col="title") + assert len(df) == num_movies + # movie_col and title_col should be loaded + assert len(df.columns) == 2 + assert df["title"][0] == title_example + + # Test title and genres + df = load_item_df( + size, + local_cache_path=tmp, + movie_col="item", + genres_col="genres", + year_col="year", + ) + assert len(df) == num_movies + # movile_col, genres_col and year_col + assert len(df.columns) == 3 + + assert df["item"][0] == movie_example + assert df["genres"][0] == genres_example + assert df["year"][0] == year_example + + +@pytest.mark.smoke +@pytest.mark.spark +@pytest.mark.parametrize( + "size, num_samples, num_movies, movie_example, title_example, genres_example, year_example", + [ + ( + "100k", + 100000, + 1682, + 1, + "Toy Story (1995)", + "Animation|Children's|Comedy", + "1995", + ) + ], +) +def test_load_spark_df( + size, + num_samples, + num_movies, + movie_example, + title_example, + genres_example, + year_example, + tmp, + spark, +): + """Test MovieLens dataset load into pySpark.DataFrame""" + + # Test if correct data are loaded + header = ["1", "2", "3"] + schema = StructType( + [ + StructField("u", IntegerType()), + StructField("m", IntegerType()), + ] + ) + with pytest.warns(Warning): + df = load_spark_df( + spark, size=size, local_cache_path=tmp, header=header, schema=schema + ) + assert df.count() == num_samples + # Test if schema is used when both schema and header are provided + assert len(df.columns) == len(schema) + # Test if raw-zip file, rating file, and item file are cached + assert len(os.listdir(tmp)) == 3 + + # Test title, genres, and released year load + header = ["a", "b", "c", "d", "e"] + with pytest.warns(Warning): + df = load_spark_df( + spark, + size=size, + local_cache_path=tmp, + header=header, + title_col="Title", + genres_col="Genres", + year_col="Year", + ) + assert df.count() == num_samples + assert ( + len(df.columns) == 7 + ) # 4 header columns (user, item, rating, timestamp) and 3 feature columns + assert "e" not in df.columns # only the first 4 header columns are used + # Get two records of the same items and check if the item-features are the same. + head = df.filter(col("b") == movie_example).limit(2) + title = head.select("Title").collect() + assert title[0][0] == title[1][0] + assert title[0][0] == title_example + genres = head.select("Genres").collect() + assert genres[0][0] == genres[1][0] + assert genres[0][0] == genres_example + year = head.select("Year").collect() + assert year[0][0] == year[1][0] + assert year[0][0] == year_example + + # Test default arguments + df = load_spark_df(spark, size) + assert df.count() == num_samples + # user, item, rating and timestamp + assert len(df.columns) == 4 + + +@pytest.mark.smoke +@pytest.mark.parametrize("size", ["100k"]) +def test_download_and_extract_movielens(size, tmp): + """Test movielens data download and extract""" + zip_path = os.path.join(tmp, "ml.zip") + download_movielens(size, dest_path=zip_path) + assert len(os.listdir(tmp)) == 1 + assert os.path.exists(zip_path) + + rating_path = os.path.join(tmp, "rating.dat") + item_path = os.path.join(tmp, "item.dat") + extract_movielens( + size, rating_path=rating_path, item_path=item_path, zip_path=zip_path + ) + # Test if raw-zip file, rating file, and item file are cached + assert len(os.listdir(tmp)) == 3 + assert os.path.exists(rating_path) + assert os.path.exists(item_path) diff --git a/tests/unit/recommenders/datasets/test_sparse.py b/tests/unit/recommenders/datasets/test_sparse.py index 2184763d87..9ba82eed16 100644 --- a/tests/unit/recommenders/datasets/test_sparse.py +++ b/tests/unit/recommenders/datasets/test_sparse.py @@ -1,134 +1,134 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -import pandas as pd -import numpy as np -import pytest - -from recommenders.datasets.sparse import AffinityMatrix -from recommenders.utils.constants import ( - DEFAULT_USER_COL, - DEFAULT_ITEM_COL, - DEFAULT_RATING_COL, - DEFAULT_TIMESTAMP_COL, -) - - -@pytest.fixture(scope="module") -def test_specs(): - return {"number_of_items": 50, "number_of_users": 20, "seed": 123} - - -# generate a syntetic dataset -@pytest.fixture(scope="module") -def python_dataset(test_specs): - - """Get Python labels""" - - def random_date_generator(start_date, range_in_days): - """Helper function to generate random timestamps. - - Reference: https://stackoverflow.com/questions/41006182/generate-random-dates-within-a-range-in-numpy - """ - - days_to_add = np.arange(0, range_in_days) - random_dates = [] - - for i in range(range_in_days): - random_date = np.datetime64(start_date) + np.random.choice(days_to_add) - random_dates.append(random_date) - - return random_dates - - # fix the the random seed - np.random.seed(test_specs["seed"]) - - # generates the user/item affinity matrix. Ratings are from 1 to 5, with 0s denoting unrated items - X = np.random.randint( - low=0, - high=6, - size=(test_specs["number_of_users"], test_specs["number_of_items"]), - ) - - # In the main code, input data are passed as pandas dataframe. Below we generate such df from the above matrix - userids = [] - - for i in range(1, test_specs["number_of_users"] + 1): - userids.extend([i] * test_specs["number_of_items"]) - - itemids = [i for i in range(1, test_specs["number_of_items"] + 1)] * test_specs[ - "number_of_users" - ] - ratings = np.reshape(X, -1) - - # create dataframe - results = pd.DataFrame.from_dict( - { - DEFAULT_USER_COL: userids, - DEFAULT_ITEM_COL: itemids, - DEFAULT_RATING_COL: ratings, - DEFAULT_TIMESTAMP_COL: random_date_generator( - "2018-01-01", - test_specs["number_of_users"] * test_specs["number_of_items"], - ), - } - ) - - # here we eliminate the missing ratings to obtain a standard form of the df as that of real data. - results = results[results.rating != 0] - - return results - - -def test_df_to_sparse(test_specs, python_dataset): - # initialize the splitter - header = { - "col_user": DEFAULT_USER_COL, - "col_item": DEFAULT_ITEM_COL, - "col_rating": DEFAULT_RATING_COL, - } - - # instantiate the affinity matrix - am = AffinityMatrix(df=python_dataset, **header) - - # obtain the sparse matrix representation of the input dataframe - X, _, _ = am.gen_affinity_matrix() - - # check that the generated matrix has the correct dimensions - assert (X.shape[0] == python_dataset.userID.unique().shape[0]) & ( - X.shape[1] == python_dataset.itemID.unique().shape[0] - ) - - -def test_sparse_to_df(test_specs, python_dataset): - # initialize the splitter - header = { - "col_user": DEFAULT_USER_COL, - "col_item": DEFAULT_ITEM_COL, - "col_rating": DEFAULT_RATING_COL, - } - - # instantiate the the affinity matrix - am = AffinityMatrix(df=python_dataset, **header) - - # generate the sparse matrix representation - X, _, _ = am.gen_affinity_matrix() - - # use the inverse function to generate a pandas df from a sparse matrix ordered by userID - DF = am.map_back_sparse(X, kind="ratings") - - # tests: check that the two dataframes have the same elements in the same positions. - assert ( - DF.userID.values.all() - == python_dataset.sort_values(by=["userID"]).userID.values.all() - ) - - assert ( - DF.itemID.values.all() - == python_dataset.sort_values(by=["userID"]).itemID.values.all() - ) - - assert ( - DF.rating.values.all() - == python_dataset.sort_values(by=["userID"]).rating.values.all() - ) +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +import pandas as pd +import numpy as np +import pytest + +from recommenders.datasets.sparse import AffinityMatrix +from recommenders.utils.constants import ( + DEFAULT_USER_COL, + DEFAULT_ITEM_COL, + DEFAULT_RATING_COL, + DEFAULT_TIMESTAMP_COL, +) + + +@pytest.fixture(scope="module") +def test_specs(): + return {"number_of_items": 50, "number_of_users": 20, "seed": 123} + + +# generate a syntetic dataset +@pytest.fixture(scope="module") +def python_dataset(test_specs): + + """Get Python labels""" + + def random_date_generator(start_date, range_in_days): + """Helper function to generate random timestamps. + + Reference: https://stackoverflow.com/questions/41006182/generate-random-dates-within-a-range-in-numpy + """ + + days_to_add = np.arange(0, range_in_days) + random_dates = [] + + for i in range(range_in_days): + random_date = np.datetime64(start_date) + np.random.choice(days_to_add) + random_dates.append(random_date) + + return random_dates + + # fix the the random seed + np.random.seed(test_specs["seed"]) + + # generates the user/item affinity matrix. Ratings are from 1 to 5, with 0s denoting unrated items + X = np.random.randint( + low=0, + high=6, + size=(test_specs["number_of_users"], test_specs["number_of_items"]), + ) + + # In the main code, input data are passed as pandas dataframe. Below we generate such df from the above matrix + userids = [] + + for i in range(1, test_specs["number_of_users"] + 1): + userids.extend([i] * test_specs["number_of_items"]) + + itemids = [i for i in range(1, test_specs["number_of_items"] + 1)] * test_specs[ + "number_of_users" + ] + ratings = np.reshape(X, -1) + + # create dataframe + results = pd.DataFrame.from_dict( + { + DEFAULT_USER_COL: userids, + DEFAULT_ITEM_COL: itemids, + DEFAULT_RATING_COL: ratings, + DEFAULT_TIMESTAMP_COL: random_date_generator( + "2018-01-01", + test_specs["number_of_users"] * test_specs["number_of_items"], + ), + } + ) + + # here we eliminate the missing ratings to obtain a standard form of the df as that of real data. + results = results[results.rating != 0] + + return results + + +def test_df_to_sparse(test_specs, python_dataset): + # initialize the splitter + header = { + "col_user": DEFAULT_USER_COL, + "col_item": DEFAULT_ITEM_COL, + "col_rating": DEFAULT_RATING_COL, + } + + # instantiate the affinity matrix + am = AffinityMatrix(df=python_dataset, **header) + + # obtain the sparse matrix representation of the input dataframe + X, _, _ = am.gen_affinity_matrix() + + # check that the generated matrix has the correct dimensions + assert (X.shape[0] == python_dataset.userID.unique().shape[0]) & ( + X.shape[1] == python_dataset.itemID.unique().shape[0] + ) + + +def test_sparse_to_df(test_specs, python_dataset): + # initialize the splitter + header = { + "col_user": DEFAULT_USER_COL, + "col_item": DEFAULT_ITEM_COL, + "col_rating": DEFAULT_RATING_COL, + } + + # instantiate the the affinity matrix + am = AffinityMatrix(df=python_dataset, **header) + + # generate the sparse matrix representation + X, _, _ = am.gen_affinity_matrix() + + # use the inverse function to generate a pandas df from a sparse matrix ordered by userID + DF = am.map_back_sparse(X, kind="ratings") + + # tests: check that the two dataframes have the same elements in the same positions. + assert ( + DF.userID.values.all() + == python_dataset.sort_values(by=["userID"]).userID.values.all() + ) + + assert ( + DF.itemID.values.all() + == python_dataset.sort_values(by=["userID"]).itemID.values.all() + ) + + assert ( + DF.rating.values.all() + == python_dataset.sort_values(by=["userID"]).rating.values.all() + ) diff --git a/tests/unit/recommenders/models/test_wide_deep_utils.py b/tests/unit/recommenders/models/test_wide_deep_utils.py index 2c08851a17..d6d1a8dfb5 100644 --- a/tests/unit/recommenders/models/test_wide_deep_utils.py +++ b/tests/unit/recommenders/models/test_wide_deep_utils.py @@ -76,7 +76,7 @@ def test_wide_model(pd_df, tmp): ) # Close the event file so that the model folder can be cleaned up. - summary_writer = tf.summary.FileWriterCache.get(model.model_dir) + summary_writer = tf.compat.v1.summary.FileWriterCache.get(model.model_dir) summary_writer.close() @@ -100,7 +100,7 @@ def test_deep_model(pd_df, tmp): ) # Close the event file so that the model folder can be cleaned up. - summary_writer = tf.summary.FileWriterCache.get(model.model_dir) + summary_writer = tf.compat.v1.summary.FileWriterCache.get(model.model_dir) summary_writer.close() @@ -134,5 +134,5 @@ def test_wide_deep_model(pd_df, tmp): ) # Close the event file so that the model folder can be cleaned up. - summary_writer = tf.summary.FileWriterCache.get(model.model_dir) + summary_writer = tf.compat.v1.summary.FileWriterCache.get(model.model_dir) summary_writer.close() diff --git a/tests/unit/recommenders/utils/test_k8s_utils.py b/tests/unit/recommenders/utils/test_k8s_utils.py index 161cef698a..dd58a9d834 100644 --- a/tests/unit/recommenders/utils/test_k8s_utils.py +++ b/tests/unit/recommenders/utils/test_k8s_utils.py @@ -1,25 +1,25 @@ -# Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the MIT License. - -from recommenders.utils.k8s_utils import ( - qps_to_replicas, - replicas_to_qps, - nodes_to_replicas, -) - - -def test_qps_to_replicas(): - replicas = qps_to_replicas(target_qps=25, processing_time=0.1) - assert replicas == 4 - - -def test_replicas_to_qps(): - qps = replicas_to_qps(num_replicas=4, processing_time=0.1) - assert qps == 27 - - -def test_nodes_to_replicas(): - max_replicas = nodes_to_replicas( - n_cores_per_node=4, n_nodes=3, cpu_cores_per_replica=0.1 - ) - assert max_replicas == 60 +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. + +from recommenders.utils.k8s_utils import ( + qps_to_replicas, + replicas_to_qps, + nodes_to_replicas, +) + + +def test_qps_to_replicas(): + replicas = qps_to_replicas(target_qps=25, processing_time=0.1) + assert replicas == 4 + + +def test_replicas_to_qps(): + qps = replicas_to_qps(num_replicas=4, processing_time=0.1) + assert qps == 27 + + +def test_nodes_to_replicas(): + max_replicas = nodes_to_replicas( + n_cores_per_node=4, n_nodes=3, cpu_cores_per_replica=0.1 + ) + assert max_replicas == 60 diff --git a/tests/unit/recommenders/utils/test_tf_utils.py b/tests/unit/recommenders/utils/test_tf_utils.py index 60f32e244d..6b45020731 100644 --- a/tests/unit/recommenders/utils/test_tf_utils.py +++ b/tests/unit/recommenders/utils/test_tf_utils.py @@ -63,8 +63,8 @@ def test_pandas_input_fn(pd_df): # check dataset dataset = pandas_input_fn(df)() - batch = dataset.make_one_shot_iterator().get_next() - with tf.Session() as sess: + batch = tf.compat.v1.data.make_one_shot_iterator(dataset).get_next() + with tf.compat.v1.Session() as sess: features = sess.run(batch) # check the input function returns all the columns @@ -80,8 +80,8 @@ def test_pandas_input_fn(pd_df): # check dataset with shuffles dataset = pandas_input_fn(df, shuffle=True, seed=SEED)() - batch = dataset.make_one_shot_iterator().get_next() - with tf.Session() as sess: + batch = tf.compat.v1.data.make_one_shot_iterator(dataset).get_next() + with tf.compat.v1.Session() as sess: features = sess.run(batch) print(features) # check the input function returns all the columns @@ -97,8 +97,8 @@ def test_pandas_input_fn(pd_df): # check dataset w/ label dataset_with_label = pandas_input_fn(df, y_col=DEFAULT_RATING_COL)() - batch = dataset_with_label.make_one_shot_iterator().get_next() - with tf.Session() as sess: + batch = tf.compat.v1.data.make_one_shot_iterator(dataset_with_label).get_next() + with tf.compat.v1.Session() as sess: features, label = sess.run(batch) assert ( len(features) == len(df.columns) - 1 @@ -108,25 +108,25 @@ def test_pandas_input_fn(pd_df): @pytest.mark.gpu def test_build_optimizer(): adadelta = build_optimizer("Adadelta") - assert isinstance(adadelta, tf.train.AdadeltaOptimizer) + assert isinstance(adadelta, tf.compat.v1.train.AdadeltaOptimizer) adagrad = build_optimizer("Adagrad") - assert isinstance(adagrad, tf.train.AdagradOptimizer) + assert isinstance(adagrad, tf.compat.v1.train.AdagradOptimizer) adam = build_optimizer("Adam") - assert isinstance(adam, tf.train.AdamOptimizer) + assert isinstance(adam, tf.compat.v1.train.AdamOptimizer) ftrl = build_optimizer("Ftrl", **{"l1_regularization_strength": 0.001}) - assert isinstance(ftrl, tf.train.FtrlOptimizer) + assert isinstance(ftrl, tf.compat.v1.train.FtrlOptimizer) momentum = build_optimizer("Momentum", **{"momentum": 0.5}) - assert isinstance(momentum, tf.train.MomentumOptimizer) + assert isinstance(momentum, tf.compat.v1.train.MomentumOptimizer) rmsprop = build_optimizer("RMSProp") - assert isinstance(rmsprop, tf.train.RMSPropOptimizer) + assert isinstance(rmsprop, tf.compat.v1.train.RMSPropOptimizer) sgd = build_optimizer("SGD") - assert isinstance(sgd, tf.train.GradientDescentOptimizer) + assert isinstance(sgd, tf.compat.v1.train.GradientDescentOptimizer) @pytest.mark.gpu @@ -177,7 +177,7 @@ def test_evaluation_log_hook(pd_df, tmp): assert len(evaluation_logger.get_log()[rmse.__name__]) == hook_frequency # Close the event file so that the model folder can be cleaned up. - summary_writer = tf.summary.FileWriterCache.get(model.model_dir) + summary_writer = tf.compat.v1.summary.FileWriterCache.get(model.model_dir) summary_writer.close() @@ -230,5 +230,5 @@ def test_pandas_input_fn_for_saved_model(pd_df, tmp): ) # Close the event file so that the model folder can be cleaned up. - summary_writer = tf.summary.FileWriterCache.get(model.model_dir) + summary_writer = tf.compat.v1.summary.FileWriterCache.get(model.model_dir) summary_writer.close() From 9f394111d2101d4c669e0fd33e9835a418a2b3bb Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 12 Oct 2021 17:59:56 +0000 Subject: [PATCH 08/60] Replace tf.contrib.estimator.build_supervised_input_receiver_fn_from_input_fn --- recommenders/utils/tf_utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/recommenders/utils/tf_utils.py b/recommenders/utils/tf_utils.py index c744e8fb46..5269f4f8c4 100644 --- a/recommenders/utils/tf_utils.py +++ b/recommenders/utils/tf_utils.py @@ -3,8 +3,8 @@ import itertools import numpy as np -import pandas as pd import tensorflow as tf +from tensorflow_estimator.python.estimator.export.export import build_supervised_input_receiver_fn_from_input_fn MODEL_DIR = "model_checkpoints" @@ -167,12 +167,12 @@ def export_model(model, train_input_fn, eval_input_fn, tf_feat_cols, base_dir): """ tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR) train_rcvr_fn = ( - tf.contrib.estimator.build_supervised_input_receiver_fn_from_input_fn( + build_supervised_input_receiver_fn_from_input_fn( train_input_fn ) ) eval_rcvr_fn = ( - tf.contrib.estimator.build_supervised_input_receiver_fn_from_input_fn( + build_supervised_input_receiver_fn_from_input_fn( eval_input_fn ) ) From edf9b4c07b7ca4e0f687bf0e134c5b1a487ccd99 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Wed, 13 Oct 2021 15:58:12 +0000 Subject: [PATCH 09/60] Fix tf_utils --- recommenders/utils/tf_utils.py | 4 ++-- tests/unit/recommenders/utils/test_tf_utils.py | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/recommenders/utils/tf_utils.py b/recommenders/utils/tf_utils.py index 5269f4f8c4..0bd6e26880 100644 --- a/recommenders/utils/tf_utils.py +++ b/recommenders/utils/tf_utils.py @@ -184,8 +184,8 @@ def export_model(model, train_input_fn, eval_input_fn, tf_feat_cols, base_dir): tf.estimator.ModeKeys.EVAL: eval_rcvr_fn, tf.estimator.ModeKeys.PREDICT: serve_rcvr_fn, } - exported_path = tf.contrib.estimator.export_all_saved_models( - model, export_dir_base=base_dir, input_receiver_fn_map=rcvr_fn_map + exported_path = model.experimental_export_all_saved_models( + export_dir_base=base_dir, input_receiver_fn_map=rcvr_fn_map ) return exported_path.decode("utf-8") diff --git a/tests/unit/recommenders/utils/test_tf_utils.py b/tests/unit/recommenders/utils/test_tf_utils.py index 6b45020731..d893659dc0 100644 --- a/tests/unit/recommenders/utils/test_tf_utils.py +++ b/tests/unit/recommenders/utils/test_tf_utils.py @@ -61,6 +61,7 @@ def pd_df(): def test_pandas_input_fn(pd_df): df, _, _ = pd_df + tf.compat.v1.disable_eager_execution() # need to disable eager in TF2.x # check dataset dataset = pandas_input_fn(df)() batch = tf.compat.v1.data.make_one_shot_iterator(dataset).get_next() @@ -208,22 +209,22 @@ def test_pandas_input_fn_for_saved_model(pd_df, tmp): tf_feat_cols=deep_columns, base_dir=export_dir, ) - saved_model = tf.contrib.estimator.SavedModelEstimator(exported_path) + saved_model = tf.saved_model.load(exported_path, tags="serve") # Test pandas_input_fn_for_saved_model with the saved model test = data.drop(DEFAULT_RATING_COL, axis=1) test.reset_index(drop=True, inplace=True) list( itertools.islice( - saved_model.predict( - pandas_input_fn_for_saved_model( + saved_model.signatures["predict"]( + examples=pandas_input_fn_for_saved_model( df=test, feat_name_type={ DEFAULT_USER_COL: int, DEFAULT_ITEM_COL: int, ITEM_FEAT_COL: list, }, - ) + )()["inputs"] ), len(test), ) From 10cd5a789b2b591f12d0337114451a53a9a21fd5 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Wed, 13 Oct 2021 16:01:25 +0000 Subject: [PATCH 10/60] reapply TF2 --- setup.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 7e406eed92..e9ed873fad 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ version += ".post" + str(int(time.time())) install_requires = [ - "numpy>=1.19", + "numpy>=1.19", # 1.19 required by tensorflow "pandas>1.0.3,<2", "scipy>=1.0.0,<2", "tqdm>=4.31.1,<5", @@ -66,8 +66,8 @@ ], "gpu": [ "nvidia-ml-py3>=7.352.0", - "tensorflow-gpu>=1.15.0,<2", # compiled with CUDA 10.0 - "torch==1.2.0", # last os-common version with CUDA 10.0 support + "tensorflow>=2.6", # compiled with CUDA 11.2, cudnn 8.1 + "torch>=1.8", # for CUDA 11 support "fastai>=1.0.46,<2", ], "spark": [ From e1560f9cf916363975a6ebd348c8f534b34d0148 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Wed, 13 Oct 2021 17:23:20 +0000 Subject: [PATCH 11/60] Fix wide and deep tuning notebook --- .../azureml_hyperdrive_wide_and_deep.ipynb | 635 +++++++++--------- 1 file changed, 317 insertions(+), 318 deletions(-) diff --git a/examples/04_model_select_and_optimize/azureml_hyperdrive_wide_and_deep.ipynb b/examples/04_model_select_and_optimize/azureml_hyperdrive_wide_and_deep.ipynb index f6e637fe22..e47cb6d157 100644 --- a/examples/04_model_select_and_optimize/azureml_hyperdrive_wide_and_deep.ipynb +++ b/examples/04_model_select_and_optimize/azureml_hyperdrive_wide_and_deep.ipynb @@ -2,17 +2,16 @@ "cells": [ { "cell_type": "markdown", - "metadata": {}, "source": [ "Copyright (c) Microsoft Corporation. All rights reserved.
\n", "Licensed under the MIT License.
\n", "
\n", "# Wide-and-Deep Model Hyperparameter Tuning with AzureML" - ] + ], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "This notebook shows how to auto-tune hyperparameters of a recommender model by utilizing **Azure Machine Learning service** ([AzureML](https://azure.microsoft.com/en-us/services/machine-learning-service/))a, b.\n", "\n", @@ -39,35 +38,24 @@ "---\n", "a. To use AzureML, you will need an Azure subscription.
\n", "b. When you web-search \"Azure Machine Learning\", you will most likely to see mixed results of Azure Machine Learning (AzureML) and Azure Machine Learning **Studio**. Please note they are different services where AzureML's focuses are on ML model management, tracking and hyperparameter tuning, while the [ML Studio](https://studio.azureml.net/)'s is to provide a high-level tool for 'easy-to-use' experience of ML designing and experimentation based on GUI.
" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 1, - "metadata": {}, - "outputs": [], "source": [ "%reload_ext autoreload\n", "%autoreload 2" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Azure ML SDK Version: 1.0.10\n", - "Tensorflow Version: 1.12.0\n" - ] - } - ], "source": [ "import sys\n", - "\n", "import itertools\n", "import os\n", @@ -98,11 +86,21 @@ "\n", "# Temp dir to cache temporal files while running this notebook\n", "tmp_dir = TemporaryDirectory()" - ] + ], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Azure ML SDK Version: 1.0.10\n", + "Tensorflow Version: 1.12.0\n" + ] + } + ], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "### 1. Create and Configure AzureML Workspace\n", "**AzureML workspace** is a foundational block in the cloud that you use to experiment, train, and deploy machine learning models via AzureML service. In this notebook, we 1) create a workspace from [**Azure portal**](https://portal.azure.com) and 2) configure from this notebook.\n", @@ -120,17 +118,12 @@ "* Option 2: Use [AzureML SDK](https://docs.microsoft.com/en-us/python/api/overview/azure/ml/intro?view=azure-ml-py#workspace) - Run following cell\n", " * To find the full list of supported region, use Azure CLI from [your machine](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest) or [cloud shell](https://azure.microsoft.com/en-us/features/cloud-shell/) to run: `az account list-locations`\n", " * To locate your tenant id, use Azure CLI to run: `az account show`" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 3, - "metadata": { - "tags": [ - "parameters" - ] - }, - "outputs": [], "source": [ "# AzureML workspace information. Set them to create a workspace.\n", "SUBSCRIPTION_ID = None #''\n", @@ -163,29 +156,17 @@ "ITEM_COL = 'MovieId'\n", "RATING_COL = 'Rating'\n", "ITEM_FEAT_COL = 'Genres'\n" - ] + ], + "outputs": [], + "metadata": { + "tags": [ + "parameters" + ] + } }, { "cell_type": "code", "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Found the config file in: /data/home/jumin/git/reco/notebooks/04_model_select_and_optimize/aml_config/config.json\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Falling back to use azure cli credentials. This fall back to use azure cli credentials will be removed in the next release. \n", - "Make sure your code doesn't require 'az login' to have happened before using azureml-sdk, except the case when you are specifying AzureCliAuthentication in azureml-sdk.\n" - ] - } - ], "source": [ "if TENANT_ID:\n", " auth = aml.core.authentication.InteractiveLoginAuthentication(\n", @@ -218,35 +199,52 @@ "# If you are using an already-configured workspace config.json file\n", "else:\n", " ws = aml.core.Workspace.from_config(auth=auth)" - ] + ], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Found the config file in: /data/home/jumin/git/reco/notebooks/04_model_select_and_optimize/aml_config/config.json\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "Falling back to use azure cli credentials. This fall back to use azure cli credentials will be removed in the next release. \n", + "Make sure your code doesn't require 'az login' to have happened before using azureml-sdk, except the case when you are specifying AzureCliAuthentication in azureml-sdk.\n" + ] + } + ], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "To verify your workspace, run:" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 5, - "metadata": {}, + "source": [ + "print(\"AzureML workspace name: \", ws.name)" + ], "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "AzureML workspace name: junminaml\n" ] } ], - "source": [ - "print(\"AzureML workspace name: \", ws.name)" - ] + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "### 2. Create Remote Compute Target\n", "\n", @@ -260,22 +258,12 @@ "\n", "\n", "For more information about Azure virtual machine sizes, see [here](https://docs.microsoft.com/en-us/azure/virtual-machines/windows/sizes-gpu)." - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Found existing compute target\n", - "{'allocationState': 'Steady', 'allocationStateTransitionTime': '2019-06-28T16:58:16.459000+00:00', 'creationTime': '2019-06-18T21:09:39.101231+00:00', 'currentNodeCount': 0, 'errors': None, 'modifiedTime': '2019-06-18T21:09:55.347615+00:00', 'nodeStateCounts': {'idleNodeCount': 0, 'leavingNodeCount': 0, 'preemptedNodeCount': 0, 'preparingNodeCount': 0, 'runningNodeCount': 0, 'unusableNodeCount': 0}, 'provisioningState': 'Succeeded', 'provisioningStateTransitionTime': None, 'scaleSettings': {'minNodeCount': 0, 'maxNodeCount': 8, 'nodeIdleTimeBeforeScaleDown': 'PT120S'}, 'targetNodeCount': 0, 'vmPriority': 'LowPriority', 'vmSize': 'STANDARD_NC6'}\n" - ] - } - ], "source": [ "CLUSTER_NAME = 'gpu-cluster-nc6'\n", "\n", @@ -296,29 +284,55 @@ "\n", "# Use the 'status' property to get a detailed status for the current cluster. \n", "print(compute_target.status.serialize())" - ] + ], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Found existing compute target\n", + "{'allocationState': 'Steady', 'allocationStateTransitionTime': '2019-06-28T16:58:16.459000+00:00', 'creationTime': '2019-06-18T21:09:39.101231+00:00', 'currentNodeCount': 0, 'errors': None, 'modifiedTime': '2019-06-18T21:09:55.347615+00:00', 'nodeStateCounts': {'idleNodeCount': 0, 'leavingNodeCount': 0, 'preemptedNodeCount': 0, 'preparingNodeCount': 0, 'runningNodeCount': 0, 'unusableNodeCount': 0}, 'provisioningState': 'Succeeded', 'provisioningStateTransitionTime': None, 'scaleSettings': {'minNodeCount': 0, 'maxNodeCount': 8, 'nodeIdleTimeBeforeScaleDown': 'PT120S'}, 'targetNodeCount': 0, 'vmPriority': 'LowPriority', 'vmSize': 'STANDARD_NC6'}\n" + ] + } + ], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "### 3. Prepare Data\n", "For demonstration purpose, we use 100k MovieLens dataset. First, download the data and convert the format (multi-hot encode *genres*) to make it work for our model. More details about this step is described in our [Wide-Deep Quickstart notebook](../00_quick_start/wide_deep_movielens.ipynb)." - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 7, - "metadata": {}, + "source": [ + "data = movielens.load_pandas_df(\n", + " size=MOVIELENS_DATA_SIZE,\n", + " header=[USER_COL, ITEM_COL, RATING_COL],\n", + " genres_col=ITEM_FEAT_COL\n", + ")\n", + "\n", + "# Encode 'genres' into int array (multi-hot representation) to use as item features\n", + "genres_encoder = sklearn.preprocessing.MultiLabelBinarizer()\n", + "data[ITEM_FEAT_COL] = genres_encoder.fit_transform(\n", + " data[ITEM_FEAT_COL].apply(lambda s: s.split(\"|\"))\n", + ").tolist()\n", + "\n", + "data.head()" + ], "outputs": [ { - "name": "stderr", "output_type": "stream", + "name": "stderr", "text": [ "100%|██████████| 4.81k/4.81k [00:00<00:00, 18.1kKB/s]\n" ] }, { + "output_type": "execute_result", "data": { "text/html": [ "
\n", @@ -394,52 +408,24 @@ "4 306 242 5.0 [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ..." ] }, - "execution_count": 7, "metadata": {}, - "output_type": "execute_result" + "execution_count": 7 } ], - "source": [ - "data = movielens.load_pandas_df(\n", - " size=MOVIELENS_DATA_SIZE,\n", - " header=[USER_COL, ITEM_COL, RATING_COL],\n", - " genres_col=ITEM_FEAT_COL\n", - ")\n", - "\n", - "# Encode 'genres' into int array (multi-hot representation) to use as item features\n", - "genres_encoder = sklearn.preprocessing.MultiLabelBinarizer()\n", - "data[ITEM_FEAT_COL] = genres_encoder.fit_transform(\n", - " data[ITEM_FEAT_COL].apply(lambda s: s.split(\"|\"))\n", - ").tolist()\n", - "\n", - "data.head()" - ] + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "The dataset is split into train, validation, and test sets. The train and validation sets will be used for hyperparameter tuning, and the test set will be used for the final evaluation of the model after we import the best model from AzureML workspace.\n", "\n", "Here, we don't use multiple-split directly by passing `ratio=[0.56, 0.19, 0.25]`. Instead, we first split the data into train and test sets with the same `seed` we've been using in other notebooks to make the train set identical across them. Then, we further split the train set into train and validation sets." - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of samples:\n", - "- Training = 56250\n", - "- Validation = 18750\n", - "- Testing = 25000\n" - ] - } - ], "source": [ "# Use the same seed to make the train and test sets identical across other notebooks in the repo.\n", "train, test = python_random_split(data, ratio=0.75, seed=SEED)\n", @@ -452,23 +438,54 @@ " \"- Validation = {}\\n\"\n", " \"- Testing = {}\".format(len(train), len(valid), len(test))\n", ")" - ] + ], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Number of samples:\n", + "- Training = 56250\n", + "- Validation = 18750\n", + "- Testing = 25000\n" + ] + } + ], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "Now, upload the train and validation sets to the AzureML workspace. Our Hyperdrivce experiment will use them." - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 12, - "metadata": {}, + "source": [ + "DATA_DIR = os.path.join(tmp_dir.name, 'aml_data') \n", + "\n", + "os.makedirs(DATA_DIR, exist_ok=True)\n", + "\n", + "TRAIN_FILE_NAME = \"movielens_\" + MOVIELENS_DATA_SIZE + \"_train.pkl\"\n", + "train.to_pickle(os.path.join(DATA_DIR, TRAIN_FILE_NAME))\n", + "VALID_FILE_NAME = \"movielens_\" + MOVIELENS_DATA_SIZE + \"_valid.pkl\"\n", + "valid.to_pickle(os.path.join(DATA_DIR, VALID_FILE_NAME))\n", + "\n", + "# Note, all the files under DATA_DIR will be uploaded to the data store\n", + "ds = ws.get_default_datastore()\n", + "ds.upload(\n", + " src_dir=DATA_DIR,\n", + " target_path='data',\n", + " overwrite=True,\n", + " show_progress=True\n", + ")" + ], "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Uploading /tmp/tmpwby7dwh4/aml_data/movielens_100k_train.pkl\n", "Uploading /tmp/tmpwby7dwh4/aml_data/movielens_100k_valid.pkl\n", @@ -477,39 +494,20 @@ ] }, { + "output_type": "execute_result", "data": { "text/plain": [ "$AZUREML_DATAREFERENCE_ec1d8219afb44a36adf66ff9ece918f4" ] }, - "execution_count": 12, "metadata": {}, - "output_type": "execute_result" + "execution_count": 12 } ], - "source": [ - "DATA_DIR = os.path.join(tmp_dir.name, 'aml_data') \n", - "\n", - "os.makedirs(DATA_DIR, exist_ok=True)\n", - "\n", - "TRAIN_FILE_NAME = \"movielens_\" + MOVIELENS_DATA_SIZE + \"_train.pkl\"\n", - "train.to_pickle(os.path.join(DATA_DIR, TRAIN_FILE_NAME))\n", - "VALID_FILE_NAME = \"movielens_\" + MOVIELENS_DATA_SIZE + \"_valid.pkl\"\n", - "valid.to_pickle(os.path.join(DATA_DIR, VALID_FILE_NAME))\n", - "\n", - "# Note, all the files under DATA_DIR will be uploaded to the data store\n", - "ds = ws.get_default_datastore()\n", - "ds.upload(\n", - " src_dir=DATA_DIR,\n", - " target_path='data',\n", - " overwrite=True,\n", - " show_progress=True\n", - ")" - ] + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "### 4. Prepare Training Scripts\n", "Next step is to prepare scripts that AzureML Hyperdrive will use to train and evaluate models with selected hyperparameters. We re-use our [Wide-Deep Quickstart notebook](../00_quick_start/wide_deep_movielens.ipynb) for that. To run the model notebook from the Hyperdrive Run, all we need is to prepare an [entry script](../../recommenders/azureml/wide_deep.py) which parses the hyperparameter arguments, passes them to the notebook, and records the results of the notebook to AzureML Run logs by using `papermill`. Hyperdrive uses the logs to track the performance of each hyperparameter-set and finds the best performed one. \n", @@ -539,13 +537,12 @@ ")\n", "...\n", "```" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 13, - "metadata": {}, - "outputs": [], "source": [ "# Prepare all the necessary scripts which will be loaded to our Hyperdrive Experiment Run\n", "SCRIPT_DIR = os.path.join(tmp_dir.name, 'aml_script')\n", @@ -567,11 +564,12 @@ "\n", "# This is our entry script for Hyperdrive Run\n", "ENTRY_SCRIPT_NAME = 'train_scripts/wide_deep_training.py'" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "### 5. Setup and Run Hyperdrive Experiment\n", "\n", @@ -580,13 +578,12 @@ "In this notebook, we fix the number of training steps to 50000.\n", "\n", "In the search space, we set different linear and DNN optimizers, structures, learning rates and regularization rates. Details about the hyperparameters can be found from our [Wide-Deep Quickstart notebook](../00_quick_start/wide_deep_movielens.ipynb)." - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 14, - "metadata": {}, - "outputs": [], "source": [ "# Script parameters. New AzureML API only accepts string values.\n", "script_params = {\n", @@ -628,24 +625,24 @@ " '--dnn-batch-norm': hd.choice(0, 1),\n", " '--dnn-dropout': hd.uniform(0.0, 0.8)\n", "}" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "\n", "#### 5.2 Create Hyperdrive Experiment \n", "[Hyperdrive](https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-tune-hyperparameters) creates a machine learning experiment [**Run**](https://docs.microsoft.com/en-us/python/api/azureml-core/azureml.core.run?view=azure-ml-py) on the workspace and utilizes child-runs to search the best set of hyperparameters. [Experiment](https://docs.microsoft.com/en-us/python/api/azureml-core/azureml.core.experiment(class)?view=azure-ml-py) is the main entry point into experimenting with AzureML. To create new Experiment or get the existing one, we pass our experimentation name.\n", "\n", "**AzureML Estimator** is the building block for training. An Estimator encapsulates the training code and parameters, the compute resources and runtime environment for a particular training scenario (Note, this is not TensorFlow's Estimator). In the following cell, we create the Estimator with additional dependencies of our model scripts." - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 15, - "metadata": {}, - "outputs": [], "source": [ "est = aml.train.estimator.Estimator(\n", " source_directory=SCRIPT_DIR,\n", @@ -656,22 +653,22 @@ " conda_packages=['pandas', 'scikit-learn', 'numba', 'matplotlib'],\n", " pip_packages=['ipykernel', 'papermill==0.18.2', 'tensorflow-gpu==1.12']\n", ")" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "We set our primary metric with the goal (hyperparameter search criteria), hyperparameter sampling method, and number of total child-runs to the Hyperdrive Run Config. The bigger the search space, the more number of runs we will need for better results.\n", "\n", "Hyperdrive provides three different parameter sampling methods: `RandomParameterSampling`, `GridParameterSampling`, and `BayesianParameterSampling`. Details about each method can be found from [Azure doc](https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-tune-hyperparameters). Here, we use the Bayesian sampling." - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 16, - "metadata": {}, - "outputs": [], "source": [ "hd_run_config = hd.HyperDriveRunConfig(\n", " estimator=est, \n", @@ -681,11 +678,12 @@ " max_total_runs=MAX_TOTAL_RUNS,\n", " max_concurrent_runs=MAX_CONCURRENT_RUNS\n", ")" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "#### 5.3 Run Experiment\n", "\n", @@ -696,23 +694,22 @@ "
AzureML Hyperdrive Widget
\n", "\n", "To load an existing Hyperdrive Run instead of start new one, use `hd_run = hd.HyperDriveRun(exp, , hyperdrive_run_config=hd_run_config)`. You also can cancel the Run with `hd_run.cancel()`." - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 17, - "metadata": {}, - "outputs": [], "source": [ "EXP_NAME = \"movielens_\" + MOVIELENS_DATA_SIZE + \"_wide_deep_model\"\n", "exp = aml.core.Experiment(workspace=ws, name=EXP_NAME)" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "# Create an experiment run. Skip this to load an existing run instead\n", "hd_run = exp.submit(config=hd_run_config)\n", @@ -725,14 +722,20 @@ "# )\n", "\n", "hd_run.get_details()" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": 20, - "metadata": {}, + "source": [ + "# Get the list of runs from the experiment:\n", + "list(exp.get_runs())" + ], "outputs": [ { + "output_type": "execute_result", "data": { "text/plain": [ "[Run(Experiment: movielens_100k_wide_deep_model,\n", @@ -759,79 +762,44 @@ " Status: Running)]" ] }, - "execution_count": 20, "metadata": {}, - "output_type": "execute_result" + "execution_count": 20 } ], - "source": [ - "# Get the list of runs from the experiment:\n", - "list(exp.get_runs())" - ] + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], "source": [ "# Note, widgets don't work on JupyterLab\n", "widgets.RunDetails(hd_run).show()" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "Once all the child-runs are finished, we can get the best run and the metrics.\n", "> Note, if you run Hyperdrive experiment again, you will see the best metrics and corresponding hyperparameters are not the same. It is because of 1) the random initialization of the model and 2) Hyperdrive sampling (when you use RandomSampling). You will get different results as well if you use different training and validation sets." - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 17, - "metadata": {}, - "outputs": [], "source": [ "# Get best run and printout metrics\n", "best_run = hd_run.get_best_run_by_primary_metric()\n", "best_run_metrics = best_run.get_metrics()" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": 18, - "metadata": { - "scrolled": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "* Best Run Id: movielens_100k_wide_deep_model_1561733572398_41\n", - "\n", - "* Best hyperparameters:\n", - "Model type = wide_deep\n", - "Batch size = 32.0\n", - "Linear optimizer = adagrad\n", - "\tLearning rate = 0.0621\n", - "DNN optimizer = adadelta\n", - "\tUser embedding dimension = 32.0\n", - "\tItem embedding dimension = 16.0\n", - "\tHidden units = [0.0, 64.0, 128.0, 512.0]\n", - "\tLearning rate = 0.1000\n", - "\tDropout rate = 0.8000\n", - "\tBatch normalization = True\n", - "\n", - "* Performance metrics:\n", - "\tndcg_at_k (top-10) = 0.0555\n", - "\tprecision_at_k (top-10) = 0.0534\n", - "\trmse = 0.9552\n", - "\tmae = 0.7568\n" - ] - } - ], "source": [ "print(\"* Best Run Id:\", best_run.id)\n", "\n", @@ -873,34 +841,51 @@ " print(\"\\t{0} (top-{1}) = {2:.4f}\".format(m, TOP_K, best_run_metrics[m]))\n", "for m in RATING_METRICS:\n", " print(\"\\t{0} = {1:.4f}\".format(m, best_run_metrics[m])) " - ] + ], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "* Best Run Id: movielens_100k_wide_deep_model_1561733572398_41\n", + "\n", + "* Best hyperparameters:\n", + "Model type = wide_deep\n", + "Batch size = 32.0\n", + "Linear optimizer = adagrad\n", + "\tLearning rate = 0.0621\n", + "DNN optimizer = adadelta\n", + "\tUser embedding dimension = 32.0\n", + "\tItem embedding dimension = 16.0\n", + "\tHidden units = [0.0, 64.0, 128.0, 512.0]\n", + "\tLearning rate = 0.1000\n", + "\tDropout rate = 0.8000\n", + "\tBatch normalization = True\n", + "\n", + "* Performance metrics:\n", + "\tndcg_at_k (top-10) = 0.0555\n", + "\tprecision_at_k (top-10) = 0.0534\n", + "\trmse = 0.9552\n", + "\tmae = 0.7568\n" + ] + } + ], + "metadata": { + "scrolled": false + } }, { "cell_type": "markdown", - "metadata": {}, "source": [ "### 6. Model Import and Test\n", "\n", "[Wide-Deep Quickstart notebook](../00_quick_start/wide_deep_movielens.ipynb), which we've used in our Hyperdrive Experiment, exports the trained model to the output folder (the output path is recorded at `best_run_metrics['saved_model_dir']`). We can download a model from the best run and test it. " - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "outputs/model/1561737321/\n", - "Downloading outputs/model/1561737321/saved_model.pb..\n", - "Downloading outputs/model/1561737321/variables/variables.data-00000-of-00002..\n", - "Downloading outputs/model/1561737321/variables/variables.data-00001-of-00002..\n", - "Downloading outputs/model/1561737321/variables/variables.index..\n" - ] - } - ], "source": [ "MODEL_DIR = os.path.join(tmp_dir.name, 'aml_model')\n", "os.makedirs(MODEL_DIR, exist_ok=True)\n", @@ -914,14 +899,26 @@ " print(\"Downloading {}..\".format(f))\n", " best_run.download_file(name=f, output_file_path=output_file_path)\n", " \n", - "saved_model = tf.contrib.estimator.SavedModelEstimator(MODEL_DIR)" - ] + "saved_model = tf.saved_model.load(MODEL_DIR, tags=\"serve\")" + ], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "outputs/model/1561737321/\n", + "Downloading outputs/model/1561737321/saved_model.pb..\n", + "Downloading outputs/model/1561737321/variables/variables.data-00000-of-00002..\n", + "Downloading outputs/model/1561737321/variables/variables.data-00001-of-00002..\n", + "Downloading outputs/model/1561737321/variables/variables.index..\n" + ] + } + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 44, - "metadata": {}, - "outputs": [], "source": [ "cols = {\n", " 'col_user': USER_COL,\n", @@ -931,32 +928,13 @@ "}\n", "\n", "tf.logging.set_verbosity(tf.logging.ERROR)" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": 46, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "count 25000.000000\n", - "mean 3.525522\n", - "std 0.635910\n", - "min 0.140751\n", - "25% 3.129608\n", - "50% 3.576132\n", - "75% 3.973043\n", - "max 5.629328\n", - "Name: prediction, dtype: float64 \n", - "\n", - "rmse = 0.956280219325999\n", - "mae = 0.7553600390541554\n" - ] - } - ], "source": [ "# Rating prediction set\n", "X_test = test.drop(RATING_COL, axis=1)\n", @@ -964,15 +942,15 @@ "\n", "# Rating prediction\n", "predictions = list(itertools.islice(\n", - " saved_model.predict(\n", - " pandas_input_fn_for_saved_model(\n", + " saved_model.signatures[\"predict\"](\n", + " examples=pandas_input_fn_for_saved_model(\n", " df=X_test,\n", " feat_name_type={\n", " USER_COL: int,\n", " ITEM_COL: int,\n", " ITEM_FEAT_COL: list\n", " }\n", - " )\n", + " )()[\"inputs\"]\n", " ),\n", " len(X_test)\n", "))\n", @@ -983,13 +961,32 @@ "for m in RATING_METRICS:\n", " result = evaluator.metrics[m](test, prediction_df, **cols)\n", " print(m, \"=\", result)" - ] + ], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "count 25000.000000\n", + "mean 3.525522\n", + "std 0.635910\n", + "min 0.140751\n", + "25% 3.129608\n", + "50% 3.576132\n", + "75% 3.973043\n", + "max 5.629328\n", + "Name: prediction, dtype: float64 \n", + "\n", + "rmse = 0.956280219325999\n", + "mae = 0.7553600390541554\n" + ] + } + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 32, - "metadata": {}, - "outputs": [], "source": [ "# Unique items\n", "if ITEM_FEAT_COL is None:\n", @@ -1008,22 +1005,13 @@ " user_item_filter_df=pd.concat([train, valid]), # remove seen items\n", " shuffle=True\n", ")" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": 33, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "ndcg_at_k = 0.018009288572177713\n", - "precision_at_k = 0.01792152704135737\n" - ] - } - ], "source": [ "predictions = []\n", "# If we put all ranking_pool into a tensor, we get error (since the content limit is 2GB).\n", @@ -1032,15 +1020,15 @@ " pool.reset_index(drop=True, inplace=True)\n", " # Rating prediction\n", " pred = list(itertools.islice(\n", - " saved_model.predict(\n", - " pandas_input_fn_for_saved_model(\n", + " saved_model.signatures[\"predict\"](\n", + " examples=pandas_input_fn_for_saved_model(\n", " df=X_test,\n", " feat_name_type={\n", " USER_COL: int,\n", " ITEM_COL: int,\n", " ITEM_FEAT_COL: list\n", " }\n", - " )\n", + " )()[\"inputs\"]\n", " ),\n", " len(pool)\n", " ))\n", @@ -1051,57 +1039,32 @@ "for m in RANKING_METRICS:\n", " result = evaluator.metrics[m](test, ranking_pool, **{**cols, 'k': TOP_K})\n", " print(m, \"=\", result)" - ] + ], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "ndcg_at_k = 0.018009288572177713\n", + "precision_at_k = 0.01792152704135737\n" + ] + } + ], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "#### Wide-and-Deep Baseline Comparison\n", "To see if Hyperdrive found good hyperparameters, we simply compare with the model with known hyperparameters from [TensorFlow's wide-deep learning example](https://github.com/tensorflow/models/blob/master/official/wide_deep/movielens_main.py) which uses only the DNN part from the wide-and-deep model for MovieLens data.\n", "\n", "> Note, this is not 'apples to apples' comparison. For example, TensorFlow's movielens example uses *rating-timestamp* as a numeric feature, but we did not use that here because we think the timestamps are not relevant to the movies' ratings. This comparison is more like to show how Hyperdrive can help to find comparable hyperparameters without requiring exhaustive efforts in going over a huge search-space. " - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "ec87f42770694ffcba842b3fa8e93e2f", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "HBox(children=(IntProgress(value=0, max=34), HTML(value='')))" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Training and evaluation of Wide-and-Deep model took 357.3825697898865 secs.\n", - "ndcg_at_k = 0.013269362558705873\n", - "precision_at_k = 0.015482502651113467\n", - "rmse = 1.0421873135289017\n", - "mae = 0.8238318599748612\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/data/anaconda/envs/reco_gpu/lib/python3.6/site-packages/ipykernel_launcher.py:37: DeprecationWarning: Function read_notebook is deprecated and will be removed in verison 1.0.0 (current version 0.19.0). Please see `scrapbook.read_notebook` (nteract-scrapbook) as a replacement for this functionality.\n" - ] - } - ], "source": [ "OUTPUT_NOTEBOOK = os.path.join(tmp_dir.name, \"output.ipynb\")\n", "OUTPUT_MODEL_DIR = os.path.join(tmp_dir.name, \"known_hyperparam_model_checkpoints\")\n", @@ -1143,38 +1106,74 @@ " print(m, \"=\", nb.data[m])\n", "for m in RATING_METRICS:\n", " print(m, \"=\", nb.data[m])" - ] + ], + "outputs": [ + { + "output_type": "display_data", + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ec87f42770694ffcba842b3fa8e93e2f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(IntProgress(value=0, max=34), HTML(value='')))" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Training and evaluation of Wide-and-Deep model took 357.3825697898865 secs.\n", + "ndcg_at_k = 0.013269362558705873\n", + "precision_at_k = 0.015482502651113467\n", + "rmse = 1.0421873135289017\n", + "mae = 0.8238318599748612\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/data/anaconda/envs/reco_gpu/lib/python3.6/site-packages/ipykernel_launcher.py:37: DeprecationWarning: Function read_notebook is deprecated and will be removed in verison 1.0.0 (current version 0.19.0). Please see `scrapbook.read_notebook` (nteract-scrapbook) as a replacement for this functionality.\n" + ] + } + ], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "### Concluding Remark\n", "We showed how to tune hyperparameters by utilizing Azure Machine Learning service. Complex and powerful models like Wide-and-Deep model often have many number of hyperparameters that affect on the recommendation accuracy, and it is not practical to tune the model without using a GPU cluster. For example, a training and evaluation of a model took around 3 minutes on 100k MovieLens data on a single *Standard NC6* VM as we tested from the [above cell](#Wide-and-Deep-Baseline-Comparison). When we used 1M MovieLens, it took about 47 minutes. If we want to investigate through 100 different combinations of hyperparameters **manually**, it will take **78 hours** on the VM and we may still wonder if we had tested good candidates of hyperparameters. With AzureML, as we shown in this notebook, we can easily setup different size of GPU cluster fits to our problem and utilize Bayesian sampling to navigate through the huge search space efficiently, and tweak the experiment with different criteria and algorithms for further research." - ] + ], + "metadata": {} }, { "cell_type": "markdown", - "metadata": {}, "source": [ "#### Cleanup" - ] + ], + "metadata": {} }, { "cell_type": "code", "execution_count": 4, - "metadata": {}, - "outputs": [], "source": [ "tmp_dir.cleanup()" - ] + ], + "outputs": [], + "metadata": {} }, { "cell_type": "code", "execution_count": null, - "metadata": {}, + "source": [], "outputs": [], - "source": [] + "metadata": {} } ], "metadata": { From d2b03b7c16f4550cde5a23593e466d6745f82e53 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Mon, 18 Oct 2021 12:27:25 +0000 Subject: [PATCH 12/60] Replace tf.contrib.training.HParams with custom class --- .../KDD2020-tutorial/step3_run_dkn.ipynb | 4 +- .../step4_run_dkn_item2item.ipynb | 4 +- .../KDD2020-tutorial/step5_run_lightgcn.ipynb | 4 +- recommenders/models/deeprec/deeprec_utils.py | 233 ++++++------------ .../models/deeprec/models/base_model.py | 5 +- .../sequential/sequential_base_model.py | 4 +- .../recommenders/models/test_deeprec_utils.py | 12 - .../unit/recommenders/utils/test_tf_utils.py | 2 +- 8 files changed, 88 insertions(+), 180 deletions(-) diff --git a/examples/07_tutorials/KDD2020-tutorial/step3_run_dkn.ipynb b/examples/07_tutorials/KDD2020-tutorial/step3_run_dkn.ipynb index b6e9908299..9c986a0856 100644 --- a/examples/07_tutorials/KDD2020-tutorial/step3_run_dkn.ipynb +++ b/examples/07_tutorials/KDD2020-tutorial/step3_run_dkn.ipynb @@ -151,7 +151,7 @@ " use_entity=True,\n", " use_context=True\n", " )\n", - "print(hparams.values)" + "print(hparams.values())" ] }, { @@ -389,4 +389,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/examples/07_tutorials/KDD2020-tutorial/step4_run_dkn_item2item.ipynb b/examples/07_tutorials/KDD2020-tutorial/step4_run_dkn_item2item.ipynb index a91f422217..fe486132bf 100644 --- a/examples/07_tutorials/KDD2020-tutorial/step4_run_dkn_item2item.ipynb +++ b/examples/07_tutorials/KDD2020-tutorial/step4_run_dkn_item2item.ipynb @@ -85,7 +85,7 @@ " use_entity=True,\n", " use_context=True\n", " )\n", - "print(hparams.values)" + "print(hparams.values())" ] }, { @@ -284,4 +284,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/examples/07_tutorials/KDD2020-tutorial/step5_run_lightgcn.ipynb b/examples/07_tutorials/KDD2020-tutorial/step5_run_lightgcn.ipynb index 16782a1c57..02477c68c5 100644 --- a/examples/07_tutorials/KDD2020-tutorial/step5_run_lightgcn.ipynb +++ b/examples/07_tutorials/KDD2020-tutorial/step5_run_lightgcn.ipynb @@ -270,7 +270,7 @@ } ], "source": [ - "hparams.values" + "print(hparams.values())" ] }, { @@ -471,4 +471,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/recommenders/models/deeprec/deeprec_utils.py b/recommenders/models/deeprec/deeprec_utils.py index d929a53bd1..abf82a839f 100644 --- a/recommenders/models/deeprec/deeprec_utils.py +++ b/recommenders/models/deeprec/deeprec_utils.py @@ -13,9 +13,7 @@ import numpy as np import yaml import zipfile -import json import pickle as pkl -import tensorflow as tf from recommenders.datasets.download_utils import maybe_download @@ -304,6 +302,34 @@ def load_yaml(filename): raise IOError("load {0} error!".format(filename)) +class HParams(): + """Class for holding hyperparameters for DeepRec algorithms. + """ + def __init__(self, hparams_dict): + """Create an HParams object from a dictionary of hyperparameter values. + + Args: + hparams_dict (dict): Dictionary with the model hyperparameters. + """ + for val in hparams_dict.values(): + if not (isinstance(val, int) or isinstance(val, float) or isinstance(val, str) or isinstance(val, list)): + raise ValueError("Hyperparameter value {} should be integer, float, string or list.".format(val)) + self._values = hparams_dict + for hparam in hparams_dict: + setattr(self, hparam, hparams_dict[hparam]) + + def __repr__(self): + return "HParams object with values {}".format(self._values.__repr__()) + + def values(self): + """Return the hyperparameter values as a dictionary. + + Returns: + dict: Dictionary with teh hyperparameter values. + """ + return self._values + + def create_hparams(flags): """Create the model hyperparameters. @@ -311,167 +337,62 @@ def create_hparams(flags): flags (dict): Dictionary with the model requirements. Returns: - tf.contrib.training.HParams: Hyperparameter object in TF. + HParams: Hyperparameter object. """ - return tf.contrib.training.HParams( - # data - kg_file=flags["kg_file"] if "kg_file" in flags else None, - user_clicks=flags["user_clicks"] if "user_clicks" in flags else None, - FEATURE_COUNT=flags["FEATURE_COUNT"] if "FEATURE_COUNT" in flags else None, - FIELD_COUNT=flags["FIELD_COUNT"] if "FIELD_COUNT" in flags else None, - data_format=flags["data_format"] if "data_format" in flags else None, - PAIR_NUM=flags["PAIR_NUM"] if "PAIR_NUM" in flags else None, - DNN_FIELD_NUM=flags["DNN_FIELD_NUM"] if "DNN_FIELD_NUM" in flags else None, - n_user=flags["n_user"] if "n_user" in flags else None, - n_item=flags["n_item"] if "n_item" in flags else None, - n_user_attr=flags["n_user_attr"] if "n_user_attr" in flags else None, - n_item_attr=flags["n_item_attr"] if "n_item_attr" in flags else None, - iterator_type=flags["iterator_type"] if "iterator_type" in flags else None, - SUMMARIES_DIR=flags["SUMMARIES_DIR"] if "SUMMARIES_DIR" in flags else None, - MODEL_DIR=flags["MODEL_DIR"] if "MODEL_DIR" in flags else None, + init_dict = { # dkn - wordEmb_file=flags["wordEmb_file"] if "wordEmb_file" in flags else None, - entityEmb_file=flags["entityEmb_file"] if "entityEmb_file" in flags else None, - contextEmb_file=flags["contextEmb_file"] - if "contextEmb_file" in flags - else None, - news_feature_file=flags["news_feature_file"] - if "news_feature_file" in flags - else None, - user_history_file=flags["user_history_file"] - if "user_history_file" in flags - else None, - use_entity=flags["use_entity"] if "use_entity" in flags else True, - use_context=flags["use_context"] if "use_context" in flags else True, - doc_size=flags["doc_size"] if "doc_size" in flags else None, - history_size=flags["history_size"] if "history_size" in flags else None, - word_size=flags["word_size"] if "word_size" in flags else None, - entity_size=flags["entity_size"] if "entity_size" in flags else None, - entity_dim=flags["entity_dim"] if "entity_dim" in flags else None, - entity_embedding_method=flags["entity_embedding_method"] - if "entity_embedding_method" in flags - else None, - transform=flags["transform"] if "transform" in flags else None, - train_ratio=flags["train_ratio"] if "train_ratio" in flags else None, + 'use_entity': True, + 'use_context': True, # model - dim=flags["dim"] if "dim" in flags else None, - layer_sizes=flags["layer_sizes"] if "layer_sizes" in flags else None, - cross_layer_sizes=flags["cross_layer_sizes"] - if "cross_layer_sizes" in flags - else None, - cross_layers=flags["cross_layers"] if "cross_layers" in flags else None, - activation=flags["activation"] if "activation" in flags else None, - cross_activation=flags["cross_activation"] - if "cross_activation" in flags - else "identity", - user_dropout=flags["user_dropout"] if "user_dropout" in flags else False, - dropout=flags["dropout"] if "dropout" in flags else [0.0], - attention_layer_sizes=flags["attention_layer_sizes"] - if "attention_layer_sizes" in flags - else None, - attention_activation=flags["attention_activation"] - if "attention_activation" in flags - else None, - attention_dropout=flags["attention_dropout"] - if "attention_dropout" in flags - else 0.0, - model_type=flags["model_type"] if "model_type" in flags else None, - method=flags["method"] if "method" in flags else None, - load_saved_model=flags["load_saved_model"] - if "load_saved_model" in flags - else False, - load_model_name=flags["load_model_name"] - if "load_model_name" in flags - else None, - filter_sizes=flags["filter_sizes"] if "filter_sizes" in flags else None, - num_filters=flags["num_filters"] if "num_filters" in flags else None, - mu=flags["mu"] if "mu" in flags else None, - fast_CIN_d=flags["fast_CIN_d"] if "fast_CIN_d" in flags else 0, - use_Linear_part=flags["use_Linear_part"] - if "use_Linear_part" in flags - else False, - use_FM_part=flags["use_FM_part"] if "use_FM_part" in flags else False, - use_CIN_part=flags["use_CIN_part"] if "use_CIN_part" in flags else False, - use_DNN_part=flags["use_DNN_part"] if "use_DNN_part" in flags else False, + 'cross_activation': 'identity', + 'user_dropout': False, + 'dropout': [0.0], + 'attention_dropout': 0.0, + 'load_saved_model': False, + 'fast_CIN_d': 0, + 'use_Linear_part': False, + 'use_FM_part': False, + 'use_CIN_part': False, + 'use_DNN_part': False, # train - init_method=flags["init_method"] if "init_method" in flags else "tnormal", - init_value=flags["init_value"] if "init_value" in flags else 0.01, - embed_l2=flags["embed_l2"] if "embed_l2" in flags else 0.0000, - embed_l1=flags["embed_l1"] if "embed_l1" in flags else 0.0000, - layer_l2=flags["layer_l2"] if "layer_l2" in flags else 0.0000, - layer_l1=flags["layer_l1"] if "layer_l1" in flags else 0.0000, - cross_l2=flags["cross_l2"] if "cross_l2" in flags else 0.0000, - cross_l1=flags["cross_l1"] if "cross_l1" in flags else 0.0000, - reg_kg=flags["reg_kg"] if "reg_kg" in flags else 0.0000, - learning_rate=flags["learning_rate"] if "learning_rate" in flags else 0.001, - lr_rs=flags["lr_rs"] if "lr_rs" in flags else 1, - lr_kg=flags["lr_kg"] if "lr_kg" in flags else 0.5, - kg_training_interval=flags["kg_training_interval"] - if "kg_training_interval" in flags - else 5, - max_grad_norm=flags["max_grad_norm"] if "max_grad_norm" in flags else 2, - is_clip_norm=flags["is_clip_norm"] if "is_clip_norm" in flags else 0, - dtype=flags["dtype"] if "dtype" in flags else 32, - loss=flags["loss"] if "loss" in flags else None, - optimizer=flags["optimizer"] if "optimizer" in flags else "adam", - epochs=flags["epochs"] if "epochs" in flags else 10, - batch_size=flags["batch_size"] if "batch_size" in flags else 1, - enable_BN=flags["enable_BN"] if "enable_BN" in flags else False, + 'init_method': 'tnormal', + 'init_value': 0.01, + 'embed_l2': 0.0, + 'embed_l1': 0.0, + 'layer_l2': 0.0, + 'layer_l1': 0.0, + 'cross_l2': 0.0, + 'cross_l1': 0.0, + 'reg_kg': 0.0, + 'learning_rate': 0.001, + 'lr_rs': 1, + 'lr_kg': 0.5, + 'kg_training_interval': 5, + 'max_grad_norm': 2, + 'is_clip_norm': 0, + 'dtype': 32, + 'optimizer': 'adam', + 'epochs': 10, + 'batch_size': 1, + 'enable_BN': False, # show info - show_step=flags["show_step"] if "show_step" in flags else 1, - save_model=flags["save_model"] if "save_model" in flags else True, - save_epoch=flags["save_epoch"] if "save_epoch" in flags else 5, - metrics=flags["metrics"] if "metrics" in flags else None, - write_tfevents=flags["write_tfevents"] if "write_tfevents" in flags else False, + 'show_step': 1, + 'save_model': True, + 'save_epoch': 5, + 'write_tfevents': False, # sequential - item_embedding_dim=flags["item_embedding_dim"] - if "item_embedding_dim" in flags - else None, - cate_embedding_dim=flags["cate_embedding_dim"] - if "cate_embedding_dim" in flags - else None, - user_embedding_dim=flags["user_embedding_dim"] - if "user_embedding_dim" in flags - else None, - train_num_ngs=flags["train_num_ngs"] if "train_num_ngs" in flags else 4, - need_sample=flags["need_sample"] if "need_sample" in flags else True, - embedding_dropout=flags["embedding_dropout"] - if "embedding_dropout" in flags - else 0.0, - user_vocab=flags["user_vocab"] if "user_vocab" in flags else None, - item_vocab=flags["item_vocab"] if "item_vocab" in flags else None, - cate_vocab=flags["cate_vocab"] if "cate_vocab" in flags else None, - pairwise_metrics=flags["pairwise_metrics"] - if "pairwise_metrics" in flags - else None, - EARLY_STOP=flags["EARLY_STOP"] if "EARLY_STOP" in flags else 100, - # gru4rec - max_seq_length=flags["max_seq_length"] if "max_seq_length" in flags else None, - hidden_size=flags["hidden_size"] if "hidden_size" in flags else None, + 'train_num_ngs': 4, + 'need_sample': True, + 'embedding_dropout': 0.0, + 'EARLY_STOP': 100, # caser, - L=flags["L"] if "L" in flags else None, - T=flags["T"] if "T" in flags else None, - n_v=flags["n_v"] if "n_v" in flags else None, - n_h=flags["n_h"] if "n_h" in flags else None, - min_seq_length=flags["min_seq_length"] if "min_seq_length" in flags else 1, - # sli_rec - attention_size=flags["attention_size"] if "attention_size" in flags else None, - att_fcn_layer_sizes=flags["att_fcn_layer_sizes"] - if "att_fcn_layer_sizes" in flags - else None, - # nextitnet - dilations=flags["dilations"] if "dilations" in flags else None, - kernel_size=flags["kernel_size"] if "kernel_size" in flags else None, - # lightgcn - embed_size=flags["embed_size"] if "embed_size" in flags else None, - n_layers=flags["n_layers"] if "n_layers" in flags else None, - decay=flags["decay"] if "decay" in flags else None, - eval_epoch=flags["eval_epoch"] if "eval_epoch" in flags else None, - top_k=flags["top_k"] if "top_k" in flags else None, + 'min_seq_length': 1, # sum - slots=flags["slots"] if "slots" in flags else 5, - cell=flags["cell"] if "cell" in flags else "SUM", - ) + 'slots': 5, + 'cell': 'SUM' + } + init_dict.update(flags) + return HParams(init_dict) def prepare_hparams(yaml_file=None, **kwargs): @@ -481,7 +402,7 @@ def prepare_hparams(yaml_file=None, **kwargs): yaml_file (str): YAML file as configuration. Returns: - tf.contrib.training.HParams: Hyperparameter object in TF. + HParams: Hyperparameter object. """ if yaml_file is not None: config = load_yaml(yaml_file) diff --git a/recommenders/models/deeprec/models/base_model.py b/recommenders/models/deeprec/models/base_model.py index 0c3465931b..6bf59c0ad7 100644 --- a/recommenders/models/deeprec/models/base_model.py +++ b/recommenders/models/deeprec/models/base_model.py @@ -7,7 +7,6 @@ import os import numpy as np import tensorflow as tf -from tensorflow import keras from recommenders.models.deeprec.deeprec_utils import cal_metric @@ -22,7 +21,7 @@ def __init__(self, hparams, iterator_creator, graph=None, seed=None): parameter set. Args: - hparams (object): A `tf.contrib.training.HParams` object, hold the entire set of hyperparameters. + hparams (object): An `HParams` object, holds the entire set of hyperparameters. iterator_creator (object): An iterator to load the data. graph (object): An optional graph. seed (int): Random seed. @@ -34,7 +33,7 @@ def __init__(self, hparams, iterator_creator, graph=None, seed=None): self.graph = graph if graph is not None else tf.Graph() self.iterator = iterator_creator(hparams, self.graph) self.train_num_ngs = ( - hparams.train_num_ngs if "train_num_ngs" in hparams else None + hparams.train_num_ngs if "train_num_ngs" in hparams.values() else None ) with self.graph.as_default(): diff --git a/recommenders/models/deeprec/models/sequential/sequential_base_model.py b/recommenders/models/deeprec/models/sequential/sequential_base_model.py index 275b873d5e..ef3823708a 100644 --- a/recommenders/models/deeprec/models/sequential/sequential_base_model.py +++ b/recommenders/models/deeprec/models/sequential/sequential_base_model.py @@ -36,9 +36,9 @@ def __init__(self, hparams, iterator_creator, graph=None, seed=None): "Please confirm the number of negative samples for each positive instance." ) self.min_seq_length = ( - hparams.min_seq_length if "min_seq_length" in hparams else 1 + hparams.min_seq_length if "min_seq_length" in hparams.values() else 1 ) - self.hidden_size = hparams.hidden_size if "hidden_size" in hparams else None + self.hidden_size = hparams.hidden_size if "hidden_size" in hparams.values() else None self.graph = tf.Graph() if not graph else graph with self.graph.as_default(): diff --git a/tests/unit/recommenders/models/test_deeprec_utils.py b/tests/unit/recommenders/models/test_deeprec_utils.py index dc53b59a80..92600d57bf 100644 --- a/tests/unit/recommenders/models/test_deeprec_utils.py +++ b/tests/unit/recommenders/models/test_deeprec_utils.py @@ -3,10 +3,6 @@ import os import pytest -from recommenders.datasets.amazon_reviews import ( - download_and_extract, - data_preprocessing, -) try: from recommenders.models.deeprec.deeprec_utils import ( @@ -14,14 +10,6 @@ download_deeprec_resources, load_yaml, ) - from recommenders.models.deeprec.io.iterator import FFMTextIterator - from recommenders.models.deeprec.io.dkn_item2item_iterator import ( - DKNItem2itemTextIterator, - ) - from recommenders.models.deeprec.io.dkn_iterator import DKNTextIterator - from recommenders.models.deeprec.io.sequential_iterator import SequentialIterator - from recommenders.models.deeprec.models.sequential.sli_rec import SLI_RECModel - import tensorflow as tf except ImportError: pass # skip this import if we are in cpu environment diff --git a/tests/unit/recommenders/utils/test_tf_utils.py b/tests/unit/recommenders/utils/test_tf_utils.py index d893659dc0..cbf6e7cad8 100644 --- a/tests/unit/recommenders/utils/test_tf_utils.py +++ b/tests/unit/recommenders/utils/test_tf_utils.py @@ -28,6 +28,7 @@ build_feature_columns, ) import tensorflow as tf + tf.compat.v1.disable_eager_execution() # need to disable eager in TF2.x except ImportError: pass # skip this import if we are in cpu environment @@ -61,7 +62,6 @@ def pd_df(): def test_pandas_input_fn(pd_df): df, _, _ = pd_df - tf.compat.v1.disable_eager_execution() # need to disable eager in TF2.x # check dataset dataset = pandas_input_fn(df)() batch = tf.compat.v1.data.make_one_shot_iterator(dataset).get_next() From 2efcac0330467ff0fe302456a283f04cd47c1c17 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 19 Oct 2021 13:49:31 +0000 Subject: [PATCH 13/60] Fix DKN model --- .../models/deeprec/models/base_model.py | 1 + recommenders/models/deeprec/models/dkn.py | 20 ++++++++----------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/recommenders/models/deeprec/models/base_model.py b/recommenders/models/deeprec/models/base_model.py index 6bf59c0ad7..63014ff350 100644 --- a/recommenders/models/deeprec/models/base_model.py +++ b/recommenders/models/deeprec/models/base_model.py @@ -10,6 +10,7 @@ from recommenders.models.deeprec.deeprec_utils import cal_metric +tf.compat.v1.disable_eager_execution() __all__ = ["BaseModel"] diff --git a/recommenders/models/deeprec/models/dkn.py b/recommenders/models/deeprec/models/dkn.py index 2baae07566..86752e455a 100644 --- a/recommenders/models/deeprec/models/dkn.py +++ b/recommenders/models/deeprec/models/dkn.py @@ -40,13 +40,11 @@ def __init__(self, hparams, iterator_creator): if hparams.use_entity: e_embedding = self._init_embedding(hparams.entityEmb_file) W = tf.Variable( - tf.random.uniform([hparams.entity_dim, hparams.dim], -1, 1) - ) - b = tf.Variable(tf.zeros([hparams.dim])) - e_embedding_transformed = tf.nn.tanh(tf.matmul(e_embedding, W) + b) - self.entity_embedding = tf.Variable( - e_embedding_transformed, trainable=True, name="entity" + tf.random.uniform([hparams.entity_dim, hparams.dim], -1, 1), + trainable=True ) + b = tf.Variable(tf.zeros([hparams.dim]), trainable=True) + self.entity_embedding = tf.nn.tanh(tf.matmul(e_embedding, W) + b) else: self.entity_embedding = tf.Variable( tf.constant( @@ -61,13 +59,11 @@ def __init__(self, hparams, iterator_creator): if hparams.use_context: c_embedding = self._init_embedding(hparams.contextEmb_file) W = tf.Variable( - tf.random.uniform([hparams.entity_dim, hparams.dim], -1, 1) - ) - b = tf.Variable(tf.zeros([hparams.dim])) - c_embedding_transformed = tf.nn.tanh(tf.matmul(c_embedding, W) + b) - self.context_embedding = tf.Variable( - c_embedding_transformed, trainable=True, name="context" + tf.random.uniform([hparams.entity_dim, hparams.dim], -1, 1), + trainable=True ) + b = tf.Variable(tf.zeros([hparams.dim]), trainable=True) + self.context_embedding = tf.nn.tanh(tf.matmul(c_embedding, W) + b) else: self.context_embedding = tf.Variable( tf.constant( From e5ec62178c6733599222753c4e6377e755e83ec7 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 19 Oct 2021 17:38:41 +0000 Subject: [PATCH 14/60] Fix XDeepFM hparams --- recommenders/models/deeprec/models/base_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recommenders/models/deeprec/models/base_model.py b/recommenders/models/deeprec/models/base_model.py index 63014ff350..198c07d30e 100644 --- a/recommenders/models/deeprec/models/base_model.py +++ b/recommenders/models/deeprec/models/base_model.py @@ -570,7 +570,7 @@ def run_eval(self, filename): labels.extend(np.reshape(step_labels, -1)) imp_indexs.extend(np.reshape(imp_index, -1)) res = cal_metric(labels, preds, self.hparams.metrics) - if self.hparams.pairwise_metrics is not None: + if "pairwise_metrics" in self.hparams.values(): group_labels, group_preds = self.group_labels(labels, preds, imp_indexs) res_pairwise = cal_metric( group_labels, group_preds, self.hparams.pairwise_metrics From f3d0437ef9ced6a055e07ef375d32c22c34d659f Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Wed, 20 Oct 2021 11:02:27 +0000 Subject: [PATCH 15/60] Fix tf version --- .../00_quick_start/wide_deep_movielens.ipynb | 28 +++++++++++++------ .../train_scripts/wide_deep_training.py | 2 +- recommenders/models/deeprec/deeprec_utils.py | 2 +- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/examples/00_quick_start/wide_deep_movielens.ipynb b/examples/00_quick_start/wide_deep_movielens.ipynb index 4c61b4c303..9a8a20bc24 100644 --- a/examples/00_quick_start/wide_deep_movielens.ipynb +++ b/examples/00_quick_start/wide_deep_movielens.ipynb @@ -42,13 +42,21 @@ "execution_count": 1, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/envs/tf2/lib/python3.7/site-packages/papermill/iorw.py:50: FutureWarning: pyarrow.HadoopFileSystem is deprecated as of 2.0.0, please use pyarrow.fs.HadoopFileSystem instead.\n", + " from pyarrow import HadoopFileSystem\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "Tensorflow Version: 1.15.2\n", + "Tensorflow Version: 2.6.0\n", "GPUs:\n", - " [{'device_name': 'TITAN V', 'total_memory': 12065.375, 'free_memory': 10537.0625}, {'device_name': 'TITAN V', 'total_memory': 12066.6875, 'free_memory': 11137.75}, {'device_name': 'TITAN V', 'total_memory': 12066.6875, 'free_memory': 11137.75}]\n" + " [{'device_name': 'Tesla T4', 'total_memory': 16127.625, 'free_memory': 16027.625}]\n" ] } ], @@ -79,7 +87,7 @@ "import recommenders.evaluation.python_evaluation as evaluator\n", "import recommenders.models.wide_deep.wide_deep_utils as wide_deep\n", "\n", - "print(\"Tensorflow Version:\", tf.VERSION)\n", + "print(\"Tensorflow Version:\", tf.__version__)\n", "print(\"GPUs:\\n\", gpu_utils.get_gpu_info())" ] }, @@ -800,7 +808,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -1077,10 +1085,12 @@ } ], "metadata": { + "interpreter": { + "hash": "3a9a0c422ff9f08d62211b9648017c63b0a26d2c935edc37ebb8453675d13bb5" + }, "kernelspec": { - "display_name": "Python (reco_gpu)", - "language": "python", - "name": "reco_gpu" + "display_name": "Python 3.7.11 64-bit ('tf2': conda)", + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -1092,9 +1102,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.11" + "version": "3.7.11" } }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/examples/04_model_select_and_optimize/train_scripts/wide_deep_training.py b/examples/04_model_select_and_optimize/train_scripts/wide_deep_training.py index b92cc870ec..37506f8924 100644 --- a/examples/04_model_select_and_optimize/train_scripts/wide_deep_training.py +++ b/examples/04_model_select_and_optimize/train_scripts/wide_deep_training.py @@ -10,7 +10,7 @@ import papermill as pm import tensorflow as tf -print("TensorFlow version:", tf.VERSION) +print("TensorFlow version:", tf.__version__) try: from azureml.core import Run diff --git a/recommenders/models/deeprec/deeprec_utils.py b/recommenders/models/deeprec/deeprec_utils.py index abf82a839f..c01ef2c450 100644 --- a/recommenders/models/deeprec/deeprec_utils.py +++ b/recommenders/models/deeprec/deeprec_utils.py @@ -325,7 +325,7 @@ def values(self): """Return the hyperparameter values as a dictionary. Returns: - dict: Dictionary with teh hyperparameter values. + dict: Dictionary with the hyperparameter values. """ return self._values From ba702e5632aa30256ad37f6925e6f4f745054cee Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Wed, 20 Oct 2021 13:36:08 +0000 Subject: [PATCH 16/60] Replace tf.logging in notebooks --- .../00_quick_start/wide_deep_movielens.ipynb | 2 +- .../azureml_hyperdrive_wide_and_deep.ipynb | 624 +++++++++--------- .../KDD2020-tutorial/step3_run_dkn.ipynb | 2 +- .../step4_run_dkn_item2item.ipynb | 2 +- .../KDD2020-tutorial/step5_run_lightgcn.ipynb | 2 +- 5 files changed, 316 insertions(+), 316 deletions(-) diff --git a/examples/00_quick_start/wide_deep_movielens.ipynb b/examples/00_quick_start/wide_deep_movielens.ipynb index 9a8a20bc24..8e01cd7698 100644 --- a/examples/00_quick_start/wide_deep_movielens.ipynb +++ b/examples/00_quick_start/wide_deep_movielens.ipynb @@ -721,7 +721,7 @@ " \"Training steps = {}, Batch size = {} (num epochs = {})\"\n", " .format(STEPS, BATCH_SIZE, (STEPS*BATCH_SIZE)//len(train))\n", ")\n", - "tf.logging.set_verbosity(tf.logging.INFO)\n", + "tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.INFO)\n", "\n", "try:\n", " model.train(\n", diff --git a/examples/04_model_select_and_optimize/azureml_hyperdrive_wide_and_deep.ipynb b/examples/04_model_select_and_optimize/azureml_hyperdrive_wide_and_deep.ipynb index e47cb6d157..e01e7f5f04 100644 --- a/examples/04_model_select_and_optimize/azureml_hyperdrive_wide_and_deep.ipynb +++ b/examples/04_model_select_and_optimize/azureml_hyperdrive_wide_and_deep.ipynb @@ -2,16 +2,17 @@ "cells": [ { "cell_type": "markdown", + "metadata": {}, "source": [ "Copyright (c) Microsoft Corporation. All rights reserved.
\n", "Licensed under the MIT License.
\n", "
\n", "# Wide-and-Deep Model Hyperparameter Tuning with AzureML" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "This notebook shows how to auto-tune hyperparameters of a recommender model by utilizing **Azure Machine Learning service** ([AzureML](https://azure.microsoft.com/en-us/services/machine-learning-service/))a, b.\n", "\n", @@ -38,22 +39,32 @@ "---\n", "a. To use AzureML, you will need an Azure subscription.
\n", "b. When you web-search \"Azure Machine Learning\", you will most likely to see mixed results of Azure Machine Learning (AzureML) and Azure Machine Learning **Studio**. Please note they are different services where AzureML's focuses are on ML model management, tracking and hyperparameter tuning, while the [ML Studio](https://studio.azureml.net/)'s is to provide a high-level tool for 'easy-to-use' experience of ML designing and experimentation based on GUI.
" - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 1, + "metadata": {}, + "outputs": [], "source": [ "%reload_ext autoreload\n", "%autoreload 2" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Azure ML SDK Version: 1.0.10\n", + "Tensorflow Version: 1.12.0\n" + ] + } + ], "source": [ "import sys\n", "\n", @@ -86,21 +97,11 @@ "\n", "# Temp dir to cache temporal files while running this notebook\n", "tmp_dir = TemporaryDirectory()" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Azure ML SDK Version: 1.0.10\n", - "Tensorflow Version: 1.12.0\n" - ] - } - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### 1. Create and Configure AzureML Workspace\n", "**AzureML workspace** is a foundational block in the cloud that you use to experiment, train, and deploy machine learning models via AzureML service. In this notebook, we 1) create a workspace from [**Azure portal**](https://portal.azure.com) and 2) configure from this notebook.\n", @@ -118,12 +119,17 @@ "* Option 2: Use [AzureML SDK](https://docs.microsoft.com/en-us/python/api/overview/azure/ml/intro?view=azure-ml-py#workspace) - Run following cell\n", " * To find the full list of supported region, use Azure CLI from [your machine](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest) or [cloud shell](https://azure.microsoft.com/en-us/features/cloud-shell/) to run: `az account list-locations`\n", " * To locate your tenant id, use Azure CLI to run: `az account show`" - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 3, + "metadata": { + "tags": [ + "parameters" + ] + }, + "outputs": [], "source": [ "# AzureML workspace information. Set them to create a workspace.\n", "SUBSCRIPTION_ID = None #''\n", @@ -156,17 +162,29 @@ "ITEM_COL = 'MovieId'\n", "RATING_COL = 'Rating'\n", "ITEM_FEAT_COL = 'Genres'\n" - ], - "outputs": [], - "metadata": { - "tags": [ - "parameters" - ] - } + ] }, { "cell_type": "code", "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found the config file in: /data/home/jumin/git/reco/notebooks/04_model_select_and_optimize/aml_config/config.json\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Falling back to use azure cli credentials. This fall back to use azure cli credentials will be removed in the next release. \n", + "Make sure your code doesn't require 'az login' to have happened before using azureml-sdk, except the case when you are specifying AzureCliAuthentication in azureml-sdk.\n" + ] + } + ], "source": [ "if TENANT_ID:\n", " auth = aml.core.authentication.InteractiveLoginAuthentication(\n", @@ -199,52 +217,35 @@ "# If you are using an already-configured workspace config.json file\n", "else:\n", " ws = aml.core.Workspace.from_config(auth=auth)" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Found the config file in: /data/home/jumin/git/reco/notebooks/04_model_select_and_optimize/aml_config/config.json\n" - ] - }, - { - "output_type": "stream", - "name": "stderr", - "text": [ - "Falling back to use azure cli credentials. This fall back to use azure cli credentials will be removed in the next release. \n", - "Make sure your code doesn't require 'az login' to have happened before using azureml-sdk, except the case when you are specifying AzureCliAuthentication in azureml-sdk.\n" - ] - } - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "To verify your workspace, run:" - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 5, - "source": [ - "print(\"AzureML workspace name: \", ws.name)" - ], + "metadata": {}, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "AzureML workspace name: junminaml\n" ] } ], - "metadata": {} + "source": [ + "print(\"AzureML workspace name: \", ws.name)" + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### 2. Create Remote Compute Target\n", "\n", @@ -258,12 +259,22 @@ "\n", "\n", "For more information about Azure virtual machine sizes, see [here](https://docs.microsoft.com/en-us/azure/virtual-machines/windows/sizes-gpu)." - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found existing compute target\n", + "{'allocationState': 'Steady', 'allocationStateTransitionTime': '2019-06-28T16:58:16.459000+00:00', 'creationTime': '2019-06-18T21:09:39.101231+00:00', 'currentNodeCount': 0, 'errors': None, 'modifiedTime': '2019-06-18T21:09:55.347615+00:00', 'nodeStateCounts': {'idleNodeCount': 0, 'leavingNodeCount': 0, 'preemptedNodeCount': 0, 'preparingNodeCount': 0, 'runningNodeCount': 0, 'unusableNodeCount': 0}, 'provisioningState': 'Succeeded', 'provisioningStateTransitionTime': None, 'scaleSettings': {'minNodeCount': 0, 'maxNodeCount': 8, 'nodeIdleTimeBeforeScaleDown': 'PT120S'}, 'targetNodeCount': 0, 'vmPriority': 'LowPriority', 'vmSize': 'STANDARD_NC6'}\n" + ] + } + ], "source": [ "CLUSTER_NAME = 'gpu-cluster-nc6'\n", "\n", @@ -284,55 +295,29 @@ "\n", "# Use the 'status' property to get a detailed status for the current cluster. \n", "print(compute_target.status.serialize())" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Found existing compute target\n", - "{'allocationState': 'Steady', 'allocationStateTransitionTime': '2019-06-28T16:58:16.459000+00:00', 'creationTime': '2019-06-18T21:09:39.101231+00:00', 'currentNodeCount': 0, 'errors': None, 'modifiedTime': '2019-06-18T21:09:55.347615+00:00', 'nodeStateCounts': {'idleNodeCount': 0, 'leavingNodeCount': 0, 'preemptedNodeCount': 0, 'preparingNodeCount': 0, 'runningNodeCount': 0, 'unusableNodeCount': 0}, 'provisioningState': 'Succeeded', 'provisioningStateTransitionTime': None, 'scaleSettings': {'minNodeCount': 0, 'maxNodeCount': 8, 'nodeIdleTimeBeforeScaleDown': 'PT120S'}, 'targetNodeCount': 0, 'vmPriority': 'LowPriority', 'vmSize': 'STANDARD_NC6'}\n" - ] - } - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### 3. Prepare Data\n", "For demonstration purpose, we use 100k MovieLens dataset. First, download the data and convert the format (multi-hot encode *genres*) to make it work for our model. More details about this step is described in our [Wide-Deep Quickstart notebook](../00_quick_start/wide_deep_movielens.ipynb)." - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 7, - "source": [ - "data = movielens.load_pandas_df(\n", - " size=MOVIELENS_DATA_SIZE,\n", - " header=[USER_COL, ITEM_COL, RATING_COL],\n", - " genres_col=ITEM_FEAT_COL\n", - ")\n", - "\n", - "# Encode 'genres' into int array (multi-hot representation) to use as item features\n", - "genres_encoder = sklearn.preprocessing.MultiLabelBinarizer()\n", - "data[ITEM_FEAT_COL] = genres_encoder.fit_transform(\n", - " data[ITEM_FEAT_COL].apply(lambda s: s.split(\"|\"))\n", - ").tolist()\n", - "\n", - "data.head()" - ], + "metadata": {}, "outputs": [ { - "output_type": "stream", "name": "stderr", + "output_type": "stream", "text": [ "100%|██████████| 4.81k/4.81k [00:00<00:00, 18.1kKB/s]\n" ] }, { - "output_type": "execute_result", "data": { "text/html": [ "
\n", @@ -408,24 +393,52 @@ "4 306 242 5.0 [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ..." ] }, + "execution_count": 7, "metadata": {}, - "execution_count": 7 + "output_type": "execute_result" } ], - "metadata": {} + "source": [ + "data = movielens.load_pandas_df(\n", + " size=MOVIELENS_DATA_SIZE,\n", + " header=[USER_COL, ITEM_COL, RATING_COL],\n", + " genres_col=ITEM_FEAT_COL\n", + ")\n", + "\n", + "# Encode 'genres' into int array (multi-hot representation) to use as item features\n", + "genres_encoder = sklearn.preprocessing.MultiLabelBinarizer()\n", + "data[ITEM_FEAT_COL] = genres_encoder.fit_transform(\n", + " data[ITEM_FEAT_COL].apply(lambda s: s.split(\"|\"))\n", + ").tolist()\n", + "\n", + "data.head()" + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "The dataset is split into train, validation, and test sets. The train and validation sets will be used for hyperparameter tuning, and the test set will be used for the final evaluation of the model after we import the best model from AzureML workspace.\n", "\n", "Here, we don't use multiple-split directly by passing `ratio=[0.56, 0.19, 0.25]`. Instead, we first split the data into train and test sets with the same `seed` we've been using in other notebooks to make the train set identical across them. Then, we further split the train set into train and validation sets." - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Number of samples:\n", + "- Training = 56250\n", + "- Validation = 18750\n", + "- Testing = 25000\n" + ] + } + ], "source": [ "# Use the same seed to make the train and test sets identical across other notebooks in the repo.\n", "train, test = python_random_split(data, ratio=0.75, seed=SEED)\n", @@ -438,54 +451,23 @@ " \"- Validation = {}\\n\"\n", " \"- Testing = {}\".format(len(train), len(valid), len(test))\n", ")" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Number of samples:\n", - "- Training = 56250\n", - "- Validation = 18750\n", - "- Testing = 25000\n" - ] - } - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Now, upload the train and validation sets to the AzureML workspace. Our Hyperdrivce experiment will use them." - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 12, - "source": [ - "DATA_DIR = os.path.join(tmp_dir.name, 'aml_data') \n", - "\n", - "os.makedirs(DATA_DIR, exist_ok=True)\n", - "\n", - "TRAIN_FILE_NAME = \"movielens_\" + MOVIELENS_DATA_SIZE + \"_train.pkl\"\n", - "train.to_pickle(os.path.join(DATA_DIR, TRAIN_FILE_NAME))\n", - "VALID_FILE_NAME = \"movielens_\" + MOVIELENS_DATA_SIZE + \"_valid.pkl\"\n", - "valid.to_pickle(os.path.join(DATA_DIR, VALID_FILE_NAME))\n", - "\n", - "# Note, all the files under DATA_DIR will be uploaded to the data store\n", - "ds = ws.get_default_datastore()\n", - "ds.upload(\n", - " src_dir=DATA_DIR,\n", - " target_path='data',\n", - " overwrite=True,\n", - " show_progress=True\n", - ")" - ], + "metadata": {}, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "Uploading /tmp/tmpwby7dwh4/aml_data/movielens_100k_train.pkl\n", "Uploading /tmp/tmpwby7dwh4/aml_data/movielens_100k_valid.pkl\n", @@ -494,20 +476,39 @@ ] }, { - "output_type": "execute_result", "data": { "text/plain": [ "$AZUREML_DATAREFERENCE_ec1d8219afb44a36adf66ff9ece918f4" ] }, + "execution_count": 12, "metadata": {}, - "execution_count": 12 + "output_type": "execute_result" } ], - "metadata": {} + "source": [ + "DATA_DIR = os.path.join(tmp_dir.name, 'aml_data') \n", + "\n", + "os.makedirs(DATA_DIR, exist_ok=True)\n", + "\n", + "TRAIN_FILE_NAME = \"movielens_\" + MOVIELENS_DATA_SIZE + \"_train.pkl\"\n", + "train.to_pickle(os.path.join(DATA_DIR, TRAIN_FILE_NAME))\n", + "VALID_FILE_NAME = \"movielens_\" + MOVIELENS_DATA_SIZE + \"_valid.pkl\"\n", + "valid.to_pickle(os.path.join(DATA_DIR, VALID_FILE_NAME))\n", + "\n", + "# Note, all the files under DATA_DIR will be uploaded to the data store\n", + "ds = ws.get_default_datastore()\n", + "ds.upload(\n", + " src_dir=DATA_DIR,\n", + " target_path='data',\n", + " overwrite=True,\n", + " show_progress=True\n", + ")" + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### 4. Prepare Training Scripts\n", "Next step is to prepare scripts that AzureML Hyperdrive will use to train and evaluate models with selected hyperparameters. We re-use our [Wide-Deep Quickstart notebook](../00_quick_start/wide_deep_movielens.ipynb) for that. To run the model notebook from the Hyperdrive Run, all we need is to prepare an [entry script](../../recommenders/azureml/wide_deep.py) which parses the hyperparameter arguments, passes them to the notebook, and records the results of the notebook to AzureML Run logs by using `papermill`. Hyperdrive uses the logs to track the performance of each hyperparameter-set and finds the best performed one. \n", @@ -537,12 +538,13 @@ ")\n", "...\n", "```" - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 13, + "metadata": {}, + "outputs": [], "source": [ "# Prepare all the necessary scripts which will be loaded to our Hyperdrive Experiment Run\n", "SCRIPT_DIR = os.path.join(tmp_dir.name, 'aml_script')\n", @@ -564,12 +566,11 @@ "\n", "# This is our entry script for Hyperdrive Run\n", "ENTRY_SCRIPT_NAME = 'train_scripts/wide_deep_training.py'" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### 5. Setup and Run Hyperdrive Experiment\n", "\n", @@ -578,12 +579,13 @@ "In this notebook, we fix the number of training steps to 50000.\n", "\n", "In the search space, we set different linear and DNN optimizers, structures, learning rates and regularization rates. Details about the hyperparameters can be found from our [Wide-Deep Quickstart notebook](../00_quick_start/wide_deep_movielens.ipynb)." - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 14, + "metadata": {}, + "outputs": [], "source": [ "# Script parameters. New AzureML API only accepts string values.\n", "script_params = {\n", @@ -625,24 +627,24 @@ " '--dnn-batch-norm': hd.choice(0, 1),\n", " '--dnn-dropout': hd.uniform(0.0, 0.8)\n", "}" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "\n", "#### 5.2 Create Hyperdrive Experiment \n", "[Hyperdrive](https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-tune-hyperparameters) creates a machine learning experiment [**Run**](https://docs.microsoft.com/en-us/python/api/azureml-core/azureml.core.run?view=azure-ml-py) on the workspace and utilizes child-runs to search the best set of hyperparameters. [Experiment](https://docs.microsoft.com/en-us/python/api/azureml-core/azureml.core.experiment(class)?view=azure-ml-py) is the main entry point into experimenting with AzureML. To create new Experiment or get the existing one, we pass our experimentation name.\n", "\n", "**AzureML Estimator** is the building block for training. An Estimator encapsulates the training code and parameters, the compute resources and runtime environment for a particular training scenario (Note, this is not TensorFlow's Estimator). In the following cell, we create the Estimator with additional dependencies of our model scripts." - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 15, + "metadata": {}, + "outputs": [], "source": [ "est = aml.train.estimator.Estimator(\n", " source_directory=SCRIPT_DIR,\n", @@ -653,22 +655,22 @@ " conda_packages=['pandas', 'scikit-learn', 'numba', 'matplotlib'],\n", " pip_packages=['ipykernel', 'papermill==0.18.2', 'tensorflow-gpu==1.12']\n", ")" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "We set our primary metric with the goal (hyperparameter search criteria), hyperparameter sampling method, and number of total child-runs to the Hyperdrive Run Config. The bigger the search space, the more number of runs we will need for better results.\n", "\n", "Hyperdrive provides three different parameter sampling methods: `RandomParameterSampling`, `GridParameterSampling`, and `BayesianParameterSampling`. Details about each method can be found from [Azure doc](https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-tune-hyperparameters). Here, we use the Bayesian sampling." - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 16, + "metadata": {}, + "outputs": [], "source": [ "hd_run_config = hd.HyperDriveRunConfig(\n", " estimator=est, \n", @@ -678,12 +680,11 @@ " max_total_runs=MAX_TOTAL_RUNS,\n", " max_concurrent_runs=MAX_CONCURRENT_RUNS\n", ")" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "#### 5.3 Run Experiment\n", "\n", @@ -694,22 +695,23 @@ "
AzureML Hyperdrive Widget
\n", "\n", "To load an existing Hyperdrive Run instead of start new one, use `hd_run = hd.HyperDriveRun(exp, , hyperdrive_run_config=hd_run_config)`. You also can cancel the Run with `hd_run.cancel()`." - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 17, + "metadata": {}, + "outputs": [], "source": [ "EXP_NAME = \"movielens_\" + MOVIELENS_DATA_SIZE + \"_wide_deep_model\"\n", "exp = aml.core.Experiment(workspace=ws, name=EXP_NAME)" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Create an experiment run. Skip this to load an existing run instead\n", "hd_run = exp.submit(config=hd_run_config)\n", @@ -722,20 +724,14 @@ "# )\n", "\n", "hd_run.get_details()" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 20, - "source": [ - "# Get the list of runs from the experiment:\n", - "list(exp.get_runs())" - ], + "metadata": {}, "outputs": [ { - "output_type": "execute_result", "data": { "text/plain": [ "[Run(Experiment: movielens_100k_wide_deep_model,\n", @@ -762,44 +758,79 @@ " Status: Running)]" ] }, + "execution_count": 20, "metadata": {}, - "execution_count": 20 + "output_type": "execute_result" } ], - "metadata": {} + "source": [ + "# Get the list of runs from the experiment:\n", + "list(exp.get_runs())" + ] }, { "cell_type": "code", "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Note, widgets don't work on JupyterLab\n", "widgets.RunDetails(hd_run).show()" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Once all the child-runs are finished, we can get the best run and the metrics.\n", "> Note, if you run Hyperdrive experiment again, you will see the best metrics and corresponding hyperparameters are not the same. It is because of 1) the random initialization of the model and 2) Hyperdrive sampling (when you use RandomSampling). You will get different results as well if you use different training and validation sets." - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 17, + "metadata": {}, + "outputs": [], "source": [ "# Get best run and printout metrics\n", "best_run = hd_run.get_best_run_by_primary_metric()\n", "best_run_metrics = best_run.get_metrics()" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 18, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "* Best Run Id: movielens_100k_wide_deep_model_1561733572398_41\n", + "\n", + "* Best hyperparameters:\n", + "Model type = wide_deep\n", + "Batch size = 32.0\n", + "Linear optimizer = adagrad\n", + "\tLearning rate = 0.0621\n", + "DNN optimizer = adadelta\n", + "\tUser embedding dimension = 32.0\n", + "\tItem embedding dimension = 16.0\n", + "\tHidden units = [0.0, 64.0, 128.0, 512.0]\n", + "\tLearning rate = 0.1000\n", + "\tDropout rate = 0.8000\n", + "\tBatch normalization = True\n", + "\n", + "* Performance metrics:\n", + "\tndcg_at_k (top-10) = 0.0555\n", + "\tprecision_at_k (top-10) = 0.0534\n", + "\trmse = 0.9552\n", + "\tmae = 0.7568\n" + ] + } + ], "source": [ "print(\"* Best Run Id:\", best_run.id)\n", "\n", @@ -841,51 +872,34 @@ " print(\"\\t{0} (top-{1}) = {2:.4f}\".format(m, TOP_K, best_run_metrics[m]))\n", "for m in RATING_METRICS:\n", " print(\"\\t{0} = {1:.4f}\".format(m, best_run_metrics[m])) " - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "* Best Run Id: movielens_100k_wide_deep_model_1561733572398_41\n", - "\n", - "* Best hyperparameters:\n", - "Model type = wide_deep\n", - "Batch size = 32.0\n", - "Linear optimizer = adagrad\n", - "\tLearning rate = 0.0621\n", - "DNN optimizer = adadelta\n", - "\tUser embedding dimension = 32.0\n", - "\tItem embedding dimension = 16.0\n", - "\tHidden units = [0.0, 64.0, 128.0, 512.0]\n", - "\tLearning rate = 0.1000\n", - "\tDropout rate = 0.8000\n", - "\tBatch normalization = True\n", - "\n", - "* Performance metrics:\n", - "\tndcg_at_k (top-10) = 0.0555\n", - "\tprecision_at_k (top-10) = 0.0534\n", - "\trmse = 0.9552\n", - "\tmae = 0.7568\n" - ] - } - ], - "metadata": { - "scrolled": false - } + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### 6. Model Import and Test\n", "\n", "[Wide-Deep Quickstart notebook](../00_quick_start/wide_deep_movielens.ipynb), which we've used in our Hyperdrive Experiment, exports the trained model to the output folder (the output path is recorded at `best_run_metrics['saved_model_dir']`). We can download a model from the best run and test it. " - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "outputs/model/1561737321/\n", + "Downloading outputs/model/1561737321/saved_model.pb..\n", + "Downloading outputs/model/1561737321/variables/variables.data-00000-of-00002..\n", + "Downloading outputs/model/1561737321/variables/variables.data-00001-of-00002..\n", + "Downloading outputs/model/1561737321/variables/variables.index..\n" + ] + } + ], "source": [ "MODEL_DIR = os.path.join(tmp_dir.name, 'aml_model')\n", "os.makedirs(MODEL_DIR, exist_ok=True)\n", @@ -900,25 +914,13 @@ " best_run.download_file(name=f, output_file_path=output_file_path)\n", " \n", "saved_model = tf.saved_model.load(MODEL_DIR, tags=\"serve\")" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "outputs/model/1561737321/\n", - "Downloading outputs/model/1561737321/saved_model.pb..\n", - "Downloading outputs/model/1561737321/variables/variables.data-00000-of-00002..\n", - "Downloading outputs/model/1561737321/variables/variables.data-00001-of-00002..\n", - "Downloading outputs/model/1561737321/variables/variables.index..\n" - ] - } - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 44, + "metadata": {}, + "outputs": [], "source": [ "cols = {\n", " 'col_user': USER_COL,\n", @@ -927,14 +929,33 @@ " 'col_prediction': 'prediction'\n", "}\n", "\n", - "tf.logging.set_verbosity(tf.logging.ERROR)" - ], - "outputs": [], - "metadata": {} + "tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)" + ] }, { "cell_type": "code", "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "count 25000.000000\n", + "mean 3.525522\n", + "std 0.635910\n", + "min 0.140751\n", + "25% 3.129608\n", + "50% 3.576132\n", + "75% 3.973043\n", + "max 5.629328\n", + "Name: prediction, dtype: float64 \n", + "\n", + "rmse = 0.956280219325999\n", + "mae = 0.7553600390541554\n" + ] + } + ], "source": [ "# Rating prediction set\n", "X_test = test.drop(RATING_COL, axis=1)\n", @@ -961,32 +982,13 @@ "for m in RATING_METRICS:\n", " result = evaluator.metrics[m](test, prediction_df, **cols)\n", " print(m, \"=\", result)" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "count 25000.000000\n", - "mean 3.525522\n", - "std 0.635910\n", - "min 0.140751\n", - "25% 3.129608\n", - "50% 3.576132\n", - "75% 3.973043\n", - "max 5.629328\n", - "Name: prediction, dtype: float64 \n", - "\n", - "rmse = 0.956280219325999\n", - "mae = 0.7553600390541554\n" - ] - } - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 32, + "metadata": {}, + "outputs": [], "source": [ "# Unique items\n", "if ITEM_FEAT_COL is None:\n", @@ -1005,13 +1007,22 @@ " user_item_filter_df=pd.concat([train, valid]), # remove seen items\n", " shuffle=True\n", ")" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ndcg_at_k = 0.018009288572177713\n", + "precision_at_k = 0.01792152704135737\n" + ] + } + ], "source": [ "predictions = []\n", "# If we put all ranking_pool into a tensor, we get error (since the content limit is 2GB).\n", @@ -1039,32 +1050,57 @@ "for m in RANKING_METRICS:\n", " result = evaluator.metrics[m](test, ranking_pool, **{**cols, 'k': TOP_K})\n", " print(m, \"=\", result)" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "ndcg_at_k = 0.018009288572177713\n", - "precision_at_k = 0.01792152704135737\n" - ] - } - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "#### Wide-and-Deep Baseline Comparison\n", "To see if Hyperdrive found good hyperparameters, we simply compare with the model with known hyperparameters from [TensorFlow's wide-deep learning example](https://github.com/tensorflow/models/blob/master/official/wide_deep/movielens_main.py) which uses only the DNN part from the wide-and-deep model for MovieLens data.\n", "\n", "> Note, this is not 'apples to apples' comparison. For example, TensorFlow's movielens example uses *rating-timestamp* as a numeric feature, but we did not use that here because we think the timestamps are not relevant to the movies' ratings. This comparison is more like to show how Hyperdrive can help to find comparable hyperparameters without requiring exhaustive efforts in going over a huge search-space. " - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ec87f42770694ffcba842b3fa8e93e2f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HBox(children=(IntProgress(value=0, max=34), HTML(value='')))" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Training and evaluation of Wide-and-Deep model took 357.3825697898865 secs.\n", + "ndcg_at_k = 0.013269362558705873\n", + "precision_at_k = 0.015482502651113467\n", + "rmse = 1.0421873135289017\n", + "mae = 0.8238318599748612\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/data/anaconda/envs/reco_gpu/lib/python3.6/site-packages/ipykernel_launcher.py:37: DeprecationWarning: Function read_notebook is deprecated and will be removed in verison 1.0.0 (current version 0.19.0). Please see `scrapbook.read_notebook` (nteract-scrapbook) as a replacement for this functionality.\n" + ] + } + ], "source": [ "OUTPUT_NOTEBOOK = os.path.join(tmp_dir.name, \"output.ipynb\")\n", "OUTPUT_MODEL_DIR = os.path.join(tmp_dir.name, \"known_hyperparam_model_checkpoints\")\n", @@ -1106,74 +1142,38 @@ " print(m, \"=\", nb.data[m])\n", "for m in RATING_METRICS:\n", " print(m, \"=\", nb.data[m])" - ], - "outputs": [ - { - "output_type": "display_data", - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "ec87f42770694ffcba842b3fa8e93e2f", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "HBox(children=(IntProgress(value=0, max=34), HTML(value='')))" - ] - }, - "metadata": {} - }, - { - "output_type": "stream", - "name": "stdout", - "text": [ - "\n", - "Training and evaluation of Wide-and-Deep model took 357.3825697898865 secs.\n", - "ndcg_at_k = 0.013269362558705873\n", - "precision_at_k = 0.015482502651113467\n", - "rmse = 1.0421873135289017\n", - "mae = 0.8238318599748612\n" - ] - }, - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/data/anaconda/envs/reco_gpu/lib/python3.6/site-packages/ipykernel_launcher.py:37: DeprecationWarning: Function read_notebook is deprecated and will be removed in verison 1.0.0 (current version 0.19.0). Please see `scrapbook.read_notebook` (nteract-scrapbook) as a replacement for this functionality.\n" - ] - } - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### Concluding Remark\n", "We showed how to tune hyperparameters by utilizing Azure Machine Learning service. Complex and powerful models like Wide-and-Deep model often have many number of hyperparameters that affect on the recommendation accuracy, and it is not practical to tune the model without using a GPU cluster. For example, a training and evaluation of a model took around 3 minutes on 100k MovieLens data on a single *Standard NC6* VM as we tested from the [above cell](#Wide-and-Deep-Baseline-Comparison). When we used 1M MovieLens, it took about 47 minutes. If we want to investigate through 100 different combinations of hyperparameters **manually**, it will take **78 hours** on the VM and we may still wonder if we had tested good candidates of hyperparameters. With AzureML, as we shown in this notebook, we can easily setup different size of GPU cluster fits to our problem and utilize Bayesian sampling to navigate through the huge search space efficiently, and tweak the experiment with different criteria and algorithms for further research." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "#### Cleanup" - ], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": 4, + "metadata": {}, + "outputs": [], "source": [ "tmp_dir.cleanup()" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "code", "execution_count": null, - "source": [], + "metadata": {}, "outputs": [], - "metadata": {} + "source": [] } ], "metadata": { @@ -1198,4 +1198,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/examples/07_tutorials/KDD2020-tutorial/step3_run_dkn.ipynb b/examples/07_tutorials/KDD2020-tutorial/step3_run_dkn.ipynb index 9c986a0856..2d2e80adfa 100644 --- a/examples/07_tutorials/KDD2020-tutorial/step3_run_dkn.ipynb +++ b/examples/07_tutorials/KDD2020-tutorial/step3_run_dkn.ipynb @@ -63,7 +63,7 @@ "import time\n", "\n", "import tensorflow as tf\n", - "tf.logging.set_verbosity(tf.logging.ERROR)" + "tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)" ] }, { diff --git a/examples/07_tutorials/KDD2020-tutorial/step4_run_dkn_item2item.ipynb b/examples/07_tutorials/KDD2020-tutorial/step4_run_dkn_item2item.ipynb index fe486132bf..fe9c56b75c 100644 --- a/examples/07_tutorials/KDD2020-tutorial/step4_run_dkn_item2item.ipynb +++ b/examples/07_tutorials/KDD2020-tutorial/step4_run_dkn_item2item.ipynb @@ -31,7 +31,7 @@ "import time\n", "\n", "import tensorflow as tf\n", - "tf.logging.set_verbosity(tf.logging.ERROR)" + "tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)" ] }, { diff --git a/examples/07_tutorials/KDD2020-tutorial/step5_run_lightgcn.ipynb b/examples/07_tutorials/KDD2020-tutorial/step5_run_lightgcn.ipynb index 02477c68c5..9eb90ce2a2 100644 --- a/examples/07_tutorials/KDD2020-tutorial/step5_run_lightgcn.ipynb +++ b/examples/07_tutorials/KDD2020-tutorial/step5_run_lightgcn.ipynb @@ -49,7 +49,7 @@ "from utils.data_helper import *\n", "from utils.task_helper import *\n", "\n", - "tf.logging.set_verbosity(tf.logging.ERROR)" + "tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR)" ] }, { From 1b83ffec02a9e9c024f876facd80d318778a9663 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Wed, 20 Oct 2021 14:46:32 +0000 Subject: [PATCH 17/60] Fix tf.summary in notebook --- examples/00_quick_start/wide_deep_movielens.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/00_quick_start/wide_deep_movielens.ipynb b/examples/00_quick_start/wide_deep_movielens.ipynb index 8e01cd7698..63aa1fe170 100644 --- a/examples/00_quick_start/wide_deep_movielens.ipynb +++ b/examples/00_quick_start/wide_deep_movielens.ipynb @@ -1068,7 +1068,7 @@ "outputs": [], "source": [ "# Close the event file so that the model folder can be cleaned up.\n", - "summary_writer = tf.summary.FileWriterCache.get(model.model_dir)\n", + "summary_writer = tf.compat.v1.summary.FileWriterCache.get(model.model_dir)\n", "summary_writer.close()\n", "\n", "# Cleanup temporary directory if used\n", From d258bfed857a03185856fb4904ab2f8b57a334d9 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Wed, 20 Oct 2021 15:17:08 +0000 Subject: [PATCH 18/60] Hparams for newsrec --- .../deeprec/models/graphrec/lightgcn.py | 2 +- .../models/deeprec/models/sequential/caser.py | 2 +- .../sequential/sequential_base_model.py | 2 +- .../models/newsrec/models/base_model.py | 4 +- recommenders/models/newsrec/newsrec_utils.py | 80 ++++++------------- 5 files changed, 29 insertions(+), 61 deletions(-) diff --git a/recommenders/models/deeprec/models/graphrec/lightgcn.py b/recommenders/models/deeprec/models/graphrec/lightgcn.py index 7b01e5f85b..1fe925a672 100644 --- a/recommenders/models/deeprec/models/graphrec/lightgcn.py +++ b/recommenders/models/deeprec/models/graphrec/lightgcn.py @@ -30,7 +30,7 @@ def __init__(self, hparams, data, seed=None): """Initializing the model. Create parameters, placeholders, embeddings and loss function. Args: - hparams (object): A tf.contrib.training.HParams object, hold the entire set of hyperparameters. + hparams (HParams): A HParams object, hold the entire set of hyperparameters. data (object): A recommenders.models.deeprec.DataModel.ImplicitCF object, load and process data. seed (int): Seed. diff --git a/recommenders/models/deeprec/models/sequential/caser.py b/recommenders/models/deeprec/models/sequential/caser.py index aa881832bf..8cd75842d4 100644 --- a/recommenders/models/deeprec/models/sequential/caser.py +++ b/recommenders/models/deeprec/models/sequential/caser.py @@ -23,7 +23,7 @@ def __init__(self, hparams, iterator_creator, seed=None): """Initialization of variables for caser Args: - hparams (object): A tf.contrib.training.HParams object, hold the entire set of hyperparameters. + hparams (HParams): A HParams object, hold the entire set of hyperparameters. iterator_creator (object): An iterator to load the data. """ self.hparams = hparams diff --git a/recommenders/models/deeprec/models/sequential/sequential_base_model.py b/recommenders/models/deeprec/models/sequential/sequential_base_model.py index ef3823708a..876147d325 100644 --- a/recommenders/models/deeprec/models/sequential/sequential_base_model.py +++ b/recommenders/models/deeprec/models/sequential/sequential_base_model.py @@ -22,7 +22,7 @@ def __init__(self, hparams, iterator_creator, graph=None, seed=None): parameter set. Args: - hparams (object): A `tf.contrib.training.HParams` object, hold the entire set of hyperparameters. + hparams (HParams): A `HParams` object, hold the entire set of hyperparameters. iterator_creator (object): An iterator to load the data. graph (object): An optional graph. seed (int): Random seed. diff --git a/recommenders/models/newsrec/models/base_model.py b/recommenders/models/newsrec/models/base_model.py index 882e4576c7..120b4cbeb6 100644 --- a/recommenders/models/newsrec/models/base_model.py +++ b/recommenders/models/newsrec/models/base_model.py @@ -18,7 +18,7 @@ class BaseModel: """Basic class of models Attributes: - hparams (object): A tf.contrib.training.HParams object, hold the entire set of hyperparameters. + hparams (HParams): A HParams object, holds the entire set of hyperparameters. train_iterator (object): An iterator to load the data in training steps. test_iterator (object): An iterator to load the data in testing steps. graph (object): An optional graph. @@ -35,7 +35,7 @@ def __init__( parameter set. Args: - hparams (object): A tf.contrib.training.HParams object, hold the entire set of hyperparameters. + hparams (HParams): A HParams object, holds the entire set of hyperparameters. iterator_creator (object): An iterator to load the data. graph (object): An optional graph. seed (int): Random seed. diff --git a/recommenders/models/newsrec/newsrec_utils.py b/recommenders/models/newsrec/newsrec_utils.py index df5b053b92..18ea4c2bc5 100644 --- a/recommenders/models/newsrec/newsrec_utils.py +++ b/recommenders/models/newsrec/newsrec_utils.py @@ -2,26 +2,12 @@ # Licensed under the MIT License. -import tensorflow as tf -import os -from sklearn.metrics import ( - roc_auc_score, - log_loss, - mean_squared_error, - accuracy_score, - f1_score, -) -import numpy as np -import yaml -import zipfile from recommenders.datasets.download_utils import maybe_download from recommenders.models.deeprec.deeprec_utils import ( flat_config, + HParams, load_yaml, - load_dict, ) -import json -import pickle as pkl import random import re @@ -226,55 +212,37 @@ def create_hparams(flags): flags (dict): Dictionary with the model requirements. Returns: - object: Hyperparameter object in TF (tf.contrib.training.HParams). + HParams: Hyperparameter object. """ - return tf.contrib.training.HParams( + init_dict = { # data - data_format=flags.get("data_format", None), - iterator_type=flags.get("iterator_type", None), - support_quick_scoring=flags.get("support_quick_scoring", False), - wordEmb_file=flags.get("wordEmb_file", None), - wordDict_file=flags.get("wordDict_file", None), - userDict_file=flags.get("userDict_file", None), - vertDict_file=flags.get("vertDict_file", None), - subvertDict_file=flags.get("subvertDict_file", None), + "support_quick_scoring": False, # models - title_size=flags.get("title_size", None), - body_size=flags.get("body_size", None), - word_emb_dim=flags.get("word_emb_dim", None), - word_size=flags.get("word_size", None), - user_num=flags.get("user_num", None), - vert_num=flags.get("vert_num", None), - subvert_num=flags.get("subvert_num", None), - his_size=flags.get("his_size", None), - npratio=flags.get("npratio"), - dropout=flags.get("dropout", 0.0), - attention_hidden_dim=flags.get("attention_hidden_dim", 200), + "dropout": 0.0, + "attention_hidden_dim": 200, # nrms - head_num=flags.get("head_num", 4), - head_dim=flags.get("head_dim", 100), + "head_num": 4, + "head_dim": 100, # naml - cnn_activation=flags.get("cnn_activation", None), - dense_activation=flags.get("dense_activation", None), - filter_num=flags.get("filter_num", 200), - window_size=flags.get("window_size", 3), - vert_emb_dim=flags.get("vert_emb_dim", 100), - subvert_emb_dim=flags.get("subvert_emb_dim", 100), + "filter_num": 200, + "window_size": 3, + "vert_emb_dim": 100, + "subvert_emb_dim": 100, # lstur - gru_unit=flags.get("gru_unit", 400), - type=flags.get("type", "ini"), + "gru_unit": 400, + "type": "ini", # npa - user_emb_dim=flags.get("user_emb_dim", 50), + "user_emb_dim": 50, # train - learning_rate=flags.get("learning_rate", 0.001), - loss=flags.get("loss", None), - optimizer=flags.get("optimizer", "adam"), - epochs=flags.get("epochs", 10), - batch_size=flags.get("batch_size", 1), + "learning_rate": 0.001, + "optimizer": "adam", + "epochs": 10, + "batch_size": 1, # show info - show_step=flags.get("show_step", 1), - metrics=flags.get("metrics", None), - ) + "show_step": 1 + } + init_dict.update(flags) + return HParams(init_dict) def prepare_hparams(yaml_file=None, **kwargs): @@ -284,7 +252,7 @@ def prepare_hparams(yaml_file=None, **kwargs): yaml_file (str): YAML file as configuration. Returns: - object: Hyperparameter object in TF (tf.contrib.training.HParams). + HParams: Hyperparameter object. """ if yaml_file is not None: config = load_yaml(yaml_file) From 1d1b21156eb97e08aad28dd974f9a3f3ab7ae6ef Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Mon, 25 Oct 2021 11:51:17 +0000 Subject: [PATCH 19/60] Fix LSTUR run --- recommenders/models/ncf/ncf_singlenode.py | 3 +-- recommenders/models/newsrec/models/base_model.py | 4 +++- recommenders/models/newsrec/models/layers.py | 7 +++---- recommenders/models/newsrec/models/lstur.py | 6 ++---- recommenders/models/newsrec/models/nrms.py | 1 - 5 files changed, 9 insertions(+), 12 deletions(-) diff --git a/recommenders/models/ncf/ncf_singlenode.py b/recommenders/models/ncf/ncf_singlenode.py index 5f5ba5216d..83eecb5762 100644 --- a/recommenders/models/ncf/ncf_singlenode.py +++ b/recommenders/models/ncf/ncf_singlenode.py @@ -9,9 +9,8 @@ import logging +tf.compat.v1.disable_eager_execution() logger = logging.getLogger(__name__) - - MODEL_CHECKPOINT = "model.ckpt" diff --git a/recommenders/models/newsrec/models/base_model.py b/recommenders/models/newsrec/models/base_model.py index 120b4cbeb6..a489cb543b 100644 --- a/recommenders/models/newsrec/models/base_model.py +++ b/recommenders/models/newsrec/models/base_model.py @@ -7,10 +7,12 @@ import numpy as np from tqdm import tqdm import tensorflow as tf -from tensorflow import keras +from tensorflow.compat.v1 import keras from recommenders.models.deeprec.deeprec_utils import cal_metric +tf.compat.v1.disable_eager_execution() +tf.compat.v1.experimental.output_all_intermediates(True) __all__ = ["BaseModel"] diff --git a/recommenders/models/newsrec/models/layers.py b/recommenders/models/newsrec/models/layers.py index dd2743fd5e..b8be7dfc9e 100644 --- a/recommenders/models/newsrec/models/layers.py +++ b/recommenders/models/newsrec/models/layers.py @@ -1,7 +1,6 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -import tensorflow as tf import tensorflow.keras as keras from tensorflow.keras import layers from tensorflow.keras import backend as K @@ -124,8 +123,8 @@ def __init__(self, multiheads, head_dim, seed=0, mask_right=False, **kwargs): Args: multiheads (int): The number of heads. - head_dim (object): Dimention of each head. - mask_right (boolean): whether to mask right words. + head_dim (object): Dimension of each head. + mask_right (boolean): Whether to mask right words. """ self.multiheads = multiheads @@ -204,7 +203,7 @@ def call(self, QKVs): """Core logic of multi-head self attention. Args: - QKVs (list): inputs of multi-head self attention i.e. qeury, key and value. + QKVs (list): inputs of multi-head self attention i.e. query, key and value. Returns: object: ouput tensors. diff --git a/recommenders/models/newsrec/models/lstur.py b/recommenders/models/newsrec/models/lstur.py index 1cf4f8f55a..5632e02415 100644 --- a/recommenders/models/newsrec/models/lstur.py +++ b/recommenders/models/newsrec/models/lstur.py @@ -1,10 +1,8 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -import numpy as np -import tensorflow as tf -import tensorflow.keras as keras -from tensorflow.keras import layers +import tensorflow.compat.v1.keras as keras +from tensorflow.compat.v1.keras import layers from recommenders.models.newsrec.models.base_model import BaseModel diff --git a/recommenders/models/newsrec/models/nrms.py b/recommenders/models/newsrec/models/nrms.py index 7cccc4fd26..1fddcad401 100644 --- a/recommenders/models/newsrec/models/nrms.py +++ b/recommenders/models/newsrec/models/nrms.py @@ -93,7 +93,6 @@ def _build_graph(self): object: a model used to train. object: a model used to evaluate and inference. """ - hparams = self.hparams model, scorer = self._build_nrms() return model, scorer From f205d157cc3ec8adc315106165e48dd94425108d Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Mon, 25 Oct 2021 15:15:32 +0000 Subject: [PATCH 20/60] Replace batch_dot with einsum in self attention layer --- recommenders/models/newsrec/models/layers.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/recommenders/models/newsrec/models/layers.py b/recommenders/models/newsrec/models/layers.py index b8be7dfc9e..0b0eed12c5 100644 --- a/recommenders/models/newsrec/models/layers.py +++ b/recommenders/models/newsrec/models/layers.py @@ -1,9 +1,10 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -import tensorflow.keras as keras -from tensorflow.keras import layers -from tensorflow.keras import backend as K +import tensorflow.compat.v1.keras as keras +from tensorflow.compat.v1.linalg import einsum +from tensorflow.compat.v1.keras import layers +from tensorflow.compat.v1.keras import backend as K class AttLayer2(layers.Layer): @@ -231,7 +232,7 @@ def call(self, QKVs): ) V_seq = K.permute_dimensions(V_seq, pattern=(0, 2, 1, 3)) - A = K.batch_dot(Q_seq, K_seq, axes=[3, 3]) / K.sqrt( + A = einsum('abij, abkj -> abik', Q_seq, K_seq) / K.sqrt( K.cast(self.head_dim, dtype="float32") ) A = K.permute_dimensions( @@ -248,7 +249,7 @@ def call(self, QKVs): A = A - mask A = K.softmax(A) - O_seq = K.batch_dot(A, V_seq, axes=[3, 2]) + O_seq = einsum('abij, abjk -> abik', A, V_seq) O_seq = K.permute_dimensions(O_seq, pattern=(0, 2, 1, 3)) O_seq = K.reshape(O_seq, shape=(-1, K.shape(O_seq)[1], self.output_dim)) From df7ed263a73c721e2853dab3dfbbef9ede500fec Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Mon, 25 Oct 2021 15:51:06 +0000 Subject: [PATCH 21/60] Change Adam in RBM --- recommenders/models/rbm/rbm.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/recommenders/models/rbm/rbm.py b/recommenders/models/rbm/rbm.py index 67aeec1830..1791e8b61e 100644 --- a/recommenders/models/rbm/rbm.py +++ b/recommenders/models/rbm/rbm.py @@ -2,14 +2,13 @@ # Licensed under the MIT License. import numpy as np -import pandas as pd -import math import matplotlib.pyplot as plt import tensorflow as tf import logging import time as tm +tf.compat.v1.disable_eager_execution() log = logging.getLogger(__name__) @@ -598,7 +597,7 @@ def generate_graph(self): self.learning_rate / self.minibatch ) # learning rate rescaled by the batch size - self.opt = tf.contrib.optimizer_v2.AdamOptimizer(learning_rate=rate).minimize( + self.opt = tf.compat.v1.train.AdamOptimizer(learning_rate=rate).minimize( loss=obj ) # Instantiate the optimizer From c29bc4198efcec534a4432e324cbbc97b3a0c98c Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 26 Oct 2021 17:17:15 +0000 Subject: [PATCH 22/60] Fix RNNs --- recommenders/models/deeprec/models/base_model.py | 5 +++-- recommenders/models/deeprec/models/sequential/gru4rec.py | 2 +- .../deeprec/models/sequential/rnn_cell_implement.py | 8 ++++---- .../deeprec/models/sequential/sequential_base_model.py | 8 ++++---- recommenders/models/deeprec/models/sequential/sli_rec.py | 8 ++++---- recommenders/models/deeprec/models/sequential/sum.py | 2 +- 6 files changed, 17 insertions(+), 16 deletions(-) diff --git a/recommenders/models/deeprec/models/base_model.py b/recommenders/models/deeprec/models/base_model.py index 198c07d30e..47c6c98e8d 100644 --- a/recommenders/models/deeprec/models/base_model.py +++ b/recommenders/models/deeprec/models/base_model.py @@ -7,6 +7,7 @@ import os import numpy as np import tensorflow as tf +import tensorflow_addons as tfa from recommenders.models.deeprec.deeprec_utils import cal_metric @@ -611,13 +612,13 @@ def _attention(self, inputs, attention_size): Returns: object: Weighted sum after attention. """ - hidden_size = inputs.shape[2].value + hidden_size = inputs.shape[2] if not attention_size: attention_size = hidden_size attention_mat = tf.compat.v1.get_variable( name="attention_mat", - shape=[inputs.shape[-1].value, hidden_size], + shape=[inputs.shape[-1], hidden_size], initializer=self.initializer, ) att_inputs = tf.tensordot(inputs, attention_mat, [[2], [0]]) diff --git a/recommenders/models/deeprec/models/sequential/gru4rec.py b/recommenders/models/deeprec/models/sequential/gru4rec.py index 6d8c645469..6571cf0d9b 100644 --- a/recommenders/models/deeprec/models/sequential/gru4rec.py +++ b/recommenders/models/deeprec/models/sequential/gru4rec.py @@ -6,7 +6,7 @@ SequentialBaseModel, ) from tensorflow.contrib.rnn import GRUCell, LSTMCell -from tensorflow.nn import dynamic_rnn +from tensorflow.compat.v1.nn import dynamic_rnn __all__ = ["GRU4RecModel"] diff --git a/recommenders/models/deeprec/models/sequential/rnn_cell_implement.py b/recommenders/models/deeprec/models/sequential/rnn_cell_implement.py index f9c018d147..4e1d5bcf20 100644 --- a/recommenders/models/deeprec/models/sequential/rnn_cell_implement.py +++ b/recommenders/models/deeprec/models/sequential/rnn_cell_implement.py @@ -141,7 +141,7 @@ def call(self, inputs, state): dtype = inputs.dtype input_size = inputs.get_shape().with_rank(2)[1] - if input_size.value is None: + if input_size is None: raise ValueError("Could not infer input size from inputs.get_shape()[-1]") if self._time_kernel_w1 is None: @@ -397,7 +397,7 @@ def call(self, inputs, state): dtype = inputs.dtype input_size = inputs.get_shape().with_rank(2)[1] - if input_size.value is None: + if input_size is None: raise ValueError("Could not infer input size from inputs.get_shape()[-1]") if self._time_kernel_w1 is None: @@ -595,13 +595,13 @@ def __init__( for shape in shapes: if shape.ndims != 2: raise ValueError("linear is expecting 2D arguments: %s" % shapes) - if shape[1].value is None: + if shape[1] is None: raise ValueError( "linear expects shape[1] to be provided for shape %s, " "but saw %s" % (shape, shape[1]) ) else: - total_arg_size += shape[1].value + total_arg_size += shape[1] dtype = [a.dtype for a in args][0] diff --git a/recommenders/models/deeprec/models/sequential/sequential_base_model.py b/recommenders/models/deeprec/models/sequential/sequential_base_model.py index 876147d325..4432d25679 100644 --- a/recommenders/models/deeprec/models/sequential/sequential_base_model.py +++ b/recommenders/models/deeprec/models/sequential/sequential_base_model.py @@ -279,20 +279,20 @@ def _lookup_from_embedding(self): ) tf.compat.v1.summary.histogram("user_embedding_output", self.user_embedding) - self.item_embedding = tf.nn.embedding_lookup( + self.item_embedding = tf.compat.v1.nn.embedding_lookup( params=self.item_lookup, ids=self.iterator.items ) - self.item_history_embedding = tf.nn.embedding_lookup( + self.item_history_embedding = tf.compat.v1.nn.embedding_lookup( params=self.item_lookup, ids=self.iterator.item_history ) tf.compat.v1.summary.histogram( "item_history_embedding_output", self.item_history_embedding ) - self.cate_embedding = tf.nn.embedding_lookup( + self.cate_embedding = tf.compat.v1.nn.embedding_lookup( params=self.cate_lookup, ids=self.iterator.cates ) - self.cate_history_embedding = tf.nn.embedding_lookup( + self.cate_history_embedding = tf.compat.v1.nn.embedding_lookup( params=self.cate_lookup, ids=self.iterator.item_cate_history ) tf.compat.v1.summary.histogram( diff --git a/recommenders/models/deeprec/models/sequential/sli_rec.py b/recommenders/models/deeprec/models/sequential/sli_rec.py index 86e5d59813..c212a1c1d0 100644 --- a/recommenders/models/deeprec/models/sequential/sli_rec.py +++ b/recommenders/models/deeprec/models/sequential/sli_rec.py @@ -5,7 +5,7 @@ from recommenders.models.deeprec.models.sequential.sequential_base_model import ( SequentialBaseModel, ) -from tensorflow.nn import dynamic_rnn +from tensorflow.compat.v1.nn import dynamic_rnn from recommenders.models.deeprec.models.sequential.rnn_cell_implement import ( Time4LSTMCell, ) @@ -58,7 +58,7 @@ def _build_seq_graph(self): -1, ) with tf.compat.v1.variable_scope("rnn"): - rnn_outputs, final_state = dynamic_rnn( + rnn_outputs, _ = dynamic_rnn( Time4LSTMCell(hparams.hidden_size), inputs=item_history_embedding_new, sequence_length=self.sequence_length, @@ -107,7 +107,7 @@ def _attention_fcn(self, query, user_embedding): """ hparams = self.hparams with tf.compat.v1.variable_scope("attention_fcn"): - query_size = query.shape[1].value + query_size = query.shape[1] boolean_mask = tf.equal(self.mask, tf.ones_like(self.mask)) attention_mat = tf.compat.v1.get_variable( @@ -118,7 +118,7 @@ def _attention_fcn(self, query, user_embedding): att_inputs = tf.tensordot(user_embedding, attention_mat, [[2], [0]]) queries = tf.reshape( - tf.tile(query, [1, att_inputs.shape[1].value]), tf.shape(input=att_inputs) + tf.tile(query, [1, att_inputs.shape[1]]), tf.shape(input=att_inputs) ) last_hidden_nn_layer = tf.concat( [att_inputs, queries, att_inputs - queries, att_inputs * queries], -1 diff --git a/recommenders/models/deeprec/models/sequential/sum.py b/recommenders/models/deeprec/models/sequential/sum.py index 20f063bab4..bc233bd642 100644 --- a/recommenders/models/deeprec/models/sequential/sum.py +++ b/recommenders/models/deeprec/models/sequential/sum.py @@ -2,7 +2,7 @@ # Licensed under the MIT License. import tensorflow as tf -from tensorflow.nn import dynamic_rnn +from tensorflow.compat.v1.nn import dynamic_rnn from recommenders.models.deeprec.models.sequential.sequential_base_model import ( SequentialBaseModel, ) From de2b3f7957dd5e4fc949c5d97519569f330faeb3 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Wed, 27 Oct 2021 17:42:08 +0000 Subject: [PATCH 23/60] Remove TF addons --- recommenders/models/deeprec/models/base_model.py | 1 - 1 file changed, 1 deletion(-) diff --git a/recommenders/models/deeprec/models/base_model.py b/recommenders/models/deeprec/models/base_model.py index 47c6c98e8d..9380f1c329 100644 --- a/recommenders/models/deeprec/models/base_model.py +++ b/recommenders/models/deeprec/models/base_model.py @@ -7,7 +7,6 @@ import os import numpy as np import tensorflow as tf -import tensorflow_addons as tfa from recommenders.models.deeprec.deeprec_utils import cal_metric From f5d28e4d732d4f9e25b5c48019209327263886b6 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Thu, 28 Oct 2021 08:35:58 +0000 Subject: [PATCH 24/60] Remove LazyAdam optimizer --- recommenders/models/deeprec/config/asvd.yaml | 2 +- recommenders/models/deeprec/config/caser.yaml | 2 +- recommenders/models/deeprec/config/gru4rec.yaml | 2 +- recommenders/models/deeprec/config/nextitnet.yaml | 2 +- recommenders/models/deeprec/config/sli_rec.yaml | 2 +- recommenders/models/deeprec/config/sum.yaml | 2 +- recommenders/models/deeprec/models/base_model.py | 2 -- 7 files changed, 6 insertions(+), 8 deletions(-) diff --git a/recommenders/models/deeprec/config/asvd.yaml b/recommenders/models/deeprec/config/asvd.yaml index d76bf91930..6a76946110 100644 --- a/recommenders/models/deeprec/config/asvd.yaml +++ b/recommenders/models/deeprec/config/asvd.yaml @@ -30,7 +30,7 @@ train: cross_l1 : 0.000 # l1 regularization for cross layer parameters learning_rate : 0.001 loss : softmax # pointwise: log_loss, cross_entropy_loss, square_loss pairwise: softmax - optimizer : lazyadam # adam, adadelta, sgd, ftrl, gd, padagrad, pgd, rmsprop, lazyadam + optimizer : adam # adam, adadelta, sgd, ftrl, gd, padagrad, pgd, rmsprop epochs : 50 # number of epoch for training batch_size : 400 # batch size, should be constrained as an integer multiple of the number of (1 + train_num_ngs) when need_sample is True enable_BN : True # whether to use batch normalization in hidden layers diff --git a/recommenders/models/deeprec/config/caser.yaml b/recommenders/models/deeprec/config/caser.yaml index 2e1770ec4a..5ddc3d4fb1 100644 --- a/recommenders/models/deeprec/config/caser.yaml +++ b/recommenders/models/deeprec/config/caser.yaml @@ -30,7 +30,7 @@ train: cross_l1 : 0.000 # l1 regularization for cross layer parameters learning_rate : 0.001 loss : softmax # pointwise: log_loss, cross_entropy_loss, square_loss pairwise: softmax - optimizer : lazyadam # adam, adadelta, sgd, ftrl, gd, padagrad, pgd, rmsprop, lazyadam + optimizer : adam # adam, adadelta, sgd, ftrl, gd, padagrad, pgd, rmsprop epochs : 50 # number of epoch for training batch_size : 400 # batch size, should be constrained as an integer multiple of the number of (1 + train_num_ngs) when need_sample is True enable_BN : True # whether to use batch normalization in hidden layers diff --git a/recommenders/models/deeprec/config/gru4rec.yaml b/recommenders/models/deeprec/config/gru4rec.yaml index fd10e5a843..ada50292d7 100644 --- a/recommenders/models/deeprec/config/gru4rec.yaml +++ b/recommenders/models/deeprec/config/gru4rec.yaml @@ -30,7 +30,7 @@ train: cross_l1 : 0.000 # l1 regularization for cross layer parameters learning_rate : 0.001 loss : softmax # pointwise: log_loss, cross_entropy_loss, square_loss pairwise: softmax - optimizer : lazyadam # adam, adadelta, sgd, ftrl, gd, padagrad, pgd, rmsprop, lazyadam + optimizer : adam # adam, adadelta, sgd, ftrl, gd, padagrad, pgd, rmsprop epochs : 50 # number of epoch for training batch_size : 400 # batch size, should be constrained as an integer multiple of the number of (1 + train_num_ngs) when need_sample is True enable_BN : True # whether to use batch normalization in hidden layers diff --git a/recommenders/models/deeprec/config/nextitnet.yaml b/recommenders/models/deeprec/config/nextitnet.yaml index 1093cea474..bfd056bc4e 100644 --- a/recommenders/models/deeprec/config/nextitnet.yaml +++ b/recommenders/models/deeprec/config/nextitnet.yaml @@ -30,7 +30,7 @@ train: cross_l1 : 0.000 # l1 regularization for cross layer parameters learning_rate : 0.001 loss : softmax # pointwise: log_loss, cross_entropy_loss, square_loss pairwise: softmax - optimizer : lazyadam # adam, adadelta, sgd, ftrl, gd, padagrad, pgd, rmsprop, lazyadam + optimizer : adam # adam, adadelta, sgd, ftrl, gd, padagrad, pgd, rmsprop epochs : 50 # number of epoch for training batch_size : 400 # batch size, should be constrained as an integer multiple of the number of (1 + train_num_ngs) when need_sample is True enable_BN : True # whether to use batch normalization in hidden layers diff --git a/recommenders/models/deeprec/config/sli_rec.yaml b/recommenders/models/deeprec/config/sli_rec.yaml index b9955b106a..8c4dd01da0 100644 --- a/recommenders/models/deeprec/config/sli_rec.yaml +++ b/recommenders/models/deeprec/config/sli_rec.yaml @@ -31,7 +31,7 @@ train: cross_l1 : 0.000 # l1 regularization for cross layer parameters learning_rate : 0.001 loss : softmax # pointwise: log_loss, cross_entropy_loss, square_loss pairwise: softmax - optimizer : lazyadam # adam, adadelta, sgd, ftrl, gd, padagrad, pgd, rmsprop, lazyadam + optimizer : adam # adam, adadelta, sgd, ftrl, gd, padagrad, pgd, rmsprop epochs : 50 # number of epoch for training batch_size : 400 # batch size, should be constrained as an integer multiple of the number of (1 + train_num_ngs) when need_sample is True enable_BN : True # whether to use batch normalization in hidden layers diff --git a/recommenders/models/deeprec/config/sum.yaml b/recommenders/models/deeprec/config/sum.yaml index f02acda650..62b9fa79bd 100644 --- a/recommenders/models/deeprec/config/sum.yaml +++ b/recommenders/models/deeprec/config/sum.yaml @@ -33,7 +33,7 @@ train: cross_l1 : 0.000 # l1 regularization for cross layer parameters learning_rate : 0.001 loss : softmax # pointwise: log_loss, cross_entropy_loss, square_loss pairwise: softmax - optimizer : lazyadam # adam, adadelta, sgd, ftrl, gd, padagrad, pgd, rmsprop, lazyadam + optimizer : adam # adam, adadelta, sgd, ftrl, gd, padagrad, pgd, rmsprop epochs : 50 # number of epoch for training batch_size : 400 # batch size, should be constrained as an integer multiple of the number of (1 + train_num_ngs) when need_sample is True enable_BN : True # whether to use batch normalization in hidden layers diff --git a/recommenders/models/deeprec/models/base_model.py b/recommenders/models/deeprec/models/base_model.py index 9380f1c329..2e08fb30de 100644 --- a/recommenders/models/deeprec/models/base_model.py +++ b/recommenders/models/deeprec/models/base_model.py @@ -278,8 +278,6 @@ def _train_opt(self): train_step = tf.compat.v1.train.ProximalGradientDescentOptimizer(lr) elif optimizer == "rmsprop": train_step = tf.compat.v1.train.RMSPropOptimizer(lr) - elif optimizer == "lazyadam": - train_step = tf.contrib.opt.LazyAdamOptimizer(lr) else: train_step = tf.compat.v1.train.GradientDescentOptimizer(lr) return train_step From b6ceeec1d10e001957d98f980c1f6bfc18ed5124 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Thu, 28 Oct 2021 10:09:00 +0000 Subject: [PATCH 25/60] Fix RNN cells import --- recommenders/models/deeprec/models/sequential/gru4rec.py | 2 +- recommenders/models/deeprec/models/sequential/sum_cells.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/recommenders/models/deeprec/models/sequential/gru4rec.py b/recommenders/models/deeprec/models/sequential/gru4rec.py index 6571cf0d9b..6f6d88cdf5 100644 --- a/recommenders/models/deeprec/models/sequential/gru4rec.py +++ b/recommenders/models/deeprec/models/sequential/gru4rec.py @@ -2,10 +2,10 @@ # Licensed under the MIT License. import tensorflow as tf +from keras.layers.legacy_rnn.rnn_cell_impl import GRUCell, LSTMCell from recommenders.models.deeprec.models.sequential.sequential_base_model import ( SequentialBaseModel, ) -from tensorflow.contrib.rnn import GRUCell, LSTMCell from tensorflow.compat.v1.nn import dynamic_rnn __all__ = ["GRU4RecModel"] diff --git a/recommenders/models/deeprec/models/sequential/sum_cells.py b/recommenders/models/deeprec/models/sequential/sum_cells.py index 8f61ef707f..039031faaa 100644 --- a/recommenders/models/deeprec/models/sequential/sum_cells.py +++ b/recommenders/models/deeprec/models/sequential/sum_cells.py @@ -3,6 +3,7 @@ import numpy as np import tensorflow as tf +from keras.layers.legacy_rnn.rnn_cell_impl import LayerRNNCell from tensorflow.python.eager import context from tensorflow.python.keras import activations from tensorflow.python.keras import initializers @@ -11,7 +12,6 @@ from tensorflow.python.ops import variable_scope as vs from tensorflow.python.platform import tf_logging as logging from tensorflow.python.util.deprecation import deprecated -from tensorflow.contrib.rnn import LayerRNNCell from tensorflow.python.ops import init_ops from tensorflow.python.framework import dtypes from tensorflow.python.util import nest From 68979f190c205bcea134b5fed7dedc75f0032837 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Thu, 28 Oct 2021 10:12:19 +0000 Subject: [PATCH 26/60] Fix sum.py --- recommenders/models/deeprec/models/sequential/sum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recommenders/models/deeprec/models/sequential/sum.py b/recommenders/models/deeprec/models/sequential/sum.py index bc233bd642..5be7f75709 100644 --- a/recommenders/models/deeprec/models/sequential/sum.py +++ b/recommenders/models/deeprec/models/sequential/sum.py @@ -61,7 +61,7 @@ def _attention_query_by_state(self, seq_output, query): Returns: tf.Tensor, tf.Tensor: Merged user representation. Attention weights of each memory channel. """ - dim_q = query.shape[-1].value + dim_q = query.shape[-1] att_weights = tf.constant(1.0, dtype=tf.float32) with tf.compat.v1.variable_scope("query_att"): if self.hparams.slots > 1: From 06c93ba9c8553cbd8f380daaf796dea19a3b6221 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Thu, 28 Oct 2021 14:55:13 +0000 Subject: [PATCH 27/60] Fix asserts --- recommenders/models/deeprec/models/sequential/nextitnet.py | 1 - recommenders/models/deeprec/models/sequential/sum_cells.py | 2 +- tests/unit/recommenders/models/test_wide_deep_utils.py | 6 +++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/recommenders/models/deeprec/models/sequential/nextitnet.py b/recommenders/models/deeprec/models/sequential/nextitnet.py index 8490ddf36d..ff3e918c6d 100644 --- a/recommenders/models/deeprec/models/sequential/nextitnet.py +++ b/recommenders/models/deeprec/models/sequential/nextitnet.py @@ -199,7 +199,6 @@ def _conv1d( return tf.squeeze(out, [1]) - # tf.contrib.layers.layer_norm def _layer_norm(self, x, name, epsilon=1e-8, trainable=True): """Call a layer normalization diff --git a/recommenders/models/deeprec/models/sequential/sum_cells.py b/recommenders/models/deeprec/models/sequential/sum_cells.py index 039031faaa..a77a676bb8 100644 --- a/recommenders/models/deeprec/models/sequential/sum_cells.py +++ b/recommenders/models/deeprec/models/sequential/sum_cells.py @@ -44,7 +44,7 @@ def __init__( if context.executing_eagerly() and context.num_gpus() > 0: logging.warn( "%s: Note that this cell is not optimized for performance. " - "Please use tf.contrib.cudnn_rnn.CudnnGRU for better " + "Please use keras.layers.cudnn_recurrent.CuDNNGRU for better " "performance on GPU.", self, ) diff --git a/tests/unit/recommenders/models/test_wide_deep_utils.py b/tests/unit/recommenders/models/test_wide_deep_utils.py index d6d1a8dfb5..0941e1270c 100644 --- a/tests/unit/recommenders/models/test_wide_deep_utils.py +++ b/tests/unit/recommenders/models/test_wide_deep_utils.py @@ -62,7 +62,7 @@ def test_wide_model(pd_df, tmp): model = build_model( os.path.join(tmp, "wide_" + MODEL_DIR), wide_columns=wide_columns ) - assert isinstance(model, tf.estimator.LinearRegressor) + assert isinstance(model, tf.compat.v1.estimator.LinearRegressor) # Test if model train works model.train( input_fn=pandas_input_fn( @@ -91,7 +91,7 @@ def test_deep_model(pd_df, tmp): model = build_model( os.path.join(tmp, "deep_" + MODEL_DIR), deep_columns=deep_columns ) - assert isinstance(model, tf.estimator.DNNRegressor) + assert isinstance(model, tf.compat.v1.estimator.DNNRegressor) # Test if model train works model.train( input_fn=pandas_input_fn( @@ -120,7 +120,7 @@ def test_wide_deep_model(pd_df, tmp): wide_columns=wide_columns, deep_columns=deep_columns, ) - assert isinstance(model, tf.estimator.DNNLinearCombinedRegressor) + assert isinstance(model, tf.compat.v1.estimator.DNNLinearCombinedRegressor) # Test if model train works model.train( input_fn=pandas_input_fn( From 0e57c04b38d44652b619a61ac1e65fc1de95231b Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Thu, 28 Oct 2021 16:17:40 +0000 Subject: [PATCH 28/60] Get fully connected layer from tf-slim --- recommenders/models/ncf/ncf_singlenode.py | 9 +++++---- setup.py | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/recommenders/models/ncf/ncf_singlenode.py b/recommenders/models/ncf/ncf_singlenode.py index 83eecb5762..a92b5a5235 100644 --- a/recommenders/models/ncf/ncf_singlenode.py +++ b/recommenders/models/ncf/ncf_singlenode.py @@ -5,6 +5,7 @@ import numpy as np import pandas as pd import tensorflow as tf +import tf_slim as slim from time import time import logging @@ -179,7 +180,7 @@ def _create_model( # MLP Layers for layer_size in self.layer_sizes[1:]: - output = tf.contrib.layers.fully_connected( + output = slim.layers.fully_connected( output, num_outputs=layer_size, activation_fn=tf.nn.relu, @@ -195,7 +196,7 @@ def _create_model( if self.model_type == "gmf": # GMF only - output = tf.contrib.layers.fully_connected( + output = slim.layers.fully_connected( self.gmf_vector, num_outputs=1, activation_fn=None, @@ -208,7 +209,7 @@ def _create_model( elif self.model_type == "mlp": # MLP only - output = tf.contrib.layers.fully_connected( + output = slim.layers.fully_connected( self.mlp_vector, num_outputs=1, activation_fn=None, @@ -223,7 +224,7 @@ def _create_model( # concatenate GMF and MLP vector self.ncf_vector = tf.concat([self.gmf_vector, self.mlp_vector], 1) # get predicted rating score - output = tf.contrib.layers.fully_connected( + output = slim.layers.fully_connected( self.ncf_vector, num_outputs=1, activation_fn=None, diff --git a/setup.py b/setup.py index e9ed873fad..b659664933 100644 --- a/setup.py +++ b/setup.py @@ -67,6 +67,7 @@ "gpu": [ "nvidia-ml-py3>=7.352.0", "tensorflow>=2.6", # compiled with CUDA 11.2, cudnn 8.1 + "tf-slim>=1.1.0", "torch>=1.8", # for CUDA 11 support "fastai>=1.0.46,<2", ], From 26eb2360b55627dccd31b48d62bc0eab2a40fead Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Thu, 28 Oct 2021 16:38:39 +0000 Subject: [PATCH 29/60] Update conda script --- tools/generate_conda_file.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/generate_conda_file.py b/tools/generate_conda_file.py index d86c64e02b..3dfd5df288 100644 --- a/tools/generate_conda_file.py +++ b/tools/generate_conda_file.py @@ -44,7 +44,7 @@ "lightgbm": "lightgbm==2.2.1", "matplotlib": "matplotlib>=2.2.2", "nltk": "nltk>=3.4", - "numpy": "numpy>=1.13.3", + "numpy": "numpy>=1.19", "pandas": "pandas>1.0.3,<=1.2.2", "papermill": "papermill>=2.2.0", "pip": "pip>=19.2", @@ -85,13 +85,15 @@ "pyyaml": "pyyaml>=5.4.1,<6", "xlearn": "xlearn==0.40a1", "transformers": "transformers==2.5.0", - "tensorflow": "tensorflow==1.15.4", + "tensorflow": "tensorflow>=2.6", + "tf-slim": "tf-slim>=1.1.0", "scrapbook": "scrapbook>=0.5.0", } PIP_GPU = { "nvidia-ml-py3": "nvidia-ml-py3>=7.352.0", - "tensorflow": "tensorflow-gpu==1.15.4", + "tensorflow": "tensorflow>=2.6", + "tf-slim": "tf-slim>=1.1.0" } PIP_PYSPARK = {"databricks-cli": "databricks-cli==0.8.6"} From 6f1d85e385023c4216dc716bb7c4433ed6e135f8 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Fri, 29 Oct 2021 11:11:38 +0000 Subject: [PATCH 30/60] Remove pip installation cell from VAE notebooks --- .../multi_vae_deep_dive.ipynb | 24 ++++--------------- .../standard_vae_deep_dive.ipynb | 24 ++++--------------- 2 files changed, 10 insertions(+), 38 deletions(-) diff --git a/examples/02_model_collaborative_filtering/multi_vae_deep_dive.ipynb b/examples/02_model_collaborative_filtering/multi_vae_deep_dive.ipynb index 1caf10d3eb..375ff943b9 100644 --- a/examples/02_model_collaborative_filtering/multi_vae_deep_dive.ipynb +++ b/examples/02_model_collaborative_filtering/multi_vae_deep_dive.ipynb @@ -38,20 +38,6 @@ "# 0 Global Settings and Imports\n" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "wamiZgm--Zu8" - }, - "outputs": [], - "source": [ - "# download the necessary libraries \n", - "! pip install tensorflow==2.2.0-rc1\n", - "! pip install keras==2.3.1\n", - "! pip install papermill" - ] - }, { "cell_type": "code", "execution_count": 3, @@ -1192,7 +1178,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA84AAAFXCAYAAABz4xf6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdeXhMZ/vA8e9Mksm+yyqWCBKS2LUoSkItr121SquKUkVVF1VV2r5tafvrqlpKK7xdtIrYqpRaqlTta+yxRCKRfc9MZub3x2SOjKwIaer+XFcu5pznPOc+ZybLfZ5NZTQajQghhBBCCCGEEKJU6uoOQAghhBBCCCGE+CeTxFkIIYQQQgghhCiHJM5CCCGEEEIIIUQ5JHEWQgghhBBCCCHKIYmzEEIIIYQQQghRDkmchRBCCCGEEEKIckjiLISocYKDgyv8ioiIAGDu3LkW28PCwujduzeLFi3CYDCUWv/+/fsJDg6mffv2FBYWlhnDxx9/rLzes2cPwcHBNG3alNjY2BLlO3fuzLRp05TXcXFxBAcHs3z5cmXbypUrCQ4Opk2bNmRkZFgcX1hYSHBwMHPnzi1R99mzZ3n11VeJiIggPDycli1b0q9fP2bPns3FixfLuZOW8vPzad26NcHBwZw8ebLUMk888QTBwcFMnTq1xL7ly5cTHBxMXFycsm3atGnKvQ8JCaF169b07t2b6dOnc/DgwQpjioqKIjg4mCNHjpRZZtiwYURERFB8dcU1a9YQHBzMgAEDSj2mtPt/I/N7umvXLmXbjZ+nli1b8tBDD/Hiiy/yxx9/lHstM2bMIDg4mHfffbfEOSr6Mn92nnjiCR577LESdScmJvLmm28SERFBWFgY7du3Z+LEiaXeN/M1dOvWDZ1OZ7Hv4sWLBAcHs3LlynKvpXjcO3fuLLE/Li6OkJCQMj/jpX21adMGgIiIiErdk9LqCwsLo1u3bnz00UcUFBSUGnPx99Ns+/btjBs3jvbt2xMaGkqHDh145pln+O233yzKbd68meHDh9O+fXuaNWtG165defbZZ9mxY0e596uiz9tjjz3GE088YbHtxp8xAH///TejR4+mY8eOhIeH07lzZ0aPHs2aNWuA69+fFX0V/x49cuQIkyZNokOHDoSFhREREcEbb7xBYmJiiThvrL9ly5YMHTqULVu2AJCTk0NERASPPfYYpa12+vnnnxMaGsqxY8fKvV9CCPFPZF3dAQghxM368ccfLV5PnDiR4OBgJk2apGzTaDQWZb7//nusrKzIyMhg5cqVfPDBB6jVakaNGlWi/ujoaABSU1PZsWOHkoRXhl6v57PPPivxB+/NyMrKYuHChbz00ksVll2/fj2vvPIKjRs3ZuzYsQQGBqLT6Th27BjLly9nx44dbNiwoVLn/e2338jOzgZM96B4on+jtWvXMnbsWBo2bFhhvR4eHnz55ZcA5OXlcf78edauXcvQoUMZN24cL7zwQpnH9u3blw8++IDVq1fTrFmzEvsvX77MgQMHePbZZ1GpVMp283sYExPDqVOnlESrqpg/T3l5ecTFxbFx40bGjBlDv379eO+991CrLZ9L5+fnK+/DunXrmDp1KtbW1oSGhlp8nq9du8bEiRMZN26cxefOw8OjzFhOnjzJU089hYODA08//TRBQUEkJyezbNkyhg4dyrvvvlvqA4TLly/z888/l5qIV5ajoyOrV6+mY8eOFtujo6NxcHAgJyen1OM+/fRTfH19LbZZWVkBpuRKq9Uq29988030ej1vvfVWmXGY68vJyeG3335jwYIF5OTk8Prrr1d4DbNnzyYqKooePXrw+uuv4+XlRXJyMlu3bmXy5MmsXLmSkJAQli5dyjvvvMPgwYMZPXo09vb2XL58mW3btvHXX3/RuXPnCs91OzZv3szEiROJiIhg5syZuLq6Eh8fz59//sn27dvp168fs2bNUr6HAb744guOHj2qfP+ZeXt7A6b3afr06bRu3ZrXXnsNb29vzp07x6JFi9i4cSOLFy8mJCTE4tjg4GDlvYiPj2fBggVMmjSJH374gebNm/P222/z1FNP8f333zN8+HDluLNnzzJ//nxGjRpFWFjYnbpNQghxx0jiLISocVq0aGHxWqPR4O7uXmJ7cc2bN8fa2vQjr1OnTpw6dYqffvqpROJcUFDAhg0buO+++zh69CjR0dE3lTh37NiRDRs2MG7cuBJ/cN5MHd9++y0jR46kVq1aZZY7d+4c06ZNIyIigo8//lhJPMx1jB49mhUrVlT6vNHR0bi5uVGvXj3Wrl3LSy+9pNyz4po0aUJSUhKffvppqS3gN7KxsbF4b9q3b8+wYcN49913WbBgAaGhofTo0aPUYz09PenUqRPr169n2rRp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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA84AAAFXCAYAAABz4xf6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdeXhMZ/vA8e9Mksm+yyqWCBKS2LUoSkItr121SquKUkVVF1VV2r5tafvrqlpKK7xdtIrYqpRaqlTta+yxRCKRfc9MZub3x2SOjKwIaer+XFcu5pznPOc+ZybLfZ5NZTQajQghhBBCCCGEEKJU6uoOQAghhBBCCCGE+CeTxFkIIYQQQgghhCiHJM5CCCGEEEIIIUQ5JHEWQgghhBBCCCHKIYmzEEIIIYQQQghRDkmchRBCCCGEEEKIckjiLISocYKDgyv8ioiIAGDu3LkW28PCwujduzeLFi3CYDCUWv/+/fsJDg6mffv2FBYWlhnDxx9/rLzes2cPwcHBNG3alNjY2BLlO3fuzLRp05TXcXFxBAcHs3z5cmXbypUrCQ4Opk2bNmRkZFgcX1hYSHBwMHPnzi1R99mzZ3n11VeJiIggPDycli1b0q9fP2bPns3FixfLuZOW8vPzad26NcHBwZw8ebLUMk888QTBwcFMnTq1xL7ly5cTHBxMXFycsm3atGnKvQ8JCaF169b07t2b6dOnc/DgwQpjioqKIjg4mCNHjpRZZtiwYURERFB8dcU1a9YQHBzMgAEDSj2mtPt/I/N7umvXLmXbjZ+nli1b8tBDD/Hiiy/yxx9/lHstM2bMIDg4mHfffbfEOSr6Mn92nnjiCR577LESdScmJvLmm28SERFBWFgY7du3Z+LEiaXeN/M1dOvWDZ1OZ7Hv4sWLBAcHs3LlynKvpXjcO3fuLLE/Li6OkJCQMj/jpX21adMGgIiIiErdk9LqCwsLo1u3bnz00UcUFBSUGnPx99Ns+/btjBs3jvbt2xMaGkqHDh145pln+O233yzKbd68meHDh9O+fXuaNWtG165defbZZ9mxY0e596uiz9tjjz3GE088YbHtxp8xAH///TejR4+mY8eOhIeH07lzZ0aPHs2aNWuA69+fFX0V/x49cuQIkyZNokOHDoSFhREREcEbb7xBYmJiiThvrL9ly5YMHTqULVu2AJCTk0NERASPPfYYpa12+vnnnxMaGsqxY8fKvV9CCPFPZF3dAQghxM368ccfLV5PnDiR4OBgJk2apGzTaDQWZb7//nusrKzIyMhg5cqVfPDBB6jVakaNGlWi/ujoaABSU1PZsWOHkoRXhl6v57PPPivxB+/NyMrKYuHChbz00ksVll2/fj2vvPIKjRs3ZuzYsQQGBqLT6Th27BjLly9nx44dbNiwoVLn/e2338jOzgZM96B4on+jtWvXMnbsWBo2bFhhvR4eHnz55ZcA5OXlcf78edauXcvQoUMZN24cL7zwQpnH9u3blw8++IDVq1fTrFmzEvsvX77MgQMHePbZZ1GpVMp283sYExPDqVOnlESrqpg/T3l5ecTFxbFx40bGjBlDv379eO+991CrLZ9L5+fnK+/DunXrmDp1KtbW1oSGhlp8nq9du8bEiRMZN26cxefOw8OjzFhOnjzJU089hYODA08//TRBQUEkJyezbNkyhg4dyrvvvlvqA4TLly/z888/l5qIV5ajoyOrV6+mY8eOFtujo6NxcHAgJyen1OM+/fRTfH19LbZZWVkBpuRKq9Uq29988030ej1vvfVWmXGY68vJyeG3335jwYIF5OTk8Prrr1d4DbNnzyYqKooePXrw+uuv4+XlRXJyMlu3bmXy5MmsXLmSkJAQli5dyjvvvMPgwYMZPXo09vb2XL58mW3btvHXX3/RuXPnCs91OzZv3szEiROJiIhg5syZuLq6Eh8fz59//sn27dvp168fs2bNUr6HAb744guOHj2qfP+ZeXt7A6b3afr06bRu3ZrXXnsNb29vzp07x6JFi9i4cSOLFy8mJCTE4tjg4GDlvYiPj2fBggVMmjSJH374gebNm/P222/z1FNP8f333zN8+HDluLNnzzJ//nxGjRpFWFjYnbpNQghxx0jiLISocVq0aGHxWqPR4O7uXmJ7cc2bN8fa2vQjr1OnTpw6dYqffvqpROJcUFDAhg0buO+++zh69CjR0dE3lTh37NiRDRs2MG7cuBJ/cN5MHd9++y0jR46kVq1aZZY7d+4c06ZNIyIigo8//lhJPMx1jB49mhUrVlT6vNHR0bi5uVGvXj3Wrl3LSy+9pNyz4po0aUJSUhKffvppqS3gN7KxsbF4b9q3b8+wYcN49913WbBgAaGhofTo0aPUYz09PenUqRPr169n2rRp2NjYWOxfvXo1RqPRIjFMTExk9+7ddO7cmR07dhAdHc0rr7xS2dtQKcU/TwBDhgwhKiqK2bNn06RJkxKfq82bN5Odnc2DDz7I9u3b+eOPP+jatStOTk4W98bcElinTp1yP89mOp2O5557DmdnZ3788Ufc3d2VfT179mTy5Mm8/vrrNGvWjAYNGlgc27FjR7788ksGDRqEra3tLd2Hhx56iI0bN5Kbm4uDg4Oyfc2aNfTo0aPMlusmTZpQr169Uvc1bdrU4rWTkxOFhYXl3o/i9T3wwANcvHiRFStW8Nprr5V4iFHc6tWriYqK4pVXXinxnvXq1YsRI0bg4uICwDfffEO3bt0segy0b9+eRx55pMzeK1Vp8eLFNG3alHnz5lk8JBo4cKBy/hsfZHl4eJT4/jM7d+4cr7/+Ot26deOTTz5R7lPbtm3p0aMHjzzyCJMnT2bdunUW33eOjo5KfS1atKBVq1Z06dKFFStW0Lx5czp06MDDDz/Mhx9+SEREBH5+fhgMBl577TXq1Klj8YBTCCFqEumqLYS456jVakJCQkhISCixb/PmzWRlZTFs2DC6devG77//XqLbdHmGDx+Ol5cXn3zyyS3HN378eIASrUQ3WrJkCUajkZkzZ1okzWY2NjYMHTq0UudMTExk165d9O7dmyFDhpCcnFxqF1wAe3t7xo0bx6ZNm265y6VKpeLll1+mVq1aLFmypNyyAwcOJC0trdTusKtXr6ZVq1bUrVvXYpvBYGDSpEm0atWKtWvXotfrbynOmzFy5EiaNm3K0qVLS+xbtWoVrq6uzJkzBzs7O1atWlUl5/ztt9+4ePEiU6ZMsUiawfQ5nzFjBgaDodR7/Pzzz5OUlMR33313y+fv3r07AJs2bVK2HThwgEuXLtGvX79brvd2NW3alLy8PNLS0sot99VXX9G4ceNSe54AhIWF4e/vD0BGRkaZD7LKS86rSkZGBh4eHhZJ8+2cf+nSpRgMBmbMmFHieHd3d6ZMmcKFCxdKdFe/ka+vLx4eHhY/T6dNm4aTkxOzZs0C4H//+x9Hjhzh3XffLdEbSAghagpJnIUQ96QrV65YJFtmq1atwsXFhcjISAYMGIBOp2P9+vWVrtfOzo7x48ezdetWDh06dEuxeXl5MXz4cH788UeuXLlSZrm//vqLsLCwclulK8ucbA4YMICePXtia2urdHcuzWOPPYa/v/9tdUnXaDS0a9eOI0eOlDmWHKBr1664ubmxevVqi+3mBG3gwIEW21etWkVQUBDNmjVjwIABXLt2rcyHAFWtc+fOJCQkEB8fr2wzt4D36tULDw8PunXrxtatW2/qgUxZdu/ejZWVFV26dCl1v4+PD6Ghofz1118l9jVp0oSePXvy1VdfWXTvvRn29vb06NFDGWMLpp4LrVq1ok6dOmUep9frKSwstPiqylbbK1eu4OzsjJubW5llEhMTOXv2LF27dq1UneHh4URHR7No0aJS5zGoDIPBUOK6y/vs33j+P//8k48//piTJ0+WOob4Zph/fpi7bd+oS5cuqNXqUj87xWVnZ5Oenm7x89TZ2Zk333yT7du3M3/+fD755BOeeOIJWrZseVsxCyFEdZLEWQhxTzD/wZqamsqCBQs4fvw4kydPtiiTlJTErl276NWrFxqNhg4dOuDj41NuAlmaIUOGUKdOndtKKp9++mns7Oz4/PPPyyxz9epVpTWsuBuTksqIjo4mMDCQ5s2b4+zsrLS2Z2Zmllpeo9Hw7LPPsnPnTvbt21e5iyqFv78/Op2O9PT0MstoNBp69+7N1q1bLeKJjo7G1taWXr16KduOHDnC+fPn6d+/P2DqblvRQ4Cq5OfnB5jGKputWbMGvV6vdCcfMGAAWq2WX3755bbPl5CQgIeHB/b29mWWqV27NlevXi113+TJk8nMzCQqKuqWY+jfvz+7d+8mMTERrVbLr7/+WuakbGa9evUiNDTU4svc0+JWmD/zGRkZ/Pzzz2zatInnn3++1J4YZuZ7Utr3UGnefPNN6tatywcffEDPnj25//77eeGFF27qoczMmTNLXHdoaCgHDhyo8NiXXnqJVq1aMX/+fPr370+bNm149tlnb/lzlJCQQO3atcvc7+DgUKIl2cz8s+Xy5ctMnz4dV1dXRo4caVGma9eu9O3bl48//phatWoxZcqUW4pTCCH+KWSMsxDinhAeHm7x+uWXX6Zbt24W28wJjjnpUqvV9OvXj4ULF3L+/PkSY0TLYmNjw8SJE3nllVfYtWsXHTp0uOl43dzceOqpp5g3bx5PP/10qa3jZWnRooXF5EqbNm0qczwpmJLNc+fO8fzzzyvbBgwYwPr16/nll1/K7O49aNAgFi1axEcffcT3339f6fiKM7ealdb9tLiBAwfy/fffs2HDBh599FElQYuMjMTZ2Vkpt2rVKuV9A5TeA1u2bCErK8ui7J1Q2vVER0dTv359pbWtQ4cOeHt7Ex0dfVsTc1WFwMBABgwYwOLFi3n88cdvqY527drh4+PD2rVrCQgIID8/n169epXboj5v3jx8fHwstpnHEt+K4g9PwDTT+q1eT1kCAwOJjo7mwIED7Ny5k8OHD/Pbb7+xfv16Jk+ezLPPPlthHePHjycyMrLE9hkzZlR4rKenJ9999x1Hjhzhjz/+4MiRI+zevZstW7awa9cu3n777Vu6rpt14MABQkNDldcajYbFixeX2sNgwoQJrF27lpEjR5b7cEcIIWoCaXEWQtwTfvrpJ5YvX868efMIDQ3lww8/ZM+ePRZloqOj8ff3p1GjRmRmZpKZman8kXtjN+GK9OvXj0aNGt3WWOeRI0fi6urKZ599Vup+X19fiy7BZsuWLePnn39m4sSJlTqPuTW2a9euynWHh4fj4eFRbkutlZUVkydPZv/+/Wzfvr1S57pRQkICNjY2uLq6llvOPLmVOR7z2PPiLZvmVtwWLVrg6OioXEv37t2VSd/uNHMrppeXFwBHjx7l7NmzdO/eXYknJyeHhx56iEOHDt1yl18zX19fUlNTycvLK7PMlStXSsxgXdzEiRPRarUsXLjwlmJQqVT069eP1atXK5PpVfSAolGjRoSHh1t8lfdwpyLz5s3j559/5quvvqJDhw58//33FfYyMN+T0r6HymJlZUXbtm2ZMmUKUVFRbN68mcaNGzNv3rxKdb2vXbt2iesODw+3mFitIs2aNWPChAksWLCA7du30759e5YvX87p06crXQeYrr+8oSC5ubmkpqYqvSjMQkJC+Pnnn/npp5945513cHR0ZPLkyaSmppaowzypmIxrFkL8G0jiLIS4J4SGhtKsWTO6devGokWLcHFx4e2331bGVR47dowzZ84QHx9P27ZtlS9za6t5DHBlqdVqJk+ezOHDh9m8efMtxezo6Mi4ceP49ddfiYmJKbG/Xbt2HDt2jJSUlBLXGh4eXm43TDOtVquM4e7fv79y3e3atSM1NZWDBw9y4cKFMo/v1asXTZo04dNPP73pMZdarZbdu3fTokWLUmfvvtHAgQM5cOAAly9fZvXq1Xh5eVksg7R161bS09M5cOCAxXto7iJaVRNylWf79u34+/sryYY5eVu4cKFFTN9++63F/lvVvn179Ho927ZtK3V/YmIix48fp127dmXW4e/vz6OPPsp3331n0cX8ZvTv35/Tp0+zffv2Crtp3wnmRPzBBx9kwYIF1K9fn/fff5/c3Nwyj/Hx8SEoKIitW7fe8nl9fHwYMmQIhYWFN7VmelVxcXFR1n8+e/bsTR1r/vmRlJRU6v5t27ZhMBhKfHYcHBwIDw+nefPmPPzww3zyySckJydXaoZ9IYSoySRxFkLcczw8PJgwYQKnT59m48aNgCmBUalUzJ07l6VLl1p8jR07loSEhBIt1BXp3r074eHht5RUmg0bNgwfH59SW66ffPJJ4Po6t7di27ZtpKenM3HixBLXbR6jXV5yp1KpeP755zl+/LhyLyvDaDTywQcfkJKSUmJsZFn69euHWq1myZIl/PHHH/Tt29diDOuqVatwcHAgKiqqxLUMGjRImUzsTomKiiImJka5Hq1Wy7p162jevHmJeJYuXUqTJk1Ys2bNbU3y1L17d+rWrcvHH39cYpy4wWDgnXfeQaVSMWLEiHLrGT9+PCqVqsKZ3MsSFBTE8OHD6dGjR4k1ne82jUbD1KlTSUlJqXAIwbhx4zh9+jSLFy8udf+JEyeUFumyEszz588DVMkkfeWp6PxlTfJVlieffBKVSmXxANEsPT2djz/+mHr16ikzp5elXbt2dO/eneXLl5c5ll4IIf4NZIyzEOKeNHToUL7++mu+/PJLunXrxrp162jbti0PPfRQibJNmjRhyZIlREdH0759+5s6z5QpU8pc6qYyNBoNEyZM4PXXXy+xLygoiHfffZfp06czZMgQHnnkEQIDAzEYDMTFxfHjjz9iY2NT7hq95mRz1KhRODo6ltgfFRXFmjVrmDx5cpnjkLt06UKrVq3KnCRJp9MpM4zn5eURGxvLmjVrOHToEOPHjy8x1rwsvr6+tG/fnm+//bbE2s0pKSn88ccf9OvXr9T3qFatWqxcuZLo6Giee+45ZfuxY8dK7VZc0drdhw8fxsrKioKCAi5fvszGjRvZsWMHAwcOVJLU7du3k56ezrRp07j//vtL1PHoo4/yxhtvsGfPnnJbhMuj0Wj49NNPeeqpp3j44YcZPXo0DRs2JDk5mR9++IF9+/bx9ttvExQUVG49np6ejBgxgvnz599SHGCa+KqyYmJiSl0qKiwsrFK9DyoSGRlJeHi4Mnbbzs6u1HL9+/fnxIkTzJkzh4MHD9KrVy+8vLxISUlh27ZtrFmzhhUrVuDv70/fvn1p3749Dz74IAEBAWRnZ7N9+3aWLVtGr169Kj3J2K0aM2YMfn5+REREEBgYSH5+Pnv37mXx4sW0bNmSVq1a3VR9QUFBvPXWW8yYMYMnn3ySxx57DC8vL86fP8+iRYvIzMxk8eLFJdZOL82kSZPYvHkzCxcuLPVnlRBC/BtI4iyEuCeZZ4WeOXMm27ZtIy0tjcGDB5da1sXFhe7du7Np0yZmzpxZaoJZlgceeID77ruPv//++5ZjHTRoEF9//XWpXab79etHcHAwUVFRLFiwgGvXrmFjY0OdOnXo0KEDH374YZnjW1NTU5Vks6xrevjhh3n99df5+++/S03+zKZMmaJ0GS3tPI8++igqlQp7e3t8fX1p2bIl06ZNo0WLFhXfgGIGDBjAn3/+SZMmTQgODla2r127lsLCwjLfw6CgIFq2bEl0dDSTJk1Sti9btoxly5aVKL979+5y4xg2bBhgWo7Jy8uLZs2asWjRIjp16qSUWbVqFY6OjvTs2bPUOvr06cOcOXOIjo6+5cQZTGsWr169mvnz57Nw4UKSkpJwcnKiVatWfPfdd5VeAmj06NH88MMPVbJMVkVunNHebPfu3Xh4eFTJOZ5//nlGjx7NsmXLyu3V8Oqrr9KhQwe+++473nzzTbKysnB1daV58+bMnTuXkJAQpb7t27fz2WefkZycjJWVFfXr1+fFF19Uen/cSc888wwbN25k4cKFXLt2DaPRSEBAAKNGjWLs2LG3tJbzoEGDaNCgAQsXLuStt94iOzsbLy8vOnXqxPjx40uMby5LcHAw//nPf1i+fDnjxo276dZvIYSoCVTG210IUAghhBBCCCGE+BeTMc5CCCGEEEIIIUQ5JHEWQgghhBBCCCHKIYmzEEIIIYQQQghRDkmchRBCCCGEEEKIckjiLIQQQgghhBBClEMSZyGEEEIIIYQQohySOAshhBBCCCGEEOWQxFkIIYQQQgghhCiHJM5CCCGEEEIIIUQ5JHEWQgghhBBCCCHKIYmzEEIIIYQQQghRDkmchRBCCCGEEEKIckjiLIQQQgghhBBClEMSZyGEEEIIIYQQohySOAshhBBCCCGEEOWQxFkIIYQQQgghhCiHJM5CCCGEEEIIIUQ5JHEWQgghhBBCCCHKIYmzEEIIIYQQQghRDkmchRBCCCGEEEKIckjiLIQQQgghhBBClEMSZyGEEEIIIYQQohySOAshhBBCCCGEEOWQxFkIIYQQQgghhCiHJM5CCCGEEEIIIUQ5JHEWQgghhBBCCCHKIYmzEEIIIYQQQghRDkmchRBCCCGEEEKIckjiLIQQQgghhBBClEMSZyGEEEIIIYQQohySOAshhBBCCCGEEOWQxFkIIYQQQgghhCiHJM5CCCGEEEIIIUQ5JHEWQgghhBBCCCHKYV3dAdxJBoOBnJwcbGxsUKlU1R2OEEKIe4zRaESn0+Ho6IhaLc+qyyO/s4UQQlSnin5n/6sT55ycHE6fPl3dYQghhLjHNW7cGGdn5+oO4x9NfmcLIYT4Jyjrd/a/OnG2sbEBTBev0Whuu75jx44RFhZ22/VUh5ocO9Ts+Gty7CDxV6eaHDvU7PirKnatVsvp06eV30f/dLGxsUybNo309HTc3Nx47733qF+/vkWZFStWEBUVhVqtxmAwMGTIEEaMGAFASkoKr776KgkJCRQWFnL//fczY8YMrK0r/nNDfmdbkvirT02OHWp2/DU5dpD4q1NVxF7R7+x/deJs7uql0WiwtbWtkjqrqp7qUJNjh5odf02OHST+6lSTY4eaHX9Vxl5Tuh7PmjWLYcOG0b9/f1avXs3MmTNZunSpRZkePXowaNAgVCoV2dnZ9O3bl/vuu4+QkBDmz59PUFAQX331FTqdjmHDhrFp0yZ69+5d4bnld3ZJEn/1qcmxQ82OvybHDhJ/daqq2Mv6nS0DroQQQghBSkoKJ06coE+fPgD06dOHEydOkJqaalHOyclJ+aMiPz8fnU6nvFapVOTk5GAwGNBqteh0Onx8fO7uhQghhBB3gCTOQgghhCAhIQEfHx+srKwAsLKywtvbm4SEhBJlt2zZwn/+8x+6du3KmDFjCA4OBuDZZ58lNjaWjh07Kl+tW7e+q9chhBBC3An/6q7aZTEYDMTFxZGTk3NTx1lbWxMTE3OHorqzbozd0dGRgIAAmeVVCCHETYuMjCQyMpL4+HgmTJhA586dadCgAb/++ivBwcEsWbKEnJwcnn76aX799Vd69uxZ6bqPHTtW6na1Wo1Kpap0t3dra2sOHz5c6fNWB6PRiNFoxGAwlLp///79dzmiqlWT46/JsUPNjr8mxw4Sf3W607Hfk4lzcnIyKpWK4ODgm0occ3JycHR0vIOR3TnFYzcYDFy5coXk5GS8vb2rOTIhhBD/BH5+fiQmJqLX67GyskKv15OUlISfn1+Zx/j7+xMeHs62bdto0KAB3377Le+++y5qtRpnZ2ciIiLYs2fPTSXOYWFhJcapxcbG4uzsjKenZ6UT55rwO9toNJKSkkJWVhaBgYEW+/bv31+jW+trcvw1OXao2fHX5NhB4q9OVRF7QUFBmQ9v4R7tqp2eno6Pj88929qqVqvx8fEhIyOjukMRQgjxD+Hp6UmTJk1Yt24dAOvWraNJkyZ4eHhYlDt37pzy/9TUVPbs2UPjxo0BCAgIYMeOHYBpdtLdu3fTqFGj244tPz//ppLmmkKlUuHp6Ul+fn51hyKEEKIC92SLs16vrzFLg9wpNjY2FBYWVncYQggh/kHeeOMNpk2bxhdffIGLiwvvvfceAE8//TTPPfcc4eHh/Pjjj/z5559YW1tjNBp5/PHH6dixIwDTp09n1qxZ9O3bF71ez/33388jjzxSJbH925Jms3/rdQkhxL/NPZk4g/yiutevXwghRElBQUEsX768xPaFCxcq/58+fXqZx9etW5fFixffkdiEEEKI6nRv9lW+SUajkfhr2WgLjVVe95AhQ+jfvz+9e/emadOm9O/fn/79+/Pqq69W6vgffviBqKioKo9LCCGEECWNGTOGH374wWKb0WgkMjKSv//+u9Rjpk2bxrfffns3whNCiH+kzJiTHH/zbQw1uMfrXWtxjouLY8KECcrrrKwssrOzLX7JfP7558ydO5e1a9cq46UOHTrEzJkzKSgooHbt2nzwwQd4enrerbABMBiN5OQXYqW2qvK6zU/24+LiGDx4MKtXr7bYX1hYiLV12W/TY489VuUxCSGEEKJ0gwcPZvHixRa/f/fs2YNaraZt27bVGJkQQvxzpR04SPqBg+jS0rH1qlXd4dySu5Y4BwQEWCSF77zzDnq9Xnl9/PhxDh06RO3atZVtBoOBl19+mdmzZ9OmTRu++OIL/u///o/Zs2ffrbABUHF3uzVHRETQu3dv/vrrLxo3bsyUKVN44YUXyMnJoaCggAcffJCpU6cCMHfuXHJzc3nllVdYuXIl69atw8XFhTNnzuDs7MzcuXPx8vK6q/ELIYQQ/1aRkZG88cYbnDt3jqCgIABWrlxJ//79GT58OHl5eRQUFPDII48wcuTI6g1WCCH+IXRp6aZ/s7Ikcb4ZWq2WtWvX8vXXXyuv33rrLT788ENGjBihlDt27Bi2tra0adMGgKFDhxIZGVnlifPv+y7x29+Xyi5ghLyCQqysVGhsbq7Vuft9dYloU/emY8rOzubnn38GTFOjz58/H0dHR3Q6HaNHj2bHjh107ty5xHFHjx5lzZo1+Pn5MWPGDL799lumTJly0+cXQggh/omSft9G4pbfKyxnXlbrZvhERuAd0aXcMhqNhr59+7JixQqmTp1KdnY2mzdvZv369YwdOxaNRkNOTg5DhgyhU6dOSnIthBA1iXmLLTgAACAASURBVNFgQFWFKxBpU1MBKMzKqrI677ZqSZx///13fHx8CA0NBeDTTz+lX79+BAQEWJRLSEjA399fee3h4YHBYCA9PR03N7dKn+/G9bisra3JyclRXhcUFFi0fpensuWK1138XGXJy8sDTOtOGgwGevTooRyXl5fHxx9/zOHDh5U1H48cOULr1q3RarXodDqlNbpZs2a4uLiQk5NDkyZN+Ouvv5R6boxDq9XWqEXOa1KsN6rJsYPEX51qcuxQs+OvybGLO+vhhx9mzJgxvPjii2zYsIFWrVphY2PD9OnTOXXqFCqViqSkJE6ePCmJsxCixkk7cJBT739I66++xMbFuUrq1KamAbeeOBsKC8k4chRrZ2fOfDKXkFdeJOvUaXy6d6uS+CqjWhLnFStWMHjwYAAOHjzIsWPHeOmll+7Y+cLCwrC1tVVex8TE4OjoqLzu9UAjej1Q9jqTRqORs3EZONur8a3lckditLe3B8DR0RG1Wo2np6cSY1RUFLm5uaxYsQJbW1tef/11jEYjjo6OaDQaCgsLcXR0xNbWFkdHR+U4e3t7VCoVjo6O5OTkWFwzmJ6aN2/e/I5cT1W71xdkr04Sf/WpybFDzY6/qmIvKCgo8fBW3B7viC4VtgoDpf7eqyohISF4e3uzY8cOVqxYwZNPPslHH32El5cXc+bMwdramlGjRlFQUHBHzi+EEHdSZsxJ9Hl55F6+hGtRQ+ft0qaZEmddJRNnbXo61k5OqIuWPox5ezbpBw/h+UB78uLiiP06ivRDh3END8PO17dKYqzIXZ9VOzExkb1799K3b18A9u7dy7lz54iMjCQiIoKrV68yevRodu7ciZ+fH/Hx8cqxqampqNXqm2pt/jfIysrCy8sLW1tbEhMT2bJlS3WHJIQQQtzTBg8ezNy5c7lw4QKRkZFkZWXh6+uLtbU1p0+fZt++fdUdohA1ntFY9SvaVJX0w0eIW7GqusMowVjUOzZh/QZOvv/hLdWRn5Bg+vdqYpXFpMvIAKAwK9ti38XvfiB28RKLbYXZ2ex9cjSXvjOtYJATG0v6wUOm/587D0DmyVMAZBe9vhvueuK8atUqHnzwQdzd3QEYO3YsO3fu5Pfff+f333/H19eXr7/+mo4dOxIWFkZ+fr7yy2fZsmX07Nnzbodc7WseP/HEExw4cIA+ffowffp02rdvX63xCCGEEPe6Pn36cPbsWfr06YNGo2H8+PEsX76cvn378vnnn8sM20JUgcs//MiuwY+SduBgdYdSQtyKVVxc+i25cVeqvO4zn37OmU/nKq+vbtpcboKYdeYsR6ZOJ2b2++x54ikMOh2p+/aTsms3uqyscpeAMhoMXP11E4XFhnTmxV8FTHNKnPl0rvIAI/vcedIPHVbKxa9Zx8X/fVduK3LOhYuceOsdKKpDl3m9rEGnI2HdL1z95VcMWi1Go5Ejr0zn2My3AMg8HmOKJ+56Q6o5mTfk55tiOnO2zHNXtbveVXvVqlW89tprlSqrVqt5//33mTVrlsVyVNXhTqfOAQEB7NmzBzCNAS+udu3aykRhN5o0aZLy/0GDBjFo0KAyXwshhBCiari6unLkyBHlddOmTVm3bl2pZefMmXO3whKixijMzePsZ3MJHDMa21qlLzWbeSIGY2Eh579aRMu5nwCgtrHBaDTeVsOWUa/HaDCgtrG5peMNOh1ZMScBSNz0G4GjRt5yLFc3/caVldG0mvcZqqIJDTNjYlBZWSuxnpv3JQAPrF4BgD4/Hys7O6WOlF27yTp1SnmtTU0ztRobjRyZ+iralFTcW7XExtWFwDGjLK47MyaGc18uwGg0gLcXRqNRaXHOPHacTKD+UyOxcXEm9pso8q8m0vbrBQDEfr0YgMKcHIKeGVvi2vQFBZz64EPyij1cKD7GOfP4CfS5uab/n4jBxt2drJPXr8M8+3ZBUlKZ9y/77Lky91W1u544b9y4sdz9NyaNrVq1Yu3atXcypMpRKQ9KhBBCCCGEELch9+JFUnbvweO+tnhHdC21jEGrBaAg6RonZ7+PWmND8NSX2P3wUGoPGkC9x4fd0rmPvjaT/PgE7lv6zS0dn33mLAatFmsXF65t/4P6Tz15y4l82t795CdcJT8pCXs/P4x6PQXXklHbagDIL5Y05l2Jx8renr1PjaHB2DF43H8fF7/9Xkl0HRsEknM+loKkJAqSrpmOjzftS927D2NhIQatjkaTJ2I0GLj4v++UpDYv7gp4e6HLyFSSWTNdRgZWDvZknz6DQaslYf0vqKyvp5E552PLuLZ9FkmzysqKwqws04MLvZ7UvftQazQYjUbSDhzExtUVACsHB/S5uegyM03XkJiIjasLalu7Ekl09rnz5baoV6W73lVbCCGEEEIIcW8zd9k1z7Zs0OkA04zOJ96ejT4vD12GKXEy6vWkHzpM2sHDZMbEYNTriVu+okSdRqORzJiTFY6Nzoo5iS4jg4KUlErHq01NI2HDRoxGIxnHjgMQMGgAuvR0ci9dNl3TmvXErYwucWzC+g0cmfYauXFxJeLNOn0GQKlDm5qGsbAQfU4u+vx88hOuKuWTd/6pJNKXflhG7DdRXNu6jayTp/Dq8iCNpzwHmMb/GoutBNRg3NO0+PQj/Pv3JWnbdvISrpITe4ErK6NJ/XsvYErKDQlX2fvkqJL369QpLv+4XHmQcX7RYi4sXgqA2s6O3EuXOfjcFM58Nk8pA6Yu5Cpra+qNeBwAx8D66LKyiHn3PfY88RQ5Fy7iGNQA5+DGZMacJG3/ARwD69Nm4Ze4t25VLHFOwtbbG4275TxX7m1ao8/NJXXP3tLftComiXMlVe8oZyGEEEII8W+QfvgIObEXqjuMu85oNHJ+0TdkHDclnYXZpsS5ICWFtIOH2P3wUAzxCcSvXkva3n3ELl6CLjMT+zqm5WqNej2G/HwufbcMAKeGJZd6Sz9wkKPTXlOSwbLiMNs3aizHZ71lMeOzsZSlZ416Pfuefobz878iPz6B/IQENJ6e1OrYAYAzn84ldvES9IcOc2VlNIbCQlL/3kvBtWRyYi9w/qtFZMWcJHnnLot6tckp6NLTgeuJc37S9Qm5tGlpSmuyysaGvCvxSvnCrGxS/twFRWstOwU1QONh6vKeWZTYq+3sUNvZ4dM9EoeA2tQe0B+VlRUJ6zcok22Z5V2Jx1DU7VllbY1byxbKvrNzvyDup2LDRg0G9EVL6bq3bGGagfviJZK2/E7cymhyLlzEoNORffYcjoH1CRg8kPY/L8PO34/cCxdJ27cfQ34+uZcuY+fjjUOdAPKuXCH7zFlcwsKwdnLCxt0dXUYmuZcuk3/1Krbe3tgUzZFl5tvzIWy9vbi64ddS3umqJ4lzZalAemoLIYQQ1eOfPLvu7fi3XpconS4zk+Mz3+ToqzOqO5Qqpc/PJ6/YSjil0aamkbB2PWc/n49Rr6cw2zS7sjYllYwjRwEo3LKV9CNHUdvZkfjbFvS5uTg3slwyNvP4CcDUQp2XkIC+2LJv5knEUnbtLjOOG2d1zjwRw5lPP0eXmcnfj4/k8k8l5xVK2f0XxqLuwLlxVyhITsG2Vi1svbxQWVuTc+488dFrQKWiMCuL1D1/EzP7fU598CEZRfFaOToo46KNRiMF15LJOmNqbUatJvfSZYwGA/kJxRLn1FTyEq6itrPDJSSY/KtX0aalW8RW55GHAXAMCsTK0QG1nZ1yzoYTn6XhhPHKmGaNhzvOwY3JOnmStAMHcQysT4NxT+PbqwcF165huHgJO39/Oqz4keCXX6DR5IkW51KVMibcrVUL5RqcGjXkyqrVHJr8Aocmv0DmsePKAw61jQ3Wjo4WLdKFmZnYentjX7s2+pxcDFotjoH1ALBxdUGXlsbBSc9TkJiEnc/1FmdrZycA7Hy8qTt8mNLF+06TxLmSVNLmLIQQQlQLOzs7UlJS/nVJptFoJCUlBbtik/yIf7f4tesBLJK925GflERBSqry+vTHn6Ev6vp7p6UfOcrfI0ahy8oibsUqDk15WeluXZrcixcByI+PJ3HLViWB1aamKq2XhtgLYDDg2/MhMBgAcAxqoLSqmrk2C6cgOYVDz79E/Oq1nJv/FXnx8aQfNk3Yl7p3X5mxFCSbxv42eOZp7vvfYuo8OoT0g4eUia7SDhwkLz6e84sWK92is4rN3Jx35QoFycloiiY0azhpAgFDBtPo+UnYDB2ClaMjF7/9HgwGsk6dJu6n5Wg8PfDq1FHpQn31103sGzuepN+3otZocA0LJf3gQfaOGsvZufOUc2lT08mPT8Dezw87X1/yryYqLc7OTUJo9n/vUXtAPxo88zQuTZqgUqnQeHhg1OlQ29pSq2MHvDp3tLh+50YNyYm9QNbJU7i3boVf7564hIaC0YjhfCzOjU0PKqwdHfF6sLNynHvb1rT56ks0npYTubm1aF5UbyP8+vwHQ34+dr6+5F0xPUhxCmqglLV2dATAq8uDyjY7H2/sA2orrx3r1wdMiXNxNq6u2BQtSezbswe+vXtiX7s23l06E/zyC6W+11Xtrk8OVqP9u35fCyGEEDVCQEAAcXFxXLt2rdLHaLVaNBrNHYyqatjZ2REQEFDdYYi7JHXP3wDKhEg3M6GUvqCAwswsZaZhgNP/9wnWTo40nfkaBq2Wa9u2AxBna4dXpwew9fKyqMNoNKLPzVUSGDDNSnzp+2U4NW5E3aGPVDqe9IOH0GVkkHvpsmnSqPx88q5cURIfs4QNG7H381W6pzsG1ufysh9xa25KuLQpqeQ7OWHt4oIxuBGNIiOwdnExteACGnd3bD090GVk0vSN17Gytydl126llfrqrxvRpqSSGXOSvMtxuISFknnsOFd/3UjelXgCRz9lMYt0wbVkAJwaNsTGxQXfXj2IWxnNtW07TPdIV8jhF6aiz8sjbd8+09//ajWOQQ3QJqeQdyUebXIKHm3bAODd5XpyeXn/flxbtiB5558AONSvR+6Fi3g+0AGXpk25+usm0o8c5cqqaDAYSNu7H9dm4bg1b0bmiRhcmgaSUdRtHEwPG7LPx+LSJAQ7Xx90GRnkxSdg4+pCsznvKOX8el1frlfj4U5+fDxuLZqV+vlyatRQaT337GBa4tapQaCy35w4g2kyL2tnZwqzsnAICEDj4Y5jYP2i9y0FG1cXbL28cG4SgneXB/Fsfz+pf91P7YEDUGs0XFj6LW6tWin1+Q/oh2vzZjgFNVA+q7be3tj7+ZkKqNU4FHXNt3G5njh7de1CrY4PkLZ/vynGkGA82rQucW13miTO1WzMmDFERkby2GOPKduMRiPdunVj9uzZ3HfffSWOmTZtGmFhYTz++ON3M1QhhBCiWtjY2BAYGFhxwWL2799P86I/zIW4WbGLl6BNSSH4pZtrydJlZlr8wV+c0WgkP9HUgmnIz0efk4O1k1OpZfOLuqYWd+KN/5J5IoYO0T8rCVFe/BXUGlvTuYst83Nxyf8ozMyk/sgRFnUkbvyN2G+iaP3VF2iKWu9iFy8h89hxci5cLDVx1uflcXXTZrwe7IShoACNuztqjUZJhAsSk8i5YGpNzrlwEcf69clLuIpRp8No0HN+/lcA1OrcCU2tWgSOfopjM2aR9PtWALTp6ag1NriGh5IT2RXP1q0tJu2ycXXBzs8PaydnXEObApBZNE4aTIk3XF/ft/bA/uScO0/s11FgNOLWsiXurVqgS0+nMDdPSZDNDxWsHR0Jn/028WvWkbZ/Pzmxphmifbp3I/G3zcp5vCMjsLK1JevUKQxaLba1rj/AKM6tZXOSd/6JxtODxlMmc/jFqbi1aI5765bYentx4o3/AqZxxMbCQlzDw6g9eCD+/fuitrEhdvESjHo9Ces3ELd8BSobG3x7PqQs45R16pTS8loabdG9MyfFN3Jq2BAAOz9fHIsSZvva/oRMm8qpb7/Hva1lQmrj6kphVpZyvxpOmoBRX8iBZyaiqVULlUplkcSHTJuq/D90luWQBBtnZ9yahZvuu4sLhZmZ2Hl7ofH0QG1nh61XLdRFDzyLd79u/Lxp+V17f39QqbDz9S3z+u8k6apdSao7NMZ58ODBrFq1ymLbnj17UKvVtG3b9g6cUQghhBBClCc+eg3Jf/xZ5v7C3Fz2jhqrdA0GSNnzN3tHjqGgjJ4RhZmZGPLzcWnaBID8pNLLZRw/wf6x45XZlo16vWm26BMxAEpXXX1eHoVZ2WhTUtDn51usjwsoMz+bGY1G4tetx1BQoEwMZdDpyC46j7m7dPHJsQqzczj80itc+CaKk+++x/6xz/LXsBHkXo4j58IFwJTIKRNcXbhIYU4OR1+dwbEZs5SZlwGyYmJwDKyHS2hTy7GyBgP5VxOx8/FRNmnc3ZUyNi4uBD0zlsYvPKfsL21Mq7kV1c7bC/c2rZR1ZJN37uTC4iXsG/MMh6e8pIx/Lt4V2LFeXRpNehafyAhlW70Rw2m98EtcwkJNZQLrYV+7NnmXTTNja8pYe9qthWnMr1PDIBzr16PtN1/h0y0Caycnwme/Q+3BA2n80gv49ugOgGtYKCqVSmkVD3zqSRqMGaV0VQ9+aQpuzZthW3R/ChKT0NwwSVZxLqGmeM0t4jey9fbCqWEQfr17WbRIe7a/H9tRI7DztnxgY+PmqhwHoHFzxdbTE8egBjjUqVNmHBWx8/UBtRqNpycqtRrX8DDl3gGlPoByCQulzcIvcSjWtftukhbnahYZGckbb7zBuXPnCAoyDZ5fuXIl/fv3Z/jw4eTl5VFQUMAjjzzCyJEjqzdYIYQQQoh/OWOxNWHL6k6dn3AVbUoK2efO49a8GWDqumzU68m5cLFEF2m4nii7hDYl80QMBdeSLbrImpkT5OwzZ9GmpHJyzvsWM0jnX01E4+6udDkGyIuPpzA7x6Ke7HPnKczJwdrRkaxTpzky9VVlX9qBQ6isrIhdtNg0IVNQA3LOnceg1XL8jf9i0Omo3b8vib9tIT/hKtbOTmSdOm26JzqdqZt20SRVKUXdz1VWVuRcuMjlH5ejK+punH7oMO5tW5O2dz8F15Lx7dUTlVqNnY+3aX1ftVpJEIsnzsXL2Li6lEiUS0uqzO+bjZsb3hFdSd27H+fgxqT+vU9Jomt17sS1rdtM5yjlfbUtauXXeHhg4+KCjYsLtTq0J/PYcRwDAym+zo6tZ+mJs20tT/wH9FNaVovHblvLk/rmpZnq18Oo1+PUuFGp9fgP6AdGI57t7gfA3u96K+uNs0sXFzRuDHWHPmLRHb84lUpF8w/fL/P4G5kfMNz4mW46Yzoqa6tK13Mjh7p1KczOUR4YNJ3xqsV+axdnwLSms5lKpSr1e+tukcQZSPp9G4lbfi+3TH5BISoVpGpu7pb5REbgHdGlzP0ajYa+ffuyYsUKpk6dSnZ2Nps3b2b9+vWMHTsWjUZDTk4OQ4YMoVOnTkpyLYQQQgghKseg1RLzzhzqDhuKc3DjcssaiyWkhdnZ2Dg7lyhj7g5bWLTOLEBm0YzJefEJpdZbkGjqSuwaFkrc8hWcfHcOIa9OVRIjs+yiJYFyL18m+9x5i20A+YmJuDQJsWjZzouLR2VV1JHU1ha/h7qRsHY917btIG5lNO5FMx+7t2mN2saa9EOHyThyFF1GBgCe7duRc+482efOK7NWn/rgI1CrCRw1Ejsfb2LemYN3twiSNv9O2v4DgGmstjmBdmvVkqyTJ8k6dRqvBzuTFx+PsbCQ4Ben8NdQU7Lo16c3YOomnBd3BbfmzZTWb1sfbzBcb+228/Eh70p8qd3Zza2gJajVWDs54d6qJe1++B/5CVc5MvVVCrOzafb+bJyDG+Pfp7fSun4jc2urQ726yjaf7pFYOdjj0rQJDvXqErvoGwA0ZXTVBlOrcUUc6gQQNH5cpeuwdnLCtVk4GUeOltnFH0zvSfFx8LfLnPibW5yvx1N6Yl5ZgU89Web7AKYHE7U6PoB/vz63dZ6qJInzP8DDDz/MmDFjePHFF9mwYQOtWrXCxsaG6dOnc+rUKVQqFUlJSZw8eVISZyGEEEKIm5Qbd4X0Q4fJuXCR+5Z8DZiS4vg167Bxd8e350NKC6Th6vXlgHTpGRaJc9r+AzjUravMZK3LMCXOhTk55F68BEB+QgL5SUlknTqDV6cHlGPN45uLtzBeWLykROKcc64ocb50GW1aOu5t21D/ySfIvXyZU+9/qIzlLd7VO/NEDA71TN1mbZ8dS7327U1jZFdGo01O5tr2P7BydKTJjFdJ2f0XKbv3KMe6tWiOY1GimLTVNGFTyPRXsK1VC4c6AaaJzPR66j/1JN5dHyRl119Kq7hL0yakHzqMa7NwAgYPNC2zZTTi26sHDvVMywpZ2dvTdNYMbL29sbI1jce28zVNBmVf258G454mYf0vuDQJgWJjlx0bBJIXH4/KqmSrpo2LKZmzcXVVkn/za1XRDNwqtRr72v6E/ncWmcdPKPe9tPWfzcwtzo716ynb1BoN3l27mOp3dsavT2+u/roJTVnJ+x3k16e3Mina3eLRpjX63Dysi7X8VgVrJ8dyk2+VldVdmy27siRxBrwjupTbKgxwISETa7WRAJ+q/yYJCQnB29ubHTt2sGLFCp588kk++ugjvLy8mDNnDtbW1owaNYqCKlq6QAghhBCiptOmpZF78ZKyHE55zGNwzf8CJO/azeUflwPgUDcA19BQ0vYfoHDHTsvjimb51WVkcOLt2dTq0B47f7+ibekkbvndlBAajaY1fc/Hsv/p8QA4BzdSWjHzE5OwdnbG2sEBj/vbkrpnL9r0DIx6vZIc6jIyKLiWjMraWmn59ekWgUOdABzqBBDr4UH+1US06elknjiBysoKjacHVzf8ev1i7e2xsrXFoU6AkswbCgpwqhOASqXCo20bJeEM/e8buDULV7phX9u6DY2HBx73tbXoyqyysqL2gH6AqRtzXlwcajs7pTutz0PdcWkSQsCQweScO4dzSLDF8e6tWlq8H3ZFrZfGwkLs/XxNY3pvUOfRIdQe0L/U99N8Xtfm4WSfPYehQIs2JUWZ8Kw4pwYNcGrQoMT20th5e+PTvRu1Oncqs0zgmFEEjhpZakJ/p3nc15ZGz0/CvXWrigtXEffWre7q+f7JZHKwSrrTqzgPHjyYuXPncuHCBSIjI8nKysLX1xdra2tOnz7Nvn377nAEQgghhBA1x8FJz3N81lsYtNoKy2qLzdJcmJsLYBpji6lF8dr2PwC4+usm0Grx7W1a3ufsvC+5tOwnwLQ2MAYDqX/vVdaoTdt/kLOfzePUBx9h7eKCx/1tlSQUIG3vfgpzcihITiEvLk6ZKbvJ9Gk0fnEKhvx8dg16RJlhOvfSZQBl3DRgaoktYufrQ0FiIifffZ/kHTsx6vUWM3+r7exQWZvaxcyzJyvHFo2RVdvY4Nu7JzauLriEBAMoszQbtFpcm4WVu0yWbdGkWPZ+ftR97FFqD+xPrQ7tAKg3/DGazpxR4TJb1s6mrsa6orWcS6O2sSmzRVJtbY1vr554d+1C6y8/x+ehbkXXcXsNXCorKxpOHF/q2HOljEpVLUmz+dzeXbuUOXO7uLMkcf6H6NOnD2fPnqVPnz5oNBrGjx/P8uXL6du3L59//rnMsC2EEEIIUUSbnk5hUdKVX6xrdVnMXavh+uRbeVficQysj2f7dqT8uRuDVkv2ufOogxooyzLlJ1wlYe16jHo9KX/tQa3RYNBqlfWYi/Pu+qAyHtS7WwR2/n6k7t3Hqf/7mH2jx5J5Igb3YmvPuoQ2Uf4f+00UCet/IaeohdjnoW7Y+flSe2B/nIuSWzAlv7mXL5N16hQAHu3uxzm4MT5FMzTbuFzvVn5jl2Q781q5QJ1HHqb1gi+uL/1TLOF0alT6ZFVmmqJJsez8fLH396f+yBE3nUiaz3FjS/TNCHrmaeV4cyJZ3jJNQtwu6apdWXe4ydnV1ZUjR64vadC0aVPWrVtXatk5c+bc2WCEEELck2JjY5k2bRrp6em4ubnx3nvvUb9+fYsyK1asICoqCrVajcFgYMiQIYwYcX2t2F9++YUvv/xSmY148eLF1CpnEh0hbkXxpaLy4uNxqFv+sjja5BSsHBxQ22qIj16DR5vW5MVdwTGoAd6RXbm2fQcJ6zegTUnBulULrIuNay7Mzubs51+Qtnc/tQcN4Nr2PyxasAEcgxrg17snusws8uKuUP/JEVz+aTlXf91ksbyTd2RX5f+2np7UHtgfGzc3LixewvmvvsbG3ZT4ubVsQesbxj4DeLRpQ9Jm04S2IdOm4nGfackhhwBTd3Kjwaj8yepsHtPbqCHZZ85azMqsUquxsrdXXpvHHgM4N7Jsqb6RxtMDuN6CfSscAmpz/3dLsXKsmnGz5pmfq2Pcsbh3SOJcSSruzDrOQgghxD/FrFmzGDZsGP3792f16tXMnDmTpUuXWpTp0aMHgwYNQqVSkZ2dTd++fbnvvvsICQnh6NGjfP755yxZsgQvLy+ysrLQFLVoCVGVci5cVFp/8+ITlNZiWy8vtGlpWNnZ4VA0Njn90GFyL13Czs8P766diV20mIzjx8lPSsLrwU64NgvHPqA2F6JMn3WVn68ywZRZ0u/b8GzfjrrDhmI0GIiPXqPss/X2psVHHwBg5+tL2H/fAExja406nVLOr3fPEmvk1h9peujk0bYNB56dhC4tHWsXF4tEtjj3Nq2wdnamMCfH1KW6qKXXvtg4bPORTg2DCHv7TVRWVhx9dUbRckoVcwysX+5+8zJM9v5+5ZaryO3OylyctDiLu0G6aleaSjJnIYQQ/1opKSmcOHGCPn1MS3/06dOHEydOkJqaalHOyclJGb+Yn5+PTqdTXkdFRTFq1Ci8itbZdHZ2xraMBECI25EfH49TwyBs3NzIuxLPuS8XcHTaa8S8PZsjL73CwYmTAbiyei3HZ71F1qnT2Hp6UKtTRwCubd0BBgP2AbVRqVQEDHlY6BjgYwAAIABJREFUqVvt62NxLp/u3fDp8RCNX5qC2sYGr6KJo+yKytndUN6seCt44JinaDB2TJnXY1/bX+m+bB5DXBq1jQ0Bgwfi3bWLxTq9SotzsUQdwDU8DJemTWi7eFGFCbFyjgoedpmv16FO+a38d5Om6J5V5TJMQtxIWpwrSSVNzkIIIf7FEhIS8PHxwaqoBcvKygpvb28SEhLw8PCwKLtlyxY++ugjLl26xIsvvkhwsGkM5rlz5wgICGD48OHk5ubSvXt3xo8fX+FEQaLmiv0mCrfmzSqcdTfj6DHi164j5JWXq2Ripbz4BGW8cH58PIXZpvHOObGx18skJCityABqO1tsXF2xdnEh5a+/ALAvSji9u3TGtpYnBUnXuGxnB4Cdvz8FSUk0nDje4tyODQJp/OLz6HPzOPflAmxvaEU2s68TYPoD0mjE3t+/wmuyr+1H9pkz2FYwtKH2wJIzTZsTR5ewUEqbKk3j4V7h+VvO+6zCMgCuzZsRPuedCtfDvpvs/fwIe/ctXEJCKi4sxC26ZxNn89ire5XRKE8BhBBC3JrIyEgiIyOJj49nwoQJdO7cmQYNGqDX6zl16hSLFy9Gq9UyZswY/P39GTBgQKXrPnbsWJXFuX///iqrqzr8U+I3FhaCToeq2JhYMLVuFqxeS/zqtdjNnF7iuOLx6zZtQb9nL/t37kTl5FS582q16H7ZiHWnDqhsbdFt2IRNn16gUqFLTyfVaMBoq0F/8jQUFKBuEIjh/PXE+fCXX4Fajc2jD6P74SfSsrM5cOAAenc3jBcvgUbDyZRkVGnFelW4OiuxG0c+jsZoLP19cHTAkJwMQKq+sMz3SuXmhjEtjbOpKagreD8Li/7NMBpu6b23fW4CBfZ2qLjNz07i1cqVu0Ofz9uK/dChqgvkFv1Tvm9vVU2O/07Hfk8mzlZWVuh0upsed/VvSjV1Oh3W1vfk2y+EEKIUfn5+JCYmotfrsbKyQq/Xk5SUhJ9f2eMY/f39CQ8PZ9u2bTRo0AB/f3969uyJRqNBo9EQGRnJkSNHbipxDgsL+3/27jw66vre//hzluz7QkISCJDIEghgCbhUwAUEK8FUrQUp7e2t0p9Xq5ZrVaSV5doNVK5LpVWqWGhFighIRHHvVbQIEcUY2RMIJCSQhawzmczM748hIxECk5BkZsjrcY7nJN9tXuO9p/H9/Xw+70+nTO/Oy8sjKyvr3Bf6KG/lr9m1m71PPMXIxxZhPlng7n92GUc3vcl3/vSke90wQH1hES1lyrezfjv/rnfepwLI6NefsP793MdbtoYyh37TJKruwAFKXnsdg8FA+c4viY6PIygxkeKvdxF70UXYGxooBy66ZAzNtbXs2/EFAOlTp1D4wos019a5tmTau4+Eq8YzcPo0qgYOJGLwIMzh4ezf9hlHDx4iKmMImWfYtcTTf/fW/v3J+/sqBo0b2+aI+9eDLqJq+2eMvuaac460H7dY2f3B/9Fn6FD6nMf/7f35//f9OTsovzd1Rnar1XrWl7c9co1zdHQ0ZWVlOBwOj++5kMamHQ4HZWVlREWp86CIiLjExcWRkZHh3tEhNzeXjIyM06Zp79+/3/1zZWUlW7duZdAg15TN7OxsPvroI5xOJzabjX//+98M0dRJv1KV9xmW0qM0FB92Hyvb/DYAe5Y80eraxiOufZBN3xqJBnA6HDQ3NHL0zbewW61Yjx0DwFZTA8Cxf31I8T9fYffix9n1h8Xu++xWK/lz53Hs/Q/cexsf/+hjOPnfbKUbcyl/19VVOiQlhagR3+x3HNqvH31uuZnA+Hiczc3YGxrc63Bjska5XwS0rD2OHPrNdlAdERQXx5gX/0r0WbZU6j15Eik33+jR9PTQfq4XCiEp557WLSLdr0cOOcbHx3P48GF2n9wDzxNVtRacDif1Vaf/cfAHTU1NrUbYw8LCtD2IiIi0smDBAubMmcPSpUuJjIxk0aJFAMyaNYt77rmH4cOHs3r1arZs2YLZbMbpdDJz5kzGjnU1XJoyZQr5+flcf/31GI1Gxo4dyw9+8IOzfaT4mIaigwCuQjdjCNZjx3Da7QTExFB/oJCm6moCT3YubjxSApzeHbny021YH13C14MGUpP/FZWffoqlrBwA2wlX4Vz6xpvUFxZhMBqxNza6n1u3bz/2xkYG3PaflL37HnGXX0bxqtVUbtve6jMSJ00kJDkJg8lEUGIC1vJjhPRJITw9jYCISPY++TRw5mZREYMHgcFA9MgRp51rr5Zuzm2JyRp1zvXfLUL7pPCdp58gpE/KeecSkc7XIwtno9FIampqu+6Zu3QLJ2pqeGbO97ooVdfKy8tj5MiR3o4hIiI+LD09nTVr1px2fNmyZe6f5849fS1rC6PRyEMPPcRDDz3UJfmk69UXFQFgPe7ap/jEl18BkHrrD9m/9Flqviog/orvAtBw2DXibLc2Uf7+B4T264c5NIQ9TzwFTU3U5H9FQFQkVXk73M9vrjmB0+mk4dAhHBaL+3jVtu0kXjuR2l2uQY1eV40n+YZsbCdOULxqNY0nPwtcXa4vuuubhl3x372cE/lfubdwCjhlL98zNdoKT09jzIt/db8A8CXn2o9aRLynRxbOHWE0gvppiYiISHeq+OTfhKSkdEtB1VxXj7XcNaW6ZWp17Z49mMJCSbjmagpf+Bsn8r+i4eAhGo+UULdvn+u+mhr2PuEa4Q2MiwUMmK+fjP3t9xj4y3soWPhb92fYTtTQdLwCe32D+5jBZOL4lk/chXNwcpJ7JNccEQFGI46mb3pFR2QMbpW7309mtvo94JSlaIFtzK7zxaJZRHxbj1zj3BEGg0GFs4iIiHQbp9PJnieepuS13E57Zt2+/TRVV7c6Zq2oxOl0Un+wyH2s6eSIc0PxYUL79sUYEEDE4EHU7trNkQ0bOf7RFizlx1ptxRQYH485LIzB9/0S8+gsLlu1kphvrf+11dRQf/Bgq2NJU6dQveNzanfvoabgayKHfFMYG4xGAqK+mQ4dEBVJ9Ldm0BmMRgxG4ynXuApng9lMYIwKZBHpHCqcPWQ0GnCochYREZEuZqutxWmxYK+vx2GxYDtx4qzXO5qbqTtw4JzPtTc28sV9D/D1I793H6vdu4/tP5vFsff/Re3XrmnS4QMHYj3m2mqpsbjY3WArJDkZS1kZzuZmkqZcz2WrVpL6o1vdzxo2/zd85+kn3Gt6jQEBgGtvYQBjcDC26hPu6dghKckEJSaQcmMOBrOZ/IcXYG9sJCl7SqvcgdGuPYijRgznkhXLCTq5Z3FbWgrtwLjYVgW1iMj50FRtDxk14iwiIiLdYPfix7FZrVhTXFs/natwLnvrHQ4891dG//XZNotKp8NB1WeuzaPq9u1n1x8fpdfVV7rXDtfu2UNjSSmh/VIJvyiN4x9twVZTg+1EDSF9Xc2qgnrFu6dYh6QkYQoOJiAywv0ZQYkJnEnGQw9QlbeDo5vfouKTf5+8P5n0u+7AYbESGB3NwHt/wdHNbxN/xXcJT09rdX/LmmVzRMRpzz4TY0AAprBQgnr18uh6ERFPqHD2kNFguKD2cRYRERHfVF9YhDMwgKYK13Rp24kanE4nxS//k15XXUlIUm/XdUUH2Xn/HFcXZqeT+qIijAFmLEfLqN27j8bDh0m/4+c4bDa+nPNr6vZ9s5VYxSf/puKTfxNxclq0026n9utdJE6aSGBMDM21ddTtda1hbhlxPrUQbVk73LIWOTA21t2c69vM4eH0unIcxz/+BICo4ZkMfuBXrYruXuPH0Wv8uDPe3zLd+lwdrE8V2rcv4WkDPL5eRORcVDh7yGgEhypnERER6ULNdfU019aC2YzVXTifoKmykuKX/4nBZKLvD11bfFVu246jqYn6A4UANBwqpmrbdsreeQ9nczMAaf9vFiWv5VK3bz/G4OBWnawB97Tpyq2f4mhqImp4JsaTBXDJxtcB3NsjBSV8Uzi3dKs2nyx+g3snnvO7NRYXA9D7ukmtiuZzCTjZyMscEe7xPZm/Xahp2iLSqfS/KB4yGg04NVdbREREOpHTbsd+SjFrOXrU9UNzM/WFRYBrbXLLmuOmqir3tcbAwFbPajhUzIn8r9xFM0BTRSUlr+USPeo7XLZqJUPmPOC6NyiI/j/7D/d1LfsrRwwZTPSI4QRERVK943MC4+PdRXKrEec415TwgAjPC+eEa64GIGbM6HNee6qWwrk9xbYxIACDydSuzxERORsVzh5SV20RERHpKIfNxuFX1+Ow2VodP7JhI5/deTdOhwOAxtKj7nO1u/e6f2445BqttVVVYbdaOfzqeqzl5e7z5ogITnyZ32q/Y4Dy997HVl1N4oSrMRiN7vXKYWkDSJ6azUX33EWvK8cDrmZagdHRGEwm4r7r2qs57fb/dI/cBsZEYzCbMZjN7gZcxuBgwgcNJGrkiHP+O+jzg5u4fO3qNqd0tyXQPeLseeEsItLZNFXbQyaDQVO1RURExGNOp5OSDRvpNX4ctXv3cfBvKwlN7Uvs6Cz3NXX79tFUUYmlrJyQpN5YSkvd5+r3f7MmueHQIQCaKqs5uOLvlOZuwmAyYQwOJm3Wz6gvOkTpRte2Vb2uHE99YSENh4o5vGYtxsBAYk5+ZnBiIsbAQCIGDcRgNJI44RrXaPO/IDw93f15faffQuTQDGIvu9R9zGA0nhx9dmIwGFzHDAZGPvpHj/+dGM3t/09P197Q2ntZRLxLhbOHNFVbRERE2sNSWkrR8r/RVFHhntpsO2WqNYDlaBkADQcPugrno2UYAwNxNDUBrq2VbCdqaDjoKpwt5eXUnSyonXY7IX1SSJw4gZqCrzn+0UcYjEYuuvtODEYjH9/0QxxNTcRdcTmm4GDANYV5+B9/R/ApHbBbpmCHndLNOjA6ml7jx572ncLSB8DJ0fHuEjk0g8EP3EfU8Mxu/VwRkVOpcPaQwYCmaouIiMgZ1RcWYQwOIiQpyX3MWn4MgONbPnbvbdxU2VbhfIi4yy6lobiY8IvSqSn4GoC4K77L0U1v0lD8zVTtU7VMX44cmsGY5X8Fp/O0pliJE65p9fu3t3sKTXV1zY4aNvSc33PQ7HvPeU1nMxiNxF/x3W7/XBGRU2mNs4eMRk3VFhERkTPb879PUrjshVbHrMdchXNTRaV7/+JTm3vZamux19cDUH/wIA6bjfoDhYQPGui+pu+0W1zXVlW3erY53NVh+tQtmgwGQ6uiOeDkNk7RF488a/awfqmMfuE5j0Z0jQEBGAMCznmdiMiFRiPOHjKqOZiIiIi0wXr8+GmNvyzlx8BoxGg201xbB7hGnG0nTlC7Z6+7W7QxMJC6vfuo3bUbZ3MzEYMGEviTH5Fx8cUEREW1mrrdIixtACd2fnnWTtMjH38UR5PVo+7SQSenkouIyJmpcPaQ1jiLiIjImdgtFuz1DTisTTjtdnehaj12nMCYGCKGDKJiyycAnPgyn7z/uht7fT3hAy8CIOXmGylevYb838wHIGLQQIzBQe4p1RFDBnNi55eYQkKwNzZiCgt1r5k2nzLi/G1BJ5tqiYjI+dNUbQ8Z1VVbREREzqBl+rWzuRnr8Qr3ceuxYwQl9CJ+7BWAa+sme0MD9sZGokYMp27vPgBSvn8DGXMfdN8XeHLf5BbR37kYAFNoCODqft1SFAecpXAWEZHOoxFnDxmNBlQ3i4iISIvi1Wsof/8DYkaNch8r2fAaVXk7cNqbsR47Tvz4ccRdegkD7/0FdQeKKN2YS9iAAWT85iEqt24jIDICU3AwsWNGM+yRBdgbLe6tnlrEjLqYg39biTk8nOSp2fS6+ioqPnGNYKtwFhHpHiqcPWQwgFNDziIiInJS5bY8LKVHKX19k/tY6etvEDagP2DAeuw45rAwDCYTCddcTVP1esDVxdoUFHTadk/RI4af8XNC+/UjaWo2va4cR8TJ6d1B7qnaba9xFhGRzqPC2UPqqi0iIiKWsjJqd++l1/ixNFVWnPGaIQ89gCkklD3/+yTx407fRik8fUC7PtNgMJB2+3+2OhZ98UhSZ84gKnNYu54lIiId022F8+HDh7nrrrvcv9fW1lJXV8fmzZt54IEHOHToEIGBgfTr14//+Z//ITbWtXbn888/Z968eVitVlJSUnj00UeJ80LnR6NBU7VFRER6ugPP/pWqvM8IiI6iqbKKqBHDObHzSwCCk3oTFB9PcGIiAMPm/6bVvUnfmwwOB72vm3zeOYyBgfS95ebzfo6IiHim25qD9enThw0bNrj/mTBhAtnZ2RgMBm6//XY2b97Mxo0b6du3L4899hgADoeD+++/n3nz5rF582ZGjx7tPtfdXNtRqXQWERHp2Vz/LbDn8SfA6STuskvdZ0Y98xTDFs5r805TSAh9fnCT9kEWEfFDXumq3dTUxMaNG7n55puJjo7m0ku/+aNz8cUXU1JSAkB+fj5BQUGMHj0agOnTp/Pmm296I/LJ7ai88tEiIiLiI2wn92O2VVcDENov1X3OYDJ5tGeyiIj4H6+scX7vvfdITExk2LDW63IcDgerVq3immuuAaC0tJTk5GT3+djYWBwOB9XV1URHR3drZoMBrXEWERHp4ZoqKghLT6N+/wEAghJ6MfJ/H1PBLCJygfNK4bx27Vpuvvn0dTmPPPIIoaGhzJw5s1M/Lz8//7yfUVZ2AqcT8vLyOiGRd/hzdvDv/P6cHZTfm/w5O/h3fn/OLl3DabfTVFVNwjVXf1M4x8URnJDg5WQiItLVur1wLisrY9u2bSxevLjV8UWLFnHw4EH+8pe/YDS6ZpAnJSW5p20DVFZWYjQa2z3anJmZSVBQ0Hnl3nN8F+TvZtSoUaftr+gP8vLyyMrK8naMDvPn/P6cHZTfm/w5O/h3/s7KbrVaO+XlbXcpLCxkzpw57pldixYton///q2uWbt2LS+++CJGoxGHw8Ett9zCT37yk1bXHDhwgBtvvJEZM2bw4IMPduM36FpNVdXgcBAUH+9qCpb/lUaaRUR6iG4vnNetW8eVV15JTEyM+9iSJUvIz8/nueeeIzAw0H08MzMTi8XC9u3bGT16NC+//DLXXXddd0cGwGB0FcsOhxOTyf8KZxERkXOZP38+M2bMICcnhw0bNjBv3jxWrFjR6prJkydz0003YTAYqKurY+rUqVxyySUMGTIEALvdzvz585k4caI3vkKXaTxSwr4/LQUgMD6OofN/Aw6Hl1OJiEh36fbmYOvWrWs1TXvv3r08++yzlJeXM336dHJyctzbVhmNRhYvXszChQuZNGkS27Zt47777uvuyK4sJ0eZHeoQJiIiF6CKigoKCgrIzs4GIDs7m4KCAiorK1tdFx4e7p55ZbFYsNlsrWZiPffcc1x11VWnjVT7uyPrNlBT8DXgmp5tNJsxnvKyX0RELmzdPuK8efPmVr8PHDiQ3bt3t3n9qFGj2LhxY1fHOidjy4iz6mYREbkAlZaWkpiYiOnk1GOTyURCQgKlpaXExsa2uvbdd99lyZIlHDp0iPvuu4/BgwcDsGvXLj766CNWrFjB0qVLO5SjM6e2d+Y6dVt1lfvnrw8XY6is6LRnt8Xf19n7c35/zg7+nd+fs4Pye1NXZ/dKczB/dLJuxqHKWUREergJEyYwYcIESkpKuOuuuxg/fjx9+/bl4Ycf5g9/+IO7+O6IzuhLAp2/xn7X2+9SAfSd/kP6jh3b5f1O/LlHAPh3fn/ODv6d35+zg/J7U2dkP1dfEhXOHjKessZZRETkQpOUlERZWRl2ux2TyYTdbqe8vJykpKQ270lOTmb48OF88MEHXHfddRw6dIif//znANTU1OB0Oqmrq+ORRx7prq/RZZoqq4kaMZzUW6d5O4qIiHiBCmcPtaxxdmqNs4iIXIDi4uLIyMggNzeXnJwccnNzycjIOG2a9v79+0lPTwdcu11s3bqVSZMmkZyczNatW93XPf300zQ0NFwwXbWbqqqIHDrE2zFERMRLVDh7qGVKll0jziIicoFasGABc+bMYenSpURGRrJo0SIAZs2axT333MPw4cNZvXo1W7ZswWw243Q6mTlzJmPHjvVy8q7ldDppqqwk8JQdQUREpGdR4eyhb5qDqXAWEZELU3p6OmvWrDnt+LJly9w/z50716Nn3X333Z2Wy9ua6+pwNjcToMJZRKTH6vbtqPxVS3Mw1c0iIiI9i63K1VFbI84iIj2XCmcPqTmYiIhIz9RUebJwjlXhLCLSU6lw9lBLczAVziIiIj2HrbaWQy//E1DhLCLSk6lw9lBLczCtcRYREek5jn/0MbVf7yJ1xnSCz7I1l4iIXNhUOHtIzcFERER6nsbDhzEGB9Pnhz9wv0QXEZGeR121PdRSOKtuFhERufBZj1fw5UO/wdncTEhKiopmEZEeToWzh1q6amuNs4iIyIWv6rPPsJaXAxA1ItPLaURExNs0VdtD6qotIiLSczhtNvfPIX36eDGJiIj4AhXOHjKqOZiIiEiPYT1e4f45MCbai0lERMQXqHD2kEHbUYmIiPQYTZWVAESNGE7smNFeTiMiIt6mNc4eMqmrtoiISI/RVFFJRMYQMh9Z4O0oIiLiAzTi7CF11RYREek5rBUVBMbGejuGiIj4CBXOHjKoq7aIiEiPYG9spKmikqA4Fc4iIuKiqdoeamkOZlfhLCIickFyOp0Ur15D8arVAATGx3k5kYiI+AqNOHvom6naKpxFREQuRHX79lO8ajXGwEAAAmM04iwiIi4acfaQtqMSERG5sFVs+RiD2UzWsr9Q/fnnxF46xtuRRETER6hw9lDLiLPWOIuIiFx4nE4nx7d8TPTIEQRGR5Fw1ZXejiQiIj5EU7U95G4OprpZRETkgtNUUYm1/BgxWaO8HUVERHyQCmcPacRZRETkwtV45AgAIX37eDmJiIj4IhXOHtIaZxER8XXvv/9+m+f+8pe/dGMS/9NYUgJASEqyl5OIiIgvUuHsoZbC2akRZxER8VG/+tWvyMvLO+34n//8Z1544QUvJPIfjUdKMAYHExirTtoiInI6Fc4eck/V1oiziIj4qHnz5nHnnXeya9cu97GlS5eyfPly/vrXv3oxme+zlJQQkpyEoaWpiYiIyCnUVdtD3xTOXg4iIiLShpycHKqrq7n99tt56aWX2LhxIy+++CLPP/88I0aMOOf9hYWFzJkzh+rqaqKjo1m0aBH9+/dvdc3atWt58cUXMRqNOBwObrnlFn7yk58A8Mwzz7Bp0yaMRiMBAQHMnj2bcePGdcVX7XSNR0oIv+gib8cQEREfpcLZQ+6u2qqcRUTEh/3Hf/wHVVVV/OAHP8BgMLB8+XIyMzM9unf+/PnMmDGDnJwcNmzYwLx581ixYkWrayZPnsxNN92EwWCgrq6OqVOncskllzBkyBBGjBjBz372M0JCQti1axczZ87ko48+Ijg4uCu+aqcpXP43LEfLSJx0rbejiIiIj1Lh7CF3czAVziIi4kOWL19+2rGoqChCQ0PJyspi27ZtbNu2DYD//M//bPM5FRUVFBQUuJ+XnZ3NI488QmVlJbGnrPsNDw93/2yxWLDZbO7pzaeOLg8ePBin00l1dTW9e/c+vy/ZhexWKyUbNhJ3xeUkT53i7TgiIuKjVDh7yHGsDKPTgVNrnEVExIesXLnyjMeNRiM7duxgx44dABgMhrMWzqWlpSQmJmIymQAwmUwkJCRQWlraqnAGePfdd1myZAmHDh3ivvvuY/Dgwac9b/369aSmpvp00QxgKT0KTidxl1+OMTDQ23FERMRHqXD2gMNm48iC3zA8OguHM8vbcURERNzee++9bv/MCRMmMGHCBEpKSrjrrrsYP348aWlp7vOffvopTz75ZIc6eefn53dazjN1GP82e8HXABTVnOCQB9d3J0/y+zJ/zu/P2cG/8/tzdlB+b+rq7CqcPWAwm3E6HEQ112uqtoiIXJCSkpIoKyvDbrdjMpmw2+2Ul5eTlJTU5j3JyckMHz6cDz74wF0479ixg/vvv5+lS5e2KqY9lZmZSVBQUIe/R4u8vDyyss79srt4fyGHgFETJ2DqhM/tLJ7m91X+nN+fs4N/5/fn7KD83tQZ2a1W61lf3mo7Kg8YDAZM4eGE2C3qqi0iIj6rqamJ559/nunTp/O9732PO+64g61bt3p0b1xcHBkZGeTm5gKQm5tLRkbGadO09+/f7/65srKSrVu3MmjQIAB27tzJ7Nmzeeqppxg2bFgnfauu1Xj4CEEJvXyqaBYREd+jEWcPBURGElpppa7B5u0oIiIipzl48CA/+9nPGD16NPfeey8JCQnk5+fz0EMP8Zvf/IZrrrnmnM9YsGABc+bMYenSpURGRrJo0SIAZs2axT333MPw4cNZvXo1W7ZswWw243Q6mTlzJmPHjgVg4cKFWCwW5s2b537m4sWLz7gG2lc0FBcTkpzs7RgiIuLjVDh7KDAqkrDjxzhW1eDtKCIiIq1YrVZmzZrFrFmzmD59uvt4eno6qamp/PrXv+aaa65h0aJF3H333YSGhp7xOenp6axZs+a048uWLXP/PHfu3DZzrF279jy+Rfc7vHYd9QcKSf3Rrd6OIiIiPk6Fs4cCIiMJdx5hT1Wjt6OIiIi0smrVKvr27cv06dOZNWsWVqu11fnCwkKqq6upqKhg2bJl3HvvvV5K6luOvrmZqBHD6XPzjd6OIiIiPk5rnD0UEBlBsN1CuUacRUTEx7z99tvcfPPNAFx11VUcOHCAyy+/nAkTJlBRUcFPf/pTQkND+elPf8q6deu8nNZ3NNc3ENq3L4aTW3CJiIi0RSPOHjJHRhJks1JWUY/T6cRgMHg7koiICOBa35yeng7AG2+8wcKFC5kwYQIA1157LTfffDP33XcfGRkZHDt2jMrKytOafvU0TqcTe2MjprAzT1sXERE5lUacPRQQGYEBJ87GBuoa1SBMRER8S8v07MLCwlZbSPXq1Yuamhqqq6sdnAz/AAAgAElEQVTdL33tdrtXMvoSe6MFHA5MISHejiIiIn7gvAtnm82zIvLw4cPk5OS4/7nmmmu45JJLANcf+WnTpjF58mSmTZtGUVGR+76znetO5ohIAELsVsorNV1bRER8x4ABA9zbRI0cOZKnnnqKY8eOUVdXx5IlS+jduzfx8fEUFhYSFBREfHy8lxN7n73R9bfcrBFnERHxQLsK5xUrVrB582b373PnzmXkyJFMnjyZAwcOnPXePn36sGHDBvc/EyZMIDs7G4D58+czY8YMNm/ezIwZM1ptY3G2c90pIDICgFCtcxYRER8zYcIEVq9eDbi2lLJarYwfP54xY8bw8ccf8/TTTwOwfv16rr76ai03Auz1rr/lptAwLycRERF/0K7CeeXKle41Udu2beONN97gscceIyMjw73XoyeamprYuHEjN998MxUVFRQUFLiL6OzsbAoKCqisrDzrue4WEHlyxNlhpVZ7OYuIiA+ZPn065eXlvPzyyyQkJLB8+XI+++wzPv30UzZs2MDQoUPZuXMnL730Enfeeae34/qE5gaNOIuIiOfa1RysrKyMPn36APDee+9x3XXXcf311zN48GBmzJjh8XPee+89EhMTGTZsGPn5+SQmJmI62dHSZDKRkJBAaWkpTqezzXPd3dTEfMqIc4NFhbOIiPiO4OBgnnnmGWbNmkVJSQm33347kSdf+DY3N7Nu3Toef/xxFixY4G4i1tPZTxbOWuMsIiKeaFfhHB4eTkVFBUlJSXz88cfcdtttroeYzTQ1NXn8nLVr17q3zegO+fn55/0M58nvF2K3su/AIfLCT5z3M7tbXl6etyOcF3/O78/ZQfm9yZ+zg3/n97fsGRkZvPLKKyxZsoQJEyaQnJxMUFAQhYWFZGRk8NxzzzFixAhvx/QZdo04i4hIO7SrcL7iiit4+OGHGTp0KIcOHWL8+PEA7N271z0SfS5lZWVs27aNxYsXA5CUlERZWRl2ux2TyYTdbqe8vJykpCScTmeb59ojMzOToKCgdt3zbU6nk4/NZiKwERrbi6ys4ef1vO6Wl5dHVlaWt2N0mD/n9+fsoPze5M/Zwb/zd1Z2q9XaKS9vPdW7d28WL15MY2MjRUVF2Gw2+vbtS0xMTLdl8BctU7W1xllERDzRrjXO8+fPZ9SoUVRWVvLkk08SHR0NQEFBAVOmTPHoGevWrePKK690/xGPi4sjIyOD3NxcAHJzc8nIyCA2Nvas57qbwWCA0BAisNLQ2Nztny8iIuKpkJAQMjIyGDFihIrmNnzTHExTtUVE5NzaPVX74YcfPu34Pffc4/Ez1q1bx69//etWxxYsWMCcOXNYunQpkZGRrRqNne1cdzOEhhJmbaLMqjXOIiLiO6qqqnj11VfdS6h+/vOfY7FY3OdNJhOPP/64V148+6rmhgYwGDAFB3s7ioiI+IF2Fc779u3DaDSSlpYGwJYtW1i3bh0DBw7k9ttvdzfxOptTt7NqkZ6ezpo1a854/dnOdTdDSAghjRpxFhER3/LPf/6ToqIi9+/btm3j2muvJSLC1djy008/5W9/+xuzZ8/2UkLfY29owBQagsHYrsl3IiLSQ7Xrr8XcuXP5+uuvASgtLeXOO+/kxIkT/OMf/+CJJ57okoA+JTSU4GYLDRpxFhERH/LWW2+Rk5PT6tjdd9/Nww8/zMMPP8wvf/lLPvjgA++E81H2hgZMIWoMJiIinmlX4XzgwAGGDh0KuEaOR4wYwbJly1i8eDGvv/56lwT0JYbQEAKbGqnXiLOIiPiQw4cP069fP/fvgwcPJjAw0P37oEGDOHjwoDei+azmhkZ11BYREY+1q3C22+0EBAQA8Mknn3DllVcCkJqayvHjxzs/nY8xhIYSYLNgsVi9HUVERMTNarVSU1Pj/v3ll18mMTHR/Xt9fb03Yvk011RtFc4iIuKZdhXOgwYNYtWqVWzfvp1PPvmEcePGAa4tpnpE186TnTft+g8QERHxIX379uWrr75q8/yXX37p8baRPUVzfQNmddQWEREPtatw/tWvfsWaNWv48Y9/zJQpUxg8eDAA7733HiNGjOiSgL7EcPLNtMnSQLPd4eU0IiIiLtdeey1PPfXUGWd/lZWV8ac//Ylrr73WC8l8j72xkeb6emwnThAQFeXtOCIi4ifa1VV7zJgxfPLJJ9TV1RF1yh+badOmERLSA97anvyOoXYrjdZmIkIDz3GDiIhI17vtttt46623mDRpEjk5OfTv3x9w9SZ57bXXSE5O5vbbb/duSB+xb+mz2KqrsVVXExAd7e04IiLiJ9pVOINrL8jg4GD27NmDwWAgNTW1x0z/ahlxDrVbqG+0qXAWERGfEBYWxksvvcTjjz/O66+/7l7vHBkZyQ033MB///d/ExYW5uWUvsFy9CgNBw/hbG5W4SwiIh5rV+Hc3NzM448/zj/+8Q9sNhtOp5PAwEBmzpzJ7Nmz3Y3DLlSG4GAAghxNNFrVWVtERHxHZGQkCxcuZMGCBVRWVgIQGxuLwWDwcjLf0lxXh8PqavIZqMJZREQ81K7C+dFHH+X1119n4cKFZGVlAbB9+3aWLFmC0+nkwQcf7JKQPiM4CIAgh436Ru3lLCIivqGuro533nmHiRMnEh4eTlxcnPtcbW0t7777LpMmTSJUXaRprq1z/xwQo8JZREQ8067mYLm5ufzud7/jxhtvJDU1ldTUVG666SZ++9vfsnHjxq7K6DtO7okZZG+ipr7Jy2FERERcXn75ZTZt2kR4ePhp5yIiInjjjTdYtWqVF5L5FqfDQfMpO2MERqs5mIiIeKZdhXNtbS19+/Y97Xjfvn1b7R95oTIYjRiDgwl02Cg5ri2pRETEN2zatIkf/ehHbZ7/0Y9+xOuvv37O5xQWFjJt2jQmT57MtGnTKCoqOu2atWvXMnXqVHJycpg6dSorVqxwn7Pb7SxcuJCJEydy7bXXsmbNmg59n65ib2gExze7YgRE94CtNEVEpFO0q3AeMmQIK1euPO34ihUrGDJkSKeF8mXmsFAizXYOl9d6O4qIiAgABw8eZODAgW2ev+iiizh06NA5nzN//nxmzJjB5s2bmTFjBvPmzTvtmsmTJ/Paa6+xYcMGVq1axfLly9m1axcAGzdu5NChQ7z11lusXr2ap59+msOHD3f8i3UyW+03f7sNJhPmcDVMExERz7RrjfP999/Pz3/+cz7++GMuvvhiAD7//HPKy8tZtmxZlwT0NaaQUKJsTr4urzv3xSIiIt3A6XRSUVFBcnLyGc9XVFTgOGWkta1rCgoKWL58OQDZ2dk88sgjVFZWEhsb677u1OngFosFm83mbkC2adMmbrnlFoxGI7GxsUycOJE333zTZ7bCaq47ZX1zdBQGY7vGD0REpAdr11+MMWPG8Oabb3LdddfR0NBAQ0MD1113Hc8///wZR6IvROawUMKNdg6X1+F0Or0dR0REhEGDBrFly5Y2z3/44YdnHZEGKC0tJTExEZPJBLi2n0xISKC0tPS0a999912mTJnC1Vdfze23387gwYPdzzi1eE9KSuLo0aMd+UpdovmUEWdtRSUiIu3R7n2cExMTmT17dqtju3bt4q233uq0UL7MFBJCyIlK6httVNdZiYkI9nYkERHp4W6++WZ+97vfcdFFFzFx4sRW59555x2ee+45fv3rX3fa502YMIEJEyZQUlLCXXfdxfjx40lLS+uUZ+fn53fKcwDy8vJa/W7P/woA06iLscbHn3be1/h6vnPx5/z+nB38O78/Zwfl96auzt7uwrmnM4WFEmB3vT0/XF6nwllERLzulltuYevWrfziF79gwIAB7iJ2//79HDx4kO9973vccsstZ31GUlISZWVl2O12TCYTdrud8vJykpKS2rwnOTmZ4cOH88EHH5CWlkZSUhIlJSWMGDECOH0E2hOZmZkEBQW1654zycvLc2+d2aL0aDkHgFH33uPzHbXPlN+f+HN+f84O/p3fn7OD8ntTZ2S3Wq1nfXmrxT3tZA4Nw9hkBaBUnbVFRMRHPPbYYyxZsoQBAwZQVFREYWEhaWlpPP744yxZsuSc98fFxZGRkUFubi7g2oIyIyOj1fpmcBXjLSorK9m6dSuDBg0C4LrrrmPNmjU4HA4qKyt55513mDx5cid+y/PTssZZTcFERKS9NOLcTqbQEJyWRkxGA0crVDiLiIjvuP7667n++us7fP+CBQuYM2cOS5cuJTIykkWLFgEwa9Ys7rnnHoYPH87q1avZsmULZrMZp9PJzJkzGTt2LAA5OTl88cUXTJo0CYC77rrrjNtYeouttg5TaChGs/7zR0RE2sejvxx33HHHWc/X1/ecAtIUGorDaiUxJlgjziIi4lPq6ur4+OOPKS4uxmAwkJqaymWXXdaqE/bZpKenn3Hv5VN3zpg7d26b95tMJhYuXNj+4N2kua5Oo80iItIhHhXOMTEx5zzfp0+fTgnk68yhoQD0iTRrxFlERHzGpk2bWLBgATU1Na2OR0ZGsnDhQr73ve95KZnvsDfUYw5T4SwiIu3nUeH8hz/8oatz+A3TycI5KdzIV3vrcTqd7v0rRUREvGH37t088MADTJ48mdtuu42LLroIp9PJ3r17eeGFF7j//vtJS0tzbxvVU9kbLRiD1dRTRETaT83B2skUGgJAYriReksztQ02LycSEZGebuXKlYwbN47HH3+coUOHEhgYSFBQEJmZmSxZsoRx48axcuVKb8f0OrvFgkmFs4iIdIAK53ZqmaodH+QaZdZ0bRER8bbt27dz6623tnn+1ltvZfv27d2YyDc5VDiLiEgHqXBuJ3NEBAAR9gYAKk40ejOOiIgIZWVlpKent3k+LS2NsrKybkzkm+yNjZhCVDiLiEj7qXBup9B+qZhCQzEU7gXgeLXFy4lERKSna2xsJPgsI6nBwcFYLPp7ZbdYMIWEeDuGiIj4IW1k2E5Gs5nokcOp/XIn5rhUjTiLiIhP2L17N1FRUWc8V1VV1c1pfJOag4mISEepcO6A6FHfoeKTraQlN1JxQm/wRUTE+2677TacTmeb53v6DhAOmw1nc7PWOIuISIeocO6AiEGDAOhnqKNUI84iIuJl7777rrcj+DyH1QqgNc4iItIhKpw7ILh3IgDxjjrytcZZRES8LCwszNsRfJ690fX3WiPOIiLSESqcO8AUHExATAzRTbUcb27E6XT2+ClwIiLiPZdddtk5/w4ZDAYKCgq6KZHvsTe6ZogZg9UcTERE2k+FcweFJPUmtKYaW7CDmvomosKDvB1JRER6qBUrVrR57sMPP2TFihWYTKZuTOR77Ce7imuqtoiIdIQK5w4KTkoioDgPgqHihEWFs4iIeM0ll1xy2rGCggIWL17M9u3bmT59OnfeeacXkvkOFc4iInI+VDh3UHDvRKg9gblXM8dPNJKWcuYtQERERLpTcXExTzzxBG+++SbXXnstmzZtIjU11duxvO6bNc6aqi0iIu2nwrmDgpOSAIi21VJRrc7aIiLiXVVVVTzzzDO8/PLLjBo1ilWrVjFixAhvx/IZDouag4mISMepcO6gwNhoACIcFo5rL2cREfGiP//5zzz//POkpKSwdOlSxo8f7+1IPsduaWkOpsJZRETaT4VzBwVEuqZm9wq0c1wjziIi4kVPPvkkwcHB9O7dm5deeomXXnrpjNf95S9/6eZkvsM9VTtEU7VFRKT9VDh3UEBUJABxAXZKTqhwFhER7/n+97+vbRHPwd0cLCjQy0lERMQfqXDuIHN4OBiNxBhs7KzWVG0REfGeP/7xj96O4PPsjY0Yg4Iw9PBtuUREpGOM3g7grwxGIwER4YRjpeJEI06n09uRREREpA0Oi0WNwUREpMNUOJ8Hc2QkoXYrliY79Y02b8cRERGRNtgtVoxBQd6OISIifkqF83kIiIoiyOZa31xepXXOIiIivsrR1IRR65tFRKSDurVwtlqtzJ8/n0mTJjF16lQefvhhAN5//32+//3vk5OTww033MBbb73lvqewsJBp06YxefJkpk2bRlFRUXdGPquAyEjMlgYAyirrvZxGRERE2uJoasIYqBFnERHpmG5tDvboo48SFBTE5s2bMRgMHD9+HKfTyQMPPMA//vEPBg0axK5du7j11luZOHEiRqOR+fPnM2PGDHJyctiwYQPz5s1jxYoV3Rm7TQFRkVBfCxFwtKLB23FERETOS2FhIXPmzKG6upro6GgWLVpE//79W13zzDPPsGnTJoxGIwEBAcyePZtx48a57583bx41NTU0NTVx/fXXc/fdd3vhm5zO0dSkjtoiItJh3TbiXF9fz/r167n33nvdW2bEx8e7QhiN1NbWAlBbW0tCQgJGo5GKigoKCgrIzs4GIDs7m4KCAiorK7sr9lkFREZir68nPMhIWaUKZxER8W8tL6s3b97MjBkzmDdv3mnXjBgxgldeeYWNGzfy+9//ntmzZ2M5udXTo48+yuTJk9mwYQOvvPIKr776Kjt37uzur3FGDqsVY6AKZxER6ZhuG3EuLi4mOjqaP/3pT2zdupWwsDDuvfdeRo8ezRNPPMGdd95JaGgo9fX1PPfccwCUlpaSmJiI6eTWESaTiYSEBEpLS4mNje2u6G0KiIoEp5O+ESaOVmiqtoiI+K+Wl9XLly8HXC+rH3nkESorK1v9zW0ZXQYYPHgwTqeT6upqevfujcFgcL8It1gsGAwGn/h7Da4R54CoKG/HEBERP9VthbPdbqe4uJihQ4fy4IMP8sUXX3DHHXfw9ttv8+yzz7J06VKysrLIy8vjl7/8Ja+//nqnfXZ+fn6nPSsvL8/9s/3kyHdUczX7SpytzvkiX893Lv6c35+zg/J7kz9nB//O78/ZO6IjL6vXr19PamoqvXv3BmDu3LnccccdvPTSS9TU1PDAAw/Qp0+fbvsOZ2O3NmnEWUREOqzbCuekpCTMZrN72vXIkSOJiYmhsLCQ8vJysrKyAMjKyiIkJIT9+/eTkpJCWVkZdrsdk8mE3W6nvLycpKSkdn12ZmYmQZ2wBUVeXp47J0B9bByfv7KOgRFG8kodfOc7ozAaDef9OV3h29n9jT/n9+fsoPze5M/Zwb/zd1Z2q9XaqS9vfcmnn37Kk08+yQsvvOA+tnr1anJycrj99tspLy/nxz/+MZmZmYwcOdLj53bVy25LXR222lq/eiHiT1nPxJ/z+3N28O/8/pwdlN+bujp7txXOsbGxXHrppWzZsoWxY8dSWFhIRUUFvXv35ujRoxw4cIC0tDT2799PRUUFqampREdHk5GRQW5uLjk5OeTm5pKRkeEz076Ck10FfHxzLbbmEI5W1JPcK9zLqURERNovKSnJ45fVO3bs4P7772fp0qWkpaW5j69cuZJ33nkHgISEBC677DK2bdvWrsK5q152bwXik5NJ95OXOf784gn8O78/Zwf/zu/P2UH5vakzsp/rZXe3dtVeuHAhc+fOZdGiRZjNZhYvXkyvXr1YsGBBq6Zhv//974mOjgZgwYIFzJkzh6VLlxIZGcmiRYu6M/JZmYKCCOoVT6i1Gkjg66JKFc4iIuKX4uLiPHpZvXPnTmbPns1TTz3FsGHDWp3r06cPH374Id///vepq6sjLy+Pa665pju/RpscVqv2cRYRkQ7r1sK5b9++rFy58rTjN9xwAzfccMMZ70lPT2fNmjVdHa3DQlJSsFUeIzR4KF8XVTJhTKq3I4mIiHRIWy+rZ82axT333MPw4cNZuHAhFoulVcftxYsXM3jwYP7whz/w29/+lhdeeIHm5mauv/56rrzySm99HTen03lyH2cVziIi0jHdWjhfiIKTk6h9/18MuTqGXUW+sU2WiIhIR7T1snrZsmXun9euXdvm/ZmZmbz88stdku18OJubwelU4SwiIh3Wbfs4X6hCUlKwNzYyNCGAQ2W11DXavB1JRERETuGwNgGocBYRkQ5T4XyeQlKSAbgo2IrTCXsOVnk5kYiIiJzK0aTCWUREzo8K5/PUUjj3aq7FaICvNV1bRETEp9itVgBMag4mIiIdpML5PAXFx2MMDMR+rIz+SVF8XVTh7UgiIiJyCveIcydscyUiIj2TCufzZDAaCU5OovFICUP6x7D7YBW2Zru3Y4mIiMhJmqotIiLnS4VzJwhJSabxyBGyMhKxNNn5cr9GnUVERHyFo8k1VVuFs4iIdJQK504QkpKCpayc4f2jCQww8elXR70dSURERE5SV20RETlfKpw7QfhF6eBw0FS4n+8M6sXWr47idDq9HUtEREQ4dY2zCmcREekYFc6dIGrYMDAaObEzn0uH9eZ4dSOFJTXejiUiIiJoxFlERM6fCudOYA4PIzxtACd2fsnooYkYDLBV07VFRER8gtY4i4jI+VLh3EmiRo6gdvceAo6VMKRfLFu/KvV2JBEREeHUrtrajkpERDpGhXMnScmZSkB0NHse+18uGZrI/sMnOF7d6O1YIiIiPZ795FRtk9Y4i4hIB6lw7iQBUVGk3PR9Go+UkJUSDMCnBZquLSIi4m3ax1lERM6XCudOFDagPwBRtcdIig/TOmcREREf4LBaMZjNGEwmb0cRERE/pcK5E4X17wdAfVERlw7rzc69x2mw2LycSkREpGezN1owBml9s4iIdJwK505kDgsjKDGB+sIiLhnWm2a7gx17jnk7loiISI/WUFxMSHKyt2OIiIgfU+HcycIGDKD+wAGG9o8lIjSAf+eru7aIiIi3OJ1OGg4eJGxAP29HERERP6bCuZNFDh2CpfQotorjfHdEMlu+KKGqxuLtWCIiIj1SU0UlzbV1hPXv7+0oIiLix1Q4d7LY0aMBqNr+GTdddRF2u4MN/7ffy6lERER6pvqiIgBC+2vEWUREOk6FcycLSUkmODmJym3bSe4VzndHJLPp4yLqGtUkTEREpLs1FB0EvmngKSIi0hEqnLtA7OgsTuz8EntjIz+4ZiCN1mY2bSn0diwREZEep3bPXoKTkzCHhXk7ioiI+DEVzl0gZsxonM3NVO/8kvQ+0YwaksBrH+7H0tTs7WgiIiI9htPppHb3HiIGDfJ2FBER8XMqnLtAZMYQTKGhVG3LA+CHEwZxoq6Jt7ce8nIyERGRnsNaXo6tupqIISqcRUTk/Khw7gLGgABiRmdxfMvH2GprGZYWR2Z6HC+/vVtrnUVExGcVFhYybdo0Jk+ezLRp0yg62VjrVM888wxTpkxh6tSp3HTTTXz44Yetzq9cuZLrrruOqVOnkpOT003Jz6x29x4AIgarcBYRkfOjwrmL9Ln5RuyNjRxZtwGAWTnDqWto4pV393g5mYiIyJnNnz+fGTNmsHnzZmbMmMG8efNOu2bEiBG88sorbNy4kd///vfMnj0bi8W17eJbb73Fm2++6T7//PPPd/dXaMVytAyA0L59vZpDRET8nwrnLhLWvx+9xo+j5LVcGkuPkpYSxeUjknlr60GsNru344mIiLRSUVFBQUEB2dnZAGRnZ1NQUEBlZWWr68aNG0dISAgAgwcPxul0Ul1dDcALL7zAL37xC8LDwwGIj4/vxm9wOofVCkYjxoAAr+YQERH/p8K5C/X7j5kYTCaKXlwBwJTvDqC2wcYHecVeTiYiItJaaWkpiYmJmEwmAEwmEwkJCZSWlrZ5z/r160lNTaV3794A7N+/ny+++ILp06dz00038c9//rNbsrfFbm3CFBTk1QwiInJhMHs7wIUsKC6OlJypFK9eQ8OhYjLT+zC4XwzLN37FxYMSSIwN9XZEERGRDvn000958skneeGFF9zH7HY7paWlvPTSS1RVVXHrrbcyYMAAxowZ4/Fz8/PzOy1jeckR7EYDeXl5nfbM7uSvuVv4c35/zg7+nd+fs4Pye1NXZ1fh3MWSsq/nyPrXOPzqegb98m5+9aMs7n7sfVZsKuD+maO9HU9ERASApKQkysrKsNvtmEwm7HY75eXlJCUlnXbtjh07uP/++1m6dClpaWnu48nJyWRnZ2M0GomLi+O73/0uO3fubFfhnJmZSVAnjBLn5eURGxlFTVg4WVlZ5/287paXl+eXuVv4c35/zg7+nd+fs4Pye1NnZLdarWd9eaup2l0sIDKSxEkTOf5/H2IpL6d3XBhTrhjAR58f4cixOm/HExERASAuLo6MjAxyc3MByM3NJSMjg9jY2FbX7dy5k9mzZ/PUU08xbNiwVueys7PdXbYbGhrIy8tjyJAh3fMFzsBhtWIMDPTa54uIyIVDhXM3SMmZCkDxqtUA5FyZTkCAieUbv/JmLBERkVYWLFjA3//+dyZPnszf//53Fi5cCMCsWbP48ssvAVi4cCEWi4V58+aRk5NDTk4Ou3fvBuCnP/0ppaWlTJkyhVtuuYWpU6dyxRVXeO37OJqaMGqNs4iIdAJN1e4GQb16kXJjDodfeZWokSNJuGo8t147mBdfL2BrfimXZp4+DU5ERKS7paens2bNmtOOL1u2zP3z2rVr27w/ODiYRx99tEuydYTDasUUpBFnERE5fxpx7iapM6YTMWQwhX99AVtNLTlXppPaO4Jn13+Jxdrs7XgiIiIXHEdTk6Zqi4hIp1Dh3E0MJhPp//X/aK6v5+DKv2M2Gbnz5pEcq2rk5bd3ezueiIjIBcdutWLUiLOIiHQCFc7dKKx/P5JvyKbsrXeo3vklw9LimDgmlfX/2s/B0hpvxxMREbmgaI2ziIh0FhXO3azvtB8SnJxEwcLfUrXjc36aPZTQYDNL136B3e7wdjwREZELhrpqi4hIZ1Hh3M3MoSGMWPwHgnv3Zv/SZwkPgJ9mD6OgsJI7F7/HiTqrtyOKiIhcEBxNTZg04iwiIp1AhbMXBEREkH7HLKzl5ZRs2Mi1l6Ty3zNGUXK8nn/nH/V2PBERkQuCw6rmYCIi0jlUOHtJ1PBMYi8Zw5F1G2iureOqUX2Iiwrms91l3o4mIiLi95xOp9Y4i4hIp+nWwtlqtTJ//unf0DIAACAASURBVHwmTZrE1KlTefjhh896HKCwsJBp06YxefJkpk2bRlFRUXdG7lKpM2dgb2zk8NpXMRgMZA1J5PM9x2iy2b0dTURExL81u7Z61IiziIh0BnN3ftijjz5KUFAQmzdvxmAwcPz48bMeB5g/fz4zZswgJyeHDRs2MG/ePFasWNGdsbtMWL9UEq6+ktLX36D3dZO5ol8Qb21t5td/3sIN49MZOzIZg8Hg7ZgiIiL+x2YD0IiziIh0im4rnOvr61m/fj3/+te/3MVgfHx8m8cBKioqKCgoYPny5QBkZ2fzyCOPUFlZSWxsbHdF71KpM6ZTsfVTPrvjLgB+Nes+/rq9hsUrt7P53/EMHRBHXaON8d9JITE2lACTEaPRQGhwgJeTi4iI+DCbRpxFRKTzdFvhXFxcTHR0NH/605/YunUrYWFh3HvvvYSHh5/x+OjRoyktLSUxMRGTyQSAyWQiISGB0tLSC6ZwDurVi4yHHmT3409gq6qiX+UB/jbvR7z57yJWbvqaL/Yex2wysPHDAwSajZhMBoIDzfzk+qGYTQZ6x4dx6GgtFw/qRaO1mZRe4ZhNWrouIiI9m7PZNeKsrtoiItIZuq1wttvtFBcXM3ToUB588EG++OIL7rjjDp566qkzHn/77bc77bPz8/M77Vl5eXmd9qxTme7+L+wrX6Lk/z6kYlgGiUHwi+xeNFodGGxNlJfXU1Blwm53UlZt48nVO1rdHxRgwGpzkhgdQO+YAFLiAimtbCIpNpDwYCND+oR0Wfbu4s/5/Tk7KL83+XN28O/8/pxd0IiziIh0qm4rnJOSkjCbzWRnZwMwcuRIYmJiCA4OPuPxwsJCkpOTKSsrw263YzKZsNvtlJeXk5SU1K7PzszMJKgT3jjn5eWRlZV13s9pS0lpGYXLnifw1Q00FB0kZvAg+gzoT9WOLwg5eJDLb8gm7rJLMYVHcMQRjMFgYP/haswmI//YvIvMtDj2FldzoMzKF4UNBJqN7DjQAEBKXAAjB6dw8GgtlqZm0pKjuHx4EoNSYzCbjGz86AAD+0aTNSSxy77f+ejqf/ddyZ+zg/J7kz9nB//O31nZrVZrp768lXZwr3FW4SwiIuev2wrn2NhYLr30UrZs2cLYsWMpLCykoqKCfv36tXk8MjKSjIwMcnNzycnJITc3l4yMjAtmmva39Z40kdrde6j4+BNix4ymsaSEqs92gNNJzJjRHHl1PUdeXY8pJISIIYMJjImhX2MDwb1785df3EBgdDQOmw27wcT+faVEHizAcPEY8otO8NKb+byfV0y/3pFEhAby7/xS3v70EEajAZPx/7d37+FR1fe+x99rzX0mM0km18kVEiAEAwRJURGQiwq2IB57rG62dltRH7en2rp3W9i4D966twRtT73AsduqT23d9WhVtKigFrmIAblDCiZcQyAht8ltkrnPOn9EBiIwULkkE7+v5+Fh5jczaz5Za818n++sm0IwFMFm1vOz28sY5HKw56CbgpxE0pMtaBoYDbq+nj1CCCHEOdOkcRZCCHEBXdKzaj/22GMsWLCA8vJy9Ho9ixcvxuFwnHEc4NFHH2X+/PksXboUh8NBeXn5pYx8SalGI0X/+lMiD9wf3bWsc+8+gm1tOL9TRuvWbfibmmhavRZfQyMdu/egs1pp2biJxk/XYMly0bHnS0ypKT3jNYex5PyFDJuN+7KzyMrKQm/1oLMl0GV2s71djy+i0NgZIlI4nC83VvLrF/5Kp97WO5cC3x0/GA3YvKeB7LQErrk8hyE5iWyoPEZNfQf/65bRcsIyIYQQ/Uf0clRyjLMQQojzd0kb59zcXP7whz+c8zhAYWEhb7755sWO1q+cfDyWfeiQ6O3ky8cAkDn9egAioRCKqtJde4SDv3uZsNdH1uxZdNccpm3HTjKmX0fnl1WEvV5Cq1ZzuNebqKRHIgDkAY7uYsYdrgYFPENGYbfo8bV7CFkSOJw5nHc/O4CqUxk7PJ2a+g7+z5+29sq8rbqRonwnVrMed4ePYDBCMBzhqpEubpxYQFVNKwXZiditRlRVIRyOoKqKXG5LCCHExRE8fnIw2eIshBDi/F3SxllcWKq+Z/HZ8vMoeeLRXo+F/f7omUQ1TWPLZ59x+RVX4Dt2jGBnJ47hw2mv/BtoGl2Hajj0yu8xpjhxXjGOxk9WobPZcCYl4as5TPHuTYwtKiJpTCm+g2tIuWYCDbUemg8cQddUh2V4MTW1LRzZEWG/Ix9blgurWU8gFOG1D/fw2oove/KqCtaIj3HpKmuaDCiqSlqShaL8ZHyBENOvHMTQ3CT8wTB6ncrmPQ04HWbGDk+/pPNVCCHEAHB8i7OcVVsIIcQFII3zAHXy5TcURUGxWlGNRqx5edHxpNGjev4vHY3ZlYnF5cKal0vB3XeBqqIoCmG/n8ZPVnH0nWXUvf7/UPR63Bu/AMAImNJS8a94D5eq4opEuNKynYwh1+FvaoZIhJa6nT1bxssm0ObxkVi5AXVfhIyRk9FGlHLsSBNtG6rwmRJ4rPIYAKoWITnsoVsx4tWZKR2aRk5ykJdXrcJmNjB2eDrjLsvkSIOH7PQEvP4Qwwc50amy9VoIIUQPTc6qLYQQ4gKSxlkAkHLFuOhtRXfiRGA6kwnX924gY/p1+I41YLAn0Ll3H5bsbNAimF0uIoEAqtGIv6GBql/9hrr3lmNKTUVRVVLGjEbRqTSvW0UykD51Mt0tbeTvWA27VjPopAyRQUMIu93oO9tQtAgYDHjLruHlWh3bq0O40hLwBUK8+f5O/vjhHjhpN+8rBiVQSiMrulIZnOvkf0weQkeXn5REC06HmUP1HWQ4raQmWYCerfCym7gQQgxgPh8AOqu1j4MIIYQYCKRxFudE1eux5mQD4CzrfYmW41u3zZmZjH5q0Wlfn3vbD9AnJGBMSiLY0Unde3/BnJmJ3p6AOSOdxr9+invTZmwji7BkZ2POzKBt+w6a137Cjw0GIuEwaq2OhMEFdB7eRyg9G6MWItzYgKbTETgA5kiAqcm5fHKslN+uWYtPNXLAms2V7buxBz1UZF3J7GlFaBGNlRtrGJaXzKwJBRxp8mAy6Ph0Sy1TxuZy9egsTAYdmqbhD4Qxm+RjIoQQ8Ubz+lCNxl57YAkhhBDflHQE4pKw5uREbxscdvJvn9Pr8cFzf8TguT/qNZYxbSrpk6+hfVclxxoaSXcm076rkpQrxtFZvRdLlouE8eOI+AN0NbUQSM0k8+MP+MfWv0SnEczMxdBcC8CI7loi1RFqLJncYARtt5c9H4RJCHtZlTwSsxLhwy1mnrXnMShJT0BnpLmpg+9ZjpEQ8eOdNIMIKiajjhSHmT2HWkl2mLh+XD5mkx6LSY9Br17EuSiEEOKc+bzoExL6OoUQQogBQhpn0a8lj72c5LGX07JlCwVjx571+d6Z19K2cxeOEcW0VGygpWID9unXk1Q6ipaNXxDy+bFt2IhqNGLIzSOo6tF7u7jhyIboNALBDIz7GogoKhGDCX3AC0DtoQM0mpJB0zB6G7DY0mmLwJK3UzhoziAlyUrOsHy6vQGMJgOVB1qYc30R23e38duPPuHem0aSaDNitRhISjBhs8jlu4QQ4mLRvF70dmmchRBCXBjSOIsBxZKdhSU7C+g523jebT+IPpY6/ioAWrduw+h0YhuUD0CwvZ19S14gfcpkOvfu5ehb75A2+RoMDju+hkZybvk+TWvWoa78iNy2BgB0mVnkBJoJhfxEGqp73qAG2qqSSAh0sjXzciZG/LQ/8y5WkxN7RhHrn/yUyzoPsDmpGHM4QHtWIYl5Odiaamm2pdGpGMkwRrj8qmKcTjvdviArN9SQ73IwbkQG2WkJJFjP/SQ3mqYByLHcQohvJc3rQ2+393UMIYQQA4Q0zuJb5/j1sI8zJCZSvGAeAM4rx5E+dTKW7OxeDad96BAK7v4RNX94je4jRxn+i39F0fUcB92550t8DQ2EPF00fPwJ4W494+o2gariT8smp2UfZdU9l+TCkcRE9w40VYeyZw+hKj36SAgN0BQVVYvQvcrECscQEkMeRoS7aFWt7PW72aEz48nMJ0XzsU1LxWIxYu1oprZgLDnttbh8TQTGX4ffZONYSxdHDzdjs+q5a6QZh9OBJcuFv6GBhCQ7FlcmXREd6zYd5DL/UfKmTkQ1yBZwIQQcPHiQ+fPn09bWRlJSEuXl5QwaNKjXc5YsWcIHH3yAqqoYDAYeeughJk6c2Os5Gzdu5M477+Thhx/m9ttvv4R/wVe8XvQu16V/XyGEEAOSNM5CnERRlF7HY39d/h3/eMrzHSOKcYwoBiBr1vfwN7fw5aKnyLrxe6RNmsjmtWvJC0Ww5uViyc2h+3AttkH5HHjxJboPHWbw3Dtxb95CJBDAnJfP0dWfceWu7WC1YR8ymO4jR4jk5GNrbSe7Zgs+1cB1kb9FM4w5th2Fnq3LvoO7qDVnUBruZKK/AxWNlnXQ8rW/I4LCLudwPJqepNZdVLz1CYctGQyNtNCoWfAkpDB87HB8moLV30RTRMF/9Ageo53cyeOpWreFlrCBsokjMXe60aWkcbipi7ZOPyPzHTTu2c+xejfOur04yy5HUVWSSkdfkGUkhLi4HnnkEebMmcPs2bN59913WbhwIa+++mqv54waNYq77roLi8XCl19+ye23385nn32G2WwGwOPx8PTTTzNp0qS++BOAr3bVlmOchRBCXCDSOAtxgZlSUxj99Imziys2G+knHZ9tHzoEgCH333dirGhY9LZr2mSCHR3ozOZTrj8a6u5GMRjpPniQsM+HPiGBlvWfY0pLwzGimN3/93dYG46RPHwE1pwcfCGNzY0aRoMOm+Yn7HDS5u7AWLuP0Yd29EzTZCGvoYo8qvDqzaSH/D2N+J6V0fetPilD1e//mxSfGyuw8WUb9mAXh2xZtOmsqJpGZ3ctxnAAgGPAsfc/AKDx6plE8goxHDlARullbFm7A6MCV4/Nw93SSfboYnJGD2fnB2sIL/8zttxsUq8eT1JZGYrFQtOxVqzuehRFIdjRQdjnw5qXF52fJ/O2tmOy2/BU70ULBE55XNM0gm1tGJOTz7I0hfh2aWlpYffu3bzyyisAzJw5kyeeeAK3243T6Yw+7+Sty0VFRWiaRltbG5mZmQAsWrSIuXPnsnr16kuavxevD4Mc4yyEEOICkcZZiH7I4HCcdlz/1fVI7cOGRscSCgZHb5c9+dgprxl2ykiP5s/WU/OH/6Zo3r+i6vVEAkFshQVowSCN+w7TUHUQuwm27qujS5dId0IqQ7uPkLzyLbqSXaRPuIq6DTs4HNYzorWafJMZLaKxx5pNQslIXOYIG0KptB2qpbiliqHrlxP4XI9RCxFa9xeOb392b+/5/+gyqFF06LUwLQYHJncVrZu2ABBWVMKoGLXQKX/HPucQmhQrWVaFnK469HY7wcM1+PVmbMEuvCkZbK3YihIOY0lJxjR8BPXrN6J99leCyWkkDsrFYrcR7OpG58qm63Atlrxc0mbNJiMziUggQNuOnegTEuiuPYJ9TCnmBBuq2YyiKGjhME3r1uPZtw9rbg4p46/C8LXjKt2bNqO32bAVFtCxew+2/HyMzmS0cJjmzzegt1lJGj2q1zXUvy7Q1k64uwtLVs8x/HItcnEx1NfXk5GRge6rdVGn05Genk59fX2vxvlky5YtIy8vL9o0r1mzhs7OTmbMmPGNGufKyspvnP84LRiEUIiG9nZatmw57+n1lS1xnB3iO388Z4f4zh/P2UHy96WLnV0aZyG+pVInXE3qhKtPGVeMRjJHDCFzRM+W3NYtWxh70hZz3/enYkhMRGcyMebunl3XQ91edGYTiqrynUAIs7Hnq2UK0NkdoKWlk84Xl+Crryf3Jz/lyMef4khxYB85ivWVDThSEnHvrETXVE9qYT5deSVUtwawuY+S2XaEQKeHBF2ED7qT8YYgpyCTdh+4anZQ6t5NYSRMoFVPg8FBctsR2iwpOCPdHLYXkOU+RNvatQRVPdawH/XdZQDst2ah+RVSd1Vj0QIE0WHdshW3wUHqzm3UffgRPmsijq4WDJETDbtPNWCOBPGlZlHvyCY92Iatdi9hRUWnRdi/9LdEzFbQ6wlqKprZgrmlnojeACYzalcnOpsN1WQiENZQ2lsBUAcVcNSeQ15XHWZnEmpqBp07d/DFq69jHTKE7p3bCbW0kHztdbTqE1A3rkFzJKGoOhKsBmwFg7Hl56FFIvjqj6F32HGMGIF74xd0VvXsM2AbPAhzRgb+lhZMqal0Hz5M7q23oBqNVC3+FXp7AhnXTuPosvfQmU0klZZizsyg8dM1pIy/El9dPRnXX0uwvR1vXT22/HwCbjeRUBDVaCLs9aJPsBHydFG37F2CQLik5KzX0Y2EQniP1mHNzUFRz35Jt0gggGIwXPAfDuTHiL/fF198wTPPPMPLL78MQEdHB7/61a+iW6y/iZKSEkznee1lf3MLm4H84uFknsMVGfqjLV/77o038Zw/nrNDfOeP5+wg+fvShcju9/tj/ngrjbMQ4u9iTk8/ZUxvtZx43Nj7a8VuNWK3pqA99r/RwmFUvZ7MkqLo4/9zTEnPje+Wnebdeo9d4w3S7vGTnXZ898ubCHm60CJhsNpwd/ip2F7L6CHpDMlNIqLB62+vYUjRMEIR6GztQN3/JcnBDgaXTWJYQTr/vWIPB462Mzw3ES0UZMTwbLwH96FuXEukpZX6/FFsCiSTalVxZSSSV1XBfkMy1pZ68lq2oGoRPkn7Dt7Sq9E11mGr3Ys91IVKBLMKtu5OmhzDKOw+SjCgsi5zEiM7D6CF9BiCPnanXwWKwjW1W3GFD3DYlIL1cD2O0GaaTKkE1BC5hz5GQ+GgLYuClSvRodFssGNtOYRPZ8BtteP42x6UcE+DrykKyldnVdcUla7kDAwGPcbK91EikV7ztPHTNegddgLNbjRFoXndehSrjbBOT0vFxujzmlavAeDAH19HDZ26+/vXKXo9kVCIjffcj16n4igeTvehQ4T9AYzJyQQ9Hpxll2NKTaVjz5e4N2zElJ5G9s030V75N0IdndEzIqdNmkDY56Np9VqCbe101dSQPnUyepsNc0Y6XQdrSLq8FIvLhWf/fhpXrUZnNpE8diyW3Bw8+/bj2bcPc2Ym3iNH0FkspIwfT0vFBhJLRpAwZAi++nr2Lf0tSaWjsLhcaIPzz/o3DkQul4uGhgbC4TA6nY5wOExjYyOu05xka9u2bfz85z9n6dKlFBQUAFBdXU1TUxO33HILAK2trXz66ae0tbXx4x//+JL9HSFPJ4Ac4yyEEOKCkcZZCHFJKIqCoj+/r5wEi4GEr13/Wp9gi97OcFq5aeqJplynwPDBdsaOzPpqJAsmD+/1+ofmnObXybJcuGVK9O6MTh8JFiMGvQr8AwDdviBmHfg93VxusWI1G9A0DX8gjD8Yxh8Ik5ZsweMN0tbpJ8WmY8d+NxPafHi6g3R0BRhTlI7LH6K2oRNd2vcZnG7CXesFFYJKmEBTAwUFBXTXHUPzeTGZU2gmTGGqkYrdbWTYdSQn23lx+R60cJg0rRtXegI7myIUWENkttVSqXdhSEmhpd1Lsqmd9FA7RUo7qX43y62juNK9E3NngI2ZU2gyJpHja+KoOQ2PzkJKcjsZfjfHTCkM7aqlzWBnWNdhmqzp1OscJAc78OrMGCNBjJEgAdWAXguTnp2GlpbJl3tqucK9C31YIW/953gcabgtqZgaO+kOwKC/fID61Ynt6gaPIbG5Fv8LLxJQ9ISMZsyE0esUWtZ/DkDA5oA0F82OHPhk1Ynlpao0fPxJ9G4kLRM1HKJ1y7YTY0lO1IqN6KxWIv4ATavXoikKTZ+ujj7HmJpKS8VGFLsD/Q//4cwr4gCWkpJCcXExy5cvZ/bs2Sxfvpzi4uJTdtPeuXMnDz30EM8++yyXXXZZdLysrIyKioro/fnz51NSUnLJz6od6vQA0jgLIYS4cKRxFkKIs0i2m08Zs5p7GnhLcmJ0TFEUzCY9ZtOJr9aeLe49J3m7arT1rO+VNejE7S1bOnqa/mjjf8Lok/r9q0pzMOh1OGw979Pa6SPRZkJVlejux75AiI6uACmJFnRqz+7IY451sGvfJLz+EDcnWSge5KSuqYuOLj+DshJpau1G0+BQfQcF2dOxmPTkZtgJhsKs31mHPxAmNcmC3Wrk8LEOrrk8hw8+P8Tm3Q10tgXIHjGYYdfMYvXWI9R72qlujZCSbMNoUBmclcinR9voqG8k0eumPjkfNetKXKqPzPwMth3s4PCxDnRahLRAK6mpDvb6zfiCGulDzKTX7oa8wXia26hTEnD5mjBFQgQVHQetPfPLYe8iOdhBQDVSb05F7wyh6nXogn6cgQ7cRgdDu2oxmY14/BHc6YNJGpVE1eE2HlTPvqwGqkcffZT58+ezdOlSHA4H5eXlANxzzz08+OCDjBw5ksceewyfz8fChQujr1u8eDFFRUVnmuwlFfL0NM5fP9+AEEII8U1J4yyEEHEuJdHS6/7Jjf7xY3bNRv0pu9HnZzrIz+x9IrrMlBNb8Ae5eh4bd1nmKe9548TCXvfLijMAuOOGYu64oefybFu2bGFsiYsrS77ZtXSb27y88ddqnA4zt147jFBYo6XdS2qSBU/3ZBw2I15/iK1VjaQmWkh3WujoCmAy6mhye2lo7eY7xRl4vEEA3l9/EF8gROnQNOpbuinMTqTmWAdHGj2Mzk5ke3UTB462c9/No3Ca3d8o80BQWFjIm2++ecr4iy++GL391ltvndO0Fi1adPYnXQTG1FSU9DRMGaceWiKEEEJ8E9I4CyGE6JdSkyzc//0T1/826JVoY59k7zl5lM1iYGJpdvQ5x39EyEo9sYtusqPnh4T7bh51ynuc/KPA7EknfgzYsuXb2zgPBPahQzDdd0/0SgRCCCHE+Tr76UuFEEIIIYQQQohvMWmchRBCCCGEEEKIGKRxFkIIIYQQQgghYpDGWQghhBBCCCGEiEEaZyGEEEIIIYQQIgZpnIUQQgghhBBCiBikcRZCCCGEEEIIIWKQxlkIIYQQQgghhIhB39cBLiZN0wAIBAIXbJp+v/+CTetSi+fsEN/54zk7SP6+FM/ZIb7zX4jsx+vP8Xokzkxq9qkkf9+J5+wQ3/njOTtI/r50vtnPVrMVbQBX887OTqqrq/s6hhBCiG+5YcOGYbfb+zpGvyY1WwghRH9wppo9oBvnSCRCV1cXBoMBRVH6Oo4QQohvGU3TCAaD2Gw2VFWOjopFarYQQoi+dLaaPaAbZyGEEEIIIYQQ4nzJz99CCCGEEEIIIUQM0jgLIYQQQgghhBAxSOMshBBCCCGEEELEII2zEEIIIYQQQggRgzTOQgghhBBCCCFEDNI4CyGEEEIIIYQQMUjjLIQQQgghhBBCxCCN8zk4ePAgt956K9OnT+fWW2/l0KFDfR0ppqlTpzJjxgxmz57N7NmzWbduHQDbt2/nxhtvZPr06dx11120tLT0cdIe5eXlTJ06laKiIqqrq6PjseZ7f1kmZ8p+pmUA/Wc5tLa2cs899zB9+nRmzZrFj3/8Y9xu91kzxkP+oqIiZs2aFZ3/VVVV0detWrWKGTNmcN111/HTn/4Ur9fbJ/kB7r//fm688UZuuukm5syZw549e4D4WPfPlD0e1v2TPf/8870+v/Gw7ouz6y+fk3MVT3U7nms2SN3ur/njoW7Hc82GgVG3+7xma+Ks7rjjDm3ZsmWapmnasmXLtDvuuKOPE8U2ZcoUraqqqtdYOBzWrr32Wm3Tpk2apmnakiVLtPnz5/dFvFNs2rRJq6urOyV3rPneX5bJmbKfbhloWv9aDq2trdqGDRui9xctWqT927/9W8yM8ZBf0zRt2LBhmsfjOeU1Ho9HGz9+vHbw4EFN0zRtwYIF2nPPPXdJ8p5OR0dH9PbHH3+s3XTTTZqmxce6f6bs8bDuH1dZWanNnTs3mjle1n1xdv3lc3Ku4qlux3PN1jSp2/0xv6bFR92O55qtafFft/tDzZYtzmfR0tLC7t27mTlzJgAzZ85k9+7d0V/I4kVlZSUmk4mysjIAbrvtNlasWNHHqXqUlZXhcrl6jcWa7/1pmZwueyz9aTkkJSVxxRVXRO+XlpZSV1cXM2M85I9l7dq1lJSUMGjQIKAn/4cffngxY8Zkt9ujtz0eD4qixM26f7rssfSndQcgEAjw+OOP8+ijj0bH4mXdF7H1p8/J+eiv61w812yQut0f88fSn+p2PNfsM+WPpT+tO/2lZuvPewoDXH19PRkZGeh0OgB0Oh3p6enU19fjdDr7ON2Z/exnP0PTNMaOHcu//Mu/UF9fT1ZWVvRxp9NJJBKhra2NpKSkPkx6erHmu6ZpcbFMvr4MHA5Hv10OkUiEP/3pT0ydOjVmxnjIf9wdd9xBOBxm0qRJPPDAAxiNxlPyZ2VlUV9f3xeRox5++GHWr1+Ppmn87ne/i6t1/+vZj4uHdf+ZZ57hxhtvJCcnJzoWj+u+OJXU7Usvnr63YomH767jpG73jXiu2afLf1x/X/f7S82WLc4D0GuvvcZ7773HW2+9haZpPP74430d6Vsn3pbBE088gdVq5fbbb+/rKN/I1/OvXr2at99+m9dee419+/axZMmSPk54Zv/xH//B6tWreeihh1i8eHFfx/m7nC57PKz727Zto7Kykjlz5vR1FCGA+PjcDHTxtgykbveNeK7ZEJ91uz/VbGmcz8LlctHQ0EA4HAYgHA7T2Nj4d+3mc6kdz2Y0GpkzZw5bt27F5XL12h3G7Xajqmq/+9X6uFjzPR6WyemWwfHx/rYcysvLqamp4Te/+Q2qqsbMGA/54cT8T0hI4JZbbjnj/K+rq+s3681NN93Exo0byczMjLt1/3j21tbWuFj3N23axP79+5k2bRpTp07l2LFjzJ07l5qamrhapncjbwAAByFJREFU98Xp9dfPSSzxXrfjvWaD1O1LaSDU7Xiu2RBfdbs/1WxpnM8iJSWF4uJili9fDsDy5cspLi7ud7sXHdfd3U1nZycAmqbxwQcfUFxcTElJCT6fj82bNwPw+uuvM2PGjL6MGlOs+d7fl8mZlgHQ75bDr3/9ayorK1myZAlGo/GsGeMhf3t7Oz6fD4BQKMTKlSuj83/ixIns2rUrelbL119/nRtuuKFPsnd1dfXa3WzVqlUkJibGxbp/puwmkyku1v17772Xzz77jFWrVrFq1SoyMzN56aWXuPvuu+Nm3Rdn1l8+J+dqINTtePjeikXq9qUTr3U7nmt2rPzxULf7U81WNE3TznsqA9z+/fuZP38+HR0dOBwOysvLKSgo6OtYp1VbW8sDDzxAOBwmEolQWFjIv//7v5Oens7WrVt55JFH8Pv9ZGdn89RTT5GamtrXkfnlL3/JRx99RHNzM8nJySQlJfH+++/HnO/9ZZmcLvsLL7xwxmUA9JvlsHfvXmbOnMmgQYMwm80A5OTksGTJkpgZ+3v+u+++m4ULF6IoCqFQiDFjxrBgwQJsNhsAn3zyCU899RSRSITi4mIWLVqE1Wq95Pmbm5u5//778Xq9qKpKYmIi8+bN47LLLuv36/6ZsjscjrhY979u6tSpvPDCCwwbNiwu1n1xdv3hc3Ku4q1ux3PNPlN+qdt9mz8e6nY81+xY+eOxbvdlzZbGWQghhBBCCCGEiEF21RZCCCGEEEIIIWKQxlkIIYQQQgghhIhBGmchhBBCCCGEECIGaZyFEEIIIYQQQogYpHEWQgghhBBCCCFikMZZCHHeioqKWLFiRV/HEEIIIcQ5kLotxN9P39cBhBDnZ/78+bzzzjunjI8ePZo33nijDxIJIYQQ4kykbgsRn6RxFmIAGD9+PIsXL+41ZjAY+iiNEEIIIWKRui1E/JFdtYUYAIxGI2lpab3+JSUlAT27Y/3xj3/k3nvvZfTo0UyZMoV333231+urqqq48847GTVqFOPGjWP+/Pl0dnb2es4777zDrFmzKCkpYfz48cybN6/X4+3t7Tz44IOUlpYybdq0U97j+eefZ8qUKZSUlHD11Vfzi1/84iLMCSGEEKL/k7otRPyRxlmIb4HnnnuOqVOnsmzZMn7wgx8wb948du3aBUB3dzdz587FarXy5ptv8vzzz7Nt2zYWLFgQff3rr7/OwoULufnmm3nvvff4r//6L4YOHdrrPZYsWRItvN/97nd5+OGHqaurA2DlypW8/PLLPPLII3z00Ue88MILjBo16tLNACGEECKOSN0Wov+RXbWFGADWrVvHmDFjeo3NmTOHn//85wBcd9113HbbbQD88z//Mxs3buT3v/89Tz/9NMuXL8fr9bJ48WISEhIAePzxx/nhD39ITU0N+fn5LF26lH/6p3/iRz/6UXT6JSUlvd5v9uzZzJ49G4Cf/OQnvPrqq2zatInZs2dTV1dHWloaV199NQaDgaysLEaOHHnR5ocQQgjRn0ndFiL+SOMsxABQVlbGE0880WvMbrdHb5eWlvZ6rLS0lDVr1gCwf/9+ioqKosUXYMyYMaiqyr59+0hISKChoYGrrroqZoaioqLobb1ej9PpxO12AzBjxgxeffVVpk2bxoQJE5g4cSLTpk3DaDR+sz9YCCGEiGNSt4WIP9I4CzEAWCwW8vPzL/h0FUU55+fq9b2/ThRFIRKJAOByuVixYgUVFRV8/vnnlJeXs2TJEt544w2sVusFzSyEEEL0d1K3hYg/coyzEN8CO3bsOOV+QUEBAIWFhVRXV+PxeKKPb9u2jUgkQmFhISkpKWRkZFBRUXFeGUwmE5MnT2bBggX8+c9/Zu/evWzduvW8pimEEEIMRFK3heh/ZIuzEANAIBCgqamp15hOp8PpdALw0UcfMXLkSMaNG8fKlSupqKiIXity1qxZPPvss8ybN48HH3yQjo4OFi5cyPXXXx/9Nfy+++7jySefJDU1lWuuuQafz0dFRQV33XXXOeV7++23CYfDjBo1CqvVyocffojBYLgov7YLIYQQ/Z3UbSHijzTOQgwAn3/+ORMmTOg1lpGRwdq1awF44IEHWLlyJb/85S9xOp08+eST0bNjWiwWXnrpJf7zP/+TW265BZPJxLRp03j44Yej05ozZw4Gg4FXXnmFp59+msTERCZNmnTO+RwOBy+++CLl5eWEQiEKCwt57rnnyM3NvQB/vRBCCBFfpG4LEX8UTdO0vg4hhLh4ioqKeOaZZ5gxY0ZfRxFCCCHEWUjdFqJ/kmOchRBCCCGEEEKIGKRxFkIIIYQQQgghYpBdtYUQQgghhBBCiBhki7MQQgghhBBCCBGDNM5CCCGEEEIIIUQM0jgLIYQQQgghhBAxSOMshBBCCCGEEELEII2zEEIIIYQQQggRgzTOQgghhBBCCCFEDP8fMfbssSszNXEAAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -1429,7 +1415,7 @@ "outputs": [ { "data": { - "image/png": "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2TLWrVvH2rVrmT9/PgsXLuSVV17B6XR2a2YREZHeTnVbJPzoHGeRfwPbtm076nZWVhYA2dnZFBUV4fF4Ou/fsmULwWCQ7OxsEhISSElJYd26daeUweFwcPHFFzN37lxee+019uzZw+bNm0/pNUVERM5GqtsivY+OOIucBbxeL9XV1V2WWSwW4uPjAVixYgXDhw/n3HPPZfny5axbt67zWpEzZ87kiSee4J577uGuu+6isbGRefPmcemll3Z+G/69732P3/72tyQmJnLRRRfR1tbGunXruPnmm08q3+uvv04gECA/Px+n08m7776LzWY7Ld+2i4iI9Haq2yLhR42zyFlg7dq1XHjhhV2WpaSksGrVKgDuvPNOli9fzoMPPkh8fDy//e1vO2fHjIyM5LnnnuM3v/kNV199NQ6HgylTpnDvvfd2vtasWbOw2Wy88MILPPLII8TExDBx4sSTzud2u3n22WeZP38+fr+f7OxsnnzySfr169cN715ERCS8qG6LhB+TYRhGT4cQkdMnJyeHxx9/nOnTp/d0FBERETkB1W2R3knnOIuIiIiIiIiEoMZZREREREREJAQN1RYREREREREJQUecRUREREREREJQ4ywiIiIiIiISghpnERERERERkRDUOIuIiIiIiIiEoMZZREREREREJAQ1ziIiIiIiIiIh/C+hU/MtP06D+wAAAABJRU5ErkJggg==\n", + "image/png": "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2TLWrVvH2rVrmT9/PgsXLuSVV17B6XR2a2YREZHeTnVbJPzoHGeRfwPbtm076nZWVhYA2dnZFBUV4fF4Ou/fsmULwWCQ7OxsEhISSElJYd26daeUweFwcPHFFzN37lxee+019uzZw+bNm0/pNUVERM5GqtsivY+OOIucBbxeL9XV1V2WWSwW4uPjAVixYgXDhw/n3HPPZfny5axbt67zWpEzZ87kiSee4J577uGuu+6isbGRefPmcemll3Z+G/69732P3/72tyQmJnLRRRfR1tbGunXruPnmm08q3+uvv04gECA/Px+n08m7776LzWY7Ld+2i4iI9Haq2yLhR42zyFlg7dq1XHjhhV2WpaSksGrVKgDuvPNOli9fzoMPPkh8fDy//e1vO2fHjIyM5LnnnuM3v/kNV199NQ6HgylTpnDvvfd2vtasWbOw2Wy88MILPPLII8TExDBx4sSTzud2u3n22WeZP38+fr+f7OxsnnzySfr169cN715ERCS8qG6LhB+TYRhGT4cQkdMnJyeHxx9/nOnTp/d0FBERETkB1W2R3knnOIuIiIiIiIiEoMZZREREREREJAQN1RYREREREREJQUecRUREREREREJQ4ywiIiIiIiISghpnERERERERkRDUOIuIiIiIiIiEoMZZREREREREJAQ1ziIiIiIiIiIh/C+hU/MtP06D+wAAAABJRU5ErkJggg==", "text/plain": [ "
" ] @@ -1563,7 +1549,7 @@ "outputs": [ { "data": { - "image/png": "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n34agIqKCjIyMrBYWnp2LRYL6enpVFRUkJqaGm3002aytxTOtqAftzfQ6fcXERE55vrrr+e3v/0t5513HldccUWrtnfffZenn36aX//616e8TllZGQUFBdTV1ZGcnExRUREDBgxodc6KFSt4/vnnMZvNBINBbrjhBn72s58BsGjRIlavXo3ZbMZmszFr1izGjBkDQEFBAevXryclJQWACRMmcPvtt3fApz89gcZG9TiLiEhUoi6c2ysQCLB3716GDRvG7Nmz+fzzz7ntttt45513+OMf/8jixYsZNWoUJSUl/OpXv+rQBU22bNnSMReKaxmqHRfy8dnnW6guj61tLEpKSoyO0G7KboxYzg6xnV/ZjRFL2W+44QY2bNjAv//7v3PuuecycOBAAHbs2MHu3bu5+uqrueGGG055nUimRI0fP57rrrsOk8lEQ0MDEydO5OKLL2bo0KGMGDGCm2++GafTybZt25g6dSofffQRDocDgFtvvZWpU6d2/C+gnUKhEP6GRizqcRYRkSh0WuHscrmwWq3hYdcjR44kJSWFsrIyqqqqwvtCjxo1CqfTyY4dO+jTpw+VlZUEAgEsFgtsykb6AAAgAElEQVSBQICqqipcLldU987NzcXeAXs1bnpvLQBxQT/nnHse38tOP+1rdpaSkpLw7zjWKLsxYjk7xHZ+ZTdGR2T3eDwd97A2Ar/73e/48Y9/THFxMbt27SIUCjFw4EDuuusufvKTn5zy/cemRD333HNAy5SoBx54gJqamlYju/5+yyu3243P5wtPuzrWuwyQnZ1NKBSirq6OzMzMjvqYHSro8RAKBDRUW0REotJphXNqaiqXXHIJ69at49JLL6WsrIzq6moyMzM5cOAAO3fuZODAgezYsYPq6mr69+9PcnIyOTk5FBcXk5+fT3FxMTk5OYYM0wa+63EO+nB7NcdZRESM95Of/CSiIvlEopkS9d5777Fw4UL27NnD3XffTXZ29nHXW7lyJf37929VND/33HMsW7aMfv36cffddzNo0KB2Ze0o/oZGAA3VFhGRqERUON92220nbW9sbIzoZvPnz2fOnDkUFRVhtVpZsGABvXv3Zt68ea0WDXvooYdITk4GYN68eRQUFLB48WKSkpIoKiqK6F5nxNFe67ign2aP5jiLiIjxGhoaWL9+PXv37sVkMtG/f3++//3vt+ol7gjjxo1j3LhxlJeXc8cddzB27Njw8HCATz75hMcff5xnn302fGzWrFn07t0bs9nMypUrueWWW3j33XfDhXokOrIHv6SkhGBVFQB7KivZH0ND82NpGsE/UnbjxHJ+ZTeGsrctosL52KIeJ2vv27fvKa/Tr1+/E66+fe2113Lttdee8D2DBg1i+fLlkcQ840wWC1gs6nEWEZEuYfXq1cybN48jR460Op6UlMT8+fO5+uqrT/p+l8sV9ZSorKwshg8fzvvvvx8unDdv3sy9997L4sWLWxXTGRkZ4Z8nTZrEww8/zIEDB+jTp0/En7GjplsdG4p/pPQrvgQGDx9OyvcuOO3rdobuPgXCKLGcHWI7v7Ibo7tnP9V0q4gK54cffvi0QpxNLE4ncSEfbm1HJSIiBvr666+57777GD9+PNOmTeO8884jFAqxfft2nn32We69914GDhx4wiHVx6SlpUU0JWrHjh3hIdY1NTVs2LCBq666CoAvvviCWbNm8cQTT3D++ee3el9lZWW4eP7www8xm82timkjBNxuoOX7XEREJFKdNsf5bGF1Oolza6i2iIgY64UXXmDMmDE8+uijrY7n5uaycOFCbr/9dl544QUefPDBk16nrSlR06dP56677mL48OEsW7aMdevWYbVaCYVCTJ06lUsvvRRomYbldruZO3du+JoLFiwgOzub2bNnU11djclkIjExkaeeegqr1dh/egQ9HgAsHdCLLSIi3YcK5yhZnA4cbr+GaouIiKE2bdrEnDlz2mz/6U9/ykMPPXTK67Q1JWrJkiXhn092nxUrVrTZ9vzzz5/y/p0t4PECYI6LMziJiIjEErPRAWKNxenEgZ9mDdUWEREDVVZWnnSF6oEDB1JZWdmJiWJD0NvS42xWj7OIiERBhXOUzA4H9pAft4Zqi4iIgZqbm3E4HG22OxwO3Efn88p3jg3VNtvV4ywiIpHTUO0otSwOpqHaIiJivK+//pqePXuesK22traT08SGoIZqi4hIO6hwjpLF4cAW8GmotoiIGG7atGmEQqE2200mUyemiQ2BYz3OKpxFRCQKKpyjZHE6sWkfZxERMdh7771ndISYFPR6McfF6aGCiIhERYVzlCxOB1a/V9tRiYiIoRISEoyOEJOCHq8WBhMRkaipcI6SxenEHAzgcXuMjiIiIt3Y97///VP2mppMJkpLSzspUWwI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eX1fS+ubQvzfFdvBgnEjy+ls3sWF536JlesbCIXj/HXVLi4YN4T2UJS9TSHqqkqpP9DFiKFFLPn7drbuaWdQaS7jz6zgL//YQdL9qCSdeXoJG3e0UJDrwxjo7I5hWzCwNJfmjgjmwzPwHz+z/0k5jiGWMFjGUFFegN/nsKO+A4yhtjJIW8xmf2s3//2/RlPubznlzjgDbNu2jblz59LR0UFBQQHz58+nqqqKG264gZtvvpnRo0fzjW98g7179/Y2xAALFiygpqaGa665hubmZizLIi8vj9tvv52xY8cC0NTUxG233UZ9fT1+v5+f//znfPGLXzyqXMdrLI0xrPzGldhfnsCXb//fn3k/6aTXs/TI5uyQ3fmVPT1O9ew64ywiIkftcF/CV1mWR2XZ4f/+bWVZHv/99Y+W3b777l48js35Y3vOdF/yleH9Ptaks4fSFYmTF/BiWRaTzh6CMVBamIPP65AX8LJi3V5qh5dSUphDfVOIsqIAOX4POxs6WLZqFz6PzZgRZeT4HELhOB2hKLkBL16PQ1c4zobtzQwuy6W8OMjvlmzE67GZ/c2epu7/LP0PJQVeTh88kDWb9jNtzKlZEqurq3n++ecP2f7kk0/2Xn7hhRf6vf/vfve7fm8rKytLefsJYUzPqqqhg9ObQ0REstqp+VuCiIiknW1b5Ad9vddHDC0+5GcuGDek9/LQivzey8MHFXDj5aOP+BgXfvGj+08c0/fb6i+eMKzP9XfffffIoSXrWLbNWQ8+oOMrIiLH5IT9HWcRERERERGRbKTGWURERERERCQFNc4iIiIiIiIiKahxFhEREREREUlBjbOIiIiIiIhICmqcRURERERERFJQ4ywiIiIiIiKSghpnERERERERkRQ86Q7weTLGABCLxY7bPqPR6HHb14mm7Omh7OmTzfmVPT2ONfvBenOw/shnpxrel7KnRzZnh+zOr+zpcSpnP1INt8xJXN07OzvZvHlzumOIiMgpZuTIkeTn56c7RlZTDRcRkXTor4af1I2z67p0dXXh9XqxLCvdcURE5CRnjCEej5Obm4tt69NQx0I1XERETqQj1fCTunEWEREREREROVZ6O1xEREREREQkBTXOIiIiIiIiIimocRYRERERERFJQY2ziIiIiIiISApqnEVERERERERSUOMsIiIiIiIikoIaZxEREREREZEU1Dgf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RbKLlmqLZDGfz0dZWVmff0VFRUDPEqw//OEP3HjjjZx11llMmjSJP//5z33uv2nTJq655hrGjBnDOeecw9y5c+ns7OzzMy+99BIzZsygrq6OiRMnMmfOnD63t7e3c/PNNzN27FimTJlyyGM89thjTJo0ibq6Os4991xuv/32z2EkREREsotquEh2UeMschJ79NFHmTx5MosXL+ab3/wmc+bMYf369QB0d3dz3XXXEQwGef7553nsscdYu3Yt8+bN673/okWLuPPOO/n617/Oyy+/zK9//WtGjBjR5zEWLlzYW2wvvfRS7rjjDurr6wFYunQpTz/9NHfddRfLli3jiSeeYMyYMSduAERERLKUarhIZtFSbZEstmLFCsaNG9dn26xZs7jtttsAuOiii7jqqqsA+P73v8+qVav4/e9/z0MPPcSSJUsIh8MsWLCAvLw8AO6++26+/e1vs2vXLoYNG8bjjz/Od77zHb773e/27r+urq7P482cOZOZM2cC8MMf/pBnnnmG1atXM3PmTOrr6ykrK+Pcc8/F6/VSWVnJ6NGjP7fxEBERyRaq4SLZRY2zSBYbP34899xzT59t+fn5vZfHjh3b57axY8fyt7/9DYBt27ZRU1PTW3ABxo0bh23bbN26lby8PBobG/nKV76SMkNNTU3vZY/HQ0lJCS0tLQBMmzaNZ555hilTpnDeeedx/vnnM2XKFHw+32f7D4uIiJwkVMNFsosaZ5EsFggEGDZs2HHfr2VZR/2zHk/flxHLsnBdF4BBgwbx2muvsXLlSt566y3mz5/PwoULee655wgGg8c1s4iISDZRDRfJLvqMs8hJ7L333jvkelVVFQDV1dVs3ryZUCjUe/vatWtxXZfq6mpKS0upqKhg5cqVx5TB7/fz1a9+lXnz5vGnP/2JLVu2sGbNmmPap4iIyMlONVwks+iMs0gWi8ViNDU19dnmOA4lJSUALFu2jNGjR3POOeewdOlSVq5c2fv3IWfMmMEjjzzCnDlzuPnmm+no6ODOO+/k4osv7n0H/Hvf+x73338/AwYM4MILLyQSibBy5Uquvfbao8r34osvkkwmGTNmDMFgkFdffRWv1/u5vMMuIiKSTVTDRbKLGmeRLPbWW29x3nnn9dlWUVHBm2++CcDs2bNZunQp9957LyUlJdx///2934gZCAR46qmnuO+++7jiiivw+/1MmTKFO+64o3dfs2bNwuv18tvf/paHHnqIwsJCLrjggqPOV1BQwJNPPsn8+fNJJBJUV1fz6KOPMnTo0OPwvxcREclequEi2cUyxph0hxCR46+mpoaHH36YadOmpTuKiIiIfAqq4SKZR59xFhEREREREUlBjbOIiIiIiIhIClqqLSIiIiIiIpKCzjiLiIiIiIiIpKDGWURERERERCQFNc4iIiIiIiIiKahxFhEREREREUlBjbOIiIiIiIhICmqcRURERERERFL4/4kqWrF0k0gpAAAAAElFTkSuQmCC\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA84AAAFXCAYAAABz4xf6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3iT5dfA8W+SJt17lzILtEBLoWyU1YIM2UuGCAKCKAr4U0BkiIOhKCqiICjVVwRktUwZylRE2XuWVSile7dpk7x/hMaGDlqGFTif6+K6yDPP8yRtep773PetMBgMBoQQQgghhBBCCFEkZXkHIIQQQgghhBBC/JdJ4iyEEEIIIYQQQpRAEmchhBBCCCGEEKIEkjgLIYQQQgghhBAlkMRZCCGEEEIIIYQogSTOQgghhBBCCCFECSRxFkI8cvz9/e/6LzQ0FIB58+aZLQ8MDKRTp04sXrwYvV5f5PEPHjyIv78/zZo1Iy8vr9gY5s6da3q9f/9+/P39qV27NpcuXSq0fcuWLZk4caLpdXR0NP7+/qxcudK0bM2aNfj7+9OwYUNSUlLM9s/Ly8Pf35958+YVOvaFCxd4++23CQ0NJSgoiPr169O1a1dmzpzJlStXSriT5rKzs2nQoAH+/v6cOXOmyG0GDRqEv78/48ePL7Ru5cqV+Pv7Ex0dbVo2ceJE070PCAigQYMGdOrUiUmTJnH48OG7xhQeHo6/vz/Hjh0rdpsBAwYQGhpKwdkV161bh7+/P927dy9yn6Lu/53y39M//vjDtOzOz1P9+vV55pln+N///seePXtKvJbJkyfj7+/PjBkzCp3jbv/yPzuDBg2if//+hY4dGxvL9OnTCQ0NJTAwkGbNmjF69Ogi71v+NbRt25bc3FyzdVeuXMHf3581a9aUeC0F4967d2+h9dHR0QQEBBT7GS/qX8OGDQEIDQ0t1T0p6niBgYG0bduWTz/9lJycnCJjLvh+5tu1axcjR46kWbNm1KlTh+bNm/Pyyy+zbds2s+22b9/OwIEDadasGXXr1qVNmza88sor7N69u8T7dbfPW//+/Rk0aJDZsjt/xwD89ddfDBs2jKeffpqgoCBatmzJsGHDWLduHfDPz+fd/hX8GT127BivvfYazZs3JzAwkNDQUN59911iY2MLxXnn8evXr0+/fv349ddfAcjIyCA0NJT+/ftT1GynX375JXXq1OHEiRMl3i8hhPgvsijvAIQQoqxWrFhh9nr06NH4+/vz2muvmZZpNBqzbX766SdUKhUpKSmsWbOGjz/+GKVSydChQwsdPyIiAoDExER2795tSsJLQ6fT8cUXXxT6g7cs0tLSWLRoEW+++eZdt924cSMTJkygZs2ajBgxgqpVq5Kbm8uJEydYuXIlu3fvZvPmzaU677Zt20hPTweM96Bgon+n9evXM2LECKpXr37X47q4uPD1118DkJWVRVRUFOvXr6dfv36MHDmSN954o9h9u3Tpwscff0xkZCR169YttP7atWscOnSIV155BYVCYVqe/x6ePn2as2fPmhKtByX/85SVlUV0dDRbtmxh+PDhdO3aldmzZ6NUmj+Xzs7ONr0PGzZsYPz48VhYWFCnTh2zz3NcXByjR49m5MiRZp87FxeXYmM5c+YML774IjY2Nrz00kv4+fkRHx/P8uXL6devHzNmzCjyAcK1a9dYtWpVkYl4adna2hIZGcnTTz9ttjwiIgIbGxsyMjKK3O/zzz/Hy8vLbJlKpQKMyZVWqzUtnz59Ojqdjvfee6/YOPKPl5GRwbZt21i4cCEZGRlMmTLlrtcwc+ZMwsPDad++PVOmTMHd3Z34+Hh27NjBmDFjWLNmDQEBAfzwww98+OGH9OrVi2HDhmFtbc21a9fYuXMnf/75Jy1btrzrue7H9u3bGT16NKGhoUydOhVHR0du3LjB77//zq5du+jatSvTpk0z/QwDfPXVVxw/ftz085fPw8MDML5PkyZNokGDBrzzzjt4eHhw8eJFFi9ezJYtW1iyZAkBAQFm+/r7+5veixs3brBw4UJee+01li1bRnBwMB988AEvvvgiP/30EwMHDjTtd+HCBRYsWMDQoUMJDAx8WLdJCCEeGkmchRCPnHr16pm91mg0ODs7F1peUHBwMBYWxl95LVq04OzZs/z888+FEuecnBw2b95M48aNOX78OBEREWVKnJ9++mk2b97MyJEjC/3BWZZj/PjjjwwZMgQ3N7dit7t48SITJ04kNDSUuXPnmhKP/GMMGzaM1atXl/q8ERERODk5UblyZdavX8+bb75pumcF1apVi1u3bvH5558X2QJ+J7VabfbeNGvWjAEDBjBjxgwWLlxInTp1aN++fZH7urq60qJFCzZu3MjEiRNRq9Vm6yMjIzEYDGaJYWxsLPv27aNly5bs3r2biIgIJkyYUNrbUCoFP08Affr0ITw8nJkzZ1KrVq1Cn6vt27eTnp5Oq1at2LVrF3v27KFNmzbY2dmZ3Zv8lsCKFSuW+HnOl5uby+uvv469vT0rVqzA2dnZtK5Dhw6MGTOGKVOmULduXapVq2a279NPP83XX39Nz549sbS0vKf78Mwzz7BlyxYyMzOxsbExLV+3bh3t27cvtuW6Vq1aVK5cuch1tWvXNnttZ2dHXl5eifej4PGeeuoprly5wurVq3nnnXcKPcQoKDIykvDwcCZMmFDoPevYsSMvvPACDg4OAHz33Xe0bdvWrGKgWbNm9O3bt9jqlQdpyZIl1K5dm/nz55s9JOrRo4fp/Hc+yHJxcSn085fv4sWLTJkyhbZt2/LZZ5+Z7lOjRo1o3749ffv2ZcyYMWzYsMHs587W1tZ0vHr16hESEkLr1q1ZvXo1wcHBNG/enN69e/PJJ58QGhqKt7c3er2ed955h4oVK5o94BRCiEeJlGoLIZ44SqWSgIAAYmJiCq3bvn07aWlpDBgwgLZt2/Lbb78VKpsuycCBA3F3d+ezzz675/hGjRoFUKiV6E7ff/89BoOBqVOnmiXN+dRqNf369SvVOWNjY/njjz/o1KkTffr0IT4+vsgSXABra2tGjhzJ1q1b77nkUqFQ8NZbb+Hm5sb3339f4rY9evQgKSmpyHLYyMhIQkJCqFSpktkyvV7Pa6+9RkhICOvXr0en091TnGUxZMgQateuzQ8//FBo3dq1a3F0dGTWrFlYWVmxdu3aB3LObdu2ceXKFcaNG2eWNIPxcz558mT0en2R93js2LHcunWLpUuX3vP527VrB8DWrVtNyw4dOsTVq1fp2rXrPR/3ftWuXZusrCySkpJK3O6bb76hZs2aRVaeAAQGBuLj4wNASkpKsQ+ySkrOH5SUlBRcXFzMkub7Of8PP/yAXq9n8uTJhfZ3dnZm3LhxXL58uVC5+p28vLxwcXEx+306ceJE7OzsmDZtGgD/93//x7Fjx5gxY0ahaiAhhHhUSOIshHgiXb9+3SzZyrd27VocHBwICwuje/fu5ObmsnHjxlIf18rKilGjRrFjxw6OHDlyT7G5u7szcOBAVqxYwfXr14vd7s8//yQwMLDEVunSyk82u3fvTocOHbC0tDSVOxelf//++Pj43FdJukajoWnTphw7dqzYvuQAbdq0wcnJicjISLPl+Qlajx49zJavXbsWPz8/6tatS/fu3YmLiyv2IcCD1rJlS2JiYrhx44ZpWX4LeMeOHXFxcaFt27bs2LGjTA9kirNv3z5UKhWtW7cucr2npyd16tThzz//LLSuVq1adOjQgW+++casvLcsrK2tad++vamPLRgrF0JCQqhYsWKx++l0OvLy8sz+PchW2+vXr2Nvb4+Tk1Ox28TGxnLhwgXatGlTqmMGBQURERHB4sWLixzHoDT0en2h6y7ps3/n+X///Xfmzp3LmTNniuxDXBb5vz/yy7bv1Lp1a5RKZZGfnYLS09NJTk42+31qb2/P9OnT2bVrFwsWLOCzzz5j0KBB1K9f/75iFkKI8iSJsxDiiZD/B2tiYiILFy7k5MmTjBkzxmybW7du8ccff9CxY0c0Gg3NmzfH09OzxASyKH369KFixYr3lVS+9NJLWFlZ8eWXXxa7zc2bN02tYQXdmZSURkREBFWrViU4OBh7e3tTa3tqamqR22s0Gl555RX27t3LgQMHSndRRfDx8SE3N5fk5ORit9FoNHTq1IkdO3aYxRMREYGlpSUdO3Y0LTt27BhRUVF069YNMJbb3u0hwIPk7e0NGPsq51u3bh06nc5UTt69e3e0Wi2bNm267/PFxMTg4uKCtbV1sdtUqFCBmzdvFrluzJgxpKamEh4efs8xdOvWjX379hEbG4tWq+WXX34pdlC2fB07dqROnTpm//IrLe5F/mc+JSWFVatWsXXrVsaOHVtkJUa+/HtS1M9QUaZPn06lSpX4+OOP6dChA02aNOGNN94o00OZqVOnFrruOnXqcOjQobvu++abbxISEsKCBQvo1q0bDRs25JVXXrnnz1FMTAwVKlQodr2NjU2hluR8+b9brl27xqRJk3B0dGTIkCFm27Rp04YuXbowd+5c3NzcGDdu3D3FKYQQ/xXSx1kI8UQICgoye/3WW2/Rtm1bs2X5CU5+0qVUKunatSuLFi0iKiqqUB/R4qjVakaPHs2ECRP4448/aN68eZnjdXJy4sUXX2T+/Pm89NJLRbaOF6devXpmgytt3bq12P6kYEw2L168yNixY03LunfvzsaNG9m0aVOx5d49e/Zk8eLFfPrpp/z000+ljq+g/FazospPC+rRowc//fQTmzdv5rnnnjMlaGFhYdjb25u2W7t2rel9A0zVA7/++itpaWlm2z4MRV1PREQEVapUMbW2NW/eHA8PDyIiIu5rYK4HoWrVqnTv3p0lS5bw/PPP39MxmjZtiqenJ+vXr8fX15fs7Gw6duxYYov6/Pnz8fT0NFuW35f4XhR8eALGkdbv9XqKU7VqVSIiIjh06BB79+7l6NGjbNu2jY0bNzJmzBheeeWVux5j1KhRhIWFFVo+efLku+7r6urK0qVLOXbsGHv27OHYsWPs27ePX3/9lT/++IMPPvjgnq6rrA4dOkSdOnVMrzUaDUuWLCmywuDVV19l/fr1DBkypMSHO0II8SiQFmchxBPh559/ZuXKlcyfP586derwySefsH//frNtIiIi8PHxoUaNGqSmppKammr6I/fOMuG76dq1KzVq1Livvs5DhgzB0dGRL774osj1Xl5eZiXB+ZYvX86qVasYPXp0qc6T3xrbpk0b03UHBQXh4uJSYkutSqVizJgxHDx4kF27dpXqXHeKiYlBrVbj6OhY4nb5g1vlx5Pf97xgy2Z+K269evWwtbU1XUu7du1Mg749bPmtmO7u7gAcP36cCxcu0K5dO1M8GRkZPPPMMxw5cuSeS37zeXl5kZiYSFZWVrHbXL9+vdAI1gWNHj0arVbLokWL7ikGhUJB165diYyMNA2md7cHFDVq1CAoKMjsX0kPd+5m/vz5rFq1im+++YbmzZvz008/3bXKIP+eFPUzVByVSkWjRo0YN24c4eHhbN++nZo1azJ//vxSld5XqFCh0HUHBQWZDax2N3Xr1uXVV19l4cKF7Nq1i2bNmrFy5UrOnTtX6mOA8fpL6gqSmZlJYmKiqYoiX0BAAKtWreLnn3/mww8/xNbWljFjxpCYmFjoGPmDikm/ZiHE40ASZyHEE6FOnTrUrVuXtm3bsnjxYhwcHPjggw9M/SpPnDjB+fPnuXHjBo0aNTL9y29tze8DXFpKpZIxY8Zw9OhRtm/ffk8x29raMnLkSH755RdOnz5daH3Tpk05ceIECQkJha41KCioxDLMfFqt1tSHu1u3bqbrbtq0KYmJiRw+fJjLly8Xu3/Hjh2pVasWn3/+eZn7XGq1Wvbt20e9evWKHL37Tj169ODQoUNcu3aNyMhI3N3dzaZB2rFjB8nJyRw6dMjsPcwvEX1QA3KVZNeuXfj4+JiSjfzkbdGiRWYx/fjjj2br71WzZs3Q6XTs3LmzyPWxsbGcPHmSpk2bFnsMHx8fnnvuOZYuXWpWYl4W3bp149y5c+zateuuZdoPQ34i3qpVKxYuXEiVKlX46KOPyMzMLHYfT09P/Pz82LFjxz2f19PTkz59+pCXl1emOdMfFAcHB9P8zxcuXCjTvvm/P27dulXk+p07d6LX6wt9dmxsbAgKCiI4OJjevXvz2WefER8fX6oR9oUQ4lEmibMQ4onj4uLCq6++yrlz59iyZQtgTGAUCgXz5s3jhx9+MPs3YsQIYmJiCrVQ3027du0ICgq6p6Qy34ABA/D09Cyy5Xrw4MHAP/Pc3oudO3eSnJzM6NGjC113fh/tkpI7hULB2LFjOXnypOlelobBYODjjz8mISGhUN/I4nTt2hWlUsn333/Pnj176NKli1kf1rVr12JjY0N4eHiha+nZs6dpMLGHJTw8nNOnT5uuR6vVsmHDBoKDgwvF88MPP1CrVi3WrVt3X4M8tWvXjkqVKjF37txC/cT1ej0ffvghCoWCF154ocTjjBo1CoVCcdeR3Ivj5+fHwIEDad++faE5nf9tGo2G8ePHk5CQcNcuBCNHjuTcuXMsWbKkyPWnTp0ytUgXl2BGRUUBPJBB+kpyt/MXN8hXcQYPHoxCoTB7gJgvOTmZuXPnUrlyZdPI6cVp2rQp7dq1Y+XKlcX2pRdCiMeB9HEWQjyR+vXrx7fffsvXX39N27Zt2bBhA40aNeKZZ54ptG2tWrX4/vvviYiIoFmzZmU6z7hx44qd6qY0NBoNr776KlOmTCm0zs/PjxkzZjBp0iT69OlD3759qVq1Knq9nujoaFasWIFarS5xjt78ZHPo0KHY2toWWh8eHs66desYM2ZMsf2QW7duTUhISLGDJOXm5ppGGM/KyuLSpUusW7eOI0eOMGrUqEJ9zYvj5eVFs2bN+PHHHwvN3ZyQkMCePXvo2rVrke+Rm5sba9asISIigtdff920/MSJE0WWFd9t7u6jR4+iUqnIycnh2rVrbNmyhd27d9OjRw9Tkrpr1y6Sk5OZOHEiTZo0KXSM5557jnfffZf9+/eX2CJcEo1Gw+eff86LL75I7969GTZsGNWrVyc+Pp5ly5Zx4MABPvjgA/z8/Eo8jqurKy+88AILFiy4pzjAOPBVaZ0+fbrIqaICAwNLVX1wN2FhYQQFBZn6bltZWRW5Xbdu3Th16hSzZs3i8OHDdOzYEXd3dxISEti5cyfr1q1j9erV+Pj40KVLF5o1a0arVq3w9fUlPT2dXbt2sXz5cjp27FjqQcbu1fDhw/H29iY0NJSqVauSnZ3N33//zZIlS6hfvz4hISFlOp6fnx/vvfcekydPZvDgwfTv3x93d3eioqJYvHgxqampLFmypNDc6UV57bXX2L59O4sWLSryd5UQQjwOJHEWQjyR8keFnjp1Kjt37iQpKYlevXoVua2DgwPt2rVj69atTJ06tcgEszhPPfUUjRs35q+//rrnWHv27Mm3335bZMl0165d8ff3Jzw8nIULFxIXF4daraZixYo0b96cTz75pNj+rYmJiaZks7hr6t27N1OmTOGvv/4qMvnLN27cOFPJaFHnee6551AoFFhbW+Pl5UX9+vWZOHEi9erVu/sNKKB79+78/vvv1KpVC39/f9Py9evXk5eXV+x76OfnR/369YmIiOC1114zLV++fDnLly8vtP2+fftKjGPAgAGAcTomd3d36taty+LFi2nRooVpm7Vr12Jra0uHDh2KPEbnzp2ZNWsWERER95w4g3HO4sjISBYsWMCiRYu4desWdnZ2hISEsHTp0lJPATRs2DCWLVv2QKbJups7R7TPt2/fPlxcXB7IOcaOHcuwYcNYvnx5iVUNb7/9Ns2bN2fp0qVMnz6dtLQ0HB0dCQ4OZt68eQQEBJiOt2vXLr744gvi4+NRqVRUqVKF//3vf6bqj4fp5ZdfZsuWLSxatIi4uDgMBgO+vr4MHTqUESNG3NNczj179qRatWosWrSI9957j/T0dNzd3WnRogWjRo0q1L+5OP7+/jz77LOsXLmSkSNHlrn1WwghHgUKw/1OBCiEEEIIIYQQQjzGpI+zEEIIIYQQQghRAkmchRBCCCGEEEKIEkjiLIQQQgghhBBClEASZyGEEEIIIYQQogSSOAshhBBCCCGEECWQxFkIIYQQQgghhCiBJM5CCCGEEEIIIUQJJHEWQgghhBBCCCFKIImzEEIIIYQQQghRAkmchRBCCCGEEEKIEkjiLIQQQgghhBBClEASZyGEEEIIIYQQogSSOAshhBBCCCGEECWQxFkIIYQQQgghhCiBJM5CCCGEEEIIIUQJJHEWQgghhBBCCCFKIImzEEIIIYQQQghRAkmchRBCCCGEEEKIEkjiLIQQQgghhBBClEASZyGEEEIIIYQQogSSOAshhBBCCCGEECWQxFkIIYQQQgghhCiBJM5CCCGEEEIIIUQJJHEWQgghhBBCCCFKIImzEEIIIYQQQghRAkmchRBCCCGEEEKIEkjiLIQQQgghhBBClEASZyGEEEIIIYQQogSSOAshhBBCCCGEECWQxFkIIYQQQgghhCiBJM5CCCGEEEIIIUQJJHEWQgghhBBCCCFKIImzEEIIIYQQQghRAkmchRBCCCGEEEKIEliUdwAPk16vJyMjA7VajUKhKO9whBBCPOYMBgO5ubnY2tqiVMqz6fsh3+FCCCH+TXf7Dn+sE+eMjAzOnTtX3mEIIYR4wtSsWRN7e/vyDuORJt/hQgghykNx3+GPdeKsVqsB48VrNJr7Pt6JEycIDAy87+OUB4m9fEjs5edRjl9iLx8PInatVsu5c+dM3z/i3sl3+D8k9vLxKMcOj3b8Env5eNJjv9t3+GOdOOeXdmk0GiwtLR/IMR/UccqDxF4+JPby8yjHL7GXjwcVu5QW3z/5DjcnsZePRzl2eLTjl9jLh8Re/He4dMASQgghhBBCCCFKIImzEEIIIYQQQghRgse6VLs4er2e6OhoMjIyyrSfhYUFp0+ffkhRPVx3xm5ra4uvr6+M+iqEEOKRotfriY+PJzk5GZ1OV+r9HoXvcCsrK3x9faWPvBBC/Ac9kYlzfHw8CoUCf3//MiWOGRkZ2NraPsTIHp6Csev1eq5fv058fDweHh7lHJkQQghRetHR0SgUCqpUqVKmqar+69/hBoOBhIQEoqOjqVq1anmHI4QQ4g5PZHNjcnIynp6eT2xrq1KpxNPTk5SUlPIORQghhCiTjIwMKlSogEajeawGYVMoFLi6upKdnV3eoQghhCjCE5k56nS6J74MSq1Wk5eXV95hCCGEEGX2uD74fpweBAghxOPm8fzmKYUn/cvpSb9+IYQQRpcuXeK5556jffv2PPfcc1y+fLnYbaOioggODmb27NmmZdOnT6dDhw507dqVfv36cfz4cdO6QYMGERYWRrdu3ejWrRurV69+mJcihBBCPDRPZB/nstLp9MQkZOBg/eCTzT59+qDVasnNzeXy5cvUqFEDgNq1azNz5sy77r9s2TJycnIYMmTIA49NCCHE42/atGkMGDCAbt26ERkZydSpU/nhhx8KbafT6Zg2bRpt27Y1W96yZUsmTZqEWq1mx44djBs3ju3bt5vWT548mTZt2jz06ygvw4cPJywsjP79+5uWGQwG2rZty8yZM2ncuHGhfSZOnEhgYCDPP//8vxmqEELcE4NOx8WFi/Dp0hmbir7/yjmvLF2GUq2mYt/e/8r5SkMS51LIzdOTlaPDWqN64MdeuXIlYBzspFevXkRGRpqtz8vLw8Ki+Lep4Be1EEIIURYJCQmcOnWKJUuWANC5c2fef/99EhMTcXFxMdv2m2++oXXr1mRmZpKZmWlaXjAprlevHjdv3kSv1z+25dR36tWrF0uWLDH7Pt6/fz9KpZJGjRqVY2RCCPFgZMXEELtlG1aenmVOnA06HSgUKErxnXBz6zbSzp6n+uhRxG7ZhkKlwrdPL7NKWV12NhfmL6Dy8wOw8vx3Bzl+Mr7V7te/XNUcGhrKnDlz6N27N1OnTiUuLo5BgwbRs2dPnn32WT766CPTtvPmzTOVzK1Zs4ahQ4cyduxYnn32Wfr160dcXNy/G7wQQohHRkxMDJ6enqhUxgfDKpUKDw8PYmJizLY7c+YMe/fuvWt109KlS2ndurVZ0vzRRx/RpUsX3nzzTWJjYx/4NZS3sLAwrly5wsWLF03L1qxZQ7du3Rg4cCA9evSgU6dOhIeHl1+QQghxH3Li4gHQJiaSExePwWAo1X4Gg4FDo8dwddkKs+X63NxC26adv0DUgkXc2v4rNzf9Qm5KCtrERKJXribl5CkMBgM31m/k1o5dxO/eQ+LfB+7/wspIWpyB3w5cZdtfV4tdr9cbyNHqsFApUKvL1urcrnElQhtWKnNM6enprFq1CoCcnBwWLFiAra0tubm5DBs2jN27d9OyZctC+x0/fpx169bh7e3N5MmT+fHHHxk3blyZzy+EEEIA5ObmMmXKFGbOnGlKsIuyceNG1q9fz9KlS03LPvroI7y9vdHpdCxcuJCxY8eybNmyMp3/xIkTZq8tLCzIyMgwvU7cvZeEXbvLdMzScm3VEpeWT991u44dO7J8+XLGjh1LRkYG27dvZ+XKlQwcOBCNRkNmZiaDBg2iQYMGVKtWjby8PHJycsyuI59Wq+XgwYOFlhe17FEhsZefRzl+if3B0ycloXByKnGso/zY9YmJKKysUNjYkHfoCAA39/9FzIZNqBo1QFUvmNyt29H07YXC2rro892KQ3sjhutbtxPnV5XcFatQ1Q0kd/0mNM/3R1m5EgaDAf2Fi+Ru2Ay2NihUFkR9u8R0jKtLl4FGg7pvL3J/XAa3v4eu7NvHlb/+Qt2+HQorK7PYHxZJnP+junfvbvq/Tqfjo48+4vDhwxgMBuLj4zlz5kyRiXNISAje3t4ABAcH88cff/xrMQshhHi0eHt7Exsbi06nQ6VSodPpuHXrlul7BCAuLo6rV68yYsQIAFJTUzEYDKSnp/P+++8DsG3bNubOnUt4eDhubm5mxwdjS/YLL7zAl19+WeYy7sDAQCwtLU2vT58+bTYfc4alZYkJfb78aywLS0vLUs393GpaP50AACAASURBVK9fP4YPH87EiRPZtGkTISEhODo68uGHH3L27FkUCgXx8fFcvXqVoKAgLCwsij22RqMhODjYbNnBgwdp0KBBmWL/r5DYy8+Djj8vM5Pc5GSsfXwe2DGL81+89zlx8Vz9aRnVRr6E6naiVpSiYs/LyMDiPuaRT9j3J0716xU6762du7n5yxaCZrx/11Lo9AsXOfreDCoN7F9sv+H82A0GA3/07At6PU2Wfs/1M+eIBgy3W551fx/EJjUd7ZWreCckUaFb4QeMWTduEHvyNNcBQ3Iy3rFxXI66hCI2FnQ6nG/GUr1nD678+BPRK1ejsrUlaMZ7ZF69xrlPPgOlEvR6wDiTguKXbcYD63QA6E+eBoOBqs8+i2uDBg/kM5OTk1PoYW1BkjgDoQ1LbhXOydVx9WYaznYq3Jzt/5WYbGxsTP9fsmQJqamprFy5EktLS6ZMmUJOTk6R+xX84yL/jyAhhBCiKK6urtSqVYsNGzbQrVs3NmzYQK1atcz6N/v4+LB//37T63nz5pGZmcmECRMA2LFjBzNnzmTJkiX4+v7T9y0vL4/k5GRTIr1x40Zq1qz5wPs+e4S2xiO09V23y8jIKFUSfC8CAgLw8PBg9+7drF69msGDB/Ppp5/i7u7OrFmzsLCwYOjQocV+d4sny63fdqKytsK1WdN7PkZeZiYKhQJtcgpqezss7OwAY3JkW7UKijI+JLqbnLg4Dr48GkNeHk2W/YiFTdEtjI+zaytXc+u3ndjXCsDrmXYlbpsVE4Pa3gELO1syo6M58vob1J76Dk71zB+KaZNTuLbiZxQqC6oOG4JCoeB65Hrid+/Bu0tnPFq3JPPqVc7M+hiXxo2o9c5Es/3j9+4l7fQZsqKvY1OpYqE4sm/dIjvmJvYB/iQdOgwYW3C9OrRH7WDMaXRZWajuaDHOjokxJa1XflyGroj55dPOngUgdus2fLp2NmvFzkvP4Nj4SeSlpZmWXf4u3Hi+DOMYGYn7/yaxYQNurNuAa7OmVH/9VSxsbLCpVInoVWtQqtU41a+H2smJ5EOHSDp42DyA2+Xi2TfNuxY9TJI4l0J5T9yUlpaGu7s7lpaWxMbG8uuvv8qgYEIIIR6Id999l4kTJ/LVV1/h4OBgGjfjpZde4vXXXycoKKjE/d9++23UajWvv/66aVl4eDiWlpaMGDGC3Nt92Tw8PPj0008f3oWUs169ejFv3jxu3LhBWFgYmzZtwt/fHwsLC86dO8eBAwfo3LlzeYcpysCQl0f2zZtYeXmVanttYhKnZ87Gp2sX3Fs8VeQ2ualpnP98HgBPRRY9PZtBpzNLfBMPHOTWbzvxf3OcqVXx9IezUFlakn7hAi5Nm1L9lZFkx8Zy9M0J+L0y8q6JXUn0eXnEbtmKR2gbU0J1Y8MmDHl5AKQcO4Zr0yb3fPyiJB87TtQ3i/Hu1BHvTh3uur0uK4vc1LR7Ghwq4/JlYjb9gkOAPx6h5iP+Jx08hNLKEsc6dUzLchIS0bg4o9RojK9jb5nWGXQ6dDk5GPJ0GPR6NE6OGHJzOfTyaADqz/+CxD//wqDTkXz0WKHE+epPy4ndshUAlbUVHq1bcTn8B9Drid+9G5eGDci4fAWAxL/+NvUNTj56DOcGIaSdPQ9A6pkzhRLn9Kgojk94B71WS4We3Uk7e860Ln7PHiw9PLj1206SDh2m4eIFqO2NifS5z+YRt2MnADZVKpOw70+sff6pQlI7O+FUrx5xO3Zi7+9P2tmzJB86jFNIfa6vjSTvdlVSXno6So0Gr47tyYqONkt8VTY25CYnGz/HNjZUHjQQi9uNhgqlkjrvTcOQp8PSzRWAvPR0kg4eRmllhV6rRePsjDYhAYDsmJslvd0PlCTOZVG6fvAP3KBBgxgzZgydO3fG09OTZs2alU8gQgghHjt+fn6mGR4KWrRoUZHbv/baa2av//zzz2KPvWbNmvsL7hHSuXNnZs+eTd++fdFoNIwaNYrx48ezatUqqlatKiNs34XBYCD7RgzWFXyI/fU3rv64jJAFX6IqUElXUOqZs9j4+mJhV/YqgjOzPsLa15fKzw/AYDAQu+1XXJs2Ru3gYLad7o8/OTznMxp9/x2GvFx02dlYeRSdqCUfO072zZuknzvPuTmfYu3thV11P9LOnUeblIRrE+O0ZLFbt5ldszYxEbWDA0q1GjAmR2dmfUzdj2dh51cNgOur15J66jRpnTuhz81Fm5RM2pmzpkQ28/bc6xmXr4DBQOrJU3g90w59UjJnPpqDxsmJKkOHoLw9S0vi3wfIiU/AtVkTlBYWKK2sODF5GgqViuqvvkz6hYtEffMtoMD72Y4ApJ87j111P7Ku3yDp4CGzxDlu914s3d1wqBVQ7D3XZWeTevIUTiH1C/WvjV61hiv/ZxwbIfnIEbPEOSvmJld++BH3Vi2I3f4bvr16kHryFKmnTpN08BDBc+dgV60qGZevoLTUkHrqNDa+vlxcuBiDLg/n+vXw7dPLrEw6ZtMvxG7ZRuy2X3Fp3Nj0GcpJSOT0jNkY8vJwfaoZrk2aoHZ04OS77+P3ysum1tP0C8aBAPMyMzk59T20CQlY2NmisLCg5htj0R37Zy77aytWoo03ljenn79gfN/1etMDkIyLF3GsG4TKxobon1cR/bNxfCO7mjVIvxDFgRGjUGrUpuOdmf0xtpUrE71qDTX/N4681FQA0k6fxTMslHOffo7a0YHKLzzP2dmfYGFvj5WXJzfWbcCg11OhZ3fi9/7Ope++N31+AG5u3oKFvT26uFvE79lrWu7bqwfnPvmM3ORk0zIrLy+8n+1I2tmz1PzfGI5PmkrU4u9QOzqSdvqMcSOlEo82rak+ehQAKSdPkXTwMAq1GkNuLr69e2Ll5YnG2RmbypUKlbFrnJzMXtv71wTAIcCfai+PIPXECS58+bXxHl6+QsL+v8Diwc9+dCdJnEsh/+f7YebNvr6+plK43377zWxdhQoVTAOF3angHzA9e/akZ8+exb4WQgghxMPh6OjIsWPHTK9r167Nhg0bitx21qxZ/1ZYD50uJ4fon1dRoVfPu5bv6nNzOfz6ODzbhuHbq4fZumsrVnJt2QrqzplN4p9/oU1MJGbDJtROjni0bmXWAhv/+z7OfjQHlyaNqDVp4p2nAYzJiT4np1AJql6rJWHffmA/HmGhaOPjuTj/a9LOnKXG66+aX9ulyxi0WtIvXCBm/UYyo6/j9UxbFGo1Pp07kXn1GqmnT2Pt48PJKe+anSvxr79Jj4ri4vwFAFQeNBDnhiFcW/HPQ6rkw0c4M/MjXJo2xv9/48hNS+PMrI8x6HQkHTyEnV81smJuknrqNGDsz5p08BDaxERTGS1AZnQ0BoOBrGvRAKSdMbYs6g4cImGf8cGWbbVqOAYFYuXpwekPZgJwOfwHLN3c8O3Vw5Tw3Fi3geybxtHv43btQZuYiE/XzqRfuIhXh2ewdHcn4c+/qNjvOdT2duSmGVvQLT08CJn/eaF+tjlx8Vi6u3Hlhx+J2biZyoMHYeXpQcblK1Qe2B+9Vsu1latxbtjA2MJfoPXQYDAQ9c1ikg8dJuGPfcZ7duQohgIjMp+Z+RF1Z8/gyJg3TMsUFhYY8vJwqFOb65HryYy+jt/I4cYya/+apJ05a0rgrv60HNtqVfFsG8qNdesx6PX4dOvCzc1bSPh9n7GfrcHAtWUr0LgaWz/Tzp0n9cxZzn40B21SMtx+AAJw9H/j0d/ukuHRNpRb241/0ytUKtIvXCTp4CHOfvwpPt27orKyIuPKVbyf7UiVwYNIOXacU+/PwDGwDo51g7jyw4/G9zEDrLy98O7UkUvfhZP0t3EArOtrIwCw8vEm5cRJrvzfUuL3/n77JijIvnmTwA/fIzclhdSTpwBwb9USXVY2Nzf/gqW7G5WeH8Dl78KNA3AVoLK1wa15c5wbNkBpaYk+JwdLDw9ybt3CyssL+xrVafD1l8bP9sB+XPouHJW1seX4xoaN6DIyqfR8f9PPrWNQINVefgmnesHc+m0nHmFtCiXHJbGvUQOUSmyqVMba24u89HQAU7J+5uw5LN9+q9THu1eSOAshhBBCPGYS9u0nNyUFrw7P3PMx8jIy0GVmYen+z4BvBoOBm5t+wSmkHtbe3iQfOUb0qjVY+1bAo01rwJg0Jh85RtVhQ8yOF7vtV7JvxHDlhx9JPnzE2Nrq7ExucgpZ0cakL/nwEVJPGxPF/MQhfu8f1Jk2GTCWn57/7AuUVlYk7v+bP3r2RaFWU3vqJFN5bW5KCienf0hObCwNvvkKlZUVCpWK+N/3kXn1n1lUor5ZbJqTNi/d2JqYcvwE0avWoM/NxXDFuG3K0WMkHzmKXqvl6vKfsbCxQWVlxcWvFmDQ6bCw/6evqH2APxgMJB06gi4rC1s/P6y9vbjy40/EbtuOytaWaiOGceHLrzk1/QNQKonfvZcKPbqR9PdB45y3GFsno1et4crSZaBUYl+juqmk9066jEyyrl8n8+o1ALJv3kSbnIzu1GmcG9QnM/o6F+bNR2FhQY2x/3SpsLC1ISs6mgvzv8bKyxNLDw8S/zqANikJhVpN2tmzpJ09S8rxk+i1WuxvlzYnTXyH4xPeRp+bZ2qJzL5xg0vfhZOwbz9e7dvh9lRzcuLiODntPaq8OJjY7b+htLLiyvf/Zzp/hR7dSDt9Bn12Nt6dOpB87Dgpx09w5qM55Flbc3zlGtJOn8Ha15es6Ggs7O3JS0szJcbVXh7B5SXfc2ziJNMx87e1D/AnaMb73Fi/kUuLv+Pg4SNmLawVevXg+uq1xGzcBEolyUePEr97L24tW1B16BAq9utLwr4/ufDFfFwaNyLxr79NybEuM5Ozs+dgMBgImvE+SQcOkh51ieRDh01Js0Od2ni2DTMlzr59e3Nt2QoufPk1uqwsrhWYnsm2ahUUSiVO9YJp8mO48TN3O9HNZ1OpIj5dO5N9M9YYs0JBRtQlNC4uVBrQn3NzPuX62kgUKhUGnY6YjZvxCAvFMbAOeq0W91YtcW/VAtsqlXF7ujmx23/Ff8Jb2NeoTl5qGtGr11Jj7Gucetc44GOT/wsHpRKFQkHQjPeJ3f4rNpUqEbVwEVZenmaxeYS2MSt5dwyuiy4rC8vbDxoAFAoF3h2NlQSVB5a9u6mFnS11pk3GpkplAOxrVCd47sck/L6P6FVrcKobRPYD7tdfZBwP/QyPhfLu5SyEEEKIR43BYChx2pd8+rw8dFlZWNjYYsgzH9TToNOVes7UfHmZWVyY/xX6HC2OwXVJO3MG+4AArL2L7qurTU4mdtuveIaFosvOIvXUaTzatObktPdIP38B786dqPbSMACyrkUT9c1i3Fu1pOYbY0wD86SdPY9Hm9YkHTrMmdlzMOTlYWFvh97DjcS//ubmL1tNgxOBMUG19HDHkJuLlbcnKmsrMq9cJWbjZvLS0k3bOdULJvnQYa5HrsfCxpqry37GwsGBwPemcXrGbNSODqSePEXSgUOmxPnGhk1k3J5X+9j4SRj0egImvsW5uZ+bWiu9uzxLzPqNJN+OKe3cBQ6/Po7MK1exdHczzVsLxlJi03uVnY02O5sL87/GsU5t8jIzybgYZVpv5+eHhYO9KTGqPnoULk2bkHT4MNk3Y/Gf8Ca2lSubtq8y5AWuLVvB9bWRpNzut2rh4EDcjp0k/vU3rs2aUqFHN9TOTpyZNQd9dhbZN2NRWFhQaUA/sm/GcnPzLxx+dQyAKbm8EbkeUlJwe/ppFCoVV378CaVGzbk5xnEGAj+Yjn2tAGK3/UrSwUN4tmtLxqVLpNwuM/bt25try382JdAoFNj7+2Pp5kqdd6cYS6sNBnKTk9G4uWFha0PM+o2obG25unQZV5cuQ327RfHyku9BqSR4zmxu7dhFzHpjJUb6ufMk/n0ApZUVjkGBZN+Kw6DTGVt6gSw7O/xeGYlHm9YkHzuOpZsbsdt/wzGwNslHjpoeCkUt+AYUChouXojGxZnolatxCqlvfJ87d8LCzpa4nbup2K8vxye+AxhbQK+vjQS9HqWFBfG79+LTtTOVX3jeeB9tbPAMC8W5fn3Ujg78OeAFY4LfpTPxe/aiTUyk8qCBONQKMJWon3rvQ5QaNWmBdfBv3hy1sxPVRr5kLMW2suLashWmFnynesGceu9DAGyrVDF9HvKrFvL7K6tsbNBlZmJT0fi68uDnsatZnaQDB4nf8zseYW1we7o58Xv2knHpMgET3+LoG2+BwYBnuzAAlBoNNd8YYzqHY2Admi77P1P3AJ+unfHu3AmFUolm5HAC/PzMKjzsqvthV90PbWISl75dgl11P0piX6N6ievv1Z39w+2qVSPluHEEbLenmxP9UM5qThLnUvg3SrWFEEII8fjIuhGDQa/DpsBI40UxGAzk3LqFLjOTPGsbtImJphbc9AsXjQlQLX8yPTzIjr2FvX9Nrq+NxKvDM1h5/tPyk3HpMkmHj+DRphWXvl1iSj4Pjx6DIS8P50YNqDZiOPrsbKwrVjQl9AaDgfNzvyD5yFFuRK7DvmYNkg4eJu3cedLPX8DWz4+YTb/g3bkT15b/TPJRY2IVt2s32qQk08i2aefOkXT4CKc/mIlNpUqoHR24tvxnAE4DamdnfPv0wtLVlYtfL0RhYUH9L+aalTdf+nYJN9YZkyr/8f8jO+YmHmFt+HvIcNOIvEpLS4JmfYh1BR9C5n8OGMtj089fMPUZTjl6DHv/mmiTkk0t2ccnvmNW4lv1xcGorKyMpcwGA1nXb5CblETlwYPw7tSB8198ScLv+3Bp0ojE/X+bBiUylUjr9VQd9iKpp88QdTEKtZMTucnJ2NWsjkOtANLOnkOhVOLW4mlUVlZUf/UV0s+fx7VZU1OrMoBHm1ZkREURt9M4F3mFnt3JuHyFuB07sfXzw3/8/0zlz8GfzMag03H6g5kYdDoqdO9KTnwCNzf/YjqeQ+1apJ48xfWIdaBS4dK4ERZ2tri3akH2rVscfMnY59Q+wB+lhQXeHdvj3bE9ACpLjekYvr17onZyxL1VK1JPnUJtb28aqMmhVgBBM4wtk5nR0agsrVA7OaJNTELt5MiNiHVc/Wk5ucnJxn6sLi749u2NnV817PyqUal/X/YPHEzKyVMk/PEnzvXrodRozB7sWLRuSfCAfqbPuEtD4zRD1Ya/CGDqY+3ZNpTrayLQODub4qv4XB/TcRQKBR5tWpuqISr2f45ry1ZgX7MGtSe/Tdr5C9hVq0puWhqeYaHcSePiDIB1BR8yLkZhXcGbCj27cfWnFXiEmQ8sVmvKJDAYOHT4sGm/gv2160yfytWfluPd5VmsPDxwb92KuJ27sPatUOi8lu7uWHp44NkuDG1SEm4tW9x+jyzxaN0KDAYS9/+NZ7swFAoFARPfQp+bi1KjQe3oiFKjNvULLkp+0my6T7c/Y0pPj2L307g40/j7b1E9pNkJ7oV3xw5onF2MifPhw3ff4T5J4lwWkjkLIYQQ5a6sc0GXB11mBmAsdzbk5aGysQEUKCxUxpa6lBTy0tKxsLdDl2mcniUvMwODwcCV/1tqLLnU61E7OZJ79DhHxr6JQadDZW2NLiuL7NhYXBo2MCYcvhU4/s4UdBmZ3IiIJC89A5+unYn9dQe6jAws7O1IP3+RI2PfRJeRgW/f3ni0aUXUN99i6eFB8pGjeLZ/htgtW00j38Zu2YZzg/r4jXqZAyNGceKdqWgTEs2uMaXAIEgZF6M4+/EnWFfwIfDD6Sg1GlJOnOTcwYNUDwrCuUEISgsLtIlJXPx6obEV7o7+x+6tW5Fy8jQ+nTvi9lRz03LX5s1IOXGSqi++gJWXF3bVqprtZ1ezBrd+28m5Tz8nfvcewNhiqlSrubl5C071gkk9cxa/USOM88Ni7HNa+fkBVH5+ALd+28H5z79EZWuDb8/uAPj/bxwHQupRrX59nOrVw7ZqFaK+WUxuSgoKlQUaZydsq1ZBeXteXc9n2uJUry4OAQEoVCpTaXk+t6ea4faUcXBXhcU/f36rHRxwe6o5cTt3Y1ejBg51amPtW4GMi1FUfmGgWZ9hhUKBwsIC//Fvkv9HqcbVBZRKHGrXIi81Fa8Oz6CytiJu526UNWuYDZ5m5eFB0OwZaBMSCiVOYByAycrLC5+uXVCq1abS2vyktSgFHwzlj3Bd8bk+2FSpwpkZs6jYvx8erVua7WNha4tNpYqmgbDc27Qy7l9g/niLlk+bPRgqjlKtNibxytJVh1bq15cKPbqhsrTEuUEIzg1CSrWftY83GRejUFla4tWhPZ7t2ppGgc6nUCj+aW0rglO9YLNW0xqvv0q1l4aaBm2781ghX89DoVQWOT+ze+tWODdsYBoJW6FUmgbSqzp8KCprq7vO63wv8qc9+69QajS4tyw8h/TDIolzKUihthBCCPHfYGtry/Xr1/H09EStVpeqFPrfVrC0OjvGWMqstLJCn5ODhZ09+pxsY+slCrQJCSjUGvR5uSRnZaHBQJVpkzk7Zy7o9QS+P53DY95A4+qCb5/eXPx6IWpHBxJ+32cqabWwt0ehUGJbtQoZly5TY9zreLRuhdrZmbz0dNSODlz+7ntTTDci1hG3cxc5t+IA4x/0fqNGkHryJFnR11E7O6HLzKLayBHGAYQG9CN263Yq9OhGTnw8bi1akHHpEtGr1mDIzUXj6oo2IQF9jpYaY14zjZDrXL8eFnodrg3+Sbw0Ls5U6NGtyITFzq8a9T79qNDymm+MAYWiyAQDwL5mDW5u+sWUNBuvqS4OtWtToWd3s/3y0jPQOJsPSmR9uwy2YLKuUKlQOjtj6epqajWs8uJg9FotVl6eqCyNCbO1txe13pmIfa0AUxJTGvXnf2F6cOBUvx7OjRpSoVsXFAoFGicnaowZXey+BQdhUygUxrJbjcaUKOlzcojbuRtV7VqF9nUI8C/2uCpraxosnF/qayiJS+OGBM36sNjWS/eWLUwjaTvfLqvObzF2bd6MjDKcq2Af/NIobqT2klQZMhhddg7OjRqiUCgKJc33QqFSlZiIFvd5B+P7Xtzn7d9MJJ80kjiXxn/vO1kIIYR4Ivn6+hIfH8+VK1fIKzDYz91otVo0t+dhfdgMOp2pdVZpZQkGTIMGAaAwtjQa9Hry0tJROzmiy8gkNzqaKrVr4RwYSJ1pk9Hn5mJT0RfN4OcJbNYUKw8PXBo3QpeVxYnJ0/Dt2Y2E/X+TcvQYlQb2x63FU6QcP4F7K2MLX37raXKBluG6c2ZzYvI0lGo1AW+PJ+X4CSr07IFCocC9dSuurVhJ3VnGvpemFsQ+vajYp5fZNbo2aYQ+O5vrayPxCG2NV8f2xkGzrEseWRuM/XrLoqjW0YKc6gVjV6MGPl2fxaF2beJ27jK2/N5uoS2oqDmC7ar7ETBpIs4h9Uo+T92i5zR3aVz2qcZsCpTnKtVqak9+u8zHyKe63eptiqdJYwLeHs8lVflVZSgUihKnp/Lt3RPbalVRqtWm91ehUtHo+++wsLXhcIER6v8LLN1c7+s9Eo8HSZzL4GFUag8fPpywsDD69/9nhDmDwUDbtm2ZOXMmjRs3LrTPxIkTCQwM5Pnnn38IEQkhhBD/XUqlEg8PDzyKmU+3OAcPHiQ4OPjuG96nS9+FE7NhEwadjtrTJuMcUp/0i1EcfeMtbKtVRa/V4tu7Jx71jElaXno6FnZ2XI9cR/S6DTh37wZg1lKn9K1gmj9Y4+QITo40XLwAhUKBU0gIMes3GAdBsrHBukC5az7bqlUAsKlcCfsa1WkcvhillRUKhcJsPl7fnt1xb9Wi2LmK7+RQuxbX10Zi5eVlNoLuv03j7EzwnH+m+PLtXbapOBUKBa5NHp95thVKJa5Nm3D54MHyDqVE+S3NBWmcHMshEiFKRxLnUlCYmpwffOrcq1cvlixZYpY479+/H6VSSaNGj88vcSGEEOJJkHz4iGnwJ0t3dwBsq1XFt3dPXBo3KlS6ml+q6dP5WTzbtUVZylbx/BJ1a28vqo0YXuK2ant77P39cbrdolpcq7BCpSp10gzGEmPf3j1xbVr4Ib8QQjxuJHEujYeXNxMWFsa7777LxYsX8fMzDu++Zs0aunXrxsCBA8nKyiInJ4e+ffsyZMiQBx+AEEIIIR4IXU4OmdHXTa/z+14qFAoqDxpY4r4KleqB9JssTt2PZjzwYyrV6rtelxBCPC4kcQZu/baT2F9/K34Dg4GsHB2pKrilLtst8wwLxSO0dbHrNRoNXbp0YfXq1YwfP5709HS2b9/Oxo0bGTFiBBqNhoyMDPr06UOLFi1MybUQQggh/lsyr1z9Z7oiCvc9FUII8ej6b8/l8ITo3bs369atQ6fTsXnzZkJCQlCr1UyaNIkuXbrQv39/bt26xZkzZ8o7VCGEEELcQZuYRMK+/WREXSrvUIQQQjwk0uIMeIS2LrFVGOD8tWTsrZV4uTk88PMHBATg4eHB7t27Wb16NYMHD+bTTz/F3d2dWbNmYWFhwdChQ8kpOCKnEEIIIf4TLny1gKS/D2BbtSoqW1tCvppn6ucshBDi8SAtzqWkAAwPY1jt23r16sW8efO4fPkyYWFhpKWl4eXlhYWFBefOnePAgQMP7+RCCCGEuGdZ128AkHHpEt7PdkTj5Iilq0s5RyWEEOJBksS5tB7yXM6dO3fmwoULdO7cGY1Gw6hRo1i5ciVdunThyy+/lBG2hRBCiP8gXVYW2TdvYuHggH2tgDJPhSSEEOLRIKXapfSQ82YcHR05VmCy99q1a7Nhw4Yit501a1aRy4UQQgjx70o7dx70emqOe73IeWmFEEI8HqTFWQghhBDiHqVfjALAvmaNco5ECCHEwySJc2kpFA9jGmchhBBCPMK08fGobG2wsLMr71CEEEI8RJI4l5ICkMxZCCGEEAXlxMVj6eZW3mEIIYR4yJ7YxNnwMIfIfgQ86dcvhBBCPAg58ZI4CyHEUPWXiQAAIABJREFUk+CJTJxVKhW5ubll2keheLwanHNzc7GwkLHhhBBCiPuRE5+ARhJnIYR47P1rmVN0dDSvvvqq6XVaWhrp6els2bKF8ePHc/XqVTQaDZUrV+a9997DxcU4/+GRI0eYOnUqOTk5VKhQgY8//hhXV9f7isXJyYnY2FgqVKiAUvnkPTvQ6/XExsbi6OhY3qEIIYQQjyxdTg55qalYukviLIQQj7t/LXH29fUlMjLS9PrDDz9Ep9OhUCgYPnw4TZo0AWD27NnMmTOHGTNmoNfreeutt5g5cyYNGzbkq6++Ys6cOcycOfO+YnFzcyM6OpqzZ8+Wep+ElCxUCkhNsL6vc5cXrVaLRqMxvba1tcVNnpALIcQT79KlS0ycOJHk5GScnJyYPXs2VapUKXLbqKgoevTowYABA5gwYQIAWVlZvP3225w8eRKVSsWECRNo06bNXdc9DrTxCQBYut3fA30hhBD/feVSq6vValm/fj3ffvstTk5OpqQZoF69eixbtgyAEydOYGlpScOGDQHo168fYWFh9504K5VKKlWqVKZ9RszYjpudnhmvP3Nf5y4vBw8eJDg4uLzDEEII8R8zbdq0/2fvzsOjrO/9/z9ny8wkIWSBJBMWEYQQDGAFtT0VrEUFazAcPX6lyOki4lE8Sjku5NCfBKrVE6wctYKt1OXg14UiFWpEcaH+VPAgRFwgoghhTUggC2Sbfb5/BMamEJgJIXeGvB7X5dXM/bnnvl+TwjW878/GlClTyM/PZ9WqVcydO5elS5ced14gEKCwsJArrrii1fFnnnmGxMRE3nnnHXbt2sVNN93E22+/TUJCwknbYlmguZn9r60i4dxzAbD37m1wIhEROdMMGae8du1aMjIyOP/881sdDwaDvPzyy/z4xz8GoKKigqysrHB7amoqwWCQurq6Ts0LYDZD8Gya5CwiIt1edXU1paWl5OXlAZCXl0dpaSk1NTXHnfv000/zox/96Lje6DfffJMbb7wRgAEDBpCbm8sHH3xwyrZYdvCDD9m7bDlf/24hAI6MdIMTiYjImWZIj/OKFSu4/vrrjzv+wAMPEB8fz9SpUzv0flu2bDnta3g8HkIOGyUlJR2QyBjKbgxlN04s51d2Y8Ry9vaoqKggIyMDi8UCtCyemZ6eTkVFRXitEYBt27bx0UcfsXTpUhYvXtzqGuXl5fTp0yf82uVyceDAgVO2RaojvsOP6aj/f32bWq4T8vsx52SzZc8e2LOnQ67dllj+s6nsxonl/MpuDGVvW6cXzpWVlWzcuJEFCxa0Ol5UVMTu3bv5wx/+EF6wy+VyUV5eHj6npqYGs9lMcnJyVPfMzc3FbrefVu6EtWsJhnyMGjXqtK5jlJKSEmU3gLIbJ5bzK7sxOiK7x+Pp0EKvK/D5fNx///08/PDD4QK7M3XEdzh07J/NL5a9SqPdjrNvH4bOmokjI6NDrtuW7v73yiixnB1iO7+yG6O7Zz/Vd3inF86vvfYal112GSkpKeFjCxcuZMuWLTz99NOtFrDKzc3F7XazadMmRo8ezSuvvMKECRM6OzIAZrMJbX0sIiJnE5fLRWVlJYFAAIvFQiAQoKqqCpfLFT7n4MGD7Nmzh1tvvRWAI0eOEAqFaGho4IEHHiArK4v9+/eHe6grKirCa5ecrC1WBX0+GnaW4brmas795c+NjiMiIp3EkML517/+dfj19u3b+eMf/8iAAQOYPHky0LIC96JFizCbzSxYsIDCwsJW21EZwWw2EQwacmsREZEzIi0tjZycHIqLi8nPz6e4uJicnJxWw7SzsrLYsGFD+PXvf/97mpqawqtqT5gwgWXLljF8+HB27drFl19+yaOPPnrKtlhVv+1rQj4fPQafZ3QUERHpRJ1eOK9Zs6bV68GDB590W6gLL7yQ119//UzHOiWzyURIXc4iInKWmTdvHgUFBSxevJikpCSKiooAmD59OnfddRfDhw8/6funTZtGQUEBV155JWazmd/85jckJiaesi1W7X9tJdakJFJGx+ZwRhERaR9DFgeLRWazCZ/qZhEROcsMGjSI5cuXH3d8yZIlJzz/zjvvbPU6Pj6eJ5544oTnnqwtFjXvL6e2ZDP9b/opFofD6DgiItKJDNmOKha19DgbnUJERESMUnN0Ne3ePxprcBIREelsKpwjZDabCKpyFhER6bbqPt2Ms29fHOnat1lEpLtR4Rwhi1bVFhER6bYCHg+Ht2wlZdT3jI4iIiIGUOEcIbPJRFCFs4iISLfUWLaLkN9P0vnDjI4iIiIGUOEcoZZ9nFU5i4iIdEeNZbsASBgwwNAcIiJiDBXOEWqZ42x0ChERETFC065dWBLisaf3NjqKiIgYQNtRRUiraouIiHQ/oUCAz/7jXpp27Sbp/GGYTCajI4mIiAHU4xwhsxn1OIuIiHQzTXv20rRrNwBxaWkGpxEREaOocI6Q5jiLiIh0P0dKSwFIGpZDVt5PDE4jIiJG0VDtCGlVbRERke7n8NaviEtLI/ehBzRMW0SkG1OPc4TMZhOhoNEpREREpLN4a2o5/MUXJJ2fo6JZRKSbU+EcoZZVtdXlLCIi0l1889+PE/T56fPPk4yOIiIiBlPhHCGtqi0iItJ9BH0+jmwtxfWTCSQOPNfoOCIiYjAVzhGyaB9nERGRbqN5fzmhQICEcwcYHUVERLoAFc4R0qraIiIi3UfTnj0AxPfvb3ASERHpClQ4R0iraouIiHQfTbv3YLJYcPbJMjqKiIh0ASqcI9TS42x0ChERETnT9q/6K/te/QuOzAzMNpvRcUREpAtQ4RwhraotIiJy9gsFAux58RUAUi4abXAaERHpKqxGB4gVWlVbRETk7Ff/zXaCHg/Z9/4HvS79odFxRESki1CPc4TMWlVbRETkrFf76WYwm0m+YKTRUUREpAtR4Rwhswmtqi0iInKWO/zFl/QYfB7WxESjo4iISBeiodoRUo+ziIicjcrKyigoKKCuro7k5GSKiooYMGBAq3NWrFjB888/j9lsJhgMcsMNN/Czn/0MgPvuu4+vv/46fO7XX3/NokWLGDduHL///e956aWXSE9PB+DCCy+ksLCw0z5btII+Hw07duK65mqjo4iISBejwjlCWlVbRETORoWFhUyZMoX8/HxWrVrF3LlzWbp0aatzxo8fz3XXXYfJZKKhoYGJEydy8cUXM3ToUBYsWBA+b9u2bfz85z9nzJgx4WOTJk1i9uzZnfZ5TkfjzjJCPh89socYHUVERLoYDdWOkMVkAiCobmcRETlLVFdXU1paSl5eHgB5eXmUlpZSU1PT6rzExERMR78H3W43Pp8v/Prvvfrqq0ycOJG4uLgzH/4MOLKtpee8R3a2wUlERKSrUeEcIbP5aOGsbmcRETlLVFRUkJGRgcViAcBisZCenk5FRcVx57733ntcc801XH755dxyyy1k/0Nx6fV6ef3117n++utbHX/jjTeYOHEiN998M5s3bz5zH6YDNGzfTlyvXtjTUo2OIiIiXYyGakcoXDgHQ2AxOIyIiEgnGzduHOPGjaO8vJw77riDsWPHMnDgwHD7u+++S1ZWFjk5OeFjkydP5rbbbsNms7Fu3TpmzJjB6tWrSUlJifi+W7Zs6bDPUFJSctJ2z7c7MCX1OOV5RuiKmSKl7MaJ5fzKbgxlb5sK5wiZNVRbRETOMi6Xi8rKSgKBABaLhUAgQFVVFS6Xq833ZGVlMXz4cN5///1WhfOKFSuO623u3bt3+Ocf/vCHuFwutm/fzsUXXxxxxtzcXOx2exSf6sRKSkoYNWpUm+2hUIgNRx6j9wUXMOgk5xnhVNm7MmU3TiznV3ZjdPfsHo/npA9rNVQ7QhqqLSIiZ5u0tDRycnIoLi4GoLi4mJycHFJTWw9V3rFjR/jnmpoaNmzYwJAh3y2gdeDAAUpKSpg4cWKr91VWVoZ//uqrr9i/fz/nnnvumfgop81fX0+gsQlnVtsPDUREpPtSj3OEWg3VFhEROUvMmzePgoICFi9eTFJSEkVFRQBMnz6du+66i+HDh7Ns2TLWrVuH1WolFAoxdepULr300vA1XnvtNS6//HJ69uzZ6toLFy5k69atmM1mbDYbCxYsaNUL3ZW4Kw4A4HBlGpxERES6IhXOETo2VDugwllERM4igwYNYvny5ccdX7JkSfjnOXPmnPQat99++wmPHyvCY0Hz0QXRVDiLiMiJaKh2hDRUW0RE5OzlLq8AkwlHRobRUUREpAtS4RwhDdUWERE5O/kbGql89z0SBg7EbLMZHUdERLogFc4R+m5VbYODiIiISIcqL34Db20dg26/1egoIiLSRalwjpDl6G8qoMpZRETkrNK0azdOVyY9Bp9ndBQREemiVDhHSHOcRUREzk7uAwdwnGTvahERkU5bVXvfvn3ccccd4df19fU0NDTwySefUFZWRkFBAXV1dSQnJ1NUVMSAAQMATtrWmb4bqq3CWURE5GwRCoVorjhAUu75RkcREZEurNN6nPv27cuqVavC/40bN468vDwACgsLmTJlCmvWrGHKlCnMnTs3/L6TtXUmLQ4mIiJy9vHV1RF0u3FqGyoRETkJQ4Zqe71eXn/9da6//nqqq6spLS0NF9F5eXmUlpZSU1Nz0rbO9t1Q7U6/tYiIiJwh7ooDABqqLSIiJ2VI4bx27VoyMjI4//zzqaioICMjA4vFAoDFYiE9PZ2KioqTtnU2i3qcRUREzjrNR/9NocJZREROptPmOP+9FStWcP3113fa/bZs2XLa19i5rxmAraWl1B6IO+3rGaGkpMToCO2m7MaI5ewQ2/mV3RixnF3ax1NZBSYT9t69jI4iIiJdWKcXzpWVlWzcuJEFCxYA4HK5qKysJBAIYLFYCAQCVFVV4XK5CIVCbbZFIzc3F7vdflq5g84D8EE12dlDGdI/5bSuZYSSkhJGjRpldIx2UXZjxHJ2iO38ym6Mjsju8Xg65GGtdB5vXR22pCTMVkP6EkREJEZ0+lDt1157jcsuu4yUlJbiMy0tjZycHIqLiwEoLi4mJyeH1NTUk7Z1Ni0OJiIicvbx1dZhS0k2OoaIiHRxnf549bXXXuPXv/51q2Pz5s2joKCAxYsXk5SURFFRUURtnSnO2jLP2ucPGnJ/ERER6Xje2jriklU4i4jIyXV64bxmzZrjjg0aNIjly5ef8PyTtXUmh72lcG72+g1OIiIiIh3Fd7gOZ98+RscQEZEuzpBVtWORI67lGYPbo8JZRES6jr/97W9ttv3hD3/oxCSxJxQKtfQ4a6i2iIicggrnCNma6wFo9gQMTiIiIvKde+6554SrgT/11FM8++yzBiSKHYHGJkI+HzYN1RYRkVNQ4RwBd2UVO2beSZ/mKtwaqi0iIl3I3LlzmTFjBtu2bQsfW7x4Mc899xx/+tOfDEzW9XnragHU4ywiIqekvRciYLbZAMjw1GiotoiIdCn5+fnU1dVxyy238NJLL/H666/z/PPP88wzzzBixAij43Vpvto6APU4i4jIKalwjoAtJRmz3U6qv55mFc4iItLF/PznP6e2tpZ/+Zd/wWQy8dxzz5Gbm2t0rC7Pe7Rwjju6RaaIiEhbVDhHwGQy4cjMIKWmgSav5jiLiIixnnvuueOO9ezZk/j4eEaNGsXGjRvZuHEjAL/85S87O17M8NUd63HuaXASERHp6lQ4R8iRkUFK5Xaq1eMsIiIGe+GFF0543Gw2s3nzZjZv3gy0PPhV4dw2b20tJqsVa2Ki0VFERKSLU+EcIUdmBkkbP8Xt8RkdRUREurm1a9caHeGs4Kurw5acjMlkMjqKiIh0cSqcI+TIzMAaChA8csToKCIiIh2mrKyMgoIC6urqSE5OpqioiAEDBrQ6Z8WKFTz//POYzWaCwSA33HADP/vZzwD4/e9/z0svvUR6ejoAF154IYWFhQA0Nzfzn//5n2zduhWLxcLs2bO5/PLLO/XznYz2cBYRkUipcI6QPSMDAPORWoOTiIiIfMfr9fLCCy/wzjvvcPjwYc455xx++ctfcskll0T0/sLCQqZMmUJ+fj6rVq1i7ty5LF26tNU548eP57rrrsNkMtHQ0MDEiRO5+OKLGTp0KACTJk1i9uzZx137mWeeITExkXfeeYddu3Zx00038fbbb5OQkHD6H7wD+OrqiOvVy+gYIiISA7SPc4QsDgcAgWa3wUlERERa7N69m6uvvppvvvmGmTNn8uSTT3L11Vfzn//5nxEN566urqa0tJS8vDwA8vLyKC0tpaamptV5iYmJ4eHMbrcbn88X0fDmN998kxtvvBGAAQMGkJubywcffBDtxzxj1OMsIiKRUo9zhMxxcQAEvF6Dk4iIiIDH42H69OlMnz6dyZMnh48PGjSI/v378+tf/5of//jHFBUVceeddxIfH3/cNSoqKsjIyMBisQBgsVhIT0+noqKC1NTUVue+9957LFy4kD179nD33XeTnZ0dbnvjjTf46KOP6N27N3feeSff+973ACgvL6dPnz7h81wuFwcOHOjQ30N7hQIBfEeOaA9nERGJiArnCB0rnIMqnEVEpAt4+eWX6devH5MnT2b69Ol4PJ5W7WVlZdTV1VFdXc2SJUuYOXPmad1v3LhxjBs3jvLycu644w7Gjh3LwIEDmTx5Mrfddhs2m41169YxY8YMVq9eTUoH7Y28ZcuWDrkOQElJSfjnUEMDBIMcqK/n0N8d76pKYiBjW5TdOLGcX9mNoextU+EcIbNdhbOIiHQd77zzDjfddBMAP/rRj3jqqae46aabiI+P589//jO/+MUviI+P5xe/+AUzZsw4YeHscrmorKwkEAhgsVgIBAJUVVXhcrnavG9WVhbDhw/n/fffZ+DAgfTu3Tvc9sMf/hCXy8X27du5+OKLycrKYv/+/eHe64qKiojnXh+Tm5uL3W6P6j0nUlJSwqhRo8KvG8t28Rlw3sgRpP3d8a7oH7PHEmU3TiznV3ZjdPfsHo/npA9rNcc5QmZbS+Ec8vkIBEMGpxERke5u9+7dDBo0CGiZSzx//nxuv/12fv7zn7NkyRJWrlyJ2WwmJyeHgwcPHjdvGSAtLY2cnByKi4sBKC4uJicn57hh2jt27Aj/XFNTw4YNGxgyZAgAlZWV4bavvvqK/fv3c+655wIwYcIEli1bBsCuXbv48ssvGTNmTAf+FtrPW9uy2KeGaouISCTU4xyhY0O1raEAHq+feIfN4EQiItLdHRueXVZW1qqXuHfv3hw5coS6ujp6HV01OhAInPAa8+bNo6CggMWLF5OUlERRUREA06dP56677mL48OEsW7aMdevWYbVaCYVCTJ06lUsvvRSAhQsXsnXrVsxmMzabjQULFoR7oadNm0ZBQQFXXnklZrOZ3/zmNyQmJp6x30c0fHWHAbAl9zQ4iYiIxILTLpx9Ph8229lfRB4bqm0NBXB7AyqcRUTEUOeeey47duxgxIgRjBw5kieeeIIHHngAp9PJokWLyMzMpFevXpSVlWG328MF9D8aNGgQy5cvP+74kiVLwj/PmTOnzRzHCu0TiY+P54knnojiU3Uef2MDANYuUsiLiEjXFtVQ7aVLl7JmzZrw6zlz5jBy5EjGjx/Pzp07OzxcV2I++nDAFvTj9vgNTiMiIt3duHHjwsOg582bh8fjYezYsVx00UWsX7+e3//+9wCsXLmSyy+/PKLto7oTf0MjANYTrDYuIiLyj6IqnF944YXwvKeNGzfy5ptv8rvf/Y6cnJyTPnE+G5jMZkJmC5ZQgGYVziIiYrDJkydTVVXFK6+8Qnp6Os899xyffvopn3zyCatWrWLYsGF88cUXvPTSS8yYMcPouF2Ov7ERS3w8pqNbcYmIiJxMVEO1Kysr6du3LwBr165lwoQJ/OQnPyE7O5spU6ackYBdSchqxXZ0qLaIiIiRHA4HixYtYvr06ZSXl3PLLbeQlJQEgN/v57XXXuPRRx9l3rx54UXE5Dv+hkasCeptFhGRyERVOCcmJlJdXY3L5WL9+vVMmzat5SJWK95usE1TyGrFqh5nERHpInJycnj11VdZuHAh48aNIysrC7vdTllZGTk5OTz99NOMGDHC6JhdUqCxUfObRUQkYlEVzj/84Q+5//77GTZsGHv27GHs2LEAbN++PdwTfTYzHS2c3V4VziIi0jVkZmayYMECmpub2bVrFz6fj379+pGSkmJ0tC7N39CAJSHB6BgiIhIjoprjXFhYyIUXXkhNTQ2PP/44yUf3PiwtLeWaa645IwG7FKsVazCgxcFERKTLcTqd5OTkMGLECBXNEfA3NmJV4SwiIhGKeqj2/ffff9zxu+66q8MCdWUmmxWr20+zR3OcRUTEWLW1tfzlL38JT5u69dZbcbvd4XaLxcKjjz4aXtRTWmuZ46zCWUREIhNVj/O3337batupdevWcc899/DHP/6RQODsLyZNNpuGaouISJfw5z//mW+//Tb8euPGjWRmZjJ48GAGDx7MoUOH+J//+R8DE3Zt/sZGrIkqnEVEJDJRFc5z5szhq6++AqCiooIZM2Zw+PBhXnzxRR577LEzErArMdm0OJiIiHQNb7/9Nvn5+a2O3Xnnndx///3cf//9/OpXv+L99983JlwXF/T7CbrdmuMsIiIRi6pw3rlzJ8OGDQNgzZo1jBgxgiVLlrBgwQLeeOONMxKwKzFZrcQR1HZUIiJiuH379nHOOeeEX2dnZxMXFxd+PWTIEHbv3m1EtC4v0NQEoFW1RUQkYlEVzoFAAJvNBsDHH3/MZZddBkD//v05dOhQx6framxWbGhxMBERMZ7H4+HIkSPh16+88goZGRnh142NjUbEign+hgYA7eMsIiIRi6pwHjJkCC+//DKbNm3i448/ZsyYMQBUVlZ2jxU8rTZsGqotIiJdQL9+/di6dWub7V9++WW32CqyPfyN6nEWEZHoRFU433PPPSxfvpx//dd/5ZprriE7OxuAtWvXMmLEiDMSsCsx2Y5uR6Wh2iIiYrArr7ySJ5544oQjviorK3nyySe58sorDUjW9X3X46w5ziIiEpmotqO66KKL+Pjjj2loaKBnz57h4zfeeCNOp7PDw3U5ViuWkF89ziIiYrhp06bx9ttvc9VVV5Gfn8+AAQOAlvVI/vrXv5KVlcUtt9xibMguKnB0GLsWBxMRkUhFVThDy76QDoeDb775BpPJRP/+/bvPUDCrFUvAr+2oRETEcAkJCbz00ks8+uijvPHGG+H5zklJSVx77bX8x3/8BwkqDE/If7Rw1nZUIiISqagKZ7/fz6OPPsqLL76Iz+cjFAoRFxfH1KlTmTVrVnjhsLOVyWrFHAricXuNjiIiIkJSUhLz589n3rx51NTUAJCamorJZDI4WdfmbzhaOOvBgoiIRCiqwvmRRx7hjTfeYP78+YwaNQqATZs2sXDhQkKhELNnzz4jIbuMow8GvM0qnEVExFgNDQ28++67XHHFFSQmJpKWlhZuq6+v57333uOqq64iPl4rR/8jf2Njy8Nwu93oKCIiEiOiWhysuLiY3/72t/zzP/8z/fv3p3///lx33XU8+OCDvP7662cqY9dhtQDg93gMDiIiIt3dK6+8wurVq0k8wcrQPXr04M033+Tll182IFnX529oxJoQr555ERGJWFSFc319Pf369TvueL9+/VrtJXnWsrb0OPvdHkKhkMFhRESkO1u9ejU33XRTm+033XQTb7zxRicmih2BxkYsCdqKSkREIhdV4Tx06FBeeOGF444vXbqUoUOHnvL9Ho+HwsJCrrrqKiZOnMj9998PwN/+9jcmTZpEfn4+1157LW+//Xb4PWVlZdx4442MHz+eG2+8kV27dkUTuUOZbC0j2y3BAF5/0LAcIiIiu3fvZvDgwW22n3feeezZs6cTE8UOf0OD5jeLiEhUoprjfO+993Lrrbeyfv16LrjgAgA+++wzqqqqWLJkySnf/8gjj2C321mzZg0mk4lDhw4RCoW47777ePHFFxkyZAjbtm3jpz/9KVdccQVms5nCwkKmTJlCfn4+q1atYu7cuSxdurR9n/Z0HZ3jbAv5cXv82G0WY3KIiEi3FwqFqK6uJisr64Tt1dXVBIN6yHsi/sYmragtIiJRiarH+aKLLuKtt95iwoQJNDU10dTUxIQJE3jmmWdO2BP99xobG1m5ciUzZ84Mzynq1atXSwizmfr6eqBlOHh6ejpms5nq6mpKS0vJy8sDIC8vj9LS0vDKoZ3OFgdAXNCnvZxFRMRQQ4YMYd26dW22f/jhhyftke7O/I3qcRYRkehEvY9zRkYGs2bNanVs27ZtrYZXn8jevXtJTk7mySefZMOGDSQkJDBz5kxGjx7NY489xowZM4iPj6exsZGnn34agIqKCjIyMrBYWnp2LRYL6enpVFRUkJqaGm3002aytxTOtqAftzfQ6fcXERE55vrrr+e3v/0t5513HldccUWrtnfffZenn36aX//616e8TllZGQUFBdTV1ZGcnExRUREDBgxodc6KFSt4/vnnMZvNBINBbrjhBn72s58BsGjRIlavXo3ZbMZmszFr1izGjBkDQEFBAevXryclJQWACRMmcPvtt3fApz89gcZG9TiLiEhUoi6c2ysQCLB3716GDRvG7Nmz+fzzz7ntttt45513+OMf/8jixYsZNWoUJSUl/OpXv+rQBU22bNnSMReKaxmqHRfy8dnnW6guj61tLEpKSoyO0G7KboxYzg6xnV/ZjRFL2W+44QY2bNjAv//7v3PuuecycOBAAHbs2MHu3bu5+uqrueGGG055nUimRI0fP57rrrsOk8lEQ0MDEydO5OKLL2bo0KGMGDGCm2++GafTybZt25g6dSofffQRDocDgFtvvZWpU6d2/C+gnUKhEP6GRizqcRYRkSh0WuHscrmwWq3hYdcjR44kJSWFsrIyqqqqwvtCjxo1CqfTyY4dO+jTpw+VlZUEAgEsFgtsykb6AAAgAElEQVSBQICqqipcLldU987NzcXeAXs1bnpvLQBxQT/nnHse38tOP+1rdpaSkpLw7zjWKLsxYjk7xHZ+ZTdGR2T3eDwd97A2Ar/73e/48Y9/THFxMbt27SIUCjFw4EDuuusufvKTn5zy/cemRD333HNAy5SoBx54gJqamlYju/5+yyu3243P5wtPuzrWuwyQnZ1NKBSirq6OzMzMjvqYHSro8RAKBDRUW0REotJphXNqaiqXXHIJ69at49JLL6WsrIzq6moyMzM5cOAAO3fuZODAgezYsYPq6mr69+9PcnIyOTk5FBcXk5+fT3FxMTk5OYYM0wa+63EO+nB7NcdZRESM95Of/CSiIvlEopkS9d5777Fw4UL27NnD3XffTXZ29nHXW7lyJf37929VND/33HMsW7aMfv36cffddzNo0KB2Ze0o/oZGAA3VFhGRqERUON92220nbW9sbIzoZvPnz2fOnDkUFRVhtVpZsGABvXv3Zt68ea0WDXvooYdITk4GYN68eRQUFLB48WKSkpIoKiqK6F5nxNFe67ign2aP5jiLiIjxGhoaWL9+PXv37sVkMtG/f3++//3vt+ol7gjjxo1j3LhxlJeXc8cddzB27Njw8HCATz75hMcff5xnn302fGzWrFn07t0bs9nMypUrueWWW3j33XfDhXokOrIHv6SkhGBVFQB7KivZH0ND82NpGsE/UnbjxHJ+ZTeGsrctosL52KIeJ2vv27fvKa/Tr1+/E66+fe2113Lttdee8D2DBg1i+fLlkcQ840wWC1gs6nEWEZEuYfXq1cybN48jR460Op6UlMT8+fO5+uqrT/p+l8sV9ZSorKwshg8fzvvvvx8unDdv3sy9997L4sWLWxXTGRkZ4Z8nTZrEww8/zIEDB+jTp0/En7GjplsdG4p/pPQrvgQGDx9OyvcuOO3rdobuPgXCKLGcHWI7v7Ibo7tnP9V0q4gK54cffvi0QpxNLE4ncSEfbm1HJSIiBvr666+57777GD9+PNOmTeO8884jFAqxfft2nn32We69914GDhx4wiHVx6SlpUU0JWrHjh3hIdY1NTVs2LCBq666CoAvvviCWbNm8cQTT3D++ee3el9lZWW4eP7www8xm82timkjBNxuoOX7XEREJFKdNsf5bGF1Oolza6i2iIgY64UXXmDMmDE8+uijrY7n5uaycOFCbr/9dl544QUefPDBk16nrSlR06dP56677mL48OEsW7aMdevWYbVaCYVCTJ06lUsvvRRomYbldruZO3du+JoLFiwgOzub2bNnU11djclkIjExkaeeegqr1dh/egQ9HgAsHdCLLSIi3YcK5yhZnA4cbr+GaouIiKE2bdrEnDlz2mz/6U9/ykMPPXTK67Q1JWrJkiXhn092nxUrVrTZ9vzzz5/y/p0t4PECYI6LMziJiIjEErPRAWKNxenEgZ9mDdUWEREDVVZWnnSF6oEDB1JZWdmJiWJD0NvS42xWj7OIiERBhXOUzA4H9pAft4Zqi4iIgZqbm3E4HG22OxwO3Efn88p3jg3VNtvV4ywiIpHTUO0otSwOpqHaIiJivK+//pqePXuesK22traT08SGoIZqi4hIO6hwjpLF4cAW8GmotoiIGG7atGmEQqE2200mUyemiQ2BYz3OKpxFRCQKKpyjZHE6sWkfZxERMdh7771ndISYFPR6McfF6aGCiIhERYVzlCxOB1a/V9tRiYiIoRISEoyOEJOCHq8WBhMRkaipcI6SxenEHAzgcXuMjiIiIt3Y97///VP2mppMJkpLSzspUWwI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eX1fS+ubQvzfFdvBgnEjy+ls3sWF536JlesbCIXj/HXVLi4YN4T2UJS9TSHqqkqpP9DFiKFFLPn7drbuaWdQaS7jz6zgL//YQdL9qCSdeXoJG3e0UJDrwxjo7I5hWzCwNJfmjgjmwzPwHz+z/0k5jiGWMFjGUFFegN/nsKO+A4yhtjJIW8xmf2s3//2/RlPubznlzjgDbNu2jblz59LR0UFBQQHz58+nqqqKG264gZtvvpnRo0fzjW98g7179/Y2xAALFiygpqaGa665hubmZizLIi8vj9tvv52xY8cC0NTUxG233UZ9fT1+v5+f//znfPGLXzyqXMdrLI0xrPzGldhfnsCXb//fn3k/6aTXs/TI5uyQ3fmVPT1O9ew64ywiIkftcF/CV1mWR2XZ4f/+bWVZHv/99Y+W3b777l48js35Y3vOdF/yleH9Ptaks4fSFYmTF/BiWRaTzh6CMVBamIPP65AX8LJi3V5qh5dSUphDfVOIsqIAOX4POxs6WLZqFz6PzZgRZeT4HELhOB2hKLkBL16PQ1c4zobtzQwuy6W8OMjvlmzE67GZ/c2epu7/LP0PJQVeTh88kDWb9jNtzKlZEqurq3n++ecP2f7kk0/2Xn7hhRf6vf/vfve7fm8rKytLefsJYUzPqqqhg9ObQ0REstqp+VuCiIiknW1b5Ad9vddHDC0+5GcuGDek9/LQivzey8MHFXDj5aOP+BgXfvGj+08c0/fb6i+eMKzP9XfffffIoSXrWLbNWQ8+oOMrIiLH5IT9HWcRERERERGRbKTGWURERERERCQFNc4iIiIiIiIiKahxFhEREREREUlBjbOIiIiIiIhICmqcRURERERERFJQ4ywiIiIiIiKSghpnERERERERkRQ86Q7weTLGABCLxY7bPqPR6HHb14mm7Omh7OmTzfmVPT2ONfvBenOw/shnpxrel7KnRzZnh+zOr+zpcSpnP1INt8xJXN07OzvZvHlzumOIiMgpZuTIkeTn56c7RlZTDRcRkXTor4af1I2z67p0dXXh9XqxLCvdcURE5CRnjCEej5Obm4tt69NQx0I1XERETqQj1fCTunEWEREREREROVZ6O1xEREREREQkBTXOIiIiIiIiIimocRYRERERERFJQY2ziIiIiIiISApqnEVERERERERSUOMsIiIiIiIikoIaZxEREREREZEU1Dgf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RbKLlmqLZDGfz0dZWVmff0VFRUDPEqw//OEP3HjjjZx11llMmjSJP//5z33uv2nTJq655hrGjBnDOeecw9y5c+ns7OzzMy+99BIzZsygrq6OiRMnMmfOnD63t7e3c/PNNzN27FimTJlyyGM89thjTJo0ibq6Os4991xuv/32z2EkREREsotquEh2UeMschJ79NFHmTx5MosXL+ab3/wmc+bMYf369QB0d3dz3XXXEQwGef7553nsscdYu3Yt8+bN673/okWLuPPOO/n617/Oyy+/zK9//WtGjBjR5zEWLlzYW2wvvfRS7rjjDurr6wFYunQpTz/9NHfddRfLli3jiSeeYMyYMSduAERERLKUarhIZtFSbZEstmLFCsaNG9dn26xZs7jtttsAuOiii7jqqqsA+P73v8+qVav4/e9/z0MPPcSSJUsIh8MsWLCAvLw8AO6++26+/e1vs2vXLoYNG8bjjz/Od77zHb773e/27r+urq7P482cOZOZM2cC8MMf/pBnnnmG1atXM3PmTOrr6ykrK+Pcc8/F6/VSWVnJ6NGjP7fxEBERyRaq4SLZRY2zSBYbP34899xzT59t+fn5vZfHjh3b57axY8fyt7/9DYBt27ZRU1PTW3ABxo0bh23bbN26lby8PBobG/nKV76SMkNNTU3vZY/HQ0lJCS0tLQBMmzaNZ555hilTpnDeeedx/vnnM2XKFHw+32f7D4uIiJwkVMNFsosaZ5EsFggEGDZs2HHfr2VZR/2zHk/flxHLsnBdF4BBgwbx2muvsXLlSt566y3mz5/PwoULee655wgGg8c1s4iISDZRDRfJLvqMs8hJ7L333jvkelVVFQDV1dVs3ryZUCjUe/vatWtxXZfq6mpKS0upqKhg5cqVx5TB7/fz1a9+lXnz5vGnP/2JLVu2sGbNmmPap4iIyMlONVwks+iMs0gWi8ViNDU19dnmOA4lJSUALFu2jNGjR3POOeewdOlSVq5c2fv3IWfMmMEjjzzCnDlzuPnmm+no6ODOO+/k4osv7n0H/Hvf+x73338/AwYM4MILLyQSibBy5Uquvfbao8r34osvkkwmGTNmDMFgkFdffRWv1/u5vMMuIiKSTVTDRbKLGmeRLPbWW29x3nnn9dlWUVHBm2++CcDs2bNZunQp9957LyUlJdx///2934gZCAR46qmnuO+++7jiiivw+/1MmTKFO+64o3dfs2bNwuv18tvf/paHHnqIwsJCLrjggqPOV1BQwJNPPsn8+fNJJBJUV1fz6KOPMnTo0OPwvxcREclequEi2cUyxph0hxCR46+mpoaHH36YadOmpTuKiIiIfAqq4SKZR59xFhEREREREUlBjbOIiIiIiIhIClqqLSIiIiIiIpKCzjiLiIiIiIiIpKDGWURERERERCQFNc4iIiIiIiIiKahxFhEREREREUlBjbOIiIiIiIhICmqcRURERERERFL4/4kqWrF0k0gpAAAAAElFTkSuQmCC", "text/plain": [ "
" ] @@ -1769,7 +1755,7 @@ "outputs": [ { "data": { - "image/png": "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DqXeqHBsgjp16kR2djaVlZUAVFZWkpOTU6fby6RubufWbDYzbtw4jhw5QqdOnardypSXl4eDg0OT+IvPo8jWca9zouHd7Ry4PV3nQf2Kj4/nu+++47/+679wcHCwmWPlv37dmXv417Hv5uZGRERErcf+pUuXdM2pJ6NGjeLgwYN07NhR1/1Gdjv3169f13W/gR06dIizZ88yYsQIgoODuXLlChMnTuS7775rttd8FY5NULt27fDz82P79u0AbN++HT8/P92a0UCKi4spKCgAwDAM/vKXv+Dn54e/vz8lJSVkZGQAkJyczMiRI+0Z6iPN1nGvc6Jh1XYOADoP6tlHH31EZmYmK1euxGw2A7ZzrPzXn7vl/saNG5SUlABQUVHBrl27rMd+UFAQJ06csI7kmZyczL//+7/bJfbmrqioqNptvmlpaXh4eOi63whqy72zs7Ou+w1s8uTJfPHFF6SlpZGWlkbHjh354x//yJtvvtlsr/kmwzAMewchNZ09e5bo6Gjy8/Nxd3cnPj6eHj162DusR9L333/P22+/TWVlJVVVVfj4+PCb3/yGJ554giNHjjBv3jxKS0vp0qULv//973n88cftHXKz9/7777N7926uXbvGY489hqenJ//7v/9r87jXOVE/7pb7NWvW1HoOADoP6sk///lPQkND6datGy4uLgA8+eSTrFy50maOlf+HV1vu33zzTebOnYvJZKKiooJ+/foRExODq6srAHv27OH3v/89VVVV+Pn5sWjRItq0aWPPXWmWrl27xltvvcXNmzdxcHDAw8OD2bNn06tXL133G1htuXd3d9d1v5EFBwezZs0aevbs2Wyv+SocRURERERExCbdqioiIiIiIiI2qXAUERERERERm1Q4ioiIiIiIiE0qHEVERERERMQmFY4iIiIiIiJikwpHERGRZsTX15edO3faOwwREWlhnOwdgIiISHMRHR3N1q1ba0zv06cPGzZssENEIiIijUOFo4iISB0MGTKExYsXV5vWqlUrO0UjIiLSOHSrqoiISB2YzWbat29f7Z+npydw6zbStWvXMnnyZPr06cPw4cNJSUmptnxWVhavv/46AQEBPPvss0RHR1NQUFBtnq1btxIWFoa/vz9Dhgxh9uzZ1dpv3LjBlClT6Nu3LyNGjKixjRUrVjB8+HD8/f157rnnmDVrVgNkQkREWhIVjiIiIvVo+fLlBAcHs23bNsaMGcPs2bM5ceIEAMXFxUycOJE2bdqwceNGVqxYwdGjR4mJibEun5yczNy5cxk9ejSfffYZ//3f/81Pf/rTattYuXKltWB86aWXmDNnDpcuXQJg165dfPzxx8ybN4/du3ezZs0aAgICGi8BIiLySNKtqiIiInVw4MAB+vXrV23auHHjmDlzJgAvvvgir776KgBRUVEcPHiQP/3pT3zwwQds376dmzdvsnjxYtzc3ACIi4tjwoQJfPfdd3Tt2pVVq1bxH//xH7zxxhvW9fv7+1fbnsViwWKxAPDOO++QlJTEoUOHsFgsXLp0ifbt2/Pcc8/RqlUrOnfuTO/evRssHyIi0jKocBQREamDAQMGMH/+/GrT2rZta/3ct2/fam19+/Zl//79AJw9exZfX19r0QjQr18/HBwcOHPmDG5ubmRnZzN48GCbMfj6+lo/Ozk54eXlRV5eHgAjR44kKSmJESNGMHToUIKCghgxYgRms/nBdlhERAQVjiIiInXSunVrunbtWu/rNZlM9z2vk1P1X98mk4mqqioAOnXqxM6dO0lPT+fLL78kPj6elStXsmHDBtq0aVOvMYuISMuhZxxFRETq0bFjx2p879GjBwA+Pj6cPn2awsJCa/vRo0epqqrCx8eHdu3a0aFDB9LT0x8qBmdnZ1544QViYmLYtGkT//znPzly5MhDrVNERFo29TiKiIjUQVlZGVevXq02zdHRES8vLwB2795N7969efbZZ9m1axfp6enWdzyGhYWxbNkyZs+ezZQpU8jPz2fu3Ln87Gc/s/Zi/vKXv2ThwoU8/vjjPP/885SUlJCenk5kZOR9xbdlyxYqKysJCAigTZs27Nixg1atWjVIL6mIiLQcKhxFRETq4Msvv2To0KHVpnXo0IG//e1vALz99tvs2rWL999/Hy8vLxYuXGgd1bR169b88Y9/ZMGCBURERODs7MyIESOYM2eOdV3jxo2jVatWfPLJJ3zwwQd4eHgwbNiw+47P3d2dhIQE4uPjqaiowMfHh+XLl/PUU0/Vw96LiEhLZTIMw7B3ECIiIo8CX19fli5dysiRI+0dioiISL3SM44iIiIiIiJikwpHERERERERsUm3qoqIiIiIiIhN6nEUERERERERm1Q4ioiIiIiIiE0qHEVERERERMQmFY4iIiIiIiJikwpHERERERERsUmFo4iIiIiIiNj0/wD+rKcsj1VpnwAAAABJRU5ErkJggg==\n", + "image/png": "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DqXeqHBsgjp16kR2djaVlZUAVFZWkpOTU6fby6RubufWbDYzbtw4jhw5QqdOnardypSXl4eDg0OT+IvPo8jWca9zouHd7Ry4PV3nQf2Kj4/nu+++47/+679wcHCwmWPlv37dmXv417Hv5uZGRERErcf+pUuXdM2pJ6NGjeLgwYN07NhR1/1Gdjv3169f13W/gR06dIizZ88yYsQIgoODuXLlChMnTuS7775rttd8FY5NULt27fDz82P79u0AbN++HT8/P92a0UCKi4spKCgAwDAM/vKXv+Dn54e/vz8lJSVkZGQAkJyczMiRI+0Z6iPN1nGvc6Jh1XYOADoP6tlHH31EZmYmK1euxGw2A7ZzrPzXn7vl/saNG5SUlABQUVHBrl27rMd+UFAQJ06csI7kmZyczL//+7/bJfbmrqioqNptvmlpaXh4eOi63whqy72zs7Ou+w1s8uTJfPHFF6SlpZGWlkbHjh354x//yJtvvtlsr/kmwzAMewchNZ09e5bo6Gjy8/Nxd3cnPj6eHj162DusR9L333/P22+/TWVlJVVVVfj4+PCb3/yGJ554giNHjjBv3jxKS0vp0qULv//973n88cftHXKz9/7777N7926uXbvGY489hqenJ//7v/9r87jXOVE/7pb7NWvW1HoOADoP6sk///lPQkND6datGy4uLgA8+eSTrFy50maOlf+HV1vu33zzTebOnYvJZKKiooJ+/foRExODq6srAHv27OH3v/89VVVV+Pn5sWjRItq0aWPPXWmWrl27xltvvcXNmzdxcHDAw8OD2bNn06tXL133G1htuXd3d9d1v5EFBwezZs0aevbs2Wyv+SocRURERERExCbdqioiIiIiIiI2qXAUERERERERm1Q4ioiIiIiIiE0qHEVERERERMQmFY4iIiIiIiJikwpHERGRZsTX15edO3faOwwREWlhnOwdgIiISHMRHR3N1q1ba0zv06cPGzZssENEIiIijUOFo4iISB0MGTKExYsXV5vWqlUrO0UjIiLSOHSrqoiISB2YzWbat29f7Z+npydw6zbStWvXMnnyZPr06cPw4cNJSUmptnxWVhavv/46AQEBPPvss0RHR1NQUFBtnq1btxIWFoa/vz9Dhgxh9uzZ1dpv3LjBlClT6Nu3LyNGjKixjRUrVjB8+HD8/f157rnnmDVrVgNkQkREWhIVjiIiIvVo+fLlBAcHs23bNsaMGcPs2bM5ceIEAMXFxUycOJE2bdqwceNGVqxYwdGjR4mJibEun5yczNy5cxk9ejSfffYZ//3f/81Pf/rTattYuXKltWB86aWXmDNnDpcuXQJg165dfPzxx8ybN4/du3ezZs0aAgICGi8BIiLySNKtqiIiInVw4MAB+vXrV23auHHjmDlzJgAvvvgir776KgBRUVEcPHiQP/3pT3zwwQds376dmzdvsnjxYtzc3ACIi4tjwoQJfPfdd3Tt2pVVq1bxH//xH7zxxhvW9fv7+1fbnsViwWKxAPDOO++QlJTEoUOHsFgsXLp0ifbt2/Pcc8/RqlUrOnfuTO/evRssHyIi0jKocBQREamDAQMGMH/+/GrT2rZta/3ct2/fam19+/Zl//79AJw9exZfX19r0QjQr18/HBwcOHPmDG5ubmRnZzN48GCbMfj6+lo/Ozk54eXlRV5eHgAjR44kKSmJESNGMHToUIKCghgxYgRms/nBdlhERAQVjiIiInXSunVrunbtWu/rNZlM9z2vk1P1X98mk4mqqioAOnXqxM6dO0lPT+fLL78kPj6elStXsmHDBtq0aVOvMYuISMuhZxxFRETq0bFjx2p879GjBwA+Pj6cPn2awsJCa/vRo0epqqrCx8eHdu3a0aFDB9LT0x8qBmdnZ1544QViYmLYtGkT//znPzly5MhDrVNERFo29TiKiIjUQVlZGVevXq02zdHRES8vLwB2795N7969efbZZ9m1axfp6enWdzyGhYWxbNkyZs+ezZQpU8jPz2fu3Ln87Gc/s/Zi/vKXv2ThwoU8/vjjPP/885SUlJCenk5kZOR9xbdlyxYqKysJCAigTZs27Nixg1atWjVIL6mIiLQcKhxFRETq4Msvv2To0KHVpnXo0IG//e1vALz99tvs2rWL999/Hy8vLxYuXGgd1bR169b88Y9/ZMGCBURERODs7MyIESOYM2eOdV3jxo2jVatWfPLJJ3zwwQd4eHgwbNiw+47P3d2dhIQE4uPjqaiowMfHh+XLl/PUU0/Vw96LiEhLZTIMw7B3ECIiIo8CX19fli5dysiRI+0dioiISL3SM44iIiIiIiJikwpHERERERERsUm3qoqIiIiIiIhN6nEUERERERERm1Q4ioiIiIiIiE0qHEVERERERMQmFY4iIiIiIiJikwpHERERERERsUmFo4iIiIiIiNj0/wD+rKcsj1VpnwAAAABJRU5ErkJggg==", "text/plain": [ "
" ] @@ -1883,4 +1869,4 @@ }, "nbformat": 4, "nbformat_minor": 1 -} \ No newline at end of file +} diff --git a/examples/02_model_collaborative_filtering/standard_vae_deep_dive.ipynb b/examples/02_model_collaborative_filtering/standard_vae_deep_dive.ipynb index 1db498ab83..0512a434cd 100644 --- a/examples/02_model_collaborative_filtering/standard_vae_deep_dive.ipynb +++ b/examples/02_model_collaborative_filtering/standard_vae_deep_dive.ipynb @@ -38,20 +38,6 @@ "# 0 Global Settings and Imports" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "pzWbu_nfd1GG" - }, - "outputs": [], - "source": [ - "# download the necessary libraries \n", - "! pip install tensorflow==2.2.0-rc1\n", - "! pip install keras==2.3.1\n", - "! pip install papermill" - ] - }, { "cell_type": "code", "execution_count": null, @@ -1315,7 +1301,7 @@ "outputs": [ { "data": { - "image/png": "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o9FYrF+zZg1Go9EiMUxKSmLv3r106tSJ3bt3ExUVxeuvv17d21Atpd9PAIMHD2bRokV89NFHNG7cuMz7auvWreTk5NC5c2d27drFnj176NKlC46Ojhb3xtwSWLNmzUrfz2bFxcX885//xMnJiZ9++gk3NzdlXY8ePZg0aRIzZsygadOm1KtXz2LfDh068PXXXzNgwABsbGxu6T48/vjjbNq0iby8POzt7ZXla9eupXv37hW2XDdu3JjatWuXu65JkyYWzx0dHdHpdJXej9LHe/TRR7l8+TIrV67kzTffLPMlRmlr1qxh0aJFvP7662Ves549e/Lss8/i7OwMwH/+8x+6du1q0WOgXbt2DBkypMLeK3fSwoULadKkCXPnzrX4kqh///7K+W/8Isvd3b3M759ZTEwMM2bMoGvXrnzxxRfKfWrdujXdu3dnyJAhTJo0ifXr11v83jk4OCjHa968OWFhYTz22GOsXLmSZs2a0b59ewYNGsRnn31GeHg4vr6+GAwG3nzzTWrWrGnxBacQQjxIpKu2EOKho1aradSoEQkJCWXWbd26lezsbIYNG0bXrl3Zvn17mW7TlRk+fDienp588cUXtxzf+PHjAcq0Et3o+++/x2g08tZbb1kkzWYajYannnqqWudMSkri999/p1evXgwePJjU1NRyu+AC2NnZMW7cODZv3nzLXS5VKhWvvfYaNWrU4Pvvv6902/79+3Pt2rVyu8OuWbOGsLAwatWqZbHMYDAwceJEwsLCWLduHXq9/pbivBkjRoygSZMm/PDDD2XWrV69GhcXF2bOnImtrS2rV6++I+fcsmULly9fZvLkyRZJM5je59OnT8dgMJR7j1966SWSk5P58ccfb/n83bp1A2Dz5s3KskOHDnHlyhX69u17y8e9XU2aNCE/P59r165Vut23335Lw4YNy+15AhASEoKfnx8AmZmZFX6RVVlyfqdkZmbi7u5ukTTfzvl/+OEHDAYD06dPL7O/m5sbkydP5tKlS2W6q9/Ix8cHd3d3i7+nU6dOxdHRkbfffhuA//73vxw7dowPP/ywTG8gIYR4UEjiLIR4KF29etUi2TJbvXo1zs7ORERE0K9fP4qLi9mwYUO1j2tra8v48ePZsWMHR44cuaXYPD09GT58OD/99BNXr16tcLt9+/YREhJSaat0dZmTzX79+tGjRw9sbGyU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\n", + "image/png": "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o9FYrF+zZg1Go9EiMUxKSmLv3r106tSJ3bt3ExUVxeuvv17d21Atpd9PAIMHD2bRokV89NFHNG7cuMz7auvWreTk5NC5c2d27drFnj176NKlC46Ojhb3xtwSWLNmzUrfz2bFxcX885//xMnJiZ9++gk3NzdlXY8ePZg0aRIzZsygadOm1KtXz2LfDh068PXXXzNgwABsbGxu6T48/vjjbNq0iby8POzt7ZXla9eupXv37hW2XDdu3JjatWuXu65JkyYWzx0dHdHpdJXej9LHe/TRR7l8+TIrV67kzTffLPMlRmlr1qxh0aJFvP7662Ves549e/Lss8/i7OwMwH/+8x+6du1q0WOgXbt2DBkypMLeK3fSwoULadKkCXPnzrX4kqh///7K+W/8Isvd3b3M759ZTEwMM2bMoGvXrnzxxRfKfWrdujXdu3dnyJAhTJo0ifXr11v83jk4OCjHa968OWFhYTz22GOsXLmSZs2a0b59ewYNGsRnn31GeHg4vr6+GAwG3nzzTWrWrGnxBacQQjxIpKu2EOKho1aradSoEQkJCWXWbd26lezsbIYNG0bXrl3Zvn17mW7TlRk+fDienp588cUXtxzf+PHjAcq0Et3o+++/x2g08tZbb1kkzWYajYannnqqWudMSkri999/p1evXgwePJjU1NRyu+AC2NnZMW7cODZv3nzLXS5VKhWvvfYaNWrU4Pvvv6902/79+3Pt2rVyu8OuWbOGsLAwatWqZbHMYDAwceJEwsLCWLduHXq9/pbivBkjRoygSZMm/PDDD2XWrV69GhcXF2bOnImtrS2rV6++I+fcsmULly9fZvLkyRZJM5je59OnT8dgMJR7j1966SWSk5P58ccfb/n83bp1A2Dz5s3KskOHDnHlyhX69u17y8e9XU2aNCE/P59r165Vut23335Lw4YNy+15AhASEoKfnx8AmZmZFX6RVVlyfqdkZmbi7u5ukTTfzvl/+OEHDAYD06dPL7O/m5sbkydP5tKlS2W6q9/Ix8cHd3d3i7+nU6dOxdHRkbfffhuA//73vxw7dowPP/ywTG8gIYR4UEjiLIR4KF29etUi2TJbvXo1zs7ORERE0K9fP4qLi9mwYUO1j2tra8v48ePZsWMHR44cuaXYPD09GT58OD/99BNXr16tcLt9+/YREhJSaat0dZmTzX79+tGjRw9sbGyU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", "text/plain": [ "
" ] @@ -1556,7 +1542,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA84AAAFXCAYAAABz4xf6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3xT9frA8U+SNt10t7QUaClQRst2gDIsIOOyZMhyoChcBS6iXuUqy4nj50QUBAW5KnJZLUNkyFSGAgqUPcrooHumbZIm+f2RJhDapi0USuF5v159Qc75nu95zmna9DnfpTCZTCaEEEIIIYQQQghRJmVNByCEEEIIIYQQQtzOJHEWQgghhBBCCCHskMRZCCGEEEIIIYSwQxJnIYQQQgghhBDCDkmchRBCCCGEEEIIOyRxFkIIIYQQQggh7JDEWQhR60RERFT4FR0dDcCcOXNstkdGRtK3b18WLlyI0Wgss/4DBw4QERFBx44dKS4uLjeGTz75xPp63759RERE0KJFC+Lj40uV79KlC1OnTrW+TkhIICIiguXLl1u3rVq1ioiICDp06EBOTo7N8cXFxURERDBnzpxSdZ85c4b//Oc/REdHExUVRdu2bRkwYACzZ8/mwoULdu6kraKiItq3b09ERAQnTpwos8zjjz9OREQEr7zySql9y5cvJyIigoSEBOu2qVOnWu99s2bNaN++PX379uW1117jr7/+qjCmxYsXExERweHDh8stM2rUKKKjo7l6dcU1a9YQERHBoEGDyjymrPt/Lcv3dPfu3dZt176f2rZty8MPP8xLL73Erl277F7LtGnTiIiI4N133y11joq+LO+dxx9/nJEjR5aqOyUlhTfeeIPo6GgiIyPp2LEjEydOLPO+Wa6hR48e6PV6m30XLlwgIiKCVatW2b2Wq+P+7bffSu1PSEigWbNm5b7Hy/rq0KEDANHR0ZW6J2XVFxkZSY8ePfj444/RarVlxnz199Nix44djB8/no4dO9KyZUs6derEP//5TzZv3mxTbsuWLYwePZqOHTvSqlUrHnroIZ5//nl27txp935V9H4bOXIkjz/+uM22a3/HAPzxxx+MHTuWBx98kKioKLp06cLYsWNZs2YNcOXns6Kvq39GDx8+zKRJk+jUqRORkZFER0cza9YsUlJSSsV5bf1t27Zl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zY8swNRV1TYbHpyun07/SxERaf+Ki4t54403uPHGGwG4+eabqa6u9u23WCw8+uijvgKfDYmNjSU9PZ3Vq1czZcoUVq9eTXp6+nHnZGVl+dZJFxUVsWnTJsaOHUtycjKbNm3yHffkk09SWVnJ3Xff3ZpvtdkMl0vFwUREpMWadSf54YcfMJvNpKWlAbBhwwbefPNNevbsyU033XTSqVkOh4OHHnqIjRs3EhQUxODBg3nggQf46KOPePzxxzEMA8Mw+P3vf8/YsWMBb2uMWbNmUVJSQlRUFPPnz/dLwZFjR5y1xllERNqTf//73/VaR23evJkxY8YQEREBwBdffMGLL77I7bfffsLrzJ07l1mzZrFo0SIiIyN9HTOmTZvGjBkzGDBgAK+99hobNmzAarViGAY33HADw4cPP23vraUMt9pRiYhIyzXrTjJ79mx+/etfk5aWRm5uLrfeeitDhw7lpZdeory8nD/+8Y8nPP+RRx4hKCiINWvWYDKZKCgowDAM/vSnP/HSSy/Rq1cvduzYwbXXXsvFF1+M2Wz2tcaYMmUKK1eu5P7772+wZ+TpphFnERFpr95//33uuuuuettuu+02UlJSAG8xryeeeOKkiXP37t1Zvnz5cdsXL17s+3r27NlNium2225r0nGnm8flwmQ99TXXIiIi0Myq2rt376Zv374ArFmzhoEDB7J48WIWLFjA22+/fcJzKyoqWLFiBTNnzvS1rYiLi/MGYTZTVlYGQFlZGQkJCZjN5ia3xmgLdVW1NeIsIiLtzf79++nSpYvv+969e2O3233f9+rVi7179/ojNL/zTtW2+TsMEREJcM0acXa73dhqE8iNGzcycuRIAFJTUykoKDjhuTk5OURFRbFw4UI2bdpEWFgYM2fO5Oyzz+bvf/87t956K6GhoVRUVPDss88CJ26NcaJ1WqfDsVW1NeIsIiLticPhoLS01FfI69VXX623v6Kiwh9htQuGy62p2iIi0mLNupP06tWLV155hVGjRrFx40buuOMOAPLy8k7a6sLtdpOTk0Pfvn25++672bp1K7fccgsffPAB//jHP1i0aBFDhgwhIyODP/zhDycdwW6O1mhtYbi9ybLF8PDtd9spzQ+8stqBXF4eAjv+QI4dFL8/BXLsENjxB1LsKSkpfPfdd75+yj/2zTffnPFtIxujqdoiItIampU433nn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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA84AAAFXCAYAAABz4xf6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3xT9frA8U+SNt10t7QUaClQRst2gDIsIOOyZMhyoChcBS6iXuUqy4nj50QUBAW5KnJZLUNkyFSGAgqUPcrooHumbZIm+f2RJhDapi0USuF5v159Qc75nu95zmna9DnfpTCZTCaEEEIIIYQQQghRJmVNByCEEEIIIYQQQtzOJHEWQgghhBBCCCHskMRZCCGEEEIIIYSwQxJnIYQQQgghhBDCDkmchRBCCCGEEEIIOyRxFkIIIYQQQggh7JDEWQhR60RERFT4FR0dDcCcOXNstkdGRtK3b18WLlyI0Wgss/4DBw4QERFBx44dKS4uLjeGTz75xPp63759RERE0KJFC+Lj40uV79KlC1OnTrW+TkhIICIiguXLl1u3rVq1ioiICDp06EBOTo7N8cXFxURERDBnzpxSdZ85c4b//Oc/REdHExUVRdu2bRkwYACzZ8/mwoULdu6kraKiItq3b09ERAQnTpwos8zjjz9OREQEr7zySql9y5cvJyIigoSEBOu2qVOnWu99s2bNaN++PX379uW1117jr7/+qjCmxYsXExERweHDh8stM2rUKKKjo7l6dcU1a9YQERHBoEGDyjymrPt/Lcv3dPfu3dZt176f2rZty8MPP8xLL73Erl277F7LtGnTiIiI4N133y11joq+LO+dxx9/nJEjR5aqOyUlhTfeeIPo6GgiIyPp2LEjEydOLPO+Wa6hR48e6PV6m30XLlwgIiKCVatW2b2Wq+P+7bffSu1PSEigWbNm5b7Hy/rq0KEDANHR0ZW6J2XVFxkZSY8ePfj444/RarVlxnz199Nix44djB8/no4dO9KyZUs6derEP//5TzZv3mxTbsuWLYwePZqOHTvSqlUrHnroIZ5//nl27txp935V9H4bOXIkjz/+uM22a3/HAPzxxx+MHTuWBx98kKioKLp06cLYsWNZs2YNcOXns6Kvq39GDx8+zKRJk+jUqRORkZFER0cza9YsUlJSSsV5bf1t27Zl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zY8swNRV1TYbHpyun07/SxERaf+Ki4t54403uPHGGwG4+eabqa6u9u23WCw8+uijvgKfDYmNjSU9PZ3Vq1czZcoUVq9eTXp6+nHnZGVl+dZJFxUVsWnTJsaOHUtycjKbNm3yHffkk09SWVnJ3Xff3ZpvtdkMl0vFwUREpMWadSf54YcfMJvNpKWlAbBhwwbefPNNevbsyU033XTSqVkOh4OHHnqIjRs3EhQUxODBg3nggQf46KOPePzxxzEMA8Mw+P3vf8/YsWMBb2uMWbNmUVJSQlRUFPPnz/dLwZFjR5y1xllERNqTf//73/VaR23evJkxY8YQEREBwBdffMGLL77I7bfffsLrzJ07l1mzZrFo0SIiIyN9HTOmTZvGjBkzGDBgAK+99hobNmzAarViGAY33HADw4cPP23vraUMt9pRiYhIyzXrTjJ79mx+/etfk5aWRm5uLrfeeitDhw7lpZdeory8nD/+8Y8nPP+RRx4hKCiINWvWYDKZKCgowDAM/vSnP/HSSy/Rq1cvduzYwbXXXsvFF1+M2Wz2tcaYMmUKK1eu5P7772+wZ+TpphFnERFpr95//33uuuuuettuu+02UlJSAG8xryeeeOKkiXP37t1Zvnz5cdsXL17s+3r27NlNium2225r0nGnm8flwmQ99TXXIiIi0Myq2rt376Zv374ArFmzhoEDB7J48WIWLFjA22+/fcJzKyoqWLFiBTNnzvS1rYiLi/MGYTZTVlYGQFlZGQkJCZjN5ia3xmgLdVW1NeIsIiLtzf79++nSpYvv+969e2O3233f9+rVi7179/ojNL/zTtW2+TsMEREJcM0acXa73dhqE8iNGzcycuRIAFJTUykoKDjhuTk5OURFRbFw4UI2bdpEWFgYM2fO5Oyzz+bvf/87t956K6GhoVRUVPDss88CJ26NcaJ1WqfDsVW1NeIsIiLticPhoLS01FfI69VXX623v6Kiwh9htQuGy62p2iIi0mLNupP06tWLV155hVGjRrFx40buuOMOAPLy8k7a6sLtdpOTk0Pfvn25++672bp1K7fccgsffPAB//jHP1i0aBFDhgwhIyODP/zhDycdwW6O1mhtYbi9ybLF8PDtd9spzQ+8stqBXF4eAjv+QI4dFL8/BXLsENjxB1LsKSkpfPfdd75+yj/2zTffnPFtIxujqdoiItIampU433nn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", "text/plain": [ "
" ] @@ -1689,7 +1675,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA84AAAFXCAYAAABz4xf6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3xT5RrA8V/SJp20paUtHcwCpbRllFmUVYaC7KWAKILCRUHAAcgUB8sriIiC4AVRhrLK3rKnzLLL7KZ77ya5f4TGxg5ahhV9vp9PP5Bz3vOeJydp0ue8S6HT6XQIIYQQQgghhBCiSMryDkAIIYQQQgghhPg7k8RZCCGEEEIIIYQogSTOQgghhBBCCCFECSRxFkIIIYQQQgghSiCJsxBCCCGEEEIIUQJJnIUQQgghhBBCiBJI4iyEeOZ4eno+9CcgIACAhQsXGm338fGhS5cuLFu2DK1WW2T9Z8+exdPTE39/f/Ly8oqNYf78+YbHp06dwtPTk3r16nH37t1C5Vu3bs3EiRMNj8PDw/H09GTdunWGbRs3bsTT05MmTZqQnJxsdHxeXh6enp4sXLiwUN23bt3io48+IiAgAF9fXxo1akT37t2ZNWsWISEhJVxJY1lZWTRu3BhPT0+uX79eZJnBgwfj6enJ+PHjC+1bt24dnp6ehIeHG7ZNnDjRcO3r1q1L48aN6dKlC5MmTeL8+fMPjWnFihV4enoSFBRUbJmBAwcSEBBAwdUVt2zZgqenJz179izymKKu/5/lv6bHjx83bPvz+6lRo0Z06tSJ999/nyNHjpT4XKZMmYKnpyczZ84sdI6H/eS/dwYPHsyAAQMK1R0dHc2MGTMICAjAx8cHf39/Ro0aVeR1y38OHTp0IDc312hfSEgInp6ebNy4scTnUjDuo0ePFtofHh5O3bp1i32PF/XTpEkTAAICAkp1TYqqz8fHhw4dOjBv3jyys7OLjLng65nv0KFDjBgxAn9/f7y9vWnZsiX/+c9/2Lt3r1G5ffv2MWjQIPz9/alfvz7t2rXj7bff5vDhwyVer4e93wYMGMDgwYONtv35Mwbg9OnTDBs2jOeffx5fX19at27NsGHD2LJlC/DH7+fDfgr+jgYFBTF69GhatmyJj48PAQEBfPzxx0RHRxeK88/1N2rUiFdeeYX9+/cDkJ6eTkBAAAMGDKCo1U6/+eYbvL29uXz5conXSwgh/o5MyzsAIYQoq19++cXo8ahRo/D09GT06NGGbWq12qjM6tWrMTExITk5mY0bN/LFF1+gVCoZOnRoofoDAwMBSEhI4PDhw4YkvDQ0Gg1ff/11oT94yyI1NZWlS5fywQcfPLTs9u3bmTBhAnXq1GH48OHUqFGD3NxcLl++zLp16zh8+DA7d+4s1Xn37t1LWloaoL8GBRP9P9u6dSvDhw+nVq1aD63X3t6e7777DoDMzEzu3LnD1q1beeWVVxgxYgTvvfdescd269aNL774gs2bN1O/fv1C+8PCwjh37hxvv/02CoXCsD3/Nbx27Ro3btwwJFpPSv77KTMzk/DwcHbv3s2bb75J9+7dmTNnDkql8X3prKwsw+uwbds2xo8fj6mpKd7e3kbv59jYWEaNGsWIESOM3nf29vbFxnL9+nXeeOMNLC0teeutt/Dw8CAuLo61a9fyyiuvMHPmzCJvIISFhbF+/foiE/HSsrKyYvPmzTz//PNG2wMDA7G0tCQ9Pb3I4xYsWEDlypWNtpmYmAD65ConJ8ewfcaMGWg0Gj755JNi48ivLz09nb1797JkyRLS09OZOnXqQ5/DrFmzWLFiBS+88AJTp07F0dGRuLg4Dhw4wJgxY9i4cSN169Zl5cqVfP755/Tp04dhw4ZhYWFBWFgYBw8e5OTJk7Ru3fqh53oc+/btY9SoUQQEBDBt2jRsbW2JjIzk2LFjHDp0iO7duzN9+nTD7zDAt99+y6VLlwy/f/mcnJwA/es0adIkGjduzOTJk3FycuL27dssW7aM3bt3s3z5curWrWt0rKenp+G1iIyMZMmSJYwePZo1a9bQoEEDPvvsM9544w1Wr17NoEGDDMfdunWLxYsXM3ToUHx8fJ7WZRJCiKdGEmchxDOnYcOGRo/VajUVK1YstL2gBg0aYGqq/8hr1aoVN27c4Ndffy2UOGdnZ7Nz506aNWvGpUuXCAwMLFPi/Pzzz7Nz505GjBhR6A/OstTx888/M2TIECpVqlRsudu3bzNx4kQCAgKYP3++IfHIr2PYsGFs2LCh1OcNDAzEzs6OatWqsXXrVj744APDNSvIy8uLmJgYFixYUGQL+J+pVCqj18bf35+BAwcyc+ZMlixZgre3Ny+88EKRxzo4ONCqVSu2b9/OxIkTUalURvs3b96MTqczSgyjo6M5ceIErVu35vDhwwQGBjJhwoTSXoZSKfh+AujXrx8rVqxg1qxZeHl5FXpf7du3j7S0NNq0acOhQ4c4cuQI7dq1w9ra2uja5LcEVqlSpcT3c77c3FzeffddKlSowC+//ELFihUN+1588UXGjBnD1KlTqV+/PjVr1jQ69vnnn+e7776jd+/emJmZPdJ16NSpE7t37yYjIwNLS0vD9i1btvDCCy8U23Lt5eVFtWrVitxXr149o8fW1tbk5eWVeD0K1vfcc88REhLChg0bmDx5cqGbGAVt3ryZFStWMGHChEKvWefOnXnttdewsbEB4H//+x8dOnQw6jHg7+9P//79i+298iQtX76cevXqsWjRIqObRL169TKc/883suzt7Qv9/uW7ffs2U6dOpUOHDnz11VeG69S0aVNeeOEF+vfvz5gxY9i2bZvR752VlZWhvoYNG+Ln50fbtm3ZsGEDDRo0oGXLlvTt25cvv/ySgIAAXFxc0Gq1TJ48mSpVqhjd4BRCiGeJdNUWQvzrKJVK6tatS1RUVKF9+/btIzU1lYEDB9KhQwd+++23Qt2mSzJo0CAcHR356quvHjm+kSNHAhRqJfqzH3/8EZ1Ox7Rp04yS5nwqlYpXXnmlVOeMjo7m+PHjdOnShX79+hEXF1dkF1wACwsLRowYwZ49ex65y6VCoeDDDz+kUqVK/PjjjyWW7dWrF4mJiUV2h928eTN+fn5UrVrVaJtWq2X06NH4+fmxdetWNBrNI8VZFkOGDKFevXqsXLmy0L5NmzZha2vL7NmzMTc3Z9OmTU/knHv37iUkJIRx48YZJc2gf59PmTIFrVZb5DUeO3YsMTExrFq16pHP37FjRwD27Nlj2Hbu3DlCQ0Pp3r37I9f7uOrVq0dmZiaJiYkllvv++++pU6dOkT1PAHx8fHB1dQUgOTm52BtZJSXnT0pycjL29vZGSfPjnH/lypVotVqmTJlS6PiKFSsybtw47t27V6i7+p9VrlwZe3t7o8/TiRMnYm1tzfTp0wH46aefCAoKYubMmYV6AwkhxLNCEmchxL9SRESEUbKVb9OmTdjY2NC+fXt69uxJbm4u27dvL3W95ubmjBw5kgMHDnDhwoVHis3R0ZFBgwbxyy+/EBERUWy5kydP4uPjU2KrdGnlJ5s9e/bkxRdfxMzMzNDduSgDBgzA1dX1sbqkq9VqWrRoQVBQULFjyQHatWuHnZ0dmzdvNtqen6D16tXLaPumTZvw8PCgfv369OzZk9jY2GJvAjxprVu3JioqisjISMO2/Bbwzp07Y29vT4cOHThw4ECZbsgU58SJE5iYmNC2bdsi9zs7O+Pt7c3JkycL7fPy8uLFF1/k+++/N+reWxYWFha88MILhjG2oO+54OfnR5UqVYo9TqPRkJeXZ/TzJFttIyIiqFChAnZ2dsWWiY6O5tatW7Rr165Udfr6+hIYGMiyZcuKnMegNLRabaHnXdJ7/8/nP3bsGPPnz+f69etFjiEui/zPj/xu23/Wtm1blEplke+dgtLS0khKSjL6PK1QoQIzZszg0KFDLF68mK+++orBgwfTqFGjx4pZCCHKkyTOQoh/hfw/WBMSEliyZAlXrlxhzJgxRmViYmI4fvw4nTt3Rq1W07JlS5ydnUtMIIvSr18/qlSp8lhJ5VtvvYW5uTnffPNNsWXu379vaA0r6M9JSWkEBgZSo0YNGjRoQIUKFQyt7SkpKUWWV6vVvP322xw9epQzZ86U7kkVwdXVldzcXJKSkooto1ar6dKlCwcOHDCKJzAwEDMzMzp37mzYFhQUxJ07d+jRoweg7277sJsAT5KLiwugH6ucb8uWLWg0GkN38p49e5KTk8OOHTse+3xRUVHY29tjYWFRbBk3Nzfu379f5L4xY8aQkpLCihUrHjmGHj16cOLECaKjo8nJyWHXrl3FTsqWr3Pnznh7exv95Pe0eBT57/nk5GTWr1/Pnj17GDt2bJE9MfLlX5OifoeKMmPGDKpWrcoXX3zBiy++SPPmzXnvvffKdFNm2rRphZ63t7c3586de+ixH3zwAX5+fixevJgePXrQpEkT3n777Ud+H0VFReHm5lbsfktLy0ItyfnyP1vCwsKYNGkStra2DBkyxKhMu3bt6NatG/Pnz6dSpUqMGzfukeIUQoi/CxnjLIT4V/D19TV6/OGHH9KhQwejbfkJTn7SpVQq6d69O0uXLuXOnTuFxogWR6VSMWrUKCZMmMDx48dp2bJlmeO1s7PjjTfeYNGiRbz11ltFto4Xp2HDhkaTK+3Zs6fY8aSgTzZv377N2LFjDdt69uzJ9u3b2bFjR7HdvXv37s2yZcuYN28eq1evLnV8BeW3mhXV/bSgXr16sXr1anbu3MnLL79sSNDat29PhQoVDOU2bdpkeN0AQ++B/fv3k5qaalT2aSjq+QQGBlK9enVDa1vLli1xcnIiMDDwsSbmehJq1KhBz549Wb58Oa+++uoj1dGiRQucnZ3ZunUr7u7uZGVl0blz5xJb1BctWoSzs7PRtvyxxI+i4M0T0M+0/qjPpzg1atQgMDCQc+fOcfToUS5evMjevXvZvn07Y8aM4e23335oHSNHjqR9+/aFtk+ZMuWhxzo4OLBq1SqCgoI4cuQIQUFBnDhxgv3793P8+HE+++yzR3peZXXu3Dm8vb0Nj9VqNcuXLy+yh8E777zD1q1bGTJkSIk3d4QQ4lkgLc5CiH+FX3/9lXXr1rFo0SK8vb358ssvOXXqlFGZwMBAXF1dqV27NikpKaSkpBj+yP1zN+GH6d69O7Vr136ssc5DhgzB1taWr7/+usj9lStXNuoSnG/t2rWsX7+eUaNGleo8+a2x7dq1MzxvX19f7O3tS2ypNTExYcyYMZw9e5ZDhw6V6lx/FhUVhUqlwtbWtsRy+ZNb5ceTP/a8YMtmfituw4YNsbKyMjyXjh07GiZ9e9ryWzEdHR0BuHTpErdu3aJjx46GeNLT0+nUqRMXLlx45C6/+SpXrkxCQgKZmZnFlomIiCg0g3VBo0aNIicnh6VLlz5SDAqFgu7du7N582bDZHoPu0FRu3ZtfH19jX5KurnzMIsWLWL9+vV8//33tGzZktWrVz+0l0H+NSnqd6g4JiYmNG3alHHjxrFixQr27dtHnTp1WLRoUam63ru5uRV63r6+vkYTqz1M/fr1eeedd1iyZAmHDh3C39+fdevWERwcXOo6QP/8SxoKkpGRQUJCgqEXRb66deuyfv16fv31Vz7//HOsrKwYM2YMCQkJherIn1RMxjULIf4JJHEWQvwreHt7U79+fTp06MCyZcuwsbHhs88+M4yrvHz5Mjdv3iQyMpKmTZsafvJbW/PHAJeWUqlkzJgxXLx4kX379j1SzFZWVowYMYJdu3Zx7dq1QvtbtGjB5cuXiY+PL/RcfX19S+yGmS8nJ8cwhrtHjx6G592iRQsSEhI4f/489+7dK/b4zp074+XlxYIFC8o85jInJ4cTJ07QsGHDImfv/rNevXpx7tw5wsLC2Lx5M46OjkbLIB04cICkpCTOnTtn9BrmdxF9UhNyleTQoUO4uroako385G3p0qVGMf38889G+x+Vv78/Go2GgwcPFrk/OjqaK1eu0KJFi2LrcHV15eWXX2bVqlVGXczLokePHgQHB3Po0KGHdtN+GvIT8TZt2rBkyRKqV6/O3LlzycjIKPYYZ2dnPDw8OHDgwCOf19nZmX79+pGXl1emNdOfFBsbG8P6z7du3SrTsfmfHzExMUXuP3jwIFqtttB7x9LSEl9fXxo0aEDfvn356quviIuLK9UM+0II8SyTxFkI8a9jb2/PO++8Q3BwMLt37wb0CYxCoWDhwoWsXLnS6Gf48OFERUUVaqF+mI4dO+Lr6/tISWW+gQMH4uzsXGTL9euvvw78sc7tozh48CBJSUmMGjWq0PPOH6NdUnKnUCgYO3YsV65cMVzL0tDpdHzxxRfEx8cXGhtZnO7du6NUKvnxxx85cuQI3bp1MxrDumnTJiwtLVmxYkWh59K7d2/DZGJPy4oVK7h27Zrh+eTk5LBt2zYaNGhQKJ6VK1fi5eXFli1bHmuSp44dO1K1alXmz59faJy4Vqvl888/R6FQ8Nprr5VYz8iRI1EoFA+dyb04Hh4eDBo0iBdeeKHQms5/NbVazfjx44mPj3/oEIIRI0YQHBzM8uXLi9x/9epVQ4t0cQnmnTt3AJ7IJH0ledj5i5vkqzivv/46CoXC6AZivqSkJObPn0+1atUMM6cXp0WLFnTs2JF169YVO5ZeCCH+CWSMsxDiX+mVV17hhx9+4LvvvqNDhw5s27aNpk2b0qlTp0Jlvby8+PHHHwkMDMTf379M5xk3blyxS92Uhlqt5p133mHq1KmF9nl4eDBz5kwmTZpEv3796N+/PzVq1ECr1RIeHs4vv/yCSqUqcY3e/GRz6NChWFlZFdq/YsUKtmzZwpgxY4odh9y2bVv8/PyKnSQpNzfXMMN4ZmYmd+/eZcuWLVy4cIGRI0cWGmtenMqVK+Pv78/PP/9caO3m+Ph4jhw5Qvfu3Yt8jSpVqsTGjRsJDAzk3XffNWy/fPlykd2KH7Z298WLFzExMSE7O5uwsDB2797N4cOH6dWrlyFJPXToEElJSUycOJHmzZsXquPll1/m448/5tSpUyW2CJdErVazYMEC3njjDfr27cuwYcOoVasWcXFxrFmzhjNnzvDZZ5/h4eFRYj0ODg689tprLF68+JHiAP3EV6V17dq1IpeK8vHxKVXvg4dp3749vr6+hrHb5ubmRZbr0aMHV69eZfbs2Zw/f57OnTvj6OhIfHw8Bw8eZMuWLWzYsAFXV1e6deuGv78/bdq0wd3dnbS0NA4dOsTatWvp3LlzqScZe1RvvvkmLi4uBAQEUKNGDbKysvj9999Zvnw5jRo1ws/Pr0z1eXh48MknnzBlyhRef/11BgwYgKOjI3fu3GHZsmWkpKSwfPnyQmunF2X06NHs27ePpUuXFvlZJYQQ/wSSOAsh/pXyZ4WeNm0aBw8eJDExkT59+hRZ1sbGho4dO7Jnzx6mTZtWZIJZnOeee45mzZpx+vTpR461d+/e/PDDD0V2me7evTuenp6sWLGCJUuWEBsbi0qlokqVKrRs2ZIvv/yy2PGtCQkJhmSzuOfUt29fpk6dyunTp4tM/vKNGzfO0GW0qPO8/PLLKBQKLCwsqFy5Mo0aNWLixIk0bNjw4ReggJ49e3Ls2DG8vLzw9PQ0bN+6dSt5eXnFvoYeHh40atSIwMBARo8ebdi+du1a1q5dW6j8iRMnSoxj4MCBgH45JkdHR+rXr8+yZcto1aqVocymTZuwsrLixRdfLLKOrl27Mnv2bAIDAx85cQb9msWbN29m8eLFLF26lJiYGKytrfHz82PVqlWlXgJo2LBhrFmz5oksk/Uwf57RPt+JEyewt7d/IucYO3Ysw4YNY+3atSX2avjoo49o2bIlq1atYsaMGaSmpmJra0uDBg1YuHAhdevWNdR36NAhvv76a+Li4jAxMaF69eq8//77ht4fT9N//vMfdu/ezdKlS4mNjUWn0+Hu7s7QoUMZPnz4I63l3Lt3b2rWrMnSpUv55JNPSEtLw9HRkVatWjFy5MhC45uL4+npyUsvvcS6desYMWJEmVu/hRDiWaDQPe5CgEIIIYQQQgghxD+YjHEWQgghhBBCCCFKIImzEEIIIYQQQghRAkmchRBCCCGEEEKIEkjiLIQQQgghhBBClEASZyGEEEIIIYQQogSSOAshhBBCCCGEECWQxFkIIYQQQgghhCiBJM5CCCGEEEIIIUQJJHEWQgghhBBCCCFKIImzEEIIIYQQQghRAkmchRBCCCGEEEKIEkjiLIQQQgghhBBClEASZyGEEEIIIYQQogSSOAshhBBCCCGEECWQxFkIIYQQQgghhCiBJM5CCCGEEEIIIUQJJHEWQgghhBBCCCFKIImzEEIIIYQQQghRAkmchRBCCCGEEEKIEkjiLIQQQgghhBBClEASZyGEEEIIIYQQogSSOAshhBBCCCGEECWQxFkIIYQQQgghhCiBJM5CCCGEEEIIIUQJJHEWQgghhBBCCCFKIImzEEIIIYQQQghRAkmchRBCCCGEEEKIEkjiLIQQQgghhBBClEASZyGEEEIIIYQQogSSOAshhBBCCCGEECWQxFkIIYQQQgghhCiBJM5CCCGEEEIIIUQJJHEWQgghhBBCCCFKIImzEEIIIYQQQghRAtPyDuBp0mq1pKeno1KpUCgU5R2OEEKIfzidTkdubi5WVlYolXJv+nHId7gQQoi/0sO+w//RiXN6ejrBwcHlHYYQQoh/mTp16lChQoXyDuOZJt/hQgghykNx3+H/6MRZpVIB+ievVqsfu77Lly/j4+Pz2PWUB4m9fEjs5edZjl9iLx9PIvacnByCg4MN3z/i0cl3+B8k9vLxLMcOz3b8Env5+LfH/rDv8H904pzftUutVmNmZvZE6nxS9ZQHib18SOzl51mOX2IvH08qdula/PjkO9yYxF4+nuXY4dmOX2IvHxJ78d/hMgBLCCGEEEIIIYQogSTOQgghhBBCCCFECf6yrtrh4eG88847hsepqamkpaWxe/duxo8fT2hoKGq1mmrVqvHJJ59gb28PwIULF5g2bRrZ2dm4ubnxxRdf4ODg8FixaLVawsPDSU9PL9NxpqamXLt27bHOXV7+HLuVlRXu7u4y66sQQohnilarJS4ujqSkJDQaTamPexa+w83NzXF3d5cx8kII8Tf0lyXO7u7ubN682fD4888/R6PRoFAoePPNN2nevDkAc+bM4b///S8zZ85Eq9Xy4YcfMmvWLJo0acK3337Lf//7X2bNmvVYscTFxaFQKPD09CxT4pieno6VldVjnbu8FIxdq9USERFBXFwcTk5O5RyZEEIIUXrh4eEoFAqqV69epqWq/u7f4Tqdjvj4eMLDw6lRo0Z5hyOEEOJPyqW5MScnh61bt9KnTx/s7OwMSTNAw4YNiYyMBPSzo5mZmdGkSRMAXnnlFXbt2vXY509KSsLZ2flf29qqVCpxdnYmOTm5vEMRQgghyiQ9PR03NzfUavU/ahI2hUKBg4MDWVlZ5R2KEEKIIpRL5vjbb7/h7OyMt7e30XatVsuaNWsICAgAICoqCldXV8N+e3t7tFotSUlJj3V+jUbzr+8GpVKpyMvLK+8whBBCiDL7p974/ifdCBBCiH+aclmOasOGDfTp06fQ9k8//RRLS0teffXVJ3q+y5cvGz02NTUlIyPjkeoq67jov5M/x56Tk8PZs2fLKZqyeVbiLIrEXn6e5fgl9vLxLMcuhBBCiKfnL0+co6Oj+f3335k7d67R9jlz5hASEsLixYsNd5JdXFwM3bYBEhISUCqV2NnZlemcPj4+Rut6Xbt2rUzjnDQaLVHx6dhYKLCpYF2mcz9Mv379yMnJITc3l3v37lG7dm0A6tWrV6qx3GvWrCE7O5shQ4aUWK6osV1qtZoGDRo8cux/lbNnz9K4cePyDuORSOzl51mOX2IvH08i9uzs7EI3a8U/25tvvkn79u0ZMGCAYZtOp6NDhw7MmjWLZs2aFTpm4sSJ+Pj4PPGGAiHEo8vLyERhosTkGV7H+O8kcus2VHYVcWz1XJmOu79nH5Gbt2DXsAE13xr2lKJ7NH954rxp0ybatGlDxYoVDdvmzZvH5cuX+f7771Gr1YbtPj4+ZGVlcebMGZo0acLatWt58cUX/+qQyc3TkpmtwUJt8sTrXrduHaCf7KRPnz5GE6gB5OXlYWpa/MtU8ItaCCGEEH+tPn36sHz5cqPv41OnTqFUKmnatGk5RiaEKIurn3yGhZsbtUe/Xd6hPPN0Gg2hq3/Bqnq1MifOkZu3khkeQWZkFO59eqO2r2i0X6fRELF5K7Y+3gTP/xqfT6Zh5uj4JMMvVrkkzpMnTzY8vnnzJkuWLKF69eq88sorgH4G7kWLFqFUKpk7dy7Tp083Wo7qL/cXDzkKCAigS5cunDx5kjp16jBu3Djee+890tPTyc7Opk2bNowfPx6AhQsXkpGRwYQJE9i4cSPbtm3DxsaGmzdvUqFCBRYuXIjjX/RmEkIIIf5t2rdvz8cff8zt27fx8PAAYOPGjfTo0YNBgwaRmZlJdnY2/fv3f2jvMCHEk6XT6Ui+GIRtfV8UJcyNoNPpSL9zF11e6Ze4e1quz/0Sc2cnqr8+2Gh7+r173PhiPl6TJ2BRYA6ostBptSiUSvLS04k5cAiXlzoXO7eCNi8PhVJZ4nUrTkZYOJqMDLKio8t0XHZsHJnh4Ti/0Ino3XuIOXgI99499bFrNCRfuow2L4+QH38yHBO5ZRtpt26j69W9zHGW1V+eOO/evdvoce3atblx40ax5f38/Ni6detTjem3M6HsPR1a7H6tVkd2jgZTEwUqVdlanTs2q0pAk6pljiktLY3169cD+q5/ixcvxsrKitzcXIYNG8bhw4dp3bp1oeMuXbrEli1bcHFxYcqUKfz888+MGzeuzOcXQgghngUxvx0kev9vDy2n0WgwMSnbd7hz+wCcAtqWWEatVtOtWzc2bNjA+PHjSUtLY9++fWzfvp3hw4ejVqtJT0+nX79+tGrVypBcCyGevrRbt7ky/RO8Jk/EvlnxPUByk1PQZmeTEx9f5H5NVhZR23bg2r0rygK9Y5+G+GPHAYwSZ51Ox/XZX5AVdZ+4Yyeo0kzVStgAACAASURBVK/wXFEAN76cj4m5ObXeGYkmO5trn83CqV1bnALakhUdzfnR43DuEIBFlSrcXfoDtj7eWFWvVqierJgYLk+ZDjqoM+5dbOp5oc3NRVnKyZVTH+R2OfEJ5KWlY2JhjiY7h4vvf4jHiLewa1j0UNGkCxcAcO3amYx794g7fBT33j3RabUETZhM2s2b2NTzMjomaod+xSW1Tleq2B7HP3Nayn+Anj17Gv6v0WiYO3cu3bt3p3fv3ty8eZPr168XeZyfnx8uLi4ANGjQgNDQ4m8ICCGEEOLx9e3bly1btqDRaNi5cyd+fn6oVComTZpEt27dGDBgADExMcV+dwshniydRkNE4BbSgoMBfQtoSbJjYgDISUxEW8SqM3HHjhPy0yriT/3+WHHlpaUTEbgFnUaDNi+P7PgEo/0Fz52X9sekvmk3b5EVdR+A1BvBRdatycwk7vBRovfsAyBs7a8kB13i3oqVaLKzSblyDW12NlHbdxKz/4D++f7pRoEm+CYxvx3k5oJvyEtLR5udRcSmzUTt3MXJAYO5vXgpOo1Gf65jx9EVk6ymXv+jUfTUoNcI+3U96XfvkBUZRcKZs2THx3Nt5hxykvRL4+ZlZJB0MYioHbswc3LEokoV7Fs0J/3uXbJjY8mMjCLt5k193cE3jc6ly8vDslo1FCUMbX1SymVW7b+bgCYltwrn5GoIuZ9KRWsTKlWs8JfEZGlpafj/8uXLSUlJYd26dZiZmTF16lSys7OLPK7gJGgmJiZoNOXf5UQIIYR4WpwC2j60VRiKniTzSalbty5OTk4cPnyYDRs28PrrrzNv3jwcHR2ZPXs2pqamDB06tNjvbiGeVekhoZiYqTGvXPmJ1anNy0MTdJncOnVQVSj+7+6M0DByU1Kw9fE2Ovb2d0vITUwk8ex5TB78PZ0ZGUlS0CXuLP4e39mfo7KxMaorK1qfOKPTkZOQgLmTk9H+lKv6m15JFy5Q6fmW5CQkYuZg/+AQXZHdnWMPHSHx7DncevXAqkZ1AGIOHODe8h+p4FmHiMAtJJw8hf+GX1A+SPpyk5MNx8efOkVWZJShyzSAXaOGpFy9ZuhyDfpW9ZRr11AXmD/q/p69RGwMpIKnJ6k3bnD3h+WGcwCGJDRq5y5C1/yC76zPUKpU5B07wb20dDQZGTh36kheairxJ0+RcPp3zF1duL9zF0kXLpCXlkZeahq+sz/HxqsuAInnzpMdE4tjuzYknD6DeeXKZN3XJ/vJl6+gstG/lul37xGz/wAJp05j16A+lTu/QMjKVdzfqW85rjtxPAqFAvtmTQn58ScSTv+OiYX+dVSoVOhycwtda+taNUkutPXJk8S5LJ5+D4Aipaam4ujoiJmZGdHR0ezfv18mBRNCCPFE3L17l4kTJ5KUlISdnR1z5syhevXqRZa9c+cOvXr1YuDAgUyYMAGAGTNmcOLECdRqNZaWlkyePBlfX18ABg8eTGRkJNbW+hUpXnvttSKXo/wn6NOnDwsXLiQyMpL27duzY8cOPD09MTU1JTg4mDNnztC1a9fyDlOIJyYvI4PLk6dh7VET7xnTHrkenUYDSiUKhQKdRsPVGZ+RG3SJ27Gx1B3/QbHHnR89FoDnNm8wbIsM3ELMvj+GbmgeLD+bFRlF1LYdZEZEEn/iJBWbNCErMhJbXx/CfllH6Oq1hmNy4uINiXPanbtYVatK6vX8xDmI0FVriNgYSP3/zibu6HGi9+6n2YplxB09TvyJE+RZW5Pu4EDwvK8AyE1NxXv6FABSrunrSb9zl4STp/Sx3b+PNieHvLR0TAs0nN36ehHkjy/WalFVtMOxdSuSzl/g9yHDqDFsKHHHT5AVFUVGSCjKAo1nt7/7ngp1PfH59GNCfl5N5Gb9sFfrOrXJjIhE82CJ2sTf9Uswpt8LoULtWujiE8h9cM0sq7ihy9MQe/AQAF6TPyIzLJzIrdsMrd9pt25ToU5tQn5eTcTGwAfX6CJ5aWl4vP0fbsz9r77+u/ewcHV58P+7hvPf+X4ZIT+tQpOZiUKlosYbr+Pg31x/fnc3LNzdid67H+s6dTCxsMDW14eE03+0+lvX8iDt1m2sa3lI4vx3kX8TqZzyZgYPHsyYMWPo2rUrzs7O+Pv7l1MkQggh/mmmT5/OwIED6dGjB5s3b2batGmsXLmyUDmNRsP06dPp0KGD0fbWrVszadIkVCoVBw4cYNy4cezbt8+wf8qUKbRr1+6pP4/y1rVrV+bMmUP//v1Rq9WMHDmS8ePHs379emrUqCEzbItnWlZ0NIlnzlG5y4uG1tXIwC3kpaaSfvfuY9V9edoMcuLj8Zo0kZykJJKDLqFwcyX+2AliDhzEqV1bQ1mdRkNeejqmBXqP5I+9zYyKIuyXddg3b4ZDS3/uLvuBvNQ0wLh7b9yRY9xZsgydRkPzNT8TtX2HUTzZcXEkXQwi8dx5IgO34NLtJTLDIzB3dSErMoqITZvRaTTcXfo/Uq5eAyDhzFnuLl+BNisbTWYmF/buB8ClW1eitm4jPSQUy6pVSL2m78J8f9cfcz5lhkUQuW07WVH38Rg5HICKTZtg4eZK5Rc7cW/FTyScPIV1LQ8qPd+S3ORk7q1YSfBXX4NWC4BDS38USiXWtTy4t2IlaLU4d+qAUq2mxtAhZISEknThIpbu7igUikLdva/P/kLfgv4gaQawrFIFxYMxzeauLli6u2Hp7mZIbE+/PoykixeJP3GSlCtXcX6hE6k3bhB/4iQVPD1xaNnCUJcmPZ3EM+ce/D+D9Lv39DcFtFo0mZkA1Js6CbsG9Y3iqvJyP4K/nE/63XvY1vfFzFl/Q8O6lgceb/+H7Lg4rs+cQwVPT4iLLert9URJ4lwqT39abXd3d06d0t95+u0340lO3NzcDBOF/dno0aMN/+/duze9e/cu9rEQQghRUHx8PFevXmX58uWAPvn79NNPSUhIwN7e3qjs999/T9u2bcnIyCCjwB9XBZPihg0bcv/+fbRaLcpHmIn1WWZra0tQUJDhcb169di2bVuRZWfPnv1XhSVEmeWlpXNr0XdUHzIYc2dnAKK27SByyzZsvOthVb0aucnJRGzeitLMjNzkFHKSklDb2QGQcvUaFu7uhq65oE94o/f/RkZoOG49u2NWyQHQJ+Qpl68AcPeH5agrOWBiYYHpwJcx27mHmwu+wdTKCvtmTUm/F8KNL+aRGR6O2sHBUHd2XDwZoWGErlqNwtSUmiPexMzBgdgDB0m6cFF//gdjh+2bNyWhwDjl+zt3kZucYvT8Q1etIev+H7NBR23dDkDtd0cRvmETSefO49iuLbEHDhqSv1vffEdeSgq1Rr/NvTt3yNu+Cwf/FlR5uS/Re/YSvn4Dlu7u5CToxzRnhIYZ6s8ICyPt1m20WVmGsdgeI940LLFU6fnnHiTOtVCq1bj16kHi2XMkX7pMBc86gII6741BqVKhyczUJ86Ara+P4Rwu3V7SJ85VqwCFx0nnxMWRExdntM3C3R0TC3NMra2p1LJwo521Rw0Sfz+LwtSU2mNH49SuLTlJyWRGRGBdywOFQoFbn15oMjO5v2MXOQkJVKjrSer1GyhMTKg99l2Cv5yPxzv/QZORaRRvvkqtniPh9zMknj2Hg38LtLk5AKjt7bH2qIlVzRo0+mYBllXcJXH+uyjvFmchhBDiaYiKisLZ2dkw27SJiQlOTk5ERUUZJc7Xr1/n6NGjrFy5km+//bbY+latWkXbtm2Nkua5c+cyb948PD09+fDDD3F+8Ie4EKJswn5dT8Smzbj17E6Vl/uV+ri8jEwyQkKw8apLdnw8eSmpxBw8RF5qGrXffadQ+YTTvxN//AQKUxMUJqa49+5J2q3bAMQdOYpZpUqEbwxEm5NDzeHDuLN4KRn3QlA3tCMjPJxLH+m7JTdaOB/Lqvo5hO7v3sudJUtBqST24EF8PpuBVfXqxJ88DYCDf3MSfj+LUqXCwb85KRYW1Js2mUsTJnPrm+/w/sSJa5/PRpubi0u3lwzJLEDoz6uJO3oMM2cnar87CrMHSbW6UiV9gQfJrYN/C+q8P5b7O3eTk5hI5JZthKz8GYAqA17Gws2N298uJut+NK49u1O5U0d9sj73vzgFtMPGqy5ekyaQm5JCTnyCPnHWajF3dSUrMhIA2/q+mFa0w6dTR8ycnDG1tMC5Q3tDq7bCxAQLN1cyQsNweamLfvzwqdNos7IASDqvn1Va9eAmBIB9syY4tQ/AsfXzhm2uPbuTHR+P15RJRjcoTCwsUDvYozA1NRqnbd+kMb6zP8e6lgeRW7YZYtEVNReSQoHKxsZQb6NvvsL0wXCbgtT2+uvs1K6toVeA2s4WtZ2toUz11141JM6gnyk8NzkZG29vVDYVsG/WBBNz88IxGEJR4Pn+WMPjuOMn9Od5ML5coVDok+a/iCTOZSGZsxBCiH+Z3Nxcpk6dyqxZs0pczmn79u1s3bqVVatWGbbNnTsXFxcXNBoNS5YsYezYsaxZs6ZM5798+bLRY1NTU9LT04spXbJHPe6vlJOTw9mzZwttL2rbs0JiLzvt/Whyd+1B/XJfFBYWAOScOIk2I4PQ1Wu5b22FsvLDb0KdPXuWvCPHyDt4GLP33iV36w604eGQoe8em+hYCZM6tYyOyXmwvFvc4aMAxB49Bg8mZApfv5HwPXtRKJUoa3kQYaUfk3vj8BEU12+gvXvPUM/F739A1aMruvvR5O0/gKKSA6qX+5Lz4youjHkfhZsbZGWicHYi1bMOuhOn0OTlkVS7FkrgwuXLaF9oT+4PP3JhzHtgYoL69VdJdHdDeeky2nsh+jiPHkNRxR0GD+SeqSn3HrxmeQ9aJ5Xe9TCpWYM0by/OBwWBm4v+58xZCA1DUdmZ2Nr6ZeIU7duiMjMjoZ4XCfej0JmpMO3elWQvT6P3gk6rBbUacnLQtGsNq/RjpK+E6VuSr8fHw4MZq3UeNVA4OWLSvCkmPt7k3giG0DDiq1cl79o1ch7clABIDroEFhb6OAt6rgVXo6IgKkr/WAG8+QZBNwvPsK1t2ADMzYp+7wYFodHqk2VFFXd090IwadYEFEo0V65AegZKj5poTEwe+t7XuruiqORAknfdh5ZVDRqAws6Gm5kZoFZBEXGXhvZBq3hcZiZJ5fA5KYlzKTz9jtpCCCHEX8/FxYXo6GjDGscajYaYmBjDsoYAsbGxhIaGMny4fuxdSkoKOp2OtLQ0Pv30UwD27t3L/PnzWbFiBZXyW3ke1A/6luzXXnuNb775pszduH18fIxWjLh27dojzY79NGfVfpLUajUNGhivcXr27FkaN25cThE9nn967DqNhquffI5bn17Y1ff9Y3sxMy0DhKxag6m1NW49uhmVv79jF4nnzlPzraGEHT1OTGgYVfO0pF+8RPqdu5CZiXnDBqTevIX1xUt4vdQF0M8kfWnCJCo9/xyZUVE4tmmFrbe3If7re/cTr9NRQ6Um+F4I5OQYzqs6foKavj6Yu7igtrMlKegSwSGhKCtYk5eahlOHAMNkW/bNm5Fw6jSkpKIDqvfri2vr1pz+30pyHyxvBGDuUpmKfo24v3svNvb2xB46DOhbSWt06kRWgwbE/HaQsF/Xg06H98dTsfX14ez2ndg1akitLp2Nrn2Smztha3+l2muvYlPXU3+9GjZEk53NqQH6tY5rvNQFl+bNja5zdGIytw4dwdWzDtUGDyr0OiSbm5N0IQiXLi/+MSN1Ua93kyZFvo5X6nmRdOEifl06k+Xnh06rpUKd2kW/b9oH/PFaN2+ObuAAlCoVIbFxhN/RjxFX2dqSm5yMhYMDfo/zO/OwYxs3JrttG2IOHCL0Xgi+gwZiVb0atxZ9R0zQJZrP+gzg4etVN24MPXs8mZhKKa9uXc6t30TtNq2p6NfIaN+T+KzJzs4udLO2IEmcS0O6agshhPgHcnBwwMvLi23bttGjRw+2bduGl5eXUTdtV1dXwxwcAAsXLiQjI8Mwq/aBAweYNWsWy5cvx939jy5zeXl5JCUlGRLp7du3U6dOnScy9vmfOoa6uDVRxV8n9UYwQeM/otGirw3bwn5dT9L5C/jM/JTki0EoVKYoTVWo7GxBpyPpwkUs3FwNiXPKtetc/fRzvGdMp0LtP1pzMyMiSTx3nvBf9fPWuHZ7ibC1v2LXsAFKMzPufL8MgCg3V+KOnwTg5vwFRvHZN2+Gde1ahG/YRHZsLGaOjqReu07arduG7tTRe/dTY+jr6B5MpJQeEgpAROAWtAWSZve+vQlfv5HLk6dhU88LTVaWPkEHPD98j7y0dBzbtSH1+g0ywyOo9uoA6rw3htOD30Cbk2N4vnXHv0/y5SsoTE0J+fEnHNu2wbHV80TvP2BImgEqNvYDwNzZmaoDXsa6lgeajEzsGupvFDX6ZgHKB5NRFWRX39fopgTouxkXnIHaroHvnw/DzFH/2aMqsExTQbbe3th6exe5rzSc2gdgWsEaU2trrGsV7spcHIVCYZh0q0r/vphXdsbE3IKE06eJPXjYqOv102Lm6Ih9s6ZkRkRi4e4GQM3hb5J05szDE+ZyZGplRbOV/yu/85fbmZ8hCkObs3yhCSGE+Gf5+OOPmThxIt9++y02NjbMmTMHgLfeeot3333XsLRUcT766CNUKhXvvvuuYduKFSswMzNj+PDh5D7o4unk5MS8efMeO14rKysiIiJwdnZGpVIV26r3rNHpdMTHx2Newni/f7P8pNC6lr5LbV5GJlemTse9Xx8cWjQv6dAS5SYnY2ptjeLBMIT8MZTRu/eg8/UmIzycyM1byUtLI/nSZW4u+AaVna0hwfR4ewSgX84nJymJm/O/RmlmhiY9g5vzF9Bo4VdkxcSSERJC+LoNhucB6Jfw2bCJ+JOncGqvn2TPzLESUdt2oNNoMK1QgbzUVMO/AOZOTlRs2pjw9RuJ2rmb7OgY4o4d1++r7IxL1y4kB13m7rLlYG5Oxn/nGJYOSr1+A6WZGWoHe3KTU6jySn/iT50mJz7BMDu0xzsjsW/WxDDRF4DPpzOIO34CiypVUCgU2Pk1Iu3mLSwejC21qeeFTT0vABxbt0Jd0Q6FiQlNln5HypVrWNeuRdzRY9h61zO69vZNjVtySxrr+jDmBXrJ5LOsWgWlmRnWNWs8cr0lcWz9vNG440ehVKlwftAabd+0MRUbN8bC3fVJhPdQVtWrUWfcH5/bSpUKxd84af47kMS5NCRvFkII8Q/l4eHBunXrCm1funRpkeULruYAcPLkyWLr3rhx4+MFVwR3d3fi4uIICQkh78FMuaWRk5OD+m/+R6G5ublRq72AjNBQchISufvDclAoqPP+ODJCQkkNDibt1m1CV60pVeIce+gICWfOUun5lsQeOox1rVpU7tSR34cOx6ySA7XHvsuNuV8aZh1OvnIVTVoa5387qK9AqeT2d9+Tk5BgmBkZ4N6KnwB94hx35JhhFmfQtzAnXQzi/q7dJJw+Azod6kqVsPWuR+yhw0Rs2KQvFxlF4plzmFeujGPb1oSt/ZUKdfXL+dz73494fjCOK9M/AcDM2QlzJyccWrYwHA9g4e6G34NWcpeXuhB78DA3FyzUT0pVoCeDe59eWFatQm5yCkqVigZfziUvLY2zb43ErmF9KncyXm4OQG1fEdeuXQyPa70zEk1mRpE3rfJnywZQ2dgYli5y69n9oa/Ro2gw/wu02TlFxqKuWJEWv6x6Zm6uKdXqx07ExdMliXMpPM28+c0336R9+/YMGDDAsE2n09GhQwdmzZpFs2bNCh0zceJEfHx8ePXVV59CREIIIcTfl1KpxMnJCacCM8aWxtmzZwuNHRZ/TzqdDp1GgzYri/Nj3jesVQtwedJU8tLSDI9zEhPRabUoiui6nx2fQGZYGOYuLtz65lu0ubkknj2HJj2d5IuXsHBxQZeXR9b9aC5NnKyv70FSnH77DooHrbwOz/lj7uxMxMZAo/qV5uZoHizNpklP5/6uPYZ9zh07EH/iJFHbtpN08ZIhefWaPBETC3NDF+Yqr/QnbO2vJAddwqlDAA4tmhO+fiNVB7yMra8PDs2bYV65MmoHB3Li4w1LFHmMeIvU6zewcHND7eBApQJr5iqUShzbtubmkqXEHtSfx2PkCFJvBOPWpxdK0z/+/DcxM8PEzAyfmZ9i4VK5VK+PyqbCX9KduDSsa9Yscf+zkjSLZ4MkzqXwNH/p+vTpw/Lly40S51OnTqFUKmnatOlTO68QQgghxNOmDQ0jPk+DQ/PCDQFFidqxi7Bf1+HYprVhuZ+C8tLS8Bg5AqWZmpz4BEJ+WkXazVuY2lTg2qczqTd9Cuh0xB4+Sur16ySev6gfZ6xUUn3Ia9xb/qOhnjvL/gdKJRUbNSDx7HnDOcwcK5EdG4cuJhbHNq2p894YtLm5JJw6jU6jIet+NAoTEyo939IwcRZAZng4JlaWaNIzsPGpB0ol0bv1ybSNjzd5qalY1aheqAU49vARtNnZOLZpjVWN6jRfvRKTBxPimVfWJ7OWVasYJc4qW1saffM1SpVpkeOCFUolSjdXNLfvYOHujvMLHan8Yqdir3v+pFtCiOJJ4lxKTyt1bt++PR9//DG3b9/Gw0M/bmfjxo306NGDQYMGkZmZSXZ2Nv3792fIkCFPKQohhBBCiCdLp9GQszGQ62np+M78FBuvuiWWz4qO0a/1C0Rt34nuwfh4AIWpKSgUKNVqnNq3Q6lSkZOQSNgv67g0aSoOLZrru0ZfuEjc0eP6ZX0eSL0RTLXXXqXyi50IXfMLZpUqoTBRkhESioWbK67duxklzhWbNiHu8FHy0tL0iS768Z8NF8wDnY5Tg9/AwqUy1jVrEsNvWFRxx8TCAk1GJjWGvk70vt+o6OdHxUYNUapMUZiaUv31wZA/07ZCgVvvnphVqoRSrabxd98YXQeTArPI57P19SE7Ng5TSwvDtoL/L4rS3Q3t7TtUfqGjtLwK8QRI4gzE/HaQ6P2/lVgmMzuPZAXEqst2yZzbB+AU0LbY/Wq1mm7durFhwwbGjx9PWloa+/btY/v27QwfPhy1Wk16ejr9+vWjVatWhuRaCCGEEKK86HQ6MsMjsHBzLbKbNOjHFZOSitLcnFsLF9Hw6/koTU1JvxeCubMTJvnrEyckcnPBQrJiYlGYmqLLyzNKms2cHKlQ1xNVBRtUdraGFla1fUUazP+Ci+9PIO7oMUCfcGeEhGLh7k5uchLOHTuQdvMWrt27olSpqPXOf1DZ2KA0M+PSxMlY1ayBbYP61Js+hYTTZ7i/cxfmlStjU8+LhNO/Y1VgYqn881Z+sRPmTo6G8dCW7m7UnTjeUC5/9miAmm8NK/LaVH99cJmut1vvnrj17lmmY5T1vKiYllbi36FCiNKTxPlvoG/fvrz55pu8//777Ny5Ez8/P1QqFZMmTeLGjRsoFApiYmK4fv26JM5CCCGEeCp0Gg2arCxMraxIunCRzIgIXF7qYlxGpyN83QYSz54j9foNqg95jdjDR1Cq1dQe+y4ZoaGG1tqkCxdROFaizptDuT5rLtc+n402K4uUq9dweakzFep6khESikKlMkyqVW/aZMJ+XU/q9RuGc3p/8nGx428t3d2xq+9LwunfAcgICcXEyoqG879Ap9MVar11bN3K8H+fmZ9iWcUdhUJBRb9G5CQkAvqZq5V+KhLOnTdKnPPVeON1QD8jN4C6kmOZrvOjeJQWY6VjJepNm/IUohHi30kSZ8ApoO1D78bdjkjCQq3E1dHmiZ+/bt26ODk5cfjwYTZs2MDrr7/OvHnzcHR0ZPbs2ZiamjJ06FCys7Of+LmFEEII8WzT5XcBfgzZ8QlcfP9DNJlZNFv5P+6tXEVGSAhOAe1Qmpsb6s+6f5/QVWtQVdQvVxSxeQu5iUkAXJo4mdykJEytrVGaqak2eBD3XZyxb94M++bNSL0RbJh1+f6uPURt36k/uVKJ2t6exku/Q2lqSsrVa6QG38TW14fUG8GYO5c8EZxdo4YknP4dpbk52qwsHPxblGot2j8vj1TRrxEVmzbBxtsLUysrIizMUVUofhIsla0tVV8daNTCLIT455LEuZQUKJ7qclR9+vRh4cKFREZG0r59e3bs2IGnpyempqYEBwdz5swZunbt+vQCEEIIIcQzJ/nKFa7O+By/RQswc3Qk6/594k+cwrp2LWx9vEtdT+yBg4YEOOXyFdJv69cb/n3YCOzq++I54QPuLP6e9LshAPh+/ik3vviS9Lv3UJia4vnBOO7+70fc+/amysv9DIlr9NmzKBQKvCZN+ONch44QPO8rVLY2WLi7k3LlKjbeXobZnt369KJi0yao7SuSHR1TbFfwfA4tmhOz/zfsmzcjdNUaHNu0KrF8cdT2Fak35SPDY0UJSXO+Kv36PNK5hBDPHkmc/ya6du3KnDlz6N+/P2q1mpEjRzJ+/HjWr19PjRo1ZIZtIYQQQhSSdCEIbXY2yZcu4xTQjjvLlpP4+xlMLCxo9tPyImdcBtBkZ3N/xy7UDg7EHz+OJjPLsC9y6/Y/yqWnE3/iJKGr1xqWW1Kam2Pu6oJFFXfS797Dwt0NB/8WOPi3KHSeolRs2hgTK0tcu3dD7WD/IHH+o/XX1NLSMMuzeSmWHVPbV6TBl3PRaTTY+vo8dBIyIYR4FJI4l5Li6TY4Y2trS1BQkOFxvXr12LZtW5FlZ8+e/RQjEUIIIURBGaGhqCs5PnQW44zwcLKjYx7adTf1RjDWtTxQmJiU6vy67Gy0ubmGJDgnIZErMz6l9pjRpN+9C0DK9WDs/BqRePYcFu7uZIaHk3L1GnYN6gOQGRWFysYGUysrdDodNxcsJP7YCaPzWNfyIO3WbZIuXMTM2QlzZ2eSgy5hXbsW4b+u/6NczRooFAos3d0BsKpWrVTPI5+ppSVNli3BxMICXW4u2bFxRmOPH5XCxESSZiHEU1Ny3xdhIJP4CyGEEP8+sZ8yDwAAIABJREFU2rw8Ln4wkYgNGwFIuXqN7NhYrn42k8it29DpdMSfOMWlj6Zw/p0xXP3kc5KvXCHx3PlCdcUcPEzi+QsEjf+IuOMnAf345Oy4eBLPX+Dy1I8Ns0Pn02k05Hz/A/eWrzRsiz10mIx7IST+fob0O/rEOWb/b9yc/zVotdQeMwqFqSmJZ86i0+mI3ruP8++M4drMOeh0OuKOHCX+2Anc+vSi6qAB+tYBwLa+r76LtU6Hdc2aeE35iOarVlLn/bEAVPCsQ73pU6jz/jgALKroE2fLalXLfF1NLS1RPFheqkr/vphaWZW5DiGE+CtJi3NpPe0mZyGEEEL87eTExaHNzib97l1Srt/g0kdTMHN2Ijs6hsTfz2JVvToxBw6ScvWa4Zjg/34FSiVNf1hi2JYVE8PN+QswtdFPMpoZHg5A7IFD3PrmWyyrVyP99h2SL13GsmoVLKtWJeSnVaTdvoMuMYmkixfR6XT8n707D4+qPvQ//p5zZrJOdkhIICwBgbBaUagLVBoQVDBWr4VSqlbFa/Wq5bqQ0itLudUbXK6iUlt+ioW6cJEKJaLivgBFiYhAABHCmgVICFlIJpkz8/sjMJoCYbKQScLn9Tx9TM45c/KZ2OcZP/l+z/dbvvM7Dn30MQBHszdSXVSMPSICd1kZpdt30O3myUT0voCoQQM5/NkaXIePULTunwTHd6R0y1b2vLyIw598RnjPFLr98hfYTLN2JezP1hDWrRvB8R2pPHCQ8JQetStSBwdjd4Zz8Ut/wQwOwe78vuBG9O6NIyqSqEEDW+DfhIhIYKk4+8kGeNWcRUREzitVBYUAHN+3nyOffg6Aq/AQYd26cnz/AUo2fUPp1pw6r6kuLq59bWEhO59+ltKcbUSceGbXXVp64r4FABz96iu8lkXFrt3EDruEY5u3suuFBfS8604OvPF33z0rDxzkq9/8B1X5ta8zQkIo21G7ZVOPO35N5f4DJI67hqCYGAC6Tvw530ybTtG6f9L1l7+g88/S2Z75OHnL/0FQhw70+o/f+KaKR194IUc+W4OzZwohCfG+4vxDwXFxp/xugjvEMXTRwsb+akVE2pTztjg3eOuGdjZX2+vVHwFERETOpqqwtji7Dh+h8IMPMcPDsSoqSBg9isOffEreyrfwVFWRcNUobIbhW0AL4Nsnn6Zsx7c4YqLr7EsMUJVfQOm27Rz7ZrPvWNxllxFz0UXsXvAiG++tnR7tiIrESkrEs20HVfkFdL/tFiIuuIDS7TvY+9fFGCEhdLjict+K1CdF9OlNjztuw6qspMu/3YDNZqPff02nMr+AoNiYOvsbx4/8Se0od3IXguMTAAjvcer+xSIi57PzsjibpklNTQ1Bfuzxd1LtiHP7UVNTg91+Xv7rFxER8VtV4SHf156qKvo89J9UHz1Kwug0qouKKN/5HQDJE39OcFwcRev+Sc2x2lHlsh3fEjOkdm/g3S8swAwLwzp+HGw2ynZ8y+aM3wMQ2jmJqoJCogcNJCg2hvCUHnzzUAYAQxa8wMaNG3FtexyApOvG1z4bHBLC3r8upue/TzmlNJ+UNO6aU46FJnY65ZjNNInofQEAHX8yHJvdTlBsTGN/ZSIi7dJ52Zyio6MpLCykc+fOGGfZG/B7Nmgno7Qej4fCwkKioqICHUVERKTVKt+9m9KtORhBQXiqqwGIu+xS377C8Wk/pTIvj05jx/imMocmJ2O5dhEz5CKq8vPp/Z9T8dRUs/svLxL/0ytxREdTU1JCftYqAII7dqDfzP/C43L5ympE7wvo/LN0vJaFGRyMzeGg7/QMwrom+2bLOVN6MOyVRXWeOW4Okal9tTK1iMhpnJfFuUOHDhw4cIAdO3ac/eITikurAC/lR+vfiqK1qq6urjPCHh4eTocOHQKYSEREpHXbNPUhAJwX9CKsW1cSRqX5SjNAWHIXUqdn1HlN4jVjqSo8ROfrr/vBteH0nz2D8G5dcURFcejDjwCI7JfKwMf++7Q/u/utN9f5Pm7YJadc09ylWUREzuy8LM6GYdC1a8O2Tnhw3qe4Xcd5+qGx5yjVuZWdnc3gwYMDHUNERKRN+OFaICEJCVxw7z1+va7D5Zed9nj0D1aejho0CEdUFN1/fUvTQoqISIs5L4tzY5iGjer2MVNbREREzsKqqACg45Uj6HHbrc1679rVqF9q1nuKiMi55e8Dvuc9w7DhaSfPOIuIiEj9qktKAIi56CIcWhNEROS8pxFnP5mGDY96s4iISLtWVVCAp7qamrIyoHY7KBERERVnP5mGgccT6BQiIiJyLn3z8O+oOVbKBb+9FwBHdHSAE4mISGugqdp+0lRtERGR9u/kHswH31wBgCNa07RFRETF2W+mYWsv2ziLiIjIGYR0SgDg+N59YBg4IiICnEhERFoDFWc/GYYNjx5yFhGRdiY3N5cJEyYwZswYJkyYwJ49e8547e7duxk8eDCZmZm+Y5WVlfz2t79l9OjRjB07lo8++sivc62Vu7zC97XNMLCZZgDTiIhIa6Hi7CdDi4OJiEg7NHPmTCZNmsS7777LpEmTmDFjxmmvsyyLmTNnMmrUqDrHX3zxRZxOJ++99x4vvPAC//Vf/0XFia2c6jvXGnktC3dFBVEDB9R+73YHOJGIiLQWKs5+Mg2bFgcTEZF2paioiJycHMaNGwfAuHHjyMnJobi4+JRr//KXv3DllVfSvXv3OsfffvttJkyYAED37t0ZMGAAn3766VnPtUbuiuPg9RIz5KJARxERkVZGq2r7ydTiYCIi0s7k5+eTkJCAeWI6smmaxMfHk5+fT2xsrO+67du38/nnn7No0SLmz59f5x55eXl07tzZ931iYiIFBQVnPeevLVu2NPh9nUl2dna95z1FtX8wOFhSgn10Gjan86yvaSmtJUdjKHvgtOX8yh4Yyn5mKs5+Mg1DU7VFROS8U1NTwyOPPMJjjz3mK9gtacCAAQQHBzf5PtnZ2QwZMqTea8p2fMs3QK+BA4i9uP5rW5I/2VsrZQ+ctpxf2QPjfM/ucrnq/WOtirOftB2ViIi0N4mJiRQWFmJZFqZpYlkWhw4dIjEx0XfN4cOH2bdvH3feeScApaWleL1eysvLmTNnDklJSRw8eNA3Qp2fn8+wYcMA6j3XGrnLywG0kraIiJyixYrzgQMHuOeee3zfl5WVUV5ezhdffEFubi4ZGRmUlJQQHR1NZmam7xmq+s61JG1HJSIi7U1cXBypqalkZWWRnp5OVlYWqampdaZpJyUlsX79et/3zz77LMePH2fatGkAjB07liVLljBw4ED27NnD5s2befLJJ896rjWqKSsDwO50BjiJiIi0Ni22OFiXLl1YsWKF739paWm+xUjqW9HT39U+zzUtDiYiIu3RrFmz+Nvf/saYMWP429/+xuzZswGYMmUKmzdvPuvrb7/9dkpLSxk9ejT//u//zh/+8AecJ4pnfedaI3dZ7YizXSPOIiLyLwIyVbu6upqVK1fy4osv+lb0XLhwIVC7ouecOXMoLi7G6/We8dwP/xreEjRVW0RE2qOePXuydOnSU44vWLDgtNffe++9db4PCwtj3rx5p722vnOt0cmp2vbwsAAnERGR1iYg21F9+OGHJCQk0L9//3pX9KzvXEszNOIsIiLSbhWsfo/9r/8fALYALIImIiKtW0BGnJctW8aNN97YYj+vObayOHz4GB6vV0u0B4iyB0Zbzg5tO7+yB0Zbzi5Nc/DNfwBgarRZREROo8WLc2FhIV9++SVz584F6l/R0+v1nnW1T380x1YWOYe24dlWdl4v0R4oyh4YbTk7tO38yh4YLbGVhbRO7uOVVBUU0HHklXS+/rpAxxERkVaoxadqv/nmm/zkJz8hJiYGqLuiJ1BnRc/6zrU0w1a7qrZXzzmLiIi0K2Xbt4PHQ/yVIwjv3i3QcUREpBVq8RHnN998k9///vd1js2aNYuMjAzmz59PZGQkmZmZfp1rSaZpA8DjhRNfioiISDtwbMtWbHY7EX37BDqKiIi0Ui1enN99991Tjp1pRc+znWtJpnGiOHs8mIYWDREREWkvSrdsxdmrJ2ZISKCjiIhIKxWQVbXbIsNWW5wtS1O1RURE2gurspKynd8RNaB/oKOIiEgrpuLsp++naqs4i4iItBel23eAx0OkirOIiNRDxdlPxomp2pZHxVlERKS9KN/5HQCRer5ZRETqoeLsB8vlwvnBcoKtak3VFhERaUdcR47giIrCDA0NdBQREWnFVJz9cHzvPoI3rqVL1SEsjyfQcURERKSZVBcVExTX8ttciohI26Li7AebvXbxcdPrQb1ZRESk/VBxFhERf6g4+8E4UZwNr6URZxERkXakuriIoNi4QMcQEZFWTsXZDzaHAzg54qxnnEVERNoDT00NNcdKCdaIs4iInIWKsx9OjjibeLSqtoiISDtRXVwMoKnaIiJyVirOfrA5fviMs4qziIhIe1BddKI4x6o4i4hI/VSc/WD8YHEwjTiLiIi0D8cPHAAgKE7POIuISP1UnP3w/araWhxMRESkPTi68Wt2Pf8CRkgIwR07BjqOiIi0cirOfqi7HZVGnEVERNq6qrw8AC586nHsYaEBTiMiIq2dirMfbKYJNhum14PbUnEWERFp69zlFQAEJ8QHOImIiLQFKs5+sNlsYJoYXgu3W1O1RURE2jp3RQVGSIhvHRMREZH6qDj7yWbaMb0eaiwVZxERkbbOXV6BPTws0DFERKSN0J9Z/WW3Y+KhRiPOIiLSjuTm5pKRkUFJSQnR0dFkZmbSvXv3OtcsW7aMl19+GcMw8Hg83HTTTdx8880APPzww+zYscN37Y4dO3j++edJS0vj2Wef5dVXXyU+vnY69EUXXcTMmTNb7L3Vx11Rgd3pDHQMERFpI1Sc/WSz2zG9Fm6NOIuISDsyc+ZMJk2aRHp6OitWrGDGjBksWrSozjVjxozhhhtuwGazUV5ezvjx4xk6dCh9+/Zl7ty5vuu2b9/OLbfcwvDhw33Hrr/+eqZNm9Zi78df7vJy7OHhgY4hIiJthKZq+8mwn5iqrRFnERFpJ4qKisjJyWHcuHEAjBs3jpycHIqLi+tc53Q6a9f7AKqqqqipqfF9/0NvvPEG48ePJygo6NyHbyKr4jimirOIiPhJxdlPthPFWSPOIiLSXuTn55OQkIBpmgCYpkl8fDz5+fmnXPvBBx9w7bXXMnLkSO644w769OlT53x1dTUrV67kxhtvrHP8rbfeYvz48dx2221s3Ljx3L2ZBnJXlGuqtoiI+E1Ttf1kODTiLCIi56+0tDTS0tLIy8vjnnvuYcSIEaSkpPjOv//++yQlJZGamuo7NnHiRO666y4cDgdr1qzh7rvvZtWqVcTExPj9c7ds2dJs7yE7O9v3tetYKcUV5XWOtWZtJefpKHvgtOX8yh4Yyn5mKs5+MhwOTG+NRpxFRKTdSExMpLCwEMuyME0Ty7I4dOgQiYmJZ3xNUlISAwcO5OOPP65TnJctW3bKaHPHjh19X19++eUkJiayc+dOhg4d6nfGAQMGEBwc3IB3dXrZ2dkMGTIEAK9lsdblIiklha4njrVmP8ze1ih74LTl/MoeGOd7dpfLVe8fazVV20+G3Y7htTTiLCIi7UZcXBypqalkZWUBkJWVRWpqKrGxsXWu27Vrl+/r4uJi1q9fT+/evX3HCgoKyM7OZvz48XVeV1hY6Pt627ZtHDx4kB49epyLt9IgVmUlgBYHExERv2nE2U+Gw4FdU7VFRKSdmTVrFhkZGcyfP5/IyEgyMzMBmDJlCvfddx8DBw5kyZIlrFmzBrvdjtfrZfLkyVxxxRW+e7z55puMHDmSqKioOvd+6qmn2Lp1K4Zh4HA4mDt3bp1R6EBxl5cDYHeqOIuIiH9UnP1kOGr3cXZpqraIiLQjPXv2ZOnSpaccX7Bgge/r6dOn13uP3/zmN6c9frKEtzbuiuMAWlVbRET8pqnaftJ2VCIiIu2DRpxFRKShVJz9ZHM4MNF2VCIiIm2ddbx2xNkepuIsIiL+UXH2k2G3Y9fiYCIiIm2eVVkFgBESEuAkIiLSVqg4+8lmt2Pgwa3iLCIi0qZZrtribIaqOIuIiH9UnP1k0zPOIiIi7cLJEWezGfaHFhGR84OKs58MR21x1jPOIiLSmnz00UdnPPfCCy+0YJK2w+NyAWCoOIuIiJ9UnP1UO+KsZ5xFRKR1efDBB8nOzj7l+J/+9CdeeumlACRq/ayqKozgYGyG/jNIRET8o08MPxkOB4bHQ43bCnQUERERnxkzZnD33Xezfft237H58+ezcOFC/t//+38BTNZ6eaqqMLUwmIiINIA90AHaCpvdjuH14La8gY4iIiLik56eTklJCXfccQevvvoqK1eu5OWXX+bFF19k0KBBgY7XKllVVRghmqYtIiL+U3H2k2G3Y+ClpqYm0FFERETquOWWWzh69Cj/9m//hs1mY+HChQwYMCDQsVotq1IjziIi0jAqzn6y2Wt/VZ4ad4CTiIjI+W7hwoWnHIuKiiIsLIwhQ4bw5Zdf8uWXXwLw61//uqXjtXoel0vFWUREGkTF2U/fF2eNOIuISGAtXrz4tMcNw2Djxo1s3LgRAJvNpuJ8GlZlFYaKs4iINICKs5+ME8XZ61ZxFhGRwPrwww8DHaFNs1xVOKIjAx1DRETaEK2q7Sebo7Y4W5qqLSIi0qbVrqodGugYIiLShmjE2U+G3QGA163iLCIirUd1dTWLFy/mvffe49ixY3Tr1o1f//rXDBs2LNDRWi2ryqVVtUVEpEFadMTZ5XIxc+ZMrrrqKsaPH88jjzwCwEcffcT1119Peno61113HatXr/a9Jjc3lwkTJjBmzBgmTJjAnj17WjKyjxYHExGR1mbv3r1cffXVfPvtt9x///0899xzXH311fzud7/TdO56WNrHWUREGqhFR5wff/xxgoODeffdd7HZbBw5cgSv18vDDz/MK6+8Qu/evdm+fTu/+MUvGDVqFIZhMHPmTCZNmkR6ejorVqxgxowZLFq0qCVjA2CcmKqNpeIsIiKB53K5mDJlClOmTGHixIm+4z179qRr1678/ve/56c//SmZmZnce++9hIWFBTBt6+H1ePC4XBjBGnEWERH/tVhxrqioYPny5XzyySfYbDYAOnTogNfrxTAMysrKACgrKyM+Ph7DMCgqKiInJ8e37ca4ceOYM2cOxcXFxMbGtlR04PsRZ69GnEVEpBV47bXXSE5OZuLEiUyZMgWXy1XnfG5uLiUlJRQVFbFgwQLuv//+ACVtXTzV1eD1YobqGWcREfFfi03V3r9/P9HR0Tz33HPccMMN/OpXv2LDhg3YbDaefvpp7r77bkaOHMk999xDZmYmAPn5+SQkJGCaJgCmaRIfH09+fn5LxfY5WZyx3Hg83hb/+SIiIj/03nvvceONNwJw5ZVXsnv3bi699FLS0tIoKiri1ltvJSwsjFtvvZU333wzwGlbD6uqCgBTI84iItIALTbibFkW+/fvp1+/fkybNo1NmzZx11138d577/HnP/+Z+fPnM2TIELKzs/ntb3/LW2+91Ww/e8uWLU2+h2fPXgBMr4cvN2RjN21NvmdLy87ODnSERlP2wGjL2aFt51f2wGhL2ffu3UvPnj0BePvtt5k9ezZpaWkAjB49mhtvvJEHHniA1NRUDh8+HJDZWq2R52RxDtUzziIi4r8WK86JiYnY7XbGjRsHwODBg4mJiSE3N5dDhw4xZMgQAIYMGUJoaCi7du2ic+fOFBYWYlkWpmliWRaHDh0iMTGxQT97wIABBDfxL8tlzgi+AUyvxcBBgwkLcTTpfi0tOzvb9ztua5Q9MNpydmjb+ZU9MJoju8vlapY/1jbk50HttOwffjZ27NiR0tJSSkpK6NChA1D7B2z5fsTZ0OJgIiLSAE2eql1TU+PXdbGxsQwbNow1a9YAtR/yRUVFdOrUiYKCAnbv3g3Arl27KCoqomvXrsTFxZGamkpWVhYAWVlZpKamBuQv5jZHbVG2ez3UuD0t/vNFRER+qEePHuzatQuo/WP0vHnzOHz4MOXl5Tz11FN06tSJDh06kJubS3BwsK9An++sqto/NmhVbRERaYgGjTgvWrSIhIQExowZA8D06dNZvnw5ycnJ/OlPfyIlJaXe18+ePZvp06eTmZmJ3W5n7ty5dOzYkVmzZnH//ff7Fg179NFHiY6OBmDWrFlkZGQwf/58IiMjfc8/tzTjRHE2vRZuS8VZREQCKy0tjSVLlvCzn/2MWbNmMW3aNEaMGAFA7969efbZZwFYvnw5I0eO9H3Gnu9OTtU2goMCnERERNqSBhXnxYsX8+ijjwLw5Zdf8vbbb/PEE0+wevVqMjMz+fOf/1zv65OTk1m8ePEpx6+77jquu+66076mZ8+eLF26tCExz4mT21GZGnEWEZFWYOLEiSxatIjXX3+diRMnsnDhQiorK3G73URERADwzTff8Oqrr/L666+f8T65ublkZGRQUlJCdHQ0mZmZdO/evc41y5Yt4+WXX8YwDDweDzfddBM333wzAM8++yyvvvoq8fHxAFx00UXMnDkTgMrKSn73u9+xdetWTNNk2rRpjBw58hz8Nvznqa4GwAjS4mAiIuK/BhXnwsJCunTpAsCHH37I2LFjueaaa+jTpw+TJk06JwFbC9sPRpxVnEVEJNBCQkJ4/vnnmTJlCnl5edxxxx1ERkYC4Ha7efPNN3nyySeZNWuWbxGx05k5cyaTJk0iPT2dFStWMGPGDBYtWlTnmjFjxnDDDTdgs9koLy9n/PjxDB06lL59+wJw/fXXM23atFPu/eKLL+J0OnnvvffYs2cPv/zlL1m9ejXh4eHN+JtomJPF2dSIs4iINECDnnF2Op0UFRUBsHbtWi699FIA7HY71Sc+iNorw1H7AWtXcRYRkVYiNTWVN954g4KCAtLS0khPT+fnP/85l156KStXruQvf/kL11577RlfX1RURE5Ojm/hznHjxpGTk0NxcXGd65xOp2+qd1VVFTU1NX5N/X777beZMGECAN27d2fAgAF8+umnjX27zcI6saCaEaTiLCIi/mvQiPPll1/OI488Qr9+/di3b5/vWaqdO3f6RqLbq++naltU12hlUhERaR06derE3LlzqaysZM+ePdTU1JCcnExMTMxZX5ufn09CQgKmaQJgmibx8fHk5+efshDnBx98wFNPPcW+fft44IEH6NOnj+/cW2+9xeeff07Hjh259957+dGPfgRAXl4enTt39l2XmJhIQUFBg95fc65Snp2djfu772rvu30HtoMHm+3e51pb2irtXyl74LTl/MoeGMp+Zg0qzjNnzuR///d/ycvL45lnnvEt4JWTk1PvX7Tbgx+uqu2qVnEWEZHWJTQ0lNTU1HN2/7S0NNLS0sjLy+Oee+5hxIgRpKSkMHHiRO666y4cDgdr1qzh7rvvZtWqVX4Vd380x5aS8P12YwcPHGQPcOHFF2N3Bm7KeEOc79u8BUpbzg5tO7+yB8b5nv1sW0o2qDg7nU4eeeSRU47fd999DU/WxthMEy+1I84ujTiLiEiAHT16lL///e/cfvvtANx5551UnVgxGmpHj5988sl6t3BMTEyksLAQy7IwTRPLsjh06FCdPaH/VVJSEgMHDuTjjz8mJSWFjh07+s5dfvnlJCYmsnPnToYOHUpSUhIHDx70ZcjPz2fYsGFNfetN4nGdWBxMzziLiEgDNOgZ5++++8633zLAmjVrePDBB/nzn/+MZbXvMmmz2cBux/R6VJxFRCTg/u///o/vTkw7htrdLjp16sQFF1zABRdcwJEjR/jrX/9a7z3i4uJITU0lKysLgKysLFJTU08p2yf3iwYoLi5m/fr19O7dG6hdOPSkbdu2cfDgQXr06AHA2LFjWbJkCQB79uxh8+bNDB8+vAnvuuk81dVgs2GzN2jsQEREznMN+tSYPn06t9xyCykpKeTn53P33XczdOhQXnnlFcrLy3nggQfOVc7WwTSxey1N1RYRkYBbvXo1Dz30UJ1j9957L8nJyUDtM8nz5s1j6tSp9d5n1qxZZGRkMH/+fCIjI8nMzARgypQp3HfffQwcOJAlS5awZs0a7HY7Xq+XyZMnc8UVVwDw1FNPsXXrVgzDwOFwMHfuXN8o9O23305GRgajR4/GMAz+8Ic/4HQ6m/tX0SCe6mqMoCDtay0iIg3SoOK8e/du+vXrB8C7777LoEGDWLBgAf/85z+ZPn36eVCc7ZqqLSIircKBAwfo1q2b7/s+ffoQ9IOVonv37s3evXvPep+ePXuydOnSU44vWLDA9/X06dPP+PqTRft0wsLCmDdv3lkztKSTxVlERKQhGjRV27IsHCcWyVq3bh0/+clPAOjatStHjhxp/nStjM1uanEwERFpFVwuF6Wlpb7vX3/9dRISEnzfV1RUBCJWq+dxqTiLiEjDNag49+7dm9dee40NGzawbt0633NKhYWFzbZ6ZqtmN2u3o3KrOIuISGAlJyezdevWM57fvHlzu98qsjE81dVaGExERBqsQcX5wQcfZOnSpfzqV7/i2muv9e3h+OGHHzJo0KBzErA1sdnt2NGIs4iIBN7o0aOZN2/eaWd8FRYW8txzzzF69OgAJGvdNFVbREQao0HPOF9yySWsW7eO8vJyoqKifMcnTJhAaGhos4drdex2gvBQoWecRUQkwG6//XZWr17NVVddRXp6Ot27dwdq1yP5xz/+QVJSEnfccUdgQ7ZCKs4iItIYDd6LwTRNQkJC+Pbbb7HZbHTt2vX8mQpmmjhsHqpVnEVEJMDCw8N59dVXefLJJ3nrrbd8zztHRkZy3XXX8Z//+Z+Eh4cHOGXr46muxgwODnQMERFpYxpUnN1uN08++SSvvPIKNTU1eL1egoKCmDx5MlOnTvUtHNZe2UwTu9etqdoiItIqREZGMnv2bGZy2+DQAAAgAElEQVTNmkVxcTEAsbGx2mqpHparmqDoqLNfKCIi8gMNKs6PP/44b731FrNnz2bIkCEAbNiwgaeeegqv18u0adPOSchWw27HTqW2oxIRkYArLy/n/fffZ9SoUTidTuLi4nznysrK+OCDD7jqqqsICwsLYMrWx1Pt0lRtERFpsAYtDpaVlcUf//hHfvazn9G1a1e6du3KDTfcwH//93+zcuXKc5Wx9bCb2L2WRpxFRCTgXn/9dVatWoXT6TzlXEREBG+//TavvfZaAJK1blpVW0REGqNBxbmsrIzk5ORTjicnJ9fZS7LdMu2YXksjziIiEnCrVq3il7/85RnP//KXv+Stt95qwURtgxYHExGRxmhQce7bty+LFy8+5fiiRYvo27dvs4Vqtewmptej4iwiIgG3d+9eLrjggjOe79WrF/v27WvBRG2DirOIiDRGg55xfuihh7jzzjtZu3YtF154IQBff/01hw4dYsGCBeckYGtiM01Mj6Zqi4hI4Hm9XoqKikhKSjrt+aKiIjweTwunav08LhVnERFpuAaNOF9yySW88847jB07luPHj3P8+HHGjh3Liy++eNqR6HbHbsfwaKq2iIgEXu/evVmzZs0Zz3/22Wf1jkifj7yWhdftxtB2VCIi0kAN3sc5ISGBqVOn1jm2fft2Vq9e3WyhWi3TjuFxax9nEREJuBtvvJE//vGP9OrVi1GjRtU59/777/OXv/yF3//+9wFK1zp5qqsBNOIsIiIN1uDifF6zm9gsC5fLHegkIiJynrvppptYv349//Ef/0GPHj1ISUkBYNeuXezdu5err76am266KcApWxcVZxERaSwV5wawmSY2vNTUqDiLiEjgPfHEE/z0pz8lKyuLPXv24PV6SUlJ4b777uOaa64JdLxWR8VZREQaS8W5Iey1vy6b5cZtebCbDXpEXEREpNldc801Ksl+slwqziIi0jh+Fee77rqr3vMVFRXNEqbVs5sAtXs5V1vYQ1WcRUQksMrLy1m7di379+/HZrPRtWtXfvzjH+N0OgMdrdU5OeJsBqs4i4hIw/hVnGNiYs56vkuXLs0SqFUza39ddq+Hqmo34aGOAAcSEZHz2apVq5g1axalpaV1jkdGRjJ79myuvvrqACVrnTxVVQAYISEBTiIiIm2NX8X5scceO9c52gTbD0acj1e5iYsKcCARETlv7dixg4cffpgxY8Zw++2306tXL7xeLzt37uSll17ioYceIiUlhT59+gQ6aqvhPn4cAHt4eICTiIhIW6O5xg1hPznibFFaUR3gMCIicj5bvHgxw4cP58knn6Rfv34EBQURHBzMgAEDeOqppxg+fDiLFy8OdMxWxV1e+2iZGRYW4CQiItLWqDg3RFBw7T88NZRWuAIcRkREzmcbNmzgF7/4xRnP/+IXv2DDhg0tmKj1s3wjzirOIiLSMCrODWALrX0mKtRyacRZREQCqrCwkJ49e57xfEpKCoWFhS2YqPWzNFVbREQaSdtRNURoaO0/PNUqziIiElCVlZWE1LPIVUhICFUnFsOqT25uLhkZGZSUlBAdHU1mZibdu3evc82yZct4+eWXMQwDj8fDTTfdxM033wzA888/z6pVqzAMA4fDwdSpUxk+fDgAGRkZrF271rfI6NixY/nNb37TyHfcdO6KCmx2u7ajEhGRBlNxbgBbWG1xjqCGY+UqziIiElg7duwgKur0K1UePXrUr3vMnDmTSZMmkZ6ezooVK5gxYwaLFi2qc82YMWO44YYbsNlslJeXM378eIYOHUrfvn0ZNGgQt912G6GhoWzfvp3Jkyfz+eef+0r9nXfeyeTJk5v2RpuJu+K4pmmLiEijqDg3RHAw2GxEmW494ywiIgF3++234/V6z3jeZrPV+/qioiJycnJYuHAhAOPGjWPOnDkUFxcTGxvru+6He0JXVVVRU1Pju/fJ0WWAPn364PV6KSkpoVOnTo16T+eSdbwCU9O0RUSkEVScG8BmGNjDw4mw1ZCrqdoiIhJAH3zwQZPvkZ+fT0JCAqZ5YrtF0yQ+Pp78/Pw6xfnkz3vqqafYt28fDzzwwGm3uVq+fDldu3atU5oXLlzIkiVLSE5O5oEHHqj3uexzzTp+HLtW1BYRkUZQcW4gu9NJuLdGzziLiEhAhbfwyGlaWhppaWnk5eVxzz33MGLECFJSUnznv/jiC5555hleeukl37GpU6fSsWNHDMNg+fLl3HHHHbz//vu+ou6PLVu2NNt7KCk8jM1hJzs7u9nu2VLaYuaTlD1w2nJ+ZQ8MZT8zFecGskc4CS3TqtoiIhJYP/7xj886Fdtms5GTk3PG84mJiRQWFmJZFqZpYlkWhw4dIjEx8YyvSUpKYuDAgXz88ce+4rxx40Yeeugh5s+fX6dMJyQk+L6+/vrreeyxxygoKKBz587+vk0GDBhAcHCw39efSXZ2NiE2COuUQN8hQ5p8v5aUnZ3NkDaW+SRlD5y2nF/ZA+N8z+5yuer9Y62KcwPZIyIIPnpIxVlERALqXxfw+qHPPvuMRYsWnXVkNy4ujtTUVLKyskhPTycrK4vU1NRTpmnv2rXLN8W6uLiY9evXc9VVVwHwzTffMHXqVObNm0f//v3rvK6wsNBXnj/77DMMw6hTpluadfy4nnEWEZFGUXFuILvTiaNmL5UuNzVuC4fd/+lmIiIizWXo0KGnHMvJyWHu3Lls2LCBiRMncvfdd5/1PrNmzSIjI4P58+cTGRlJZmYmAFOmTOG+++5j4MCBLFmyhDVr1mC32/F6vUyePJkrrrgCgNmzZ1NVVcWMGTN895w7dy59+vRh2rRpFBUVYbPZcDqd/OlPf8JuD9x/ergr9IyziIg0jopzAzkinJiuSgBKK6qJiwoNcCIRETnf7d+/n6effpp33nmH0aNHs2rVKrp27erXa3v27MnSpUtPOb5gwQLf19OnTz/j65ctW3bGcy+//LJfGVqC1+PBU1WlEWcREWkUFecGsjud2FxV2LweFWcREQmoo0eP8vzzz/P6669z0UUX8dprrzFo0KBAx2qdXLXbSGofZxERaQwV5wayR0SA10uwp4bScj3nLCIigfGnP/2JF198kc6dOzN//nxGjBgR6EitmreqtjibmqotIiKN0KLF2eVy8eijj7Ju3TqCg4O58MILmTNnzhmPA+Tm5pKRkUFJSQnR0dFkZmbSvXv3loxdhz3CCUCIpZW1RUQkcJ555hlCQkLo1KkTr776Kq+++uppr3vhhRdaOFkr5XYDYDbDCt0iInL+adHi/PjjjxMcHMy7776LzWbjyJEj9R4HmDlzJpMmTSI9PZ0VK1YwY8aMelcSPdfsztriHOpxUVrhClgOERE5v11//fVn3Y5KfsCyALAFcHEyERFpu1rs06OiooLly5fzySef+D7oO3TocMbjAEVFReTk5LBw4UIAxo0bx5w5cyguLj5lq4yW4oiIACDUqtaIs4iIBMz//M//BDpC26LiLCIiTdBinx779+8nOjqa5557jvXr1xMeHs7999+P0+k87fGLL76Y/Px8EhISfPtQmqZJfHw8+fn5ASvOJ6dqR5tuFWcREZG24kRxNlScRUSkEVrs08OyLPbv30+/fv2YNm0amzZt4q677mLevHmnPf7ee+8128/esmVLs91r665dAITjYs+BArKza5rt3udadnZ2oCM0mrIHRlvODm07v7IHRlvOLvXznhxxdqg4i4hIw7XYp0diYiJ2u51x48YBMHjwYGJiYggJCTnt8dzcXJKSkigsLMSyLEzTxLIsDh06RGJiYoN+9oABAwhuhsVAsrOzGXLZZazlaeIcXkqDwhkyZEiT79sSsrOz20zWf6XsgdGWs0Pbzq/sgdEc2V0uV7P+sVaakeUBwLA7AhxERETaIqOlflBsbCzDhg1jzZo1QO1q2UVFRXTr1u2Mx+Pi4khNTSUrKwuArKwsUlNTAzZNG8Bmmpjh4YRTo6naIiIibYVVu6q2nnEWEZHGaNFPj9mzZzN9+nQyMzOx2+3MnTuXyMjIMx4HmDVrFhkZGcyfP5/IyEgyMzNbMvJpOSKchHm0OJiIiEibocXBRESkCVr00yM5OZnFixf7fRygZ8+eLF269FxHaxB7RAQhlS6OlVfj9Xq1HYiIiEhr55uqreIsIiIN12JTtdsTu9NJkLsKt+WhorLtLA4mIiJyvvJqxFlERJpAxbkR7BFO7NVVABwuqQxwGhERETkrFWcREWkCFedGsDudGFXHASg6VhXgNCIiInJWJ/dx1nZUIiLSCCrOjeCIiMBbeRy8Xo04i4iItAW+EWdtRyUiIg2n4twI9ogI8HoJ97goUnEWERFp/TTiLCIiTaDi3AjBHeIA6BLi1oiziIhIW3ByxNk0AxxERETaIhXnRgjq0AGATo4aio6pOIuIiLR2XsvCZprYDP2nj4iINJw+PRohOK52xLmj4eKIRpxFRERaP8ujFbVFRKTRVJwbwREdhc00ifZWcvhoJZblCXQkERERqY/lVnEWEZFGU3FuBJthEBQXS4znONVuDwcPlwc6koiIiNTHsjBUnEVEpJFUnBspuEMHQqtqC/Oug8cCnEZERETqpanaIiLSBCrOjRTUIQ5bWQlBdoPdKs4iItJG5ebmMmHCBMaMGcOECRPYs2fPKdcsW7aM8ePHk56ezvjx41m0aJHvnGVZzJ49m1GjRjF69GiWLl3q17mW5rUsbUUlIiKNpk+QRgqOi6OoaD3dUyPYdUDFWURE2qaZM2cyadIk0tPTWbFiBTNmzKhTjAHGjBnDDTfcgM1mo7y8nPHjxzN06FD69u3LypUr2bdvH6tXr6akpITrr7+eSy+9lC5dutR7rsVZlkacRUSk0TTi3EjB8fF4a2roHWtn98ESvF5voCOJiIg0SFFRETk5OYwbNw6AcePGkZOTQ3FxcZ3rnE4nNpsNgKqqKmpqanzfr1q1iptuugnDMIiNjWXUqFG88847Zz3X4lScRUSkCVScGymkUwIAPUKqqahyU1h8PMCJREREGiY/P5+EhARM0wTANE3i4+PJz88/5doPPviAa6+9lpEjR3LHHXfQp08f3z2SkpJ81yUmJlJQUHDWcy1Oi4OJiEgT6BOkkUISOwHQidrCvOvgMTrFhQcykoiIyDmTlpZGWloaeXl53HPPPYwYMYKUlJRz/nO3bNnSPDeyLCpq3GRnZzfP/VpYW80Nyh5IbTm/sgeGsp+ZinMjBXfoAIZBhKsUw3Cy++AxLh+UdPYXioiItBKJiYkUFhZiWRamaWJZFocOHSIxMfGMr0lKSmLgwIF8/PHHpKSkkJiYSF5eHoMGDQLqjjLXd85fAwYMIDg4uJHv8HtrX15MZEw0A4YMafK9Wlp2djZD2mBuUPZAasv5lT0wzvfsLper3j/Waqp2IxkOB8EdOlB96BDJ8U52HSgJdCQREZEGiYuLIzU1laysLACysrJITU0lNja2znW7du3yfV1cXMz69evp3bs3AGPHjmXp0qV4PB6Ki4t5//33GTNmzFnPtThtRyUiIk2gT5AmCOmUQFVBAb0v/glrN+djebyYhi3QsURERPw2a9YsMjIymD9/PpGRkWRmZgIwZcoU7rvvPgYOHMiSJUtYs2YNdrsdr9fL5MmTueKKKwBIT09n06ZNXHXVVQDcc889JCcnn/Vci7PcKs4iItJo+gRpgpBOCRStW8+FvTvy3hf72Ln/KH27xZ79hSIiIq1Ez549T7u/8oIFC3xfT58+/YyvN02T2bNnN/hci9PiYCIi0gSaqt0EYV2TcZeV0T8+CJsNNm4/FOhIIiIicjqWB5tDxVlERBpHxbkJwnv0AMAoPMgFydGs3Zyv/ZxFRERaIa9GnEVEpAlUnJsgvHt3ACp25zLmx93Zk1/Kxh2HAxtKRERETmVZesZZREQaTcW5CezOcILj46nYs4eRQ5LpEBXCmx9/F+hYIiIi8q9UnEVEpAlUnJsovEd3ynfl4rAbjL20O1/vPEz+kYpAxxIREZEf0lRtERFpAhXnJopM7UtVXh7VxUcZNbQrhg3e+2JvoGOJiIjID2nEWUREmkDFuYmiBg8CoGTTJuKiQhmSmsD7X+zDsjwBTiYiIiJA7cKdKs4iItIEKs5NFN69G/bISEo2bQZgzLBuHC1z8UVOQYCTiYiICACe2j9mGw5HgIOIiEhbpeLcRDbDIPrCQZR89RVey+Li1ATiY0J54pWv+OeW/EDHExEROe953G4AjTiLiEijqTg3gw6XXUbNsVKObd6CaRr8zz3DSYgNY9GqHO3rLCIiEmDemhoADIeKs4iINI6KczOIGfIjzNBQDn/yGQAdY0K5cWQv9heWs2mn9nUWEREJJI04i4hIU6k4NwMjKIgOwy/nyOdrqC4+CsDwCzsTGxnMX9/KwfJo1FlERCRQvDW1xVnbUYmISGOpODeTzjdcj8ft5sAbywAIcpjcft0AvjtwjJWf7Q5wOhERkfOXRpxFRKSpVJybSWhiIp3GXEX+W29zZO06oHbUeVj/Tvz1rRz2FpQGOKGIiMj5yesrzlpVW0REGkfFuRn1uP1WwnumsOell/G43dhsNu79+YV4vF4++epAoOOJiIicl04WZ03VFhGRxlJxbkaGw0HXSRNxHT7CoQ8/BiDKGcwFydFs/u5IYMOJiIicp3xTtbWqtoiINJKKczOLGXIREX37kLvgRY5t3gLAoF4d2Lm/hEqXu861lsfL3vxS9haU8kVOAWs25XG8qiYQsUVERNotjTiLiEhT6ROkmdlsNlJ/n8Hm6Y+Q89+P0XXSRHpv/pYIVwL/9/63jPlxNyyPl4rKGhav2sbX/7JdVURYED+7sidxUaFUutwYNhjavxNxUaEBekciIiJtm+fEPs5aHExERBpLnyDngCMykv6zZ7Jtzh/Z89LLAIzrexl/+3Anb3y403edYYNbru1Hp7gwIsKCMA0br7+3g0WrttW536vv7mDEjzrTp1sMF6cmEOQwsZuaLCAiIuIPr1bVFhGRJtInyDkSHBfL4P99gqq8fLbPfYJ+xlGeuG84+wvLsJsGIQ6D6F2bML55h+ojR3AdPowjOZlfd+yA+6JoLEcQsf1SKYuIY8E/cli9fi//+Gw3hg08XujWKYJBF3TkuuEpdIoLD/TbFRERabU0VVtERJqqRT9BXC4Xjz76KOvWrSM4OJgLL7yQOXPm+M4/99xzPPvss6xcuZLevXsD8PXXXzNjxgxcLhedO3fm8ccfJy4uriVjN5rNZiO0cxLRgweRt2Ilca/9P4bd8DOC4uLY9fx8irI3Ync6MYKDCOvaFdehQ5Rs/Nr3AX8UCIqLZVJkFBH9UjlaVkXRvnw8YRHYv9rBtq1J3P/phaTE2DkWHEn6iJ4kxIbSuWMEsZHBGIYNm80W2F+CiIhIgHlqTi4Opu2oRESkcVq0OD/++OMEBwfz7rvvYrPZOHLk+5Wmt27dytdff03nzp19xzweDw899BCPPfYYF198MfPnz+eJJ57gsccea8nYTRbZvx95K1ZStG49RevWg82GzTRJ+fcpdLp6TJ1yW3PsGF7Lg7uigvJduzny+edYlVUUvP0ORlAQcRFOXHu2EZHal7Bt2/hR6U6MXW6Kwjty/MsaDllVfOTswf7QBEJioig1Qknpm0x1dQVltgNcNjAR0zQoKavSc9MiInJe0IiziIg0VYt9glRUVLB8+XI++eQTX1Hs0KEDANXV1fzhD3/gySef5Oabb/a9ZsuWLQQHB3PxxRcDMHHiRNLS0tpccY6+cDCdrh5L3KXDKNvxLV7LIn7kTwjp1OmUax1RUQAExcYQltyF+CtHAGBVVmIEB4PNhlVRgd3pJP+tVRS8+x5xl12K86uNVFe78UTGcMk3XzH02DYoqL2ntdVGUVAU5W+7edt0UBiRSHxpHu7kFLqNTSOqdy+SIu2EhoficVVjj3BqpFpERNoNj1uLg4mISNO02CfI/v37iY6O5rnnnmP9+vWEh4dz//33c/HFF/PMM89w3XXX0aVLlzqvyc/PJykpyfd9bGwsHo+HkpISoqOjWyp6k5nBwfS8awoA0YMHNe4eod+PDtudTgASr72GxGuvAaDrxJ/7zlfm51NzrJSakhLcFRUU5x7AzNmCPSKWYwfy6H8kh8rYTth3b6L6+a8owOAwHryADbBCwjma1BPnJcPodHg3FW6I7dSBiPhY4i67FHt4OJ7qamwOhwq2iEgbl5ubS0ZGhu+zNTMzk+7du9e55vnnn2fVqlUYhoHD4WDq1KkMHz4cgFtvvZWjR48CYFkWO3fuZMWKFfTt25eMjAzWrl1LTEwMAGPHjuU3v/lNi74/0OJgIiLSdC32CWJZFvv376dfv35MmzaNTZs2cdddd/HMM8+wZcsWHnzwwXP2s7ds2dJs98rOzm62e51zDjtER8GPogj5UX8AYr1evCUlBEdH4yqv5NhXOXD4MEcJoeBwJeVeO4muInrt2Ubw7m8owgC8FOKlENjx4iLMmCjIy4OgIMzBA7F16oTZqyfWrl1Q5cIc8iNsDgfW9h2116T0aPJbaVO/93+h7IHTlvMre2C05eyNNXPmTCZNmkR6ejorVqxgxowZLFq0qM41gwYN4rbbbiM0NJTt27czefJkPv/8c0JCQnj55Zd9173//vs8/fTT9O3b13fszjvvZPLkyS31dk7LN1XboeIsIiKN02KfIImJidjtdsaNGwfA4MGDiYmJYcOGDezatYu0tDQACgoKuP3223nsscdITEwkLy/Pd4/i4mIMw2jwaPOAAQMIDg5u8nvIzs5myJAhTb5PIJwx+5XDfV+WH69md94xOsWFExtq8O2Ha/m2IgivM4qlH39HRFkRlx39hrASN3tiBtDZdJG84SsMrxf3D27pXv0+RrgTT0U5ACF9+1BTWkrNsVKiLxyMYbcTkdqX43v3EjWgP6FdumAzDMp376bj8CuwmeZps1fm5RHcsSNGG1rcpV3+f6aNaMv5lT0wmiO7y+Vq1j/WnmtFRUXk5OSwcOFCAMaNG8ecOXMoLi4mNjbWd93J0WWAPn364PV6KSkpodO/PHL0xhtvcOONN7ZM+AbwaMRZRESaqMU+QWJjYxk2bBhr1qzhiiuuIDc3l6KiIiZPnszdd9/tu+6nP/0pL7zwAr1798bj8VBVVcWGDRu4+OKLef311xk7dmxLRT7vOMOCGNSro+/7ftf8lH4nvh71kz7sKyij+NjVrPh0F327x7Jp/1G2mTbKv/2WuGP5HInsRHW1Rffj+US4KzielErHqFASDn2HFeokrl8Pjn65AZvdzuFPPgXDoODtd+tk2PvXv2EzDbDZiBo0CFdhIdUuF9/83zLKtu8g9sfD6JvxEN6amnqnilfk7qGmtLTRU+NFRM4H+fn5JCQkYJ74g6VpmsTHx5Ofn1+nOP/Q8uXL6dq16yml+fDhw6xbt45HH320zvGFCxeyZMkSkpOTeeCBB+jZs+e5eTP18NZocTAREWmaFv0EmT17NtOnTyczMxO73c7cuXOJjIw84/WGYTB37lxmzpxZZzsqaXkRYUH0T6ndBmz4jzrXOVd0bAi7Dx7joj7xbNp5hD35pQQ7DD766gA7yqsps1+Aq8bCKvHgSe7Jhb1iCdrzLUeiOxNeeoQ+ERY9I7306t+DkuyvsJkG3upqitauwx4ehqe8gpqoKDpccTlHPl/Dl7feQU1JCY6YGOKvHIHryBGcF/TCXVpGTVk5ZmgIBe+sxlNdTY9f34K7ooKqggKiBw+m45UjOPzxpxSt+ydd/u0GIvr0DsSvU0SkTfriiy945plneOmll045t3z5coYPH16ncE+dOpWOHTtiGAbLly/njjvu4P333/cVdX80xwi+e98+AL7atAmbYTT5foHQlh8jUPbAacv5lT0wlP3MWrQ4Jycns3jx4nqv+fDDD+t8f9FFF7Fy5cpzGUuaKC4q1Le11UV947mobzwA116RAoDX6+V4lZvX39tBRWUNH3y5jz7d+hDvDMLoHMfqXUWU7qkmuqgKw9af41U1DOufyGVX/5J9RRUUHSng1hsup7KqhgP2GCJqjpHQOYGybds5+OYKzPAwjny2BgwDR4QTd8VxQjsn4alxk/viQrDZsEdEcPjjT9m7+BWqi4uxmSZlO3YQmpxMZN8+VJccw+Oq4vi+/XS44nLCkrsQHB+Px+WidNt2guLi6Dj88lOmkfvD6/VqETURaZUSExMpLCzEsixM08SyLA4dOkRiYuIp127cuJGHHnqI+fPnk5KScsr5v//97zz88MN1jiUkJPi+vv7663nssccoKCios/Xk2TTH41Z7t+3ggM3GxZdc0qT7BMr5/ghEoLTl7NC28yt7YJzv2c/2uJXmLMk5Z7PZCA91cPt1AwC47boBhIfYfWXS8njJ3lbIZ18fpMbyEB7iYN3mPD7ZeMB3j3+szzrxVSzhoQn0jYlh4MghxKW5yK00CKosJzqpI26vjVGXdMVhN/BUV+MqLCSkUydspkle1ipKc7YRe8kQnL16sf2xudQcO8aBN/6OPSICr2URkpjIvldeO+37OPDGMqyK4wR37Ej10WJCu3Sh/LtdBHeIo/LAQWwOB7EXD8F5QU/Kd+7C467Btf8AW954k/5zZtVOHy8pITI1Fbsz/Iy/L6/H02ZHRESkbYmLiyM1NZWsrCzS09PJysoiNTX1lGna33zzDVOnTmXevHn079//lPt89dVXlJWVMWLEiDrHCwsLfeX5s88+wzCMOmW6pXjdbmjEHz5FREROUnGWFucMrbu4l2nYGNq/E0P7f/+83F03DGL7nmKcYQ7WfrkZI6QDdrtBj6Qo3lm3h/yiCl5etQ0AwwZewOut3bj65ayteLwQGxFCckIEyQllJMSGMfLqq+mcPh635cGw2Rjy5+cBcB8/jj0szPeza8rKcB06TFVhITbTTmRqH45t3sKBpcsI6pxEZX4BwTBwzccAACAASURBVHFxHNv0DZH9++GpriZhdBpWZRXFX37J4U8+xREdjdfjwVtZSWlNDRvv/S1Vefm17zc8HJvNRmT/VNzlFeD14oiOJu6ySylas5aSb76h+82/IqhDHDbTpPrIEaqPluDs1ZOQxEQO/v1Nwrt3I35UGoc+/IiYIRcREh9f53fqqalpU4uoiUjgzJo1i4yMDObPn09kZCSZmf+/vXuPj6q+Ez7+OXO/33KdJCQhCYmRJNxSERQV0IIWhK0vWx8e3bbenq3P6q59rUJ1F9fLroW2u7VK69OLbt26dbUqdVEBKyJSECEgEO6EEBJyv19nMpfz/DEwMAQiApIZ+L5fL16vmXPOnPnOOWfy5Tu/3/n9lgBw33338dBDD1FaWsqTTz6Jz+dj8eLF0dctXbqUoqIiINLaPH/+/CFdsBcuXEhbWxuKomCz2fjlL3+JbgTuMw5L4SyEEOI8SeEs4pJep6G0IBmA9iwzkyadmNqkvDjSWtHe7aOnf5CMZBuBYIjWzgFqm3vZurcZk0FLZ4+fHQdb2bK3iXBY5T/f38PksV7WbavDYTPithtRlEhX87KCZJw2I7leB2FVRWtPISv/RFfE5GumknzN1JgYQ34/2lO6D4aDQQKdXRiSPKjBIFu3bsWzczc9e/eSc9f/xlY4hsaVqyEcpv2zzZi86ehdLrp376Ftw0Y0RiOmtFSqfvn/vvAYVb/8CmoggN7pIPnaa2n7dBOWUVkoWi1dOyvJvO2vSJp8Fb7mFgweN31Vh/C3tmK/ogh74Rga3luJs7QE59jIEHDhwUHQaOirOoRtTEH0fbr37mOgtpa0m278kmdRCJEI8vPzeeONN4Ys//Wvfx19/Oabbw67j2eeeea0y0+eqmokqYGAFM5CCCHOixTOImF5HCY8DhMQKbSz0/Vkpzu4piwjuk0oFCaswoHaDpZ/XMWailpK8pKwWfT4B0OEwypVdZ1s3NkwZP95mU5S3Wbcx97HbTdSmO0m1+vAHwjhG4T9BxsZm5eE9Vgrukanw5gcGURN0etRdDry7v1ezH5dZaVApFVY0WpRNBpCPh/du/dgLypEYzTSd6gaFAU1EEBjMmH2ptO9Zy/+5hbsxVfQd+gQPfv2YysooHHlKhrefQ9HyVj8bW34WyLFce0f/pvaP/x37IdSFFDV6NO6N97Ec9XX8DU101dVhTE1FX9zM6b0dHxtbWzPyaa/to6w30/voWp0FktkGpptn2NMScZ7y830HqoGwD6mAPsVRfTXHEHRatE7nRg8btRwmGBPD1qrdciItgP19egdzmG7rgshxPkKB4Ogk8JZCCHEuZPCWVzStFoNWuDK0UlcOTqJQDCMXhd7/7CqqrR0DtDdN0htUw8aRaG5o58dB1qpb+1j16F2evoHo9unus20dfkIhSMFqMWkw2E1MG18JoFgmLKCZAYDYZJdJnYf6cee0kFhtntIbCd3pdaaTLgnTog+txeOGbL9yeutOdmkTr8BgLQbZxDs7UNrtaAoSnQwsp4DB+mvqcGSk4O/pQWdzYa9qJCePXvp3r0H6+jRtG7YQO+BgxjcbtK+fiPtn20h/eZZ9B2uIZDpRTPgw5yVhd5uo/G9lShaLaqqYskeRef2nbRv2hwTo6LTRe4lPP45iooIdHXia2xCYzKhs1jQu13k3LmA/poj1Pznq2gtFlJuuJ6OzZtBUciYG5nrfaChgf7DNdiLCnGNH4f9iqKYYxbsH0Cj06IxGIYcq2D/AMHPtxMqKRnSK0AIcflRg8FzGtxRCCGEOE4KZ3FZObVohsjgZaluC6luCwVZrujy22eemKoqEAzR1uVj+4EWNu9uYmpZBh6HifQkK5t3N1LX3MsbHx5Ao8Dyj6ti9v/6+nWMznAQCIZJdppJ9VgozvVwpKmHFJeZaeMzqa7vItfrwH2sBR2+3GjcJ7fYHn+NfUwB9mNdru0ndb12jR+Ha/w4AJKmTI7d0f898bCiooLSY6MTqqpKaGAg5l7wYG8fPfv3Y87MRGe10rljB107dmK/ogit0UhfzRE6t32OKT2d9FtuZqC2jmBfH107K9n9ZKRbp7OsFEWjoeF/VmAbMwYUOPSr30Q+h06HZVQWdW8tp+6Pb6ExmTCmJBP2D2JKT6PvUDVaq4WkKVfTue1zkqZOwZKVSffuPXTv3Uew6hA7d+3FceUVhAZ86GxW9HY7jiuLaVm3ntBAP5acHHyNTfTX1GDyekmeejWu8eOGFOMhn49gXz/GJE/0eXgwgN5hP+35GKivjwxKd2yQNzUcZrCjM/p6IcTFFQ7IPc5CCCHOjxTOQpwFvU5LepKV9CQrs67OjVk3pdQb6b7c40er1VB9tAuzSUdnj5+m+mq6gi6qjnZh1Gupb+2l6mgnqzfVoNEohMMqv1q+M7qvgiwnZQUp7DvSwYHaTiZdkcqAP0hWqo1vzSzEYTNS39LL0ZZestPtZCTbCIdVNJqvdrorRVFiimaIFOsnt4InT51C8tQp0edJU64m+45vDdlXoLuHvsOH0TudWLJHoSgKoYEBNCYThMN07dqN2evF4HGjaLWRYrtyF53btjPY3obWZKb34EEsuTkMtnfQ8D/vYkxLjXZL15hMaM0mtFdPJlhVRdMHH6I1Ggn29UVbwzVGIzqblZa169CYTNjy82j/bDMtH62NdI3PzCTU14fGaEBntdKz/wBqKETyNVMxZ2XSvGYtg+3tuCdNwFZQAKpKOBDANqaAru07aXj3PZKmTiHY04Pe5UQNBmn79DOybvsrwsEgaiiEJSsL86ismHvMFa02sl5VI9O4HamN3LeuGdpLAsDX2HRsX2c/tY8QlyMZVVsIIcT5ksJZiAtAUZRoa/G4wpTo8grfUeZOKo7ZNhRWqaxqJSvVRke3n7Vb6yjO9XC0pZcte5pYvq4Kq0lPeXEq1fXdWM163v1LNSvWV2M0aPEPhqL7yki20tzRT5LTzKyrcwiGVFBVdlW3cc+tJYzOcF6cA/Al6B326H3ex2nN5mMPtEPW6axWkiZfRdLkq864T1VV6ajYis5qxV44BkWrPTafX+ycsp07duKrbyD5umnoLGYC3T1oTUY0BgPhQICunZW0b96Cr74Bc0Y6Yf8gg52deL9xM2owSOv6v9C6/i8YkpNJnTkjsv2mSBdzFAXCYQAs2aNo27ARg8dDX80Rgt3dmDK81P3xrci974oSGYxNUbDm5hLy+/A3t6CzWgj09ILdzlarFV99Pc6yUqyjcwn7/YQHB/E1NtF7sAoUhXAgAKpK0tWTMY/KwuxNR2e3071nL6b09Ejh7nSSNHUKWqOBrp2V9NfWYc7MoHvXboL9/SRNuTry+X0+9C4XfYdrIBzGkJxE+6ebSLn+OgaO1uMun4TeYaf+f96lYcW7FP/TY5i9XsLBoHSHF3FPCmchhBDnSwpnIS4yrUZh3JhIcZ3kNFMw6kT38G/dWHistZGYVuR9Ne3sremgobWPFJeZ0oJk9hxuZ+u+ZiYWpXKovotXjk3PBWA0aHnop2tJdpkpL05Dq1E42tyLyajl2nGZVOxtor6lD6fNyNg8DxkpNsYXptDU1k9Wqo361j7qWv3UravipquyMeq1aLXxO7e0oih4yr940ntXWSmcVJif3NVao9fjnjghphX9VHn33xsZ1E2jid4vGezvjw7y1r1rN8a0VIzJyTSv+YikqyejMRjoO3av9mBbGwaPh3AwyGB7BzW/ewV/SyvW0bm4J00k0NWF3umiaf9+zDYrnq9NoumDD+nZfwCt0YDGaETvcJA26+ughtGaTIT8g7Rt2Ejbp5tODPx2yiBw1S/9B4qiEOztPfFhNBo0BgON760c9pg1vPs+ADqbDfOoLHr27gNVZcejP0RRIgPbJV97Dbnf+w4dWyoIVh2ksa0dRaul/0gtWrOZ/sOHseTmRnoKZGfjb2klY84t+FvbsBeOYeDoUcxZWbSs+4TB9naCPb3onQ5MXi+2/DxsYwoiPRP8fvqqD2Nwu2jbuAnvN24mNODD39qCv6UV96SJQwag8zU3Y3C7ZXq2y1w4GASNFM5CCCHOnRTOQsQZRVE49dbmohwPRTmx98cWZruZd10+EGlxrWvuxe0w0d3rx2zU8fG2Orbta2H950ej0251NPj4tLIRk0HLFbke6lt7+Wx3ZP5rg17LYCCEy26ks8d/7F1a+O07lbjtRv7pnqt5+6ODANw7v4Sjzb2s3lSDTqshP8vFivWHuH1mITPKR32lx2eknVqAndyF/fi94wDps74efewojkynZkyJ/GCi1Woxe9O5YlFsi/hxHRUVXHns/vLRd3/3C2PKu/d7qOEwA3V1BPsHsIzKwtfUhDE5mYGj9TSt/jOKVot70gQsOdn4m1uwFY5Bo9PRvGYtaiiIweMh5PdjHT0ajU5H/5Ej6F0u6v74Fu5JE+nZtw9/cwveb9xMynXTaFy5CjQatEYjDe+vomXtx9F4jt/lr2i1qKEQWquVto2b0FqtdGyuAI2G1nWfxHyG6MByioLWYiHs86GGIr0rdHYblpwc+qoPH+tCbyTs99P4/ip8jY3RfRiSk7EXjSE8GKC/pgatxUJ/zREsOdkkX3sN/pZWbAV5tG3chN5hR9HpCHR0EujqImPeXLDG3o4gLh2RwcHi98c/IYQQ8U8KZyEuAYqiMCot0npqOzY11vzrC5h/fUHMdoFgmJqGblLcZpy2SPfajh4fB2s7WbOlFo/TxOZdTdx6Sx6NDfVMKitkz+F21lbU8fC/RwojjQLrPj8KgNWkQ1EUPvjsCDqthp+9tpVPKxvYU93OzK+NIjPFRp8vQH6Wi7Gjk6hp7Gbr3mZGZzqZWJQajSsUCsd1i3YiUDQaLNnZ0ee2vMg85HqHI1q4H2fOODFlW/rsr3M65szINlf+02MAeG+ZHbPeXnRi8LyU6TfQtWMn1twcDra3UVpaSjgYxJiSghoIoDWb6a06hC0/j2BvLwP1DbR8vA57UWF0+rSmVR+gMegZfe/daPR6Qn4/oYEBuit30bVrD/01NSRNvgq900HzmrVYskfRe+AgKdNvwJKViTkrk4YV79FXVY3GaMCSk0Ogq4uUG66na8cOjvz+v1B0OppWrUbvdqHR6VDDauR+eIuFtg2fwk0zzuMMiHgmXbWFEEKcLymchbiM6HWamK7hAG67ia9dmc7XrkwH4L55ka7MFRU9TCrLYGpZBt+4ZjQbdjSQ63VgMmrZf6STFJeZCUUp6HUatuxppijHzX+s2MVHFXUUZDl581jr9HEOq4He/kGOzeLFmFEufINBxoxy82llA5PHpjPxijQMOg3+QIgppV58/hAH6zpRVZVwWCU73UHfQCDmM/QNBDAZ4rsr+aXu5BHcNRUVmNLTT6w8dv/z8SnW9E4neqdzSDF/6r3tGoMBvd2OaUYqqTOmx6zL+c5dhPr66dm3D9fECdGR5JOuPmWU+GMio8L7IByiZd16Uq6bdtq5wysqKr7EpxaJJCyFsxBCiPMkhbMQ4gulJ1n55vQTrddXjk6KWT+l1AvADxZM4p5bS3DajPQNBOjq82M16dm2v4UdB1pw2ozMuXY0b350kCON3dgtBtZsqSXFbeajijo+qqiL7tNhNdDvC0QGPDuFy24kI9nK+MJU3l57kCSnCYfVwDVlGahAbrqDgcEw2/e34HGaoq3x4tKgKEpkVPdJE89+e0tkALpTW87F5UENBuH4IIRCCCHEOZDCWQhxQR3vAm4167Ee6zZ+w8QsbpiYFd3m/vknWhdrm3pIcZvp7PETCIbxB0J09vj5cPMR0jwWJhSlggp1zT3UNveSkWLlcH03B2o7+a9Ve8lMsaLVKLR2+fj1nypPiaYegMwUGyajFp1WQygUprw4nTSPmcMNPazffpRgKEyq24JBr6WsIBmPw0SK20yu10GSM/Kf7Z7+Qbbta0ar0TC1zHvWc2wLIUZeOBAAm22kwxBCCJHApHAWQoyo463B6Umxf47Ki9Ninp88zddx9a29uGxGLCY9oVCYNVtqGZPtpqG1j08272HGlLHUNfew/UAroVCkKA+FFV77YB8AOq3CpCvScNmNNLX30+8L8IfV+2Leo6wgmY4eP0ebe6LdzKeNz0Sv09DQ2ofZqKN4tAeXzciAP0iqx4LLZiQjxcqAL0iK20JHj4+uXj8FWa4hI6YLIb56co+zEEKI8yWFsxAiYWUkn2hB0mo13DQ5B4BcrwPDYD2TitMoL04bMkjaYCBEW5cPu0WPzWKIWdfR7SMYUmnu6GfrvmY27qzHm2Rj2vhMJhSlsG1fC3/8cD8AY7LddPb4eXXl3rOK122PFNfTxmditxgoHu1h/5EONBoFi1GHxaSnONdDe0+Qt9ceRK/TcMOkUdjMenyDQUwG+ZMtxLkIB4LRKeSEEEKIcyH/CxNCXHYMei3e5KGDQwG4HSYAUtxmxuYlcdfNxTHrr8jxMHdaHqhqtOiuqutEp9OQ7DTT0NZHZ4+fuuYeLCY9LR0DuGwGuvsGqdjbjNmkY/32evyBEG+tPYhWo6AC4fCp93JHpll648MDZKbY2FXdxg0TswiHVdq6fLR1DaDRKJTkJzN+TEp00LZRaTbqmnuZUJhCdrqD/TUdpCVZ2HWojbF5SaQnnfjcobBKS0c/LpsRk1HSgbh0qcEg6KRwFkIIce7kf0pCCPElHZ/y67j8rBOjfBcce3xqV3OA/zUrMpK0qqo0tffT1uWjYJQrOmp4d98glVWtHDx0mPk3ldPVG2nNrmvp5WvFaWzcWY/daiTJYSI/y4V/MMTailpWbjw85L3+a9VeFEUZUpDnZzlJdppxWA3sOdxOXXMvHoeRB24bR3qyFbNRx4eba2ls68NlM7JxZwNOmwGnzYhep0Gn03Db9DH0DQRw2Y1kptgIh1VUQKuJvN+Rxm5S3RYpxkXcUINB0EjhLIQQ4tzJ/2qEEOIiUxSF9CRrTOsvgMWkJz3JilvbGl3/1P+ZOuy+/IEQR5t7GfAHyUi2snVfM+lJVj7f30JYVcn1Oqiu72JCUSp7qtvZfqCFpvZ+DtZ14rAauG9eCa9/uJ9nXv7spPgi05S1d/soynGj1Wpoau9nMBCivdvH2pNGPx+d4aCrd5BQOMz0SaP4aEsjXX1HSXKauHP2Few42IpGo+BNslJakExDax8GnZax+Ul4HCYCwTD7atqxWQykJ1lARQpuccGFg0E00lVbCCHEeZD/nQghRAIz6rXkZTqjz2d+LRuAsXknpgybNj4TgNL8ZL51Y+GQfVw/MYsjTT20dAww4AtQWpBMdrqDfl8As1EXM4J4bVMPm3c3kuN1UNvUy2e7GnHbI93b3/nkEB6blgduK+Pdv1Tz3H9/jtmoxWLSs6a7FnXliffUaRXKi9PYWdVG30AAjRIpmIPBMDqdhowUG1ePTafqaBe1TT0Y9FocFgMuu5Exo1zMKB+FPxBCVaGxrY9RaXaMeu0Zi+5gKExLxwDpSRYZEf0yo6rqscHBZK53IYQQ504KZyGEuMw5bUZKj00jdjKLST9k2ag0e3Qk9ElXpDH/+vzousFAiB3bt1FePpobr8rhk8/rGJuXTJrHQke3j51VrYzOcEbu7/7oIDsOtjB5bDpXl3jZvLuR3oEAKS4z/kCIvYfb+f3KvSQ7TYzJdhMIhunpH6TuUC9rt9bxm3cqoyOUH++OHimu9aAo2Mx6AsEQg8EwgUCY3oFBgiGVohw3qqqSlWqnbyBAT/8geRlO8jKdeCQjXprCYVBVGRxMCCHEeZH/JgghhLggDHpttDVXr9Mwozw7us7tMHHdhBNzeT96V3nMa6eUeofsr28g0uJ96vRduw618WllA06bkd7+QQpGuWjt9FHf2nus9VphwB/EoNei12kw6LVYTTqMei0fbD5CstPM5/tbsFn0GHQaPtxyhH5/BtcNbYwXlwJFwVY4Bn96+khHIoQQIoFJ4SyEECIuWc1DW7wh0g395K7oX8bxAdpOp6Ki4pz2KeKbotEw7sc/kvMrhBDivMgNP0IIIYQQQgghxDCkcBZCCCGEEEIIIYYhXbWFEEKIy1h1dTWLFi2is7MTl8vFkiVLyM3Njdlm2bJlvPfee2g0GvR6PQ8//DDTpk0DYNGiRWzYsAG32w3A7Nmz+f73vw9Aa2srjz76KEePHsVoNPL0008zbty4i/r5hBBCiAtBCmchhBDiMvbEE0+wYMEC5s2bx5/+9CcWL17MK6+8ErNNWVkZd999N2azmb1793LnnXeyfv16TKbIVGT3338/d95555B9//SnP6W8vJyXXnqJLVu28Mgjj7Bq1SqZEkwIIUTCka7aQgghxGWqra2N3bt3M2fOHADmzJnD7t27aW9vj9lu2rRpmM1mAIqKilBVlc7Ozi/c/8qVK7njjjsAKC8vx2AwsHPnzgv8KYQQQoivnhTOQgghxGWqoaGBtLQ0tMfmONZqtaSmptLQ0HDG1yxfvpzs7GzST5re6eWXX2bu3Lk88MADVFVVAdDR0YGqqng8nuh2Xq+XxsbGr+jTCCGEEF8d6aothBBCiLPy2Wef8dxzz/HSSy9Flz388MOkpKSg0WhYvnw59957L3/+858v2HtWVlZesH0l8pRUEvvISOTYIbHjl9hHhsR+ZlI4CyGEEJcpr9dLU1MToVAIrVZLKBSiubkZr9c7ZNtt27bxyCOP8Itf/IK8vLzo8rS0tOjj+fPn8+yzz9LY2EhmZiYA7e3t0VbnhoaGmJbqs1FSUoLRaDyXjxejoqKCSZMmnfd+RoLEPjISOXZI7Pgl9pFxucfu9/uH/bH2ki6cVVUFYHBw8ILt0+/3X7B9XWwS+8iQ2EdOIscvsY+M8439eL45nn/iXVJSEsXFxaxYsYJ58+axYsUKiouLY7pXA+zYsYOHH36Yn//854wdOzZmXVNTU7R4/uSTT9BoNNHns2fP5rXXXuOBBx5gy5Yt+Hw+SkpKzio2yeGxJPaRkcixQ2LHL7GPjMs59i/K4YqaKNn9HPT09LB///6RDkMIIcRlprCwELvdPtJhnJWqqioWLVpEd3c3DoeDJUuWkJeXx3333cdDDz1EaWkpt912G0ePHo1pXV66dClFRUV897vfpa2tDUVRsNlsPProo4wfPx6AlpYWHnnkEerr6zEajTz55JNMnDjxrOKSHC6EEGIknCmHX9KFczgcpq+vD71eL1NfCCGE+MqpqkogEMBqtaLRyPib50NyuBBCiIvpi3L4JV04CyGEEEIIIYQQ50t+DhdCCCGEEEIIIYYhhbMQQgghhBBCCDEMKZyFEEIIIYQQQohhSOEshBBCCCGEEEIMQwpnIYQQQgghhBBiGFI4CyGEEEIIIYQQw5DCWQghhBBCCCGEGIYUzmehurqab3/728yaNYtvf/vbHD58eKRDGtaMGTOYPXs28+bNY968eXzyyScAfP7559x6663MmjWLu+++m7a2thGOFJYsWcKMGTMoKipi//790eXDHfN4OR9niv1Mxx/i5xx0dHRw3333MWvWLObOncvf/u3f0t7e/oUxxkP8w8VeVFTE3Llzo8d+37590detWbOG2bNnc9NNN/H3f//3DAwMXPTYAR544AFuvfVW5s+fz4IFC9izZw+QGNf8mWJPhGv+uBdeeCHmOxvv17s4f/Hy/TlbksMvDsnhksPPRSLncEj8PD7iOVwVX+iuu+5Sly9frqqqqi5fvly96667Rjii4U2fPl3dt29fzLJQKKTeeOON6ubNm1VVVdVly5apixYtGonwYmzevFmtr68fEvNwxzxezseZYj/d8VfV+DoHHR0d6qeffhp9/qMf/Uj94Q9/OGyM8RL/mWJXVVUtLCxUe3t7h7ymt7dXnTp1qlpdXa2qqqo+9thj6vPPP39R4j1Vd3d39PEHH3ygzp8/X1XVxLjmzxR7IlzzqqqqlZWV6j333BONNxGud3H+4uX7c7Ykh18cksMlh5+LRM7hqprYeTwecri0OH+BtrY2du/ezZw5cwCYM2cOu3fvjv46ligqKysxGo2Ul5cDcMcdd7By5coRjgrKy8vxer0xy4Y75vF0Pk4X+3Di6Ry4XC4mT54cfT5+/Hjq6+uHjTFe4j9T7MNZt24dJSUl5ObmApHY33///a8yzDOy2+3Rx729vSiKkjDX/OliH068XDMAg4ODPPXUU/zzP//zWcUXT7GLcxdP35/zEa/Xo+RwyeEXKvbhSA7/auMfTrxcN/GSw3XnvYdLXENDA2lpaWi1WgC0Wi2pqak0NDTg8XhGOLoz+4d/+AdUVWXSpEn84Ac/oKGhgYyMjOh6j8dDOByms7MTl8s1gpEONdwxV1U1Ic7Hqcff4XDE7TkIh8P84Q9/YMaMGcPGGI/xnxz7cXfddRehUIjrrruOBx98EIPBMCT2jIwMGhoaRiJkAB5//HH+8pe/oKoqv/nNbxLqmj819uPi/Zp/7rnnuPXWW8nKyoouS7TrXXx5ksMvvkT6e3Ym8f737GSSwy++RM7hp4v/uHi+7uMlh0uL8yXo1Vdf5Z133uHNN99EVVWeeuqpkQ7pspJox//pp5/GYrFw5513jnQoX9qpsa9du5a33nqLV199lYMHD7Js2bIRjvD0/uVf/oW1a9fy8MMPs3Tp0pEO50s5Xezxfs1v27aNyspKFixYMNKhCPGF4v37dKlLtOMvOfziS+QcDomXx+Mph0vh/AW8Xi9NTU2EQiEAQqEQzc3NX6p7z8V2PDaDwcCCBQvYunUrXq83pitMe3s7Go0m7n6phuGPeSKcj9Md/+PL4+0cLFmyhJqaGn72s5+h0WiGjTHe4j81djhx7G02G7fffvsZj319fX1cXDPz589n06ZNpKenJ9w1fzz2jo6OuL/mN2/eTFVVFTNnzmTGjBk0NjZyzz33UFNTkzDXuzg38fr9GY7k8JEV73/PTiY5fGQlcg6HxMnj8ZTDpXD+AklJSRQXF7NixQoAVqxYJcNzTAAABu9JREFUQXFxcVx1KTpZf38/PT09AKiqynvvvUdxcTElJSX4fD62bNkCwGuvvcbs2bNHMtQzGu6Yx/v5ONPxB+LuHPzbv/0blZWVLFu2DIPB8IUxxlP8p4u9q6sLn88HQDAYZNWqVdFjP23aNHbu3BkdyfK1117j5ptvvuhx9/X1xXQvW7NmDU6nMyGu+TPFbjQa4/6av//++1m/fj1r1qxhzZo1pKen89vf/pZ77703Ia53ce7i5ftztiSHjyzJ4SMXu+TwkYs/3vN4POVwRVVV9bz3comrqqpi0aJFdHd343A4WLJkCXl5eSMd1mnV1tby4IMPEgqFCIfD5Ofn84//+I+kpqaydetWnnjiCfx+P5mZmfz4xz8mOTl5RON95plnWL16Na2trbjdblwuF+++++6wxzxezsfpYn/xxRfPePyBuDkHBw4cYM6cOeTm5mIymQDIyspi2bJlw8YYD/GfKfZ7772XxYsXoygKwWCQCRMm8Nhjj2G1WgH485//zI9//GPC4TDFxcX86Ec/wmKxXNTYW1tbeeCBBxgYGECj0eB0Olm4cCFjx46N+2v+TLE7HI6EuOZPNmPGDF588UUKCwvj/noX5y8evj9nS3L4yMYuOXzkYpccPnLxJ1oeH8kcLoWzEEIIIYQQQggxDOmqLYQQQgghhBBCDEMKZyGEEEIIIYQQYhhSOAshhBBCCCGEEMOQwlkIIYQQQgghhBiGFM5CCCGEEEIIIcQwpHAWQpyzoqIiVq5cOdJhCCGEEOJLkhwuxJejG+kAhBDnZtGiRbz99ttDlo8bN47XX399BCISQgghxNmQHC5E4pHCWYgENnXqVJYuXRqzTK/Xj1A0QgghhDhbksOFSCzSVVuIBGYwGEhJSYn553K5gEgXrN///vfcf//9jBs3junTp/OnP/0p5vX79u3ju9/9LmVlZVx11VUsWrSInp6emG3efvtt5s6dS0lJCVOnTmXhwoUx67u6unjooYcYP348M2fOHPIeL7zwAtOnT6ekpIRrrrmGRx999Cs4EkIIIURikRwuRGKRwlmIS9jzzz/PjBkzWL58Od/61rdYuHAhO3fuBKC/v5977rkHi8XCG2+8wQsvvMC2bdt47LHHoq9/7bXXWLx4Md/85jd55513+NWvfsWYMWNi3mPZsmXRZHvLLbfw+OOPU19fD8CqVat46aWXeOKJJ1i9ejUvvvgiZWVlF+8ACCGEEAlKcrgQ8UW6aguRwD755BMmTJgQs2zBggU88sgjANx0003ccccdAHz/+99n06ZN/O53v+MnP/kJK1asYGBggKVLl2Kz2QB46qmn+Ou//mtqamrIycnhF7/4Bd/5znf43ve+F91/SUlJzPvNmzePefPmAfB3f/d3vPLKK2zevJl58+ZRX19PSkoK11xzDXq9noyMDEpLS7+y4yGEEEIkCsnhQiQWKZyFSGDl5eU8/fTTMcvsdnv08fjx42PWjR8/no8//hiAqqoqioqKogkXYMKECWg0Gg4ePIjNZqOpqYkpU6YMG0NRUVH0sU6nw+Px0N7eDsDs2bN55ZVXmDlzJtdeey3Tpk1j5syZGAyGc/vAQgghxCVCcrgQiUUKZyESmNlsJicn54LvV1GUs95Wp4v9M6IoCuFwGACv18vKlSvZuHEjGzZsYMmSJSxbtozXX38di8VyQWMWQgghEonkcCESi9zjLMQlbPv27UOe5+XlAZCfn8/+/fvp7e2Nrt+2bRvhcJj8/HySkpJIS0tj48aN5xWD0Wjkhhtu4LHHHuOPf/wjBw4cYOvWree1TyGEEOJSJzlciPgiLc5CJLDBwUFaWlpilmm1WjweDwCrV6+mtLSUq666ilWrVrFx48bo/JBz587l5z//OQsXLuShhx6iu7ubxYsX8/Wvfz36C/jf/M3f8Oyzz5KcnMz111+Pz+dj48aN3H333WcV31tvvUUoFKKsrAyLxcL777+PXq//Sn5hF0IIIRKJ5HAhEosUzkIksA0bNnDttdfGLEtLS2PdunUAPPjgg6xatYpnnnkGj8fDs88+Gx0R02w289vf/pZ//dd/5fbbb8doNDJz5kwef/zx6L4WLFiAXq/n5Zdf5ic/+QlOp5PrrrvurONzOBz8+te/ZsmSJQSDQfLz83n++ecZNWrUBfj0QgghROKSHC5EYlFUVVVHOgghxIVXVFTEc889x+zZs0c6FCGEEEJ8CZLDhYg/co+zEEIIIYQQQggxDCmchRBCCCGEEEKIYUhXbSGEEEIIIYQQYhjS4iyEEEIIIYQQQgxDCmchhBBCCCGEEGIYUjgLIYQQQgghhBDDkMJZCCGEEEIIIYQYhhTOQgghhBBCCCHEMKRwFkIIIYQQQgghhvH/AQ8irNpUif4mAAAAAElFTkSuQmCC", "text/plain": [ "
" ] @@ -1884,7 +1870,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -1974,4 +1960,4 @@ }, "nbformat": 4, "nbformat_minor": 1 -} \ No newline at end of file +} From 774c8ebf6218dcba6de4520fc389af7a6548e87b Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 2 Nov 2021 13:16:50 +0000 Subject: [PATCH 31/60] Changes required for pymanopt --- recommenders/models/geoimc/geoimc_algorithm.py | 4 ++-- recommenders/models/rlrmc/RLRMCalgorithm.py | 4 ++-- setup.py | 7 +++++-- tests/unit/recommenders/models/test_geoimc.py | 4 ++-- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/recommenders/models/geoimc/geoimc_algorithm.py b/recommenders/models/geoimc/geoimc_algorithm.py index 9678c43917..8ba37b6611 100644 --- a/recommenders/models/geoimc/geoimc_algorithm.py +++ b/recommenders/models/geoimc/geoimc_algorithm.py @@ -10,7 +10,7 @@ from scipy.sparse import csr_matrix from numba import njit, prange from pymanopt import Problem -from pymanopt.manifolds import Stiefel, Product, PositiveDefinite +from pymanopt.manifolds import Stiefel, Product, SymmetricPositiveDefinite from pymanopt.solvers import ConjugateGradient from pymanopt.solvers.linesearch import LineSearchBackTracking @@ -50,7 +50,7 @@ def __init__( self.X.shape[1], self.rank ), - PositiveDefinite( + SymmetricPositiveDefinite( self.rank ), Stiefel( diff --git a/recommenders/models/rlrmc/RLRMCalgorithm.py b/recommenders/models/rlrmc/RLRMCalgorithm.py index f22830e244..c750929604 100644 --- a/recommenders/models/rlrmc/RLRMCalgorithm.py +++ b/recommenders/models/rlrmc/RLRMCalgorithm.py @@ -7,7 +7,7 @@ from pymanopt import Problem from recommenders.models.rlrmc.conjugate_gradient_ms import ConjugateGradientMS from pymanopt.solvers.linesearch import LineSearchBackTracking -from pymanopt.manifolds import Stiefel, PositiveDefinite, Product +from pymanopt.manifolds import Stiefel, SymmetricPositiveDefinite, Product from math import sqrt from scipy.sparse import csr_matrix from scipy.sparse.linalg import svds @@ -109,7 +109,7 @@ def fit(self, RLRMCdata, verbosity=0, _evaluate=False): [ Stiefel(self.model_param.get("num_row"), self.rank), Stiefel(self.model_param.get("num_col"), self.rank), - PositiveDefinite(self.rank), + SymmetricPositiveDefinite(self.rank), ] ) problem = Problem( diff --git a/setup.py b/setup.py index f8cac7475f..f54adfdc55 100644 --- a/setup.py +++ b/setup.py @@ -39,7 +39,8 @@ "memory_profiler>=0.54.0,<1", "nltk>=3.4,<4", "pydocumentdb>=2.3.3<3", # TODO: replace with azure-cosmos - "pymanopt>=0.2.5,<1", + # Temporary fix for pymanopt, only this commit works with TF2 + "pymanopt@https://github.com/pymanopt/pymanopt/archive/fb36a272cdeecb21992cfd9271eb82baafeb316d.zip", "seaborn>=0.8.1,<1", "transformers>=2.5.0,<5", "bottleneck>=1.2.1,<2", @@ -66,7 +67,9 @@ ], "gpu": [ "nvidia-ml-py3>=7.352.0", - "tensorflow>=2.6", # compiled with CUDA 11.2, cudnn 8.1 + "tensorflow==2.6", # compiled with CUDA 11.2, cudnn 8.1 + "tensorflow-estimator==2.6", + "tensorboard==2.6", "tf-slim>=1.1.0", "torch>=1.8", # for CUDA 11 support "fastai>=1.0.46,<2", diff --git a/tests/unit/recommenders/models/test_geoimc.py b/tests/unit/recommenders/models/test_geoimc.py index 17dae7f0a8..9c32139f9b 100644 --- a/tests/unit/recommenders/models/test_geoimc.py +++ b/tests/unit/recommenders/models/test_geoimc.py @@ -18,7 +18,7 @@ mean_center, reduce_dims, ) -from pymanopt.manifolds import Stiefel, PositiveDefinite +from pymanopt.manifolds import Stiefel, SymmetricPositiveDefinite _IMC_TEST_DATA = [ ( @@ -132,7 +132,7 @@ def test_inferer_infer(dataPtr): rank = 2 W = [ Stiefel(rowFeatureDim, rank).rand(), - PositiveDefinite(rank).rand(), + SymmetricPositiveDefinite(rank).rand(), Stiefel(colFeatureDim, rank).rand(), ] From 93fb27b0ee822ae38ab3175fea80ca23b7629200 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Thu, 4 Nov 2021 11:00:37 +0000 Subject: [PATCH 32/60] Remove inference from SLIRec notebook --- .../sequential_recsys_amazondataset.ipynb | 136 +----------------- .../deeprec/models/graphrec/lightgcn.py | 1 + 2 files changed, 5 insertions(+), 132 deletions(-) diff --git a/examples/00_quick_start/sequential_recsys_amazondataset.ipynb b/examples/00_quick_start/sequential_recsys_amazondataset.ipynb index 9da9ad8104..ba2e9eef74 100644 --- a/examples/00_quick_start/sequential_recsys_amazondataset.ipynb +++ b/examples/00_quick_start/sequential_recsys_amazondataset.ipynb @@ -27,7 +27,7 @@ "\n", "In this notebook, we test SLi_Rec on a subset of the public dataset: [Amazon_reviews](http://snap.stanford.edu/data/amazon/productGraph/categoryFiles/reviews_Movies_and_TV_5.json.gz) and [Amazon_metadata](http://snap.stanford.edu/data/amazon/productGraph/categoryFiles/meta_Movies_and_TV.json.gz)\n", "\n", - "This notebook is well tested under TF 1.15.0. " + "This notebook is tested under TF 2.6. " ] }, { @@ -60,7 +60,7 @@ "import scrapbook as sb\n", "from tempfile import TemporaryDirectory\n", "import numpy as np\n", - "import tensorflow as tf\n", + "import tensorflow.compat.v1 as tf\n", "tf.get_logger().setLevel('ERROR') # only show error messages\n", "\n", "from recommenders.utils.timer import Timer\n", @@ -546,135 +546,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Exciting. Now let's start our quick journey of online serving. \n", - "\n", - "For efficient and flexible serving, usually we only keep the necessary computation nodes and froze the TF model to a single pb file, so that we can easily compute scores with this unified pb file in both Python or Java:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "with model_best_trained.sess as sess:\n", - " graph_def = model_best_trained.graph.as_graph_def()\n", - " output_graph_def = tf.graph_util.convert_variables_to_constants(\n", - " sess,\n", - " graph_def,\n", - " [\"pred\"]\n", - " )\n", - "\n", - " outfilepath = os.path.join(hparams.MODEL_DIR, \"serving_model.pb\")\n", - " with tf.gfile.GFile(outfilepath, 'wb') as f:\n", - " f.write(output_graph_def.SerializeToString())\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The serving logic is as simple as feeding the feature values to the corresponding input nodes, and fetch the score from the output node. \n", - "\n", - "In our model, input nodes are some placeholders and control variables (such as is_training, layer_keeps). We can get the nodes by their name:" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "class LoadFrozedPredModel:\n", - " def __init__(self, graph):\n", - " self.pred = graph.get_tensor_by_name('import/pred:0') \n", - " self.items = graph.get_tensor_by_name('import/items:0') \n", - " self.cates = graph.get_tensor_by_name('import/cates:0') \n", - " self.item_history = graph.get_tensor_by_name('import/item_history:0') \n", - " self.item_cate_history = graph.get_tensor_by_name('import/item_cate_history:0') \n", - " self.mask = graph.get_tensor_by_name('import/mask:0') \n", - " self.time_from_first_action = graph.get_tensor_by_name('import/time_from_first_action:0') \n", - " self.time_to_now = graph.get_tensor_by_name('import/time_to_now:0') \n", - " self.layer_keeps = graph.get_tensor_by_name('import/layer_keeps:0') \n", - " self.is_training = graph.get_tensor_by_name('import/is_training:0') \n" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [], - "source": [ - "def infer_as_serving(model, infile, outfile, hparams, iterator, sess):\n", - " preds = []\n", - " \n", - " for batch_data_input in iterator.load_data_from_file(infile, batch_num_ngs=0):\n", - " if batch_data_input:\n", - " feed_dict = {\n", - " model.layer_keeps:np.ones(3, dtype=np.float32),\n", - " model.is_training:False,\n", - " model.items: batch_data_input[iterator.items],\n", - " model.cates: batch_data_input[iterator.cates],\n", - " model.item_history: batch_data_input[iterator.item_history],\n", - " model.item_cate_history: batch_data_input[iterator.item_cate_history],\n", - " model.mask: batch_data_input[iterator.mask],\n", - " model.time_from_first_action: batch_data_input[iterator.time_from_first_action],\n", - " model.time_to_now: batch_data_input[iterator.time_to_now]\n", - " }\n", - " step_pred = sess.run(model.pred, feed_dict=feed_dict)\n", - " preds.extend(np.reshape(step_pred, -1))\n", - " \n", - " with open(outfile, \"w\") as wt:\n", - " for line in preds:\n", - " wt.write('{0}\\n'.format(line))\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here is the main pipeline for inferring in an online serving manner. You can compare the 'output_serving.txt' with 'output.txt' to see if the results are consistent.\n", - "\n", - "The input file format is the same as introduced in Section 1 'Input data format'. In serving stage, since we do not need a groundtrue lable, so for the label column, you can simply place any number like a zero. The iterator will parse the input file and convert into the required format for model's feed_dictionary. " - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "G = tf.Graph()\n", - "with tf.gfile.GFile(\n", - " os.path.join(hparams.MODEL_DIR, \"serving_model.pb\"),\n", - " 'rb'\n", - ") as f, G.as_default():\n", - " graph_def_optimized = tf.GraphDef()\n", - " graph_def_optimized.ParseFromString(f.read())\n", - " \n", - " #### uncomment this line if you want to check what conent is included in the graph\n", - " #print('graph_def_optimized = ' + str(graph_def_optimized))\n", - "\n", - "\n", - "with tf.Session(graph=G) as sess:\n", - " tf.import_graph_def(graph_def_optimized)\n", - "\n", - " model = LoadFrozedPredModel(sess.graph)\n", - " \n", - " serving_output_file = os.path.join(data_path, r'output_serving.txt') \n", - " iterator = input_creator(hparams, tf.Graph())\n", - " infer_as_serving(model, test_file, serving_output_file, hparams, iterator, sess)\n", - " " - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Reference\n", + "## References\n", "\\[1\\] Zeping Yu, Jianxun Lian, Ahmad Mahmoody, Gongshen Liu, Xing Xie. Adaptive User Modeling with Long and Short-Term Preferences for Personailzed Recommendation. In Proceedings of the 28th International Joint Conferences on Artificial Intelligence, IJCAI’19, Pages 4213-4219. AAAI Press, 2019.\n", "\n", "\\[2\\] Balázs Hidasi, Alexandros Karatzoglou, Linas Baltrunas, Domonkos Tikk. Session-based Recommendations with Recurrent Neural Networks. ICLR (Poster) 2016\n", @@ -716,4 +588,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/recommenders/models/deeprec/models/graphrec/lightgcn.py b/recommenders/models/deeprec/models/graphrec/lightgcn.py index 1dfd02818d..8ba8451e66 100644 --- a/recommenders/models/deeprec/models/graphrec/lightgcn.py +++ b/recommenders/models/deeprec/models/graphrec/lightgcn.py @@ -14,6 +14,7 @@ recall_at_k, ) from recommenders.utils.python_utils import get_top_k_scored_items +tf.compat.v1.disable_eager_execution() # need to disable eager in TF2.x class LightGCN(object): From 1d94f13d0f311b857b619e6eb6e0d456c6f427be Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Thu, 4 Nov 2021 12:38:39 +0000 Subject: [PATCH 33/60] Update TF version in notebooks --- examples/00_quick_start/dkn_MIND.ipynb | 26 +++++++++++------ examples/00_quick_start/lstur_MIND.ipynb | 24 +++++++++++----- examples/00_quick_start/naml_MIND.ipynb | 26 +++++++++++------ examples/00_quick_start/npa_MIND.ipynb | 24 +++++++++++----- examples/00_quick_start/nrms_MIND.ipynb | 24 +++++++++++----- examples/00_quick_start/rbm_movielens.ipynb | 28 +++++++++++++------ .../sequential_recsys_amazondataset.ipynb | 22 +++++++++++---- examples/00_quick_start/xdeepfm_criteo.ipynb | 24 +++++++++++----- .../lightgcn_deep_dive.ipynb | 26 +++++++++++------ .../dkn_deep_dive.ipynb | 23 ++++++++++----- examples/02_model_hybrid/ncf_deep_dive.ipynb | 28 +++++++++++++------ 11 files changed, 192 insertions(+), 83 deletions(-) diff --git a/examples/00_quick_start/dkn_MIND.ipynb b/examples/00_quick_start/dkn_MIND.ipynb index 951ca59a8f..ff56fe2b13 100644 --- a/examples/00_quick_start/dkn_MIND.ipynb +++ b/examples/00_quick_start/dkn_MIND.ipynb @@ -62,20 +62,28 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": { "pycharm": { "is_executing": false } }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/envs/tf2/lib/python3.7/site-packages/papermill/iorw.py:50: FutureWarning: pyarrow.HadoopFileSystem is deprecated as of 2.0.0, please use pyarrow.fs.HadoopFileSystem instead.\n", + " from pyarrow import HadoopFileSystem\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "System version: 3.6.11 | packaged by conda-forge | (default, Aug 5 2020, 20:09:42) \n", + "System version: 3.7.11 (default, Jul 27 2021, 14:32:16) \n", "[GCC 7.5.0]\n", - "Tensorflow version: 1.15.2\n" + "Tensorflow version: 2.6.1\n" ] } ], @@ -359,10 +367,12 @@ ], "metadata": { "celltoolbar": "Tags", + "interpreter": { + "hash": "3a9a0c422ff9f08d62211b9648017c63b0a26d2c935edc37ebb8453675d13bb5" + }, "kernelspec": { - "display_name": "Python (reco_gpu)", - "language": "python", - "name": "reco_gpu" + "display_name": "Python 3.7.11 64-bit ('tf2': conda)", + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -374,7 +384,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.11" + "version": "3.7.11" }, "pycharm": { "stem_cell": { @@ -388,4 +398,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/examples/00_quick_start/lstur_MIND.ipynb b/examples/00_quick_start/lstur_MIND.ipynb index 922e096e2e..783ff31111 100644 --- a/examples/00_quick_start/lstur_MIND.ipynb +++ b/examples/00_quick_start/lstur_MIND.ipynb @@ -75,13 +75,21 @@ "execution_count": 1, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/envs/tf2/lib/python3.7/site-packages/papermill/iorw.py:50: FutureWarning: pyarrow.HadoopFileSystem is deprecated as of 2.0.0, please use pyarrow.fs.HadoopFileSystem instead.\n", + " from pyarrow import HadoopFileSystem\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "System version: 3.6.11 | packaged by conda-forge | (default, Aug 5 2020, 20:09:42) \n", + "System version: 3.7.11 (default, Jul 27 2021, 14:32:16) \n", "[GCC 7.5.0]\n", - "Tensorflow version: 1.15.2\n" + "Tensorflow version: 2.6.1\n" ] } ], @@ -529,10 +537,12 @@ ], "metadata": { "celltoolbar": "Tags", + "interpreter": { + "hash": "3a9a0c422ff9f08d62211b9648017c63b0a26d2c935edc37ebb8453675d13bb5" + }, "kernelspec": { - "display_name": "Python (reco_gpu)", - "language": "python", - "name": "reco_gpu" + "display_name": "Python 3.7.11 64-bit ('tf2': conda)", + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -544,9 +554,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.11" + "version": "3.7.11" } }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} diff --git a/examples/00_quick_start/naml_MIND.ipynb b/examples/00_quick_start/naml_MIND.ipynb index b437ca28ae..0c1ef3a158 100644 --- a/examples/00_quick_start/naml_MIND.ipynb +++ b/examples/00_quick_start/naml_MIND.ipynb @@ -72,16 +72,24 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/envs/tf2/lib/python3.7/site-packages/papermill/iorw.py:50: FutureWarning: pyarrow.HadoopFileSystem is deprecated as of 2.0.0, please use pyarrow.fs.HadoopFileSystem instead.\n", + " from pyarrow import HadoopFileSystem\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "System version: 3.6.11 | packaged by conda-forge | (default, Aug 5 2020, 20:09:42) \n", + "System version: 3.7.11 (default, Jul 27 2021, 14:32:16) \n", "[GCC 7.5.0]\n", - "Tensorflow version: 1.15.2\n" + "Tensorflow version: 2.6.1\n" ] } ], @@ -526,10 +534,12 @@ ], "metadata": { "celltoolbar": "Tags", + "interpreter": { + "hash": "3a9a0c422ff9f08d62211b9648017c63b0a26d2c935edc37ebb8453675d13bb5" + }, "kernelspec": { - "display_name": "Python (reco_gpu)", - "language": "python", - "name": "reco_gpu" + "display_name": "Python 3.7.11 64-bit ('tf2': conda)", + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -541,9 +551,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.11" + "version": "3.7.11" } }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} diff --git a/examples/00_quick_start/npa_MIND.ipynb b/examples/00_quick_start/npa_MIND.ipynb index f85e4f67dd..a7724ed53c 100644 --- a/examples/00_quick_start/npa_MIND.ipynb +++ b/examples/00_quick_start/npa_MIND.ipynb @@ -75,13 +75,21 @@ "execution_count": 1, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/envs/tf2/lib/python3.7/site-packages/papermill/iorw.py:50: FutureWarning: pyarrow.HadoopFileSystem is deprecated as of 2.0.0, please use pyarrow.fs.HadoopFileSystem instead.\n", + " from pyarrow import HadoopFileSystem\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "System version: 3.6.11 | packaged by conda-forge | (default, Aug 5 2020, 20:09:42) \n", + "System version: 3.7.11 (default, Jul 27 2021, 14:32:16) \n", "[GCC 7.5.0]\n", - "Tensorflow version: 1.15.2\n" + "Tensorflow version: 2.6.1\n" ] } ], @@ -504,10 +512,12 @@ ], "metadata": { "celltoolbar": "Tags", + "interpreter": { + "hash": "3a9a0c422ff9f08d62211b9648017c63b0a26d2c935edc37ebb8453675d13bb5" + }, "kernelspec": { - "display_name": "Python (reco_gpu)", - "language": "python", - "name": "reco_gpu" + "display_name": "Python 3.7.11 64-bit ('tf2': conda)", + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -519,9 +529,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.11" + "version": "3.7.11" } }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} diff --git a/examples/00_quick_start/nrms_MIND.ipynb b/examples/00_quick_start/nrms_MIND.ipynb index a995d39dcd..491ea94722 100644 --- a/examples/00_quick_start/nrms_MIND.ipynb +++ b/examples/00_quick_start/nrms_MIND.ipynb @@ -75,13 +75,21 @@ "scrolled": false }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/envs/tf2/lib/python3.7/site-packages/papermill/iorw.py:50: FutureWarning: pyarrow.HadoopFileSystem is deprecated as of 2.0.0, please use pyarrow.fs.HadoopFileSystem instead.\n", + " from pyarrow import HadoopFileSystem\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "System version: 3.6.11 | packaged by conda-forge | (default, Aug 5 2020, 20:09:42) \n", + "System version: 3.7.11 (default, Jul 27 2021, 14:32:16) \n", "[GCC 7.5.0]\n", - "Tensorflow version: 1.15.2\n" + "Tensorflow version: 2.6.1\n" ] } ], @@ -523,10 +531,12 @@ ], "metadata": { "celltoolbar": "Tags", + "interpreter": { + "hash": "3a9a0c422ff9f08d62211b9648017c63b0a26d2c935edc37ebb8453675d13bb5" + }, "kernelspec": { - "display_name": "Python (reco_gpu)", - "language": "python", - "name": "reco_gpu" + "display_name": "Python 3.7.11 64-bit ('tf2': conda)", + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -538,9 +548,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.11" + "version": "3.7.11" } }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} diff --git a/examples/00_quick_start/rbm_movielens.ipynb b/examples/00_quick_start/rbm_movielens.ipynb index 9ff8e8739e..dfb9542c81 100644 --- a/examples/00_quick_start/rbm_movielens.ipynb +++ b/examples/00_quick_start/rbm_movielens.ipynb @@ -45,14 +45,22 @@ "execution_count": 1, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/envs/tf2/lib/python3.7/site-packages/papermill/iorw.py:50: FutureWarning: pyarrow.HadoopFileSystem is deprecated as of 2.0.0, please use pyarrow.fs.HadoopFileSystem instead.\n", + " from pyarrow import HadoopFileSystem\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "System version: 3.6.11 | packaged by conda-forge | (default, Aug 5 2020, 20:09:42) \n", + "System version: 3.7.11 (default, Jul 27 2021, 14:32:16) \n", "[GCC 7.5.0]\n", - "Pandas version: 0.25.3\n", - "Tensorflow version: 1.15.2\n" + "Pandas version: 1.3.4\n", + "Tensorflow version: 2.6.1\n" ] } ], @@ -376,7 +384,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -783,13 +791,15 @@ ], "metadata": { "celltoolbar": "Tags", + "interpreter": { + "hash": "3a9a0c422ff9f08d62211b9648017c63b0a26d2c935edc37ebb8453675d13bb5" + }, "kernel_info": { "name": "python3" }, "kernelspec": { - "display_name": "Python (reco_gpu)", - "language": "python", - "name": "reco_gpu" + "display_name": "Python 3.7.11 64-bit ('tf2': conda)", + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -801,7 +811,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.11" + "version": "3.7.11" }, "nteract": { "version": "0.12.3" @@ -809,4 +819,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} diff --git a/examples/00_quick_start/sequential_recsys_amazondataset.ipynb b/examples/00_quick_start/sequential_recsys_amazondataset.ipynb index ba2e9eef74..b7af52e124 100644 --- a/examples/00_quick_start/sequential_recsys_amazondataset.ipynb +++ b/examples/00_quick_start/sequential_recsys_amazondataset.ipynb @@ -42,13 +42,21 @@ "execution_count": 1, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/envs/tf2/lib/python3.7/site-packages/papermill/iorw.py:50: FutureWarning: pyarrow.HadoopFileSystem is deprecated as of 2.0.0, please use pyarrow.fs.HadoopFileSystem instead.\n", + " from pyarrow import HadoopFileSystem\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "System version: 3.6.11 | packaged by conda-forge | (default, Aug 5 2020, 20:09:42) \n", + "System version: 3.7.11 (default, Jul 27 2021, 14:32:16) \n", "[GCC 7.5.0]\n", - "Tensorflow version: 1.15.2\n" + "Tensorflow version: 2.6.1\n" ] } ], @@ -568,10 +576,12 @@ ], "metadata": { "celltoolbar": "Tags", + "interpreter": { + "hash": "3a9a0c422ff9f08d62211b9648017c63b0a26d2c935edc37ebb8453675d13bb5" + }, "kernelspec": { - "display_name": "reco_gpu", - "language": "python", - "name": "reco_gpu" + "display_name": "Python 3.7.11 64-bit ('tf2': conda)", + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -583,7 +593,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.7.11" } }, "nbformat": 4, diff --git a/examples/00_quick_start/xdeepfm_criteo.ipynb b/examples/00_quick_start/xdeepfm_criteo.ipynb index 1e29d47b97..ba5073cdeb 100644 --- a/examples/00_quick_start/xdeepfm_criteo.ipynb +++ b/examples/00_quick_start/xdeepfm_criteo.ipynb @@ -35,13 +35,21 @@ "execution_count": 1, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/envs/tf2/lib/python3.7/site-packages/papermill/iorw.py:50: FutureWarning: pyarrow.HadoopFileSystem is deprecated as of 2.0.0, please use pyarrow.fs.HadoopFileSystem instead.\n", + " from pyarrow import HadoopFileSystem\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "System version: 3.6.11 | packaged by conda-forge | (default, Aug 5 2020, 20:09:42) \n", + "System version: 3.7.11 (default, Jul 27 2021, 14:32:16) \n", "[GCC 7.5.0]\n", - "Tensorflow version: 1.15.2\n" + "Tensorflow version: 2.6.1\n" ] } ], @@ -639,10 +647,12 @@ ], "metadata": { "celltoolbar": "Tags", + "interpreter": { + "hash": "3a9a0c422ff9f08d62211b9648017c63b0a26d2c935edc37ebb8453675d13bb5" + }, "kernelspec": { - "display_name": "Python (reco_gpu)", - "language": "python", - "name": "reco_gpu" + "display_name": "Python 3.7.11 64-bit ('tf2': conda)", + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -654,9 +664,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.11" + "version": "3.7.11" } }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/examples/02_model_collaborative_filtering/lightgcn_deep_dive.ipynb b/examples/02_model_collaborative_filtering/lightgcn_deep_dive.ipynb index e8e07acb87..e2c632350e 100644 --- a/examples/02_model_collaborative_filtering/lightgcn_deep_dive.ipynb +++ b/examples/02_model_collaborative_filtering/lightgcn_deep_dive.ipynb @@ -30,14 +30,22 @@ "execution_count": 1, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/envs/tf2/lib/python3.7/site-packages/papermill/iorw.py:50: FutureWarning: pyarrow.HadoopFileSystem is deprecated as of 2.0.0, please use pyarrow.fs.HadoopFileSystem instead.\n", + " from pyarrow import HadoopFileSystem\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "System version: 3.6.11 | packaged by conda-forge | (default, Aug 5 2020, 20:09:42) \n", + "System version: 3.7.11 (default, Jul 27 2021, 14:32:16) \n", "[GCC 7.5.0]\n", - "Pandas version: 0.25.3\n", - "Tensorflow version: 1.15.2\n" + "Pandas version: 1.3.4\n", + "Tensorflow version: 2.6.1\n" ] } ], @@ -767,10 +775,12 @@ ], "metadata": { "celltoolbar": "Tags", + "interpreter": { + "hash": "3a9a0c422ff9f08d62211b9648017c63b0a26d2c935edc37ebb8453675d13bb5" + }, "kernelspec": { - "display_name": "Python (reco_gpu)", - "language": "python", - "name": "reco_gpu" + "display_name": "Python 3.7.11 64-bit ('tf2': conda)", + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -782,9 +792,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.11" + "version": "3.7.11" } }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/examples/02_model_content_based_filtering/dkn_deep_dive.ipynb b/examples/02_model_content_based_filtering/dkn_deep_dive.ipynb index af81547f8f..f8651a591b 100644 --- a/examples/02_model_content_based_filtering/dkn_deep_dive.ipynb +++ b/examples/02_model_content_based_filtering/dkn_deep_dive.ipynb @@ -117,19 +117,26 @@ "execution_count": 1, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/envs/tf2/lib/python3.7/site-packages/papermill/iorw.py:50: FutureWarning: pyarrow.HadoopFileSystem is deprecated as of 2.0.0, please use pyarrow.fs.HadoopFileSystem instead.\n", + " from pyarrow import HadoopFileSystem\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "System version: 3.6.11 | packaged by conda-forge | (default, Aug 5 2020, 20:09:42) \n", + "System version: 3.7.11 (default, Jul 27 2021, 14:32:16) \n", "[GCC 7.5.0]\n", - "Tensorflow version: 1.15.2\n" + "Tensorflow version: 2.6.1\n" ] } ], "source": [ "import sys\n", - "\n", "import os\n", "from tempfile import TemporaryDirectory\n", @@ -529,10 +536,12 @@ ], "metadata": { "celltoolbar": "Tags", + "interpreter": { + "hash": "3a9a0c422ff9f08d62211b9648017c63b0a26d2c935edc37ebb8453675d13bb5" + }, "kernelspec": { - "display_name": "Python (reco_gpu)", - "language": "python", - "name": "reco_gpu" + "display_name": "Python 3.7.11 64-bit ('tf2': conda)", + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -544,7 +553,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.11" + "version": "3.7.11" } }, "nbformat": 4, diff --git a/examples/02_model_hybrid/ncf_deep_dive.ipynb b/examples/02_model_hybrid/ncf_deep_dive.ipynb index d4866af538..128ad9681b 100644 --- a/examples/02_model_hybrid/ncf_deep_dive.ipynb +++ b/examples/02_model_hybrid/ncf_deep_dive.ipynb @@ -30,14 +30,22 @@ "execution_count": 1, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/anaconda/envs/tf2/lib/python3.7/site-packages/papermill/iorw.py:50: FutureWarning: pyarrow.HadoopFileSystem is deprecated as of 2.0.0, please use pyarrow.fs.HadoopFileSystem instead.\n", + " from pyarrow import HadoopFileSystem\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "System version: 3.6.10 |Anaconda, Inc.| (default, Mar 25 2020, 23:51:54) \n", - "[GCC 7.3.0]\n", - "Pandas version: 0.25.3\n", - "Tensorflow version: 1.15.2\n" + "System version: 3.7.11 (default, Jul 27 2021, 14:32:16) \n", + "[GCC 7.5.0]\n", + "Pandas version: 1.3.4\n", + "Tensorflow version: 2.6.1\n" ] } ], @@ -919,10 +927,12 @@ ], "metadata": { "celltoolbar": "Tags", + "interpreter": { + "hash": "3a9a0c422ff9f08d62211b9648017c63b0a26d2c935edc37ebb8453675d13bb5" + }, "kernelspec": { - "display_name": "Python (reco_gpu)", - "language": "python", - "name": "reco_gpu" + "display_name": "Python 3.7.11 64-bit ('tf2': conda)", + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -934,9 +944,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.11" + "version": "3.7.11" } }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} From 8503c513ebd6bc093572030d8916b2d1d6e1497c Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Mon, 8 Nov 2021 19:44:32 +0000 Subject: [PATCH 34/60] Replace pytorch location for cuda 11 --- recommenders/README.md | 2 +- tests/ci/azure_pipeline_test/dsvm_nightly_linux_gpu.yml | 2 +- tests/ci/azure_pipeline_test/dsvm_notebook_linux_gpu.yml | 2 +- tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml | 2 +- tests/ci/azure_pipeline_test/release_pipeline.yml | 6 +++--- tools/docker/Dockerfile | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/recommenders/README.md b/recommenders/README.md index 0852c35045..5ab17b2b35 100644 --- a/recommenders/README.md +++ b/recommenders/README.md @@ -57,7 +57,7 @@ For manual installation of the necessary requirements see [TensorFlow](https://w When installing with GPU support you will need to point to the PyTorch index to ensure you are downloading a version of PyTorch compiled with CUDA support. This can be done using the --find-links or -f option below. -`pip install --no-cache --no-binary scikit-surprise recommenders[gpu] -f https://download.pytorch.org/whl/cu100/torch_stable.html` +`pip install --no-cache --no-binary scikit-surprise recommenders[gpu] -f https://download.pytorch.org/whl/cu111/torch_stable.html` ## Experimental dependencies diff --git a/tests/ci/azure_pipeline_test/dsvm_nightly_linux_gpu.yml b/tests/ci/azure_pipeline_test/dsvm_nightly_linux_gpu.yml index ef26fb5425..7e8f59ef55 100644 --- a/tests/ci/azure_pipeline_test/dsvm_nightly_linux_gpu.yml +++ b/tests/ci/azure_pipeline_test/dsvm_nightly_linux_gpu.yml @@ -32,6 +32,6 @@ extends: timeout: 240 conda_env: "nightly_linux_gpu" conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" - pip_opts: "[gpu,examples,dev] -f https://download.pytorch.org/whl/cu100/torch_stable.html" + pip_opts: "[gpu,examples,dev] -f https://download.pytorch.org/whl/cu111/torch_stable.html" pytest_markers: "not spark and gpu" pytest_params: "-x" diff --git a/tests/ci/azure_pipeline_test/dsvm_notebook_linux_gpu.yml b/tests/ci/azure_pipeline_test/dsvm_notebook_linux_gpu.yml index 2029e53817..d62bf51761 100644 --- a/tests/ci/azure_pipeline_test/dsvm_notebook_linux_gpu.yml +++ b/tests/ci/azure_pipeline_test/dsvm_notebook_linux_gpu.yml @@ -60,5 +60,5 @@ extends: task_name: "Test - Unit Notebook Linux GPU" conda_env: "unit_notebook_linux_gpu" conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" - pip_opts: "[gpu,examples,dev] -f https://download.pytorch.org/whl/cu100/torch_stable.html" + pip_opts: "[gpu,examples,dev] -f https://download.pytorch.org/whl/cu111/torch_stable.html" pytest_markers: "notebooks and not spark and gpu" diff --git a/tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml b/tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml index f8ace02538..70f51cc683 100644 --- a/tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml +++ b/tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml @@ -60,5 +60,5 @@ extends: task_name: "Test - Unit Linux GPU" conda_env: "unit_linux_gpu" conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" - pip_opts: "[gpu,dev] -f https://download.pytorch.org/whl/cu100/torch_stable.html" + pip_opts: "[gpu,dev] -f https://download.pytorch.org/whl/cu111/torch_stable.html" pytest_markers: "not notebooks and not spark and gpu" diff --git a/tests/ci/azure_pipeline_test/release_pipeline.yml b/tests/ci/azure_pipeline_test/release_pipeline.yml index 874b812668..e5ebbc48f8 100644 --- a/tests/ci/azure_pipeline_test/release_pipeline.yml +++ b/tests/ci/azure_pipeline_test/release_pipeline.yml @@ -46,7 +46,7 @@ jobs: task_name: "Test - Unit Linux GPU" conda_env: "release_unit_linux_gpu" conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" - pip_opts: "[gpu] -f https://download.pytorch.org/whl/cu100/torch_stable.html" + pip_opts: "[gpu] -f https://download.pytorch.org/whl/cu111/torch_stable.html" pytest_markers: "not notebooks and not spark and gpu" install: "release" @@ -57,7 +57,7 @@ jobs: task_name: "Test - Unit Notebook Linux GPU" conda_env: "release_unit_notebook_linux_gpu" conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" - pip_opts: "[gpu,examples] -f https://download.pytorch.org/whl/cu100/torch_stable.html" + pip_opts: "[gpu,examples] -f https://download.pytorch.org/whl/cu111/torch_stable.html" pytest_markers: "notebooks and not spark and gpu" install: "release" @@ -106,7 +106,7 @@ jobs: timeout: 240 conda_env: "release_nightly_linux_gpu" conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" - pip_opts: "[gpu,examples] -f https://download.pytorch.org/whl/cu100/torch_stable.html" + pip_opts: "[gpu,examples] -f https://download.pytorch.org/whl/cu111/torch_stable.html" pytest_markers: "not spark and gpu" install: "release" diff --git a/tools/docker/Dockerfile b/tools/docker/Dockerfile index 1a2a29f564..3d7f727cd4 100644 --- a/tools/docker/Dockerfile +++ b/tools/docker/Dockerfile @@ -137,7 +137,7 @@ RUN if [ "${VIRTUAL_ENV}" = "virtualenv" ] ; then python3.7 -m virtualenv $HOME/ pip install --no-cache --no-binary scikit-surprise recommenders[gpu,xlearn,examples]; fi RUN if [ "${VIRTUAL_ENV}" = "conda" ] ; then \ - pip install --no-cache --no-binary scikit-surprise recommenders[gpu,xlearn,examples] -f https://download.pytorch.org/whl/cu100/torch_stable.html ; fi + pip install --no-cache --no-binary scikit-surprise recommenders[gpu,xlearn,examples] -f https://download.pytorch.org/whl/cu111/torch_stable.html ; fi ############ From a743eba3a5ee8f6cab9740b13c37940e867782d5 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 9 Nov 2021 10:30:29 +0000 Subject: [PATCH 35/60] Add no binary pip install option in ADO test pipeline --- tests/ci/azure_pipeline_test/dsvm_nightly_linux_gpu.yml | 2 +- tests/ci/azure_pipeline_test/dsvm_notebook_linux_gpu.yml | 2 +- tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml | 2 +- tests/ci/azure_pipeline_test/release_pipeline.yml | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/ci/azure_pipeline_test/dsvm_nightly_linux_gpu.yml b/tests/ci/azure_pipeline_test/dsvm_nightly_linux_gpu.yml index 7e8f59ef55..9aca9929bb 100644 --- a/tests/ci/azure_pipeline_test/dsvm_nightly_linux_gpu.yml +++ b/tests/ci/azure_pipeline_test/dsvm_nightly_linux_gpu.yml @@ -32,6 +32,6 @@ extends: timeout: 240 conda_env: "nightly_linux_gpu" conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" - pip_opts: "[gpu,examples,dev] -f https://download.pytorch.org/whl/cu111/torch_stable.html" + pip_opts: "[gpu,examples,dev] --no-cache --no-binary scikit-surprise -f https://download.pytorch.org/whl/cu111/torch_stable.html" pytest_markers: "not spark and gpu" pytest_params: "-x" diff --git a/tests/ci/azure_pipeline_test/dsvm_notebook_linux_gpu.yml b/tests/ci/azure_pipeline_test/dsvm_notebook_linux_gpu.yml index d62bf51761..54a8f38558 100644 --- a/tests/ci/azure_pipeline_test/dsvm_notebook_linux_gpu.yml +++ b/tests/ci/azure_pipeline_test/dsvm_notebook_linux_gpu.yml @@ -60,5 +60,5 @@ extends: task_name: "Test - Unit Notebook Linux GPU" conda_env: "unit_notebook_linux_gpu" conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" - pip_opts: "[gpu,examples,dev] -f https://download.pytorch.org/whl/cu111/torch_stable.html" + pip_opts: "[gpu,examples,dev] --no-cache --no-binary scikit-surprise -f https://download.pytorch.org/whl/cu111/torch_stable.html" pytest_markers: "notebooks and not spark and gpu" diff --git a/tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml b/tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml index 70f51cc683..349d371d51 100644 --- a/tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml +++ b/tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml @@ -60,5 +60,5 @@ extends: task_name: "Test - Unit Linux GPU" conda_env: "unit_linux_gpu" conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" - pip_opts: "[gpu,dev] -f https://download.pytorch.org/whl/cu111/torch_stable.html" + pip_opts: "[gpu,dev] --no-cache --no-binary scikit-surprise -f https://download.pytorch.org/whl/cu111/torch_stable.html" pytest_markers: "not notebooks and not spark and gpu" diff --git a/tests/ci/azure_pipeline_test/release_pipeline.yml b/tests/ci/azure_pipeline_test/release_pipeline.yml index e5ebbc48f8..e64f41e89a 100644 --- a/tests/ci/azure_pipeline_test/release_pipeline.yml +++ b/tests/ci/azure_pipeline_test/release_pipeline.yml @@ -46,7 +46,7 @@ jobs: task_name: "Test - Unit Linux GPU" conda_env: "release_unit_linux_gpu" conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" - pip_opts: "[gpu] -f https://download.pytorch.org/whl/cu111/torch_stable.html" + pip_opts: "[gpu] --no-cache --no-binary scikit-surprise -f https://download.pytorch.org/whl/cu111/torch_stable.html" pytest_markers: "not notebooks and not spark and gpu" install: "release" @@ -57,7 +57,7 @@ jobs: task_name: "Test - Unit Notebook Linux GPU" conda_env: "release_unit_notebook_linux_gpu" conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" - pip_opts: "[gpu,examples] -f https://download.pytorch.org/whl/cu111/torch_stable.html" + pip_opts: "[gpu,examples] --no-cache --no-binary scikit-surprise -f https://download.pytorch.org/whl/cu111/torch_stable.html" pytest_markers: "notebooks and not spark and gpu" install: "release" @@ -106,7 +106,7 @@ jobs: timeout: 240 conda_env: "release_nightly_linux_gpu" conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" - pip_opts: "[gpu,examples] -f https://download.pytorch.org/whl/cu111/torch_stable.html" + pip_opts: "[gpu,examples] --no-cache --no-binary scikit-surprise -f https://download.pytorch.org/whl/cu111/torch_stable.html" pytest_markers: "not spark and gpu" install: "release" From 7d36296bdf58eb3f4c1bf2e6fa19866baf580a84 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 9 Nov 2021 11:22:55 +0000 Subject: [PATCH 36/60] Changed version to 1.0.0 --- recommenders/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recommenders/__init__.py b/recommenders/__init__.py index 195e30efa3..c5dceb3957 100644 --- a/recommenders/__init__.py +++ b/recommenders/__init__.py @@ -2,7 +2,7 @@ # Licensed under the MIT License. __title__ = "Microsoft Recommenders" -__version__ = "0.8.0" +__version__ = "1.0.0" __author__ = "RecoDev Team at Microsoft" __license__ = "MIT" __copyright__ = "Copyright 2018-present Microsoft Corporation" From d5491b7725c3959dcd70615741f029e552db69ba Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Thu, 11 Nov 2021 11:00:05 +0000 Subject: [PATCH 37/60] Edit nvidia docker image name --- SETUP.md | 2 +- tools/docker/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SETUP.md b/SETUP.md index 67b7727fda..896bbdb875 100644 --- a/SETUP.md +++ b/SETUP.md @@ -157,7 +157,7 @@ In the following `3.6` should be replaced with the Python version you are using sudo dockerd & # Pull the image from the Nvidia docker hub (https://hub.docker.com/r/nvidia/cuda) that is suitable for your system # E.g. for Ubuntu 18.04 do - sudo docker run --gpus all -it --rm nvidia/cuda:11.2-cudnn8.1-runtime-ubuntu18.04 + sudo docker run --gpus all -it --rm nvidia/cuda:11.2.2-cudnn8-runtime-ubuntu18.04 # Within the container: diff --git a/tools/docker/Dockerfile b/tools/docker/Dockerfile index 3d7f727cd4..f46cf9bbe0 100644 --- a/tools/docker/Dockerfile +++ b/tools/docker/Dockerfile @@ -87,7 +87,7 @@ RUN if [ "${VIRTUAL_ENV}" = "conda" ] ; then pip install --no-cache --no-binary ########### # GPU Stage ########### -FROM nvidia/cuda:11.2-cudnn8.1-runtime-ubuntu18.04 AS gpu +FROM nvidia/cuda:11.2.2-cudnn8-runtime-ubuntu18.04 AS gpu ARG HOME ARG VIRTUAL_ENV From f325a2c03dbb500dde4a667f753650dac0d1050f Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Thu, 11 Nov 2021 11:15:13 +0000 Subject: [PATCH 38/60] Java version for virtual env --- SETUP.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SETUP.md b/SETUP.md index 896bbdb875..16366d1804 100644 --- a/SETUP.md +++ b/SETUP.md @@ -151,7 +151,7 @@ create the file `%RECO_ENV%\etc\conda\deactivate.d\env_vars.bat` and add: It is straightforward to install the recommenders package within a [virtual environment](https://docs.python.org/3/library/venv.html). However, setting up CUDA for use with a GPU can be cumbersome. We thus recommend setting up [Nvidia docker](https://github.com/NVIDIA/nvidia-docker) and running the virtual environment within a container, as the most convenient way to do this. -In the following `3.6` should be replaced with the Python version you are using and `11` should be replaced with the appropriate Java version. +In the following `3.6` should be replaced with the Python version you are using and `8` should be replaced with the appropriate Java version. # Start docker daemon if not running sudo dockerd & @@ -167,8 +167,8 @@ In the following `3.6` should be replaced with the Python version you are using apt-get -y install python3.6-venv apt-get -y install libpython3.6-dev apt-get -y install cmake - apt-get install -y libgomp1 openjdk-11-jre - export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 + apt-get install -y libgomp1 openjdk-8-jre + export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 python3.6 -m venv --system-site-packages /venv source /venv/bin/activate From 11e4c86080dbbd70f4d4b064ffe0afd40b88f827 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Thu, 11 Nov 2021 18:11:35 +0000 Subject: [PATCH 39/60] Resolved flake8 issues and blacked --- recommenders/datasets/amazon_reviews.py | 8 +- recommenders/datasets/covid_utils.py | 34 +++--- recommenders/datasets/movielens.py | 57 ++++++---- recommenders/evaluation/python_evaluation.py | 3 +- recommenders/evaluation/spark_evaluation.py | 3 +- recommenders/models/deeprec/deeprec_utils.py | 107 ++++++++++-------- recommenders/models/deeprec/io/iterator.py | 4 +- .../models/deeprec/io/nextitnet_iterator.py | 4 +- .../models/deeprec/models/base_model.py | 48 +++++--- recommenders/models/deeprec/models/dkn.py | 25 ++-- .../models/deeprec/models/dkn_item2item.py | 10 +- .../deeprec/models/graphrec/lightgcn.py | 27 +++-- .../deeprec/models/sequential/nextitnet.py | 25 +++- .../models/sequential/rnn_cell_implement.py | 24 ++-- .../sequential/sequential_base_model.py | 12 +- .../deeprec/models/sequential/sum_cells.py | 22 +++- recommenders/models/deeprec/models/xDeepFM.py | 58 +++++++--- .../models/geoimc/geoimc_algorithm.py | 98 +++++++--------- recommenders/models/ncf/ncf_singlenode.py | 44 +++++-- .../models/newsrec/models/base_model.py | 4 +- recommenders/models/newsrec/models/layers.py | 6 +- recommenders/models/newsrec/newsrec_utils.py | 2 +- recommenders/models/rbm/rbm.py | 17 ++- recommenders/models/tfidf/tfidf_utils.py | 4 +- recommenders/models/vae/multinomial_vae.py | 12 +- .../models/wide_deep/wide_deep_utils.py | 6 +- recommenders/tuning/nni/ncf_utils.py | 20 +++- recommenders/utils/tf_utils.py | 26 ++--- tests/conftest.py | 2 +- .../examples/test_notebooks_pyspark.py | 1 + .../recommenders/datasets/test_criteo.py | 1 - .../recommenders/datasets/test_movielens.py | 3 - .../smoke/examples/test_notebooks_pyspark.py | 1 + .../recommenders/dataset/test_movielens.py | 3 - .../recommender/test_deeprec_model.py | 2 - .../recommender/test_deeprec_utils.py | 5 +- .../recommender/test_newsrec_model.py | 2 - .../recommender/test_newsrec_utils.py | 3 +- tests/unit/examples/test_notebooks_pyspark.py | 63 +++++++---- tests/unit/examples/test_notebooks_python.py | 16 ++- .../recommenders/datasets/test_covid_utils.py | 2 +- .../recommenders/datasets/test_movielens.py | 52 ++++++--- .../datasets/test_pandas_df_utils.py | 1 - .../recommenders/datasets/test_wikidata.py | 1 - .../evaluation/test_python_evaluation.py | 19 ++-- tests/unit/recommenders/models/test_geoimc.py | 11 +- .../recommenders/models/test_lightfm_utils.py | 2 - .../recommenders/models/test_newsrec_utils.py | 1 - tests/unit/recommenders/models/test_rbm.py | 4 +- .../models/test_sar_singlenode.py | 4 +- .../recommenders/models/test_vowpal_wabbit.py | 4 +- .../recommenders/tuning/test_ncf_utils.py | 8 +- .../recommenders/utils/test_general_utils.py | 1 - .../unit/recommenders/utils/test_gpu_utils.py | 1 - .../recommenders/utils/test_notebook_utils.py | 4 +- tests/unit/recommenders/utils/test_plot.py | 5 +- .../unit/recommenders/utils/test_tf_utils.py | 3 +- 57 files changed, 569 insertions(+), 366 deletions(-) diff --git a/recommenders/datasets/amazon_reviews.py b/recommenders/datasets/amazon_reviews.py index a0b34a7439..b37da7c974 100644 --- a/recommenders/datasets/amazon_reviews.py +++ b/recommenders/datasets/amazon_reviews.py @@ -285,13 +285,17 @@ def _data_generating_no_history_expanding( fo = f_test if user_id != last_user_id or tfile == "valid" or tfile == "test": if last_user_id is not None: - history_clk_num = len(movie_id_list) # noqa: F821 undefined name 'movie_id_list' + history_clk_num = len( + movie_id_list # noqa: F821 undefined name 'movie_id_list' + ) cat_str = "" mid_str = "" dt_str = "" for c1 in cate_list[:-1]: # noqa: F821 undefined name 'cate_list' cat_str += c1 + "," - for mid in movie_id_list[:-1]: # noqa: F821 undefined name 'movie_id_list' + for mid in movie_id_list[ # noqa: F821 undefined name 'movie_id_list' + :-1 + ]: mid_str += mid + "," for dt_time in dt_list[:-1]: # noqa: F821 undefined name 'dt_list' dt_str += dt_time + "," diff --git a/recommenders/datasets/covid_utils.py b/recommenders/datasets/covid_utils.py index 23f2a4208b..c156438df6 100644 --- a/recommenders/datasets/covid_utils.py +++ b/recommenders/datasets/covid_utils.py @@ -12,7 +12,7 @@ def load_pandas_df( container_name="covid19temp", metadata_filename="metadata.csv", ): - """ Loads the Azure Open Research COVID-19 dataset as a pd.DataFrame. + """Loads the Azure Open Research COVID-19 dataset as a pd.DataFrame. The Azure COVID-19 Open Research Dataset may be found at https://azure.microsoft.com/en-us/services/open-datasets/catalog/covid-19-open-research/ @@ -31,13 +31,13 @@ def load_pandas_df( acct=azure_storage_account_name, container=container_name, filename=metadata_filename, - sas=azure_storage_sas_token + sas=azure_storage_sas_token, ) return pd.read_csv(uri) def remove_duplicates(df, cols): - """ Remove duplicated entries. + """Remove duplicated entries. Args: df (pd.DataFrame): Pandas dataframe. @@ -52,7 +52,7 @@ def remove_duplicates(df, cols): df = df.reset_index(drop=True) # Find where the identifier variable is duplicated - dup_rows = np.where(df.duplicated([col]) == True)[0] # noqa: E712 comparison to True + dup_rows = np.where(df.duplicated([col]))[0] # Drop duplicated rows df = df.drop(dup_rows) @@ -61,7 +61,7 @@ def remove_duplicates(df, cols): def remove_nan(df, cols): - """ Remove rows with NaN values in specified column. + """Remove rows with NaN values in specified column. Args: df (pandas.DataFrame): Pandas dataframe. @@ -82,7 +82,7 @@ def remove_nan(df, cols): def clean_dataframe(df): - """ Clean up the dataframe. + """Clean up the dataframe. Args: df (pandas.DataFrame): Pandas dataframe. @@ -103,12 +103,12 @@ def clean_dataframe(df): def retrieve_text( - entry, - container_name, - azure_storage_account_name="azureopendatastorage", - azure_storage_sas_token="", + entry, + container_name, + azure_storage_account_name="azureopendatastorage", + azure_storage_sas_token="", ): - """ Retrieve body text from article of interest. + """Retrieve body text from article of interest. Args: entry (pd.Series): A single row from the dataframe (df.iloc[n]). @@ -128,7 +128,7 @@ def retrieve_text( acct=azure_storage_account_name, container=container_name, filename=filename, - sas=azure_storage_sas_token + sas=azure_storage_sas_token, ) data = requests.get(uri, headers={"Content-type": "application/json"}).json() @@ -146,7 +146,7 @@ def get_public_domain_text( azure_storage_account_name="azureopendatastorage", azure_storage_sas_token="", ): - """ Get all public domain text. + """Get all public domain text. Args: df (pandas.DataFrame): Metadata dataframe for public domain text. @@ -163,11 +163,9 @@ def get_public_domain_text( # Add in full_text df["full_text"] = df.apply( lambda row: retrieve_text( - row, - container_name, - azure_storage_account_name, - azure_storage_sas_token - ), axis=1 + row, container_name, azure_storage_account_name, azure_storage_sas_token + ), + axis=1, ) # Remove rows with empty full_text diff --git a/recommenders/datasets/movielens.py b/recommenders/datasets/movielens.py index 8c04c6bb2f..e4b3643e12 100644 --- a/recommenders/datasets/movielens.py +++ b/recommenders/datasets/movielens.py @@ -28,7 +28,7 @@ StringType, IntegerType, FloatType, - LongType + LongType, ) except ImportError: pass # so the environment without spark doesn't break @@ -145,7 +145,9 @@ def item_has_header(self): Will only use the first four column names.""" WARNING_HAVE_SCHEMA_AND_HEADER = """Both schema and header are provided. The header argument will be ignored.""" -ERROR_MOVIE_LENS_SIZE = "Invalid data size. Should be one of {100k, 1m, 10m, or 20m, or mock100}" +ERROR_MOVIE_LENS_SIZE = ( + "Invalid data size. Should be one of {100k, 1m, 10m, or 20m, or mock100}" +) ERROR_HEADER = "Header error. At least user and movie column names should be provided" @@ -214,7 +216,9 @@ def load_pandas_df( keep_first_n_cols=len(header), keep_title_col=(title_col is not None), keep_genre_col=(genres_col is not None), - **MOCK_DATA_FORMAT[size] # supply the rest of the kwarg with the dictionary + **MOCK_DATA_FORMAT[ + size + ], # supply the rest of the kwarg with the dictionary ) movie_col = header[1] @@ -427,7 +431,9 @@ def load_spark_df( spark, keep_title_col=(title_col is not None), keep_genre_col=(genres_col is not None), - **MOCK_DATA_FORMAT[size] # supply the rest of the kwarg with the dictionary + **MOCK_DATA_FORMAT[ + size + ], # supply the rest of the kwarg with the dictionary ) schema = _get_schema(header, schema) @@ -583,6 +589,7 @@ class MockMovielensSchema(pa.SchemaModel): Please see https://pandera.readthedocs.io/en/latest/schema_models.html for more information. """ + # Some notebooks will do a cross join with userID and itemID, # a sparse range for these IDs can slow down the notebook tests userID: Series[int] = Field(in_range={"min_value": 1, "max_value": 10}) @@ -595,9 +602,11 @@ class MockMovielensSchema(pa.SchemaModel): @classmethod def get_df( cls, - size: int = 3, seed: int = 100, + size: int = 3, + seed: int = 100, keep_first_n_cols: Optional[int] = None, - keep_title_col: bool = False, keep_genre_col: bool = False, + keep_title_col: bool = False, + keep_genre_col: bool = False, ) -> pd.DataFrame: """Return fake movielens dataset as a Pandas Dataframe with specified rows. @@ -614,7 +623,9 @@ def get_df( schema = cls.to_schema() if keep_first_n_cols is not None: if keep_first_n_cols < 1 or keep_first_n_cols > len(DEFAULT_HEADER): - raise ValueError(f"Invalid value for 'keep_first_n_cols': {keep_first_n_cols}. Valid range: [1-{len(DEFAULT_HEADER)}]") + raise ValueError( + f"Invalid value for 'keep_first_n_cols': {keep_first_n_cols}. Valid range: [1-{len(DEFAULT_HEADER)}]" + ) schema = schema.remove_columns(DEFAULT_HEADER[keep_first_n_cols:]) if not keep_title_col: schema = schema.remove_columns([DEFAULT_TITLE_COL]) @@ -629,8 +640,10 @@ def get_df( def get_spark_df( cls, spark, - size: int = 3, seed: int = 100, - keep_title_col: bool = False, keep_genre_col: bool = False, + size: int = 3, + seed: int = 100, + keep_title_col: bool = False, + keep_genre_col: bool = False, tmp_path: Optional[str] = None, ): """Return fake movielens dataset as a Spark Dataframe with specified rows @@ -648,14 +661,18 @@ def get_spark_df( Returns: pyspark.sql.DataFrame: a mock dataset """ - pandas_df = cls.get_df(size=size, seed=seed, keep_title_col=True, keep_genre_col=True) + pandas_df = cls.get_df( + size=size, seed=seed, keep_title_col=True, keep_genre_col=True + ) # generate temp folder with download_path(tmp_path) as tmp_folder: filepath = os.path.join(tmp_folder, f"mock_movielens_{size}.csv") # serialize the pandas.df as a csv to avoid the expensive java <-> python communication pandas_df.to_csv(filepath, header=False, index=False) - spark_df = spark.read.csv(filepath, schema=cls._get_spark_deserialization_schema()) + spark_df = spark.read.csv( + filepath, schema=cls._get_spark_deserialization_schema() + ) # Cache and force trigger action since data-file might be removed. spark_df.cache() spark_df.count() @@ -668,11 +685,13 @@ def get_spark_df( @classmethod def _get_spark_deserialization_schema(cls): - return StructType([ - StructField(DEFAULT_USER_COL, IntegerType()), - StructField(DEFAULT_ITEM_COL, IntegerType()), - StructField(DEFAULT_RATING_COL, FloatType()), - StructField(DEFAULT_TIMESTAMP_COL, StringType()), - StructField(DEFAULT_TITLE_COL, StringType()), - StructField(DEFAULT_GENRE_COL, StringType()), - ]) + return StructType( + [ + StructField(DEFAULT_USER_COL, IntegerType()), + StructField(DEFAULT_ITEM_COL, IntegerType()), + StructField(DEFAULT_RATING_COL, FloatType()), + StructField(DEFAULT_TIMESTAMP_COL, StringType()), + StructField(DEFAULT_TITLE_COL, StringType()), + StructField(DEFAULT_GENRE_COL, StringType()), + ] + ) diff --git a/recommenders/evaluation/python_evaluation.py b/recommenders/evaluation/python_evaluation.py index a8f3c5ed68..bb64cdc56f 100644 --- a/recommenders/evaluation/python_evaluation.py +++ b/recommenders/evaluation/python_evaluation.py @@ -775,8 +775,7 @@ def check_column_dtypes_diversity_serendipity_wrapper( raise Exception( "item_feature_df not specified! item_feature_df must be provided " "if choosing to use item_feature_vector to calculate item similarity. " - "item_feature_df should have columns: " - + str(required_columns) + "item_feature_df should have columns: " + str(required_columns) ) # check if reco_df contains any user_item pairs that are already shown in train_df count_intersection = pd.merge( diff --git a/recommenders/evaluation/spark_evaluation.py b/recommenders/evaluation/spark_evaluation.py index bed8c992b0..d631b56c64 100644 --- a/recommenders/evaluation/spark_evaluation.py +++ b/recommenders/evaluation/spark_evaluation.py @@ -589,8 +589,7 @@ def __init__( raise Exception( "item_feature_df not specified! item_feature_df must be provided " "if choosing to use item_feature_vector to calculate item similarity. " - "item_feature_df should have schema:" - + str(required_schema) + "item_feature_df should have schema:" + str(required_schema) ) # check if reco_df contains any user_item pairs that are already shown in train_df diff --git a/recommenders/models/deeprec/deeprec_utils.py b/recommenders/models/deeprec/deeprec_utils.py index 233d338b4b..016a915f9f 100644 --- a/recommenders/models/deeprec/deeprec_utils.py +++ b/recommenders/models/deeprec/deeprec_utils.py @@ -302,9 +302,9 @@ def load_yaml(filename): raise IOError("load {0} error!".format(filename)) -class HParams(): - """Class for holding hyperparameters for DeepRec algorithms. - """ +class HParams: + """Class for holding hyperparameters for DeepRec algorithms.""" + def __init__(self, hparams_dict): """Create an HParams object from a dictionary of hyperparameter values. @@ -312,8 +312,17 @@ def __init__(self, hparams_dict): hparams_dict (dict): Dictionary with the model hyperparameters. """ for val in hparams_dict.values(): - if not (isinstance(val, int) or isinstance(val, float) or isinstance(val, str) or isinstance(val, list)): - raise ValueError("Hyperparameter value {} should be integer, float, string or list.".format(val)) + if not ( + isinstance(val, int) + or isinstance(val, float) + or isinstance(val, str) + or isinstance(val, list) + ): + raise ValueError( + "Hyperparameter value {} should be integer, float, string or list.".format( + val + ) + ) self._values = hparams_dict for hparam in hparams_dict: setattr(self, hparam, hparams_dict[hparam]) @@ -341,56 +350,56 @@ def create_hparams(flags): """ init_dict = { # dkn - 'use_entity': True, - 'use_context': True, + "use_entity": True, + "use_context": True, # model - 'cross_activation': 'identity', - 'user_dropout': False, - 'dropout': [0.0], - 'attention_dropout': 0.0, - 'load_saved_model': False, - 'fast_CIN_d': 0, - 'use_Linear_part': False, - 'use_FM_part': False, - 'use_CIN_part': False, - 'use_DNN_part': False, + "cross_activation": "identity", + "user_dropout": False, + "dropout": [0.0], + "attention_dropout": 0.0, + "load_saved_model": False, + "fast_CIN_d": 0, + "use_Linear_part": False, + "use_FM_part": False, + "use_CIN_part": False, + "use_DNN_part": False, # train - 'init_method': 'tnormal', - 'init_value': 0.01, - 'embed_l2': 0.0, - 'embed_l1': 0.0, - 'layer_l2': 0.0, - 'layer_l1': 0.0, - 'cross_l2': 0.0, - 'cross_l1': 0.0, - 'reg_kg': 0.0, - 'learning_rate': 0.001, - 'lr_rs': 1, - 'lr_kg': 0.5, - 'kg_training_interval': 5, - 'max_grad_norm': 2, - 'is_clip_norm': 0, - 'dtype': 32, - 'optimizer': 'adam', - 'epochs': 10, - 'batch_size': 1, - 'enable_BN': False, + "init_method": "tnormal", + "init_value": 0.01, + "embed_l2": 0.0, + "embed_l1": 0.0, + "layer_l2": 0.0, + "layer_l1": 0.0, + "cross_l2": 0.0, + "cross_l1": 0.0, + "reg_kg": 0.0, + "learning_rate": 0.001, + "lr_rs": 1, + "lr_kg": 0.5, + "kg_training_interval": 5, + "max_grad_norm": 2, + "is_clip_norm": 0, + "dtype": 32, + "optimizer": "adam", + "epochs": 10, + "batch_size": 1, + "enable_BN": False, # show info - 'show_step': 1, - 'save_model': True, - 'save_epoch': 5, - 'write_tfevents': False, + "show_step": 1, + "save_model": True, + "save_epoch": 5, + "write_tfevents": False, # sequential - 'train_num_ngs': 4, - 'need_sample': True, - 'embedding_dropout': 0.0, - 'EARLY_STOP': 100, + "train_num_ngs": 4, + "need_sample": True, + "embedding_dropout": 0.0, + "EARLY_STOP": 100, # caser, - 'min_seq_length': 1, + "min_seq_length": 1, # sum - 'slots': 5, - 'cell': 'SUM' - } + "slots": 5, + "cell": "SUM", + } init_dict.update(flags) return HParams(init_dict) diff --git a/recommenders/models/deeprec/io/iterator.py b/recommenders/models/deeprec/io/iterator.py index b239439e37..e31bbc2ee7 100644 --- a/recommenders/models/deeprec/io/iterator.py +++ b/recommenders/models/deeprec/io/iterator.py @@ -71,7 +71,9 @@ def __init__(self, hparams, graph, col_spliter=" ", ID_spliter="%"): self.fm_feat_values = tf.compat.v1.placeholder( tf.float32, [None], name="fm_feat_values" ) - self.fm_feat_shape = tf.compat.v1.placeholder(tf.int64, [None], name="fm_feat_shape") + self.fm_feat_shape = tf.compat.v1.placeholder( + tf.int64, [None], name="fm_feat_shape" + ) self.dnn_feat_indices = tf.compat.v1.placeholder( tf.int64, [None, 2], name="dnn_feat_indices" ) diff --git a/recommenders/models/deeprec/io/nextitnet_iterator.py b/recommenders/models/deeprec/io/nextitnet_iterator.py index 548228ebd9..0240a08b02 100644 --- a/recommenders/models/deeprec/io/nextitnet_iterator.py +++ b/recommenders/models/deeprec/io/nextitnet_iterator.py @@ -43,7 +43,9 @@ def __init__(self, hparams, graph, col_spliter="\t"): self.graph = graph with self.graph.as_default(): - self.labels = tf.compat.v1.placeholder(tf.float32, [None, None], name="label") + self.labels = tf.compat.v1.placeholder( + tf.float32, [None, None], name="label" + ) self.users = tf.compat.v1.placeholder(tf.int32, [None], name="users") self.items = tf.compat.v1.placeholder(tf.int32, [None, None], name="items") self.cates = tf.compat.v1.placeholder(tf.int32, [None, None], name="cates") diff --git a/recommenders/models/deeprec/models/base_model.py b/recommenders/models/deeprec/models/base_model.py index 2ace30a786..921d475925 100644 --- a/recommenders/models/deeprec/models/base_model.py +++ b/recommenders/models/deeprec/models/base_model.py @@ -137,12 +137,14 @@ def _l1_loss(self): # embedding_layer l2 loss for param in self.embed_params: l1_loss = tf.add( - l1_loss, tf.multiply(self.hparams.embed_l1, tf.norm(tensor=param, ord=1)) + l1_loss, + tf.multiply(self.hparams.embed_l1, tf.norm(tensor=param, ord=1)), ) params = self.layer_params for param in params: l1_loss = tf.add( - l1_loss, tf.multiply(self.hparams.layer_l1, tf.norm(tensor=param, ord=1)) + l1_loss, + tf.multiply(self.hparams.layer_l1, tf.norm(tensor=param, ord=1)), ) return l1_loss @@ -155,10 +157,12 @@ def _cross_l_loss(self): cross_l_loss = tf.zeros([1], dtype=tf.float32) for param in self.cross_params: cross_l_loss = tf.add( - cross_l_loss, tf.multiply(self.hparams.cross_l1, tf.norm(tensor=param, ord=1)) + cross_l_loss, + tf.multiply(self.hparams.cross_l1, tf.norm(tensor=param, ord=1)), ) cross_l_loss = tf.add( - cross_l_loss, tf.multiply(self.hparams.cross_l2, tf.norm(tensor=param, ord=2)) + cross_l_loss, + tf.multiply(self.hparams.cross_l2, tf.norm(tensor=param, ord=2)), ) return cross_l_loss @@ -176,16 +180,32 @@ def _get_initializer(self): stddev=self.hparams.init_value, seed=self.seed ) elif self.hparams.init_method == "xavier_normal": - return tf.compat.v1.keras.initializers.VarianceScaling(scale=1.0, mode="fan_avg", distribution=("uniform" if False else "truncated_normal"), seed=self.seed) + return tf.compat.v1.keras.initializers.VarianceScaling( + scale=1.0, + mode="fan_avg", + distribution=("uniform" if False else "truncated_normal"), + seed=self.seed, + ) elif self.hparams.init_method == "xavier_uniform": - return tf.compat.v1.keras.initializers.VarianceScaling(scale=1.0, mode="fan_avg", distribution=("uniform" if True else "truncated_normal"), seed=self.seed) + return tf.compat.v1.keras.initializers.VarianceScaling( + scale=1.0, + mode="fan_avg", + distribution=("uniform" if True else "truncated_normal"), + seed=self.seed, + ) elif self.hparams.init_method == "he_normal": return tf.compat.v1.keras.initializers.VarianceScaling( - scale=2.0, mode=("FAN_IN").lower(), distribution=("uniform" if False else "truncated_normal"), seed=self.seed + scale=2.0, + mode=("FAN_IN").lower(), + distribution=("uniform" if False else "truncated_normal"), + seed=self.seed, ) elif self.hparams.init_method == "he_uniform": return tf.compat.v1.keras.initializers.VarianceScaling( - scale=2.0, mode=("FAN_IN").lower(), distribution=("uniform" if True else "truncated_normal"), seed=self.seed + scale=2.0, + mode=("FAN_IN").lower(), + distribution=("uniform" if True else "truncated_normal"), + seed=self.seed, ) else: return tf.compat.v1.truncated_normal_initializer( @@ -463,9 +483,7 @@ def fit(self, train_file, valid_file, test_file=None): os.makedirs(self.hparams.MODEL_DIR) if epoch % self.hparams.save_epoch == 0: save_path_str = join(self.hparams.MODEL_DIR, "epoch_" + str(epoch)) - self.saver.save( - sess=train_sess, save_path=save_path_str - ) + self.saver.save(sess=train_sess, save_path=save_path_str) eval_start = time.time() eval_res = self.run_eval(valid_file) @@ -537,8 +555,8 @@ def group_labels(self, labels, preds, group_keys): all_keys = list(set(group_keys)) group_labels = {k: [] for k in all_keys} group_preds = {k: [] for k in all_keys} - for l, p, k in zip(labels, preds, group_keys): # noqa: E741 ambiguous variable name 'l' - group_labels[k].append(l) + for label, p, k in zip(labels, preds, group_keys): + group_labels[k].append(label) group_preds[k].append(p) all_labels = [] all_preds = [] @@ -648,7 +666,9 @@ def _fcn_net(self, model_output, layer_sizes, scope): layer_idx = 0 hidden_nn_layers = [] hidden_nn_layers.append(model_output) - with tf.compat.v1.variable_scope("nn_part", initializer=self.initializer) as scope: + with tf.compat.v1.variable_scope( + "nn_part", initializer=self.initializer + ) as scope: for idx, layer_size in enumerate(layer_sizes): curr_w_nn_layer = tf.compat.v1.get_variable( name="w_nn_layer" + str(layer_idx), diff --git a/recommenders/models/deeprec/models/dkn.py b/recommenders/models/deeprec/models/dkn.py index 3435fdd8d2..d96e82bfa6 100644 --- a/recommenders/models/deeprec/models/dkn.py +++ b/recommenders/models/deeprec/models/dkn.py @@ -41,7 +41,7 @@ def __init__(self, hparams, iterator_creator): e_embedding = self._init_embedding(hparams.entityEmb_file) W = tf.Variable( tf.random.uniform([hparams.entity_dim, hparams.dim], -1, 1), - trainable=True + trainable=True, ) b = tf.Variable(tf.zeros([hparams.dim]), trainable=True) self.entity_embedding = tf.nn.tanh(tf.matmul(e_embedding, W) + b) @@ -60,7 +60,7 @@ def __init__(self, hparams, iterator_creator): c_embedding = self._init_embedding(hparams.contextEmb_file) W = tf.Variable( tf.random.uniform([hparams.entity_dim, hparams.dim], -1, 1), - trainable=True + trainable=True, ) b = tf.Variable(tf.zeros([hparams.dim]), trainable=True) self.context_embedding = tf.nn.tanh(tf.matmul(c_embedding, W) + b) @@ -117,17 +117,22 @@ def _l1_loss(self): l1_loss = tf.zeros([1], dtype=tf.float32) # embedding_layer l2 loss l1_loss = tf.add( - l1_loss, tf.multiply(hparams.embed_l1, tf.norm(tensor=self.embedding, ord=1)) + l1_loss, + tf.multiply(hparams.embed_l1, tf.norm(tensor=self.embedding, ord=1)), ) if hparams.use_entity: l1_loss = tf.add( l1_loss, - tf.multiply(hparams.embed_l1, tf.norm(tensor=self.entity_embedding, ord=1)), + tf.multiply( + hparams.embed_l1, tf.norm(tensor=self.entity_embedding, ord=1) + ), ) if hparams.use_entity and hparams.use_context: l1_loss = tf.add( l1_loss, - tf.multiply(hparams.embed_l1, tf.norm(tensor=self.context_embedding, ord=1)), + tf.multiply( + hparams.embed_l1, tf.norm(tensor=self.context_embedding, ord=1) + ), ) params = self.layer_params for param in params: @@ -169,9 +174,7 @@ def _build_dkn(self): layer_idx = 0 hidden_nn_layers = [] hidden_nn_layers.append(nn_input) - with tf.compat.v1.variable_scope( - "nn_part", initializer=self.initializer - ): + with tf.compat.v1.variable_scope("nn_part", initializer=self.initializer): for idx, layer_size in enumerate(hparams.layer_sizes): curr_w_nn_layer = tf.compat.v1.get_variable( name="w_nn_layer" + str(layer_idx), @@ -396,7 +399,11 @@ def _kims_cnn(self, word, entity, hparams): name="W" + "_filter_size_" + str(filter_size), shape=filter_shape, dtype=tf.float32, - initializer=tf.compat.v1.keras.initializers.VarianceScaling(scale=1.0, mode="fan_avg", distribution=("uniform" if False else "truncated_normal")), + initializer=tf.compat.v1.keras.initializers.VarianceScaling( + scale=1.0, + mode="fan_avg", + distribution=("uniform" if False else "truncated_normal"), + ), ) b = tf.compat.v1.get_variable( name="b" + "_filter_size_" + str(filter_size), diff --git a/recommenders/models/deeprec/models/dkn_item2item.py b/recommenders/models/deeprec/models/dkn_item2item.py index 00f72afd8a..6dd5df380d 100644 --- a/recommenders/models/deeprec/models/dkn_item2item.py +++ b/recommenders/models/deeprec/models/dkn_item2item.py @@ -53,7 +53,9 @@ def _build_dkn(self): item_embs_target = item_embs_train[:, 1:, :] item_relation = tf.math.multiply(item_embs_target, item_embs_source) - item_relation = tf.reduce_sum(input_tensor=item_relation, axis=-1) # (B, neg_num + 1) + item_relation = tf.reduce_sum( + input_tensor=item_relation, axis=-1 + ) # (B, neg_num + 1) self.pred_logits = item_relation @@ -74,7 +76,11 @@ def _build_doc_embedding(self, candidate_word_batch, candidate_entity_batch): name="W_doc_trans", shape=(news_field_embed.shape[-1], self.num_filters_total), dtype=tf.float32, - initializer=tf.compat.v1.keras.initializers.VarianceScaling(scale=1.0, mode="fan_avg", distribution=("uniform" if False else "truncated_normal")), + initializer=tf.compat.v1.keras.initializers.VarianceScaling( + scale=1.0, + mode="fan_avg", + distribution=("uniform" if False else "truncated_normal"), + ), ) if W not in self.layer_params: self.layer_params.append(W) diff --git a/recommenders/models/deeprec/models/graphrec/lightgcn.py b/recommenders/models/deeprec/models/graphrec/lightgcn.py index 8ba8451e66..7f17bf95f3 100644 --- a/recommenders/models/deeprec/models/graphrec/lightgcn.py +++ b/recommenders/models/deeprec/models/graphrec/lightgcn.py @@ -14,7 +14,8 @@ recall_at_k, ) from recommenders.utils.python_utils import get_top_k_scored_items -tf.compat.v1.disable_eager_execution() # need to disable eager in TF2.x + +tf.compat.v1.disable_eager_execution() # need to disable eager in TF2.x class LightGCN(object): @@ -75,7 +76,9 @@ def __init__(self, hparams, data, seed=None): self.weights = self._init_weights() self.ua_embeddings, self.ia_embeddings = self._create_lightgcn_embed() - self.u_g_embeddings = tf.nn.embedding_lookup(params=self.ua_embeddings, ids=self.users) + self.u_g_embeddings = tf.nn.embedding_lookup( + params=self.ua_embeddings, ids=self.users + ) self.pos_i_g_embeddings = tf.nn.embedding_lookup( params=self.ia_embeddings, ids=self.pos_items ) @@ -104,11 +107,15 @@ def __init__(self, hparams, data, seed=None): ) self.loss = self.mf_loss + self.emb_loss - self.opt = tf.compat.v1.train.AdamOptimizer(learning_rate=self.lr).minimize(self.loss) + self.opt = tf.compat.v1.train.AdamOptimizer(learning_rate=self.lr).minimize( + self.loss + ) self.saver = tf.compat.v1.train.Saver(max_to_keep=1) gpu_options = tf.compat.v1.GPUOptions(allow_growth=True) - self.sess = tf.compat.v1.Session(config=tf.compat.v1.ConfigProto(gpu_options=gpu_options)) + self.sess = tf.compat.v1.Session( + config=tf.compat.v1.ConfigProto(gpu_options=gpu_options) + ) self.sess.run(tf.compat.v1.global_variables_initializer()) def _init_weights(self): @@ -119,7 +126,9 @@ def _init_weights(self): """ all_weights = dict() - initializer = tf.compat.v1.keras.initializers.VarianceScaling(scale=1.0, mode="fan_avg", distribution="uniform") + initializer = tf.compat.v1.keras.initializers.VarianceScaling( + scale=1.0, mode="fan_avg", distribution="uniform" + ) all_weights["user_embedding"] = tf.Variable( initializer([self.n_users, self.emb_dim]), name="user_embedding" @@ -150,7 +159,9 @@ def _create_lightgcn_embed(self): all_embeddings += [ego_embeddings] all_embeddings = tf.stack(all_embeddings, 1) - all_embeddings = tf.reduce_mean(input_tensor=all_embeddings, axis=1, keepdims=False) + all_embeddings = tf.reduce_mean( + input_tensor=all_embeddings, axis=1, keepdims=False + ) u_g_embeddings, i_g_embeddings = tf.split( all_embeddings, [self.n_users, self.n_items], 0 ) @@ -177,7 +188,9 @@ def _create_bpr_loss(self, users, pos_items, neg_items): + tf.nn.l2_loss(self.neg_i_g_embeddings_pre) ) regularizer = regularizer / self.batch_size - mf_loss = tf.reduce_mean(input_tensor=tf.nn.softplus(-(pos_scores - neg_scores))) + mf_loss = tf.reduce_mean( + input_tensor=tf.nn.softplus(-(pos_scores - neg_scores)) + ) emb_loss = self.decay * regularizer return mf_loss, emb_loss diff --git a/recommenders/models/deeprec/models/sequential/nextitnet.py b/recommenders/models/deeprec/models/sequential/nextitnet.py index ff3e918c6d..d191ce5ae8 100644 --- a/recommenders/models/deeprec/models/sequential/nextitnet.py +++ b/recommenders/models/deeprec/models/sequential/nextitnet.py @@ -31,12 +31,16 @@ def _build_seq_graph(self): is_training = tf.equal(self.is_train_stage, True) item_history_embedding = tf.cond( pred=is_training, - true_fn=lambda: self.item_history_embedding[:: self.hparams.train_num_ngs + 1], + true_fn=lambda: self.item_history_embedding[ + :: self.hparams.train_num_ngs + 1 + ], false_fn=lambda: self.item_history_embedding, ) cate_history_embedding = tf.cond( pred=is_training, - true_fn=lambda: self.cate_history_embedding[:: self.hparams.train_num_ngs + 1], + true_fn=lambda: self.cate_history_embedding[ + :: self.hparams.train_num_ngs + 1 + ], false_fn=lambda: self.cate_history_embedding, ) @@ -71,7 +75,9 @@ def _build_seq_graph(self): self.dilate_input = dilate_input model_output = tf.cond( - pred=is_training, true_fn=self._training_output, false_fn=self._normal_output + pred=is_training, + true_fn=self._training_output, + false_fn=self._normal_output, ) return model_output @@ -172,10 +178,14 @@ def _conv1d( weight = tf.compat.v1.get_variable( "weight", [1, kernel_size, input_.get_shape()[-1], output_channels], - initializer=tf.compat.v1.truncated_normal_initializer(stddev=0.02, seed=1), + initializer=tf.compat.v1.truncated_normal_initializer( + stddev=0.02, seed=1 + ), ) bias = tf.compat.v1.get_variable( - "bias", [output_channels], initializer=tf.compat.v1.constant_initializer(0.0) + "bias", + [output_channels], + initializer=tf.compat.v1.constant_initializer(0.0), ) if causal: @@ -192,7 +202,10 @@ def _conv1d( input_expanded = tf.expand_dims(input_, axis=1) out = ( tf.nn.conv2d( - input=input_expanded, filters=weight, strides=[1, 1, 1, 1], padding="SAME" + input=input_expanded, + filters=weight, + strides=[1, 1, 1, 1], + padding="SAME", ) + bias ) diff --git a/recommenders/models/deeprec/models/sequential/rnn_cell_implement.py b/recommenders/models/deeprec/models/sequential/rnn_cell_implement.py index 4e1d5bcf20..df7ea906fa 100644 --- a/recommenders/models/deeprec/models/sequential/rnn_cell_implement.py +++ b/recommenders/models/deeprec/models/sequential/rnn_cell_implement.py @@ -558,18 +558,18 @@ def call(self, inputs, state): class _Linear(object): """Linear map: sum_i(args[i] * W[i]), where W[i] is a variable. - Args: - args: a 2D Tensor or a list of 2D, batch x n, Tensors. - output_size: int, second dimension of weight variable. - dtype: data type for variables. - build_bias: boolean, whether to build a bias variable. - bias_initializer: starting value to initialize the bias - (default is all zeros). - kernel_initializer: starting value to initialize the weight. - - Raises: - ValueError: if inputs_shape is wrong. - """ + Args: + args: a 2D Tensor or a list of 2D, batch x n, Tensors. + output_size: int, second dimension of weight variable. + dtype: data type for variables. + build_bias: boolean, whether to build a bias variable. + bias_initializer: starting value to initialize the bias + (default is all zeros). + kernel_initializer: starting value to initialize the weight. + + Raises: + ValueError: if inputs_shape is wrong. + """ def __init__( self, diff --git a/recommenders/models/deeprec/models/sequential/sequential_base_model.py b/recommenders/models/deeprec/models/sequential/sequential_base_model.py index b7718bc5f3..2bb8a22238 100644 --- a/recommenders/models/deeprec/models/sequential/sequential_base_model.py +++ b/recommenders/models/deeprec/models/sequential/sequential_base_model.py @@ -38,7 +38,9 @@ def __init__(self, hparams, iterator_creator, graph=None, seed=None): self.min_seq_length = ( hparams.min_seq_length if "min_seq_length" in hparams.values() else 1 ) - self.hidden_size = hparams.hidden_size if "hidden_size" in hparams.values() else None + self.hidden_size = ( + hparams.hidden_size if "hidden_size" in hparams.values() else None + ) self.graph = tf.Graph() if not graph else graph with self.graph.as_default(): @@ -328,13 +330,17 @@ def _lookup_from_embedding(self): self.target_item_embedding = tf.concat( [self.item_embedding, self.cate_embedding], -1 ) - tf.compat.v1.summary.histogram("target_item_embedding_output", self.target_item_embedding) + tf.compat.v1.summary.histogram( + "target_item_embedding_output", self.target_item_embedding + ) def _add_norm(self): """Regularization for embedding variables and other variables.""" all_variables, embed_variables = ( tf.compat.v1.trainable_variables(), - tf.compat.v1.trainable_variables(self.sequential_scope._name + "/embedding"), + tf.compat.v1.trainable_variables( + self.sequential_scope._name + "/embedding" + ), ) layer_params = list(set(all_variables) - set(embed_variables)) layer_params = [a for a in layer_params if "_no_reg" not in a.name] diff --git a/recommenders/models/deeprec/models/sequential/sum_cells.py b/recommenders/models/deeprec/models/sequential/sum_cells.py index 3f0529718d..8c175c5bc8 100644 --- a/recommenders/models/deeprec/models/sequential/sum_cells.py +++ b/recommenders/models/deeprec/models/sequential/sum_cells.py @@ -120,12 +120,16 @@ def _basic_build(self, inputs_shape): self._beta = self.add_variable( name="_beta_no_reg", shape=(), - initializer=tf.compat.v1.constant_initializer(np.array([1.02]), dtype=np.float32), + initializer=tf.compat.v1.constant_initializer( + np.array([1.02]), dtype=np.float32 + ), ) self._alpha = self.add_variable( name="_alpha_no_reg", shape=(), - initializer=tf.compat.v1.constant_initializer(np.array([0.98]), dtype=np.float32), + initializer=tf.compat.v1.constant_initializer( + np.array([0.98]), dtype=np.float32 + ), ) @tf_utils.shape_type_conversion @@ -141,7 +145,7 @@ def build(self, inputs_shape): _check_supported_dtypes(self.dtype) d = inputs_shape[-1] # noqa: F841 h = self._real_units # noqa: F841 - s = self._slots # noqa: F841 + s = self._slots # noqa: F841 self._basic_build(inputs_shape) @@ -181,7 +185,9 @@ def call(self, inputs, state): att_weights = tf.nn.softmax(self._beta * att_logit_mat, axis=-1) att_weights = tf.expand_dims(att_weights, 2) - h_hat = tf.reduce_sum(input_tensor=tf.multiply(state[:, : self._slots, :], att_weights), axis=1) + h_hat = tf.reduce_sum( + input_tensor=tf.multiply(state[:, : self._slots, :], att_weights), axis=1 + ) h_hat = (h_hat + state[:, self._slots, :]) / 2 n_a, n_b = tf.nn.l2_normalize(last, 1), tf.nn.l2_normalize(inputs, 1) @@ -307,12 +313,16 @@ def call(self, inputs, state): att_weights = tf.nn.softmax(self._beta * att_logit_mat, axis=-1) att_weights = tf.expand_dims(att_weights, 2) - h_hat = tf.reduce_sum(input_tensor=tf.multiply(state[:, : self._slots, :], att_weights), axis=1) + h_hat = tf.reduce_sum( + input_tensor=tf.multiply(state[:, : self._slots, :], att_weights), axis=1 + ) h_hat = (h_hat + state[:, self._slots, :]) / 2 # get the true writing attentions writing_input = tf.concat([inputs, h_hat], axis=1) - att_weights = tf.compat.v1.nn.xw_plus_b(writing_input, self._writing_W, self._writing_b) + att_weights = tf.compat.v1.nn.xw_plus_b( + writing_input, self._writing_W, self._writing_b + ) att_weights = tf.nn.relu(att_weights) att_weights = tf.matmul(att_weights, self._writing_W02) att_weights = tf.nn.softmax(att_weights, axis=-1) diff --git a/recommenders/models/deeprec/models/xDeepFM.py b/recommenders/models/deeprec/models/xDeepFM.py index e5ef7864e3..66e552328f 100644 --- a/recommenders/models/deeprec/models/xDeepFM.py +++ b/recommenders/models/deeprec/models/xDeepFM.py @@ -31,8 +31,10 @@ def _build_graph(self): self.keep_prob_train = 1 - np.array(hparams.dropout) self.keep_prob_test = np.ones_like(hparams.dropout) - with tf.compat.v1.variable_scope("XDeepFM") as scope: - with tf.compat.v1.variable_scope("embedding", initializer=self.initializer) as escope: # noqa: F841 + with tf.compat.v1.variable_scope("XDeepFM") as scope: # noqa: F841 + with tf.compat.v1.variable_scope( + "embedding", initializer=self.initializer + ) as escope: # noqa: F841 self.embedding = tf.compat.v1.get_variable( name="embedding_layer", shape=[hparams.FEATURE_COUNT, hparams.dim], @@ -88,7 +90,10 @@ def _build_embedding(self): self.iterator.dnn_feat_shape, ) w_fm_nn_input_orgin = tf.nn.embedding_lookup_sparse( - params=self.embedding, sp_ids=fm_sparse_index, sp_weights=fm_sparse_weight, combiner="sum" + params=self.embedding, + sp_ids=fm_sparse_index, + sp_weights=fm_sparse_weight, + combiner="sum", ) embedding = tf.reshape( w_fm_nn_input_orgin, [-1, hparams.dim * hparams.FIELD_COUNT] @@ -103,7 +108,9 @@ def _build_linear(self): Returns: object: Prediction score made by linear regression. """ - with tf.compat.v1.variable_scope("linear_part", initializer=self.initializer) as scope: # noqa: F841 + with tf.compat.v1.variable_scope( + "linear_part", initializer=self.initializer + ) as scope: # noqa: F841 w = tf.compat.v1.get_variable( name="w", shape=[self.hparams.FEATURE_COUNT, 1], dtype=tf.float32 ) @@ -178,7 +185,9 @@ def _build_CIN( hidden_nn_layers.append(nn_input) final_result = [] split_tensor0 = tf.split(hidden_nn_layers[0], hparams.dim * [1], 2) - with tf.compat.v1.variable_scope("exfm_part", initializer=self.initializer) as scope: # noqa: F841 + with tf.compat.v1.variable_scope( + "exfm_part", initializer=self.initializer + ) as scope: # noqa: F841 for idx, layer_size in enumerate(hparams.cross_layer_sizes): split_tensor = tf.split(hidden_nn_layers[-1], hparams.dim * [1], 2) dot_result_m = tf.matmul( @@ -198,9 +207,9 @@ def _build_CIN( if is_masked and idx == 0: ones = tf.ones([field_nums[0], field_nums[0]], dtype=tf.float32) - mask_matrix = tf.linalg.band_part(ones, 0, -1) - tf.linalg.tensor_diag( - tf.ones(field_nums[0]) - ) + mask_matrix = tf.linalg.band_part( + ones, 0, -1 + ) - tf.linalg.tensor_diag(tf.ones(field_nums[0])) mask_matrix = tf.reshape( mask_matrix, shape=[1, field_nums[0] * field_nums[0]] ) @@ -261,7 +270,9 @@ def _build_CIN( result = tf.reduce_sum(input_tensor=result, axis=-1) # shape : (B,H) if res: - base_score = tf.reduce_sum(input_tensor=result, axis=1, keepdims=True) # (B,1) + base_score = tf.reduce_sum( + input_tensor=result, axis=1, keepdims=True + ) # (B,1) else: base_score = 0 @@ -276,7 +287,9 @@ def _build_CIN( ) self.layer_params.append(w_nn_output) self.layer_params.append(b_nn_output) - exFM_out = base_score + tf.compat.v1.nn.xw_plus_b(result, w_nn_output, b_nn_output) + exFM_out = base_score + tf.compat.v1.nn.xw_plus_b( + result, w_nn_output, b_nn_output + ) return exFM_out def _build_fast_CIN(self, nn_input, res=False, direct=False, bias=False): @@ -308,7 +321,9 @@ def _build_fast_CIN(self, nn_input, res=False, direct=False, bias=False): field_nums.append(int(field_num)) hidden_nn_layers.append(nn_input) final_result = [] - with tf.compat.v1.variable_scope("exfm_part", initializer=self.initializer) as scope: # noqa: F841 + with tf.compat.v1.variable_scope( + "exfm_part", initializer=self.initializer + ) as scope: # noqa: F841 for idx, layer_size in enumerate(hparams.cross_layer_sizes): if idx == 0: fast_w = tf.compat.v1.get_variable( @@ -353,7 +368,10 @@ def _build_fast_CIN(self, nn_input, res=False, direct=False, bias=False): input=nn_input, filters=fast_w, stride=1, padding="VALID" ) # shape: ((B,D,d*H) dot_result_2 = tf.nn.conv1d( - input=hidden_nn_layers[-1], filters=fast_v, stride=1, padding="VALID" + input=hidden_nn_layers[-1], + filters=fast_v, + stride=1, + padding="VALID", ) # shape: ((B,D,d*H) dot_result = tf.reshape( tf.multiply(dot_result_1, dot_result_2), @@ -409,7 +427,9 @@ def _build_fast_CIN(self, nn_input, res=False, direct=False, bias=False): result = tf.reduce_sum(input_tensor=result, axis=1, keepdims=False) # (B,H) if res: - base_score = tf.reduce_sum(input_tensor=result, axis=1, keepdims=True) # (B,1) + base_score = tf.reduce_sum( + input_tensor=result, axis=1, keepdims=True + ) # (B,1) else: base_score = 0 @@ -424,7 +444,9 @@ def _build_fast_CIN(self, nn_input, res=False, direct=False, bias=False): ) self.layer_params.append(w_nn_output) self.layer_params.append(b_nn_output) - exFM_out = tf.compat.v1.nn.xw_plus_b(result, w_nn_output, b_nn_output) + base_score + exFM_out = ( + tf.compat.v1.nn.xw_plus_b(result, w_nn_output, b_nn_output) + base_score + ) return exFM_out @@ -445,7 +467,9 @@ def _build_dnn(self, embed_out, embed_layer_size): layer_idx = 0 hidden_nn_layers = [] hidden_nn_layers.append(w_fm_nn_input) - with tf.compat.v1.variable_scope("nn_part", initializer=self.initializer) as scope: + with tf.compat.v1.variable_scope( + "nn_part", initializer=self.initializer + ) as scope: for idx, layer_size in enumerate(hparams.layer_sizes): curr_w_nn_layer = tf.compat.v1.get_variable( name="w_nn_layer" + str(layer_idx), @@ -504,5 +528,7 @@ def _build_dnn(self, embed_out, embed_layer_size): ) self.layer_params.append(w_nn_output) self.layer_params.append(b_nn_output) - nn_output = tf.compat.v1.nn.xw_plus_b(hidden_nn_layers[-1], w_nn_output, b_nn_output) + nn_output = tf.compat.v1.nn.xw_plus_b( + hidden_nn_layers[-1], w_nn_output, b_nn_output + ) return nn_output diff --git a/recommenders/models/geoimc/geoimc_algorithm.py b/recommenders/models/geoimc/geoimc_algorithm.py index 8ba37b6611..06ecccfb11 100644 --- a/recommenders/models/geoimc/geoimc_algorithm.py +++ b/recommenders/models/geoimc/geoimc_algorithm.py @@ -20,13 +20,8 @@ class IMCProblem(object): Implements the IMC problem. """ - def __init__( - self, - dataPtr, - lambda1=1e-2, - rank=10 - ): - """ Initialize parameters + def __init__(self, dataPtr, lambda1=1e-2, rank=10): + """Initialize parameters Args: dataPtr (DataPtr): An object of which contains X, Z side features and target matrix Y. @@ -45,23 +40,18 @@ def __init__( self.W = None self.optima_reached = False - self.manifold = Product([ - Stiefel( - self.X.shape[1], - self.rank - ), - SymmetricPositiveDefinite( - self.rank - ), - Stiefel( - self.Z.shape[1], - self.rank - ) - ]) - - def _loadTarget(self, ): - """Loads target matrix from the dataset pointer. - """ + self.manifold = Product( + [ + Stiefel(self.X.shape[1], self.rank), + SymmetricPositiveDefinite(self.rank), + Stiefel(self.Z.shape[1], self.rank), + ] + ) + + def _loadTarget( + self, + ): + """Loads target matrix from the dataset pointer.""" self.Y = self.dataset.get_data() @staticmethod @@ -90,7 +80,7 @@ def _cost(self, params, residual_global): B = params[1] V = params[2] - regularizer = 0.5 * self.lambda1 * np.sum(B**2) + regularizer = 0.5 * self.lambda1 * np.sum(B ** 2) IMCProblem._computeLoss_csrmatrix( self.X.dot(U.dot(B)), @@ -98,9 +88,9 @@ def _cost(self, params, residual_global): self.Y.data, self.Y.indices, self.Y.indptr, - residual_global + residual_global, ) - cost = 0.5 * np.sum((residual_global)**2) / self.nSamples + regularizer + cost = 0.5 * np.sum((residual_global) ** 2) / self.nSamples + regularizer return cost @@ -121,30 +111,27 @@ def _egrad(self, params, residual_global): shape=self.shape, ) - gradU = np.dot( - self.X.T, - residual_global_csr.dot(self.Z.dot(V.dot(B.T))) - ) / self.nSamples + gradU = ( + np.dot(self.X.T, residual_global_csr.dot(self.Z.dot(V.dot(B.T)))) + / self.nSamples + ) - gradB = np.dot( - (self.X.dot(U)).T, - residual_global_csr.dot(self.Z.dot(V)) - ) / self.nSamples + self.lambda1 * B + gradB = ( + np.dot((self.X.dot(U)).T, residual_global_csr.dot(self.Z.dot(V))) + / self.nSamples + + self.lambda1 * B + ) gradB_sym = (gradB + gradB.T) / 2 - gradV = np.dot( - (self.X.dot(U.dot(B))).T, - residual_global_csr.dot(self.Z) - ).T / self.nSamples + gradV = ( + np.dot((self.X.dot(U.dot(B))).T, residual_global_csr.dot(self.Z)).T + / self.nSamples + ) - return [ - gradU, - gradB_sym, - gradV - ] + return [gradU, gradB_sym, gradV] def solve(self, *args): - """ Main solver of the IMC model + """Main solver of the IMC model Args: max_opt_time (uint): Maximum time (in secs) for optimization @@ -166,18 +153,16 @@ def _optimize(self, max_opt_time, max_opt_iter, verbosity): """ residual_global = np.zeros(self.Y.data.shape) - solver = ConjugateGradient(maxtime=max_opt_time, maxiter=max_opt_iter, linesearch=LineSearchBackTracking()) + solver = ConjugateGradient( + maxtime=max_opt_time, + maxiter=max_opt_iter, + linesearch=LineSearchBackTracking(), + ) prb = Problem( manifold=self.manifold, - cost=lambda x: self._cost( - x, - residual_global - ), - egrad=lambda z: self._egrad( - z, - residual_global - ), - verbosity=verbosity + cost=lambda x: self._cost(x, residual_global), + egrad=lambda z: self._egrad(z, residual_global), + verbosity=verbosity, ) solution = solver.solve(prb, x=self.W) self.W = [solution[0], solution[1], solution[2]] @@ -185,8 +170,7 @@ def _optimize(self, max_opt_time, max_opt_iter, verbosity): return self._cost(self.W, residual_global) def reset(self): - """Reset the model. - """ + """Reset the model.""" self.optima_reached = False self.W = None return diff --git a/recommenders/models/ncf/ncf_singlenode.py b/recommenders/models/ncf/ncf_singlenode.py index 1eac3c2878..44a2944427 100644 --- a/recommenders/models/ncf/ncf_singlenode.py +++ b/recommenders/models/ncf/ncf_singlenode.py @@ -155,10 +155,16 @@ def _create_model( # get user embedding p and item embedding q self.gmf_p = tf.reduce_sum( - input_tensor=tf.nn.embedding_lookup(params=self.embedding_gmf_P, ids=self.user_input), axis=1 + input_tensor=tf.nn.embedding_lookup( + params=self.embedding_gmf_P, ids=self.user_input + ), + axis=1, ) self.gmf_q = tf.reduce_sum( - input_tensor=tf.nn.embedding_lookup(params=self.embedding_gmf_Q, ids=self.item_input), axis=1 + input_tensor=tf.nn.embedding_lookup( + params=self.embedding_gmf_Q, ids=self.item_input + ), + axis=1, ) # get gmf vector @@ -168,10 +174,16 @@ def _create_model( # get user embedding p and item embedding q self.mlp_p = tf.reduce_sum( - input_tensor=tf.nn.embedding_lookup(params=self.embedding_mlp_P, ids=self.user_input), axis=1 + input_tensor=tf.nn.embedding_lookup( + params=self.embedding_mlp_P, ids=self.user_input + ), + axis=1, ) self.mlp_q = tf.reduce_sum( - input_tensor=tf.nn.embedding_lookup(params=self.embedding_mlp_Q, ids=self.item_input), axis=1 + input_tensor=tf.nn.embedding_lookup( + params=self.embedding_mlp_Q, ids=self.item_input + ), + axis=1, ) # concatenate user and item vector @@ -184,7 +196,10 @@ def _create_model( num_outputs=layer_size, activation_fn=tf.nn.relu, weights_initializer=tf.compat.v1.keras.initializers.VarianceScaling( - scale=1.0, mode="fan_avg", distribution="uniform", seed=self.seed + scale=1.0, + mode="fan_avg", + distribution="uniform", + seed=self.seed, ), ) self.mlp_vector = output @@ -201,7 +216,10 @@ def _create_model( activation_fn=None, biases_initializer=None, weights_initializer=tf.compat.v1.keras.initializers.VarianceScaling( - scale=1.0, mode="fan_avg", distribution="uniform", seed=self.seed + scale=1.0, + mode="fan_avg", + distribution="uniform", + seed=self.seed, ), ) self.output = tf.sigmoid(output) @@ -214,7 +232,10 @@ def _create_model( activation_fn=None, biases_initializer=None, weights_initializer=tf.compat.v1.keras.initializers.VarianceScaling( - scale=1.0, mode="fan_avg", distribution="uniform", seed=self.seed + scale=1.0, + mode="fan_avg", + distribution="uniform", + seed=self.seed, ), ) self.output = tf.sigmoid(output) @@ -229,7 +250,10 @@ def _create_model( activation_fn=None, biases_initializer=None, weights_initializer=tf.compat.v1.keras.initializers.VarianceScaling( - scale=1.0, mode="fan_avg", distribution="uniform", seed=self.seed + scale=1.0, + mode="fan_avg", + distribution="uniform", + seed=self.seed, ), ) self.output = tf.sigmoid(output) @@ -325,7 +349,9 @@ def _load_neumf(self, gmf_dir, mlp_dir, alpha): saver.restore(self.sess, os.path.join(mlp_dir, MODEL_CHECKPOINT)) # concat pretrain h_from_gmf and h_from_mlp - vars_list = tf.compat.v1.get_collection(tf.compat.v1.GraphKeys.GLOBAL_VARIABLES, scope="ncf") + vars_list = tf.compat.v1.get_collection( + tf.compat.v1.GraphKeys.GLOBAL_VARIABLES, scope="ncf" + ) assert len(vars_list) == 1 ncf_fc = vars_list[0] diff --git a/recommenders/models/newsrec/models/base_model.py b/recommenders/models/newsrec/models/base_model.py index 516246e4c7..d5fe94dbaf 100644 --- a/recommenders/models/newsrec/models/base_model.py +++ b/recommenders/models/newsrec/models/base_model.py @@ -302,8 +302,8 @@ def group_labels(self, labels, preds, group_keys): group_labels = {k: [] for k in all_keys} group_preds = {k: [] for k in all_keys} - for l, p, k in zip(labels, preds, group_keys): # noqa: E741 ambiguous variable name 'l' - group_labels[k].append(l) + for label, p, k in zip(labels, preds, group_keys): + group_labels[k].append(label) group_preds[k].append(p) all_labels = [] diff --git a/recommenders/models/newsrec/models/layers.py b/recommenders/models/newsrec/models/layers.py index 7264f22759..2d6120b5bb 100644 --- a/recommenders/models/newsrec/models/layers.py +++ b/recommenders/models/newsrec/models/layers.py @@ -232,7 +232,7 @@ def call(self, QKVs): ) V_seq = K.permute_dimensions(V_seq, pattern=(0, 2, 1, 3)) - A = einsum('abij, abkj -> abik', Q_seq, K_seq) / K.sqrt( + A = einsum("abij, abkj -> abik", Q_seq, K_seq) / K.sqrt( K.cast(self.head_dim, dtype="float32") ) A = K.permute_dimensions( @@ -249,7 +249,7 @@ def call(self, QKVs): A = A - mask A = K.softmax(A) - O_seq = einsum('abij, abjk -> abik', A, V_seq) + O_seq = einsum("abij, abjk -> abik", A, V_seq) O_seq = K.permute_dimensions(O_seq, pattern=(0, 2, 1, 3)) O_seq = K.reshape(O_seq, shape=(-1, K.shape(O_seq)[1], self.output_dim)) @@ -257,7 +257,7 @@ def call(self, QKVs): return O_seq def get_config(self): - """ add multiheads, multiheads and mask_right into layer config. + """add multiheads, multiheads and mask_right into layer config. Returns: dict: config of SelfAttention layer. diff --git a/recommenders/models/newsrec/newsrec_utils.py b/recommenders/models/newsrec/newsrec_utils.py index 50c8a5a073..a7e3b87bb7 100644 --- a/recommenders/models/newsrec/newsrec_utils.py +++ b/recommenders/models/newsrec/newsrec_utils.py @@ -238,7 +238,7 @@ def create_hparams(flags): "epochs": 10, "batch_size": 1, # show info - "show_step": 1 + "show_step": 1, } init_dict.update(flags) return HParams(init_dict) diff --git a/recommenders/models/rbm/rbm.py b/recommenders/models/rbm/rbm.py index 80de54c6fd..4265552995 100644 --- a/recommenders/models/rbm/rbm.py +++ b/recommenders/models/rbm/rbm.py @@ -145,7 +145,9 @@ def binomial_sampling(self, pr): """ # sample from a Bernoulli distribution with same dimensions as input distribution - g = tf.convert_to_tensor(value=np.random.uniform(size=pr.shape[1]), dtype=tf.float32) + g = tf.convert_to_tensor( + value=np.random.uniform(size=pr.shape[1]), dtype=tf.float32 + ) # sample the value of the hidden units h_sampled = tf.nn.relu(tf.sign(pr - g)) @@ -465,7 +467,11 @@ def accuracy(self, vp): corr = tf.cast(tf.equal(vd, 0), "float32") # 3) evaluate the accuracy - ac_score = tf.reduce_mean(input_tensor=tf.compat.v1.div(tf.reduce_sum(input_tensor=corr, axis=1), n_values)) + ac_score = tf.reduce_mean( + input_tensor=tf.compat.v1.div( + tf.reduce_sum(input_tensor=corr, axis=1), n_values + ) + ) return ac_score @@ -496,7 +502,12 @@ def rmse(self, vp): # evaluate the msre err = tf.sqrt( - tf.reduce_mean(input_tensor=tf.compat.v1.div(tf.reduce_sum(input_tensor=e, axis=1), n_values)) / 2 + tf.reduce_mean( + input_tensor=tf.compat.v1.div( + tf.reduce_sum(input_tensor=e, axis=1), n_values + ) + ) + / 2 ) return err diff --git a/recommenders/models/tfidf/tfidf_utils.py b/recommenders/models/tfidf/tfidf_utils.py index 9773d7b58b..69e7b05b77 100644 --- a/recommenders/models/tfidf/tfidf_utils.py +++ b/recommenders/models/tfidf/tfidf_utils.py @@ -68,7 +68,9 @@ def __clean_text(self, text, for_BERT=False, verbose=False): clean = clean.replace("Â\xa0", "") # non-breaking space # Remove all punctuation and special characters - clean = re.sub("([^\s\w]|_)+", "", clean) # noqa W695 invalid escape sequence '\s' + clean = re.sub( + "([^\s\w]|_)+", "", clean # noqa W695 invalid escape sequence '\s' + ) # If you want to keep some punctuation, see below commented out example # clean = re.sub('([^\s\w\-\_\(\)]|_)+','', clean) diff --git a/recommenders/models/vae/multinomial_vae.py b/recommenders/models/vae/multinomial_vae.py index 7f06e84836..7fe43cc23a 100644 --- a/recommenders/models/vae/multinomial_vae.py +++ b/recommenders/models/vae/multinomial_vae.py @@ -285,7 +285,9 @@ def _create_model(self): self.h = Dense( self.intermediate_dim, activation="tanh", - kernel_initializer=tf.compat.v1.keras.initializers.glorot_uniform(seed=self.seed), + kernel_initializer=tf.compat.v1.keras.initializers.glorot_uniform( + seed=self.seed + ), bias_initializer=tf.compat.v1.keras.initializers.truncated_normal( stddev=0.001, seed=self.seed ), @@ -302,7 +304,9 @@ def _create_model(self): self.h_decoder = Dense( self.intermediate_dim, activation="tanh", - kernel_initializer=tf.compat.v1.keras.initializers.glorot_uniform(seed=self.seed), + kernel_initializer=tf.compat.v1.keras.initializers.glorot_uniform( + seed=self.seed + ), bias_initializer=tf.compat.v1.keras.initializers.truncated_normal( stddev=0.001, seed=self.seed ), @@ -323,7 +327,9 @@ def _create_model(self): def _get_vae_loss(self, x, x_bar): """Calculate negative ELBO (NELBO).""" log_softmax_var = tf.nn.log_softmax(x_bar) - self.neg_ll = -tf.reduce_mean(input_tensor=tf.reduce_sum(input_tensor=log_softmax_var * x, axis=-1)) + self.neg_ll = -tf.reduce_mean( + input_tensor=tf.reduce_sum(input_tensor=log_softmax_var * x, axis=-1) + ) a = tf.keras.backend.print_tensor(self.neg_ll) # noqa: F841 # calculate positive Kullback–Leibler divergence divergence term kl_loss = K.mean( diff --git a/recommenders/models/wide_deep/wide_deep_utils.py b/recommenders/models/wide_deep/wide_deep_utils.py index 9443deaa99..75c6479e6f 100644 --- a/recommenders/models/wide_deep/wide_deep_utils.py +++ b/recommenders/models/wide_deep/wide_deep_utils.py @@ -173,7 +173,7 @@ def build_model( model_dir=model_dir, config=config, feature_columns=wide_columns, - optimizer=linear_optimizer + optimizer=linear_optimizer, ) elif len(wide_columns) == 0 and len(deep_columns) > 0: model = tf.compat.v1.estimator.DNNRegressor( @@ -183,7 +183,7 @@ def build_model( hidden_units=dnn_hidden_units, optimizer=dnn_optimizer, dropout=dnn_dropout, - batch_norm=dnn_batch_norm + batch_norm=dnn_batch_norm, ) elif len(wide_columns) > 0 and len(deep_columns) > 0: model = tf.compat.v1.estimator.DNNLinearCombinedRegressor( @@ -197,7 +197,7 @@ def build_model( dnn_hidden_units=dnn_hidden_units, dnn_optimizer=dnn_optimizer, dnn_dropout=dnn_dropout, - batch_norm=dnn_batch_norm + batch_norm=dnn_batch_norm, ) else: raise ValueError( diff --git a/recommenders/tuning/nni/ncf_utils.py b/recommenders/tuning/nni/ncf_utils.py index d286a4cf5a..738ba40419 100644 --- a/recommenders/tuning/nni/ncf_utils.py +++ b/recommenders/tuning/nni/ncf_utils.py @@ -6,7 +6,9 @@ from recommenders.utils.constants import DEFAULT_K -def compute_test_results(model, train, test, rating_metrics, ranking_metrics, k=DEFAULT_K): +def compute_test_results( + model, train, test, rating_metrics, ranking_metrics, k=DEFAULT_K +): """Compute the test results using a trained NCF model. Args: @@ -29,8 +31,10 @@ def compute_test_results(model, train, test, rating_metrics, ranking_metrics, k= for (_, row) in test.iterrows() ] - predictions = pd.DataFrame(predictions, columns=['userID', 'itemID', 'prediction']) - predictions = predictions.astype({'userID': 'int64', 'itemID': 'int64', 'prediction': 'float64'}) + predictions = pd.DataFrame(predictions, columns=["userID", "itemID", "prediction"]) + predictions = predictions.astype( + {"userID": "int64", "itemID": "int64", "prediction": "float64"} + ) for metric in rating_metrics: test_results[metric] = eval(metric)(test, predictions) @@ -44,13 +48,17 @@ def compute_test_results(model, train, test, rating_metrics, ranking_metrics, k= items.extend(item) preds.extend(list(model.predict(user, item, is_list=True))) - all_predictions = pd.DataFrame(data={"userID": users, "itemID": items, "prediction": preds}) + all_predictions = pd.DataFrame( + data={"userID": users, "itemID": items, "prediction": preds} + ) merged = pd.merge(train, all_predictions, on=["userID", "itemID"], how="outer") - all_predictions = merged[merged.rating.isnull()].drop('rating', axis=1) + all_predictions = merged[merged.rating.isnull()].drop("rating", axis=1) for metric in ranking_metrics: - test_results[metric] = eval(metric)(test, all_predictions, col_prediction='prediction', k=k) + test_results[metric] = eval(metric)( + test, all_predictions, col_prediction="prediction", k=k + ) return test_results diff --git a/recommenders/utils/tf_utils.py b/recommenders/utils/tf_utils.py index ef88e65ae1..618bbc05b9 100644 --- a/recommenders/utils/tf_utils.py +++ b/recommenders/utils/tf_utils.py @@ -4,7 +4,9 @@ import itertools import numpy as np import tensorflow as tf -from tensorflow_estimator.python.estimator.export.export import build_supervised_input_receiver_fn_from_input_fn +from tensorflow_estimator.python.estimator.export.export import ( + build_supervised_input_receiver_fn_from_input_fn, +) MODEL_DIR = "model_checkpoints" @@ -86,7 +88,7 @@ def pandas_input_fn( for col in X_df.columns: values = X_df[col].values if isinstance(values[0], (list, np.ndarray)): - values = np.array([l for l in values], dtype=np.float32) # noqa: E741 ambiguous variable name 'l' + values = np.array(values.to_list(), dtype=np.float32) X[col] = values return lambda: _dataset( @@ -166,16 +168,8 @@ def export_model(model, train_input_fn, eval_input_fn, tf_feat_cols, base_dir): str: Exported model path """ tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.ERROR) - train_rcvr_fn = ( - build_supervised_input_receiver_fn_from_input_fn( - train_input_fn - ) - ) - eval_rcvr_fn = ( - build_supervised_input_receiver_fn_from_input_fn( - eval_input_fn - ) - ) + train_rcvr_fn = build_supervised_input_receiver_fn_from_input_fn(train_input_fn) + eval_rcvr_fn = build_supervised_input_receiver_fn_from_input_fn(eval_input_fn) serve_rcvr_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn( tf.feature_column.make_parse_example_spec(tf_feat_cols) ) @@ -276,7 +270,9 @@ def __init__( def begin(self): if self.model_dir is not None: - self.summary_writer = tf.compat.v1.summary.FileWriterCache.get(self.model_dir) + self.summary_writer = tf.compat.v1.summary.FileWriterCache.get( + self.model_dir + ) self.global_step_tensor = tf.compat.v1.train.get_or_create_global_step() else: self.step = 0 @@ -331,7 +327,9 @@ def end(self, session): def _log(self, tag, value): self.logger.log(tag, value) if self.summary_writer is not None: - summary = tf.compat.v1.Summary(value=[tf.compat.v1.Summary.Value(tag=tag, simple_value=value)]) + summary = tf.compat.v1.Summary( + value=[tf.compat.v1.Summary.Value(tag=tag, simple_value=value)] + ) self.summary_writer.add_summary(summary, self.step) diff --git a/tests/conftest.py b/tests/conftest.py index 4f486250cb..30d0ac0467 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -333,7 +333,7 @@ def notebooks(): return paths -### NCF FIXTURES +# NCF FIXTURES @pytest.fixture(scope="module") diff --git a/tests/integration/examples/test_notebooks_pyspark.py b/tests/integration/examples/test_notebooks_pyspark.py index de60599267..aca8043316 100644 --- a/tests/integration/examples/test_notebooks_pyspark.py +++ b/tests/integration/examples/test_notebooks_pyspark.py @@ -3,6 +3,7 @@ import sys import pytest + try: import papermill as pm import scrapbook as sb diff --git a/tests/integration/recommenders/datasets/test_criteo.py b/tests/integration/recommenders/datasets/test_criteo.py index e39d56aba5..e0fa0a9fe7 100644 --- a/tests/integration/recommenders/datasets/test_criteo.py +++ b/tests/integration/recommenders/datasets/test_criteo.py @@ -1,7 +1,6 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -import os import pytest import pandas as pd from recommenders.datasets import criteo diff --git a/tests/integration/recommenders/datasets/test_movielens.py b/tests/integration/recommenders/datasets/test_movielens.py index 1891d6b2f1..74aeb85794 100644 --- a/tests/integration/recommenders/datasets/test_movielens.py +++ b/tests/integration/recommenders/datasets/test_movielens.py @@ -16,9 +16,6 @@ StructType, StructField, IntegerType, - StringType, - FloatType, - DoubleType, ) from pyspark.sql.functions import col except ImportError: diff --git a/tests/smoke/examples/test_notebooks_pyspark.py b/tests/smoke/examples/test_notebooks_pyspark.py index c55f27d67f..ce589cb4a4 100644 --- a/tests/smoke/examples/test_notebooks_pyspark.py +++ b/tests/smoke/examples/test_notebooks_pyspark.py @@ -3,6 +3,7 @@ import sys import pytest + try: import papermill as pm import scrapbook as sb diff --git a/tests/smoke/recommenders/dataset/test_movielens.py b/tests/smoke/recommenders/dataset/test_movielens.py index 58605bc558..6a7268b2be 100644 --- a/tests/smoke/recommenders/dataset/test_movielens.py +++ b/tests/smoke/recommenders/dataset/test_movielens.py @@ -16,9 +16,6 @@ StructType, StructField, IntegerType, - StringType, - FloatType, - DoubleType, ) from pyspark.sql.functions import col except ImportError: diff --git a/tests/smoke/recommenders/recommender/test_deeprec_model.py b/tests/smoke/recommenders/recommender/test_deeprec_model.py index 1c8cc391f5..401689bd8a 100644 --- a/tests/smoke/recommenders/recommender/test_deeprec_model.py +++ b/tests/smoke/recommenders/recommender/test_deeprec_model.py @@ -2,7 +2,6 @@ # Licensed under the MIT License. import os -import papermill as pm import pytest try: @@ -88,7 +87,6 @@ def test_model_dkn(deeprec_resource_path): yaml_file = os.path.join(data_path, r"dkn.yaml") train_file = os.path.join(data_path, r"train_mind_demo.txt") valid_file = os.path.join(data_path, r"valid_mind_demo.txt") - test_file = os.path.join(data_path, r"test_mind_demo.txt") news_feature_file = os.path.join(data_path, r"doc_feature.txt") user_history_file = os.path.join(data_path, r"user_history.txt") wordEmb_file = os.path.join(data_path, r"word_embeddings_100.npy") diff --git a/tests/smoke/recommenders/recommender/test_deeprec_utils.py b/tests/smoke/recommenders/recommender/test_deeprec_utils.py index b011c67962..110f800828 100644 --- a/tests/smoke/recommenders/recommender/test_deeprec_utils.py +++ b/tests/smoke/recommenders/recommender/test_deeprec_utils.py @@ -13,15 +13,12 @@ from recommenders.models.deeprec.deeprec_utils import ( prepare_hparams, download_deeprec_resources, - load_yaml, ) from recommenders.models.deeprec.io.dkn_iterator import DKNTextIterator from recommenders.models.deeprec.io.dkn_item2item_iterator import ( DKNItem2itemTextIterator, ) - from recommenders.models.deeprec.io.iterator import FFMTextIterator from recommenders.models.deeprec.io.sequential_iterator import SequentialIterator - from recommenders.models.deeprec.models.sequential.sli_rec import SLI_RECModel except ImportError: pass # disable error while collecting tests for non-gpu environments @@ -56,7 +53,7 @@ def test_DKN_iterator(deeprec_resource_path): for res, impression, data_size in iterator.load_data_from_file(data_file): assert isinstance(res, dict) - ### test DKN item2item iterator + # test DKN item2item iterator hparams = prepare_hparams( yaml_file, news_feature_file=news_feature_file, diff --git a/tests/smoke/recommenders/recommender/test_newsrec_model.py b/tests/smoke/recommenders/recommender/test_newsrec_model.py index 940dbe962a..b6451c588d 100644 --- a/tests/smoke/recommenders/recommender/test_newsrec_model.py +++ b/tests/smoke/recommenders/recommender/test_newsrec_model.py @@ -2,7 +2,6 @@ # Licensed under the MIT License. import os -import papermill as pm import pytest try: @@ -12,7 +11,6 @@ from recommenders.models.newsrec.models.nrms import NRMSModel from recommenders.models.newsrec.models.naml import NAMLModel from recommenders.models.newsrec.models.lstur import LSTURModel - from recommenders.models.newsrec.models.npa import NPAModel from recommenders.models.newsrec.io.mind_iterator import MINDIterator from recommenders.models.newsrec.io.mind_all_iterator import MINDAllIterator except ImportError: diff --git a/tests/smoke/recommenders/recommender/test_newsrec_utils.py b/tests/smoke/recommenders/recommender/test_newsrec_utils.py index 07b7d52a0c..bdcdf07b5f 100644 --- a/tests/smoke/recommenders/recommender/test_newsrec_utils.py +++ b/tests/smoke/recommenders/recommender/test_newsrec_utils.py @@ -5,8 +5,7 @@ import pytest try: - import tensorflow as tf - from recommenders.models.newsrec.newsrec_utils import prepare_hparams, load_yaml + from recommenders.models.newsrec.newsrec_utils import prepare_hparams from recommenders.models.deeprec.deeprec_utils import download_deeprec_resources from recommenders.models.newsrec.io.mind_iterator import MINDIterator from recommenders.models.newsrec.io.mind_all_iterator import MINDAllIterator diff --git a/tests/unit/examples/test_notebooks_pyspark.py b/tests/unit/examples/test_notebooks_pyspark.py index 299215b1ab..1e2bd49407 100644 --- a/tests/unit/examples/test_notebooks_pyspark.py +++ b/tests/unit/examples/test_notebooks_pyspark.py @@ -3,12 +3,17 @@ import sys import pytest + try: import papermill as pm except ImportError: pass # disable error while collecting tests for non-notebook environments -from recommenders.utils.constants import DEFAULT_RATING_COL, DEFAULT_USER_COL, DEFAULT_ITEM_COL +from recommenders.utils.constants import ( + DEFAULT_RATING_COL, + DEFAULT_USER_COL, + DEFAULT_ITEM_COL, +) # This is a flaky test that can fail unexpectedly @@ -20,13 +25,17 @@ ) def test_als_pyspark_runs(notebooks, output_notebook, kernel_name): notebook_path = notebooks["als_pyspark"] - pm.execute_notebook(notebook_path, output_notebook, kernel_name=kernel_name, - parameters=dict( - MOVIELENS_DATA_SIZE="mock100", - COL_USER=DEFAULT_USER_COL, - COL_ITEM=DEFAULT_ITEM_COL, - COL_RATING=DEFAULT_RATING_COL, - )) + pm.execute_notebook( + notebook_path, + output_notebook, + kernel_name=kernel_name, + parameters=dict( + MOVIELENS_DATA_SIZE="mock100", + COL_USER=DEFAULT_USER_COL, + COL_ITEM=DEFAULT_ITEM_COL, + COL_RATING=DEFAULT_RATING_COL, + ), + ) @pytest.mark.notebooks @@ -45,13 +54,17 @@ def test_data_split_runs(notebooks, output_notebook, kernel_name): ) def test_als_deep_dive_runs(notebooks, output_notebook, kernel_name): notebook_path = notebooks["als_deep_dive"] - pm.execute_notebook(notebook_path, output_notebook, kernel_name=kernel_name, - parameters=dict( - MOVIELENS_DATA_SIZE="mock100", - COL_USER=DEFAULT_USER_COL, - COL_ITEM=DEFAULT_ITEM_COL, - COL_RATING=DEFAULT_RATING_COL, - )) + pm.execute_notebook( + notebook_path, + output_notebook, + kernel_name=kernel_name, + parameters=dict( + MOVIELENS_DATA_SIZE="mock100", + COL_USER=DEFAULT_USER_COL, + COL_ITEM=DEFAULT_ITEM_COL, + COL_RATING=DEFAULT_RATING_COL, + ), + ) # This is a flaky test that can fail unexpectedly @@ -72,14 +85,18 @@ def test_evaluation_runs(notebooks, output_notebook, kernel_name): @pytest.mark.spark def test_evaluation_diversity_runs(notebooks, output_notebook, kernel_name): notebook_path = notebooks["evaluation_diversity"] - pm.execute_notebook(notebook_path, output_notebook, kernel_name=kernel_name, - parameters=dict( - TOP_K=10, - MOVIELENS_DATA_SIZE="mock100", - COL_USER=DEFAULT_USER_COL, - COL_ITEM=DEFAULT_ITEM_COL, - COL_RATING=DEFAULT_RATING_COL, - )) + pm.execute_notebook( + notebook_path, + output_notebook, + kernel_name=kernel_name, + parameters=dict( + TOP_K=10, + MOVIELENS_DATA_SIZE="mock100", + COL_USER=DEFAULT_USER_COL, + COL_ITEM=DEFAULT_ITEM_COL, + COL_RATING=DEFAULT_RATING_COL, + ), + ) # This is a flaky test that can fail unexpectedly diff --git a/tests/unit/examples/test_notebooks_python.py b/tests/unit/examples/test_notebooks_python.py index e9cda6810e..adf18cfec3 100644 --- a/tests/unit/examples/test_notebooks_python.py +++ b/tests/unit/examples/test_notebooks_python.py @@ -52,8 +52,12 @@ def test_baseline_deep_dive_runs(notebooks, output_notebook, kernel_name): @pytest.mark.notebooks def test_surprise_deep_dive_runs(notebooks, output_notebook, kernel_name): notebook_path = notebooks["surprise_svd_deep_dive"] - pm.execute_notebook(notebook_path, output_notebook, kernel_name=kernel_name, - parameters=dict(MOVIELENS_DATA_SIZE="mock100")) + pm.execute_notebook( + notebook_path, + output_notebook, + kernel_name=kernel_name, + parameters=dict(MOVIELENS_DATA_SIZE="mock100"), + ) @pytest.mark.notebooks @@ -101,8 +105,12 @@ def test_wikidata_runs(notebooks, output_notebook, kernel_name, tmp): @pytest.mark.notebooks def test_rlrmc_quickstart_runs(notebooks, output_notebook, kernel_name): notebook_path = notebooks["rlrmc_quickstart"] - pm.execute_notebook(notebook_path, output_notebook, kernel_name=kernel_name, - parameters=dict(rank_parameter=2, MOVIELENS_DATA_SIZE="mock100")) + pm.execute_notebook( + notebook_path, + output_notebook, + kernel_name=kernel_name, + parameters=dict(rank_parameter=2, MOVIELENS_DATA_SIZE="mock100"), + ) @pytest.mark.notebooks diff --git a/tests/unit/recommenders/datasets/test_covid_utils.py b/tests/unit/recommenders/datasets/test_covid_utils.py index d68c2edb22..c32e702bd7 100644 --- a/tests/unit/recommenders/datasets/test_covid_utils.py +++ b/tests/unit/recommenders/datasets/test_covid_utils.py @@ -1,7 +1,7 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -from unittest.mock import patch, MagicMock +from unittest.mock import patch import pytest from recommenders.datasets.covid_utils import ( remove_duplicates, diff --git a/tests/unit/recommenders/datasets/test_movielens.py b/tests/unit/recommenders/datasets/test_movielens.py index d8f12771f9..5af0441743 100644 --- a/tests/unit/recommenders/datasets/test_movielens.py +++ b/tests/unit/recommenders/datasets/test_movielens.py @@ -4,7 +4,11 @@ from recommenders.datasets.movielens import MockMovielensSchema from recommenders.datasets.movielens import load_pandas_df, load_spark_df -from recommenders.datasets.movielens import DATA_FORMAT, MOCK_DATA_FORMAT, DEFAULT_HEADER +from recommenders.datasets.movielens import ( + DATA_FORMAT, + MOCK_DATA_FORMAT, + DEFAULT_HEADER, +) from recommenders.utils.constants import DEFAULT_GENRE_COL, DEFAULT_TITLE_COL from pandas.core.series import Series @@ -19,7 +23,9 @@ def test_mock_movielens_schema__has_default_col_names(size): @pytest.mark.parametrize("keep_first_n_cols", [1, 2, 3, 4]) -def test_mock_movielens_schema__get_df_remove_default_col__return_success(keep_first_n_cols): +def test_mock_movielens_schema__get_df_remove_default_col__return_success( + keep_first_n_cols, +): df = MockMovielensSchema.get_df(size=3, keep_first_n_cols=keep_first_n_cols) assert len(df) > 0 assert len(df.columns) == keep_first_n_cols @@ -36,11 +42,15 @@ def test_mock_movielens_schema__get_df_invalid_param__return_failure(keep_first_ @pytest.mark.parametrize("keep_first_n_cols", [None, 2]) @pytest.mark.parametrize("seed", [-1]) # seed for pseudo-random # generation @pytest.mark.parametrize("size", [0, 3, 10]) -def test_mock_movielens_schema__get_df__return_success(size, seed, keep_first_n_cols, keep_title_col, keep_genre_col): +def test_mock_movielens_schema__get_df__return_success( + size, seed, keep_first_n_cols, keep_title_col, keep_genre_col +): df = MockMovielensSchema.get_df( - size=size, seed=seed, + size=size, + seed=seed, keep_first_n_cols=keep_first_n_cols, - keep_title_col=keep_title_col, keep_genre_col=keep_genre_col + keep_title_col=keep_title_col, + keep_genre_col=keep_genre_col, ) assert type(df) == pandas.DataFrame assert len(df) == size @@ -56,8 +66,16 @@ def test_mock_movielens_schema__get_df__return_success(size, seed, keep_first_n_ @pytest.mark.parametrize("keep_title_col", [True, False]) @pytest.mark.parametrize("seed", [101]) # seed for pseudo-random # generation @pytest.mark.parametrize("size", [0, 3, 10]) -def test_mock_movielens_schema__get_spark_df__return_success(spark, size, seed, keep_title_col, keep_genre_col): - df = MockMovielensSchema.get_spark_df(spark, size=size, seed=seed, keep_title_col=keep_title_col, keep_genre_col=keep_genre_col) +def test_mock_movielens_schema__get_spark_df__return_success( + spark, size, seed, keep_title_col, keep_genre_col +): + df = MockMovielensSchema.get_spark_df( + spark, + size=size, + seed=seed, + keep_title_col=keep_title_col, + keep_genre_col=keep_genre_col, + ) assert df.count() == size if keep_title_col: @@ -74,7 +92,9 @@ def test_mock_movielens_schema__get_spark_df__store_tmp_file(spark, tmp_path): @pytest.mark.spark -def test_mock_movielens_schema__get_spark_df__data_serialization_default_param(spark, mocker: MockerFixture): +def test_mock_movielens_schema__get_spark_df__data_serialization_default_param( + spark, mocker: MockerFixture +): data_size = 3 to_csv_spy = mocker.spy(pandas.DataFrame, "to_csv") @@ -108,18 +128,22 @@ def test_load_pandas_df_mock_100__with_default_param__succeed(): @pytest.mark.spark def test_load_spark_df_mock_100__with_custom_param__succeed(spark): - df = load_spark_df(spark, "mock100", title_col=DEFAULT_TITLE_COL, genres_col=DEFAULT_GENRE_COL) + df = load_spark_df( + spark, "mock100", title_col=DEFAULT_TITLE_COL, genres_col=DEFAULT_GENRE_COL + ) assert df.schema[DEFAULT_TITLE_COL] assert df.schema[DEFAULT_GENRE_COL] assert df.count() == 100 - assert '|' in df.take(1)[0][DEFAULT_GENRE_COL] - assert df.take(1)[0][DEFAULT_TITLE_COL] == 'foo' + assert "|" in df.take(1)[0][DEFAULT_GENRE_COL] + assert df.take(1)[0][DEFAULT_TITLE_COL] == "foo" def test_load_pandas_df_mock_100__with_custom_param__succeed(): - df = load_pandas_df("mock100", title_col=DEFAULT_TITLE_COL, genres_col=DEFAULT_GENRE_COL) + df = load_pandas_df( + "mock100", title_col=DEFAULT_TITLE_COL, genres_col=DEFAULT_GENRE_COL + ) assert type(df[DEFAULT_TITLE_COL]) == Series assert type(df[DEFAULT_GENRE_COL]) == Series assert len(df) == 100 - assert '|' in df.loc[0, DEFAULT_GENRE_COL] - assert df.loc[0, DEFAULT_TITLE_COL] == 'foo' + assert "|" in df.loc[0, DEFAULT_GENRE_COL] + assert df.loc[0, DEFAULT_TITLE_COL] == "foo" diff --git a/tests/unit/recommenders/datasets/test_pandas_df_utils.py b/tests/unit/recommenders/datasets/test_pandas_df_utils.py index 7ec62437c0..9b85362b96 100644 --- a/tests/unit/recommenders/datasets/test_pandas_df_utils.py +++ b/tests/unit/recommenders/datasets/test_pandas_df_utils.py @@ -8,7 +8,6 @@ import os from recommenders.datasets.pandas_df_utils import ( - user_item_pairs, filter_by, LibffmConverter, has_same_base_dtype, diff --git a/tests/unit/recommenders/datasets/test_wikidata.py b/tests/unit/recommenders/datasets/test_wikidata.py index 60e887f72e..2431f234cb 100644 --- a/tests/unit/recommenders/datasets/test_wikidata.py +++ b/tests/unit/recommenders/datasets/test_wikidata.py @@ -5,7 +5,6 @@ from recommenders.datasets.wikidata import ( - search_wikidata, find_wikidata_id, query_entity_links, read_linked_entities, diff --git a/tests/unit/recommenders/evaluation/test_python_evaluation.py b/tests/unit/recommenders/evaluation/test_python_evaluation.py index cdf377cf6c..ee648ae03b 100644 --- a/tests/unit/recommenders/evaluation/test_python_evaluation.py +++ b/tests/unit/recommenders/evaluation/test_python_evaluation.py @@ -41,14 +41,15 @@ TOL = 0.0001 + # fmt: off @pytest.fixture def rating_true(): return pd.DataFrame( { - DEFAULT_USER_COL: [1,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,1,1], - DEFAULT_ITEM_COL: [3,1,4,5,6,7,2,5,6,8,9,10,11,12,13,14,1,2], - DEFAULT_RATING_COL: [3,5,5,3,3,1,5,5,5,4,4,3,3,3,2,1,5,4], + DEFAULT_USER_COL: [1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1], + DEFAULT_ITEM_COL: [3, 1, 4, 5, 6, 7, 2, 5, 6, 8, 9, 10, 11, 12, 13, 14, 1, 2], + DEFAULT_RATING_COL: [3, 5, 5, 3, 3, 1, 5, 5, 5, 4, 4, 3, 3, 3, 2, 1, 5, 4], } ) @@ -57,10 +58,10 @@ def rating_true(): def rating_pred(): return pd.DataFrame( { - DEFAULT_USER_COL: [1,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,1,1], - DEFAULT_ITEM_COL: [12,10,3,5,11,13,4,10,7,13,1,3,5,2,11,14,3,10], - DEFAULT_PREDICTION_COL: [12,14,13,12,11,10,14,13,12,11,10,9,8,7,6,5,14,13], - DEFAULT_RATING_COL: [3,5,5,3,3,1,5,5,5,4,4,3,3,3,2,1,5,4], + DEFAULT_USER_COL: [1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1], + DEFAULT_ITEM_COL: [12, 10, 3, 5, 11, 13, 4, 10, 7, 13, 1, 3, 5, 2, 11, 14, 3, 10], + DEFAULT_PREDICTION_COL: [12, 14, 13, 12, 11, 10, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 14, 13], + DEFAULT_RATING_COL: [3, 5, 5, 3, 3, 1, 5, 5, 5, 4, 4, 3, 3, 3, 2, 1, 5, 4], } ) @@ -69,9 +70,9 @@ def rating_pred(): def rating_nohit(): return pd.DataFrame( { - DEFAULT_USER_COL: [1,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,1,1,], + DEFAULT_USER_COL: [1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1], DEFAULT_ITEM_COL: [100] * 18, - DEFAULT_PREDICTION_COL: [12,14,13,12,11,10,14,13,12,11,10,9,8,7,6,5,14,13], + DEFAULT_PREDICTION_COL: [12, 14, 13, 12, 11, 10, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 14, 13], } ) # fmt: on diff --git a/tests/unit/recommenders/models/test_geoimc.py b/tests/unit/recommenders/models/test_geoimc.py index 9c32139f9b..6408b661be 100644 --- a/tests/unit/recommenders/models/test_geoimc.py +++ b/tests/unit/recommenders/models/test_geoimc.py @@ -1,17 +1,13 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -import itertools import collections import pytest import numpy as np -import pandas as pd from scipy.sparse import csr_matrix -from pandas.testing import assert_frame_equal -from recommenders.utils.python_utils import binarize from recommenders.models.geoimc.geoimc_data import DataPtr -from recommenders.models.geoimc.geoimc_predict import PlainScalarProduct, Inferer +from recommenders.models.geoimc.geoimc_predict import Inferer from recommenders.models.geoimc.geoimc_algorithm import IMCProblem from recommenders.models.geoimc.geoimc_utils import ( length_normalize, @@ -37,6 +33,7 @@ ), ] + # `geoimc_data` tests @pytest.mark.parametrize("data, entities", _IMC_TEST_DATA) def test_dataptr(data, entities): @@ -99,7 +96,7 @@ def test_imcproblem(dataPtr, rank): assert prblm.rank == rank assert prblm.lambda1 == 1e-2 assert prblm.W is None - assert prblm.optima_reached == False + assert not prblm.optima_reached # Test solve prblm.solve(10, 10, 0) @@ -109,7 +106,7 @@ def test_imcproblem(dataPtr, rank): # Test reset prblm.reset() assert prblm.W is None - assert prblm.optima_reached == False + assert not prblm.optima_reached # `geoimc_predict` tests diff --git a/tests/unit/recommenders/models/test_lightfm_utils.py b/tests/unit/recommenders/models/test_lightfm_utils.py index 60c48e46a5..f43bff9a3a 100644 --- a/tests/unit/recommenders/models/test_lightfm_utils.py +++ b/tests/unit/recommenders/models/test_lightfm_utils.py @@ -5,11 +5,9 @@ import itertools import numpy as np import pandas as pd -import lightfm from lightfm import LightFM, cross_validation from lightfm.data import Dataset from recommenders.models.lightfm.lightfm_utils import ( - compare_metric, track_model_metrics, similar_users, similar_items, diff --git a/tests/unit/recommenders/models/test_newsrec_utils.py b/tests/unit/recommenders/models/test_newsrec_utils.py index 8977aa5a8b..f719af5c19 100644 --- a/tests/unit/recommenders/models/test_newsrec_utils.py +++ b/tests/unit/recommenders/models/test_newsrec_utils.py @@ -7,7 +7,6 @@ try: from recommenders.models.deeprec.deeprec_utils import download_deeprec_resources from recommenders.models.newsrec.newsrec_utils import prepare_hparams, load_yaml - import tensorflow as tf except ImportError: pass # skip this import if we are in cpu environment diff --git a/tests/unit/recommenders/models/test_rbm.py b/tests/unit/recommenders/models/test_rbm.py index 4a28f68077..ec66fa5bea 100644 --- a/tests/unit/recommenders/models/test_rbm.py +++ b/tests/unit/recommenders/models/test_rbm.py @@ -98,8 +98,8 @@ def check_sampled_values(sampled, s): a = [] for i in range(0, s + 1): - l = sampled == i - a.append(l) + l_bool = sampled == i + a.append(l_bool) return sum(a) diff --git a/tests/unit/recommenders/models/test_sar_singlenode.py b/tests/unit/recommenders/models/test_sar_singlenode.py index 1019e8796d..6e7b623c74 100644 --- a/tests/unit/recommenders/models/test_sar_singlenode.py +++ b/tests/unit/recommenders/models/test_sar_singlenode.py @@ -81,8 +81,8 @@ def test_init(header): assert model.col_prediction == "prediction" assert model.similarity_type == "jaccard" assert model.time_decay_half_life == 2592000 - assert model.time_decay_flag == False - assert model.time_now == None + assert not model.time_decay_flag + assert model.time_now is None assert model.threshold == 1 diff --git a/tests/unit/recommenders/models/test_vowpal_wabbit.py b/tests/unit/recommenders/models/test_vowpal_wabbit.py index 36af325411..c9180ef105 100644 --- a/tests/unit/recommenders/models/test_vowpal_wabbit.py +++ b/tests/unit/recommenders/models/test_vowpal_wabbit.py @@ -114,7 +114,9 @@ def test_fit_and_predict(model, df): f.writelines(["1 0\n", "3 1\n", "5 2\n"]) # patch subprocess call to vw - with mock.patch("recommenders.models.vowpal_wabbit.vw.run") as mock_run: + with mock.patch( + "recommenders.models.vowpal_wabbit.vw.run" + ) as mock_run: # noqa: F841 model.fit(df) result = model.predict(df) diff --git a/tests/unit/recommenders/tuning/test_ncf_utils.py b/tests/unit/recommenders/tuning/test_ncf_utils.py index 313a9a46ee..1cfb334cd2 100644 --- a/tests/unit/recommenders/tuning/test_ncf_utils.py +++ b/tests/unit/recommenders/tuning/test_ncf_utils.py @@ -29,5 +29,11 @@ def fake_movielens_df(): def test_compute_test_results__return_success(mock_model, fake_movielens_df): mock_metric_func = "lambda *args, **kwargs: 0" - compute_test_results(mock_model, fake_movielens_df, fake_movielens_df, [mock_metric_func], [mock_metric_func]) + compute_test_results( + mock_model, + fake_movielens_df, + fake_movielens_df, + [mock_metric_func], + [mock_metric_func], + ) assert mock_model.predict.is_called diff --git a/tests/unit/recommenders/utils/test_general_utils.py b/tests/unit/recommenders/utils/test_general_utils.py index c98bbb8c9b..8ab6a47ec6 100644 --- a/tests/unit/recommenders/utils/test_general_utils.py +++ b/tests/unit/recommenders/utils/test_general_utils.py @@ -1,7 +1,6 @@ # Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the MIT License. -import pytest from recommenders.utils.general_utils import invert_dictionary, get_number_processors diff --git a/tests/unit/recommenders/utils/test_gpu_utils.py b/tests/unit/recommenders/utils/test_gpu_utils.py index fa27d385a5..0f38ae102a 100644 --- a/tests/unit/recommenders/utils/test_gpu_utils.py +++ b/tests/unit/recommenders/utils/test_gpu_utils.py @@ -16,7 +16,6 @@ get_cudnn_version, get_gpu_info, get_number_gpus, - clear_memory_all_gpus, ) diff --git a/tests/unit/recommenders/utils/test_notebook_utils.py b/tests/unit/recommenders/utils/test_notebook_utils.py index 34117fa415..69c04fe7ef 100644 --- a/tests/unit/recommenders/utils/test_notebook_utils.py +++ b/tests/unit/recommenders/utils/test_notebook_utils.py @@ -28,9 +28,9 @@ def test_is_jupyter(output_notebook, kernel_name): nb = sb.read_notebook(output_notebook) df = nb.scraps.dataframe result_is_jupyter = df.loc[df["name"] == "is_jupyter", "data"].values[0] - assert result_is_jupyter == True # is True not allowed + assert result_is_jupyter # is True not allowed result_is_databricks = df.loc[df["name"] == "is_databricks", "data"].values[0] - assert result_is_databricks == False + assert not result_is_databricks # @pytest.mark.notebooks diff --git a/tests/unit/recommenders/utils/test_plot.py b/tests/unit/recommenders/utils/test_plot.py index 72715e0fe1..ac376c38be 100644 --- a/tests/unit/recommenders/utils/test_plot.py +++ b/tests/unit/recommenders/utils/test_plot.py @@ -2,12 +2,11 @@ # Licensed under the MIT License. import matplotlib - -matplotlib.use("Agg") import matplotlib.pyplot as plt -import pytest from recommenders.utils.plot import line_graph +matplotlib.use("Agg") + def test_line_graph(): """Naive test to run the function without errors""" diff --git a/tests/unit/recommenders/utils/test_tf_utils.py b/tests/unit/recommenders/utils/test_tf_utils.py index cbf6e7cad8..06fc2052eb 100644 --- a/tests/unit/recommenders/utils/test_tf_utils.py +++ b/tests/unit/recommenders/utils/test_tf_utils.py @@ -28,7 +28,8 @@ build_feature_columns, ) import tensorflow as tf - tf.compat.v1.disable_eager_execution() # need to disable eager in TF2.x + + tf.compat.v1.disable_eager_execution() # need to disable eager in TF2.x except ImportError: pass # skip this import if we are in cpu environment From a8e316d0e0f2f093dfab3548773d1595d3110442 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Thu, 11 Nov 2021 18:16:42 +0000 Subject: [PATCH 40/60] Whitespace --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index f54adfdc55..1dedba4c98 100644 --- a/setup.py +++ b/setup.py @@ -27,7 +27,7 @@ version += ".post" + str(int(time.time())) install_requires = [ - "numpy>=1.19", # 1.19 required by tensorflow + "numpy>=1.19", # 1.19 required by tensorflow "pandas>1.0.3,<2", "scipy>=1.0.0,<2", "tqdm>=4.31.1,<5", @@ -39,7 +39,7 @@ "memory_profiler>=0.54.0,<1", "nltk>=3.4,<4", "pydocumentdb>=2.3.3<3", # TODO: replace with azure-cosmos - # Temporary fix for pymanopt, only this commit works with TF2 + # Temporary fix for pymanopt, only this commit works with TF2 "pymanopt@https://github.com/pymanopt/pymanopt/archive/fb36a272cdeecb21992cfd9271eb82baafeb316d.zip", "seaborn>=0.8.1,<1", "transformers>=2.5.0,<5", From 1f9c24aa3c1886e1733d2d7645b7ccdd683845ce Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Thu, 11 Nov 2021 19:49:28 +0000 Subject: [PATCH 41/60] Add keras in setup.py --- setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 1dedba4c98..8589c89fc8 100644 --- a/setup.py +++ b/setup.py @@ -67,9 +67,10 @@ ], "gpu": [ "nvidia-ml-py3>=7.352.0", - "tensorflow==2.6", # compiled with CUDA 11.2, cudnn 8.1 + "tensorflow~=2.6.1", # compiled with CUDA 11.2, cudnn 8.1 "tensorflow-estimator==2.6", "tensorboard==2.6", + "keras==2.6", "tf-slim>=1.1.0", "torch>=1.8", # for CUDA 11 support "fastai>=1.0.46,<2", From bd32d2fb6adce50b78a635b93aec1272551e8169 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Mon, 15 Nov 2021 19:49:19 +0000 Subject: [PATCH 42/60] Fix Surprise issue in test environments --- .github/workflows/actions/run-tests/action.yml | 1 + .github/workflows/pypi-test-publish.yml | 2 +- .github/workflows/pypi.yml | 2 +- tests/ci/azure_artifact_feed.yaml | 2 ++ tests/ci/azure_pipeline_test/dsvm_linux_template.yml | 3 +++ 5 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/actions/run-tests/action.yml b/.github/workflows/actions/run-tests/action.yml index 86b791fd99..5bc948b619 100644 --- a/.github/workflows/actions/run-tests/action.yml +++ b/.github/workflows/actions/run-tests/action.yml @@ -43,6 +43,7 @@ runs: shell: bash run: | python -m pip install --upgrade pip setuptools wheel + pip install numpy==1.19 pip install tox - name: Run ${{ inputs.test-kind }} tests ('${{ inputs.test-marker }}') diff --git a/.github/workflows/pypi-test-publish.yml b/.github/workflows/pypi-test-publish.yml index 99429e91e9..63687773cf 100644 --- a/.github/workflows/pypi-test-publish.yml +++ b/.github/workflows/pypi-test-publish.yml @@ -15,7 +15,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install setuptools wheel twine + pip install setuptools wheel twine numpy==1.19 python setup.py sdist bdist_wheel - name: Publish package uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index fe34acb33e..6c3193bb98 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -15,7 +15,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install setuptools wheel twine + pip install setuptools wheel twine numpy==1.19 python setup.py sdist bdist_wheel - name: Publish package diff --git a/tests/ci/azure_artifact_feed.yaml b/tests/ci/azure_artifact_feed.yaml index a62700d275..59d64e17a1 100644 --- a/tests/ci/azure_artifact_feed.yaml +++ b/tests/ci/azure_artifact_feed.yaml @@ -76,6 +76,8 @@ jobs: . /anaconda/etc/profile.d/conda.sh && \ conda activate $(env_name) && \ rm -rf dist && \ + pip install -U pip setuptools && \ + pip install numpy==1.19 && \ HASH=True LIBRARY_NAME=$(library_name) python setup.py sdist bdist_wheel displayName: 'Build wheel' diff --git a/tests/ci/azure_pipeline_test/dsvm_linux_template.yml b/tests/ci/azure_pipeline_test/dsvm_linux_template.yml index d8bb531129..f87ab17449 100644 --- a/tests/ci/azure_pipeline_test/dsvm_linux_template.yml +++ b/tests/ci/azure_pipeline_test/dsvm_linux_template.yml @@ -62,6 +62,9 @@ jobs: echo " --- BUILDING PACKAGE ---" rm -rf dist || exit -1 + pip install -U pip setuptools || exit -1 + pip install numpy==1.19 || exit -1 + python setup.py sdist bdist_wheel --plat-name=$PLATFORM || exit -1 echo " --- INSTALLING WHEEL ---" From fde38fbec7cb8c3573efc2bab096508b7160b862 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 16 Nov 2021 11:28:08 +0000 Subject: [PATCH 43/60] Undo 'Fix Surprise issue in test environments' --- .github/workflows/actions/run-tests/action.yml | 1 - .github/workflows/pypi-test-publish.yml | 2 +- .github/workflows/pypi.yml | 2 +- tests/ci/azure_artifact_feed.yaml | 2 -- tests/ci/azure_pipeline_test/dsvm_linux_template.yml | 3 --- 5 files changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/actions/run-tests/action.yml b/.github/workflows/actions/run-tests/action.yml index 5bc948b619..86b791fd99 100644 --- a/.github/workflows/actions/run-tests/action.yml +++ b/.github/workflows/actions/run-tests/action.yml @@ -43,7 +43,6 @@ runs: shell: bash run: | python -m pip install --upgrade pip setuptools wheel - pip install numpy==1.19 pip install tox - name: Run ${{ inputs.test-kind }} tests ('${{ inputs.test-marker }}') diff --git a/.github/workflows/pypi-test-publish.yml b/.github/workflows/pypi-test-publish.yml index 63687773cf..99429e91e9 100644 --- a/.github/workflows/pypi-test-publish.yml +++ b/.github/workflows/pypi-test-publish.yml @@ -15,7 +15,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install setuptools wheel twine numpy==1.19 + pip install setuptools wheel twine python setup.py sdist bdist_wheel - name: Publish package uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index 6c3193bb98..fe34acb33e 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -15,7 +15,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install setuptools wheel twine numpy==1.19 + pip install setuptools wheel twine python setup.py sdist bdist_wheel - name: Publish package diff --git a/tests/ci/azure_artifact_feed.yaml b/tests/ci/azure_artifact_feed.yaml index 59d64e17a1..a62700d275 100644 --- a/tests/ci/azure_artifact_feed.yaml +++ b/tests/ci/azure_artifact_feed.yaml @@ -76,8 +76,6 @@ jobs: . /anaconda/etc/profile.d/conda.sh && \ conda activate $(env_name) && \ rm -rf dist && \ - pip install -U pip setuptools && \ - pip install numpy==1.19 && \ HASH=True LIBRARY_NAME=$(library_name) python setup.py sdist bdist_wheel displayName: 'Build wheel' diff --git a/tests/ci/azure_pipeline_test/dsvm_linux_template.yml b/tests/ci/azure_pipeline_test/dsvm_linux_template.yml index f87ab17449..d8bb531129 100644 --- a/tests/ci/azure_pipeline_test/dsvm_linux_template.yml +++ b/tests/ci/azure_pipeline_test/dsvm_linux_template.yml @@ -62,9 +62,6 @@ jobs: echo " --- BUILDING PACKAGE ---" rm -rf dist || exit -1 - pip install -U pip setuptools || exit -1 - pip install numpy==1.19 || exit -1 - python setup.py sdist bdist_wheel --plat-name=$PLATFORM || exit -1 echo " --- INSTALLING WHEEL ---" From 679d50c83172151f9b7f5dfceb0e491c645564a9 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 16 Nov 2021 11:30:48 +0000 Subject: [PATCH 44/60] Change heading in sequential notebook --- examples/00_quick_start/sequential_recsys_amazondataset.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/00_quick_start/sequential_recsys_amazondataset.ipynb b/examples/00_quick_start/sequential_recsys_amazondataset.ipynb index b7af52e124..1fe0b976e7 100644 --- a/examples/00_quick_start/sequential_recsys_amazondataset.ipynb +++ b/examples/00_quick_start/sequential_recsys_amazondataset.ipynb @@ -463,7 +463,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 3. Online serving\n", + "## 3. Loading Trained Models\n", "In this section, we provide a simple example to illustrate how we can use the trained model to serve for production demand.\n", "\n", "Suppose we are in a new session. First let's load a previous trained model:" From 7688dc1d93b705817048a835c6473b72cc48758b Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 16 Nov 2021 13:52:43 +0000 Subject: [PATCH 45/60] Move pandera to core dependencies in order to fix movielens --- recommenders/datasets/movielens.py | 9 +++------ setup.py | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/recommenders/datasets/movielens.py b/recommenders/datasets/movielens.py index e4b3643e12..3e3a242efd 100644 --- a/recommenders/datasets/movielens.py +++ b/recommenders/datasets/movielens.py @@ -33,12 +33,9 @@ except ImportError: pass # so the environment without spark doesn't break -try: - import pandera as pa - from pandera import Field - from pandera.typing import Series -except ImportError: - pass # so the environment without recommender['dev'] doesn't break +import pandera as pa +from pandera import Field +from pandera.typing import Series class _DataFormat: diff --git a/setup.py b/setup.py index 8589c89fc8..6a40d86203 100644 --- a/setup.py +++ b/setup.py @@ -52,6 +52,7 @@ # For Surprise, specify the tarball in order to avoid incompatibilities of compiled .pyx files with numpy versions < 1.20 "scikit-surprise@https://files.pythonhosted.org/packages/97/37/5d334adaf5ddd65da99fc65f6507e0e4599d092ba048f4302fe8775619e8/scikit-surprise-1.1.1.tar.gz", "retrying>=1.3.3", + "pandera[strategies]>=0.6.5", # For generating fake datasets ] # shared dependencies @@ -86,7 +87,6 @@ ], "dev": [ "black>=18.6b4,<21", - "pandera[strategies]>=0.6.5", # For generating fake datasets "pytest>=3.6.4", "pytest-cov>=2.12.1", "pytest-mock>=3.6.1", # for access to mock fixtures in pytest From 25234476a4fe3f49eaada0c14b810922246355bd Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 16 Nov 2021 14:47:33 +0000 Subject: [PATCH 46/60] Fix issue with RLRMC test --- .github/workflows/actions/run-tests/action.yml | 1 + .github/workflows/pypi-test-publish.yml | 2 +- .github/workflows/pypi.yml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/actions/run-tests/action.yml b/.github/workflows/actions/run-tests/action.yml index 86b791fd99..5bc948b619 100644 --- a/.github/workflows/actions/run-tests/action.yml +++ b/.github/workflows/actions/run-tests/action.yml @@ -43,6 +43,7 @@ runs: shell: bash run: | python -m pip install --upgrade pip setuptools wheel + pip install numpy==1.19 pip install tox - name: Run ${{ inputs.test-kind }} tests ('${{ inputs.test-marker }}') diff --git a/.github/workflows/pypi-test-publish.yml b/.github/workflows/pypi-test-publish.yml index 99429e91e9..63687773cf 100644 --- a/.github/workflows/pypi-test-publish.yml +++ b/.github/workflows/pypi-test-publish.yml @@ -15,7 +15,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install setuptools wheel twine + pip install setuptools wheel twine numpy==1.19 python setup.py sdist bdist_wheel - name: Publish package uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index fe34acb33e..6c3193bb98 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -15,7 +15,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install setuptools wheel twine + pip install setuptools wheel twine numpy==1.19 python setup.py sdist bdist_wheel - name: Publish package From 3ef366a1aeae11c21880b30c472ca0810f413450 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Wed, 17 Nov 2021 12:21:30 +0000 Subject: [PATCH 47/60] Remove numpy 1.19 from GitHub workflows --- .github/workflows/actions/run-tests/action.yml | 1 - .github/workflows/pypi-test-publish.yml | 2 +- .github/workflows/pypi.yml | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/actions/run-tests/action.yml b/.github/workflows/actions/run-tests/action.yml index 5bc948b619..86b791fd99 100644 --- a/.github/workflows/actions/run-tests/action.yml +++ b/.github/workflows/actions/run-tests/action.yml @@ -43,7 +43,6 @@ runs: shell: bash run: | python -m pip install --upgrade pip setuptools wheel - pip install numpy==1.19 pip install tox - name: Run ${{ inputs.test-kind }} tests ('${{ inputs.test-marker }}') diff --git a/.github/workflows/pypi-test-publish.yml b/.github/workflows/pypi-test-publish.yml index 63687773cf..99429e91e9 100644 --- a/.github/workflows/pypi-test-publish.yml +++ b/.github/workflows/pypi-test-publish.yml @@ -15,7 +15,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install setuptools wheel twine numpy==1.19 + pip install setuptools wheel twine python setup.py sdist bdist_wheel - name: Publish package uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index 6c3193bb98..fe34acb33e 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -15,7 +15,7 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install setuptools wheel twine numpy==1.19 + pip install setuptools wheel twine python setup.py sdist bdist_wheel - name: Publish package From ecff395e2f60bbfebf31709568e3157c5c946437 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Fri, 19 Nov 2021 19:17:06 +0000 Subject: [PATCH 48/60] Fix mock movielens duplicates --- recommenders/datasets/movielens.py | 23 +++++++++++++------ .../recommenders/datasets/test_movielens.py | 3 +++ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/recommenders/datasets/movielens.py b/recommenders/datasets/movielens.py index 3e3a242efd..b9319bdd0d 100644 --- a/recommenders/datasets/movielens.py +++ b/recommenders/datasets/movielens.py @@ -34,6 +34,7 @@ pass # so the environment without spark doesn't break import pandera as pa +import pandera.extensions as extensions from pandera import Field from pandera.typing import Series @@ -575,6 +576,11 @@ def extract_movielens(size, rating_path, item_path, zip_path): shutil.copyfileobj(zf, f) +# For more information on data synthesis, see https://pandera.readthedocs.io/en/latest/data_synthesis_strategies.html +@extensions.register_check_method(statistics=["columns"], supported_types=pd.DataFrame) +def unique_columns(df, *, columns): + return not df[columns].duplicated().any() + class MockMovielensSchema(pa.SchemaModel): """ Mock dataset schema to generate fake data for testing purpose. @@ -589,12 +595,15 @@ class MockMovielensSchema(pa.SchemaModel): # Some notebooks will do a cross join with userID and itemID, # a sparse range for these IDs can slow down the notebook tests - userID: Series[int] = Field(in_range={"min_value": 1, "max_value": 10}) - itemID: Series[int] = Field(in_range={"min_value": 1, "max_value": 10}) - rating: Series[float] = Field(in_range={"min_value": 1, "max_value": 5}) - timestamp: Series[int] - title: Series[str] = Field(eq="foo") - genre: Series[str] = Field(eq="genreA|0") + userID: Series[int] = Field(in_range={"min_value": 1, "max_value": 50}, alias=DEFAULT_USER_COL) + itemID: Series[int] = Field(in_range={"min_value": 1, "max_value": 50}, alias=DEFAULT_ITEM_COL) + rating: Series[float] = Field(in_range={"min_value": 1, "max_value": 5}, alias=DEFAULT_RATING_COL) + timestamp: Series[int] = Field(alias=DEFAULT_TIMESTAMP_COL) + title: Series[str] = Field(eq="foo", alias=DEFAULT_TITLE_COL) + genre: Series[str] = Field(eq="genreA|0", alias=DEFAULT_GENRE_COL) + + class Config: + unique_columns = () @classmethod def get_df( @@ -630,7 +639,7 @@ def get_df( schema = schema.remove_columns([DEFAULT_GENRE_COL]) random.seed(seed) - # For more information on data synthesis, see https://pandera.readthedocs.io/en/latest/data_synthesis_strategies.html + schema.checks = [pa.Check.unique_columns([DEFAULT_USER_COL, DEFAULT_ITEM_COL])] return schema.example(size=size) @classmethod diff --git a/tests/unit/recommenders/datasets/test_movielens.py b/tests/unit/recommenders/datasets/test_movielens.py index 5af0441743..67b5aebf96 100644 --- a/tests/unit/recommenders/datasets/test_movielens.py +++ b/tests/unit/recommenders/datasets/test_movielens.py @@ -8,6 +8,8 @@ DATA_FORMAT, MOCK_DATA_FORMAT, DEFAULT_HEADER, + DEFAULT_ITEM_COL, + DEFAULT_USER_COL ) from recommenders.utils.constants import DEFAULT_GENRE_COL, DEFAULT_TITLE_COL @@ -124,6 +126,7 @@ def test_load_pandas_df_mock_100__with_default_param__succeed(): df = load_pandas_df("mock100") assert type(df) == pandas.DataFrame assert len(df) == 100 + assert not df[[DEFAULT_USER_COL, DEFAULT_ITEM_COL]].duplicated().any() @pytest.mark.spark From dd0b29e23ddb865f1c3c015fb4af70ca0e6944d4 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Wed, 24 Nov 2021 17:19:17 +0000 Subject: [PATCH 49/60] Fix mock movielens test --- recommenders/datasets/movielens.py | 5 +---- tests/unit/recommenders/datasets/test_movielens.py | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/recommenders/datasets/movielens.py b/recommenders/datasets/movielens.py index b9319bdd0d..1c2d136309 100644 --- a/recommenders/datasets/movielens.py +++ b/recommenders/datasets/movielens.py @@ -598,13 +598,10 @@ class MockMovielensSchema(pa.SchemaModel): userID: Series[int] = Field(in_range={"min_value": 1, "max_value": 50}, alias=DEFAULT_USER_COL) itemID: Series[int] = Field(in_range={"min_value": 1, "max_value": 50}, alias=DEFAULT_ITEM_COL) rating: Series[float] = Field(in_range={"min_value": 1, "max_value": 5}, alias=DEFAULT_RATING_COL) - timestamp: Series[int] = Field(alias=DEFAULT_TIMESTAMP_COL) + timestamp: Series[int] = Field(in_range={"min_value": 0, "max_value": 1e9}, alias=DEFAULT_TIMESTAMP_COL) title: Series[str] = Field(eq="foo", alias=DEFAULT_TITLE_COL) genre: Series[str] = Field(eq="genreA|0", alias=DEFAULT_GENRE_COL) - class Config: - unique_columns = () - @classmethod def get_df( cls, diff --git a/tests/unit/recommenders/datasets/test_movielens.py b/tests/unit/recommenders/datasets/test_movielens.py index 67b5aebf96..81ba7e02ca 100644 --- a/tests/unit/recommenders/datasets/test_movielens.py +++ b/tests/unit/recommenders/datasets/test_movielens.py @@ -24,7 +24,7 @@ def test_mock_movielens_schema__has_default_col_names(size): assert col_name in df.columns -@pytest.mark.parametrize("keep_first_n_cols", [1, 2, 3, 4]) +@pytest.mark.parametrize("keep_first_n_cols", [2, 3, 4]) def test_mock_movielens_schema__get_df_remove_default_col__return_success( keep_first_n_cols, ): From 8f32dda71c99ee1c38651f4dcf6696f30ccca4d1 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Wed, 24 Nov 2021 17:26:18 +0000 Subject: [PATCH 50/60] Add blank line --- recommenders/datasets/movielens.py | 1 + 1 file changed, 1 insertion(+) diff --git a/recommenders/datasets/movielens.py b/recommenders/datasets/movielens.py index 1c2d136309..8ad6d314b6 100644 --- a/recommenders/datasets/movielens.py +++ b/recommenders/datasets/movielens.py @@ -581,6 +581,7 @@ def extract_movielens(size, rating_path, item_path, zip_path): def unique_columns(df, *, columns): return not df[columns].duplicated().any() + class MockMovielensSchema(pa.SchemaModel): """ Mock dataset schema to generate fake data for testing purpose. From 23ae6e0881f8d5ab1d8fd8b9b7a6f278930c28d3 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Fri, 26 Nov 2021 18:40:32 +0000 Subject: [PATCH 51/60] Move surprise to experimental --- pyproject.toml | 8 +++++++- setup.py | 16 ++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e1385c8be1..251c7b5aa8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,12 @@ [build-system] requires = [ "setuptools>=52", - "wheel>=0.36" + "wheel>=0.36", + "numpy>=1.15", +] +dependencies = [ + "setuptools>=52", + "wheel>=0.36", + "numpy>=1.15", ] build-backend = "setuptools.build_meta" diff --git a/setup.py b/setup.py index 6a40d86203..c456e35ec9 100644 --- a/setup.py +++ b/setup.py @@ -49,8 +49,6 @@ "pyyaml>=5.4.1,<6", "requests>=2.0.0,<3", "cornac>=1.1.2,<2", - # For Surprise, specify the tarball in order to avoid incompatibilities of compiled .pyx files with numpy versions < 1.20 - "scikit-surprise@https://files.pythonhosted.org/packages/97/37/5d334adaf5ddd65da99fc65f6507e0e4599d092ba048f4302fe8775619e8/scikit-surprise-1.1.1.tar.gz", "retrying>=1.3.3", "pandera[strategies]>=0.6.5", # For generating fake datasets ] @@ -81,10 +79,6 @@ "pyarrow>=0.12.1,<6.0.0", "pyspark>=2.4.5,<3.2.0", ], - "xlearn": [ - "cmake>=3.18.4.post1", - "xlearn==0.40a1", - ], "dev": [ "black>=18.6b4,<21", "pytest>=3.6.4", @@ -98,7 +92,16 @@ # the following dependencies need additional testing extras_require["experimental"] = [ + # xlearn requires cmake to be pre-installed + "xlearn==0.40a1", + # Surprise needs to be built from source because of the numpy <= 1.19 incompatibility + # Requires pip to be run with the --no-binary option + "scikit-surprise@https://github.com/NicolasHug/Surprise/archive/refs/tags/v1.1.1.tar.gz", + # VW C++ binary needs to be installed manually for some code to work "vowpalwabbit>=8.9.0,<9", +] +extras_require["nni"] = [ + # nni needs to be upgraded "nni==1.5", ] @@ -137,4 +140,5 @@ package_dir={"recommenders": "recommenders"}, python_requires=">=3.6, <3.9", # latest Databricks versions come with Python 3.8 installed packages=find_packages(where=".", exclude=["contrib", "docs", "examples", "scenarios", "tests", "tools"]), + setup_requires=["numpy>=1.15"] ) From 55a81997acba1c9829f3154abefce4dba5855f37 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Mon, 29 Nov 2021 18:59:40 +0000 Subject: [PATCH 52/60] Update tests and docs for experimental --- README.md | 2 +- SETUP.md | 2 +- docs/README.md | 6 ++-- recommenders/README.md | 28 +++++++++++-------- tests/README.md | 6 ---- .../examples/test_notebooks_python.py | 3 +- tests/smoke/examples/test_notebooks_python.py | 1 + tests/unit/examples/test_notebooks_python.py | 1 + .../models/test_surprise_utils.py | 2 ++ tools/docker/Dockerfile | 24 ++++++++-------- 10 files changed, 41 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index e93f4c5bad..f9fad2d13b 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ On Windows you will need [Microsoft C++ Build Tools](https://visualstudio.micros ```bash pip install --upgrade pip pip install --upgrade setuptools -pip install --no-cache --no-binary scikit-surprise recommenders[examples] +pip install recommenders[examples] ``` 4. Register your (conda or virtual) environment with Jupyter: diff --git a/SETUP.md b/SETUP.md index 16366d1804..07694b6d17 100644 --- a/SETUP.md +++ b/SETUP.md @@ -179,7 +179,7 @@ In the following `3.6` should be replaced with the Python version you are using export PYSPARK_DRIVER_PYTHON=/venv/bin/python export PYSPARK_PYTHON=/venv/bin/python - pip install --no-cache --no-binary scikit-surprise recommenders[all] + pip install recommenders[all] If you prefer to use [virtualenv](https://virtualenv.pypa.io/en/latest/index.html#) instead of venv, you may follow the above steps, except you will need to replace the line diff --git a/docs/README.md b/docs/README.md index 763bb71adb..024f6aabdd 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,9 +2,11 @@ To setup the documentation, first you need to install the dependencies of the full environment. For it please follow the [SETUP.md](../SETUP.md). Then type: - conda create -n reco_full -c conda-forge python=3.6 cudatoolkit=11.2 cudnn=8.1 + conda create -n reco_full -c conda-forge python=3.7 cudatoolkit=11.2 cudnn=8.1 conda activate reco_full - pip install --no-cache --no-binary scikit-surprise .[all] + + pip install numpy cython + pip install --no-binary scikit-surprise .[all,experimental] pip install sphinx_rtd_theme diff --git a/recommenders/README.md b/recommenders/README.md index 5ab17b2b35..df64ff94c2 100644 --- a/recommenders/README.md +++ b/recommenders/README.md @@ -19,8 +19,8 @@ For more details about the software requirements that must be pre-installed on e To install core utilities, CPU-based algorithms, and dependencies ```bash -pip install --upgrade pip -pip install --no-cache --no-binary scikit-surprise recommenders +pip install --upgrade pip setuptools +pip install recommenders ``` ## Optional Dependencies @@ -30,19 +30,20 @@ By default `recommenders` does not install all dependencies used throughout the - examples: dependencies related to Jupyter needed to run [example notebooks](https://github.com/microsoft/recommenders/tree/main/examples) - gpu: dependencies to enable GPU functionality (PyTorch & TensorFlow) - spark: dependencies to enable Apache Spark functionality used in dataset, splitting, evaluation and certain algorithms -- xlearn: xLearn package (on some platforms it requires pre-installation of cmake) +- dev: dependencies such as `black` and `pytest` required only for development or testing - all: all of the above dependencies - experimental: current experimental dependencies that are being evaluated (e.g. libraries that require advanced build requirements or might conflict with libraries from other options) +- nni: dependencies for NNI tuning framework. -Note that, currently, NNI and Vowpal Wabbit are in the experimental group. +Note that, currently, xLearn, Surprise and Vowpal Wabbit are in the experimental group. These groups can be installed alone or in combination: ```bash # install recommenders with core requirements and support for CPU-based recommender algorithms and notebooks -pip install --no-cache --no-binary scikit-surprise recommenders[examples] +pip install recommenders[examples] # add support for running example notebooks and GPU functionality -pip install --no-cache --no-binary scikit-surprise recommenders[examples,gpu] +pip install recommenders[examples,gpu] ``` ## GPU Support @@ -57,14 +58,19 @@ For manual installation of the necessary requirements see [TensorFlow](https://w When installing with GPU support you will need to point to the PyTorch index to ensure you are downloading a version of PyTorch compiled with CUDA support. This can be done using the --find-links or -f option below. -`pip install --no-cache --no-binary scikit-surprise recommenders[gpu] -f https://download.pytorch.org/whl/cu111/torch_stable.html` +`pip install recommenders[gpu] -f https://download.pytorch.org/whl/cu111/torch_stable.html` ## Experimental dependencies We are currently evaluating inclusion of the following dependencies: + - scikit-surprise: due to incompatibilities with `numpy <= 1.19`, proper installation of Surprise requires `pip install numpy cython` and `pip install --no-binary scikit-surprise recommenders[experimental]` - vowpalwabbit: current examples show how to use vowpal wabbit after it has been installed on the command line; using the [PyPI package](https://pypi.org/project/vowpalwabbit/) with the scikit-learn interface will facilitate easier integration into python environments - - nni: a more recent version can be installed but is untested (and requires a higher numpy version). + - xlearn: on some platforms, xLearn requires pre-installation of cmake. + +## NNI dependencies + +For NNI a more recent version can be installed but is untested. ## Installing the utilities from a local copy @@ -74,12 +80,12 @@ a [setup.py](../setup.py) file is provided in order to simplify the installation This still requires an environment to be installed as described in the [setup guide](../SETUP.md). Once the necessary dependencies are installed, you can use the following command to install `recommenders` as a python package. - pip install --no-cache --no-binary scikit-surprise -e . + pip install -e . It is also possible to install directly from GitHub. Or from a specific branch as well. - pip install --no-cache --no-binary scikit-surprise -e git+https://github.com/microsoft/recommenders/#egg=pkg - pip install --no-cache --no-binary scikit-surprise -e git+https://github.com/microsoft/recommenders/@staging#egg=pkg + pip install -e git+https://github.com/microsoft/recommenders/#egg=pkg + pip install -e git+https://github.com/microsoft/recommenders/@staging#egg=pkg **NOTE** - The pip installation does not install all of the pre-requisites; it is assumed that the environment has already been set up according to the [setup guide](../SETUP.md), for the utilities to be used. diff --git a/tests/README.md b/tests/README.md index e6a5cab670..66dabe73a2 100644 --- a/tests/README.md +++ b/tests/README.md @@ -138,12 +138,6 @@ Several of the tests are skipped for various reasons which are noted below. Linux NNI pip package has installation incompatibilities - -integration/examples/test_notebooks_python -test_xlearn* -Linux -xLearn pip package has installation incompatibilities - In order to skip a test because there is an OS or upstream issue which cannot be resolved you can use pytest [annotations](https://docs.pytest.org/en/latest/skipping.html). diff --git a/tests/integration/examples/test_notebooks_python.py b/tests/integration/examples/test_notebooks_python.py index 671aa241fb..0bf3fbbdb1 100644 --- a/tests/integration/examples/test_notebooks_python.py +++ b/tests/integration/examples/test_notebooks_python.py @@ -91,6 +91,7 @@ def test_baseline_deep_dive_integration( assert results[key] == pytest.approx(value, rel=TOL, abs=ABS_TOL) +@pytest.mark.experimental @pytest.mark.integration @pytest.mark.parametrize( "size, expected_values", @@ -251,7 +252,7 @@ def test_geoimc_integration(notebooks, output_notebook, kernel_name, expected_va @pytest.mark.integration -@pytest.mark.skip(reason="xLearn pip package has installation incompatibilities") +@pytest.mark.experimental def test_xlearn_fm_integration(notebooks, output_notebook, kernel_name): notebook_path = notebooks["xlearn_fm_deep_dive"] pm.execute_notebook( diff --git a/tests/smoke/examples/test_notebooks_python.py b/tests/smoke/examples/test_notebooks_python.py index 1ca1b51bba..2fa4c56564 100644 --- a/tests/smoke/examples/test_notebooks_python.py +++ b/tests/smoke/examples/test_notebooks_python.py @@ -56,6 +56,7 @@ def test_baseline_deep_dive_smoke(notebooks, output_notebook, kernel_name): assert results["recall"] == pytest.approx(0.108826, rel=TOL, abs=ABS_TOL) +@pytest.mark.experimental @pytest.mark.smoke def test_surprise_svd_smoke(notebooks, output_notebook, kernel_name): notebook_path = notebooks["surprise_svd_deep_dive"] diff --git a/tests/unit/examples/test_notebooks_python.py b/tests/unit/examples/test_notebooks_python.py index adf18cfec3..e80bd2b224 100644 --- a/tests/unit/examples/test_notebooks_python.py +++ b/tests/unit/examples/test_notebooks_python.py @@ -49,6 +49,7 @@ def test_baseline_deep_dive_runs(notebooks, output_notebook, kernel_name): pm.execute_notebook(notebook_path, output_notebook, kernel_name=kernel_name) +@pytest.mark.experimental @pytest.mark.notebooks def test_surprise_deep_dive_runs(notebooks, output_notebook, kernel_name): notebook_path = notebooks["surprise_svd_deep_dive"] diff --git a/tests/unit/recommenders/models/test_surprise_utils.py b/tests/unit/recommenders/models/test_surprise_utils.py index a6951f9ee8..b7643fa946 100644 --- a/tests/unit/recommenders/models/test_surprise_utils.py +++ b/tests/unit/recommenders/models/test_surprise_utils.py @@ -50,6 +50,7 @@ def rating_true(): ) +@pytest.mark.experimental def test_predict(rating_true): svd = surprise.SVD() train_set = surprise.Dataset.load_from_df( @@ -84,6 +85,7 @@ def test_predict(rating_true): ].values == pytest.approx(svd.predict(user, item).est, rel=TOL) +@pytest.mark.experimental def test_recommend_k_items(rating_true): n_users = len(rating_true["userID"].unique()) n_items = len(rating_true["itemID"].unique()) diff --git a/tools/docker/Dockerfile b/tools/docker/Dockerfile index f46cf9bbe0..11fb8852e0 100644 --- a/tools/docker/Dockerfile +++ b/tools/docker/Dockerfile @@ -17,9 +17,9 @@ WORKDIR ${HOME} RUN if [ "${VIRTUAL_ENV}" != "conda" ] && [ "${VIRTUAL_ENV}" != "venv" ] && [ "${VIRTUAL_ENV}" != "virtualenv" ]; then \ echo 'VIRTUAL_ENV argument should be either "conda", "venv" or "virtualenv"'; exit 1; fi -# Install base dependencies, cmake (for xlearn) and libpython (for cornac) +# Install base dependencies and libpython (for cornac) RUN apt-get update && \ - apt-get install -y curl build-essential cmake + apt-get install -y curl build-essential RUN if [ "${VIRTUAL_ENV}" = "conda" ] ; then apt-get install -y libpython3.7; fi RUN if [ "${VIRTUAL_ENV}" = "venv" ] || [ "${VIRTUAL_ENV}" = "virtualenv" ]; then apt-get install -y libpython3.7; fi @@ -61,8 +61,8 @@ RUN if [ "${VIRTUAL_ENV}" = "virtualenv" ] ; then python3.7 -m virtualenv $HOME/ FROM base AS cpu RUN if [ "${VIRTUAL_ENV}" = "venv" ] || [ "${VIRTUAL_ENV}" = "virtualenv" ]; then source $HOME/${VIRTUAL_ENV}/bin/activate; \ - pip install --no-cache --no-binary scikit-surprise recommenders[xlearn,examples]; fi -RUN if [ "${VIRTUAL_ENV}" = "conda" ] ; then pip install --no-cache --no-binary scikit-surprise recommenders[xlearn,examples]; fi + pip install recommenders[examples]; fi +RUN if [ "${VIRTUAL_ENV}" = "conda" ] ; then pip install recommenders[examples]; fi ############### @@ -80,8 +80,8 @@ ENV JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64" \ # Install dependencies in virtual environment RUN if [ "${VIRTUAL_ENV}" = "venv" ] || [ "${VIRTUAL_ENV}" = "virtualenv" ]; then source $HOME/${VIRTUAL_ENV}/bin/activate; \ - pip install --no-cache --no-binary scikit-surprise recommenders[spark,xlearn,examples]; fi -RUN if [ "${VIRTUAL_ENV}" = "conda" ] ; then pip install --no-cache --no-binary scikit-surprise recommenders[spark,xlearn,examples]; fi + pip install recommenders[spark,examples]; fi +RUN if [ "${VIRTUAL_ENV}" = "conda" ] ; then pip install recommenders[spark,examples]; fi ########### @@ -99,7 +99,7 @@ RUN if [ "${VIRTUAL_ENV}" != "conda" ] && [ "${VIRTUAL_ENV}" != "venv" ] && [ "$ echo 'VIRTUAL_ENV argument should be either "conda", "venv" or "virtualenv"'; exit 1; fi RUN apt-get update && \ - apt-get install -y curl build-essential cmake + apt-get install -y curl build-essential RUN if [ "${VIRTUAL_ENV}" = "conda" ] ; then apt-get install -y libpython3.7; fi RUN if [ "${VIRTUAL_ENV}" = "venv" ] || [ "${VIRTUAL_ENV}" = "virtualenv" ]; then apt-get install -y libpython3.7; fi @@ -129,15 +129,15 @@ RUN if [ "${VIRTUAL_ENV}" = "venv" ] ; then python3.7 -m venv --system-site-pack source $HOME/${VIRTUAL_ENV}/bin/activate; \ pip install --upgrade pip; \ pip install --upgrade setuptools; \ - pip install --no-cache --no-binary scikit-surprise recommenders[gpu,xlearn,examples]; fi + pip install recommenders[gpu,examples]; fi RUN if [ "${VIRTUAL_ENV}" = "virtualenv" ] ; then python3.7 -m virtualenv $HOME/${VIRTUAL_ENV}; \ source $HOME/${VIRTUAL_ENV}/bin/activate; \ pip install --upgrade pip; \ pip install --upgrade setuptools; \ - pip install --no-cache --no-binary scikit-surprise recommenders[gpu,xlearn,examples]; fi + pip install recommenders[gpu,examples]; fi RUN if [ "${VIRTUAL_ENV}" = "conda" ] ; then \ - pip install --no-cache --no-binary scikit-surprise recommenders[gpu,xlearn,examples] -f https://download.pytorch.org/whl/cu111/torch_stable.html ; fi + pip install recommenders[gpu,examples] -f https://download.pytorch.org/whl/cu111/torch_stable.html ; fi ############ @@ -160,8 +160,8 @@ ENV JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64" \ # Install dependencies in virtual environment RUN if [ "${VIRTUAL_ENV}" = "venv" ] || [ "${VIRTUAL_ENV}" = "virtualenv" ]; then source $HOME/${VIRTUAL_ENV}/bin/activate; \ - pip install --no-cache --no-binary scikit-surprise recommenders[all]; fi -RUN if [ "${VIRTUAL_ENV}" = "conda" ] ; then pip install --no-cache --no-binary scikit-surprise recommenders[all]; fi + pip install recommenders[all]; fi +RUN if [ "${VIRTUAL_ENV}" = "conda" ] ; then pip install recommenders[all]; fi ############# From 383c47550df63ea2df284b9fd6d7fac915cf94b2 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 30 Nov 2021 09:52:20 +0000 Subject: [PATCH 53/60] Update CI tests --- tests/ci/azure_pipeline_test/dsvm_linux_template.yml | 2 ++ .../azure_pipeline_test/dsvm_nightly_linux_cpu.yml | 2 +- .../azure_pipeline_test/dsvm_nightly_linux_gpu.yml | 2 +- .../azure_pipeline_test/dsvm_notebook_linux_cpu.yml | 2 +- .../azure_pipeline_test/dsvm_notebook_linux_gpu.yml | 2 +- tests/ci/azure_pipeline_test/dsvm_unit_linux_cpu.yml | 2 +- tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml | 2 +- tests/ci/azure_pipeline_test/release_pipeline.yml | 12 ++++++------ 8 files changed, 14 insertions(+), 12 deletions(-) diff --git a/tests/ci/azure_pipeline_test/dsvm_linux_template.yml b/tests/ci/azure_pipeline_test/dsvm_linux_template.yml index d8bb531129..6aecf7e720 100644 --- a/tests/ci/azure_pipeline_test/dsvm_linux_template.yml +++ b/tests/ci/azure_pipeline_test/dsvm_linux_template.yml @@ -64,6 +64,8 @@ jobs: python setup.py sdist bdist_wheel --plat-name=$PLATFORM || exit -1 + pip install numpy cython + echo " --- INSTALLING WHEEL ---" pip install dist/recommenders-$RELEASE_VERSION-py3-none-$PLATFORM.whl${{ parameters.pip_opts }} || exit -1 else diff --git a/tests/ci/azure_pipeline_test/dsvm_nightly_linux_cpu.yml b/tests/ci/azure_pipeline_test/dsvm_nightly_linux_cpu.yml index 15b237650a..4657e373c9 100644 --- a/tests/ci/azure_pipeline_test/dsvm_nightly_linux_cpu.yml +++ b/tests/ci/azure_pipeline_test/dsvm_nightly_linux_cpu.yml @@ -33,6 +33,6 @@ extends: timeout: 180 conda_env: "nightly_linux_cpu" conda_opts: "python=3.6" - pip_opts: "[examples,dev]" + pip_opts: "[examples,dev,experimental] --no-cache --no-binary scikit-surprise" pytest_markers: "not spark and not gpu" pytest_params: "-x" diff --git a/tests/ci/azure_pipeline_test/dsvm_nightly_linux_gpu.yml b/tests/ci/azure_pipeline_test/dsvm_nightly_linux_gpu.yml index 9aca9929bb..cf63be8dfb 100644 --- a/tests/ci/azure_pipeline_test/dsvm_nightly_linux_gpu.yml +++ b/tests/ci/azure_pipeline_test/dsvm_nightly_linux_gpu.yml @@ -32,6 +32,6 @@ extends: timeout: 240 conda_env: "nightly_linux_gpu" conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" - pip_opts: "[gpu,examples,dev] --no-cache --no-binary scikit-surprise -f https://download.pytorch.org/whl/cu111/torch_stable.html" + pip_opts: "[gpu,examples,dev] -f https://download.pytorch.org/whl/cu111/torch_stable.html" pytest_markers: "not spark and gpu" pytest_params: "-x" diff --git a/tests/ci/azure_pipeline_test/dsvm_notebook_linux_cpu.yml b/tests/ci/azure_pipeline_test/dsvm_notebook_linux_cpu.yml index 93eaeacc84..0ea6cefeda 100644 --- a/tests/ci/azure_pipeline_test/dsvm_notebook_linux_cpu.yml +++ b/tests/ci/azure_pipeline_test/dsvm_notebook_linux_cpu.yml @@ -60,5 +60,5 @@ extends: task_name: "Test - Unit Notebook Linux CPU" conda_env: "unit_notebook_linux_cpu" conda_opts: "python=3.6" - pip_opts: "[examples,dev]" + pip_opts: "[examples,dev,experimental] --no-cache --no-binary scikit-surprise" pytest_markers: "notebooks and not spark and not gpu" diff --git a/tests/ci/azure_pipeline_test/dsvm_notebook_linux_gpu.yml b/tests/ci/azure_pipeline_test/dsvm_notebook_linux_gpu.yml index 54a8f38558..18d337b7b4 100644 --- a/tests/ci/azure_pipeline_test/dsvm_notebook_linux_gpu.yml +++ b/tests/ci/azure_pipeline_test/dsvm_notebook_linux_gpu.yml @@ -60,5 +60,5 @@ extends: task_name: "Test - Unit Notebook Linux GPU" conda_env: "unit_notebook_linux_gpu" conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" - pip_opts: "[gpu,examples,dev] --no-cache --no-binary scikit-surprise -f https://download.pytorch.org/whl/cu111/torch_stable.html" + pip_opts: "[gpu,examples,dev] -f https://download.pytorch.org/whl/cu111/torch_stable.html" pytest_markers: "notebooks and not spark and gpu" diff --git a/tests/ci/azure_pipeline_test/dsvm_unit_linux_cpu.yml b/tests/ci/azure_pipeline_test/dsvm_unit_linux_cpu.yml index 26ed5bdf2f..9d7ea00a3e 100644 --- a/tests/ci/azure_pipeline_test/dsvm_unit_linux_cpu.yml +++ b/tests/ci/azure_pipeline_test/dsvm_unit_linux_cpu.yml @@ -60,5 +60,5 @@ extends: task_name: "Test - Unit Linux CPU" conda_env: "unit_linux_cpu" conda_opts: "python=3.6" - pip_opts: "[dev]" + pip_opts: "[dev,experimental] --no-cache --no-binary scikit-surprise" pytest_markers: "not notebooks and not spark and not gpu" diff --git a/tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml b/tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml index 349d371d51..70f51cc683 100644 --- a/tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml +++ b/tests/ci/azure_pipeline_test/dsvm_unit_linux_gpu.yml @@ -60,5 +60,5 @@ extends: task_name: "Test - Unit Linux GPU" conda_env: "unit_linux_gpu" conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" - pip_opts: "[gpu,dev] --no-cache --no-binary scikit-surprise -f https://download.pytorch.org/whl/cu111/torch_stable.html" + pip_opts: "[gpu,dev] -f https://download.pytorch.org/whl/cu111/torch_stable.html" pytest_markers: "not notebooks and not spark and gpu" diff --git a/tests/ci/azure_pipeline_test/release_pipeline.yml b/tests/ci/azure_pipeline_test/release_pipeline.yml index e64f41e89a..8c7040f9ea 100644 --- a/tests/ci/azure_pipeline_test/release_pipeline.yml +++ b/tests/ci/azure_pipeline_test/release_pipeline.yml @@ -23,7 +23,7 @@ jobs: task_name: "Test - Unit Linux CPU" conda_env: "release_unit_linux_cpu" conda_opts: "python=3.6" - pip_opts: "" + pip_opts: "[experimental] --no-cache --no-binary scikit-surprise" pytest_markers: "not notebooks and not spark and not gpu" install: "release" package: "publish" @@ -35,7 +35,7 @@ jobs: task_name: "Test - Unit Notebook Linux CPU" conda_env: "release_unit_notebook_linux_cpu" conda_opts: "python=3.6" - pip_opts: "[examples]" + pip_opts: "[experimental,examples] --no-cache --no-binary scikit-surprise" pytest_markers: "notebooks and not spark and not gpu" install: "release" @@ -46,7 +46,7 @@ jobs: task_name: "Test - Unit Linux GPU" conda_env: "release_unit_linux_gpu" conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" - pip_opts: "[gpu] --no-cache --no-binary scikit-surprise -f https://download.pytorch.org/whl/cu111/torch_stable.html" + pip_opts: "[gpu] -f https://download.pytorch.org/whl/cu111/torch_stable.html" pytest_markers: "not notebooks and not spark and gpu" install: "release" @@ -57,7 +57,7 @@ jobs: task_name: "Test - Unit Notebook Linux GPU" conda_env: "release_unit_notebook_linux_gpu" conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" - pip_opts: "[gpu,examples] --no-cache --no-binary scikit-surprise -f https://download.pytorch.org/whl/cu111/torch_stable.html" + pip_opts: "[gpu,examples] -f https://download.pytorch.org/whl/cu111/torch_stable.html" pytest_markers: "notebooks and not spark and gpu" install: "release" @@ -93,7 +93,7 @@ jobs: timeout: 180 conda_env: "release_nightly_linux_cpu" conda_opts: "python=3.6" - pip_opts: "[examples]" + pip_opts: "[experimental,examples] --no-cache --no-binary scikit-surprise" pytest_markers: "not spark and not gpu" install: "release" @@ -106,7 +106,7 @@ jobs: timeout: 240 conda_env: "release_nightly_linux_gpu" conda_opts: "python=3.6 -c conda-forge cudatoolkit=11.2 cudnn=8.1" - pip_opts: "[gpu,examples] --no-cache --no-binary scikit-surprise -f https://download.pytorch.org/whl/cu111/torch_stable.html" + pip_opts: "[gpu,examples] -f https://download.pytorch.org/whl/cu111/torch_stable.html" pytest_markers: "not spark and gpu" install: "release" From 5c18fb63c5347afbfa422ed27723e80682b3bacd Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 30 Nov 2021 14:03:14 +0000 Subject: [PATCH 54/60] Update GitHb actions --- .github/workflows/actions/run-tests/action.yml | 1 + .github/workflows/nightly.yml | 3 +++ .github/workflows/pr-gate.yml | 3 +++ tox.ini | 5 +++-- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/actions/run-tests/action.yml b/.github/workflows/actions/run-tests/action.yml index 86b791fd99..7171a859e3 100644 --- a/.github/workflows/actions/run-tests/action.yml +++ b/.github/workflows/actions/run-tests/action.yml @@ -43,6 +43,7 @@ runs: shell: bash run: | python -m pip install --upgrade pip setuptools wheel + python -m pip install numpy cython pip install tox - name: Run ${{ inputs.test-kind }} tests ('${{ inputs.test-marker }}') diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 188614f06c..6afe77cc00 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -109,6 +109,9 @@ jobs: # https://docs.github.com/en/actions/creating-actions/about-actions#choosing-a-location-for-your-action # but there is some working insights from this discussion: # https://github.community/t/path-to-action-in-the-same-repository-as-workflow/16952/2 + - name: Install dependencies (numpy, cython) + run: | + python -m pip install numpy cython - name: Run ${{ matrix.test-kind }} tests ('${{ matrix.test-marker }}') uses: ./.github/workflows/actions/run-tests with: diff --git a/.github/workflows/pr-gate.yml b/.github/workflows/pr-gate.yml index 110112e796..a247ceedc6 100644 --- a/.github/workflows/pr-gate.yml +++ b/.github/workflows/pr-gate.yml @@ -99,6 +99,9 @@ jobs: uses: actions/setup-python@v2 with: python-version: ${{ matrix.python }} + - name: Install dependencies (numpy, cython) + run: | + python -m pip install numpy cython # There are little documentation on how to call **local** actions # https://docs.github.com/en/actions/creating-actions/about-actions#choosing-a-location-for-your-action # but there is some working insights from this discussion: diff --git a/tox.ini b/tox.ini index f90f21c951..d81cb982f2 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,6 @@ [tox] # py will use whatever the basepython `python` maps to from PATH -# you can use py38, for example, to chosse a different version +# you can use py38, for example, to choose a different version # See https://tox.readthedocs.io/en/latest/config.html#tox-environments envlist = py, cpu, gpu, spark, all @@ -23,7 +23,7 @@ commands = # with this dependency subset, we should be able to run the test markers: # 1. "not notebooks and not spark and not gpu" (tests for general sdk utilities) # 2. "notebooks and not spark and not gpu" (tests for notebook example without extra dependencies) -extras = dev,examples +extras = dev,examples,experimental [testenv:gpu] # with this dependency subset, we should be able to run the test markers: @@ -66,6 +66,7 @@ markers = gpu: mark a test as gpu test spark: mark a test as spark test vw: mark a test as vowpal wabbit test + experimental: scikit-surprise and xlearn testpaths = tests addopts = From dfc8eac2a981612f6c03d4dff62b9a6ec3a20f83 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 30 Nov 2021 15:19:52 +0000 Subject: [PATCH 55/60] No binary option in tox.ini --- tox.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/tox.ini b/tox.ini index d81cb982f2..51ec770225 100644 --- a/tox.ini +++ b/tox.ini @@ -24,6 +24,7 @@ commands = # 1. "not notebooks and not spark and not gpu" (tests for general sdk utilities) # 2. "notebooks and not spark and not gpu" (tests for notebook example without extra dependencies) extras = dev,examples,experimental +install_command = pip install --no-cache --no-binary scikit-surprise {opts} {packages} [testenv:gpu] # with this dependency subset, we should be able to run the test markers: From 1dc5d5c0d25b3cb9e5ec55bcc8e56c6d651987fa Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 30 Nov 2021 16:07:35 +0000 Subject: [PATCH 56/60] Remove experimental from GitHub actions --- .github/workflows/actions/run-tests/action.yml | 1 - .github/workflows/nightly.yml | 3 --- .github/workflows/pr-gate.yml | 3 --- tox.ini | 6 ++---- 4 files changed, 2 insertions(+), 11 deletions(-) diff --git a/.github/workflows/actions/run-tests/action.yml b/.github/workflows/actions/run-tests/action.yml index 7171a859e3..86b791fd99 100644 --- a/.github/workflows/actions/run-tests/action.yml +++ b/.github/workflows/actions/run-tests/action.yml @@ -43,7 +43,6 @@ runs: shell: bash run: | python -m pip install --upgrade pip setuptools wheel - python -m pip install numpy cython pip install tox - name: Run ${{ inputs.test-kind }} tests ('${{ inputs.test-marker }}') diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 6afe77cc00..188614f06c 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -109,9 +109,6 @@ jobs: # https://docs.github.com/en/actions/creating-actions/about-actions#choosing-a-location-for-your-action # but there is some working insights from this discussion: # https://github.community/t/path-to-action-in-the-same-repository-as-workflow/16952/2 - - name: Install dependencies (numpy, cython) - run: | - python -m pip install numpy cython - name: Run ${{ matrix.test-kind }} tests ('${{ matrix.test-marker }}') uses: ./.github/workflows/actions/run-tests with: diff --git a/.github/workflows/pr-gate.yml b/.github/workflows/pr-gate.yml index a247ceedc6..110112e796 100644 --- a/.github/workflows/pr-gate.yml +++ b/.github/workflows/pr-gate.yml @@ -99,9 +99,6 @@ jobs: uses: actions/setup-python@v2 with: python-version: ${{ matrix.python }} - - name: Install dependencies (numpy, cython) - run: | - python -m pip install numpy cython # There are little documentation on how to call **local** actions # https://docs.github.com/en/actions/creating-actions/about-actions#choosing-a-location-for-your-action # but there is some working insights from this discussion: diff --git a/tox.ini b/tox.ini index 51ec770225..f90f21c951 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,6 @@ [tox] # py will use whatever the basepython `python` maps to from PATH -# you can use py38, for example, to choose a different version +# you can use py38, for example, to chosse a different version # See https://tox.readthedocs.io/en/latest/config.html#tox-environments envlist = py, cpu, gpu, spark, all @@ -23,8 +23,7 @@ commands = # with this dependency subset, we should be able to run the test markers: # 1. "not notebooks and not spark and not gpu" (tests for general sdk utilities) # 2. "notebooks and not spark and not gpu" (tests for notebook example without extra dependencies) -extras = dev,examples,experimental -install_command = pip install --no-cache --no-binary scikit-surprise {opts} {packages} +extras = dev,examples [testenv:gpu] # with this dependency subset, we should be able to run the test markers: @@ -67,7 +66,6 @@ markers = gpu: mark a test as gpu test spark: mark a test as spark test vw: mark a test as vowpal wabbit test - experimental: scikit-surprise and xlearn testpaths = tests addopts = From 292f13932ceab5554e96efa663d181b69783c7ce Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 30 Nov 2021 16:24:12 +0000 Subject: [PATCH 57/60] Disable experimental tests from workflow --- .github/workflows/nightly.yml | 6 +++--- .github/workflows/pr-gate.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 188614f06c..73f7814b5b 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -96,7 +96,7 @@ jobs: - os: [self-hosted, Linux, nightly] python: 3.7 test-kind: 'integration' - test-marker: 'not spark and not gpu' + test-marker: 'not spark and not gpu and not experimental' steps: - uses: actions/checkout@v2 @@ -146,7 +146,7 @@ jobs: java: 11 python: 3.7 test-kind: 'integration' - test-marker: 'spark and not gpu' + test-marker: 'spark and not gpu and not experimental' steps: - uses: actions/checkout@v2 @@ -188,7 +188,7 @@ jobs: # different kinds of tests are located in tests/ folders test-kind: ['unit', 'smoke', 'integration'] # pytest markers configured in tox.ini. See https://docs.pytest.org/en/6.2.x/example/markers.html - test-marker: ['gpu and not spark'] + test-marker: ['gpu and not spark and not experimental'] steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/pr-gate.yml b/.github/workflows/pr-gate.yml index 110112e796..18aa465964 100644 --- a/.github/workflows/pr-gate.yml +++ b/.github/workflows/pr-gate.yml @@ -90,7 +90,7 @@ jobs: # different kinds of tests are located in tests/ folders test-kind: ['unit'] # pytest markers configured in tox.ini. See https://docs.pytest.org/en/6.2.x/example/markers.html - test-marker: ['not gpu and not spark and not notebooks', 'notebooks and not gpu and not spark'] + test-marker: ['not gpu and not spark and not notebooks and not experimental', 'notebooks and not gpu and not spark and not experimental'] steps: - uses: actions/checkout@v2 @@ -132,7 +132,7 @@ jobs: # different kinds of tests are located in tests/ folders test-kind: ['unit'] # pytest markers configured in tox.ini. See https://docs.pytest.org/en/6.2.x/example/markers.html - test-marker: ['notebooks and spark and not gpu', 'spark and not notebooks and not gpu'] + test-marker: ['notebooks and spark and not gpu and not experimental', 'spark and not notebooks and not gpu and not experimental'] steps: - uses: actions/checkout@v2 @@ -174,7 +174,7 @@ jobs: # different kinds of tests are located in tests/ folders test-kind: ['unit'] # pytest markers configured in tox.ini. See https://docs.pytest.org/en/6.2.x/example/markers.html - test-marker: ['gpu and notebooks and not spark', 'gpu and not notebooks and not spark'] + test-marker: ['gpu and notebooks and not spark and not experimental', 'gpu and not notebooks and not spark and not experimental'] steps: - uses: actions/checkout@v2 From 2bce47ae2063f46103a1e0a27be61e296d77e041 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 30 Nov 2021 16:42:18 +0000 Subject: [PATCH 58/60] Wrap surprise import in test --- .../models/test_surprise_utils.py | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/tests/unit/recommenders/models/test_surprise_utils.py b/tests/unit/recommenders/models/test_surprise_utils.py index b7643fa946..879104f7a0 100644 --- a/tests/unit/recommenders/models/test_surprise_utils.py +++ b/tests/unit/recommenders/models/test_surprise_utils.py @@ -2,20 +2,22 @@ # Licensed under the MIT License. -import pandas as pd -import pytest -import surprise - -from recommenders.utils.constants import ( - DEFAULT_USER_COL, - DEFAULT_ITEM_COL, - DEFAULT_RATING_COL, -) -from recommenders.models.surprise.surprise_utils import ( - predict, - compute_ranking_predictions, -) - +try: + import pandas as pd + import pytest + import surprise + + from recommenders.utils.constants import ( + DEFAULT_USER_COL, + DEFAULT_ITEM_COL, + DEFAULT_RATING_COL, + ) + from recommenders.models.surprise.surprise_utils import ( + predict, + compute_ranking_predictions, + ) +except: + pass # skip if experimental not installed TOL = 0.001 From 2eb8f9324670fde2e49dac5b61b62a103d9e5f18 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Tue, 30 Nov 2021 17:18:14 +0000 Subject: [PATCH 59/60] Fix bug in tf_utils --- recommenders/utils/tf_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/recommenders/utils/tf_utils.py b/recommenders/utils/tf_utils.py index 618bbc05b9..78b8a887e3 100644 --- a/recommenders/utils/tf_utils.py +++ b/recommenders/utils/tf_utils.py @@ -88,7 +88,7 @@ def pandas_input_fn( for col in X_df.columns: values = X_df[col].values if isinstance(values[0], (list, np.ndarray)): - values = np.array(values.to_list(), dtype=np.float32) + values = np.array(values.tolist(), dtype=np.float32) X[col] = values return lambda: _dataset( From bfbb4b0c7510f776c6de5bc999322813a3f702f3 Mon Sep 17 00:00:00 2001 From: Andreas Argyriou Date: Mon, 6 Dec 2021 13:52:29 +0000 Subject: [PATCH 60/60] Ignore coverage errors while reading from source files --- .github/workflows/actions/merge-cov/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/actions/merge-cov/action.yml b/.github/workflows/actions/merge-cov/action.yml index f70f753b57..89c90c57ce 100644 --- a/.github/workflows/actions/merge-cov/action.yml +++ b/.github/workflows/actions/merge-cov/action.yml @@ -36,7 +36,7 @@ runs: run: | python -m coverage combine .coverage* python -m coverage report - python -m coverage xml + python -m coverage xml -i - name: Show merged report id: show-final-report