{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### NLPExplainer for sentiment analysis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The class `NLPExplainer` is designed for NLP tasks, acting as a factory of the supported NLP explainers such as integrated-gradient and LIME. `NLPExplainer` provides a unified easy-to-use interface for all the supported explainers. Because the supported NLP explainers in the current version are limited, one can either use `NLPExplainer` or a specific explainer in the package `omnixai.explainers.nlp` to generate explanations." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# This default renderer is used for sphinx docs only. Please delete this cell in IPython.\n", "import plotly.io as pio\n", "pio.renderers.default = \"png\"" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import transformers\n", "from omnixai.data.text import Text\n", "from omnixai.explainers.nlp import NLPExplainer\n", "from omnixai.visualization.dashboard import Dashboard" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this example, we consider a sentiment analysis task. The test input is an instance of `Text`." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "x = Text([\n", " \"What a great movie!\",\n", " \"The Interview was neither that funny nor that witty. \"\n", " \"Even if there are words like funny and witty, the overall structure is a negative type.\"\n", "])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The model considered here is a transformer model. Similar to `TabularExplainer`, to initialize `NLPExplainer`, we need to set the following parameters:\n", "\n", " - `explainers`: The names of the explainers to apply, e.g., [\"shap\", \"lime\"].\n", " - `model`: The ML model to explain, e.g., a scikit-learn model, a tensorflow model, a pytorch model or a black-box prediction function.\n", " - `preprocess`: The preprocessing function converting the raw data (a `Text` instance) into the inputs of model.\n", " - `postprocess`: The postprocessing function transforming the outputs of model to a user-specific form, e.g., the predicted probability for each class.\n", " - `mode`: The task type, e.g., \"classification\", \"regression\" or \"qa\".\n", " \n", "The preprocessing function takes a `Text` instance as its input and outputs the processed features that the ML model consumes. In this example, the `Text` object is converted into a batch of strings.\n", "\n", "The postprocessing function converts the outputs into class probabilities." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# The preprocessing function\n", "preprocess = lambda x: x.values\n", "# A transformer model for sentiment analysis\n", "model = transformers.pipeline(\n", " 'sentiment-analysis',\n", " model='distilbert-base-uncased-finetuned-sst-2-english',\n", " return_all_scores=True\n", ")\n", "# The postprocessing function\n", "postprocess = lambda outputs: np.array([[s[\"score\"] for s in ss] for ss in outputs])\n", "\n", "# Initialize a NLPExplainer\n", "explainer = NLPExplainer(\n", " explainers=[\"shap\", \"lime\", \"polyjuice\"],\n", " mode=\"classification\",\n", " model=model,\n", " preprocess=preprocess,\n", " postprocess=postprocess\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There is no \"global explanation\" for `NLPExplainer` currently. One can simply call explainer.explain to generate local explanations for NLP tasks." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/248 [00:00Instance 0: Class POSITIVE\n", "
What a great movie !

\n", "
Instance 1: Class NEGATIVE
\n", "
The Interview was neither that funny nor that witty . Even if there are words like funny and witty , the overall structure is a negative type .

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "LIME results:\n" ] }, { "data": { "text/html": [ "
Instance 0: Class 1
\n", "
great a movie What

\n", "
Instance 1: Class 0
\n", "
neither nor negative witty is if funny a the type

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Counterfactual results:\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAArwAAAEECAYAAADKy+fGAAAgAElEQVR4Xu3deVyN2R8H8E+IsSvGMrayy76OwZA1pKw/ZBchW2VP9i1bZEuEsi9jS3Y1dgpRlrFm341tLCNtv9c5M91XUtdI9+kun+efoe7znHPe53R9+t7zPGP0S4NBceBBAQpQgAKKCGTMkE628yk6VpH22AgFKEABCgBGDLxcBhSgAAWUE2DgVc6aLVGAAhSIF2Dg5VqgAAUooKAAA6+C2GyKAhSgwL8CDLxcChSgAAUUFGDgVRCbTVGAAhRg4OUaoAAFKKC8AAOv8uZskQIUoAArvFwDFKAABRQUYOBVEJtNUYACFGCFl2uAAhSggPICDLzKm7NFClCAAqzwcg1QgAIUUFCAgVdBbDZFAQpQgBVergEKUIACygsw8CpvzhYpQAEKsMLLNUABClBAQQEGXgWx2RQFKEABVni5BihAAQooL8DAq7w5W6QABSjACi/XAAUoQAEFBRh4FcRmUxSgAAVY4eUaoAAFKKC8AAOv8uZskQIUoAArvFwDFKAABRQU0ETgzZY1Mw4EzELImStwGeWldjTf8trEF3Ia2A4d21nCYaAHLl+5o6Aam6IABSjwfQIaCbxFCufFr3UqYt3GwO/rHQBj4wzoZtcE23cew6vX7777erwABShAgbQUYOBNS322TQEKGKqARgKvy6D2aNq4Opq3Hv3drvV/rQT3SX3Q1X46bt15/N3X4wUoQAEKpKWAtgTeUyF/YJjrkm+iYIX3m7j4YgpQQIsEUj3wdvpfAwzs1xrp06WTwzwffhMDXeYjZ46sGDrkf/i5ellEfvqEXXuCsXzVHtSoVhqeswbiTOg1OI1YhFo1LTB3hiOCT/+BtRsDMX1iH+TIkUVFVrvhYC3iY1coQAEKfJuAEoE3Q4b0GDW0k3y/zZ49C+7eewrPxVsQdiEC8VsaTp+9ik+folC9amm5PWHitFV48fIv+d5t36M5Wlj9jCyZMyH4zBXMmb8Zb99+AAPvt801X00BCmiPQKoH3l9+tsAE1x4wzpgBC5dsx58v3uD4yYuYPa0fav1sAe/lAcifzxTtWv2KmXM3wH/XSUwe1wuNG1SF64Tl6N/bRn6/c69pyJb1B4xw6YTyFmbwXb0Pz1+8wY6A49qjx55QgAIU+EYBJQKv6NKMyQ549PgFXrz6C727N8f7Dx9h095NFXjFaw4GnUWWLD+gzi/lEXjoHMZP8YXd/xpisGMb7Np7ChG3H2OAgy0OHw3DhGmrGHi/ca75cgpQQHsEUj3wiqFt2zAJmTNnUm1pyJr1BxwMmI2z569j+OglgJER/DdPwZWrdzF09BLkNs2BDavGImNGY2Q0zgCvZf6yuiuOsaO6ykoDtzRoz6JhTyhAgZQLKBV4E/ZQFBxEqG3WehRiY+LkDW637zxBF/tpMDIyws7fpsr37MbWw+G3bBSKFs4H67auiI6OkQWJn2uURYPmQxl4Uz7tPJMCFEhjAUUCr1nR/Fjv6/bFUCNuPUK3Pu6fBduYmFi0aDMab9/9zcCbxouDzVOAAqkvoETgzZM7p6zSik/HsmXLgsw/ZITY5tCy3Rh8+hQtA2/8NjIxwhVew1G2TFFYWrlg+6YpMMmV7YuBW7UaBfvuzfmUhtRfErwiBSiggIBGAu+WdRPlvjEr25FyCPEVXrF/bPHSHaphfYz8BBF6ixbJh9U+o/Hu3d8wMcmOTVsPY/7irfJ1Y0Z0QcvmtdDdYQZuRjxUgIRNUIACFNCcgBKBd9zobmjetKZ8Hz1+6hJGunSS90skDLwPHj5Hh26TkS6dEQJ+myY/YWtiM0JWeAv9lEc+3iw2Nk4FcfXaPQxybMPAq7mlwStTgAIaFNBI4PVe4IKK5Yth5+6TeP36HbxXBMj9ZHVql8emLYfw+MlLFCyQB39cvSP3jS2e54TKFYujz0APOA1oi3IWZugzYA6uXb+PvvYt0bOrFULOXsHTp6+wYMl2fPjwUYMkvDQFKEABzQkoEXinjrdHQ8sq2LztsHwP7tHFCpkyGX8WeCMjo+RzezNmzCBvFt4feAaTpq9Gh7aWcB7UDoePhSP03DVZhDCCEXz8dnNLg+aWBa9MAQpoWEAjgVdUElyHd4GpaXacDL6MMROWI3u2zPLpDbVrlUOO7Fnw+OlLzF3wG/L+aAK3kV2w98BpTJmxBmVKFcGKJcNx7cZ9GXrFR3Pukx1QothPePrsFXr2m8XAq+FFwctTgAKaE1Ai8JYsXhCTxvbETz/lQVj4TXnT2cihnT4LvPO9tsGidBH5zPQLl25hkvtqvHr1VlZ8O3doBFvr2siX1wRv3rzHxi2HsH5zEAOv5pYFr0wBCmhYQCOBV8N95uUpQAEK6KyAJgKvzmKw4xSgAAUUEmDgVQiazVCAAhQQAgy8XAcUoAAFlBdg4FXenC1SgAIGLMDAa8CTz6FTgAJpJsDAm2b0bJgCFDBEAQZeQ5x1jpkCFEhrAQbetJ4Btk8BChiUAAOvQU03B0sBCmiJAAOvlkwEu0EBChiGAAOvYcwzR0kBCmiXAAOvds0He0MBCui5AAOvnk8wh0cBCmilAAOvVk4LO0UBCuirAAOvvs4sx0UBCmizAAOvNs8O+0YBCuidAAOv3k0pB0QBCuiAAAOvDkwSu0gBCuiPAAOv/swlR0IBCuiOAAOv7swVe0oBCuiBAAOvHkwih0ABCuicAAOvzk0ZO0wBCuiyAAOvLs8e+04BCuiqAAOvrs4c+00BCuikAAOvTk4bO00BCui4gFG9xoPjdHwM7D4FKEABnREwMjKSfY2L41uvzkwaO0oBCui8gNGbN3/xXVfnp5EDoAAFKEABClCAAhRITsDoz5evGXi5PihAAQooJGCcPp1sKSomVqEW2QwFKEABChg9/5OBl8uAAhSggFICGY3/Cbyfohh4lTJnOxSgAAUYeLkGKEABCigowMCrIDabogAFKPCvAAMvlwIFKEABBQUYeBXEZlMUoAAFGHi5BihAAQooL8DAq7w5W6QABSjACi/XAAUoQAEFBRh4FcRmUxSgAAVY4eUaoAAFKKC8AAOv8uZskQIUoAArvFwDFKAABRQUYOBVEJtNUYACFGCFl2uAAhSggPICDLzKm7NFClCAAqzwcg1QgAIUUFCAgVdBbDZFAQpQgBVergEKUIACygsw8CpvzhYpQAEKsMLLNUABClBAQQEGXgWx2RQFKEABbanwFiqYDw8ePuWEUIACFDAIAQZeg5hmDpICFNAygVSv8Hbs0A6dO3dFq9Zt5FBv3LiO2r/UxNFjJ1G2rIX8WnDwKYwaORxHjp5ASgPvzZs3EBMTg9Kly2gZ6efdSct+xsXFoWaNKjhx8jQyZsyYrFNISDC6dbXD9Ru3tdqSnaOAPghoMvAePLAf/fo5wH/nblSoUEEfuDgGClCAAqkikOqBd8ECTzx88AAzZ82RHVzqvQRLly5Bz172GDLEWX7Nc54Hnj1/junTZ6Q48E6aOB5VqlaDrW2rVIHQ1EXSup9Hjx5BvXr11Q7v0qWL6NrFDmHhlzTFwOtSgAL/Cmgq8HotXoT9B/bhw/v3mDtvAQMvVxwFKECBBAKpHnjPnQuFs9NgWdEVh6j4Nm9hja1btyAgYI/qaz162qNFC2uYmxXG1KnTMX/+XERGfkJLG1tMm+YuX/fy5UsMHNgfN29cR1RUNHrZ94aTkwu2bd0CV9eRyJEjB3LmzIWlS5ejeIkSqmEld17imQ8NPYvx49xkpTgs7DyyZs2GUaNGo2q16li9yhc/FSyEFcuXYcKEyejarTsCDx7AlCmT8PffH1Cn7q+YMWM2MmXKlOJ+zp8/D69fvcLt27fw/PlziIrsxElTMHfuHLx7905218dnBQoU+En+WVRvpk6djLdv38Lc3BxzPDzlf+v9Whue8xeiatVq8nXhYWFwdOyLk6dOf/YLxa2ICDi7DMGTx49QuHARLFi4GAULFsKtW7fQtUsn+XoeFKCAZgU0FXiPHz+GGjVqon37Npg+fSYDr2ankVenAAV0TCDVA68Ij6VKFsPZ0DBkzpwZ1apVQljYJVSrWgnHjp9CtmzZULqU+H44cuXKhcKF8qN3bwdMmDgZHz58gFXTRpgzZy5q/VIbsbGxOH06BLVq/YJnz56h9i81EBwSijx58sCxf18ZpJOq8Ko7L+H81K9XB4sWe8t/GFas8MHNmzfh7j4TZ8+eQZfOHeHg0A/OLsOQIUMGPHz4ANYtmmHX7r0yJA4eNAClSpeWVeuU9lME3rVrVuHQ4WPIli07Ro8aAX//7Th+IgS5c+fGXI/ZMviOnzAJd+/eha1NC+zw3yVDbkDATsyZPVOeu0AE59evZVgWx9Qpk6T9sOEjVYFX9NGyfl15rcaNm2D9urXYuXMHNm7agqdPn8rAezDwkI4tX3aXAronoKnAGy/R0roZ3GfMZuDVvaXBHlOAAhoUSPXAK/rauXNHdOvWHZky/YA1q/3g67dGBsRGjRrDzNwcw4Y5IyjoiByW2MMbGhqOfPnzy78PH+aCKlWqokvXbl8M27qFFdzdZ6FipUpqA2/iExOel/B7ZkUL4c7dB/JLIuTOmumOzb9tk3/ubd9TfsRvZGQkvy+2Ztx/cA9Tp/5TfT5x4jhmzJiuqlonvO5/7acIvE8eP4b7jFnydBFCDx85hGXLVsi/i4ry+vVrsdJ3NZZ4LcaDhw9U1W/x/fjAnj17drRra4vQcxfkeTVrVsXGDb+hWPHiqsB78eJFDBkyAIcOHZOviY6ORtEiP+HO3YeIjPyILl3s4O+/S4NLjZemAAWEAAMv1wEFKEAB5QU0EnjFXrJnz/558kKxYsXRvUdP+O/YjsDAgyhXrjweP36ESZOnyu+LwHv/wRNVsBRVzjJly6JnT3vcuXMH8+bNweNHj+T3xXaJ37ZsR+XKVdQGXnXnJSQWFc8ZM2fLCrIIn6Ka6uY2TgbeyZMnYufO3aqXT5wwDps2bUCuXCbyazGxMTDJZYL9B4JS3E/R5sePHzFqlKu85oYN6xF69gzmeMyTfw8KCsQqP1+sXrMO48e74ccf82LwYCdVnzp1bC+r402aWqGZVWMZnDNkMMZQlyGqam38TYFiO4SDg71qe4S4yOvXr3D4yAn8+OOP6Na1M9at36j8CmSLFDAwAQZeA5twDpcCFNAKAY0E3gvh4Rg33g0x0dHwXuqDQoUK482bN2jerAnKWljArlNnNG7SVBV4Ez6WLGHgbdK4Afr1d0T79h3kaxs3spRhUATeAY790Kx5iyS3NKg7L6G6eDpBzx5dUbFiJRnMx46bgKxZs8rAK/bqJqx4ei/xkiFebAlIfKS0nyLwRkZGYuTI0V8NvIsWLcDjx4+TrPCKLRnLli6RWxMyGBsjV85ccBww8DPfixcuYPhwFxnQkzpWr/KTv5jwoAAFNCvAwKtZX16dAhSgQFICGgm8Yr9o9WqVYWJqotq6IBq3sWmB27duITjkjNyzKo7EjyVLGHirVK6AFSv95M1YwadOypsxdu3eJwOvm5srcpuaYuiwEV+MS915CV88Zsxo/PJLbdjY2H52jaQC74MH92FrY431GzahTJmysjIrAmbRokWR0n5+S+C9ffs2Wrdqie3bd8qtCrt2BWDmjOny0W7p0qWTfflf+zZInyE91q/fpKrkxvuKvdWNGtaXXmLfs7hBLiLiJkqUKCn3By9fvhRTpkznTwkFKKBhAQZeDQPz8hSgAAWSENBI4BXtdO/WBUWKFlHteRVf8/Sci31792Df/kBVV9QFXvE0BvFUAnGjm7j7+NOnT+jdx0EGXvF82x7du8onLPgs9/3sBg115yU0EI9HE/twxdMZfsj8g9zasGDBYly58scXFV5x3pEjhzFx4jg8e/oUGTNmwogRo9C5S1f51IiU9PNbAq9of9++PZg8aSL+/vtvmJmZwcPDU4bf+KNd21aIjon5rDKd0FeE5tGjhuPy5cuIi4uFtbUNZs32kBXtAQP6ISQkVLW1hD8tFKCAZgQYeDXjyqtSgAIUUCegscCr7exiT+uaNavhtcRbVpvfv38PZ+fBsKzfIMkb5rR9POwfBSigGwKaDry6ocBeUoACFFBWwGADr9iT++DhfVUFWjwSrbNdB/kYMkvLBsrOAlujAAUMRoCB12CmmgOlAAW0SMBgA+/bt3/J/0HGrdu3YJzBWE5Jx0528qkHPChAAQpoSoCBV1OyvC4FKECB5AUMNvByUVCAAhRICwEG3rRQZ5sUoIChCzDwGvoK4PgpQAFFBRh4FeVmYxSgAAWkAAMvFwIFKEABBQUYeBXEZlMUoAAF/hVg4OVSoAAFKKCgAAOvgthsigIUoAADL9cABShAAeUFGHiVN2eLFKAABVjh5RqgAAUooKAAA6+C2GyKAhSgACu8XAMUoAAFlBdg4FXenC1SgAIUYIWXa4ACFKCAggIMvApisykKUIACrPByDVCAAhRQXoCBV3lztkgBClCAFV6uAQpQgAIKCjDwKojNpihAAQrEV3hfvX4TRw0KUIACFFBGIJ2RkWwoNo5vvcqIsxUKUIACgFFcHN91uRAoQAEKUIACFKAABfRXwOhTVAzLDPo7vxwZBSigZQLGGdLJHkVFx2pZz9gdClCAAvorYPTxUzQDr/7OL0dGAQpomUAm4/SyR5FRMVrWM3aHAhSggP4KMPDq79xyZBSggBYKMPBq4aSwSxSggN4LMPDq/RRzgBSggDYJMPBq02ywLxSggKEIMPAaykxznBSggFYIMPBqxTSwExSggIEJMPAa2IRzuBSgQNoKMPCmrT9bpwAFDFOAgdcw552jpgAF0kiAgTeN4NksBShg0AIMvAY9/Rw8BSigtAADr9LibI8CFKAAwMDLVUABClBAQQEGXgWx2RQFKECBfwUYeLkUKEABCigowMCrIDabogAFKMDAyzVAAQpQQHkBBl7lzdkiBShAAVZ4uQYoQAEKKCjAwKsgNpuiAAUokNYVXpuWLTBixCjUq19f7yZD3dhCQoIxzs0NBwKD9G7cHBAFKPB1AQberxvxFRSgAAVSWyDNKrwpDbzXr11DTEwMylpYpNgiMjIShw8dglWzZim+RuITO9t1xKDBQ1C7dh3oWuCNi4uDRdnSCL9wCRkzZkzW5OTJE2jftg0ePXmWam68EAUMTUBTgffs2TPo5+CAJ08eo0LFivD1W40CBQoYGi/HSwEKUCBJAZ0LvGNcR6N69Rpo265diqd039692LdvLzznL0jxNRKfeObMaZQpUxbZs2f/J/COHIV69b6sXmtrhffQ77+jQcOGaj0uXAhHuzatcSPidqq58UIUMDQBTQReUQQoX64s5s9fiKZWVli8aCF+/z0IW7ftMDRejpcCFKCAMoG3mVUTuVWhUePG+PjxI37Knxfey3zQoUNH2YEihX7CubAL6NWzO5o2tYKfry/evHmNcuXLw2/VGpiYmMjXDXVxlqE0OioKNWrUhN/qNdi2bSuGOjshR86cMMllglWr16BkqVKfDSyp84yNjVWvuXTpIjrbdcKrly9RuHAROLm4oGPHThAheKzbGHz4+wPq17eUYThTpkyYPWsmcuTIgcDAgzhy+DCOnzgFf/8dX3xt2DAX1RYNEXhr1foFW377De/evZXXW7BoMbJkyYLEgTe5dhMOSvTh1atXiIi4iWdPn0FUZN1nzsQM9+l49/adfOnqtetQsGBB+ee9e/Zg3Fg3vH37F4oVL47Fi5fI/1arUhney5ZJT3GcOxeKXj17yMpuzuxZ8ebte/n1mzduwLF/Pzx89BBFixbFMp8VKFy4MCJu3kTbtq3l63lQgAIpE9BE4BW/cI8YNgyHjx6TnYqNjYVZkUK4ePkKcubMmbKO8iwKUIACeiSQ6hXe6dOmIjo6GuMnTMSB/ftl8CpfvjxW+Prh2tWr6NLZDmfPnZdV0MiPkdi2wx9Zs2ZFX4c+MDc3xxi3sZL31KmTqmDWtHEjuV1AVHV79egOG9tWyVZ4kzsv4Zz5rlyB8PBwVYX3/v37aGhZD0GHjshg59DbHmXKlsXwESNl4BXVEhH6ROVEHEl9LeE2BvFnYbBtu78Mzf379UWhQoWkScLAq67dxIF35coVOH0mVFaQnZ2GYOuW33A+/CLy5MkD9+nT8O7dO0yb7o47t2+jcaMGOHAwSIbc7du2YdrUKTh9NlT2+/Xr13CfMVNeXsxN5syZpXl84BX/UNaoVhXT3WfILR+r/HyxdesW7AzYjSdPnsgK74lTwXr0I8ChUEBZAU0E3g0b1uP3oCD4LF+hGky9unUw19NTfiLGgwIUoIChC6R64D1+/BimTJ6E/QcC4eLshBo1a2LCuLG4fvMWVq5YjsuXL2PuPE8ZeLt26y6rq+LYvHkT9u3Zg5V+q76Ykwnjx8HU1BROzi5fDbwJT054nrrAu3DBfNy7dw+z53jIlx09cgSTJ01E4O+HZEi8fOmSrDDHH0l9LXHgTTi28PAw9LG3x5nQc58FXnXtJg68jx49wjzP+fLLIoQGBQbKqq44RJV41SpfbNi4GfM950EE6Tkec1WXqF61Clb4+iJH9hxo1qwprl2/Kb9XzqIM/P0DUKJkSVXgFX3t26cPQs6cla8Rwd00Vw68ePVGVuxF4OUNd4b+tsHxf4+AJgKveG8NCwvDgoWLVF1r2qQR3NzGob6l5fd0l+dSgAIU0AuBVA+8nz59QjGzIrhz7wGqVK4otwDYdeqAyVOmwmvRIrRq3QatWreWgXf48JGqN+NtW7di+7atWLNuPT58+CA/rg8NPYt06dIhIiICDg594TJ0mNrAq+48dYHXdfQorF2zGiampvJlYj+cqYkpjp04KQOvCHrjxk/4LPAm/lriwOvsPFRu6xCHCKu//FwDd+8//Czwqms3ceBN2N6a1asQEhKCRYu95MtEJd3HZyl+27INo0aOQN68eTFs+AjVJWxtrOHoOBDNW7RAfNVHbPMY0L+/qlobX+EV2yG6drFDwUKFVOeL7R9nQs/L67Zv10ZWrnlQgAIpE9BE4N24cQP2790L31WrVZ2qVbMGFi5erPqkLGW95VkUoAAF9EMg1QOvYBH7eHv2spcVXfHR+oL5nvIj91Wr/HAq+LSs1iZ+kkHCwCuCoHi9qGhmyJABo0eNRL58+WTgte/ZAy1tbJPc0qDuvITT5ee7UlZD4m9aE/17+vSp3BKQ+BCBVzzVYey48Z8F3sRfSxx4O3fpCju7zvKc8+fPyapp4gqvunYTB96E7akLvHM95siAnVSFt1Klyli0cIHcmiACb65cuWTVXBzxgTcs7DwGDxwow35Sx4rlPujdx0E/Vj9HQYE0ENBE4BXvMQMdHXEyOESOSHwyU+in/Pjj6nX5fsuDAhSggKELaCTwin28/jt2oJOdnQyp4lFi4kYxUa0Ve0nFoS7w9rHvJR87JqqUIrw1adwQffo4yGsNHzYUuXPnhusYty/mTt15CV+8098f3t5e2LN3v/yy2M7QpFEDbPffCQuLcrKi++TxY5iZm8sKb0oC78e/P2LHzgC5R1bsCS5qZvbFHl517aY08N6KiID4KHPf/oNyq8KO7dvl9gyxb1r4i7Br3byZ/EVC7J+Ov9EtPvCK6raoDAlfsWda3CB34/p1lCpdWu4P9vJajFmz5xj6zw3HT4EUC2gi8Iq995UrVYCHxzw0adpU3ncQELBTvg/woAAFKEABQCOB98SJ42jUwBJh4RflzV/iEM95bdHCWlV5VBd4xZMUenTrhqjoKJiZmcHSsgGMjIxU4blDh/Zy28Hadeshqpbxh7rzEk62CLBtWtvKpw6Mdh2DXva95Q0fokIsnmEpbjRzGzsOPXr2SlHgFVsIOtl1xsL58/Hnn8/l48kWLvZK8ikNybWb0sArztsVEAA3N1f8/eEDzIsVk09pEOE3/mjerCliomM+24ub8CkNIjQ7OQ3GpYsX5d3eYhuK2Bsobriz79UTly5fkfPBgwIU+HYBTQRe0YuLFy/IewXu378nH5G40tdP/tLOgwIUoAAFNBR4CUsBClCAAkkLaCrw0psCFKAABZIX0EiFl+AUoAAFKMDAyzVAAQpQQFsEGHi1ZSbYDwpQwCAEWOE1iGnmIClAAS0TYODVsglhdyhAAf0WYODV7/nl6ChAAe0UYODVznlhryhAAT0VYODV04nlsChAAa0WYODV6ulh5yhAAX0TYODVtxnleChAAV0QYODVhVliHylAAb0RYODVm6nkQChAAR0SYODVocliVylAAd0XYODV/TnkCChAAd0TYODVvTljjylAAR0WYODV4clj1ylAAZ0VYODV2aljxylAAV0UYODVxVljnylAAV0XYODV9Rlk/ylAAZ0SYODVqeliZylAAT0RYODVk4nkMChAAd0QYODVjXliLylAAf0SYODVr/nkaChAAS0XYODV8gli9yhAAb0UMIqKjonTy5FxUBSgAAW0UCBD+nSyV9ExsVrYO3aJAhSggH4KGL158xcDr37OLUdFAQpQgAIUoAAFKADA6OWrNwy8XAoUoAAFFBJIn85IthQTy7dehcjZDAUoQAEYPf/zNd91uRAoQAEKKCSQ0fifLQ2forilQSFyNkMBClCAgZdrgAIUoICSAgy8SmqzLQpQgAL/CLDCy5VAAQpQQEEBBl4FsdkUBShAgX8FGHi5FChAAQooKMDAqyA2m6IABSjAwMs1QAEKUEB5AQZe5c3ZIgUoQAFWeLkGKEABCigowMCrIDabogAFKMAKL9cABShAAeUFGHiVN2eLFKAABVjh5RqgAAUooKAAA6+C2GyKAhSgACu8XAMUoAAFlBdg4FXenC1SgAIUYIWXa4ACFKCAggIMvApisykKUIACrPByDVCAAhRQXoCBV3lztkgBClCAFV6uAQpQgAIKCjDwKojNpihAAQqkdYW3Y4d2GOLkgjp16io+GfPnz0NkZCRGjhz9XW3fuHEd9r164NjxU991HZ5MAQoYjgADrwuB4fgAACAASURBVOHMNUdKAQpoj0CaVXhTGnhv3ryBmJgYlC5dJsWK+hB4fXyW4sOHD3ByclHr0L5da1g1aw4Hh34p9uKJFKBA6gloKvCeP38OTkMG4enTJyhXrjyWLFmGfPnzp17HeSUKUIACOiygc4F30sTxqFK1GmxtW6WYXQTeT5GRGKHDFd779+8hOjoG5ubmah16dO8CK6vm6Nyla4q9eCIFKJB6ApoIvKIIUOvnapgxcw4aNWoMn2XeOHLkCNau25B6HeeVKEABCuiwQKoH3rZtbOVWBUvLBvj48SNKlyoGT8+FaNO2nWSyKFsSx44HY4BjXzRs2Bjr1q3BmzdvUNbCAt7ePsiVK5d8navrKAQFHkBUVDSqVqsmvxew0x+uriORI0cO5MyZC0uXLkfxEiU+40/qPGNj489eIwLv/Xv3cPXaVfnfomZmWLBgMczMzJJtW1wjOjoa48ePxb69e5DLJBc6dbTDmjWrk9zSUKVyBdj37oMTx4/h7t276NXLHpGfPiEw8CBev3qFzp27ol9/R9ne27d/YYzraJw6dQLp0qdH9+49MWjQEOzc6Y/169di48bfVP3v0rkTOnToiDt373y2LcPTcy42b9qImNgY9OntAIe+/eU5jv37wsqqGVq3aavDy5Rdp4D+CGgi8J47F4qxbq7Ys/eAhIqNjUX5cqURHHIWOXLk1B88joQCFKBACgVSPfB6zJmFqOhojB49BkFBgZg6dRIsypbDYi9viD2vfXr3wpGjJyC2NHyMjMS6dRuRNWtWOA0ZiKJFzTBs+Eg5lNOnQ1C1ajX559atWqJvP0dZ1RUBrnkL62QrvMmdl9BHBN5ly7yxf38gChUqjA0b1stgGRCwR23bq1b5Ysf2bdi4aQvSp0+Pvg72uHHjRpKBt1DBfJg8ZRrs7fvg6ZMnqFKlAlxchsmq8rt3b1GjehWcPnMO2bPngIvLEOTKmQvjJ0zC+/fv0LFDezleEVQrVbRAyOlz8hcBEYyrV6uM82GXILY0xO9D9t+xHb6+K2S/oqOj0LxZU8zzXIDq1Wtg+DAXeZ0mTa1SuER4GgUokJoCmgi8W7ZsxtEjh7FgoZeqq82sGsN9xixUqVI1NbvPa1GAAhTQSYFUD7zBp05i5kx3bN8RANfRI2V1dtrUKTgfdhFrVq/ClatX4O4+Uwbejh3t0LZdewm3fdtWHDx4AF5Lln4BOW3aFJiamMJxwMCvBt6EJyc8L3HgvXf3Ljzmesovx8XFoVRJc5w5G6aqMMe/PuE17Ow6oFu3HmjRwlp+++jRI3AbMzrZwHvh4hWYmprK11auVB5btm5HiRIl5d+bNmmI+QsWoWxZCxQzLyJ9cub8pxKza1eArNauXrMOgwY6ok7dX2Fn1xniH7WgwEAs8V6GhPuQu3frArvOndG8+T/9mjVrhqzwiF86xo93k1sa0uLmQJ38iWCnKaBhAU0EXvHeevHiBcya7aHqvSgUDB8xCnXr/qrhEfHyFKAABbRfINUD76dPn1CxQllcunwNdevUwoGDQfJJBm5jx8Nn2VJYt7SBtXVLGXgHD3FWvRmLj+8DAvzh47NS3ow1d+4chIedR7p06XD79i306GmPgQMHqw286s5LHHjfvXsHN7dxqi///HM1rF27AQULFkq27caNLOU/KPGV5ytX/kBfh97JBt77D57AyMhItlG1SkXs3XcQ+fLlk38X1ZfZc+bB3NwMFmVL4d79x6q+hIaexehRI3Aw8JCski9fvgwbNmyGCLbdunWX1dqEgbdJ4wZ48eIFMmXKJK8hKr/WLVtiypTp8pcPUeGtXLmK9q9G9pACBiCgicC7detvCDx4UP4yHH80bFgPc+bMU71fGQAth0gBClAgWYFUD7yiJbGPt0vXbrKiu8N/F7yXeMmP6sW2gcCgIzAxMZGBN+FjyRIG3okTxuH9+/fy47gMGTJgwvixyJsvnwy8Axz7oVnzFkluaVB3XuLAe+fObcybt0B+WVRDS5YwR+i5cHjO80i2bVHh7dXTHk2tmsnzTp08gZEjhycbeB88fKpqNrnAW758eZibFUZY+CVVdTlhhVfsGxbnil8cmjZpJPso9hMnDLzdunZGj5690Lhxky8m+uCB/ShfoQIKFPiJPwYUoIAWCGgi8F4ID8fQoU4IDDosRyjeN8qULi4/tRLvtzwoQAEKGLqARgKv2Me7a3cA2rfvIEOqeJRYb/ueslp76PAxaa4u8IqP8UuXKYPBg53w5Mlj2Npao0ePXvJabm6uyG1qiqHDRnwxd+rOSxx4vZcsxr79QShatCjWrlmNTZs3yj286q4h9snu37cXq9esl2MZOKA//vjj8ncF3goVKsDZebC8EW/SpKmqPbziMWLxN5qNHDEMr9+8RvZs2VXbMBIGXrGHd6XvCvj5rZH/uL18+VKG+Dx58mDx4oWoVq06atX6xdDXOsdPAa0Q0ETgFT/vdWr/jGnTZ6Bhw0byKQ179+7Btu07tWLM7AQFKECBtBbQSOANDj4Fm5bNceJkCEqVKi3HWLNGFTRp2gzTprl/NfCKENm/nwOioqJkIK37az25NSA+PPfo3lU+i9dnuS9EYIw/1J2XOPCK6x0+9Dvu3LmDgoUKYeFCL/mUBnXXEP0ZP85N/kMiAmrvPg5YsdwHR4+d/GIexU1r/6XCK/ovbmIbOWI4jh07isxZMqNr1+4y7MdvhxD7om1sWshqefxe3MTPEhZV9JUrfWR12sTEFIsWL5HbGET1V2xp6Nqte1qvNbZPAQoA0ETgFbCXL1/CoEGOePjggXzfXey1VL5/8qAABShAAUAjgZewFKAABSiQtICmAi+9KUABClAgeQEGXq4OClCAAgoKMPAqiM2mKEABCvwrwMDLpUABClBAQQEGXgWx2RQFKEABBl6uAQpQgALKCzDwKm/OFilAAQqwwss1QAEKUEBBAQZeBbHZFAUoQAFWeLkGKEABCigvwMCrvDlbpAAFKMAKL9cABShAAQUFGHgVxGZTFKAABVjh5RqgAAUooLwAA6/y5myRAhSgACu8XAMUoAAFFBRg4FUQm01RgAIUYIWXa4ACFKCA8gIMvMqbs0UKUIACrPByDVCAAhRQUICBV0FsNkUBClCAFV6uAQpQgALKCzDwKm/OFilAAQoYvXz1Jo4MFKAABSigjED6dEayoZhYvvUqI85WKEABCgBGb978xXddrgQKUIACFKAABShAAb0VMIqKjmHg1dvp5cAoQAFtE8iQPp3sUnRMrLZ1jf2hAAUooLcCRh8/RTPw6u30cmAUoIC2CWQyTi+7FBkVo21dY38oQAEK6K0AA6/eTi0HRgEKaKMAA682zgr7RAEK6LsAA6++zzDHRwEKaJUAA69WTQc7QwEKGIgAA6+BTDSHSQEKaIcAA692zAN7QQEKGJYAA69hzTdHSwEKpLEAA28aTwCbpwAFDFKAgdcgp52DpgAF0kqAgTet5NkuBShgyAIMvIY8+xw7BSiguAADr+LkbJACFKAAGHi5CChAAQooKMDAqyA2m6IABSjwrwADL5cCBShAAQUFGHgVxGZTFKAABRh4uQYoQAEKKC/AwKu8OVukAAUowAov1wAFKEABBQUYeBXEZlMUoAAFWOHlGqAABSigvAADr/LmbJECFKCAXlV4bVq2wIgRo1Cvfn3OLAUoQAGtFGDg1cppYacoQAE9F0j1wBsXFweLsqURfuESMmbMmCK+/Hnz4MKlP5A3b17479iBVq1bJ3md69euISYmBmUtLOT3Uxp4IyMjcfjQIVg1a5ai/qbGSerGmRrXT41rdLbriEGDh6B27TrJXm7RwgVYssQLL/78EyVKlITP8hWq+UmNPvAaFNB1AU0F3rNnz6CfgwOePHmMChUrwtdvNQoUKKDrXOw/BShAgVQRSPXAK3p16Pff0aBhwxR3MD4wv3//Hs2tmuJUyOkkrzXGdTSqV6+Btu3afVfg3bd3L/bt2wvP+QtS3OfvOfH169dqx/k9107Nc8+cOY0yZcoie/bsyV5WvMbMzBw//vgjVq/yw7ZtW7HDPyA1u8FrUUCnBTQReMUv/uXLlcX8+QvR1MoKixctxO+/B2Hrth06bcXOU4ACFEgtAY0E3pzZs+LN2/eIjo7GkMGDcPToEXyKjETFSpWwZet2hIQEY9bMGShUqDBu3ryBZ0+fYYizM7p16y7H1cyqiQxJrWxbIiQ4GBYW5eQ2hRkzZ6nGvWnTRgx1dkKOnDlhkssEq1avwdChzmja1Ap+vr548+Y1ypUvD79Va2BiYiLPG+riLINtdFQUatSoCb/Va3Dt2lV0tuuEVy9fonDhInBycUHHjp1U7YiKtbPTEFwID8e9e3fx+PFjmJmbIyz8Itq1bQ1n56FwHT0Kb9+9xZWr1/Hu3Ts4DR6E4JBgZMmcBR7z5qFevX+2WIgAOHeuB/7++2/ky5sPq9esRf4CBdSOM7nzRB8SHvGm+fMXQETETTx98hQzZ82WgfPG9et4+/Yt5njMVW33ENXxwYMH4s7t28iePQfcZ8xEk6ZN5VgLFy6MYcNHyMtHRUXBvGhhnAk9j74OvVVbRtSNM75fFy6Ew3nIEPx++EhqrVdehwI6L6CJwCt+0RwxbBgOHz0mfWJjY2FWpBAuXr6CnDlz6rwZB0ABClDgewU0Gnh379qFdevWYP2GTbKfIlyJoCbCmWW9X3Hk2HHUrPkznj17hsoVy+P23fvIlCkTzp0LRdWq1RBx8yb+174dzoWFJznOXj26w8a21WcV3siPkdi2wx9Zs2ZFX4c+MDc3xxi3sfL8U6dOyqArjqaNG8mP50V12HflCoSHhydZ4d2xfTvWr1+Lzb9txcePH1GlckUcPnIM+fLlk1soXr54KYNr8RIl5HVFwM+RIwemTpuOq1euwLpFM4RfvIxs2bLh4sULMuSLAO42xhWigi2qyl8bZ3LnJQ68DerXw+mzoShfvgK2bd0KsQXhQGCQDNwnThzH6JEjcezESbkNpGqVSnB3n4kW1tYyEItfMg4fPY4HD+5j+NChOHEqWF7+4IED8PCYjX37D362ZUTdOMV5Ymz/a98WvXs7oF379t+7Tnk+BfRGQBOBd8OG9fg9KEhuIYo/6tWtg7menvJTMB4UoAAFDF1Ao4H38uVLaN+uLby8vD/b4iACb/++fXE+/ILKv1LF8ti+3R/FihdXfe1rQTCpwNu1W3dVhXbz5k3Yt2cPVvqt+mKeJ4wfB1NTUzg5u6gNvDPcpyN9+vQYMXKUvIYIuW5jx6FWrV/kn9u0aQv73n1U1xf7j69cu6GqKotgLQK3ZYMGn/UhKDAQXl6L5EeOXxtnwhMTnpc48A7o3x+h58Pkl2/fuoUGlvVw594D+fcPHz6gZHFzPHz8FOfPn5N7/UQ4jj9E9Vv8ciB+CShTuiQOHAhEUTMzOPbvh5o1a6KXfe/PAq+6cYrKfovmVujWvYeqam/oP2gcPwXiBTQReFeuWI6wsDAsWLhIBd20SSO4uY1DfUtL4lOAAhQweAGNBl6he/LkCbhPn4bHjx6rPjYXgXfsmDE4GPS7agKqVq6EDRs3oXSZMt8VeIcPH6l6gxdVzu3btmLNuvUy8InwGhp6FunSpUNERAQcHPrCZegwtYFX3Ey2fPkybN+xU24L+LVubRw9dkKGZRF4E7Ynqpp5THOhZKlSqjG8e/sWHnM90aZtW4h/lHbs2A6xTeLVy1f4Me+P8rpfC7zJnZc48CY0vXvnDmxsrHHh4mX5MlGdLlq4IJ4+fwFReV+2zBv+O3epLjFn9iy8ePFCztFYtzFyfEOcnFGqRDGEng+XAT7+psBq1aurHaf4eHW5jw+WLvMx+B8wAlAgsYAmAu/GjRuwf+9e+K5arWquVs0aWLh4sepTLc4EBShAAUMW0HjgjccV2xRa29og7MIl3LhxHePc3OTH7fFHUoH3VkSErBAnt6XBvmcPtLSxTfamtYSBV+yzFftO53nOR4YMGTB61Ei5LUEEXj/flbI6ktRNayKc2tpY4/Wr18idJzeGDHFGw0aNZLeTeiqEqHxG3L4rt1QkPPbu2YMpkydh7/4Dck/dnt274eOzVAZedeNUd17iwJvQVF3gFXdzi2pwUhXewUOcIPbeDhowAJMmT8GiRQtUN74kHG9y4xR9evDgAd7+9RefzmDI7ywce7ICmgi84lObgY6OOBkcItsVn7IU+ik//rh6Xf7yyoMCFKCAoQtoNPDev38fWbJkQe7cuWXYrFa1Mk6cDJY3Vf2XwPvq1StYlCmFGxG35R7YxMfwYUPltV3HuCUZQBMG3j72vWQAEzdjPXr0CE0aN0SfPg4y8O7094e3txf27N3/RRvPnz9HyxbNEXLm7BffSyrwir2tP/zwA6ZNd4exsbEMs4UKF8bGDevlDWQi4Ipqa6+e3SEehyb+rm6c8U86SOq8lAZecUOL2EIybZo7bFu1Uu3hPXTkGIoUKSIvK34BsbCwgE2rVqotIgnHm9w4xaPoAg8elHPcr7+jof98cfwU+EJAE4FX/ExXrlQBHh7z5M2n4ikNAQE75d57HhSgAAUoAGg08IqbxPr1dZB3+osg5OTkLPe7ii0N/yXwigkSN3eJsGjVrDm8lnh/NmfiSQMdOrSXN2GtXbdefhSf8H88kTDwXrp0ET26dUNUdBTMzMxgadkARkZGMvCK4Nmmta3cWjDadYzcrxp/iI/5q1WpJLcziABboMBPmDhpsnw2cFKBVwR7UT3ev2+vvG7JkqWwc9duuY2hU8f/4caNG8ifLz8GDh6MDevXycCrbpzieurOi+9nYlN1FV5xjrAT+3Pv3LkNExNTGdATPod4+rSp8JgzG/cePFJVqxOON7lxisq2eBbvmdOnsWrNWv6MUYACiQQ0EXhFE+Lm1j729rh//558fOBKXz95kzAPClCAAhTQUODVJ9hf69TG9BkzULfurzK0io/7/9euraw686AABSjwrQKaCrzf2g++ngIUoIAhCWikwqtPgIULFsC5sAvyf6QgDvE/qZg5wx2HjhzVp2FyLBSggEICDLwKQbMZClCAAgkEGHi/shy2btkC8QQD8WgysU+uSNEimDFjFj8q5I8RBSiQIgEG3hSx8SQKUIAC3yXAwPtdfDyZAhSgwLcJMPB+mxdfTQEKUCA1BBh4U0OR16AABSjwHwUYeP8jFF9GAQpQIBUFGHhTEZOXogAFKPA1AQberwnx+xSgAAVSX4CBN/VNeUUKUIACyQow8HJxUIACFFBegIFXeXO2SAEKGLAAA68BTz6HTgEKpJkAA2+a0bNhClDAEAUYeA1x1jlmClAgrQUYeNN6Btg+BShgUAIMvAY13RwsBSigJQIMvFoyEewGBShgGAIMvIYxzxwlBSigXQIMvNo1H+wNBSig5wIMvHo+wRweBSiglQJGn6Ji4rSyZ+wUBShAAT0UMM6QTo4qKjpWD0fHIVGAAhTQTgGjuLg4Bl7tnBv2igIUoAAFKEABClAgFQSMXr1+w8CbCpC8BAUoQIH/IpDOyEi+LJa1hv/CxddQgAIUSBUBo+d/vmbgTRVKXoQCFKDA1wUyGv+zpeFTFLc0fF2Lr6AABSiQOgIMvKnjyKtQgAIU+E8CDLz/iYkvogAFKJCqAgy8qcrJi1GAAhRQL8DAyxVCAQpQQHkBBl7lzdkiBShgwAIMvAY8+Rw6BSiQZgIMvGlGz4YpQAFDFGDgNcRZ55gpQIG0FmDgTesZYPsUoIBBCTDwGtR0c7AUoICWCDDwaslEsBsUoIBhCDDwGsY8c5QUoIB2CTDwatd8sDcUoICeCzDw6vkEc3gUoIBWCjDwauW0sFMUoIC+CjDw6uvMclwUoIA2CzDwavPssG8UoIDeCTDw6t2UckAUoIAOCDDw6sAksYsUoID+CDDw6s9cciQUoIDuCDDw6s5csacUoIAeCDDw6sEkcggUoIDOCaRZ4O3YoR2GOLmgTp26iqPNnz8PkZGRGDlytOJts0EKUMCwBRh4DXv+OXoKUCBtBHQu8N68eQMxMTEoXbpMisXUBd4L4eGYMXM61q/flOLrp/aJcXFxqFmjCk6cPI2MGTMme/mQkGB062qH6zdup3YXeD0KUCCVBDQZeA8e2I9+/Rzgv3M3KlSokEo95mUoQAEK6L6AzgXeSRPHo0rVarC1bZVifRF4P0VGYkQSFd4PHz7gjz8uo3r1Gim+viZOPHr0COrVq6/20pcuXUTXLnYIC7+kiS7wmhSgQCoIaCrwei1ehP0H9uHD+/eYO28BA28qzBUvQQEK6I9Aqgfetm1s5VYFS8sG+PjxI0qXKgZPz4Vo07adVLMoWxLHjgdjgGNfNGzYGOvWrcGbN29Q1sIC3t4+yJUrl3ydq+soBAUeQFRUNKpWqya/F7DTH66uI5EjRw7kzJkLS5cuR/ESJT6bjaTOMzY2/uw1IvDev3cPV69dlf8tamaGBQsWw8zMDGfPnsGUKZPg779LnrN+3Vr4+a3E33//jatXryBfvvzw9VuNGjVqqq4prvf61Svcvn0Lz58/h6jITpw0BXPnzsG7d+/k63x8VqBAgZ/kn0UVZurUyXj79i3Mzc0xx8NT/rfer7XhOX8hqlatJl8XHhYGR8e+OHnqNAoVzIcHD5/Kr9+KiICzyxA8efwIhQsXwYKFi1GwYCHcunULXbt0kq/nQQEKaKeApgLv8ePH5PtS+/ZtMH36TAZe7Zx+9ooCFEgjgVQPvB5zZiEqOhqjR49BUFAgpk6dBIuy5bDYyxs3blxHn969cOToCYg9vB8jI7Fu3UZkzZoVTkMGomhRMwwbPlJSnD4dogp+rVu1RN9+jrKq69i/L5q3sE62wpvceQl9RUBdtswb+/cHolChwtiwYT3Wr1+LgIA9nwXeZ8+eoXmzxjh67JTsY2/7HmjTtj1atrT5IkCvXbMKhw4fQ7Zs2TF61Aj4+2/H8RMhyJ07N+Z6zJbBd/yESbh79y5sbVpgh/8uGXIDAnZizuyZ8twFIji/fi3DsjimTpmEzJkzS5P4wBsbGwvL+nXltRo3biID+c6dO7Bx0xY8ffpUBt6DgYfSaDmxWQpQ4GsCmgq88e22tG4G9xmzGXi/NhH8PgUoYFACqR54g0+dxMyZ7ti+IwCuo0fK6uy0qVNwPuwi1qxehStXr8DdfaYMvB072qFtu/YSfPu2rTh48AC8liz9YgKmTZsCUxNTOA4Y+NXAm/DkhOclDrz37t6Fx1xP+WVRkS1V0hxnzoZB7BGOr/CKPbEirG7avFW+TgRl8Vpn56FfBN4njx/DfcYs+XURQg8fOYRly1bIvwcePCAD9Urf1VjitRgPHj7AtGnuqmvUr1cHixZ7I3v27GjX1hah5y7I79WsWRUbN/yGYsWLqwLvxYsXMWTIABw6dEy+Jjo6GkWL/IQ7dx8iMvIjunSxU1WnDWolc7AU0BEBBl4dmSh2kwIU0CuBVA+8nz59QsUKZXHp8jXUrVMLBw4Gwb5XD7iNHQ+fZUth3dIG1tYtZeAdPMQZdev+KkF37vRHQIA/fHxWQuyjFdsBwsPOI126dHKrQI+e9hg4cLDawKvuvMSBV1Rc3dzGqb7888/VsHbtBrm9Ij7wiu0JjRtZ4vdDR2FiYoIuXTqhXz9HuV0j8fXE9o1Ro1zll0XFOPTsGczxmCf/Lirdq/x8sXrNOowf74Yff8yLwYOdVJfo1LE9evd2QJOmVmhm1VgG5wwZjDHUZYiqWhtf4RXbIRwc7FXbI8RFXr9+hcNHTuDHH39Et66dsW79Rr1apBwMBfRJgIFXn2aTY6EABXRFINUDrxi42MfbpWs3WdEVH917L/HC+/fvZJUzMOiIDI+JH0uWMPBOnDAO79+//zf4ZcCE8WORN18+GXgHOPZDs+YtktzSoO68xAH1zp3bmDdvgfyy2CZQsoQ5Qs+Ff1bhFd/z9Jwr+21uZo5GjRrLrRWJj8RPfVAXeBctWoDHjx8nWeEVd1UvW7pEbk3IYGyMXDlzyaq2OOID78ULFzB8uAv2HwhKco2tXuWH7j166sr6Yz8pYHACDLwGN+UcMAUooAUCGgm8Yh/vrt0BaN++gwypYptAb/ueslor9qqKQ13gHTTQEaXLlJFV0CdPHsPW1ho9evSS13Jzc0VuU1MMHTbiCz515yUOvN5LFmPf/iAULVoUa9esxqbNG7/YwyvOaWD5K7Zs3SH34iZ3fEvgvX37NsSe5O3bd8qtCrt2BWDmjOlyX7PwEWH3f+3bIH2G9PLRaPE3usUHXvFItkYN68vxiz3NYotFRMRNlChRUu4PXr58KaZMma4FS4tdoAAFkhJg4OW6oAAFKKC8gEYCb3DwKdi0bI4TJ0NQqlRpOSrxHNkmTZupKpvqAq94LFj/fg6IioqSgbTur/VgZGSkCs89uneVz+L1We772Y0Z6s5LHHjF9Q4f+h137txBwUKFsHCh1xdPaRCV3852HSDufs6U6Qf5dIhOdp1VWxfir/ktgVecs2/fHkyeNFE++UE8GcLDw1OG3/ijXdtWiI6J+WwvbsKnNIjQPHrUcFy+fBlxcbGwtrbBrNke8oa7AQP6ISQkVHrxoAAFtE+AgVf75oQ9ogAF9F9AI4FXX9jEFolcJiYyaItHm4k9vdYtmmLT5m3yCQs8KEABCnyrgKYD77f2h6+nAAUoYAgCDLxqZlncANa5Sxc0b24tX3Xv3j35SLHjJ07Jx4/xoAAFKPCtAgy83yrG11OAAhT4fgEGXjWGYovEqFEj8PHvv+X+2h/EM3GHjfjq//Hs+6eFV6AABfRVgIFXX2eW46IABbRZgIFXm2eHfaMABfROgIFX76aUA6IABXRAgIFXByaJXaQABfRHgIFXf+aSI6EABXRHgIFXd+aKPaUABfRAgIFXDyaRQ6AABXROgIFX56aMHaYABXRZgIFXl2ePfacABXRVgIFXV2eO/aYABXRSgIFXJ6eNnaYAU34RuQAAC7BJREFUBXRcgIFXxyeQ3acABXRLgIFXt+aLvaUABfRDgIFXP+aRo6AABXREgIFXRyaK3aQABfRKgIFXr6aTg6EABbRdgIFX22eI/aMABfRRgIFXH2eVY6IABbRWgIFXa6eGHaMABfRYwOjPl6/j9Hh8HBoFKEABrRIwTp9O9icqJlar+sXOUIACFNBnAaM3b/5i4NXnGebYKEABClCAAhSggIELGMXExDLwGvgi4PApQAHlBNKlM5KNxfKtVzl0tkQBChi8gNHHT9EMvAa/DAhAAQooJZDJOL1sKjIqRqkm2Q4FKEABgxdg4DX4JUAAClBASQEGXiW12RYFKECBfwQYeLkSKEABCigowMCrIDabogAFKPCvAAMvlwIFKEABBQUYeBXEZlMUoAAFGHi5BihAAQooL8DAq7w5W6QABSjACi/XAAUoQAEFBRh4FcRmUxSgAAVY4eUaoAAFKKC8AAOv8uZskQIUoAArvFwDFKAABRQUYOBVEJtNUYACFGCFl2uAAhSggPICDLzKm7NFClCAAqzwcg1QgAIUUFCAgVdBbDZFAQpQgBVergEKUIACygsw8CpvzhYpQAEKsMLLNUABClBAQQEGXgWx2RQFKECBtK7w2rRsgREjRqFe/fqcDApQgAIGI8DAazBTzYFSgAJaJJBmFd6UBt7r164hJiYGZS0stIjxy65ERkbi8KFDsGrWLE362dmuIwYNHoLateuobT971sw4FXIa5ctXSJN+slEKGJqAJgPv3j170KN7VxwM+h2VKlU2NFqOlwIUoECyAjoXeMe4jkb16jXQtl07rZ7WfXv3Yt++vfCcvyBN+nnmzGmUKVMW2bNnV9t+/rx5cCr4NMyLFUuTfrJRChiagKYCr+e8udizezfev38PL29vBl5DW1gcLwUooFYg1QNvM6smcqtCo8aN8fHjR/yUPy+8l/mgQ4eOsiNFCv2Ec2EX0KtndzRtagU/X1+8efMa5cqXh9+qNTAxMZGvG+riLANjdFQUatSoCb/Va7Bt21YMdXZCjpw5YZLLBKtWr0HJUqU+G2BS5xkbG3/2mmfPnqGvQ2+8/estLlwIx6dPn9CqVWusXrsOlSqWx5Qp0zDUxQn161tiha8fbt64Acf+/fDw0UMULVoUy3xWoHDhwsn289q1q+hs1wmvXr5E4cJF4OTigo4dO6n6EBISjFkzZyB//gKIiLiJp0+eYuas2XJ8N65fx9u3bzHHY65qu4eoag8ePBB3bt9G9uw54D5jJpo0bQpnpyGyH8OGj5DXjoqKgnnRwjgTel6OL37LyLt37+A0eBCCQ4KRJXMWeMybh3r1/tlKUty8KE4Gn0a+fPn4o0IBCiggoKnAe+TwYdT65RdYN28mf8ZZ4VVgMtkEBSigMwKpHninT5uK6OhojJ8wEQf278e4sW4oX768DI7Xrl5Fl852OHvuPMSWhsiPkdi2wx9Zs2ZFX4c+MDc3xxi3sRLv1KmTMuiKo2njRvLjeVHV7dWjO2xsWyVb4U3uvIQzIkKxaGvwECf88cdldO/aVfZJHHnzmMLKqhkWL/FGjhw5EBsbixrVqmK6+wy5PWGVny+2bt2CnQG71fbTd+UKhIeHJ1nhFYG3Qf16OH02VG4l2LZ1K8QWhAOBQTKInjhxHKNHjsSxEyfl9o2qVSrB3X0mWlhby0Asfqk4fPQ4Hjy4j+FDh+LEqWDZl4MHDsDDYzb27T8ofeMD75DBg+RYpk6bjqtXrsC6RTOEX7yMbNmyoWKFcrLCK+aABwUooHkBTQXe+J43tKyPefPnM/BqfirZAgUooEMCqR54jx8/himTJ2H/gUC4ODuhRs2amDBuLK7fvIWVK5bj8uXLmDvPUwayrt26qyqfmzdvwr49e7DSb9UXfBPGj4OpqSmcnF2+GngTnpzwvIRfb9HcChMmTsLPP9dShdxnf76Uf86ZPStCz4WhRMmS8u/h4WHo26cPQs6clX8XYd40Vw68ePUGiSvHCdv7WuAd0L8/Qs+HyWvevnULDSzr4c69B/LvHz58QMni5nj4+CnOnz+Hfg4OMhzHH/GBXfwSUKZ0SRw4EIiiZmayCl2zZk30su/9WeAV2xauXLuhqp6LXyDELxaWDRqgzi+1cPzkKRgZGenQsmVXKaC7Agy8ujt37DkFKKC7AqkeeMX2gGJmRWR4q1K5Io6fOAW7Th0wecpUeC1ahFat26BV69YykA0fPhL1LS2lnqhybt+2FWvWrZeBb4b7dISGnkW6dOkQEREBB4e+cBk6TG3gVXdewikaNtQFefLkgesYN4hqq6imHjpyVBV4X//1ThUAxU0gXbvYoWChQqpLiK0KYtuAqJom18+vBd6xY8bIG0vEcffOHdjYWOPCxcvy72IrSNHCBfH0+Qvs3rULy5Z5w3/nLlX7c2bPwosXL+TWhrFuY+QvA0OcnFGqRDGEng+XwTa+wlutenXkMc312daPd2/fwmOuJ9q0bYtWti0/u7buLmX2nAK6IcDAqxvzxF5SgAL6JZDqgVfwiI/ce/aylxXdAweDsGC+J8Q+0lWr/OTH5yKgJX5KQ8LA6zp6lHz9PM/5yJAhA0aPGin3mIrAa9+zB1ra2Ca5pUHdeQmn7eXLl/i5RjUZAk1NTDFl6jTVTVuiwvvm7XvVy8PCzmPwwIFye0HiQ117fr4rERYWluyWhnFubnILw9cC79mzZyCqwUlVeMWWDLEHedCAAZg0eQoWLVqArdt2yGsm9BUV3ojbd5PctrBiuQ9693HQr1XN0VBAiwUYeLV4ctg1ClBAbwU0EnjFPl7/HTvQyc5OhlRx05W4iUtUa+ODm7rA28e+l3zsmLgZ69GjR2jSuCH69HGQ1xo+bChy584tq7OJD3XnJXyt6Nvhw4dkoE58JA68Yg9trZo1ZHtiD3FcXJzcR1uqdGmoa2+nvz+8vb2wZ+/+L9oQVeX/GnjFHmJxI920ae6wbdVKtYf30JFjKFKkiLx21cqVYGFhAZtWrVRbRBLv4f3hhx8wbbq73IZxKyIChQoXlr9MiBvf3MaO++KmtXlzPVDz559Rp05d7N+3D/fv30Mfh77yxjkvr8WYNXuO3v5QcGAU0KQAA68mdXltClCAAkkLaCTwipuuGjWwRFj4RZQpW1a2bFG2NFq0sJZPH0hcgRR/T1jhvXTpInp064ao6CiYmZnB0rKB3GIQH547dGgvb+Zau279ZzdmqDsv4fDFPuNmTZsgS5YsMgCKx3ctWuwlQ3biwCvOEwHRyWkwLl28KG9iE9syFixcBHXtiefwtmlti4ibNzHadYzcVxt/fEvgFeeIXxjE/tw7d27DxMRUBteEz/cVv2B4zJmNew8eqaq4CQOvqJaLKvn+fXsh+lWyZCns3LUb6dOnR8XyFtixMwAWFuU+WyFt27SCjY2t7Pdcjzm4fOmSvPFQ3BTYp7c9Ll2+wn2/fFehQAoEGHhTgMZTKEABCnyngEYC73f2SaOnP3nyBC1bNJdPhxAVUvEor2VLvRF69mySN8xptDO8OAUoYHACmg68BgfKAVOAAhT4DwIGF3jFntyBjo44evyErHCKiu34cWPln8U+WB4UoAAFNCnAwKtJXV6bAhSgQNICBhd4BcOkiROwKyAAGTNmlFsj6tStK7cJiH2uPChAAQpoUoCBV5O6vDYFKEABBl6uAQpQgAJpLsDAm+ZTwA5QgAIGKGCQFV4DnGcOmQIU0BIBBl4tmQh2gwIUMCgBBl6Dmm4OlgIUSGsBBt60ngG2TwEKGKIAA68hzjrHTAEKpJkAA2+a0bNhClDAgAUYeA148jl0ClBAeQEGXuXN2SIFKEABBl6uAQpQgAIKCjDwKojNpihAAQr8K8DAy6VAAQpQQEEBBl4FsdkUBShAAQZergEKUIACygsw8CpvzhYpQAEKsMLLNUABClBAQQEGXgWx2RQFKEABVni5BihAAQooL8DAq7w5W6QABSjACi/XAAUoQAEFBRh4FcRmUxSgAAX+Ffg/eTIGLf4T3PAAAAAASUVORK5CYII=" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Generates explanations\n", "local_explanations = explainer.explain(x)\n", "\n", "print(\"SHAP results:\")\n", "local_explanations[\"shap\"].ipython_plot()\n", "print(\"LIME results:\")\n", "local_explanations[\"lime\"].ipython_plot()\n", "print(\"Counterfactual results:\")\n", "local_explanations[\"polyjuice\"].ipython_plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Given the generated explanations, we can launch a dashboard (a Dash app) for visualization by setting the test instances and the generated local explanations." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dash is running on http://127.0.0.1:8050/\n", "\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:omnixai.visualization.dashboard:Dash is running on http://127.0.0.1:8050/\n", "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " * Serving Flask app \"omnixai.visualization.dashboard\" (lazy loading)\n", " * Environment: production\n", "\u001b[31m WARNING: This is a development server. Do not use it in a production deployment.\u001b[0m\n", "\u001b[2m Use a production WSGI server instead.\u001b[0m\n", " * Debug mode: off\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:werkzeug: * Running on http://127.0.0.1:8050/ (Press CTRL+C to quit)\n" ] } ], "source": [ "# Launch a dashboard for visualization\n", "dashboard = Dashboard(\n", " instances=x,\n", " local_explanations=local_explanations\n", ")\n", "dashboard.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.5" } }, "nbformat": 4, "nbformat_minor": 2 }