diff --git a/data-platform/data-science/oracle-data-science/operational-research/LICENSE b/data-platform/data-science/oracle-data-science/operational-research/LICENSE new file mode 100644 index 000000000..4c17d2626 --- /dev/null +++ b/data-platform/data-science/oracle-data-science/operational-research/LICENSE @@ -0,0 +1,35 @@ +Copyright (c) 2026 Oracle and/or its affiliates. + +The Universal Permissive License (UPL), Version 1.0 + +Subject to the condition set forth below, permission is hereby granted to any +person obtaining a copy of this software, associated documentation and/or data +(collectively the "Software"), free of charge and under any and all copyright +rights in the Software, and any and all patent rights owned or freely +licensable by each licensor hereunder covering either (i) the unmodified +Software as contributed to or provided by such licensor, or (ii) the Larger +Works (as defined below), to deal in both + +(a) the Software, and +(b) any piece of software and/or hardware listed in the lrgrwrks.txt file if +one is included with the Software (each a "Larger Work" to which the Software +is contributed by such licensors), + +without restriction, including without limitation the rights to copy, create +derivative works of, display, perform, and distribute the Software and make, +use, sell, offer for sale, import, export, have made, and have sold the +Software and the Larger Work(s), and to sublicense the foregoing rights on +either these or other terms. + +This license is subject to the following condition: +The above copyright notice and either this complete permission notice or at +a minimum a reference to the UPL must be included in all copies or +substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/data-platform/data-science/oracle-data-science/operational-research/README.md b/data-platform/data-science/oracle-data-science/operational-research/README.md new file mode 100644 index 000000000..57055b46e --- /dev/null +++ b/data-platform/data-science/oracle-data-science/operational-research/README.md @@ -0,0 +1,43 @@ +# Overview + +This project presents three operational research use cases with different levels of complexity: + +1. **Finding the best route using Dijkstra’s algorithm** – the simplest use case. +2. **Flight scheduling using integer linear programming.** +3. **Individual pricing optimization with global and individual constraints** – an advanced use case that also showcases the use of different resources and features in the OCI Data Science Platform. + +Reviewed: 2026.01.05 + +# What You’ll Learn + +This project covers the following topics: + +1. Background on optimization tools used in operational research, including linear programming, the Brent method, and root-finding techniques for computing Lagrange multipliers. +2. Background on the different use cases, with a focus on the individual pricing optimization use case. +3. OCI Data Science Platform components used in this project, including: + - Notebook Sessions + - Model serialization + - Model Catalog + - Model deployment + - Endpoint invocation for predictions + - Data Science Jobs + +# Prerequisites + +- Access to the OCI Data Science Platform +- Basic familiarity with Python and machine learning concepts +- A valid OCI compartment, resource principal, and policies configured for Data Science services + +# How to Use this asset? + +1. Open the provided notebook in your OCI Data Science Notebook Session. +2. Select the following conda environment: generalml_p311_cpu_x86_64_v1 +3. Run the notebook cells in sequence to reproduce the complete workflow. + +# License + +Copyright (c) 2026 Oracle and/or its affiliates. + +Licensed under the Universal Permissive License (UPL), Version 1.0. + +See [LICENSE](https://github.com/oracle-devrel/technology-engineering/blob/main/LICENSE) for more details. diff --git a/data-platform/data-science/oracle-data-science/operational-research/files/dijkstra's_algorithm.ipynb b/data-platform/data-science/oracle-data-science/operational-research/files/dijkstra's_algorithm.ipynb new file mode 100644 index 000000000..3b2d1e35b --- /dev/null +++ b/data-platform/data-science/oracle-data-science/operational-research/files/dijkstra's_algorithm.ipynb @@ -0,0 +1,376 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8cabf020", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "source": [ + "# Dijkstra’s Algorithm - shortest route" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "98370aac", + "metadata": {}, + "outputs": [], + "source": [ + "import networkx as nx\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "import math" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "dcba12e8", + "metadata": { + "jupyter": { + "source_hidden": true + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5cAAAG7CAYAAABXZGGBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABWVklEQVR4nO3dd3hUZd7/8c9M2qRAQkmogYBIR0BQQSlSHooNVNRHdxFLFNG17A900UdA3ceCi67tWUBQWeuqKAqrbASBBRULsCAiCKKhBBISSkjPZOb8/mBnlpAKSebMOfN+XZfXtZw5mfOdcs/e3/ncc47DMAxDAAAAAADUgdPsAgAAAAAA1kdzCQAAAACoM5pLAAAAAECd0VwCAAAAAOqM5hIAAAAAUGc0lwAAAACAOqO5BAAAAADUGc0lAAAAAKDOaC4BAAAAAHVGcwkAQcThcOjiiy8O+HEzMzM1adIkJScnKywsTA6HQ8eOHQt4HWZatGiRHA6HFi1aZHYplpGeni6Hw6GbbrqpwY910003yeFwKD09vcGPBQA4MzSXAALONyF1OBwaPXp0pft8/fXX9TJpvfjii+VwOOp0H6Hgpptu0htvvKEhQ4bo4Ycf1qxZs+Ryuarc3/cajhkzJoBV1k0gGyFU7pFHHvGPfYfDobCwMCUkJKhz58665ppr9Nprr6mgoKDej8trDwCBEW52AQBC22effaZVq1Zp+PDhZpcSskpLS7VixQqNHDlSb731ltnlmObKK6/UgAED1KpVK7NLsb2rr75aPXv2lCQdP35c6enpWrNmjRYvXqyZM2fqjTfeqJDgP/nkk5o+fbratGljQsUAgNqguQRgmpSUFO3du1d/+MMf9O2335IwmiQzM1Ner1etW7c2uxRTxcfHKz4+3uwyQsKECRP03//93+W2lZSU6LnnntNDDz2kyy67TF999ZXOOecc/+2tWrWi8QeAIMeyWACm6dKliyZOnKgNGzbovffeq/Xf5eXladasWerRo4eio6OVkJCg0aNH64svvii3n8Ph0D//+U////b9d9NNN8nr9apZs2b+9MTnyJEjcjqdcjgcWrlyZbnbfL/52rNnT7nty5Yt07BhwxQfH6/o6Gj17t1bzz77rMrKysrtd/LSvO3bt+vKK69Us2bNavwdmWEY+v3vfy+Hw6Hf/OY3crvdNT5HBQUFmjVrlrp27SqXy6WmTZvq0ksv1Zdfflluv4svvljt27eXJP31r38t9xzVpz179ujWW29VmzZtFBkZqbZt2+rWW2/V3r17K90/Ly9Pjz76qM455xzFxMQoPj5effv21YwZM8o9/iVLluj6669Xp06d/PsNHjxYH3zwQbn7W7RokTp06FDhcTocDq1Zs8a/T1W/ufzyyy916aWXqmnTpnK5XOratatmzZqlwsLCCvv6fjeblZWlSZMmqXnz5oqOjtaAAQP8xzrZwYMHde+99+rss8/2v5+7deumO+64Q7m5uTU+t7m5uZo9e7aGDh2q1q1bKzIyUq1bt9aNN96o3bt3V9jftzR1zZo1evvtt9WnTx9FR0erVatWuvfee1VUVFThbzwej2bPnq1OnTrJ5XKpU6dOevLJJ+X1emusr7aioqL0hz/8QTNnzlRBQYGmT59e7vaqfnP5wQcfaOjQoUpKSpLL5VLr1q01cuRI/3ugNq/9gQMHNGvWLA0YMEBJSUmKiopSSkqK7rzzTh06dKhCrb5afv31V73wwgvq2rWroqKi1L59ez366KNVPi8ff/yxRo0apWbNmsnlciklJUUTJ07UDz/8UG6/0tJSPfvsszr33HMVGxurRo0aafDgwVq6dGmF+8zNzdXMmTPVvXt3xcXFqXHjxurUqZMmTZpU4bMKABoaySUAUz322GP629/+pocfflhXXXWVIiIiqt3/yJEjGjJkiLZt26aLLrpId9xxh44fP66PP/5Yw4YN0/vvv6/x48dLkmbNmqVFixZpz549mjVrlv8++vTpI6fTqaFDh2rJkiU6dOiQkpKSJEn//Oc/ZRiGJGn16tUaOXKk/+9Wr16tDh06+JsxSXr22Wc1depUNW3aVDfccINiY2O1dOlSTZ06VevWrdOHH35YIZH9+eefNWDAAPXq1Us33XSTDh8+rMjIyEofr9vt1k033aS3335b9913n5599tkaE97i4mINHz5c3377rc4991zdd999ysrK0rvvvqu0tDS98847uuaaaySdmCT36dNHzz//vHr37u1/7vr06VPtMU7Hzp07NWjQIGVnZ+vyyy9Xjx499MMPP+jVV1/VsmXL9MUXX6hz587+/Q8dOqShQ4dqx44d6tOnj6ZMmSKv16sdO3Zo9uzZmjp1qhISEiRJDz74oCIjIzVo0CC1atVK2dnZWrp0qSZMmKAX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3JLzjIwMPf/883W+f5+SkhI9/fTTeuyxxxQXF6cnn3yyxr9Zs2ZNhc8Bt9vtX17qe/6qe+2TkpIUHR2tTZs2lfvsOHr0qP9SNnV11113STpxEiVfbT5lZWX+1y48PFxTpkzRnj17NG3atEpfvx9++MF/7c309PRKr5F7Ou8fAKhPLIsFEFSuuOIKDRo0qELD4POXv/xFP/30kx544AG98cYbGjhwoBISErRv3z5t2LBBu3bt0sGDBxUTEyPpRPq4ePFiXX311Ro7dqxcLpd69+5d7iQ5w4YN8ydFJzeQ559/vmJjY5Wdna0uXbqUOyukJJ111ln+6y6ec845uvbaaxUbG6tly5bpp59+0rhx4/Tb3/62Ts/HxIkT5XQ6NWnSJF188cVavXp1hTpO9cADD+iTTz7RG2+8oe3bt2vEiBH+6yyWlZVpwYIF9ZK0SdLWrVurbK66du2q6dOna+7cuRo0aJBuu+02LVu2TN27d9e2bdu0dOlSJSYmau7cueX+7i9/+Yt++OEHPf744/r00081fPhwGYahnTt36rPPPlNWVpYSEhI0ceJEzZ49W3fffbdWr16t9u3ba8uWLfr888911VVXVTijZlxcnM477zytXbtWEydO1Nlnny2n01nttQAbN26sBQsW6Prrr9cFF1yg6667TomJiVq5cqU2btyo888/X/fff/8ZP38rVqzQ/fffr4suukidO3dWs2bN9Msvv2jp0qVyuVz+pqQ6d999t+6++2717dtXEyZMUFlZmVasWCHDMNS7d2//CXnO1LBhw/xJeq9evXTllVeqpKRE7777rgYMGKC///3vp32fixcv9p+UJj8/X7/++qvWrl2rnJwcJScn68033/Rf97E648ePV+PGjTVgwAC1b99ebrdbK1as0I8//qgJEyb4X9eaXvs777xTzzzzjP+z4fjx41q+fLnat2/vP3NtXVxyySWaNm2a5syZo7PPPltXXnmlkpKSlJGRoc8//1zTpk3TfffdJ0l69NFHtWnTJr3wwgv65JNPNGTIEP++W7du1ZYtW7R+/XolJSVp8+bNuuqqq3T++eere/fuatmypTIyMvTRRx/J6XTq97//fZ1rB4DTYs4VUACEspqukfjll1/6rxVY2XXpCgsLjaefftro16+fERsba0RHRxsdOnQwxo8fb7z++uvlroPodruNBx54wGjXrp0RHh5e6X2+/PLLhiSjefPm5a4rZxiG/zqTJ1+b8FQff/yxMXToUKNRo0ZGVFSU0atXL+OZZ54pV8fJj7u6awLqpOtcnuztt982wsLCjC5dupS7BmFV8vPzjRkzZhidO3f2X9ty7Nixxrp16yrsW5frXFb338mPIz093bj55puNVq1aGeHh4UarVq2Mm2++2UhPT6/0/nNzc40ZM2YYXbt2NaKiooz4+HijT58+xsyZM43S0lL/fps3bzZGjRplNGnSxGjUqJExdOhQY+XKlZVes9IwDOOnn34yLrnkEiMhIcFwOByGJGP16tWGYVR+nUuftWvXGmPHjjUSEhKMyMhIo3PnzsaMGTPKXffRp6rX0DAMo3379kb79u39//7xxx+Ne++91+jbt6/RrFkzIyoqyujYsaMxadIkY9u2bZXex6m8Xq8xb948o0ePHobL5TJatmxp3HrrrcahQ4cqvc6r71qTvsd9sqqeg7KyMuPJJ580OnbsaERGRhodO3Y0nnjiCePnn38+o+tc+v5zOp1G48aNjU6dOhkTJkwwXnvttXLXJj1ZZde5/Mtf/mJcccUVRvv27Q2Xy2U0a9bMOP/88425c+eWe58YRvWvfWlpqfH4448bZ599thEVFWW0a9fOmDp1qpGXl1fhNauqllMfY2XP7wcffGAMGzbMf+3UlJQUY+LEicYPP/xQbr+ysjJj/vz5xkUXXWQ0btzYX9OYMWOMuXPn+t93+/btM6ZPn24MGDDASEpKMiIjI4127doZV111lbF+/frqXwwAaAAOw6hkXRkAAAAAAKeB31wCAAAAAOqM5hIAAAAAUGc0lwAAAACAOqO5BAAAAADUGc0lAAAAAKDOaC4BAAAAAHVGcwkAAAAAqDOaSwAAAABAndFcAgAAAADqjOYSAAAAAFBn4WYXAABW4TEM5ZZ45fYaKjMMeQwpzCGFOxyKcDoUH+VUmMNhdpkAzgDjGwDqjuYSACrhMQzlFHmUWVSmrMIyHShwK7vYI49R9d+EOaREV5hax0aoRUy4WkaHq3l0GBNSIMgwvgGgYTgMw6jmoxQAQsvBArc25hRr+9ES/0TTKcl7Gvdx8v5hDqlbkyj1S3SpVUxE/RYL4LQwvgGgYdFcAgh5bq+h7UdLtCG7SIeKPHJIqs8PRt/9tYgOU7/EaHVrEqUIJ2kHEAiMbwAIHJpLACHL7TW0PrNQG7KLVeo16n3SeSrf/Uc6Heqf6NLAljFMQoEGwvgGgMCjuQQQkjIK3FqWnqfcUm+DTjir4pAUH+nU5SmN1CaW5XRAfWJ8A4A5aC4BhBS319C6g4X69lBRgycZNfEd//ykaA1uRcoB1BXjGwDMRXMJIGSYnWZUJ4GUA6gTxjcAmI/mEkBI2HG0RB+n50kyN82oii/TGJfSSF2bRJlaC2A1jG8ACA40lwBsb8vhYi3fm292GbU2tl2cejdzmV0GYAmMbwAIHk6zCwCAhmS1iackLd+bry2Hi80uAwh6jG8ACC40lwBsa8fREstNPH2W783XjqMlZpcBBC3GNwAEH5pLALaUUeD2/wbLqj5Oz1NGgdvsMoCgw/gGgOBEcwnAdtxeQ8ssPvH0WZaeJ7eXn8YDPoxvAAheNJcAbGfdwcKgvBzB6TIkHSv16ouDhWaXAgQNxjcABC+aSwC2klHg1reHiiw/8TzZN4eKWD4HiPENAMGO5hKAbfiWyzlq3tVSHGL5HMD4BoDgR3MJwDbWZ9pjudypfMvn1meyfA6hi/ENAMGP5hKALbi9hjZkF9tu4nmyjdnFpBsISYxvALAGmksAtrD9aIlKbT4xK/EaXBsPIYnxDQDWQHMJwBY2ZBfZ7rdYp3LoxOMEQg3jGwCsgeYSgOUdLHDrUJHH1kvmpBO/zcoq8uggZ5ZECGF8A4B10FwCsLyNOcW2TzV8nJI25RSbXQYQMIxvALAOmksAluYxDG0/WmL7VMPHK+nHoyXyGqHyiBHKGN8AYC3hZhcAAHWRU+SRJ0DzsI1L39HiR+4pty22SXO1OKuLhkz6nbpcNDIgdXgMKafYo6RoPsIDYdOmTXrkkUf0xRdfqLi4WB07dtTtt9+ue+65p+Y/Rp0EanyfOrbDI6MU3ThBLTt1U5fB/6X+V9ygqNi4hi9EjG8A1sYnFwBLyywqC/gxR06Zrqat28kwDOUfydamZX/Toruv143PvaVuQ0YFpIbMwjImnwHw2Wef6fLLL1ffvn01Y8YMxcXFaffu3dq/f7/ZpYWEQI9v39j2lLmVf/iQftnwpT6Z87C+eHOebvzzG2rVuUdA6mB8A7AqPrkAWFpWYZmcOrGcLFC6XDRCbbv38f/7vPG/0eMju2tL2ocBaS6dOjH5PKdZgx8qpB0/flw33nijLr30Ui1evFhOJ78kCbRAj+9Tx/bFt9yn3d+u01/v+41e//1E/b8PvlSEK7pBa2B8A7Ay/p8SgKUdKHAHtLGsjKtRvMJdLjnDwgJyPK9OPG40rLfffltZWVl6/PHH5XQ6VVBQIK/X7HdbaAmG8X3W+YM1PPX/6djBffrXp4sb/HiMbwBWRnMJwLI8hqFDxZ6AH7c477gKjh5W/tEcZe3eoY+euF+lhQXqe8k1Aashu9jDST8a2MqVK9W4cWNlZGSoS5cuiouLU+PGjTVlyhQVF3NGz4Zm1viuTN9Lr5Uk7fp6dUCOx/gGYFUsiwVgWbklXnlNmH+9MuXqcv8Oj4zS1bOe19kDLg5YDR5DOlbiVVNXYNLSULRr1y6VlZVp3LhxuvXWW/Xkk09qzZo1evHFF3Xs2DG98847Zpdoa2aN78rEt2gtV1xjHdmfHpDjMb4BWBXNJQDLcps087xi+mwltj9LkpR3OFubP31fH/7x94qKiVPPEZcFrA6zHn+oyM/PV2Fhoe644w698MILkqSrrrpKpaWlmj9/vh577DGdffbZJldpX8H2/o6MiVVJQX7Ajhdsjx8AaoPmEoBllZm0bCy557nlTvrRe8xVevH64Vo6e7q6Dhml8IjIgNRxyWWXKWvnDwE5ll3t3LlTMTExld4WHX3ixC3XX399ue033HCD5s+fr/Xr11faXBYWFqpz5871X2yIadGll66Z84bZZfiVFhYormnzgB3Pw7JYABZEcwnAsgJ1fcuaOJ1Odex/kb5652Ud3vuLWpzVNSDHPZJ7XBkZGQE5ll1Vd4Ke1q1ba9u2bWrRokW57UlJSZKko0ePVvp3hmHwutSDiBbtzC7BLzfrgIrzj6tZcoeAHbMsSD7fAOB00FwCsKwwh9kV/IfXc+J6fCWFBQE7ZtP4xnK3aROw49lRdZcX6devn1asWOE/oY/PgQMHJEmJiYmV/p3D4VAbXpc6a5oQb3YJfv/65D1J0tkDhwXsmOFB9PkGALVFcwnAssIdwTH78rjd2vX1GoVFRCqpQ+CWQ37697+rRQwf4w3l2muv1VNPPaVXXnlFw4cP929fuHChwsPDdfHFF1f6dzExMdq/f3+AqrSvrMIyvfbTMbPL0O5v12nVwmfVpE179Rk7IWDHDQuSzzcAOB3MSgBYVoTTnMnXT19+ruxfd0mS8o/maMvyD3R47y8aevM9csU1ClgdZj3+UNG3b1/dcsstevXVV1VWVqahQ4dqzZo1ev/99/Xggw+qdevWZpdoa2a8v31j2+spU/6RbO3+dp1+/uafSmiVrBv//IYiolwBq4XxDcCKaC4BWFZ8lFNOhwJ+uYKVc5/y/+/wKJcSUzpp/EN/0vlXTwpYDWEOKSGKSxU3tHnz5qldu3Z67bXXtGTJErVv315//vOfdd9995ldmu2ZMb59YzssIlIx8Qlq0am7Lp32v+p/xQ2Kio0LWB2MbwBW5TAMTkcGwLoW7TiqzKLguNB6ILWMDtNNXZuYXQbQoBjfAGAtfC0GwNJax0aE3AeZUyceN2B3jG8AsJZQ+8wGYDMtYsJV9cUk7MkrqSUn8kEIYHwDgLXQXAKwtJbRoTkJY/KJUMD4BgBrobkEYGnNo8OC6nqXgRDmkJq7wswuA2hwjG8AsBaaSwCWFuZwqFuTKIXK/NMpqXuTKDm5Bh5CAOMbAKyF5hKA5fVr7lKonPbaK+ncxMBdaw8wG+MbAKyD5hKA5bWKjVBSdJjt0w2HpBbRYWoVw5kkEToY3wBgHTSXAGyhf2K07dMNQyceJxBqGN8AYA00lwBsoVuTKEU67Z1tRDkd6tokyuwygIBjfAOANdBcArCFCKdD/RNdkmHffKNfoksRNp9gA5XxjW87v/sZ3wDsgOYSgC3k5ubqzcem6fD+X+X1lJldTr1ySGoS5dSFLWPMLgUwzcCWMYqPdNquwfR6ylR6LEc9ot1mlwIAdUZzCcDy0tLS1LNnTy2YP0/vzbhLDoe9PtoMSZe1b6RwUg2EsAinQ5enNLLdby8dDqcW3vtb9Tmnl9LS0swuBwDqxF4zMAAhJTc3V7fddpvGjBmj/fv3S5KO/LJDrqyfbZVuXJAUrTaxnEESaBMbofOTou0zvg1DX/9tgfZt3aj9+/drzJgxuu2225Sbm2t2ZQBwRmguAViSL61cuHChf9uIESO0detW/W7MQFssn/Mthx3ciuWwgM/gVvZYHuuQ1MQVpmfv/I1GjBjh375w4UL17NmTFBOAJdFcArCUytLKuLg4zZs3TytWrFBKSop/+ZwdsBwWKM9u4/usDilasWKF5s2bp7i4OEkixQRgWQ7DsPGpFQHYSlpamlJTU/1NpXQirVy4cKFSUlIq7L/jaIk+Ss8LYIX1a3yHRuqawKUJgMrYcXynp6crNTVVn3/+uX9b27ZttXDhQo0ePTrQJQLAaSO5BBD0apNWVqZrkyiNbRcXwErrz9h2cTSWQDXsOL5TUkgxAVgbySWAoHa6aWVlthwu1vK9+Q1UYf0b2y5OvZu5zC4DsAS7jm9STABWRHIJICidaVpZmd7NXBqf0kgOKWhPAuKrbXyHRjSWwGmw6/gmxQRgRSSXAIJOfaSVlckocGtZep5yS71Bd628hEinLk9pxCVHgDNk5/FNignAKmguAQSN3NxcTZs2rdzlReLi4jRnzhzdfvvtcjjqnku4vYbWHSzUt4eK5JBMnYT6jn9BUrQGtYpRBGeFBerEzuPbMAy9/PLLmjZtmvLz/7MMODU1VXPmzFF8fHzdCgaAekBzCSAoNFRaWZVgSDlIK4GGYefxTYoJIJjRXAIwVSDSyqq4vYbWZxZqY3axSrxGgycdvvuPcjrUL9GlgS1JK4GGYufxTYoJIFjRXAIwTaDTyqq4vYa2Hy3RxuwiZRV56n0S6pTkldQiOkz9E6PVtUkUTSUQIHYe36SYAIINzSWAgDMzrazJwQK3NuUU68ejJfL8+9PRN3msrZP3D3NI3ZtE6dxEl1rFsPwVMJMdxzcpJoBgQnMJIKCCJa2sidcwlFPsUWZhmTILy3SgwK3sYo9/QlqZMIeU6ApT69gItYwJV8uYcDV3hclpYrMMoCI7jm9STADBgOYSQEAEc1pZW17D0LESr9xeQ5dcdpmO5B5X0/jG+vTvf1eE06GEKGfQTDQBnB47jG9STABmo7kE0OCsklaejrZt2yojI0Nt2rQp97gAWJ/VxzcpJgCzOM0uAIB95ebm6rbbbtOYMWP8E7S4uDjNmzdPK1assGxjCQDBLCUlRStWrNC8efMUFxcnSdq/f7/GjBmj2267Tbm5uSZXCMCuaC4BNIi0tDT17Nmz3DLYESNGaOvWrZo8ebIllsECgFU5HA5NnjxZW7du1YgRI/zbFy5cqJ49eyotLc3E6gDYFc0lgHpFWgkAwYMUE0Ag0VwCqDeklQAQfEgxAQQKzSWAOiOtBIDgR4oJoKHRXAKoE9JKALAOUkwADYnmEsAZIa0EAOsixQTQEGguAZw20koAsD5STAD1jeYSQK2RVgKA/ZBiAqgvNJcAaoW0EgDsixQTQH2guQRQLdJKAAgdpJgA6oLmEkCVSCsBIPSQYgI4UzSXACogrQQAkGICOF00lwDKIa0EAPiQYgI4HTSXACSRVgIAqkaKCaA2aC4BkFYCAGpEigmgJjSXQAgjrQQAnC5STABVobkEQhRpJQDgTJFiAqgMzSUQYkgrAQD1hRQTwMloLoEQQloJAKhvpJgAfGgugRBAWgkAaGikmABoLgGbI60EAAQKKSYQ2mguAZsirQQAmIUUEwhNNJeADZFWAgDMRooJhB6aS8BGSCsBAMGGFBMIHTSXgE2QVgIAghUpJhAaaC4BiyOtBABYBSkmYG80l4CFkVYCAKyGFBOwL5pLwIJIKwEAVkeKCdgPzSVgMaSVAAC7IMUE7IXmErAI0koAgF2RYgL2QHMJWABpJQDA7kgxAeujuQSCGGklACDUkGIC1kVzCQQp0koAQKgixQSsieYSCDKklQAAnECKCVgLzSUQREgrAQAojxQTsA6aSyAIkFYCAFA9Ukwg+NFcAiYjrQQAoHZIMYHgRnMJmIS0EgCAM0OKCQQnmkvAJOeccw5pJQAAZ6i6FLNXr14mVgaELppLwCSklQAA1F1VKSaAwKO5BOrZ448/LofDoZ49e9a4L2klAAB1V1WKWZU1a9bI4XBU+t/XX38dgIoBewo3uwDATvbv368nnnhCsbGxNe47d+5c3XbbbTSVAADUE1+K+fLLL9dq/3vuuUfnnXdeuW2dOnVqiNKAkEBzCdSjadOmacCAAfJ4PMrJyal239tvvz1AVQEAEDp8KWZtDB48WBMmTGjgioDQwbJYoJ6sXbtWixcv1nPPPWd2KQAAoJby8vJUVlZmdhmALdBcAvXA4/Ho7rvvVmpqKmeoAwDAIm6++WY1btxYLpdLw4YN04YNG8wuCbA0lsUC9WDevHnas2ePVq5caXYpAACgBpGRkbr66qt1ySWXqHnz5vrxxx81Z84cDR48WF999ZX69u1rdomAJdFcAnV0+PBhzZw5UzNmzFBiYqLZ5QAAgBpceOGFuvDCC/3/vuKKKzRhwgSdc845evDBB/WPf/zDxOoA62JZLFBHDz/8sJo2baq7777b7FIAAMAZ6tSpk8aNG6fVq1fL4/GYXQ5gSSSXQB3s2rVLL7/8sp577jkdOHDAv724uFhut1vp6elq3LixmjZtamKVAACgNpKTk1VaWqqCggI1btzY7HIAyyG5BOogIyNDXq9X99xzjzp06OD/75tvvtHOnTvVoUMHPfbYY2aXCQAAauGXX36Ry+VSXFyc2aUAlkRyCdRBz549tWTJkgrbH374YeXl5en555/XWWedZUJlAACgKtnZ2RXOk7BlyxYtXbpUY8eOldNJ/gKcCZpLoA6aN2+u8ePHV9juu9ZlZbcBAABzXXfddYqOjtaFF16opKQk/fjjj3r55ZcVExOjp556yuzyAMuiuQRqUFxcLJfLZXYZAACgnowfP15vvfWWnn32WR0/flyJiYm66qqrNGvWLHXq1KnKvyspKVFUVFQAKwWshcwfqEJubq5uu+02HT58+LT/ds2aNfrhhx8aoCoAAFBX99xzj7755hsdPnxYbrdbBw4c0BtvvFFtYymduPzYbbfdptzc3ABVClgLzSVQibS0NPXs2VMLFy40uxQAABBEFi5cqJ49eyotLc3sUoCgQ3MJnMSXVo4ZM0b79++XJH7UDwAAJP1nTrB//36NGTOGFBM4BbNm4N8qSytHjBhR4WxyAAAgNDVv3lwjRozw/5sUEyiP5hIhr7K0Mi4uTvPmzdOKFSsUHs55rwAAgBQeHq4VK1Zo3rx5/mthkmIC/0FziZBWVVq5detWTZ48WQ6Hw8TqAABAsHE4HJo8ebK2bt1KigmcguYSIammtDIlJcXcAgEAQFBLSUkhxQROQXOJkENaCQAA6gMpJlAezSVCBmklAABoCKSYwAk0lwgJpJUAAKAhkWICNJewOdJKAAAQSKSYCGU0l7At0koAAGAGUkyEKppL2A5pJQAACAakmAg1NJewFdJKAAAQTEgxEUpoLmELpJUAACCYkWIiFNBcwvJIKwEAgBWQYsLuaC5hWaSVAADAikgxYVc0l7Ak0koAAGBlpJiwI5pLWAppJQAAsBNSTNgJzSUsg7QSAADYESkm7ILmEkGPtBIAAIQCUkxYHc0lghppJQAACCWkmLAymksEJdJKAAAQykgxYUU0lwg6pJUAAACkmLAemksEDdJKAACAikgxYRU0lwgKpJUAAABVI8WEFdBcwlSklQAAALVHiolgRnMJ05BWAgAAnD5STAQrmksEHGklAABA3ZFiItjQXCKgSCsBAADqDykmggnNJQKCtBIAAKDhkGIiGNBcosGRVgIAADQ8UkyYjeYSDYa0EgAAIPBIMWEWmks0CNJKAAAA85Biwgw0l6hXpJUAAADBgxQTgURziXpDWgkAABB8SDERKDSXqDPSSgAAgOBHiomGRnOJOiGtBAAAsA5STDQkmkucEdJKAAAA6yLFREOgucRpI60EAACwPlJM1DeaS9QaaSUAAID9kGKivtBcolZIKwEAAOyLFBP1geYS1SKtBAAACB2kmKgLmktUibQSAAAg9JBi4kzRXKIC0koAAACQYuJ00VzWM49h6EixR1mFZcoocGtvvlsZBW5lFZbpSLFHHsMwu8RqkVYCAADAxw4pptXn51YSbnYBVuYxDOUUeZRZVKaswjIdKHAru9gjTzXvzzCHlOgKU+vYCLWICVfL6HA1jw5TmMlNW25urqZNm1auqYyLi9OcOXN0++2301QCAACEMF+K+fLLL2vatGnKz8/3p5ipqamaM2eO4uPjzS7TVvNzK3IYBq366TpY4NbGnGJtP1rif6M6JXlP4z5O3j/MIXVrEqV+iS61iomo32JrIS0tTampqf4lsNKJtHLhwoUsgQWq0LZtW2VkZKhNmzblxg4A62N8A9VLT09XamqqPv/8c/+2tm3bauHChRo9erQpNdltfm5VNJe15PYa2n60RBuyi3SoyCOHpPp84nz31yI6TP0So9WtSZQinA37bQlpJXDmmHwC9sX4BmpmGEa5FNMnkCmmHefnVkdzWQO319D6zEJtyC5Wqdeo9zftqXz3H+l0qH+iSwNbxjTIm5i0EqgbJp+AfTG+gdozI8W06/zcDjihTzUyCtx6ZftRrc8qUqn3xFu2oTtx3/2Xeg2tzyrSK9uPKqPAXW/3z5lgAQAAUF8CfUZZO87P7YTmshJur6FVGQV6Y2eucku9Df6GrYohKbfUqzd25mpVRoHc3rpVwplgAQAAUN8CcUZZu87P7Ybm8hS+b0O+O1QkqeG/CamJ7/jfHjrzb0lIKwEAANDQGirFtOP83K5oLk+y42iJ3jT525Dq5JZ69ebOXO04WlLrvyGtBAAAQKDUd4ppx/m5ndFc/tuWw8X6KD1Phsz/NqQqvto+Ss/TlsPF1e5LWgkAAACz1EeKabf5eSigudSJN+7yvfk17xhElu/Nr/INTFoJAAAAs9UlxbTb/DxUhHxzueNoieXeuD7L9+aXi+BJKwEAABBsTjfFtNP8PNSEdHOZUeDWx+l5ZpdRJx+n5ymjwE1aCQAAgKBV2xTTTvPzUBSyzaXba2iZxd+4Pq9+94suGzeetBIAAABBrboU8/Y7pujjX+r3uphmWZaeF5KXKQnZ5nLdwcKgPevU6TAkhTVqopF3PCCJtBIAAADBraoUc390C9vMz4+VevXFwUKzSwm4kGwuMwrc+vZQkeXfuD5Op1NDJt6ll954j7QSAAAAlnByitnlgsEa/Ns75XDapz355lBRyC2Ptc+rV0u+5bB2y/ScTofC+o5QmV06ZgAAANiew+HQLbfdrt/NXyzDsNdE1qHQWx4bbnYBgbY+0x7LYU9lyKFjpV6tzyzUkNaxZpcD2N6rr76q4uJiuVwus0sBUM8Y30Bgrc8sVIHXKWeY2ZXUL9/y2FCanzsMu31FUA2319CLW4+o1MbfHkQ5Hfpdr6aKcNotmwUAAIDdMD+3l5BaFrv9aImt37iSVOI1QvraOgAAALAO5uf2ElLN5YbsItv91vJUDp14nAAAAECwY35uLyHTXB4scOtQkcd2v7U8lSEpq8ijgyF2ZioAAABYC/Nz+wmZ5nJjTrHtvxXxcUralFNsdhkAAABAlZif209INJcew9D2oyW2/1bExyvpx6Ml8obOuZoAAABgIczP7SkkmsucIo88JryO6997VQ+em6j/u3F0wI/tMaScYk/AjwvY2Xfffaff/e536tGjh2JjY9WuXTtde+212rlzp9mlAaijbdu26ZprrlHHjh0VExOj5s2ba8iQIVq2bJnZpQG2FOj5+cal7+jBcxMr/e8fLzwWkBpCYX4eEte5zCwqM+W4W5YvVpPW7bT/h03K2fuLmrfrGNDjZxaWKSk6JF5iICBmz56tL7/8Utdcc43OOeccZWZm6qWXXtK5556rr7/+Wj179jS7RABnaM+ePcrLy9OkSZPUunVrFRYW6oMPPtAVV1yh+fPn6/bbbze7RMBWzJqfj5wyXU1btyu3rUWnrgE7vt3n5yFxncvP9uVrc06xvAE85pGMPfrT5f312zmLtOTxaRpw7S0aOfn+gB3fKalPc5dGJccF7JiA3X311Vfq37+/IiMj/dt27dqlXr16acKECXrzzTdNrA5AffN4POrXr5+Ki4u1Y8cOs8sBbCXQ8/ONS9/R4kfu0V1vrlDb7n0CdNTyQmF+HhLLYg8UuAPaWErS5uWLFd04QV0G/5d6jrxcm5cvDujxvTrxuAHUnwsvvLBcYylJZ599tnr06KHt27ebVBWAhhIWFqbk5GQdO3bM7FIA2zFjfm62UJif27659BiGDpmwtnnzpx+ox/BLFR4Rqd6jr9Thvb9o37Z/BbSG7GKP7X80DJjNMAxlZWWpefPmZpcCoB4UFBQoJydHu3fv1p///GctX75cI0aMMLsswFbMmp9LUnHecRUcPVzuv0Cy+/zcvgt+/y23xCtvgF+/jB+3KDt9l674w5OSpJS+AxTforU2f7pYyT36BqwOjyEdK/GqqSssYMcEQs1bb72ljIwMPfZYYE4GAKBhTZ06VfPnz5ckOZ1OXXXVVXrppZdMrgqwFzPm5z6vTLm6wrYnN2UH7Ph2n5/bvrl0m/DO/dfyxYprlqiO/QdJkhwOh84ZNV7/+vR9Xfr/HpMzLHBvJjMePxAqduzYobvuuksDBw7UpEmTzC4HQD247777NGHCBB04cEDvvfeePB6PSktLzS4LsBUz56dXTJ+txPZnmXZ8yd7zc9s3l2UBjp29Ho++T1uijv0H6UjGHv/25J7nat0bf9HP365V54HDAlaPx8axO2CmzMxMXXrppYqPj9fixYsVFsAvjQA0nK5du6pr1xNnjrzxxhs1atQoXX755frmm2/kcITK5d6BhhXo+fnJknuea9oJfXzsPD+3fXMZ6Otb7v5unfJysvR92hJ9n7akwu2bly8OaHNZZt/3LmCa3NxcjR07VseOHdO6devUunVrs0sC0EAmTJigyZMna+fOnerSpYvZ5QC2YMb154OJnefntm8uwwL8JePm5YsV1zRRV0x/qsJt21Z9oh9Xfyp3cZEiXNEBqSecL1mBelVcXKzLL79cO3fu1MqVK9W9e3ezSwLQgIqKiiSd+FIJQP0I9Pw82Nh5fm775jI8gEtY3MVF2rbqE/UaeYV6jbyiwu2NE1tqyz8+1PZ//kPnjL4yIDWFsYQHqDcej0fXXXed1q9fr48//lgDBw40uyQA9eTQoUNKSkoqt83tduv1119XdHQ0XyQB9SiQ8/NgZOf5ue2bywhn4F687f/8h0oK8tVt6JhKb0/u1V+xTZpr8/IPAtZcBvLxA3Y3depULV26VJdffrmOHDmiN998s9ztv/3tb02qDEBdTZ48WcePH9eQIUPUpk0bZWZm6q233tKOHTv0zDPPKC7Ovhc9BwIt1Oendn78tm8u46OccjoUkNMdb17+gcKjXOp0wdBKb3c6neo6aKQ2L/9ABceOKDahaYPWE+aQEqJsfylTIGA2b94sSVq2bJmWLVtW4XaaS8C6rrvuOr3yyiuaO3euDh8+rEaNGqlfv36aPXu2rrii4mokAGcukPPzYGP3+bnDMGx8uqJ/W7TjqDKLzLlQq5laRofppq5NzC4DAAAAKIf5uT3Zt20+SevYiNB4oCdx6sTjBgAAAIIN83N7ConXtEVMuLxmFxFgXkktY2y/6hkAAAAWxPzcnkKiuWwZbe8XsSp2f/MCAADAmpif21NINJfNo8NC7no6YQ6puSvM7DIAAACACpif21NINJdhDoe6NYlSqLx/nZK6N4mS08bX0AEAAIB1MT+3p5BoLiWpX3OXbH9a3H/zSjo30WV2GQAAAECVmJ/bT8g0l61iI5QUHWb7b0ccklpEh6lVjL3PRAUAAABrY35uPyHTXEpS/8Ro2387YujE4wQAAACCHfNze7H36YpO0a1JlFbuL1Cp175v4SinQ12bRJldBmB7n332mYqLi+VyuTRq1CizywFQjxjfQOAwP7cXh2EY9n0lK7H2QIHWZxXZ9huSC1tEa0jrWLPLAGyvbdu2ysjIUJs2bbR//36zywFQjxjfQGCtPVCgr7IKJZsukA2l+XlILYuVpIEtYxQf6bTdW9frKZOzOE8DW4RG5A4AAADrMwxD25a9pSP798jrKTO7nHrlkNQkyqkLW8aYXUrAhFxzGeF06PKURrZLLh0Op16afI3GjPovpaenm10OAAAAUK309HSNHDlSd94xWe8+PEUOh71aE0PSZe0bKdxpt1iravZ6BWupTWyEzk+Ktk16aRherX3j/7Rv60atWrVKvXr10rx58xRiK54BAABgAYZhaN68eerVq5dWrVolSdr7/QblbvnC5Mrq1wVJ0WoTa/8zxJ4sJJtLSRrcyh7LYx2SmrrCde8lg5ScnCxJys/P15QpUzRy5EhSTAAAAAQNX1o5ZcoU5efnS5KSk5OVlpamP950pRJsMj9vEuXU4FahsxzWJ2SbS9/yWDu4rH0jjRn1X9q6datSU1P920kxAQAAEAwqSyslKTU1VVu3btWoUaNsNz8PpeWwPiHbXEonlseOs/gbeFyHRv64PT4+XgsWLFBaWhopJgAAAIJCdWnlggULFB8f79/XbvPzUBPSzaUkdW0SpbHt4swu44yMbRenrgkVr5kzatQoUkwAAACYqjZpZWXsOD8PFSHfXEpS72Yuy72Bx7aLU+9mripvJ8UEAACAWU4nrayMHefnoYDm8t96N3NpfEojORS8l2/11Ta+Q6Nav3FJMQEAABAoZ5pWVsau83M7o7k8SdcmUfpt5/igPYtsfKRTv+0cf9pROykmAAAAGlpd08rK2HV+blc0l6doExuhW7s10XlJ0ZLM/5bEd/wLkqJ1a7cmdfpxMCkmAAAA6lt9ppWVsfP83G5oLisR4XRoeJtYTQyCb0niI52a2Dlew9rEKqIeTmdMigkAAID60hBpZWXsPD+3E5rLavi+JRnYIlpR/37jNPTbx3f/UU6HLmzRcN+GkGICAADgTDV0WlkVO8/P7cBh0EXUittraPvREm3MLlJWkUcOSfX5xDkleSW1iA5T/8RodW0SFbBvQj777DOlpqZq3759/m3Dhw/XK6+8opSUlIDUAFhN27ZtlZGRoTZt2mj//v1mlwOgHjG+geqlp6fr1ltvLddUJicna+HChQ3WVFbGzvNzq6K5PAMHC9zalFOsH4+WyPPvZ8/35qutk/cPc0jdm0Tp3ESXWsWY8y1Ibm6upk2bpoULF/q3xcXF6U9/+pMmT54sh4OBBJyMySdgX4xvoHKGYWj+/Pm6//77/UtgpRNp5Zw5c+ptCeyZsOP83IpoLuvAaxjKKfYos7BMmYVlOlDgVnaxx/+GrkyYQ0p0hal1bIRaxoSrZUy4mrvC5AyS5o0UE6gdJp+AfTG+gYqCJa2siR3n51ZCc1nPvIahYyVeub2GPIahMkMKd0hhDocinA4lRDmD/o1KignUjMknYF+Mb+A/gjmtrC07zM+tguYSVSLFBKrG5BOwL8Y3cIJV0koED84WiypxRlkAAIDQY9aZYGF9NJeoFtfFBAAACB2Bum4l7InmErVCigkAAGBfpJWoDzSXqDVSTAAAAPshrUR9obnEaSPFBAAAsD7SStQ3mkucEVJMAAAA6yKtREOguUSdkGICAABYB2klGhLNJeqMFBMAACD4kVaiodFcot6QYgIAAAQf0koECs0l6hUpJgAAQPAgrUQg0VyiQZBiAgAAmIe0EmaguUSDIcUEAAAIPNJKmIXmEg2OFBMAAKDhkVbCbDSXCAhSTAAAgIZDWolgQHOJgCLFBAAAqD+klQgmNJcIOFJMAACAuiOtRLChuYRpSDEBAABOH2klghXNJUxFigkAAFB7pJUIZjSXCAqkmAAAAFUjrYQV0FwiaJBiAgAAVERaCauguUTQIcUEAAAgrYT10FwiKJFiAgCAUEZaCSuiuURQI8UEAAChhLQSVkZziaBHigkAAEIBaSWsjuYSlkGKCQAA7Ii0EnZBcwlLIcUEAAB2QloJO6G5hCWRYgIAACsjrYQd0VzCskgxAQCAFZFWwq5oLmF5pJgAAMAKSCthdzSXsAVSTAAAEMxIKxEKaC5hK6SYAAAgmJBWIpTQXMJ2SDEBAEAwIK1EqKG5hG2RYgIAADOQViJU0VzC1kgxAQBAIJFWIpTRXCIkkGICAICGRFoJ0FwihJBiAgCAhkBaCZxAc4mQQ4oJAADqA2klUB7NJUISKSYAAKgL0kqgIppLhDRSTAAAcDpIK4Gq0Vwi5NWUYpaVlZlcIQAACAZer5e0EqgGzSXwb1WlmNnZ2SZWBQAAgkVRURFpJVANmkvgJJWlmF6vt8r9b7rpJjkcjir/y8jICFTpAACglrZt26ZrrrlGHTt2VExMjJo3b64hQ4Zo2bJl1f6d7+cypJVA5cLNLgAIRr4Uc9q0adXuN3nyZI0cObLcNsMwdMcddyglJUVt2rRpyDIBAMAZ2LNnj/Ly8jRp0iS1bt1ahYWF+uCDD3TFFVdo/vz5uv3226v829TUVM2ZM4emEqiEw+CMJUC1iouL5XK5ar3/F198ocGDB+vxxx/XQw891ICVwUxt27ZVRkaG2rRpo/3795tdDoB6xPgOTR6PR/369VNxcbF27NhR6T5lZWUKDyebAarCsligBqfTWErS22+/LYfDoRtuuKGBKgIAAPUtLCxMycnJOnbsWJX70FgC1WOEAPXI7Xbrvffe04UXXqiUlBSzywEAANUoKChQUVGRcnNztXTpUi1fvlzXXXed2WUBlkVzCdSjtLQ0HT58WL/5zW/MLgUAANRg6tSpmj9/viTJ6XTqqquu0ksvvWRyVYB10VwC9ejtt99WRESErr32WrNLAQAANbjvvvs0YcIEHThwQO+99548Ho9KS0vNLguwLE7oA9ST/Px8tWjRQsOHD6/xVOawPk74AdgX4zt0jRo1SseOHdM333wjh8NhdjmA5XBCH6CefPTRRyosLGRJLAAAFjVhwgR999132rlzp9mlAJZEcwnUk7feektxcXG64oorzC4FAACcgaKiIklSbm6uyZUA1kRzCdSD7OxsrVy5UldeeaViYmLMLgcAAFTj0KFDFba53W69/vrrio6OVvfu3U2oCrA+TugD1IN3331XZWVlLIkFAMACJk+erOPHj2vIkCFq06aNMjMz9dZbb2nHjh165plnFBcXZ3aJgCXRXAL14K233lJSUpJGjhxpdikAAKAG1113nV555RXNnTtXhw8fVqNGjdSvXz/Nnj2bn7cAdcDZYgGTzJ8/X7fffjtno7MoziYJ2Bfj29oMw9CiRYt08803m10KEHL4zSVgkjvvvFMjR45Uenq62aUAAGAL6enpGjlypKZOnWp2KUBIorkETLRq1Sr16tVL8+bNE4sIAAA4M4ZhaN68eerVq5dWrVpldjlAyKK5BEySnJwsScrPz9eUKVNIMQEAOAO+tHLKlCnKz8+XJLVp08bkqoDQRHMJmGTLli1KTU31/5sUEwCA2qsqrUxNTdUXX3xhYmVA6KK5BEwSHx+vBQsWKC0tjRQTAIDTUFlamZycrLS0NC1YsEDx8fEmVwiEJppLwGSjRo3S1q1bSTEBAKhBdWnl1q1bNWrUKBOrA0BzCQQBUkwAAKpHWgkEP5pLIIiQYgIAUB5pJWAdNJdAkCHFBADgBNJKwFpoLoEgRYoJAAhVpJWANdFcAkGMFBMAEGpIKwHrorkELIAUEwBgd6SVgPXRXAIWQYoJALAr0krAHmguAYshxQQA2AVpJWAvNJeABZFiAgCsjrQSsB+aS8DCSDEBAFZDWgnYF80lYHGkmAAAqyCtBOyN5hKwCVJMAECwIq0EQgPNJWAjpJgAgGBDWgmEDppLwIZIMQEAZiOtBEIPzSVgU6SYAACzkFYCoYnmErA5UkwAQKCQVgKhjeYSCAGkmACAhkZaCYDmEgghpJgAgPpGWgnAh+YSCDGkmACA+kJaCeBkNJdAiCLFBACcKdJKAJWhuQRCGCkmAOB0kVYCqArNJQBSTABAjUgrAdSE5hKAJFJMAEDVSCsB1AbNJYBySDEBAD6klQBOB80lgApIMQEApJUAThfNJYAqkWICQOghrQRwpmguAVSLFBMAQgdpJYC6oLkEUCukmABgX6SVAOoDzSWAWiPFBAD7Ia0EUF9oLgGcNlJMALA+0koA9Y3mEsAZIcUEAOsirQTQEGguAdQJKSYAWAdpJYCGRHMJoM5IMQEg+JFWAmhoNJcA6g0pJgAEH9JKAIFCcwmgXpFiAkDwIK0EEEg0lwAaBCkmAJiHtBKAGWguATQYUkwACDzSSgBmobkE0OBIMQGg4ZFWAjAbzSWAgLBDiukxDB0p9iirsEwtuvRSyrkD1aJLL2UVlulIsUcemmTAsqw+vkkrAQQDh0FkACDAcnNzNW3aNC1cuNC/LS4uTn/60580efJkORwOE6s7wWMYyinyKLOoTFmFZTpQ4FZ2sUeeaj4xwxxSoitMrWMj1CImXC2jw9U8OkxhQfB4APyHnca3YRiaP3++7r//fn9TKZ1IK+fMmUNTCSCgaC4BmOazzz5Tamqq9u3b5982fPhwvfLKK0pJSTGlpoMFbm3MKdb2oyX+iaZTkvc07uPk/cMcUrcmUeqX6FKrmIj6LRbAabHb+E5PT9ett95abglscnKyFi5cyBJYAKaguQRgqmBIMd1eQ9uPlmhDdpEOFXnkkFSfH4y++2sRHaZ+idHq1iRKEU7STCAQ7Di+SSsBBCuaSwBBwYwU0+01tD6zUBuyi1XqNep90nkq3/1HOh3qn+jSwJYxNJlAA7Hr+CatBBDMaC4BBI1AppgZBW4tS89Tbqm3QSecVXFIio906vKURmoTy3JZoD7ZcXyTVgKwAppLAEGnIVNMt9fQuoOF+vZQUYMnGTXxHf/8pGgNbkWKCdSVXcc3aSUAq6C5BBCUGiLFNDvNqE4CKSZQJ3Yc36SVAKyG5hJAUKuvFHPH0RJ9nJ4nydw0oyq+VnlcSiN1bRJlai2A1dhxfJNWArAip9kFAEB1Ro0apa1btyo1NdW/bdWqVerVq5fmzZun2nw/tuVwsT5Kz5Oh4Jx4SvLX9lF6nrYcLja7HMAy7Da+DcPQvHnz1KtXr3KNZWpqqrZu3UpjCSCokVwCsIwzSTG3HC7W8r35ld4WzMa2i1PvZi6zywCCmt3GN2klAKsjuQRgGaebYu44WmLJiackLd+brx1HS8wuAwhadhrfpJUA7ILkEoAl1ZRiZhS49ebO3KBdJlcbDkm/7RzPSX6AU9hpfLuzM0grAdgGzSUAy6rqjLJPz3lGjkETgvKskafDd628W7s14TIlwL+5vYZe2X7UFuPbUZyvJy/rr2NHDvu3cyZYAFbGslgAlhUfH68FCxYoLS1NycnJkqT8/Hwt23FAR4vLLD3xlE6cAORYqVdfHCw0uxQgaKw7WGj5xlI6Mb7LImM0YOJdkk6klWlpaVqwYAGNJQDLIrkEYAu+FPOzbzfrjlc/kcNpr+/OJrI8FlBGgVtv7Mw1u4x6ZXi9ylgyT4/ffy9NJQDLo7kEYBtur6EXN2WoWOFyhoWbXU69YXksYJ/lsBUYhhKiwhjfAGzBXl/tAwhp6zML5Q5z2aqxlP6zPHZ9JstjEbrWZ9pjOWwFDgfjG4Bt0FwCsAW319CG7GL7TTxPsjG7WG6vnR8hUDnGNwBYA80lAFvYfrREpTafmJV4Da59iZDE+AYAa6C5BGALG7KLZPdfKzl04nECoYbxDQDWQHMJwPIOFrh1qMhj6yVz0onfXmYVeXSwwG12KUDAML4BwDpoLgFY3sacYtunGj5OSZtyis0uAwgYxjcAWAfNJQBL8xiGth8tsX2q4eOV9OPREnm5ihRCAOMbAKyF5hKApeUUeeQJsXmYx5Byij1mlwE0OMY3AFiLvS4GByDkZBaVBfyYh/f9qrV/fUm7vvmn8rIzFRYRoZaduqnXf43T+VfdqAhXdIPXkFlYpqRoPsID7fHHH9fDDz+sHj166IcffjC7HNsL5PjeuPQdLX7knipvn7Joudqd0z8gtTC+AVgVn1wALC2rsExOnVhOFgg71n2mt/+QqrCISJ172bVqcVY3edylSt/8jZY/96iydv+kq2Y826A1OHVi8nlOswY9DE6xf/9+PfHEE4qNjTW7lJAR6PEtSSOnTFfT1u0qbG+W3CEgx2d8A7AymksAlnagwB2wieeRjD1658HbldCyrVLnf6jGiS39tw287lbl7P1FP32xosHr8OrE40ZgTZs2TQMGDJDH41FOTo7Z5YSEQI5vny4XjVDb7n0CfNT/YHwDsDJ+cwnAsjyGoUMB/G3S2r++pNLCAl0967lyjaVP83YdddENkwNSS3axh5N+BNDatWu1ePFiPffcc2aXEjICPb6DCeMbgFWRXAKwrNwSr7wBnH9tX5umpm1T1L73+YE7aBU8hnSsxKumrjCzS7E9j8eju+++W6mpqerVq5fZ5YSMQI9vn+K84yo4erj8RodDsQlNA1YD4xuAVdFcArAsdwBnnsX5eTp+6KC6Xzw2YMesSSAffyibN2+e9uzZo5UrV5pdSkgx6/39ypSrK2wLj4zSH7/eH9A6GN8ArIjmEoBllQVw2VhJQZ4kKTImLmDHrMkll12mrJ2csbQudu7cqZiYmCpvP3z4sGbOnKkZM2YoMTGxVvdZWFiozp0711eJIatFl166Zs4bAT/uFdNnK7H9WeW2OZyBTxA9LIsFYEE0lwAsK5DXv4uKbSRJKi3MD9xBa3Ak97gyMjLMLsPSvN7qTxfz8MMPq2nTprr77rtrfZ+GYfC61IOIFhXP2BoIyT3PNfWEPj5l9JYALIjmEoBlhTkCdyxXXCM1TmypzJ+3B+6gNWga31juNm3MLsPSnM6qz2u3a9cuvfzyy3ruued04MAB//bi4mK53W6lp6ercePGatq0/G/xHA6H2vC61FnThHizSzBVeAA/3wCgvtBcArCscEdgZ19dB4/Stx++rj1bvlP73ucF9NiV+fTvf1eLGD7GG0pGRoa8Xq/uuece3XPPPRVu79Chg+69994KZ5CNiYnR/v2B/X2eHWUVlum1n46ZXYZpwgL8+QYA9YFZCQDLinAGdvI1ZNLvtHn5Yn34x98rdf6HatQsqdzth/f9qh3rPgvY5UgC/fhDTc+ePbVkyZIK2x9++GHl5eXp+eef11lnnVXJX6I+hPr7O9QfPwBrorkEYFnxUU45HQrY5QqaJXfQdU/M1zvTb9Ofr75IfS+9Vi07dVWZ2629W77T1pVL1e/y/w5ILWEOKSGKSxU3pObNm2v8+PEVtvuSyspuQ/0J9Pj2+enLz5X9664K29v3Pk9N26YEpAbGNwCrorkEYFlhDoeSXGHKLArchda7Dx2je99do7V//T9t/+c/9M3iRQqPjFTLs7vrkt8/qvOvmhiQOhJdYXKybA42Zsb4lqSVc5+qdPuER14IWHPJ+AZgVQ7D4FzXAKzrs3352pxTrOrP+WkvTkl9mrs0Kjl4LosCNATGNwBYC2suAFhai5jwkJp4SpJXUktO5IMQwPgGAGuhuQRgaS2jQ3MSxuQToYDxDQDWQnMJwNKaR4cF9HqXwSDMITV3hZldBtDgGN8AYC00lwAsLczhULcmUQqV+adTUvcmUZzsAyGB8Q0A1kJzCcDy+jV3KVTOTOaVdG6iy+wygIBhfAOAddBcArC8VrERSooOs3264ZDUIjpMrWIizC4FCBjGNwBYB80lAFvonxht+3TD0InHCYQaxjcAWAPNJQBb6NYkSpFOe2cbUU6HujaJMrsMIOAY3wBgDTSXAGwhwulQ/0SXrZfO9Ut0KcLmE2ygMoxvALAGmksAtjGwZYziI522m4A6JDWJcurCljFmlwKYhvENAMGP5hKAbUQ4Hbo8pZHtfptlSLqsfSOFk2oghDG+ASD40VwCsJU2sRE6PynaVunGBUnRahPLGSQBxjcABDeaSwC2M7iVPZbP+ZbLDW7FcjnAh/ENAMGL5hKA7fiWz9kBy+WA8hjfABC8aC4B2FKb2AiNs/gEdFyHRiyXAyrB+AaA4ERzCcC2ujaJ0th2cWaXcUbGtotT1wSueQdUhfENAMGH5hKArfVu5rLcBHRsuzj1buYyuwwg6DG+ASC4OAzDsNtZvQGggh1HS/Rxep4kBeWlDHy/uhrXoRGJBnCaGN8AEBxoLgGEjIwCt5al5ym31Bt0E9CESKcuT+E3WMCZYnwDgPloLgGEFLfX0LqDhfr2UJEcMjfl8B3/gqRoDWoVowjOGgnUCeMbAMxFcwkgJAVDykGaATQMxjcAmIPmEkDIcnsNrc8s1MbsYpV4jQZPOnz3H+V0qF+iSwNbkmYADYXxDQCBR3MJIOS5vYa2Hy3RxuwiZRV56n0S6pTkldQiOkz9E6PVtUkUk04gQBjfABA4NJcAcJKDBW5tyinWj0dL5Pn3p6Nv8lhbJ+8f5pC6N4nSuYkutYpheRxgJsY3ADQsmksAqITXMJRT7FFmYZkyC8t0oMCt7GKPf0JamTCHlOgKU+vYCLWMCVfLmHA1d4XJ6SDFAIIJ4xsAGgbNJQDUktcwdKzEK7fXkMcwVGZI4Q4pzOFQhNOhhCgnE03AohjfAFB3NJcAAAAAgDpzml0AAAAAAMD6aC4BAAAAAHVGcwkAAAAAqDOaSwAAAABAndFcAgAAAADqjOYSAAAAAFBnNJcAAAAAgDqjuQQAAAAA1BnNJQAAAACgzmguAQAAAAB1RnMJAAAAAKiz/w9ZAy3ITicHWQAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "edges = [\n", + " ('A', 'B', 4),\n", + " ('A', 'C', 7),\n", + " ('B', 'C', 2),\n", + " ('B', 'D', 6),\n", + " ('C', 'E', 4),\n", + " ('D', 'E', 3),\n", + " ('D', 'F', 5),\n", + " ('E', 'F', 3),\n", + "]\n", + "\n", + "G = nx.Graph()\n", + "G.add_weighted_edges_from(edges)\n", + "\n", + "pos = {\n", + " 'A': (0, 0),\n", + " 'B': (1, 1),\n", + " 'C': (1, -1),\n", + " 'D': (2, 1),\n", + " 'E': (2, -1),\n", + " 'F': (3, 0),\n", + "}\n", + "\n", + "node_color = 'skyblue'\n", + "edge_color = 'black'\n", + "\n", + "plt.figure(figsize=(9, 4))\n", + "nx.draw(\n", + " G, pos,\n", + " with_labels=True,\n", + " node_color=node_color,\n", + " edge_color=edge_color,\n", + " node_size=2000,\n", + " font_size=12,\n", + " width=2\n", + ")\n", + "\n", + "edge_labels = nx.get_edge_attributes(G, 'weight')\n", + "nx.draw_networkx_edge_labels(\n", + " G, pos,\n", + " edge_labels=edge_labels,\n", + " font_size=12,\n", + " rotate=False\n", + ")\n", + "\n", + "plt.title(\"Network of Locations and Distances\", fontsize=14)\n", + "plt.axis(\"off\")\n", + "plt.show()\n" + ] + }, + { + "cell_type": "markdown", + "id": "c5d80f1c", + "metadata": {}, + "source": [ + "## Extracting shortest distance between A to other points " + ] + }, + { + "cell_type": "markdown", + "id": "0a0ef149", + "metadata": {}, + "source": [ + "1. Iterative algorithm - in each iteration the distnaces between A to the other points is updated\n", + "2. We start with the direct distance between A to B and C" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "9602c3a5", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA5cAAAG7CAYAAABXZGGBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABcsUlEQVR4nO3deXhU5d3/8c+ZmSSTSSAhJBDCjqjIIgq4CyJQwAVxQahawQWl9qc8WpdHWxVtq9XWtlpti4qKe1VUFH0UXFABFcUFUUFwAUlCIAQSsiczc35/xERCEkjIzJw557xf15Wr5cxkzncmc4/nO5/73McwTdMUAAAAAADt4LG6AAAAAACA/dFcAgAAAADajeYSAAAAANBuNJcAAAAAgHajuQQAAAAAtBvNJQAAAACg3WguAQAAAADtRnMJAAAAAGg3mksAAAAAQLvRXAKwtXfeeUeGYeiWW25ptH306NEyDKPRtvnz58swDM2fPz92BTpcS6+/1fanrnh9LtF0yy23yDAMvfPOO1aX4niGYWj06NFWlwEAUUVzCcByGzdulGEYjX4CgYBycnI0duxY3Xzzzfruu++sLrNFsT5ovOCCC6LeJG/atEler1eGYeivf/1r1PYTa3369FGfPn2sLiPq6r9IaennsMMOi0kd+/t69+nTR36/v9G2eP9yqLkvtADAbXxWFwAA9Q444AD96le/kiRVV1dr27Zt+uijj/THP/5Rt99+u6677jrddtttjQ7gjjzySK1du1aZmZmNHuuxxx5TRUVFTOuPlWAwKElKTk6O2j4efvhhhcNhGYahhx9+WNdee23U9hUNLb0v3Gbs2LE6/vjjm2zPzs6WJF1++eX65S9/qV69esW6NNdZu3atAoGA1WUAQFTRXAKIG/379292SuLy5ct1/vnn689//rO8Xq/++Mc/NtwWCAQ0YMCAJr/j5IPlzz77TJ07d9akSZOi8vjhcFjz589XZmamTj31VM2fP1/vv/++jj322KjsLxpael+4zbhx43T99de3eHtmZqbrG/BY4f0IwA2YFgsg7h1//PF6/fXXlZSUpL/85S/avHlzw21tOeeyJbm5uRo8eLD8fr+ef/75hu1Lly7VSSedpJycHCUlJalr164aOXKkHnjggUb7lqR333230bTD+ql7u0/lW7RokY477jh16NChYapgTU2N7r33Xk2YMEE9e/ZUUlKSunTpojPPPFOfffZZk1p37typtWvX6je/+U2TFGRf9bbWG2+8oR9//FG//OUvdfHFF0uSHnrooTY9Rv1rMmrUKKWkpKhz586aNm2aNm/e3OLfpry8XHPmzNGAAQPk9/uVkZGhU045RStWrGhy393PFZw/f76GDRumQCDQMD15z/dF/dTrTZs2adOmTY3+Vs19obFq1Sr94he/UIcOHZSWlqYzzjhDGzdubHK/+inReXl5Ovfcc5WZmakOHTrolFNO0ffffy+pLrE6/fTTlZGRoQ4dOmjKlCnaunVrm1/PaGjunMv61+qCCy7Q2rVrdcYZZ6hz584yDKPhNfj00081ZcoU9erVS0lJScrKytIRRxyh2267rdFjtPb13pcLLrhAF154oSTpwgsvbPR4uystLdWcOXM0aNAgJScnKz09XRMmTNDy5cubPGb9+7Cqqko33nijDjjgACUkJDTUt379el133XUaNmyYOnfuLL/fr4MOOkjXX3+9ysrKGj2WYRh69913G/5//c8FF1zQ6D7NTZ/fvn27rrzySvXt27dh/E+dOlVffvlls6+DYRj64Ycf9M9//lMDBgxQUlKSevfurVtvvVXhcLgtLysARBzJJQBbOPjggzV16lQ9/vjjWrhwoa644oqIPO7atWs1YcIElZSU6PXXX284+Hv11Vc1adIkpaena/LkyerWrZsKCwu1evVqPf7447r00kvVp08fzZkzR7feeqt69+7d6EByz3PannvuOS1ZskSnnnqqfvOb32jXrl2SpB07dujKK6/UyJEjdfLJJ6tTp076/vvv9fLLL+u1117Te++9pyOOOKLhcd5//30lJSXp8ssvb/T4ram3teobyenTp+uII45Qv3799Oyzz+qee+5Rampqqx5jyZIlOuWUU+T1ejVt2jTl5ORo6dKlOv7449WpU6cm96+qqtKYMWP00UcfadiwYbryyiu1detWPfPMM1q8eLGefvppnX322U1+769//auWLl2qyZMna/z48fJ6vc3Wk56erjlz5ujuu++WJF155ZUNt+15wP/xxx/rL3/5i0488UTNmjVLn332mRYuXKg1a9boyy+/bHIu4M6dO3X88ccrOztbM2bM0Pr16/XKK69o3bp1eumllzRy5EgNHz5cF110kT755BM9//zz2rFjh95+++1WvZZW+fbbb3X00UdryJAhuuCCC1RUVKTExER9/vnnOvbYY+X1ejV58mT17t1bxcXF+vrrr/XAAw/o97//fZte79Y4/fTTVVxcrJdeekmTJ09u9pzRHTt2aNSoUfrqq6903HHH6de//rV27dqll156SSeeeKKee+45nX766U1+76yzztLq1as1ceJEpaenq2/fvpKkF154QQ899JBOPPFEjR49WuFwWB9++KHuvPNOvfvuu3rvvfeUkJAgSZozZ47mz5+vTZs2ac6cOQ2Pva9zWwsLC3XMMcfou+++0+jRo/XLX/5SP/zwgxYsWKBXX31VixcvbnZa87XXXqt3331Xp556qiZMmKCFCxfqlltuUU1NTUODDwCWMAHAYj/88IMpyZwwYcJe7/fQQw+Zkszzzz+/YdvSpUtNSeacOXMa3feEE04w9/yIe+SRR0xJ5iOPPGKapml+8MEHZkZGhpmdnW1+/vnnje575plnmpKabDdN09y+fXujf0syTzjhhGZrrt+nx+Mx33jjjSa3V1VVmbm5uU22f/nll2Zqaqo5bty4Zh93T22pd2+2b99uJiYmmgMGDGjYdvPNN5uSzHnz5jW5f3OvfzAYNHv37m0ahmEuW7as0f2nT59uSmryt7n11ltNSeZ5551nhsPhhu2ffvqpmZiYaKanp5u7du1q2D5nzhxTkpmSkmJ+8cUXrarLNE2zd+/eZu/evZt97vW/I8n873//2+i2888/35RkPv30042219//qquuarT9sssuMyWZ6enp5t13392wPRwOmyeffLIpyfzkk0+arSMS6t93Y8eONefMmdPkZ8uWLaZp/vw6Ll26tOF368ejJPPmm29u8ti//e1vTUnmwoULm9y253ttb6/33vTu3dtMSkpq9jnVj989nXvuuaYk88EHH2y0fevWrWbPnj3NrKwss7KysmF7/WfEYYcdZhYVFTV5vNzcXLO6urrJ9vr36hNPPNFoe3OfObtr7nPiwgsvNCWZN9xwQ6Ptr776qinJ7N+/vxkKhRq2z5gxw5Rk9u3b18zPz2/YXlhYaKanp5sdOnRotmYAiBWmxQKwjZycHEl108ja6//+7/80duxYZWRk6P3339fQoUObvV9zi+Z07ty5zfubPHmyxo0b12R7UlKSunfv3mT7oEGDdOKJJ+q9995TbW1tq/fT3noff/xx1dTU6Pzzz2/YNn36dEmtnxq7fPlybdq0SZMmTWqSuvzpT39qNl189NFHlZCQoDvuuKPRVMfDDz9cM2bMUHFxsRYuXNjk9y699FINGTKkVXW11qhRozRt2rRG2y666CJJdanmnlJTU/WnP/2p0bZzzjlHUt1rP3v27IbthmHol7/8pSRp9erVEa27OW+99ZZuvfXWJj8FBQX7/N3s7Gz9/ve/b/H2SI2NSNi+fbueeeYZjRkzRjNnzmx0W5cuXXTttdeqsLBQb775ZpPfvfXWW5WRkdFke/fu3ZWYmNhke/2sgeYeqy1qamr09NNPq3Pnzrrxxhsb3XbyySfrF7/4hb799ttmp4XfdNNN6tatW8O/MzMzNXnyZJWWluqbb75pV10A0B40lwBc57nnntPkyZM1YMAArVixomEa3O7qG4Cjjz5al19+uV588cV2NbVHHnlki7d9/vnnOvfcc9WrVy8lJiY2nK+1aNEi1dTUtGq/kar3oYcekmEYDav2SnWr+B577LH64IMPtHbt2n0+Rn3T1Nx0vp49ezZZbGnXrl36/vvv1b9/f/Xo0aPJ75x44omS6l6nPe3tdd1fw4cPb7Ktvq7i4uImtx144IFNzn+tP/A/9NBDm5wXWH9bfn7+Pmupn+64+09brkn55z//WaZpNvlpzaVIhg4d2mxzNXXqVHk8Hp1xxhm66KKL9PTTTysvL6/VNUXDxx9/rFAopOrq6iav1y233KIPP/xQkrRu3bomv9vSe8g0TT388MMaNWqUMjIyGi7NU99At+bvtzfr1q1TVVWVjjzyyGZXkd3b+76t71EAiBXOuQRgG/UHc1lZWe16nA8++EDBYFAjR45Uly5dmr3P2WefrYULF+rvf/+75s6dq3/9618yDEMnnnii/va3v7X5OoFdu3Ztdvv777+vMWPGSJLGjx+vAw88UKmpqTIMQwsXLtTq1atVXV29z8ePRL0rV67Ul19+qRNPPLFJAzh9+nS9//77evjhh/d53cv680lbem27du2qH374ocn9W3qN6pux+vvt+ViR1rFjxybbfL66/1yGQqE23X9vt7UmkV64cKEeffTRJttjcV3Vll7bo446Su+8845uv/12PfXUU3rkkUckSUcccYTuvPPOhqYolnbs2CFJWrFiRbNJX73y8vIm21p6nrNnz9Z9992nnj176rTTTlO3bt2UlJQkqS7tbM243Jv2vO/b+h4FgFihuQRgG/WJze4L3OyP22+/XS+//LLuuece+Xw+3XXXXc3eb/LkyQ1TzVasWNGwwMfEiRO1bt06paent3qfLa1ce9ttt6m6ulrLli1rkvR9+OGHbZo62d5666e9Ll26tMV6H3vsMd1+++0NC5k0p/7Ad9u2bc3evudKqfX3b2kF1fopnM0dUDv9ovXz589vWHk41vb22o4cOVKvvfaaKisrtXLlSi1atEj//ve/dcopp+jLL79Uv379Yljpz++Nq6++usXx3JLmnue2bdv0r3/9S4ceeqg++OCDRsliQUGBbr311vYVrPa97wEgXtFcArCF9evX69lnn1VSUpLOOOOMdj2W3+/Xiy++qLPOOkt/+9vfZJqm/va3v7V4/w4dOmjixImaOHGiQqGQHn74Ya1cuVITJkyQJHk8nv1OC7777jtlZGQ0aSwrKir06aef7tdj7qve5pSXl+u///2vAoFAw/mCe/r444/1xRdf6JVXXtnr36D+/NUVK1bo2muvbXRbbm6ufvzxx0bbOnbsqH79+unbb79VXl5ek3NQ679UaGta3Byv16uampp2Pw7qJCcna/To0Ro9erTS09N1880364033tCsWbMkRfb1rj9Xt7mxdsQRR8gwDH3wwQcR2df3338v0zQ1bty4JlNWly1bts/6Wlq1eHf1l9z5+OOPVVFR0WQ/kXzfA0CscM4lgLi3YsUKTZgwQdXV1br++uubXQCnrZKSkvTCCy/o1FNP1d///nddddVVjW5/7733mj2IrU/jdr8cRUZGhnJzc/erjt69e2vnzp366quvGraFQiFdc801KiwsbPXjtKXe5jz33HMqLS3VlClTNG/evGZ/6qfD7mthn+OPP169evXSokWLmhzs33TTTc3WOWPGDNXW1uqGG26QaZoN27/44gvNnz9faWlpzV5Goq0yMjK0fft2VVVVtfux3OqDDz5o9vWrT+D2HBuRer3rF93Z/Tq39bKzszV16lS9//77+utf/9roPVRv5cqVqqioaNW+evfuLalu2vru147Mzc3VDTfc0Ob6mpOYmKhzzjlH27dv15///OdGt73++utavHix+vfvr+OOO65VjwcA8YDkEkDc+PbbbxsuYF5TU6Nt27bpo48+0po1a+T1enXjjTc2uoZceyUmJur555/X2WefrbvvvlumaTZcl2/27NnKz8/X8ccfrz59+sgwDC1fvlwfffSRjj766EZJ45gxY/Tss8/q9NNP1+GHHy6v16vTTjtNhx566D5ruOKKK7RkyRIdf/zxmjp1qvx+v9555x3l5eVp9OjRrV68pS31Nqe+Yay/UH1zxo0bpx49euj1119Xfn5+w+q9e/J6vZo7d65OO+00jRkzRtOmTVO3bt307rvvKi8vT0OHDtUXX3zR6Heuu+46vfrqq3r88ce1du1ajR07Vtu2bdMzzzyjYDCoBx98UB06dGjVa7E3Y8aM0apVq3TSSSdp5MiRSkxM1KhRozRq1Kh2P7Zb3HnnnVq6dKlGjRqlvn37yu/369NPP9Vbb72lfv36NUq1I/l6H3PMMUpOTtbdd9+tnTt3Npx7Xb/S6r///W998803uu666/T444/rmGOOUXp6ujZv3qxVq1Zpw4YN2rJlS7OL5+ypW7duOuuss/T8889rxIgRGjt2rLZu3apXXnlFY8eO1Xfffdfkd8aMGaMFCxborLPO0kknnSS/36+hQ4dq0qRJLe6n/pqZf/rTn/T+++/rqKOO0saNG/Xcc88pEAjokUcekcdDDgDAPmguAcSN7777ruFcpuTkZKWnp2vAgAG66aabNGPGDB1wwAER32diYqIWLFigqVOn6p577pFpmrrnnnt0ww036IUXXtAnn3yixYsXKyEhQX369NGdd96p3/zmN42mvd1zzz2SpLfffluLFi1SOBxWjx49WtVcnnrqqVqwYIFuv/12PfHEEwoEAhozZoxefPFF/eEPf2j182hLvXv65ptvtHz5cvXt21cnnHBCi/fzeDyaMWOGbrvtNs2fP1+/+93vWrzvSSedpCVLlujmm2/Ws88+q+TkZI0dO1bPPPOMTj755Cbnkfn9fr399tu688479cwzz+gf//iHAoGATjjhBP3ud7/bZ3PcWjfddJN27typV155RcuWLVMoFNKcOXNoLtvgsssuU1pamlauXKl3331XpmmqV69e+t3vfqerrrqq0d82kq93RkaGFixYoFtuuUUPPvigKisrJf3cXNZfVui+++7TM888oyeffFLhcFjZ2dkaOnSobrrpJmVmZrZ6f/Pnz1efPn30/PPP695771WvXr3029/+Vv/7v/+rBQsWNLn/JZdcoo0bN+q///2v7rzzTgWDQc2YMWOvzWVWVpZWrlypP/7xj3rppZe0bNmy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2E97SzGHDBliYWWAe9FcAlYhrQQAoN1aSjEBxB7NJRBht912mwzD0ODBg/d9Z9JKAADaraUUsyXvvPOODMNo9ufDDz+MQcWAM/msLgBwktzcXN1+++1KSUnZ953/85+6cy5pKgEAiIj6FPOBBx5o1f1nz56tI444otG2/v37R6M0wBVoLoEIuuaaa3T00UcrFApp+/bte7/zpZfGpigAAFykPsVsjZEjR2rKlClRrghwD6bFAhHy3nvvacGCBbr77rutLgUAALRSaWmpgsGg1WUAjkBzCURAKBTSFVdcoZkzZ7JCHQAANnHhhReqY8eO8vv9OvHEE7Vq1SqrSwJsjWmxQATMnTtXmzZt0ptvvml1KQAAYB8SExN11lln6eSTT1ZmZqa+/vpr3XXXXRo5cqTef/99HX744VaXCNgSzSXQTkVFRbr55pt10003KSsry+pyAADAPhx77LE69thjG/592mmnacqUKTr00EN1ww036PXXX7ewOsC+mBYLtNONN96ojIwMXXHFFVaXAgAA9lP//v01efJkLV26VKFQyOpyAFsiuQTaYcOGDXrggQd09913Kz8/v2F7VVWVamtrtXHjRnXs2FEZGRkWVgkAAFqjZ8+eqqmpUXl5uTp27Gh1OYDtkFwC7ZCXl6dwOKzZs2erb9++DT8rV67U+vXr1bdvX/3hD3+wukwAANAK33//vfx+v1JTU60uBbAlkkugHQYPHqwXX3yxyfYbb7xRpaWluueee3TAAQdYUBkAAGhJYWFhk3USVq9erZdfflknnXSSPB7yF2B/0FwC7ZCZmanTTz+9yfb6a102dxsAALDWtGnTlJycrGOPPVZdunTR119/rQceeECBQEB33HGH1eUBtkVzCexLVZXk91tdBQAAiJDTTz9dTz75pP7+979r165dysrK0plnnqk5c+aof//+Lf5edXW1kpKSYlgpYC9k/kBLSkqkSy6Riora/KvvvPOOvvzyyygUBQAA2mv27NlauXKlioqKVFtbq/z8fD3++ON7bSylusuPXXLJJSopKYlRpYC90FwCzVm8WBo8WJo3z+pKAABAHJk3b54GDx6sxYsXW10KEHdoLoHd1aeVEydKubl12zipHwAASA0L/eTm5mrixImkmMAeOGoG6jWXVo4dK+2xmhwAAHCnzMxMjR07tuHfpJhAYzSXQHNpZWqqNHeu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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "node_colors = ['green' if n == 'A' else 'skyblue' for n in G.nodes()]\n", + "\n", + "# Edge colors: edges connected to A in red, others black\n", + "edge_colors = []\n", + "for u, v in G.edges():\n", + " if 'A' in (u, v):\n", + " edge_colors.append('red')\n", + " else:\n", + " edge_colors.append('black')\n", + "\n", + "# Draw graph\n", + "plt.figure(figsize=(9, 4))\n", + "nx.draw(\n", + " G, pos,\n", + " with_labels=True,\n", + " node_color=node_colors,\n", + " edge_color=edge_colors,\n", + " node_size=2000,\n", + " font_size=12,\n", + " width=2\n", + ")\n", + "\n", + "# Edge labels\n", + "edge_labels = nx.get_edge_attributes(G, 'weight')\n", + "nx.draw_networkx_edge_labels(\n", + " G, pos,\n", + " edge_labels=edge_labels,\n", + " font_size=12,\n", + " rotate=False\n", + ")\n", + "\n", + "plt.title(\"Dijkstra’s Algorithm - First Iteration\", fontsize=14)\n", + "plt.axis(\"off\")\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "23cfa710", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Node Distance from A Previous Node\n", + "0 A 0.0 None\n", + "1 B 4.0 A\n", + "2 C 7.0 A\n", + "3 D NaN None\n", + "4 E NaN None\n", + "5 F NaN None\n" + ] + } + ], + "source": [ + "data = [\n", + " {\"Node\": \"A\", \"Distance from A\": 0, \"Previous Node\": None},\n", + " {\"Node\": \"B\", \"Distance from A\": 4, \"Previous Node\": \"A\"},\n", + " {\"Node\": \"C\", \"Distance from A\": 7, \"Previous Node\": \"A\"},\n", + " {\"Node\": \"D\", \"Distance from A\": None,\"Previous Node\": None},\n", + " {\"Node\": \"E\", \"Distance from A\": None, \"Previous Node\": None},\n", + " {\"Node\": \"F\", \"Distance from A\": None, \"Previous Node\": None},\n", + "]\n", + "\n", + "df = pd.DataFrame(data)\n", + "print(df)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "12abd20b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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afjw4fr2228rrGP//v3605/+pI4dO5Zdt3Pnzrr55puVk5NTq+fkRIZh6LbbbpMkff/995Kk7du3684771Tv3r2VmJioqKgonXHGGbrrrruUl5d32rXl5OTo/vvvV5cuXRQXF6cGDRqoQ4cOmjBhgvbu3XvKWmvzfVjT16C22rRpo06dOqmoqEi5ubl1ui/An5FcIuR16tRJ48aN0+uvv64FCxZoypQpXrnfrVu3avjw4crJydFnn31W1px8/PHHGjlypBo1aqTRo0erRYsWOnTokDZu3KjXX39dkyZNUps2bTRjxgw9+OCDat26ta6//vqy+z3rrLPKrefdd9/V4sWLdemll+rWW2/V8ePHJUlHjhzR7bffrgEDBuiSSy5R48aN9fPPP2vhwoX69NNP9fXXX+vss88uu5/ly5crMjJSf/zjH8vdf03qrSlPI3ndddfp7LPPVrt27fTOO+/oH//4h+Li4mp0H4sXL9aIESMUFhamK6+8Ui1bttTSpUt1/vnnq3HjxhWu73A4NHjwYK1evVq9e/fW7bffrgMHDujtt99WWlqa3nrrLV1xxRUVbve3v/1NS5cu1ejRozVs2DCFhYVVWk+jRo00Y8YMPfPMM5Kk22+/veyyk4+X/f777/Xkk09q0KBBmjx5stavX68FCxZo8+bN2rJli6Kiospd/+jRozr//PPVvHlzTZgwQdu3b9dHH32kbdu26cMPP9SAAQPUp08f/eEPf9DatWv1/vvv68iRI/ryyy9r9FyejsTERGVlZSkzM1MtW7as0W0WLlyocePGyWazafTo0UpNTdWPP/6o5557TmlpaVq1alW51+7999/X+PHjZZqmRo4cqU6dOungwYNatWqVXnrppbJk3TRNjR07Vh9++KHOOOMM3XbbbcrPz9fbb7+tUaNG6emnn9af//znSuvxvK/79++vr7/+WvPnz9euXbsq7Jw//PDDuv/++9WsWTPddNNNCg8P19tvv62tW7fW4Vms+fvmhRde0G233aZGjRpp5MiRatq0qdasWaOZM2dq6dKlWrp0qSIiIsrd9/Lly/Xoo49q0KBBmjRpkn755Zeyy2677Tb17NlTQ4cOVZMmTZSRkaEFCxZo6NCh+uCDDzR69OiyGvbs2aPXXntNF154YbmaKvvx4ERPP/20pk2bpoSEBI0fP16xsbFauHChpk2bpm+++UYffPBBhR31PXv26JxzzlHXrl31hz/8Qbt27dKHH36oQYMGaevWrWrWrFnNn1wvs9vL7yodOnRI5557rnbt2qWBAwfqqquu0u7du/Xee+/p448/VlpaWtmQyNoaM2aMjh07pg8//FCjR4+u8HkvlX62X3DBBfrhhx903nnn6eabb9bx48fLnq93331XY8aMkSQVFBTovPPO0549ezRs2DD97ne/U3FxsXbv3q3XX39d06dPV8OGDU+r1hN5Xs8PPvhAL730kgYNGqSBAwfK7XZr5cqVeuKJJ7Rs2TJ9/fXXCg8Pr1Vtpmlq+PDhWrVqlc477zxddNFFstls2rt3rxYuXKhrr71WrVu3rra+2nwf1uQ1OB179+7VTz/9pJSUFDVt2tQr9wn4JRMIYrt37zYlmcOHD6/2ei+99JIpybz22mvLli1dutSUZM6YMaPcdS+88ELz5E3nlVdeMSWZr7zyimmaprlixQozISHBbN68ublhw4Zy173ssstMSRWWm6ZpZmdnl/u/JPPCCy+stGbPOm02m7lkyZIKlzscDjM9Pb3C8i1btphxcXHm0KFDK73fk9Wm3upkZ2ebERER5plnnlm27P777zclmfPmzatw/cqef6fTabZu3do0DMP85ptvyl3/uuuuMyVVeG0efPBBU5J5zTXXmG63u2z5unXrzIiICLNRo0bm8ePHy5bPmDHDlGTGxsaamzZtqlFdpmmarVu3Nlu3bl3pY/fcRpL5n//8p9xl1157rSnJfOutt8ot91z/z3/+c7nlt9xyiynJbNSokfnMM8+ULXe73eYll1xiSjLXrl1baR3e8Je//MWUZLZt29Z84oknzOXLl5v5+flVXj87O9ts0KCBmZycbO7Zs6fcZW+99ZYpyfzjH/9YtiwrK8uMjY01Y2NjzXXr1lW4v3379pX9+7XXXivbRoqKisqW792710xKSjLtdru5a9eusuWebcZut5vffvtt2XKn02kOHDjQlGSuWLGibPmOHTtMu91uJicnmwcOHChbnpOTY3bq1Kna7fNknnU/9thj5ZZX97754YcfTLvdbvbs2bPCtvbYY4+ZksxZs2aVLTvxffbyyy9Xep8///xzhWWZmZlmy5YtzY4dO5ZbXtV73cOzrSxdurRs2c6dO0273W42bdrU/OWXX8qWOxwO8/zzzzclmfPnzy9b7vmMlmQ+/vjj5e7/3nvvrfQ586bqviMeffRRU5I5YsSIcstvuOEGU5J59913l1v+8ccfm5LMDh06mC6Xq2x5Zd8ZHhMmTDAlmbt37y5bdvL3ycnGjx9vSjLnzp1bbvmBAwfM1NRUs0mTJmZhYaFpmqa5cOFCU5J5++23V7if3Nxc0+FwVLqOE3neB5MnTy633O12l9V/ww03mKZpmunp6eW2RQ/P5/C///3vsmU1rW3Tpk2mJHPMmDEVrudwOMzc3NxTPobafh+e6jWoiud2Q4YMMWfMmGHOmDHDvOeee8wJEyaYjRs3Nps2bWp+/vnntbpPINAwLBaQyhKY7OzsOt/XJ598oiFDhighIUHLly9Xz549K71eZcdbJCYm1np9o0eP1tChQyssj4yMVHJycoXlXbt21aBBg/T111+rpKSkxuupa72vv/66iouLyw2nvO666yTVfGjst99+q71792rkyJEVkoFHHnmk0nTxtddeU3h4uB5//PFyaUmvXr00YcIEHTt2TAsWLKhwu0mTJql79+41qqumLrjgAl155ZXllv3hD3+Q9L9hZSeKi4vTI488Um7Z1VdfLan0uZ86dWrZcsMwdNVVV0lSvQ4lnDlzpq6//nrt3btXf/3rX9W/f381aNBAffr00SOPPKJjx46Vu/78+fN1/PhxPfbYYxXShauuukq9e/fWf/7zn7Jlr732mvLz8zVt2jT16tWrwvpTUlLKXVeSnnzyyXLpXatWrfTnP/9ZTqdTb7zxRoX7GD9+vM4777yy/4eFhWnChAmSyr8Ob775ppxOp/7yl7+USxoaNGige++9t9rnyRvmzJkjp9OpZ599tsK2duedd6pJkyZ66623Ktyud+/eZcP6Tta2bdsKy1q0aKHLL79cO3bsqNEQw+p4nrNp06YpNTW1bHlkZKSeeOIJSar02Ly2bdtWmNzLMyy1sm3D23bu3KkHHnhADzzwgO644w4NHjxY//d//6dmzZqVm3yluLhYb731lhITEyu8By655BL99re/1c6dOysdcu8N2dnZevvttzV48GBNnDix3GVNmzbVHXfcoUOHDunzzz8vd1lln99xcXGKjIys8brXrFlT9hz9+c9/Vu/evfXaa68pISFB99xzjyQpOTm5QpIuqWxEzMl11aa2yq4XGRlZo1Ev3v4+PJUvvvhCDz74oB588EHNnDlTr732mnJzczVu3Divf68A/oZhsYAXeYao9ujRQ59++mmlQ1+uuuoqffDBBzrnnHM0fvx4DRkyRAMGDDjtiTH69etX5WUbNmzQk08+qW+//VZZWVkVvjyzs7PVokWLau/fW/W+9NJLMgyjbEZGqXSGxv79+2v58uXaunWrOnfuXO19eJqmyoacpaamqlWrVtq9e3fZsuPHj+vnn39W586dyzUlHoMGDdLcuXO1YcOGCscQVve8nq4+ffpUWOap6+SmTJI6duxY4fhXz+vVo0ePCkMLPZdlZmaespYFCxZow4YN5ZYNHDjwlKe+iYqK0iuvvKKHH35Yn3zyiVavXq3Vq1dr3bp1WrdunebMmaNly5apXbt2kqSVK1dKklatWlXpaX8cDoeys7OVnZ2tpKQkrV69WpI0bNiwUz6G9evXKyYmptLXynO84MmPUar56+B5vw0YMKDC9Stb5m2e5y4tLU1ffPFFhcvDw8O1bdu2CstPHO5+sp9//lmPPfaYvvzyS2VkZKioqKjc5ZmZmaccYlgdz/Frlb2Pzj33XEVFRVX6mpx11lmy2cr/3l3dtnGyDRs2VPiRqE2bNuUOKajOrl279OCDD5Zb1rx5c33zzTflZj7etm2bHA6HBg0aVGHblErfd0uWLNGGDRvq5T3y/fffy+VyqaioqNJjunfs2FFW56WXXqoLLrhALVq00OOPP66NGzfq0ksv1YUXXqjOnTvX+hjCtWvXlh1/GhERoeTkZN1000265557yt4zpmnqlVde0auvvqotW7YoJydHbre77D5O/GyqaW2dO3dWjx499NZbbyk9PV1jxozRwIEDK33PVMcb34c19dhjj5VN6ON2u7V//34tWLBA06ZN0yeffKJ169Z5ZTgy4I9oLgH97wuvSZMmdbqfFStWyOl0asCAAVUeU3HFFVdowYIFevrppzV79mz961//kmEYGjRokJ566qlaH99R1bFIy5cv1+DBgyWV7qh37NhRcXFxMgxDCxYs0MaNGyvsWNZXvatWrdKWLVs0aNCgCrPtXnfddVq+fLlefvnlU07P7jmetKrntlmzZhWaS8/yynh2JDzXO/m+vK1BgwYVlnmO53K5XLW6fnWX1eQX+AULFpQlfyeq6XlVU1JSNGnSpLJjbnft2qU//OEP+vrrr/XnP/9ZH374oaTSY50k6V//+le195efn6+kpKSySTwqSxlOdvz48XLp2Imqe21r+jp4aqns/eaLYwA9z93MmTNrdbuqatu5c6f69eun48ePa9CgQRo5cqQaNGggm82mr776SsuWLavRZ0J1qtvmDMNQs2bNlJGRUeGy2m4bJ9uwYUOF5vDCCy+scXM5fPhwffbZZ5JKj6l87bXX9Ne//lWjRo3S6tWry9KxunymeIPnPfHdd99Vm456zjXbsGFDrVy5Uvfff78WLVqkTz75RFLpj3F33XWXbr311hqve/LkyZo9e3a115k6daqee+45paamatSoUWrRokVZAvnggw+We3/VtDa73a4vv/xSDzzwgN5//31NmzZNUun39R//+Efdc889VR4T7+Gt78PTYbPZlJycrNtuu0379+/XzJkz9dxzz5WlvUCwobkEpLLZDqv7xb8mHn30US1cuFD/+Mc/ZLfbNWvWrEqvN3r0aI0ePVq5ubn67rvvyiZBuOiii7Rt27ZTTphxoqp+fZ45c6aKior0zTffVEj6Vq5cWauhk3Wt1zPsdenSpVXWO3/+fD366KNlkz1UxrMDevDgwUovP3mmVM/1q5pBNSsrq9z1TlTXmQH93auvvurVUwe0b99er776qtq1a1duQiHPc7t582Z169btlPfjeS9lZGSUzXxclQYNGlT5Xqjuta0pT7Jw8ODBCmlefc/KK/2v9uPHjys+Pr7Gt6vqvfv3v/9dR48e1euvv15uBIEk3XzzzV453caJ29zJz5lpmjpw4ECdXpOqXH/99TVuJE+lSZMmmj59unJycvTII4/o3nvvLZt46XQ+UzzpmtPprDA5UG1na/Xc77Rp06r8fjlZq1at9Oqrr8rtdmvTpk1avHix/vnPf+q2225T48aNy4ba19XBgwf1r3/9Sz169NCKFSvKJbtZWVkVmv/a1JaYmKhnn31W//znP7Vt2zZ9+eWXevbZZzVjxgyFh4fr7rvvrrY2b34f1sVvfvMbSb4Z6g1YhWMuEfK2b9+ud955R5GRkfrd735Xp/uKiorSf//7X40YMUJPPfVU2S+sVYmPj9dFF12kF198Uddff70OHDigVatWlV1us9lq9Kt9ZXbt2qWEhIQKX6QFBQVat27dad3nqeqtTH5+vv7zn/8oJiZGN954Y6V/PXr00MGDB/XRRx9Ve1+e41cr+8U+PT293KyYUumOWLt27bRz585K0xLPjwremA0wLCzstF+rYFHZsU+enakVK1bU6D48Q1wXL158yuv26tVLBQUFZUNpT+SN19bzfvvmm28qXFbZstNR3fvG89x5hsfWlWdYsmdGWA/TNCvdpjxpUG3e157jZCs7PcmqVavkcDi8Nvtmffu///s/tWzZUs8//3zZqUI8pzP6/vvvK5wKRqr8feeZCfnkzyC3211pU1Pd83722WfLMIwab08nstlsOuuss3TnnXeWHau7cOHCWt9PVX7++WeZpqmhQ4dWGDJ8qu2lprUZhqHOnTvrtttu05IlS6q83slq+314Ou/9mjh69KgklRsqDAQbmkuEtO+++07Dhw9XUVGR7rrrrhoNxTuVyMhIffDBB7r00ksrPRXC119/XekXlieBOfF0FAkJCUpPTz+tOlq3bq2jR4/qhx9+KFvmcrk0ffp0HTp0qMb3U5t6K/Puu+8qNzdXY8eO1bx58yr98wyHPdXEPueff75atWqlRYsWVdi5uu+++yqtc8KECSopKdHdd98t0zTLlm/atEmvvvqqGjZsWDZtf10kJCQoOzu7zuc/9HcPPfRQufPBepimqccff1xS+WNib7jhBsXHx+uee+4p9170KCgoKNc8TZgwQXFxcXrqqacqPTbvxB10zyQ8d999d7mhwPv27dPTTz8tu92ua665pvYP8lfjx49XWFiYnn766XIJ6fHjxytMtHS6qnvf3HrrrbLb7ZoyZUqFH06k0mMRKztnbVU8SeLJp1t5/PHHKz0/Y0JCgiRV+npXZfz48bLb7Xr66afLHV9XXFysv/71r5LktYSxvkVHR+uvf/2rSkpK9PDDD0sqPdbw6quvVnZ2th577LFy1//ss8+UlpamDh06lJswyjMi5uSRAk8//XS5Yfwe1T3vzZs317hx47R8+XL97W9/K/eZ5rFq1aqyxveHH36oNGX1LDvV53dteN5fy5cvL9c8paenV5os1rS2PXv2VHou4No8htp+H57Oe/9UHA6Hnn/+eUmlx5sCwYphsQgJnpkApdKdnIMHD2r16tXavHmzwsLCdO+992rGjBleW19ERITef/99XXHFFXrmmWdkmmbZsKqpU6cqMzNT559/vtq0aSPDMPTtt99q9erVOuecc8rtmA8ePFjvvPOOxowZo169eiksLEyjRo1Sjx49TlnDlClTtHjxYp1//vkaN26coqKi9NVXXykjI0MD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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "node_colors = []\n", + "for n in G.nodes():\n", + " if n == 'A':\n", + " node_colors.append('gray')\n", + " elif n == 'B':\n", + " node_colors.append('green')\n", + " else:\n", + " node_colors.append('skyblue')\n", + "\n", + "edge_colors = []\n", + "for u, v in G.edges():\n", + " if (u == 'B' and v in ['C', 'D']) or (v == 'B' and u in ['C', 'D']):\n", + " edge_colors.append('red')\n", + " else:\n", + " edge_colors.append('black')\n", + "\n", + "plt.figure(figsize=(9, 4))\n", + "nx.draw(\n", + " G, pos,\n", + " with_labels=True,\n", + " node_color=node_colors,\n", + " edge_color=edge_colors,\n", + " node_size=2000,\n", + " font_size=12,\n", + " width=2\n", + ")\n", + "\n", + "edge_labels = nx.get_edge_attributes(G, 'weight')\n", + "nx.draw_networkx_edge_labels(\n", + " G, pos,\n", + " edge_labels=edge_labels,\n", + " font_size=12,\n", + " rotate=False\n", + ")\n", + "\n", + "plt.title(\"Dijkstra’s Algorithm - Second Iteration - Routes Pass at B\", fontsize=14)\n", + "plt.axis(\"off\")\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "2f785116", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Node Distance from A Previous Node\n", + "0 A 0.0 None\n", + "1 B 4.0 A\n", + "2 C 6.0 B\n", + "3 D NaN None\n", + "4 E NaN None\n", + "5 F NaN None\n" + ] + } + ], + "source": [ + "data = [\n", + " {\"Node\": \"A\", \"Distance from A\": 0, \"Previous Node\": None},\n", + " {\"Node\": \"B\", \"Distance from A\": 4, \"Previous Node\": \"A\"},\n", + " {\"Node\": \"C\", \"Distance from A\": 6, \"Previous Node\": \"B\"},\n", + " {\"Node\": \"D\", \"Distance from A\": None,\"Previous Node\": None},\n", + " {\"Node\": \"E\", \"Distance from A\": None, \"Previous Node\": None},\n", + " {\"Node\": \"F\", \"Distance from A\": None, \"Previous Node\": None},\n", + "]\n", + "\n", + "df = pd.DataFrame(data)\n", + "print(df)" + ] + }, + { + "cell_type": "markdown", + "id": "6431bac5", + "metadata": {}, + "source": [ + "# Final table for point A" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "efe970da", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Node Distance from A Previous Node\n", + " A 0 -\n", + " B 4 A\n", + " C 6 B\n", + " D 10 B\n", + " E 10 C\n", + " F 13 E\n" + ] + } + ], + "source": [ + "distances, paths = nx.single_source_dijkstra(G, source='A', weight='weight')\n", + "\n", + "results = []\n", + "for node in G.nodes():\n", + " if node == 'A':\n", + " prev_node = '-'\n", + " else:\n", + " path_to_node = paths[node]\n", + " prev_node = path_to_node[-2] if len(path_to_node) > 1 else '-'\n", + " \n", + " results.append({\n", + " 'Node': node,\n", + " 'Distance from A': distances[node],\n", + " 'Previous Node': prev_node\n", + " })\n", + "\n", + "df = pd.DataFrame(results).sort_values('Node')\n", + "print(df.to_string(index=False))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cabf8001-4bb1-4be3-90bc-9aab8f678855", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [conda env:generalml_p311_cpu_x86_64_v1]", + "language": "python", + "name": "conda-env-generalml_p311_cpu_x86_64_v1-py" + }, + "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.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/data-platform/data-science/oracle-data-science/operational-research/files/flight_planning.ipynb b/data-platform/data-science/oracle-data-science/operational-research/files/flight_planning.ipynb new file mode 100644 index 000000000..d9a8b0fa2 --- /dev/null +++ b/data-platform/data-science/oracle-data-science/operational-research/files/flight_planning.ipynb @@ -0,0 +1,199 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8cabf020", + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "source": [ + "# Flight Planning" + ] + }, + { + "cell_type": "markdown", + "id": "974e02c0", + "metadata": {}, + "source": [ + "## Problem Description" + ] + }, + { + "cell_type": "markdown", + "id": "089be86d", + "metadata": {}, + "source": [ + "- An airline has limited aircraft hours and wants to decide how many flights to schedule on two routes: A and B.\n", + "\n", + "- Profit Information:\\\n", + " Route A: Profit=50k, hours=2 \\\n", + " Route B: Profit=40k, hours=1\n", + "\n", + "- Constraints:\\\n", + " Total flight hours=8\\\n", + " Total number of flights=5\n", + "\n", + "- Decision Variables:\\\n", + " x = number of flights on Route A\\\n", + " y = number of flights on Route B\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "976a525e", + "metadata": {}, + "source": [ + "## Mathematical formulation" + ] + }, + { + "cell_type": "markdown", + "id": "bd5b1911", + "metadata": {}, + "source": [ + "Target function:\\\n", + "$profit=50x+40y$\n", + "$$argmax_{x,y} profit$$\n", + "\n", + "Linear constraints:\n", + "- $x>=0$\n", + "- $y>=0$\n", + "- $2x+y<=8$\n", + "- $x+y<=5$" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fbd79efa", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhwAAAIhCAYAAAAFGmMPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABfwElEQVR4nO3dd1gU59oG8Ht2WXbpTaVIFxTFLtgL9sQSu7HGaOIxsaJJjsYUNZ81OTEau8YWe4w1JlGxgUaMvcReELsoKr3vfH8soERQkJ2dZbl/18UlM8zOPPtS9vaZd2YFURRFEBEREUlIIXcBREREZPoYOIiIiEhyDBxEREQkOQYOIiIikhwDBxEREUmOgYOIiIgkx8BBREREkmPgICIiIskxcBAREZHkGDjolVasWAFBEPL9+PTTT2Wra+LEiRAEIc86b29vdOjQ4bWPvXnzJgRBwIoVK/RWj7e3d56xsbKyQu3atTF37lxIfTPfAwcOQBAEHDhwQNLjFNecOXPg5+cHc3NzCIKAZ8+e5btdzs/c8ePHC9yXFN9DOdy4cQPDhw9HxYoVYWFhAUtLSwQGBuLLL7/E3bt3Za3twoULmDhxIm7evCnJ/vP7HS4sqWsjaZjJXQCVDMuXL0dAQECedW5ubjJVA3z44Yd46623ZDt+fho1aoT//e9/AIB79+5h5syZGDFiBOLj4zF+/HjJjlu7dm1ERkaiSpUqkh2juE6fPo2RI0fiww8/xIABA2BmZgYbG5s33p+rqysiIyNRoUIFPVZpWDt27ECvXr1QpkwZDB8+HLVq1YIgCDh37hyWLVuG33//HadOnZKtvgsXLmDSpEkICQmBt7e33vdfnN9hqWsjaTBwUKFUrVoVQUFBcpeRy93dHe7u7nKXkYe9vT3q16+fu9yqVSt4enpi0aJFkgYOW1vbPMc1RufPnwcADB48GHXr1i32/tRqtdE/5+TkZFhaWub7taioKPTq1QsVK1bE/v37YWdnl/u1Fi1aYOTIkdiyZYuhStWLVz3f/Bjj7zBJi6dUSC82bNiABg0awMrKCtbW1mjbtu1L/zs7fvw4evXqBW9vb1hYWMDb2xu9e/dGdHR0nu2Sk5Px6aefwsfHBxqNBo6OjggKCsK6detyt3lVO3bLli2oXr06NBoNfH198eOPPxbqOVy9ehV9+vRBuXLloFarUblyZcybN6+II/Gcra0tKlasiIcPH+ZZn56ejsmTJyMgIABqtRply5bFwIED8ejRozzbpaWl4ZNPPoGLiwssLS3RtGlTnDhxAt7e3nj//fdztyvolMr27dvRoEEDWFpawsbGBq1bt0ZkZGSebXLG8fz58+jduzfs7Ozg7OyMQYMGIS4urlDPc9myZahRo0bu96pLly64ePFi7tdDQkLQr18/AEC9evUgCEKe+t9EfqdUivJcRFHE/PnzUbNmTVhYWMDBwQHdu3fHjRs38mwXFhaGTp06wd3dHRqNBn5+fhgyZAgeP36cZ7ucY588eRLdu3eHg4PDK7svM2fORFJSEubPn58nbOQQBAFdu3bNs+514wwA77//PqytrXHt2jW0a9cO1tbW8PDwwCeffIK0tLQ82y5YsAA1atSAtbU1bGxsEBAQkBuMV6xYgR49egAAmjdvnnuqMGe8Q0JCULVqVURERKBhw4awtLTEoEGDAOj+FrRp0waurq6wsLBA5cqVMW7cOCQlJeU7Zi/KOS26c+dO1K5dGxYWFggICMCyZctyt3ldbadOnUKHDh1yf4/d3NzQvn173Llzp8DvBxkGAwcVSlZWFjIzM/N85Jg6dSp69+6NKlWq4JdffsGqVauQkJCAJk2a4MKFC7nb3bx5E5UqVcKsWbOwa9cuzJgxA/fv30dwcHCeP+BjxozBggULMHLkSOzcuROrVq1Cjx49EBsb+9o6T58+jdDQUIwePRpbtmxBw4YNMWrUqNxTHQW5cOECgoOD8c8//+D777/Hjh070L59e4wcORKTJk16gxEDMjMzcfv2bVSsWDF3nVarRadOnTB9+nT06dMHv//+O6ZPn46wsDCEhIQgJSUld9uBAwdi1qxZGDhwILZt24Zu3bqhS5cuBc59eNHatWvRqVMn2NraYt26dVi6dCmePn2KkJAQHDp06KXtu3XrhooVK2LTpk0YN24c1q5di9GjR7/2ONOmTcMHH3yAwMBAbN68GbNnz8bZs2fRoEEDXL16FQAwf/58fPnllwB0p+YiIyPx1VdfvXbfb6owz2XIkCEIDQ1Fq1atsHXrVsyfPx/nz59Hw4YN8wTE69evo0GDBliwYAF2796Nr7/+Gn///TcaN26MjIyMl47dtWtX+Pn5YePGjVi4cGGBNe7evRvOzs6F7tIUZpxzZGRk4J133kHLli2xbds2DBo0CD/88ANmzJiRu8369esxdOhQNGvWDFu2bMHWrVsxevTo3FDQvn17TJ06FQAwb948REZGIjIyEu3bt8/dx/3799GvXz/06dMHf/zxB4YOHQpAF9zbtWuHpUuXYufOnQgNDcUvv/yCjh07Fuq5njlzBp988glGjx6Nbdu2oXr16vjggw8QERHx2tqSkpLQunVrPHz4EPPmzUNYWBhmzZoFT09PJCQkFOr4JCGR6BWWL18uAsj3IyMjQ7x165ZoZmYmjhgxIs/jEhISRBcXF7Fnz54F7jszM1NMTEwUraysxNmzZ+eur1q1qti5c+dX1jVhwgTx3z++Xl5eoiAI4unTp/Osb926tWhraysmJSWJoiiKUVFRIgBx+fLludu0bdtWdHd3F+Pi4vI8dvjw4aJGoxGfPHnyynq8vLzEdu3aiRkZGWJGRoYYHR0tDh48WFSpVOKOHTtyt1u3bp0IQNy0aVOexx87dkwEIM6fP18URVE8f/68CEAcO3Zsnu1yHj9gwIDcdfv37xcBiPv37xdFURSzsrJENzc3sVq1amJWVlbudgkJCWK5cuXEhg0b5q7LGcdvv/02z3GGDh0qajQaUavVFvicnz59KlpYWIjt2rXLs/7WrVuiWq0W+/Tpk7su5+fo2LFjBe6vKNvm9z0s7HOJjIwUAYjff/99nu1u374tWlhYiP/973/zPaZWq8393gIQt23b9tKxv/7669c+P1EURY1GI9avX79Q2xZlnAcMGCACEH/55Zc827Zr106sVKlS7vLw4cNFe3v7Vx5348aNeX6uXtSsWTMRgLh3795X7iNnzMLDw0UA4pkzZ3K/VtDvsEajEaOjo3PXpaSkiI6OjuKQIUNeW9vx48dFAOLWrVtfWRfJgx0OKpSff/4Zx44dy/NhZmaGXbt2ITMzE++9916e7odGo0GzZs3ytPkTExMxduxY+Pn5wczMDGZmZrC2tkZSUlKe1nDdunXx559/Yty4cThw4ECe//W/TmBgIGrUqJFnXZ8+fRAfH4+TJ0/m+5jU1FTs3bsXXbp0gaWlZZ7n0a5dO6SmpuLIkSOvPfYff/wBlUoFlUoFLy8vLFmyBHPmzMnzv8IdO3bA3t4eHTt2zHOcmjVrwsXFJXe8wsPDAQA9e/bMc4zu3bvDzOzVU68uX76Me/fuoX///lAonv+KW1tbo1u3bjhy5AiSk5PzPOadd97Js1y9enWkpqYiJiamwONERkYiJSXlpdMjHh4eaNGiBfbu3fvKOqXyuueyY8cOCIKAfv365fkeuLi4oEaNGnl+ZmNiYvDRRx/Bw8MDZmZmud9bAC+dzgB03RV9K+o4C4LwUjehevXqeU5d1q1bF8+ePUPv3r2xbdu2l04RFYaDgwNatGjx0vobN26gT58+cHFxgVKphEqlQrNmzQDkP2b/VrNmTXh6euYuazQaVKxY8aVTr/nx8/ODg4MDxo4di4ULF+bpsJL8OGmUCqVy5cr5ThrNaT8HBwfn+7gXX/D69OmDvXv34quvvkJwcDBsbW0hCALatWuXJ1T8+OOPcHd3x4YNGzBjxgxoNBq0bdsW3333Hfz9/V9Zp4uLS4HrCjolExsbi8zMTMyZMwdz5szJd5vC/EFu3LgxfvjhB2RlZeHq1av46quvMHz4cAQGBqJx48YAdOP17NkzmJubv/I4ObU6Ozvn+bqZmRmcnJxeWUfOY11dXV/6mpubG7RaLZ4+fZpngt+/96lWqwHglWHvdccJCwt7ZZ1Sed1zefjwIURRfGlsc/j6+gLQnf5q06YN7t27h6+++grVqlWDlZUVtFot6tevn+/Y5DcW+fH09ERUVFShti3qOFtaWkKj0eRZp1arkZqamrvcv39/ZGZmYsmSJejWrRu0Wi2Cg4MxefJktG7dulB15VdPYmIimjRpAo1Gg8mTJ6NixYqwtLTE7du30bVr10L95yG/n2+1Wl2ox9rZ2SE8PBxTpkzB+PHj8fTpU7i6umLw4MH48ssvoVKpCvXcSBoMHFQsZcqUAQD8+uuvuf/zy09cXBx27NiBCRMmYNy4cbnr09LS8OTJkzzbWllZYdKkSZg0aRIePnyY2+3o2LEjLl269Mp6Hjx4UOC6gl6oHRwcoFQq0b9/fwwbNizfbXx8fF55XED3xy4nlNWrVw/16tVDjRo1MHToUJw+fRoKhQJlypSBk5MTdu7cme8+ci4Vzan14cOHKF++fO7XMzMzXzuXJeex9+/ff+lr9+7dg0KhgIODw2ufz+u87jg5PxvGpkyZMhAEAQcPHswNIy/KWffPP//gzJkzWLFiBQYMGJD79WvXrhW478LeV6Jt27aYM2cOjhw58tp5HFKN88CBAzFw4EAkJSUhIiICEyZMQIcOHXDlypVX/i7nyO+57tu3D/fu3cOBAwdyuxoACjXvSF+qVauG9evXQxRFnD17FitWrMA333wDCwuLPH97yPB4SoWKpW3btjAzM8P169cRFBSU7weg++MkiuJLf+B/+uknZGVlFbh/Z2dnvP/+++jduzcuX7780qmAfzt//jzOnDmTZ93atWthY2OD2rVr5/sYS0tLNG/eHKdOnUL16tXzfQ6v6yrkx9/fH//9739x7tw5bNiwAQDQoUMHxMbGIisrK9/jVKpUCQDQtGlTAMh9XI5ff/01z4Td/FSqVAnly5fH2rVr89x0LCkpCZs2bcq9cqW4GjRoAAsLC6xevTrP+jt37mDfvn1o2bJlsY8hhQ4dOkAURdy9ezff70G1atUAPH9B/ffP7KJFi4pdw+jRo2FlZYWhQ4fmezWQKIq5l8VKPc5WVlZ4++238cUXXyA9PT33EubCdLn+Tcoxe1FhahMEATVq1MAPP/wAe3v7Ak+pkuGww0HF4u3tjW+++QZffPEFbty4gbfeegsODg54+PAhjh49mtutsLW1RdOmTfHdd9+hTJky8Pb2Rnh4OJYuXQp7e/s8+6xXrx46dOiA6tWrw8HBARcvXsSqVasK9ULp5uaGd955BxMnToSrqytWr16NsLAwzJgx45WPnT17Nho3bowmTZrg448/hre3NxISEnDt2jX89ttv2Ldv3xuNz6effoqFCxdi0qRJ6NmzJ3r16oU1a9agXbt2GDVqFOrWrQuVSoU7d+5g//796NSpE7p06YLAwED07t0b33//PZRKJVq0aIHz58/j+++/h52dXZ5TVf+mUCjw7bffom/fvujQoQOGDBmCtLQ0fPfdd3j27BmmT5/+Rs/l3+zt7fHVV19h/PjxeO+999C7d2/ExsZi0qRJ0Gg0mDBhQrH2v2/fvnzvJNmuXbti7bdRo0b4z3/+g4EDB+L48eNo2rQprKyscP/+fRw6dAjVqlXDxx9/jICAAFSoUAHjxo2DKIpwdHTEb7/9ppdTRT4+Pli/fj3effdd1KxZM/fGX4Duiqlly5ZBFEV06dJFknEePHgwLCws0KhRI7i6uuLBgweYNm0a7Ozsck+PVq1aFQCwePFi2NjYQKPRwMfH55Xhu2HDhnBwcMBHH32ECRMmQKVSYc2aNS/9J6C4CqotMjIS8+fPR+fOneHr6wtRFLF582Y8e/as0KeKSEKyTVelEqGwVxds3bpVbN68uWhrayuq1WrRy8tL7N69u7hnz57cbe7cuSN269ZNdHBwEG1sbMS33npL/Oeff0QvL688V12MGzdODAoKEh0cHES1Wi36+vqKo0ePFh8/fpy7TUEz3Nu3by/++uuvYmBgoGhubi56e3uLM2fOzLNdflc45KwfNGiQWL58eVGlUolly5YVGzZsKE6ePPm145Rz7PzMmzdPBCCuXLlSFEVRzMjIEP/3v/+JNWrUEDUajWhtbS0GBASIQ4YMEa9evZr7uNTUVHHMmDFiuXLlcq9qiIyMFO3s7MTRo0fnbvfvq1RybN26VaxXr56o0WhEKysrsWXLluJff/2VZ5uccXz06FGe9Tnf96ioqNc+959++kmsXr26aG5uLtrZ2YmdOnUSz58/n+/+inKVSkEfUVFRr7xKpbDPZdmyZWK9evVEKysr0cLCQqxQoYL43nvvicePH8/d5sKFC2Lr1q1FGxsb0cHBQezRo4d469YtEYA4YcKE1x77da5fvy4OHTpU9PPzE9VqtWhhYSFWqVJFHDNmzEv1FmacBwwYIFpZWb10nH//vqxcuVJs3ry56OzsLJqbm4tubm5iz549xbNnz+Z53KxZs0QfHx9RqVTmGe9mzZqJgYGB+T6nw4cPiw0aNBAtLS3FsmXLih9++KF48uTJAr9fLyro96hZs2Zis2bNXlvbpUuXxN69e4sVKlQQLSwsRDs7O7Fu3briihUr8q2VDEsQRYnf6IGI9Obw4cNo1KgR1qxZgz59+shdDhFRoTFwEBmpsLAwREZGok6dOrCwsMCZM2cwffp02NnZ4ezZsy9diUBEZMw4h4PISNna2mL37t2YNWsWEhISUKZMGbz99tuYNm0awwYRlTjscBAREZHkZL0sNiIiAh07doSbmxsEQcDWrVvzfF0URUycOBFubm6wsLBASEhI7iVbREREVHLIGjiSkpJQo0YNzJ07N9+vf/vtt5g5cybmzp2LY8eOwcXFBa1bt+ab8BAREZUwRnNKRRAEbNmyBZ07dwag6264ubkhNDQUY8eOBaC7K6WzszNmzJiBIUOGyFgtERERFYXRThqNiorCgwcP0KZNm9x1arUazZo1w+HDhwsMHGlpaUhLS8td1mq1ePLkCZycnAp922EiIiLS/ec/ISEBbm5ur7zhYGEYbeDIef+Lf7/BkrOz8yvfNXDatGmYNGmSpLURERGVJrdv34a7u3ux9mG0gSPHv7sSoii+slPx+eefY8yYMbnLcXFx8PT0xJUrV+Do6ChZnfRcRkYG9u/fj+bNm/PdGQ2EY254HHPD45gb3pMnT1CxYsXcN5YsDqMNHDlvKf7gwYM8b4McExNT4NtKA7rTLvm9A6Sjo+MbvQEXFV1GRgYsLS3h5OTEPwoGwjE3PI654XHM5aOPKQlG+26xPj4+cHFxyfNGSenp6QgPD0fDhg1lrIyIiIiKStYOR2JiIq5du5a7HBUVhdOnT8PR0RGenp4IDQ3F1KlT4e/vD39/f0ydOhWWlpZ8DwkiIqISRtbAcfz4cTRv3jx3OWfuxYABA7BixQr897//RUpKCoYOHYqnT5+iXr162L17t17OJREREZHhyBo4QkJC8KrbgAiCgIkTJ2LixImGK4qIiAokiiIyMzORlZVl8GNnZGTAzMwMqampshzfFCmVSpiZmRnkthFGO2mUiIiMS3p6Ou7fv4/k5GRZji+KIlxcXHD79m3eV0mPLC0t4erqCnNzc0mPw8BBRESvpdVqERUVBaVSCTc3N5ibmxv8RV+r1SIxMRHW1tbFvgkV6QJceno6Hj16hKioKPj7+0s6rgwcRET0Wunp6dBqtfDw8IClpaUsNWi1WqSnp0Oj0TBw6ImFhQVUKhWio6Nzx1Yq/I4REVGh8YXe9Bjqe8qfHCIiIpIcAwcRERFJjoGDiIiIJMfAQURERJJj4CAiIpM2bdo0BAcHw8bGBuXKlUPnzp1x+fJlucuSRGZmJr788kv4+PjAwsICvr6++Oabb6DVauUujYGDiIhMW3h4OIYNG4YjR44gLCwMmZmZaNOmDZKSkoq975CQEKxYsaL4RerJjBkzsHDhQsydOxcXL17Et99+i++++w5z5syRuzQGDiIiKjpRFJGcnmnwj5T0rFe+JUZ+du7ciffffx+BgYGoUaMGli9fjlu3buHEiRMAgHXr1kGj0eDu3bu5j/nwww9RvXp1xMXF6W3M3N3dMX/+/DzrDh8+DEtLS0RHR+vlGJGRkejUqRPat28Pb29vdO/eHW3atMHx48f1sv/i4I2/iIioyFIyslDl612yHPufia1hrVS+8eNzQoSjoyMAoFevXpg+fTqmTZuGuXPnYtKkSdi1axeOHDkCOzs7vdQMAPXr18exY8dyl0VRRGhoKEJDQ+Hl5ZVn26lTp2Lq1Kmv3N+ff/6JJk2a5FnXuHFjLFy4EFeuXEHFihVx5swZHDp0CLNmzdLb83hTDBxERFRqiKKIMWPGoHHjxqhatSoA3RuFTpkyBd27d4ebmxtmz56NgwcPonz58no9dv369fOcflm1ahVu3bqFzz///KVtP/roI/Ts2fOV+8uvvrFjxyIuLg4BAQFQKpXIysrClClT0Lt372LXX1wMHEREVGQWKiUufNPWoMfUarVIiE+AherNuxvDhw/H2bNncejQoTzrO3TogCpVqmDSpEnYvXs3AgMD8338vzsPKSkpOHLkCIYPH567Lr/OA6ALHGPHjkViYiIUCgXGjx+PyZMnw8bG5qVtHR0dczswRbFhwwasXr0aa9euRWBgIE6fPo3Q0FC4ublhwIABRd6fPjFwEBFRkQmCAEtzw76EaLVaZJor3/hN40aMGIHt27cjIiIC7u7ueb62a9cuXLp0CVlZWXB2di5wH//uPPTt2xfdunVD165dc9cV1BkJCgqCUqnEyZMnsWfPHjg5OWHQoEH5bvump1Q+++wzjBs3Dr169QIAVKtWDdHR0Zg2bRoDBxERkZREUcSIESOwZcsWHDhwAD4+Pnm+fvLkSfTo0QOLFi3C+vXr8dVXX2Hjxo357uvfnQcLCwuUK1cOfn5+r61Do9GgRo0a2Lx5MxYvXozffvutwPcxedNTKsnJyS/tU6lUGsVlsQwcRERk0oYNG4a1a9di27ZtsLGxwYMHDwAAdnZ2ePjwIdq3b49x48ahf//+qFKlCoKDg3HixAnUqVNH77XUr18fP/74Izp06ICWLVsWuN2bnlLp2LEjpkyZAk9PTwQGBuLUqVOYOXNmgZ0UQ2LgICIik7ZgwQIAuntmvOj777/HkiVL8M4772D8+PEAgDp16qBjx4744osvsHPnTr3XUrNmTZiZmeG7777T+74BYM6cOfjqq68wdOhQxMTEwM3NDUOGDMHXX38tyfGKgoGDiIhM2qvu2zFmzJiX1m3btq3Q+z5w4ECRalmzZg2GDh2KSpUqFelxhWVjY4NZs2YZxWWw/8bAQUREJCGtVotHjx5h6dKluHz5MrZs2SJ3SbJg4CAiIpJQREQEWrRogYCAAGzevFmvNxMrSRg4iIiIJBQSEmIUV4nIje+lQkRERJJj4CAiIiLJMXAQERGR5Bg4iIiISHIMHERERCQ5Bg4iIiKSHAMHERERSY6Bg4iIiCTHwEFERESSY+AgIiIiyTFwEBERlQATJ06EIAh5PlxcXOQuq9AYOIiIiAoQEhKCFStWyF1GrsDAQNy/fz/349y5c3KXVGgMHEREVHSiCKQnGf4jI1l37CJYt24dNBoN7t69m7vuww8/RPXq1REXF6eX4XB3d8f8+fPzrDt8+DAsLS0RHR2tl2MAgJmZGVxcXHI/ypYtq7d9S43vFktEREWXkQxMdTPoIRUA7AFox90BlDaFflyvXr0wffp0TJs2DXPnzsWkSZOwa9cuHDlyRG9vFV+/fn0cO3Ysd1kURYSGhiI0NBReXl55tp06dSqmTp36yv39+eefaNKkyUvrr169Cjc3N6jVatSrVw9Tp06Fr6+vXp6D1Bg4iIjIpAmCgClTpqB79+5wc3PD7NmzcfDgQZQvX15vx6hfv36eUy+rVq3CrVu38Pnnn7+07UcffYSePXu+cn/51VavXj38/PPPqFixIh4+fIjJkyejYcOGOH/+PJycnIr9HKTGwEFEREWnsgTG3zPoIbVaLeITEmCrsizyYzt06IAqVapg0qRJ2L17NwIDA/Pd7t/dh5SUFBw5cgTDhw/PXZdf96F+/foYO3YsEhMToVAoMH78eEyePBk2Ni93YhwdHeHo6Fjk5/D222/nfl6tWjU0aNAAFSpUwMqVKzFmzJgi78/QGDiIiKjoBAEwtzLsMbVaQJWlO3YR7dq1C5cuXUJWVhacnZ0L3O7f3Ye+ffuiW7du6Nq1a+66/LoPQUFBUCqVOHnyJPbs2QMnJycMGjQo32MU55TKi6ysrFCtWjVcvXr1ldsZCwYOIiIyaSdPnkSPHj2waNEirF+/Hl999RU2btyY77b/7j5YWFigXLly8PPze+UxNBoNatSogc2bN2Px4sX47bffoFDkf13Gm55S+be0tDRcvHjxtcHEWDBwEBGRybp58ybat2+PcePGoX///qhSpQqCg4Nx4sQJ1KlTR6/Hql+/Pn788Ud06NABLVu2LHC7Nz2l8umnn6Jjx47w9PRETEwMJk+ejPj4eAwYMKA4ZRsML4slIiKT9OTJE7z99tt45513MH78eABAnTp10LFjR3zxxRd6P17NmjVhZmaG7777Tu/7BoA7d+6gd+/eqFSpErp27Qpzc3McOXLkpatgjBU7HEREZJIcHR1x8eLFl9Zv27at0Ps4cOBAobdds2YNhg4dikqVKhX6MUWxfv16SfZrKAwcREREb0ir1eLRo0dYunQpLl++jC1btshdktFi4CAiInpDERERaNGiBQICArB582a93UjMFDFwEBERvaGQkBBotVq5yygROGmUiIiIJMfAQURERJJj4CAiIiLJMXAQEVGhiUV8a3gyfob6njJwEBHRa6lUKgBAcnKyzJWQvuV8T3O+x1LhVSpERPRaSqUS9vb2iImJAQBYWlpCeIM3USsOrVaL9PR0pKamFvg+JVR4oigiOTkZMTExsLe3h1KplPR4DBxERFQoLi4uAJAbOgxNFEWkpKTAwsLC4GHHlNnb2+d+b6XEwEFERIUiCAJcXV1Rrlw5ZGRkGPz4GRkZiIiIQNOmTSVv/5cWKpVK8s5GDgYOIiIqEqVSabAXqX8fNzMzExqNhoGjBOJJMCIiIpIcAwcRERFJjoGDiIiIJMfAQURERJJj4CAiIiLJMXAQERGR5Bg4iIiISHIMHERERCQ5Bg4iIiKSHAMHERERSY6Bg4iIiCTHwEFERESSY+AgIiIiyTFwEBERkeQYOIiIiEhyDBxEREQkOQYOIiIikhwDBxEREUmOgYOIiIgkx8BBREREkmPgICIiIskxcBAREZHkGDiIiIhIcgwcREREJDkGDiIiIpIcAwcRERFJzqgDR2ZmJr788kv4+PjAwsICvr6++Oabb6DVauUujYiIiIrATO4CXmXGjBlYuHAhVq5cicDAQBw/fhwDBw6EnZ0dRo0aJXd5REREVEhGHTgiIyPRqVMntG/fHgDg7e2NdevW4fjx4zJXRkREREVh1IGjcePGWLhwIa5cuYKKFSvizJkzOHToEGbNmlXgY9LS0pCWlpa7HB8fDwBITk2DbUaG1CUTgIzscc7geBsMx9zwOOaGxzE3PH2OtSCKoqi3vemZKIoYP348ZsyYAaVSiaysLEyZMgWff/55gY+ZOHEiJk2a9NL60bPXoZmXhZTlEhERmZTk5GT06dMHcXFxsLW1Lda+jLrDsWHDBqxevRpr165FYGAgTp8+jdDQULi5uWHAgAH5Pubzzz/HmDFjcpfj4+Ph4eGBw08sMfk/baFSGvU8WZOQkZGBsLAwtG7dGiqVSu5ySgWOueFxzA2PY254sbGxetuXUQeOzz77DOPGjUOvXr0AANWqVUN0dDSmTZtWYOBQq9VQq9Uvrb8Xl4btZx+iV11PSWum51QqFf8oGBjH3PA45obHMTccfY6zUf93Pzk5GQpF3hKVSuUbXxY7d/81pGfykloiIiJDM+rA0bFjR0yZMgW///47bt68iS1btmDmzJno0qVLkfdVxkqFO09TsOnkHQkqJSIiolcx6sAxZ84cdO/eHUOHDkXlypXx6aefYsiQIfi///u/Iu/r/UZeAIC5+9jlICIiMjSjDhw2NjaYNWsWoqOjkZKSguvXr2Py5MkwNzcv8r661SqPcjZq3H2Wgo0nbktQLRERERXEqAOHPmlUSnwcUgEAMG/fNaRlZslcERERUelRagIHAPSu6wlnWzXuxaXil+Ocy0FERGQopSpwaFRKDA3xAwDM388uBxERkaGUqsABAO8Ge8DFVoP7can45RjnchARERlCqQscGpUSw5pnz+XYfx2pGexyEBERSa3UBQ4A6BnsAVc7DR7Ep2IDuxxERESSK5WBQ22mxNDm2XM5Dlxjl4OIiEhipTJwAEDPIHe42WnwMD4N647ekrscIiIik1ZqA4faTIlhLXRdjgUHOJeDiIhISqU2cABAjzoeKG9vgZiENKz9m10OIiIiqZTqwGFupsDwnC5HOLscREREUinVgQMAutV2R3l7CzxKSMPqI9Fyl0NERGSSSn3gMDdTYER2l2Nh+A2kpLPLQUREpG+lPnAAQLc67vBwtMDjRHY5iIiIpMDAAUClVGBEc38AwKKI60hOz5S5IiIiItPCwJGtS+3y8HS0xOPEdHY5iIiI9IyBI5tK+Xwux6LwG+xyEBER6REDxwu61CoPLydLxCal4+dIdjmIiIj0hYHjBWZKBUa00M3lWBxxA0lp7HIQERHpAwPHv3Su6QafMlZ4wi4HERGR3jBw/IvZC3M5FkdcRyK7HERERMXGwJGPd2q4wbeMFZ4mZ2Dl4Ztyl0NERFTiMXDkw0ypwMiWurkcSw7eQEJqhswVERERlWwMHAXoWMMNvmWt8IxdDiIiomJj4CiAUiFgVG6XIwrx7HIQERG9MQaOV+hQ3Q1+5awRl5KBlX/dlLscIiKiEouB4xWUCiHPXA52OYiIiN4MA8drtK/mCv9y1ohPzcTyQzflLoeIiKhEYuB4DaVCwKhWui7HT4duIC6FXQ4iIqKiYuAohHZVXVHR2RoJqZlYdihK7nKIiIhKHAaOQlAoBIxqWREAsOxQFOKS2eUgIiIqCgaOQnq7qgsCXGyQkJaJpX+xy0FERFQUDByFpHjhvhzL2eUgIiIqEgaOImgb+LzL8dOhG3KXQ0REVGIwcBSBQiEgtJVuLsfyv27iWXK6zBURERGVDAwcRdSmijMqu9oiMS0TSw6yy0FERFQYDBxFpOty6OZyrPjrJp4ksctBRET0Ogwcb6BNFWcEutkiKT0LP7HLQURE9FoMHG9AEJ7P5Vh5mF0OIiKi12HgeEOtKpdDtfJ2SErPwuIIdjmIiIhehYHjDem6HLq5HD9H3kRsYprMFRERERkvBo5iaBFQDtXd7ZDMLgcREdErMXAUQ94uRzQes8tBRESULwaOYmpeqRxqeNgjJYNdDiIiooIwcBTTv+dyPEpgl4OIiOjfGDj0IKRiWdT0sEdqhhaLwq/LXQ4REZHRYeDQgxe7HKv/jkZMQqrMFRERERkXBg49aVaxLGp56rocCw9wLgcREdGLGDj0RBAEjM6+++iav6MRE88uBxERUQ4GDj1q4l8GdbwckJapxQLO5SAiIsrFwKFHebsct/CQXQ4iIiIADBx618jPCcHeDkjP1GLBAXY5iIiIAAYOvXvxnWTXHr2FB3HschARETFwSKBhBSfU9XZEeqYW8w9ck7scIiIi2TFwSEAQBIS21t2XY/3R27j3LEXmioiIiOTFwCGRhhXKoJ6PI9KzOJeDiIiIgUNCo1vr5nJsOMYuBxERlW4MHBKq7+uEBr5OSM/SYt5+zuUgIqLSi4FDYjnvsfLL8du48zRZ5mqIiIjkwcAhsXq+TmhYwQkZWSLm7edcDiIiKp0YOAwgZy7HxuO3cfsJuxxERFT6MHAYQLC3Ixr7lUGmVuR9OYiIqFRi4DCQ0dn35dh4/A67HEREVOowcBhIHS9HNPHXdTnm7mOXg4iIShcGDgPKeY+VX0/ewa1YdjmIiKj0YOAwoDpeDmhasSyytCLm7LsqdzlEREQGw8BhYKOz78ux+dRd3HycJHM1REREhsHAYWC1PB0QUknX5ZjLu48SEVEpwcAhg5y5HFvY5SAiolKCgUMGNT3s0SKgHLK0In7kXA4iIioFGDhkMqqlbi7H1lN3ceNRoszVEBERSYuBQyY1POzRMqActCIwh/flICIiE8fAIaOcuRzbTt/FdXY5iIjIhDFwyKiaux1aVXbWdTn2ci4HERGZLgYOmYVm35dj+5l7uBbDLgcREZkmBg6ZVS1vhzZVdF2OH9nlICIiE8XAYQRGZXc5fjt7D1cfJshcDRERkf4xcBiBQDc7tA10higCs9nlICIiE8TAYSRyrlj5/dx9XGGXg4iITAwDh5Go7GqLt6u6sMtBREQmiYHDiOTM5fjj3H1cfsAuBxERmQ4GDiMS4GKL9tVcs7scV+Quh4iISG+MPnDcvXsX/fr1g5OTEywtLVGzZk2cOHFC7rIkM7KlPwQB+OPcA1y8Hy93OURERHph1IHj6dOnaNSoEVQqFf78809cuHAB33//Pezt7eUuTTKVXGzQrporAGD2Hs7lICIi02AmdwGvMmPGDHh4eGD58uW567y9veUryEBCW/rjj3P3sfP8A5y/F4dANzu5SyIiIioWow4c27dvR9u2bdGjRw+Eh4ejfPnyGDp0KAYPHlzgY9LS0pCWlpa7HB+vOy2RkZGBjIwMyWvWB29HDdpVdcHv5x5gVtgVzO9TU+6SiiRnnEvKeJsCjrnhccwNj2NuePoca0EURVFve9MzjUYDABgzZgx69OiBo0ePIjQ0FIsWLcJ7772X72MmTpyISZMmvbR+7dq1sLS0lLRefXqQDEw/o4QIAZ9Vz4S7ldwVERFRaZOcnIw+ffogLi4Otra2xdqXUQcOc3NzBAUF4fDhw7nrRo4ciWPHjiEyMjLfx+TX4fDw8MD9+/fh5OQkec36NGbjWfx29gFaBZTFgr615C6n0DIyMhAWFobWrVtDpVLJXU6pwDE3PI654XHMDS82Nhaurq56CRxGfUrF1dUVVapUybOucuXK2LRpU4GPUavVUKvVL61XqVQl7gd0VKtK+P3cA+y59AiXY5JRtXzJmstREse8pOOYGx7H3PA45oajz3E26qtUGjVqhMuXL+dZd+XKFXh5eclUkWH5lbPGOzXcAACz9vC+HEREVHIZdeAYPXo0jhw5gqlTp+LatWtYu3YtFi9ejGHDhsldmsGMbOkPhQDsuRiDc3fi5C6HiIjojRh14AgODsaWLVuwbt06VK1aFf/3f/+HWbNmoW/fvnKXZjC+Za3RuWZ5AOxyEBFRyWXUczgAoEOHDujQoYPcZchqREt/bD19F3svxeDM7Weo4WEvd0lERERFYtQdDtLxKWOFzrXY5SAiopKLgaOEGNnCH0qFgP2XH+HUradyl0NERFQkDBwlhHcZK3TJ7XLwPVaIiKhkYeAoQUa08INSISD8yiOcZJeDiIhKEAaOEsTLyQrdarPLQUREJQ8DRwkzvLk/zBQCIq48wolodjmIiKhkYOAoYTydLNGttjsAXrFCREQlBwNHCTS8hR/MFAIOXn2M4zefyF0OERHRazFwlEAejpboEaTrcvzALgcREZUADBwl1LDmflApBfx1LRZHo9jlICIi48bAUUK5O1iiR5AHAM7lICIi48fAUYLldDkOX4/F3zdi5S6HiIioQAwcJVh5ewv0zO5ycC4HEREZMwaOEm5Ycz+YKxU4cuMJIq+zy0FERMaJgaOEc7O3wLvBz7scoijKXBEREdHLGDhMwNDmFWCuVOBo1BNEci4HEREZIQYOE+BqZ4HedbOvWAm7yi4HEREZHQYOE/FxiB/MzRQ4evMJDnMuBxERGRkGDhPhYqdBn7qeAIAfwjiXg4iIjAsDhwn5OKQC1GYKHI9+ikPXHstdDhERUS4GDhPibKtBn3rschARkfFh4DAxHzfTdTlO3nqGg1fZ5SAiIuPAwGFiytlq0K++FwDel4OIiIwHA4cJGtLMFxqVAqduPUP4lUdyl0NERMTAYYrK2WjQr15Ol4P35SAiIvkxcJioIc0qQKNS4MztZzhwmV0OIiKSFwOHiSpro8Z7DbwBcC4HERHJj4HDhP2nqS8sVEqcvROH/Zdj5C6HiIhKMQYOE1bGWo33GurmcsziXA4iIpIRA4eJ+08TX1ia67ocey+yy0FERPJg4DBxTtbP53LM2su5HEREJA8GjlLgP019YWWuxD934xF24aHc5RARUSnEwFEKOFqZY0BDbwCcy0FERPJg4CglBjfxhbXaDBfux2M3uxxERGRgDBylhIOVOd5/ocuh1bLLQUREhsPAUYp82MQH1mozXLwfj90XHshdDhERlSJFDhzvv/8+IiIipKiFJGZvaY6BjbwBsMtBRESGVeTAkZCQgDZt2sDf3x9Tp07F3bt3paiLJPJhY1/YqM1w6UECdp5nl4OIiAyjyIFj06ZNuHv3LoYPH46NGzfC29sbb7/9Nn799VdkZGRIUaNeCFd3y12CUbCzVGFgYx8AwGx2OYiIyEDeaA6Hk5MTRo0ahVOnTuHo0aPw8/ND//794ebmhtGjR+Pq1av6rrPYlNuHARd3yF2GUfigsQ9sNGa4/DABf/7DLgcREUmvWJNG79+/j927d2P37t1QKpVo164dzp8/jypVquCHH37QV416IYiZEDcOAC7+JncpsrOzUOGDnC7H3ivschARkeSKHDgyMjKwadMmdOjQAV5eXti4cSNGjx6N+/fvY+XKldi9ezdWrVqFb775Rop631i0c2sI2kyIG98HLmyTuxzZDWzkA1uNGa48TMTv5+7LXQ4REZm4IgcOV1dXDB48GF5eXjh69CiOHz+Ojz76CDY2NrnbtG3bFvb29vqss9iOBn6JKLf22aFjIHB+q9wlyUrX5fAFAMzeexVZ7HIQEZGEihw4fvjhB9y7dw/z5s1DzZo1893GwcEBUVFRxa1Nr0RBiSPVpyDKrSMEMQvir4OA81vkLktWAxt7w1Zjhmsxidhx9p7c5RARkQkrcuDo378/NBqNFLVIThc6/g83yr+THTo+AP7ZJHdZsrHVqDC4ia7L8SO7HEREJKFSd6dRUVDi72rf4Hr5TrrQsWkwcO5XucuSzfuNvGFvqcL1R0nschARkWRKXeAAdKHjaLVJuF6+sy50bB4MnN0od1mysHmhy8G5HEREJJVSGTiAnE7HJFxz7wpB1ELc8h/g7C9ylyWL9xp4wd5ShRuPkrD9DO8cS0RE+ldqAwcAQFDgaNUJuObeLTt0DAHObJC7KoOzyTOX4xoys7QyV0RERKamdAcOIDt0fI1rHi+EjtPr5K7K4AY09IaDpQpRj5Ow7TTnchARkX4xcAC60BH4Na569IAAEeLWj4HTa+WuyqCs1Wb4T9MKAIA5+66yy0FERHrFwJFDUOBY4Je44vludugYCpxaI3dVBvVeAy84WpnjZmwytrLLQUREesTA8SJBgeNVvngeOrYNA06ukrsqg7FSm2FIU91cDnY5iIhInxg4/k0QskNHLwgQge3DgZM/y12VwfRv4AUnK3NExyZj8ylesUJERPrBwJEfQcDxKuNx2auPbnn7CODECllLMhRLczMMafa8y5HBLgcREekBA0dBBAEnKo/DJa9+uuXfRgHHl8tbk4H0q++FMtbmuP0kBZtP3pG7HCIiMgEMHK8iCDhZ+b+45J0dOnaEAseWylqSIViam+GjZjlXrFxDeia7HEREVDwMHK8jCDgZ8F9c8u6vW/59DHDsJ3lrMoC+9bxQxlqNO0/Z5SAiouJj4CgMQcDJgM9w0WeAbvn3T4CjS+StSWIW5kp8HMIuBxER6QcDR2EJAk5V+gQXfAbqlv/4FPh7sbw1SaxvPU+UtVHj7rMU/HqCXQ4iInpzDBxFIQg4XWn089Dx52fAkYXy1iQhjUqJj7Pncszbzy4HERG9OQaOosoOHed9P9At7xwLRM6XtyYJ9anniXLZXY5fjt+WuxwiIiqhGDjehCDgTMVR+KfCYN3yrs+ByHny1iQRjUqJoSHPuxxpmVkyV0RERCURA8ebEgSc9R/xQugYDxyeK29NEulV1xMuthrcj0vFL8c5l4OIiIqOgaM4skPHuQpDdMu7vwD++lHemiSgUSkxtLmuyzGfXQ4iInoDDBzFJQg4V3E4zvl9rFsO+wo4NEvWkqTQM8gjt8ux4RjnchARUdEwcOjJOf+hOOs3VLewZwJw6Ad5C9IzjUqJYc2fz+VIzWCXg4iICo+BQ4/+8f/4hdAxETj4vaz16FvPYA+42WnwMD4N64/ekrscIiIqQRg49Owf/49xxn+4bmHvN0DEd/IWpEdqMyWGNvcDAMw/cJ1dDiIiKjQGDgmc9xuCM/4jdAv7JgPhphM6egZ5oLy9BWIS0rCOXQ4iIiokBg6JnPf7D05XHKVb2D8ZODBD3oL0xNxMgWHschARURExcEjoQoUPcapiqG7hwFRg/zRZ69GX7nXcUd7eAo8S0rDmb3Y5iIjo9Rg4JHaxwgc4VWm0biF8OrB/KiCK8hZVTOZmCgxvoetyLDhwHSnp7HIQEdGrMXAYwEXfQThZ6RPdQvgMkwgd3eu4w93BAo8T07Dm72i5yyEiIiPHwGEgl3zfx8mAT3ULEd/qJpOW4NChUiowIrvLsTCcXQ4iIno1Bg4DuuQzACcCPtMtHPwfsO//SnTo6FrbHZ6OlnicmI7VR9jlICKigjFwGNhln/dwovJY3cLB74G9k0ps6FApn8/lWBh+HcnpmTJXRERExoqBQwaXvfvheOVxuoVDP+huhV5CQ0eXWuXh6WiJ2KR0rIpkl4OIiPLHwCGTK959cbzK57qFv2YDYV+XyNDx4lyORRE3kJTGLgcREb2MgUNGV7z64FiV8bqFwz8Cu78skaGjS63y8HayxJOkdPzMLgcREeWDgUNmV71642iVL3ULkXOBXV+UuNBhplRgRAt/AMDiiOvschAR0UtKVOCYNm0aBEFAaGio3KXo1TWvd3E08CvdwpF5wK7xJS50dKrpBp8yVnianIHVf9+WuxwiIjIyJSZwHDt2DIsXL0b16tXlLkUS1zx74u/Ar3ULR+YDO8eVqNBhplRgZEvdXI6fDt1EKm/LQURELygRgSMxMRF9+/bFkiVL4ODgIHc5krnu2QN/V52gW/h7IfDn2BIVOjpWd4NvGSs8S8lAxH1B7nKIiMiImMldQGEMGzYM7du3R6tWrTB58uRXbpuWloa0tLTc5fj4eN0n2izdh5G7Xr4LRBGod/4bCEcXISsrE9q20wGhZLyADw3xxae/nsP+ewo8TUyBg7XcFZUOGRkZef4l6XHMDY9jbnj6HGujDxzr16/HyZMncezYsUJtP23aNEyaNOml9Vaxl2CZYqnv8iTx0LwCTnsOQs1by6A8sRS3oqNw1v09QDD+hpRSBJwtlHiYImDi2gNo615yOjSmICwsTO4SSh2OueFxzA0nOTlZb/sy6sBx+/ZtjBo1Crt374ZGoynUYz7//HOMGTMmdzk+Ph4eHh5IcgqAaGMvUaX6d7FcdaTaeqL+PxPh83gfPD09oX3r2xIROjLd7uCzzRdw6JEak99rAhuNSu6STF5GRgbCwsLQunVrqFQcb0PgmBsex9zwYmNj9bYvow4cJ06cQExMDOrUqZO7LisrCxEREZg7dy7S0tKgVCrzPEatVkOtVr+8M4VS91GCRHl0BQQl6p/7CsqTK6AUBKD9TEBh3KGjY43y+N+f5/EwJROrj97FyJb+cpdUaqhUKv4hNjCOueFxzA1Hn+Ns1K9cLVu2xLlz53D69Oncj6CgIPTt2xenT59+KWyYoij3ToisPgUiBODEcmBHKKDVyl3WKykVAt5y19X408EbiEvh+VYiotLOqDscNjY2qFq1ap51VlZWcHJyemm9KbtZviMAoMHZLyGcXAlABDrMNupOR00nEX89s8K1R0lY/lcUQltVlLskIiKSkfG+YlEeN8t3zO50KICTPwO/jTDqTodCAEY0rwAAWHooil0OIqJSzqg7HPk5cOCA3CXI5mb5DhAFBRqe+RzCqdW6e3S8M8do56a8FeiMSs42uPwwAUsPRWFMa3Y5iIhKK3Y4Sphot3Y4XGO6rtNxeg2wbbjR3l9EoRAwqpVuwujyQ1GIS2aXg4iotGLgKIGi3d7GXzVnQCsogTNrgW3DjDZ0vBXoggAXGySkZWLpoRtyl0NERDJh4Cihbrm+hb9q5ISOdcDWj40ydCgUAkZlXxa77K+beJacLnNFREQkBwaOEuy2a1v8VeNbXeg4uwHY8pFRho622V2OxLRM/HQwSu5yiIhIBgwcJdxt1zb4q+Z30ApmwLlfgC1DgKxMucvKQ6EQci+LXf5XFJ4msctBRFTaMHCYgNsurXGo5v+yQ8dGYMt/jC50tA10RhVXWySlZ2HJQc7lICIqbRg4TMQdl5Y4VCs7dPyzCdg82KhChyAICM2+YmXl4Zt4wi4HEVGpwsBhQu44t8TBWt8jSzADzm8GNn0AZBnPpaitqzgj0I1dDiKi0oiBw8TcdW6BQ7V+0IWOC1uNKnTouhy6uRwrD99EbGKazBUREZGhMHCYoLvOIThYexayFCrgwjbg10FGEzpaVS6HauXtkJyehcXschARlRoMHCbqXrlmOFgrO3Rc3A5sfB/IlH/exItzOX4+HI3H7HIQEZUKDBwm7F65poioPRtZCnPg0g7g14FGETpaBJRDDXc7pGRkYXEEuxxERKUBA4eJu1+2Sd7QYQSdjhfncvwceZNdDiKiUoCBoxS4X7YxImr/qAsdl38HfnkPyJT3RT6kUlnU8LBHaoYWi8Kvy1oLERFJj4GjlLhfthHCa89BpkINXPlT9tDx4lyOVUeiEZOQKlstREQkPQaOUuRB2YYIr5MTOnYCG/rLGjpCKpZFzdwuB+dyEBGZMgaOUuZhmQYIrzMXmQoNcHUXsKEfkCFPd0EQBIxurZvLsfpINGLi2eUgIjJVDByl0MMy9REelBM6dgMb+soWOpr6l0FtT3ukZWqxgHM5iIhMFgNHKfXQqR4OBM3ThY5re4D1fWQJHS92Odb+fYtdDiIiE8XAUYrFONXFgaD5yFRaANf3Aut7AxkpBq+jsV8ZBHk5IC1Ti/kH2OUgIjJFDBylXIxTMPYHzUeG0gK4vg9YZ/jQ8eJ9OdYevYUHcexyEBGZGgYOwiPHIBwIWqALHTf2A+t6AenJBq2hkZ8Tgr0dkJ6pxYID1wx6bCIikh4DBwEAHjnWwYGghchQWgI3DgDr3jVo6BAEAaOzuxzrjt7G/TjDn9ohIiLpMHBQrkeOtbE/ODt0REUAa3sC6UkGO36DCk6o6+OI9Cwt5u/nXA4iIlPCwEF5PHaohf3Bi5BhZgXcPAisfddgoePFLseGY7dx7xm7HEREpoKBg17y2KEm9gctfB461vQA0hINcuwGFZxQ3ze7y8G5HEREJoOBg/L12KEm9gUtQrqZNRD9l0FDR+gLXY677HIQEZkEBg4qUKxDDewPzg4dtw4Da7oDaQmSH7e+rxMa+DohI0vEvP3schARmQIGDnqlWPvq2B+8GOlmNsCtSGC1YUJHzt1HNx6/jTtPDXuJLhER6R8DB71WrH017Ku7RBc6bh8BVncDUuMlPWZdH0c08mOXg4jIVDBwUKE8sQvE3tzQ8bdBQkfOFSsbj9/B7SfschARlWQMHFRoT+0CsbfuT0hT2QJ3jgKruwKpcZIdL8jbEU38yyBTyy4HEVFJx8BBRfLUrgr2Bf+ENJUdcOcYsEra0BHayh8A8OsJdjmIiEoyBg4qsqd2lbM7HXbA3ePAqi5AyjNJjlXH63mXY86+q5Icg4iIpMfAQW/kmW0A9tZdijSVPXD3BLCqM5DyVJJj5VyxsunkXUTHGu5W60REpD8MHPTGntlWwt66PyFVZQ/cOwX83FmS0FHb0wHNKpZFllbEnH2cy0FEVBIxcFCxPLOthH11f0KqygG4fxr4uZMkoSOny7Hl1F3cfMwuBxFRScPAQcX2zLYS9tZbilRzR+D+GZit6QpVpn5vg17Twx7NK7HLQURUUjFwkF7E2fjrTq+YO0J4eA4Nr00Hkp/o9RijWuV0Oe4gil0OIqIShYGD9EYXOpYixdwR9im3YLamK5AUq7f91/SwR4uActCKwJy9vGKFiKgkYeAgvYqz8cPe4CVINbODEPMP8PM7eg0dOffl2Hr6Lq4/Msy71xIRUfExcJDexVtXwF/+45Bi7gQ8/AdY2RFIeqyXfVd3t0eryroux1zO5SAiKjEYOEgSiZry2Bv8E1LUZYCY87rQkfhIL/sOzZ7LsY1dDiKiEoOBgyQTb+2DPXWXIVldFoi5oLfQUbW8HVpVdoZWBH7kXA4iohKBgYMklWDtg731liFZXQ54dBFY2QFIjCn2fnPmcmw/cw/XYhKKvT8iIpIWAwdJLsHK+4XQcQlY0QFIeFisfVYtb4c2VZwhisDsvZzLQURk7Bg4yCASrLywp95yJGmcgceXdZ2OhAfF2mfOXI4dZ+/hykN2OYiIjBkDBxlMopUn9tbNCR1Xsjsdbx46qrjZ4q1AF4icy0FEZPQYOMigEq08skOHCxB7FVjRHoi//8b7G5U9l+P3c/fZ5SAiMmIMHGRwiVYe2FNvGZI0rkDstezQce+N9lXZ1RZvV9V1OWbvYZeDiMhYMXCQLJIsdaEj0cINeHJdd3rlDUPHi12OSw/i9VkmERHpCQMHySbJ0h17674YOtoDcXeLvJ8AF1u0r+YKgF0OIiJjxcBBskqyLI899ZYj0aI88ORGdui4U+T9jGrlD0EA/vznAS7cY5eDiMjYMHCQ7JIt3J6HjqdRutDx7HaR9lHR2Sa3y8ErVoiIjA8DBxmFZAtX7Km3HAkW7sDTm9mh41aR9jGqpa7LsfP8A5y/FydNoURE9EYYOMhoJFu4Ym+95Uiw9ACeRetCx9PoQj/e39kGHaq7AeBcDiIiY8PAQUYl2cIFe+ouQ4Klp67DsaJDkULHqJZ+EARg94WH+OcuuxxERMaCgYOMToqFC/bUW4Z4Sy8gLid03CzUY/3K2eCdGrouxyx2OYiIjAYDBxmlFI0z9tZbingr7+eh40lUoR47sqU/FAKw5+JDnLvDLgcRkTFg4CCjlaJxxt66OaHjdnbouPHax1Uoa41ONcsDAGbvvSJxlUREVBgMHGTUUjTlsKfuMsRZeQPxdwodOka08MvucsTg7J1nktdJRESvxsBBRi9VUxZ76y1HnJUPEH8XWN4eiL3+ysf4lrVG5+wuB+dyEBHJj4GDSoRUdRnsrbcMcVa+QMI93SWzrwkdI1r6Q6kQsO9SDE7ffmaYQomIKF8MHFRi6ELHUjyzrgAk3NeFjsfXCtzep4zVC10OzuUgIpITAweVKKnqMthbdymeWfu9EDoKPmUysqUflAoBBy4/wslbTw1YKRERvYiBg0qcNLXT89CR+EAXOh7l38HwcrJC11rZV6xwLgcRkWwYOKhESlM7Ym/dpXhq4w8kPgRWdgAeXc532xEtdHM5wq88wolodjmIiOTAwEElVpraEfvqLsVTm4q60LGiAxBz6aXtPJ0s0a0253IQEcmJgYNKtDRzh+xORyUgKUbX6Yi5+NJ2I1r4w0wh4ODVxzgR/USGSomISjcGDirx0s3tsbfuT3hiEwAkPdJ1Oh5eyLONh6MlutdxBwD8EMa5HEREhsbAQSYh3dwe++r+hCe2lYHkx8DKjsDD83m2GdbcD2YKAYeuPcaxm+xyEBEZEgMHmYx0czvsC16SN3Q8+Cf36x6OlugR5AGAczmIiAyNgYNMSrq5HfbWXYJY2ypAcmx26DiX+/VhzStApRTw17VYHI1il4OIyFAYOMjkZKjssK/uEsTaVQVSnkBc+Q5w/ywAwN3heZfjhzB2OYiIDIWBg0xShsoW+4IX4bFdNQgpTyD+/A5w/wwA3VwOlVJA5I1YHLkRK3OlRESlAwMHmawMlS32By/CY7vqEFKe6jod906jvL0F3g1ml4OIyJAYOMikZahssD94IR7bV4eQ+gziz52Ae6cwrLkfzJUK/B31BIevP5a7TCIik8fAQSYvQ2WDfUGL8Mi+Rm7ocE28iF51c65YuQpRFGWukojItDFwUKmQqbLG/qCFeGRfE0JqHMRVnTEyIAHmSgWORj1B5HXO5SAikhIDB5UamSpr7A9eiBiHWhBS4+C0uSc+DUwAAPyw5wq7HEREEmLgoFIl08wKB4IWIMahNoS0eHx4cwyCzK7j2M2n+OsauxxERFIx6sAxbdo0BAcHw8bGBuXKlUPnzp1x+XL+b0FOVFgvhg5FegJWm09HLeEquxxERBIy6sARHh6OYcOG4ciRIwgLC0NmZibatGmDpKQkuUujEi7TzBIHghbgoWMQNNokrDKfDvHW3zh4lVesEBFJwUzuAl5l586deZaXL1+OcuXK4cSJE2jatKlMVZGpyDSzxIE68xByYjicnxzDz+bTMeVPazTx/xCCIMhdHhGRSTHqwPFvcXFxAABHR8cCt0lLS0NaWlrucnx8vO4TbZbug6SXM84lYLyzFGocqPUjGp8YgfLPjuOLJ1/i5EE3VG/QRu7SiiQjIyPPvyQ9jrnhccwNT59jLYgl5KS1KIro1KkTnj59ioMHDxa43cSJEzFp0qSX1q9duxaWlpZSlkglmFKbBt/zP6BK5gUkQ40Tfp/iiU0lucsiIpJVcnIy+vTpg7i4ONja2hZrXyUmcAwbNgy///47Dh06BHd39wK3y6/D4eHhgSW7TsLSxt4AlRK0WbB6fB5JZQIBhVLuagotJSkRAREfoZHiH2QqLYE+6yF6NpS7rELJyMhAWFgYWrduDZVKJXc5pQLH3PA45oYXGxsLV1dXvQSOEnFKZcSIEdi+fTsiIiJeGTYAQK1WQ61Wv/wFhbJEvfiZhBI25hY2dvjJYxqybo1HU5yDuL43hL6/AN6N5S6t0FQqFf8QGxjH3PA45oajz3E26qtURFHE8OHDsXnzZuzbtw8+Pj5yl0QmrkEldwzVfoqIrGoQMpKANT2AqIJP4RERUeEYdeAYNmwYVq9ejbVr18LGxgYPHjzAgwcPkJKSIndpZKKs1Wao5euKwRmf4KSqNpCRnB06IuQujYioRDPqwLFgwQLExcUhJCQErq6uuR8bNmyQuzQyYU38y0KrVKN3wkg8dmkCZKYAa3oCN8LlLo2IqMQy6sAhimK+H++//77cpZEJs1aboYGvE9Jgjv+kj4Ho30YXOtb2BK7vl7s8IqISyagDB5FcmviXhblSgZP3UrC3+kzAvy2QmQqs6wVc3yd3eUREJQ4DB1E+rNRmaFDBCQDww/6bEHv+DFR8Kzt09Aau7ZW5QiKikoWBg6gATfzKwNxMgfP34rH7yjOg589ApXYvhI49cpdIRFRiMHAQFcBSbYaGvroux+w9VyEqzYEeK4FK7YGsNGBdH+AqQwcRUWEwcBC9QmO/MlCbKXDhfjx2nX8ImJkDPVYAAR10oWN9b+DKbrnLJCIyegwcRK9g+cJcjll7rkCrFZ+Hjsodgax0YENf4MoueQslIjJyDBxEr5HT5bj0IAG7zj/QrVSqgO7LgcrvZIeOfsDlnfIWSkRkxBg4iF7D0twMDSuUAQDM2nNV1+UAskPHMqBKpxdCx58yVkpEZLwYOIgKobFfGWhUClx+mIA//3nw/AtKFdBtKRDYBdBmABv6A5d+l69QIiIjxcBBVAgW5srcLsfsvVeedzkAXejo+hMQ2FUXOn4ZAFzcIVOlRETGiYGDqJAaVdB1Oa48TMQf/9zP+0WlGdB1CVC1my50bBwAXPxNnkKJiIwQAwdRIVmYK9Eop8ux5yqyXuxyALrQ0WUxUK0HoM0ENr4PXNhm+EKJiIwQAwdRETTKnstxNSYRv5+7//IGSjOgyyKgWs/s0DEQOL/V4HUSERkbBg6iItColGjsl9PluPJylwMAFEqgy0Kgei9AzAJ+HQSc32LgSomIjAsDB1ERNaxQBhYqJa4/SsKOs/fy30ihBDrPB2r0zg4dHwD/bDJsoURERoSBg6iINColGvvnXLGSz1yOHAol0GkeUKOPLnRsGgyc+9WAlRIRGQ8GDqI30MDXCRYqJW48SsJvZwrocgDZoWMuULOfLnRsHgyc3Wi4QomIjAQDB9Eb0KiUaJLd5fhx71VkZmkL3lihBN6ZA9TqB4haYMt/gLO/GKhSIiLjwMBB9IYa+DrB0lyJG4+TsP1VXQ4AUCiAjnOA2u9lh44hwJkNhimUiMgIMHAQvSG1SokmfoXscgC60NFhNlB7wPPQcXqdASolIpIfAwdRMdSvoOty3IxNxrbTr+lyANmhYxZQZyAAEdj6MXB6rdRlEhHJjoGDqBjUZko09S8LAJizrxBdDkAXOtrPBIIGQRc6hgKn1khbKBGRzBg4iIqpnq9jbpdjy6m7hXtQTugI/hCACGwbBpxcJWmdRERyYuAgKqa8XY5ryChMlwMABAFo9z8geDAAEdg+HDj5s3SFEhHJiIGDSA/q+zrBSm2GW0+SseVkIbscQHbo+A6oO0S3vH0EcGKFJDUSEcmJgYNID8zNFGiafV+OOfuvFr7LAehCx9szgHof65Z/GwUcXy5BlURE8mHgINKTej5OsFab4faTFGw+eadoDxYE4K1pQP2huuUdocCxpXqvkYhILgwcRHpibqZA04rP53KkZxahywHoQkfbqUD9Ybrl38cAx37Sc5VERPJg4CDSo7rejrBWm+HO0xRsKmqXA8gOHVOABsN1y79/Ahxdot8iiYhkwMBBpEfmZgo0y+5yzH2TLgegCx1tJgMNR+qW//gU+HuxHqskIjI8Bg4iPavr4wgbjRnuPkvBxhO332wnggC0/gZoNEq3/OdnwJGF+iuSiMjAGDiI9EylfN7lmLfvGtIys95sR4IAtJoENB6tW945Foicr6cqiYgMi4GDSALB3o6w1ZjhXlwqNh5/g7kcOQQBaDkBaPKJbnnX50DkPP0USURkQAwcRBLI0+XYX4wuB6ALHS2+App8qlveNR44PFcPVRIRGQ4DB5FEgrK7HPfjUvHLsTecy5FDEIAWXwJN/6tb3v0F8NePxS+SiMhAGDiIJKJSKtCsUjkAwLz915GaUYwuB5AdOr4Amo3TLYd9BRyaVbx9EhEZCAMHkYSCvRxgZ6HCg/hUbChulyNH88+BkM91n++ZABz6QT/7JSKSEAMHkYTMXpjLMf/AteJ3OXKEjANCxus+3zMRir9m6We/REQSYeAgklhQdpfjYXwa1h+9pb8dh4wFmn8JAFAemIyKD7brb99ERHrGwEEkMTOlAiGVcrocepjL8aJmn+kmkwKofP9XKA59r799ExHpEQMHkQHU8XKAvYUKMQlpWPu3HrscAND0M2SFZHc6wqcBB2bod/9ERHrAwEFkAGYKBUKyr1hZEK7nLgcAbaNQnHfrqVs4MBXYP02v+yciKi4GDiIDqe1lD3tLFR4lpGH1kWi97/+acwdktfhatxA+Hdg/FRBFvR+HiOhNMHAQGYiZQoHm2V2OheE3kJKu3y4HAGgbjARa/59uIXwGQwcRGQ0GDiIDqu3pAAdLFR4npmHN3/rvcgAAGo0E2kzRfR7xLbBvMkMHEcmOgYPIgJQK4YUux3Ukp2dKc6CGw4G2U3WfH/wfsO//GDqISFYMHEQGVsvTAY5W5nicmC7JXI5cDYYBb03XfX7we2DvJIYOIpINAweRgem6HLr7ciwKvyFdlwMA6n8MvJV9meyhH3S3QmfoICIZMHAQyaCmh67LEZuUjp8jJexyAED9j4C3v9N9/tdsIOxrhg4iMjgGDiIZKBUCWmTP5VgccQNJaRJ2OQCg3n+Adv/TfX74R2D3lwwdRGRQDBxEMqnhYQ8nK3M8MUSXAwDqDgbaZ9/6PHIusOsLhg4iMhgGDiKZKBUCmgfkdDmuI1HqLgcABH8ItJ+p+/zIPGDXeIYOIjIIBg4iGdVw13U5niZnYOXhm4Y5aPAHQIdZus+PzAd2jmPoICLJMXAQyUipENAiu8ux5OANJKRmGObAQQOBjrN1n/+9EPhzLEMHEUmKgYNIZjU87FHGWo1nhuxyAECd94F35gAQgKOLgD8+Y+ggIskwcBDJTCG82OWIQryhuhwAUPu956Hj2BLg908ArdZwxyeiUoOBg8gIVHe3Q1lrNeJSMrDyr5uGPXjt/kCneQAE4PhS4A+GDiLSPwYOIiOQt8txw7BdDgCo1RfoPB+60LEM+H0MQwcR6RUDB5GRqOZuh7I2asSnZmL5oZuGL6BmH6DLQgACcGI5sCOUoYOI9IaBg8hIKAQBLbO7HD8duoG4FAN3OQCgRi+gyyJAUAAnVwI7RjF0EJFeMHAQGZGq5e1QzkaNhNRMLDsUJU8RNd59IXT8DPw2gqGDiIqNgYPIiCgEAS0rOwMAlh2KQlyyDF0OAKjeE+i6RBc6Tq0Gtg8HtFny1EJEJoGBg8jIBLrZwtlWjYS0TCz9S6YuBwBU6/48dJxeA2xj6CCiN8fAQWRkdFes6Locy+XscgC60NHtJ0BQAmfWAtuGMXQQ0Rth4CAyQoFutnCx1SAhLRM/HbohbzFVuwHdl2aHjnXA1o8ZOoioyBg4iIzQi/flWP7XTTxLTpe3oMAuQPdlutBxdgOw5SOGDiIqEgYOIiNVxc0WrnYaJKZlYslBmbscABDYGeixHFCYAed+AbYMAbIy5a6KiEoIBg4iI/XifTlW/HUTT5Jk7nIAQJVOQI8V2aFjI7DlPwwdRFQoDBxERqyyq67LkZSehZ+MocsBAJU7Aj1W6kLHP5uAzYMZOojotRg4iIyYIAhomX3FysrDRtLlAIDKHYCePwMKFXB+M7DpAyBLxqtpiMjoMXAQGbnKrjZws9d1ORZHGEmXAwAC2gPvrtKFjgtbGTqI6JUYOIiM3Itdjp8jbyI2MU3mil5Q6W3g3dWA0hy4sA34dRBDBxHli4GDqAQIcLFBeXsLJBtblwMAKr31PHRc3A5sfB/INJJTP0RkNBg4iEoAQRDQsrLuipWfI6Px2Ji6HABQsS3Qay2gVAOXdgC/DmToIKI8GDiISohKzjZwd7BASoYRdjkAwL913tDBTgcRvYCBg6iEEF64L8fPkTfxKMHIuhwA4N8K6J0dOi7/DvzyHpBphHUSkcExcBCVIBWdbeDhYIHUDC0WhV+Xu5z8+bUCeq8DzDTAlT8ZOogIAAMHUYmim8uhu2Jl9d/RiElIlbmiAvi1BHqvzw4dO4EN/Rk6iEo5Bg6iEsa/nHVul2PhASOcy5GjQnOgzwbAzAK4ugvY0A/IMNKARESSY+AgKmEEQUCr7C7Hmr+jERNvxC/iviEvhI7dwIa+DB1EpRQDB1EJ5FfOGp6OlkjL1GKBsc7lyOHbDOj7iy50XNsDrO/D0EFUCjFwEJVAL96XY83ft/DQmLscAODTFOi7EVBZAtf3Aut7AxkpcldFRAZUIgLH/Pnz4ePjA41Ggzp16uDgwYNyl0QkO7+y1vBytER6phaLDt6Uu5zX82kC9P0VUFkB1/cB63oB6clyV0VEBmL0gWPDhg0IDQ3FF198gVOnTqFJkyZ4++23cevWLblLI5LVi1esbDh+B89KwkUg3o2Aftmh48YBhg6iUsToA8fMmTPxwQcf4MMPP0TlypUxa9YseHh4YMGCBXKXRiS7CmWt4O2k63LsuWv0v846Xg2BfpsAc2sgKhxY9y5DB1EpYCZ3Aa+Snp6OEydOYNy4cXnWt2nTBocPH873MWlpaUhLe/5fvbi4OACANVJhBZ4zNgQRWUhKToY1UiBAKXc5pk0AOlSyxY/7H+PQbRHno+7Cw8lG7qpez7oihPbLoNw0AMKlcGh/6oysLj8B5lZyV1ZoGRkZSE5ORmxsLFQqldzllAocc8N78uQJAEAUxWLvy6gDx+PHj5GVlQVnZ+c8652dnfHgwYN8HzNt2jRMmjTppfW9W9eTpEYiY1LrB7kreFNhwDAvuYsgogLExsbCzs6uWPsw6sCRQxCEPMuiKL60Lsfnn3+OMWPG5C4/e/YMXl5euHXrVrEHiwonPj4eHh4euH37NmxtbeUup1TgmBsex9zwOOaGFxcXB09PTzg6OhZ7X0YdOMqUKQOlUvlSNyMmJualrkcOtVoNtVr90no7Ozv+gBqYra0tx9zAOOaGxzE3PI654SkUxZ8jZtSzzMzNzVGnTh2EhYXlWR8WFoaGDRvKVBUREREVlVF3OABgzJgx6N+/P4KCgtCgQQMsXrwYt27dwkcffSR3aURERFRIRh843n33XcTGxuKbb77B/fv3UbVqVfzxxx/w8ircBDO1Wo0JEybke5qFpMExNzyOueFxzA2PY254+hxzQdTHtS5EREREr2DUcziIiIjINDBwEBERkeQYOIiIiEhyDBxEREQkOZMOHHxbe8OaNm0agoODYWNjg3LlyqFz5864fPmy3GWVGtOmTYMgCAgNDZW7FJN39+5d9OvXD05OTrC0tETNmjVx4sQJucsyWZmZmfjyyy/h4+MDCwsL+Pr64ptvvoFWq5W7NJMRERGBjh07ws3NDYIgYOvWrXm+LooiJk6cCDc3N1hYWCAkJATnz58v0jFMNnDwbe0NLzw8HMOGDcORI0cQFhaGzMxMtGnTBklJSXKXZvKOHTuGxYsXo3r16nKXYvKePn2KRo0aQaVS4c8//8SFCxfw/fffw97eXu7STNaMGTOwcOFCzJ07FxcvXsS3336L7777DnPmzJG7NJORlJSEGjVqYO7cufl+/dtvv8XMmTMxd+5cHDt2DC4uLmjdujUSEhIKfxDRRNWtW1f86KOP8qwLCAgQx40bJ1NFpU9MTIwIQAwPD5e7FJOWkJAg+vv7i2FhYWKzZs3EUaNGyV2SSRs7dqzYuHFjucsoVdq3by8OGjQoz7quXbuK/fr1k6ki0wZA3LJlS+6yVqsVXVxcxOnTp+euS01NFe3s7MSFCxcWer8m2eHIeVv7Nm3a5Fn/qre1J/2Li4sDAL286Q8VbNiwYWjfvj1atWoldymlwvbt2xEUFIQePXqgXLlyqFWrFpYsWSJ3WSatcePG2Lt3L65cuQIAOHPmDA4dOoR27drJXFnpEBUVhQcPHuR5TVWr1WjWrFmRXlON/k6jb+JN3tae9EsURYwZMwaNGzdG1apV5S7HZK1fvx4nT57EsWPH5C6l1Lhx4wYWLFiAMWPGYPz48Th69ChGjhwJtVqN9957T+7yTNLYsWMRFxeHgIAAKJVKZGVlYcqUKejdu7fcpZUKOa+b+b2mRkdHF3o/Jhk4chTlbe1Jv4YPH46zZ8/i0KFDcpdism7fvo1Ro0Zh9+7d0Gg0cpdTami1WgQFBWHq1KkAgFq1auH8+fNYsGABA4dENmzYgNWrV2Pt2rUIDAzE6dOnERoaCjc3NwwYMEDu8kqN4r6mmmTgeJO3tSf9GTFiBLZv346IiAi4u7vLXY7JOnHiBGJiYlCnTp3cdVlZWYiIiMDcuXORlpYGpVIpY4WmydXVFVWqVMmzrnLlyti0aZNMFZm+zz77DOPGjUOvXr0AANWqVUN0dDSmTZvGwGEALi4uAHSdDldX19z1RX1NNck5HHxbe3mIoojhw4dj8+bN2LdvH3x8fOQuyaS1bNkS586dw+nTp3M/goKC0LdvX5w+fZphQyKNGjV66XLvK1euFPoNJanokpOToVDkfblSKpW8LNZAfHx84OLikuc1NT09HeHh4UV6TTXJDgfAt7WXw7Bhw7B27Vps27YNNjY2uR0mOzs7WFhYyFyd6bGxsXlpfoyVlRWcnJw4b0ZCo0ePRsOGDTF16lT07NkTR48exeLFi7F48WK5SzNZHTt2xJQpU+Dp6YnAwECcOnUKM2fOxKBBg+QuzWQkJibi2rVructRUVE4ffo0HB0d4enpidDQUEydOhX+/v7w9/fH1KlTYWlpiT59+hT+IPq6jMYYzZs3T/Ty8hLNzc3F2rVr8/JMiQHI92P58uVyl1Zq8LJYw/jtt9/EqlWrimq1WgwICBAXL14sd0kmLT4+Xhw1apTo6ekpajQa0dfXV/ziiy/EtLQ0uUszGfv378/37/eAAQNEUdRdGjthwgTRxcVFVKvVYtOmTcVz584V6Rh8e3oiIiKSnEnO4SAiIiLjwsBBREREkmPgICIiIskxcBAREZHkGDiIiIhIcgwcREREJDkGDiIiIpIcAwcRERFJjoGDiIiIJMfAQURERJJj4CAiIiLJMXAQkcE9evQILi4umDp1au66v//+G+bm5ti9e7eMlRGRVPjmbUQkiz/++AOdO3fG4cOHERAQgFq1aqF9+/aYNWuW3KURkQQYOIhINsOGDcOePXsQHByMM2fO4NixY9BoNHKXRUQSYOAgItmkpKSgatWquH37No4fP47q1avLXRIRSYRzOIhINjdu3MC9e/eg1WoRHR0tdzlEJCF2OIhIFunp6ahbty5q1qyJgIAAzJw5E+fOnYOzs7PcpRGRBBg4iEgWn332GX799VecOXMG1tbWaN68OWxsbLBjxw65SyMiCfCUChEZ3IEDBzBr1iysWrUKtra2UCgUWLVqFQ4dOoQFCxbIXR4RSYAdDiIiIpIcOxxEREQkOQYOIiIikhwDBxEREUmOgYOIiIgkx8BBREREkmPgICIiIskxcBAREZHkGDiIiIhIcgwcREREJDkGDiIiIpIcAwcRERFJ7v8BtYZflL3Hd2MAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# Define x range\n", + "x = np.linspace(0, 6, 400)\n", + "\n", + "# Constraint lines\n", + "y1 = 8 - 2*x # 2x + y = 8\n", + "y2 = 5 - x # x + y = 5\n", + "\n", + "# Feasible region is below both lines and above y=0\n", + "y_feasible = np.minimum(y1, y2)\n", + "y_feasible = np.maximum(y_feasible, 0)\n", + "\n", + "plt.figure(figsize=(6, 6))\n", + "\n", + "# Plot constraints\n", + "plt.plot(x, y1, label=r'$2x + y = 8$')\n", + "plt.plot(x, y2, label=r'$x + y = 5$')\n", + "#plt.axhline(0, label=r'$y = 0$')\n", + "#plt.axvline(0, label=r'$x = 0$')\n", + "\n", + "# Shade feasible region\n", + "plt.fill_between(x, 0, y_feasible, where=(y_feasible >= 0), alpha=0.4)\n", + "\n", + "# Labels and formatting\n", + "plt.xlim(0, 10)\n", + "plt.ylim(0, 10)\n", + "plt.xlabel('x')\n", + "plt.ylabel('y')\n", + "plt.title('Feasible Region of Linear Constraints')\n", + "plt.legend()\n", + "plt.grid(True)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "e5283c4a", + "metadata": {}, + "source": [ + "Another requierment: x and y are integers!" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "eeea8a97", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The optimized selection is: x= 3.0 y= 2.0\n", + "Optimized profit = 230.0 k\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "from scipy.optimize import milp, LinearConstraint, Bounds\n", + "\n", + "# Objective (minimize -50x -40y)\n", + "c = [-50, -40]\n", + "\n", + "# Constraints\n", + "A = [[2, 1], # the coefficients for the first inequality\n", + " [1, 1]] # the coefficients for the second inequality\n", + "b = [8, 5]\n", + "\n", + "constraints = LinearConstraint(A, -np.inf, b)\n", + "\n", + "# Variable bounds\n", + "bounds = Bounds([0, 0], [np.inf, np.inf])\n", + "\n", + "integrality = [1, 1] # both variable are integers\n", + "\n", + "# Solve\n", + "res = milp(c=c,\n", + " constraints=constraints,\n", + " bounds=bounds,\n", + " integrality=integrality)\n", + "\n", + "best_point=res.x\n", + "best_profit=-res.fun\n", + "print(\"The optimized selection is: x=\",best_point[0], 'y=',best_point[1])\n", + "print(\"Optimized profit =\", best_profit,'k')\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/data-platform/data-science/oracle-data-science/operational-research/files/individual_optimization/data_simulation.ipynb b/data-platform/data-science/oracle-data-science/operational-research/files/individual_optimization/data_simulation.ipynb new file mode 100644 index 000000000..94968afc6 --- /dev/null +++ b/data-platform/data-science/oracle-data-science/operational-research/files/individual_optimization/data_simulation.ipynb @@ -0,0 +1,178 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "33545924-d88b-4b8b-9a71-a0f229b58759", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "c76dba70-77fb-4ea8-a82f-ef7f44b23400", + "metadata": {}, + "outputs": [], + "source": [ + "def simulate_training_data(size):\n", + " age = np.random.uniform(20, 70, size)\n", + " risk = np.random.uniform(0, 1, size)\n", + " price = np.random.uniform(2, 4,size)\n", + "\n", + " beta_0 = 3.0\n", + " beta_price = -1.5\n", + " beta_age = 0.05\n", + " beta_risk = -1.0\n", + " \n", + " logit = (\n", + " beta_0\n", + " + beta_price * price\n", + " + beta_age * age\n", + " + beta_risk * risk\n", + " )\n", + "\n", + " prob = 1 / (1 + np.exp(-logit))\n", + " purchase = np.random.binomial(1, prob)\n", + "\n", + "\n", + " df = pd.DataFrame({\n", + " \"price\": price,\n", + " \"age\": age,\n", + " \"risk\": risk,\n", + " \"purchase\": purchase\n", + " })\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5da7f09a-04ad-4ac6-b648-2109bf476285", + "metadata": {}, + "outputs": [], + "source": [ + "df=new_customer_data=simulate_training_data(200)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "036a12b9-256f-46ca-8909-f886f95349b2", + "metadata": {}, + "outputs": [], + "source": [ + "df.to_csv(\"./data/price_opt_data_1000.csv\", index=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "806cb91d-d16d-44fb-80f0-b77c647ff0a3", + "metadata": {}, + "outputs": [], + "source": [ + "def simulate_new_cases(size):\n", + " age = np.random.uniform(20, 70, size)\n", + " risk = np.random.uniform(0, 1, size)\n", + "\n", + " df = pd.DataFrame({\n", + " \"age\": age,\n", + " \"risk\": risk,\n", + " })\n", + " return df" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "4fdf26b0-edc0-404d-a3cb-027eeb615d19", + "metadata": {}, + "outputs": [], + "source": [ + "new_customer_data=simulate_new_cases(50)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5b2851e2-87cc-4e5f-9a79-76d73e31051f", + "metadata": {}, + "outputs": [], + "source": [ + "new_customer_data.to_csv(\"./data/new_customers_50.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "0a0579ff-02a4-40c4-b1e3-649eeb39da3e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import oci\n", + "from oci.object_storage import UploadManager\n", + "\n", + "signer = oci.auth.signers.get_resource_principals_signer()\n", + "object_storage = oci.object_storage.ObjectStorageClient({}, signer=signer)\n", + "namespace = object_storage.get_namespace().data\n", + "\n", + "bucket_name = \"filesdemo\"\n", + "file_name = \"operational_research/new_cases.csv\"\n", + "\n", + "local_path='./data/new_customers_50.csv'\n", + "\n", + "upload_manager = UploadManager(object_storage, allow_parallel_uploads=True)\n", + "upload_manager.upload_file(\n", + " namespace_name=namespace,\n", + " bucket_name=bucket_name,\n", + " object_name=file_name,\n", + " file_path=local_path\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "923a05a3-88b3-4568-b7c2-508160b08189", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [conda env:generalml_p311_cpu_x86_64_v1]", + "language": "python", + "name": "conda-env-generalml_p311_cpu_x86_64_v1-py" + }, + "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.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/data-platform/data-science/oracle-data-science/operational-research/files/individual_optimization/individual_optimization.ipynb b/data-platform/data-science/oracle-data-science/operational-research/files/individual_optimization/individual_optimization.ipynb new file mode 100644 index 000000000..34072f537 --- /dev/null +++ b/data-platform/data-science/oracle-data-science/operational-research/files/individual_optimization/individual_optimization.ipynb @@ -0,0 +1,1409 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "39b3a95c", + "metadata": {}, + "source": [ + "

Individual Price Optimization

" + ] + }, + { + "cell_type": "markdown", + "id": "d9696576-009b-4f80-b88d-fefc35cefe81", + "metadata": {}, + "source": [ + "- conda environment: generalml_p311_cpu_x86_64_v1\n", + "- Author: Assaf Rabinowicz\n", + "- Date: 29Dec2025 " + ] + }, + { + "cell_type": "markdown", + "id": "9fc5d77e-2b51-467e-b93e-2f0ae4a02a77", + "metadata": {}, + "source": [ + "# Probelm Description" + ] + }, + { + "cell_type": "markdown", + "id": "36adaa78", + "metadata": {}, + "source": [ + "1. The goal of this project is to maximize portfolio profit by selecting optimal prices ($p_1,...,p_n$).\\\n", + "$$ profit_i= demand(p_i)(p_i-cost)$$\\\n", + "$$p^{*}_1,...,p^{*}_n=\\argmax_{p_1,...,p_n} \\, \\sum_i profit_i$$\\\n", + "2. The optimization process includes two types of constraints:\n", + " * Global constraint: maintaining average demand at 65%. \n", + " $$\\sum_i demand(p^{*}_i)/n=0.65$$\n", + " * Individual constraints: bounding prices within a fixed range (2 to 6). \n", + " $$2<=p^{*}_i<=6, \\forall i$$\n", + "3. The optimization relies on a demand model, that predicts the purchase probability given a set of features, including the price.\n", + "4. After solving the optimization problem, an automated process which does batch optimization for new cases given the optimzation results is required." + ] + }, + { + "cell_type": "markdown", + "id": "de6906bb-520c-48c3-8639-cd98e840546f", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "# Packages Import" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "630f048e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:py.warnings:/tmp/ipykernel_330/4260693530.py:11: DeprecationWarning: The `ads.common.model_metadata` is deprecated in `oracle-ads 2.6.8` and will be removed in future release. Use the `ads.model.model_metadata` instead.\n", + " from ads.common.model_metadata import UseCaseType\n", + "\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "from scipy.optimize import minimize_scalar, root_scalar\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import classification_report\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import ads\n", + "from ads import set_auth\n", + "from ads.jobs import Job, DataScienceJob, PythonRuntime\n", + "from ads.common.model_metadata import UseCaseType\n", + "from ads.model.framework.sklearn_model import SklearnModel\n", + "import oci\n", + "from oci.object_storage import UploadManager" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "51975e37-6d14-42a6-802c-30aafefcc3b6", + "metadata": {}, + "outputs": [], + "source": [ + "ads.set_auth(\"resource_principal\") # a signer for all ads operations, managed automatically\n", + "signer = oci.auth.signers.get_resource_principals_signer()" + ] + }, + { + "cell_type": "markdown", + "id": "2bc6dd14-cf5b-4cce-a0e3-0ebec6169d52", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "# Demand Model Fitting" + ] + }, + { + "cell_type": "markdown", + "id": "1e2a75b8-9191-4fca-ab4b-cbdb772d27d0", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "## Modeling " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cf0bce26-0e09-4c5f-ae3a-571d6d193d22", + "metadata": {}, + "outputs": [], + "source": [ + "df_demand=pd.read_csv('./data/price_opt_data_1000.csv')\n", + "X = df_demand[[\"price\", \"age\", \"risk\"]]\n", + "y = df_demand[\"purchase\"]\n", + "\n", + "X_train, X_test, y_train, y_test = train_test_split(\n", + " X, y, test_size=0.3, random_state=1\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "e6db8f3e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
LogisticRegression(max_iter=1000)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ], + "text/plain": [ + "LogisticRegression(max_iter=1000)" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model = LogisticRegression(solver=\"lbfgs\", max_iter=1000)\n", + "model.fit(X_train, y_train)" + ] + }, + { + "cell_type": "markdown", + "id": "b422c662-f33a-4c44-bb0a-1824f69cc654", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "## Model Analysis" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "e872d1cf-78bb-4f51-aff6-011dd977d751", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-1.45696918 0.04861314 -1.38003929]\n" + ] + } + ], + "source": [ + "print(model.coef_[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f92c54c9-6962-4cbf-b15a-37ebe477243f", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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7o5eytN34NHKnY/36+7duzr7v/nmG/zwww9YsWIFzpw5A2tra/Tp0wc5OTmV2Z0yK0+/t23bptPn0NBQyOVyvPbaazrtqvt7XqdOHSxYsADnz5/HuXPn0KNHD7z88su4evVqse1PnjyJ4cOHY/z48bh48SIGDRqEQYMGITQ0VNumur/fhfTtu7F8zvXtN2D4n/FC+vbdWD7nlUYkgxUfHy8CEI8dO1bmYwoKCkRbW1vx119/1W4bPXq0+PLLL1dChZWnLH1fu3atqFKpStyv0WhEFxcX8dtvv9VuS0lJERUKhfjHH39UZLkVpjzv+ffffy/a2tqKGRkZ2m2G+J6Loija29uLP//8c7H7hg4dKvbv319nm6+vrzhx4kRRFA3z/X5caX1/krF8zkWx9H4b42f8cfq858b0Oa8IPHNjwFJTUwEADg4OZT4mKysL+fn5RY45evQonJyc0LRpU0yaNAlJSUkVWmtFK2vfMzIyUK9ePbi7uxf5V1BkZCRiY2PRq1cv7TaVSgVfX1+cOnWqcgp/RuV5z1evXo1hw4bB2tpaZ7shvedqtRobNmxAZmYmOnXqVGybU6dO6byXANCnTx/te2mI7zdQtr4/yRg+52Xtt7F9xoHyvefG8DmvUFKnKyoftVot9u/fX+zcubNex02aNEls2LChmJ2drd32xx9/iDt37hQvX74sbt++XWzevLnYvn17saCgoKLLrhBl7fvJkyfFX3/9Vbx48aJ49OhRccCAAaKdnZ0YFRUliqIonjhxQgQgRkdH6xz32muviUOHDq20+surPO/5mTNnRADimTNndLYbynt++fJl0draWpTL5aJKpRL37t1bYltzc3Px999/19m2bNky0cnJSRRFw3u/9en7kwz5c65Pv43tM17e99zQP+eVgeHGQL311ltivXr1tB/ispg/f75ob28vXrp0qdR2ERERIgDx8OHDz1pmpShP30VRFPPy8sRGjRqJn3zyiSiKhvc/vvL0+8033xS9vLye2q66vue5ubnizZs3xXPnzokzZ84UHR0dxatXrxbb1tjCjT59f5yhf87L229RNPzPeHn7buif88rAy1IGaMqUKdizZw+OHDmCOnXqlOmYhQsXYsGCBTh48CBatWpVatuGDRvC0dERt27dqohyK1R5+l7I3Nwcbdq00fbLxcUFABAXF6fTLi4uTruvuihP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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "df = df_demand.copy()\n", + "\n", + "df[\"price_bin\"] = pd.cut(df[\"price\"], bins=10)\n", + "\n", + "avg_demand = df.groupby(\"price_bin\",observed=True)[\"purchase\"].mean()\n", + "\n", + "price_mid = [interval.mid for interval in avg_demand.index]\n", + "\n", + "plt.figure()\n", + "plt.plot(price_mid, avg_demand.values, marker=\"o\")\n", + "plt.xlabel(\"Price\")\n", + "plt.ylabel(\"Average Demand\")\n", + "plt.title(\"Average Demand by Price Bin\")\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "5ba42239-6f62-4d48-9e25-e622bd575d5d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 0.74 0.58 0.65 144\n", + " 1 0.68 0.81 0.74 156\n", + "\n", + " accuracy 0.70 300\n", + " macro avg 0.71 0.70 0.69 300\n", + "weighted avg 0.71 0.70 0.70 300\n", + "\n" + ] + } + ], + "source": [ + "y_pred = model.predict(X_test)\n", + "print(classification_report(y_test, y_pred))" + ] + }, + { + "cell_type": "markdown", + "id": "b5af69df-ff79-46d1-a0f8-464128cfb8e1", + "metadata": {}, + "source": [ + "# Optimization" + ] + }, + { + "cell_type": "markdown", + "id": "6f752b66-7a35-4238-88f5-947f3649a74f", + "metadata": {}, + "source": [ + "* Multi-dimensional optimization problem using Lagrangian method ($p_1,...,p_n, \\lambda$)\n", + "* Direct solution is complex, therefore it is simplified into two nested optimization problems:\n", + " * Outer loop: optimize $\\lambda$\n", + " * Inner loop: optimize $p_1,...,p_n$ given $\\lambda$\n", + "* Outer loop: root-finding on the constraint function (which is the derivative of the Lagrangian by $\\lambda$\n", + "* Inner loop: iterate over each $p_i$ and apply Brent’s method\n", + " * It is a derivative-free line search, and therefore also suitable when the derivatives are unknown.\n", + " * Parallelizable, since given lambda the prices are independent." + ] + }, + { + "cell_type": "markdown", + "id": "596d84de", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "## Optimization parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "0169719f", + "metadata": {}, + "outputs": [], + "source": [ + "#Global constraint:\n", + "target_avg_demand = 0.6\n", + "\n", + "# Ind. constraints\n", + "p_min = 2\n", + "p_max = 6\n", + "\n", + "# A unified cost for all customers\n", + "cost = 2" + ] + }, + { + "cell_type": "markdown", + "id": "70fad3d7", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "## Inner optimization functions" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "9969250e-de1e-41b6-a7da-c61658e13b41", + "metadata": {}, + "outputs": [], + "source": [ + "def inner_objective(price, age, risk, lam):\n", + " X_tmp = pd.DataFrame([[price, age, risk]], columns=['price', 'age', 'risk'])\n", + " d = model.predict_proba(X_tmp)[0, 1]\n", + " return -(d * (price - cost) + lam * d)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "f4cd53bf", + "metadata": {}, + "outputs": [], + "source": [ + "def optimal_price(age, risk, lam):\n", + " res = minimize_scalar(\n", + " inner_objective,\n", + " bounds=(p_min, p_max),\n", + " args=(age, risk, lam),\n", + " method=\"bounded\",\n", + " options={\"xatol\": 1e-4}\n", + " )\n", + " return res.x" + ] + }, + { + "cell_type": "markdown", + "id": "52019d76", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "## Outer opimization functions" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "2a1cc88c-a756-4fbe-bfb8-a4e35b653930", + "metadata": {}, + "outputs": [], + "source": [ + "def global_constraint_check(lam):\n", + " ages = X[\"age\"].values\n", + " risks = X[\"risk\"].values\n", + " \n", + " # Compute optimal prices for all individuals\n", + " prices = np.array([optimal_price(a, r, lam) for a, r in zip(ages, risks)])\n", + " \n", + " # Create DataFrame with proper column names\n", + " X_tmp = X.copy()\n", + " X_tmp['price'] = prices\n", + " \n", + " # Predict expected demand using the logistic regression model\n", + " demands = model.predict_proba(X_tmp)[:, 1]\n", + " print(f\"lambda: {lam} demand:{demands.mean()}\")\n", + " # Return deviation from target average demand\n", + " return demands.mean() - target_avg_demand\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "a09103e5-fdbe-4462-8d94-b3cade08b869", + "metadata": {}, + "outputs": [], + "source": [ + "def find_bracket(f, start=0, initial_step=0.5, max_iter=10):\n", + " a = start\n", + " fa = f(a)\n", + " step = initial_step\n", + " \n", + " for k in range(max_iter):\n", + " b = a + step\n", + " fb = f(b)\n", + " \n", + " if fa * fb < 0:\n", + " return a, b\n", + " \n", + " # Expand search exponentially\n", + " a = b\n", + " fa = fb\n", + " step *= 2 # Double step size each iteration\n", + " \n", + " raise ValueError(\"Could not find bracket\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "f0cb2a8b-d06d-498c-9fd7-cee4ec0a8b85", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "lambda: 0 demand:0.44639438864357156\n", + "lambda: 0.5 demand:0.534719892870319\n", + "lambda: 1.5 demand:0.6685762365603668\n", + "brackets: (0.5,1.5)\n", + "lambda: 0.5 demand:0.534719892870319\n", + "lambda: 1.5 demand:0.6685762365603668\n", + "lambda: 0.9876878101559453 demand:0.6074264982382986\n", + "lambda: 0.9378737300647034 demand:0.6006461621116643\n", + "lambda: 0.933173006217308 demand:0.599998777078217\n", + "lambda: 0.9332230062173085 demand:0.6000056671969027\n", + "Optimal lambda: 0.933173006217308\n" + ] + } + ], + "source": [ + "try:\n", + " a, b = find_bracket(global_constraint_check, initial_step=0.5)\n", + " print(f\"brackets: ({a},{b})\")\n", + " res = root_scalar(\n", + " global_constraint_check,\n", + " bracket=(a, b),\n", + " method=\"brentq\",\n", + " xtol=1e-4\n", + " )\n", + " lambda_star = res.root\n", + " print(f\"Optimal lambda: {lambda_star}\")\n", + "except ValueError as e:\n", + " print(f\"Error: {e}\")\n", + " print(\"Try adjusting start/step in find_bracket or check if solution exists\")" + ] + }, + { + "cell_type": "markdown", + "id": "1307594d", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "## Analysis" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "c9a336d6-79be-472f-9f3e-09d9494cea74", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "lambdas = np.linspace(a-1, b+1, 6)\n", + "\n", + "avg_demands = []\n", + "avg_profits = []\n", + "\n", + "for lam in lambdas:\n", + " prices = np.array([\n", + " optimal_price(X.loc[i, \"age\"], X.loc[i, \"risk\"], lam)\n", + " for i in X.index\n", + " ])\n", + " \n", + " X_tmp = X.copy()\n", + " X_tmp[\"price\"] = prices\n", + " \n", + " demands = model.predict_proba(X_tmp)[:, 1]\n", + " \n", + " profits = demands * (prices - cost)\n", + " \n", + " avg_demands.append(demands.mean())\n", + " avg_profits.append(profits.mean())\n", + "\n", + "\n", + "current_avg_demand = df[\"purchase\"].mean()\n", + "current_avg_profit = (df[\"purchase\"] * (df[\"price\"] - cost)).mean()\n", + "\n", + "prices_star = np.array([\n", + " optimal_price(X.loc[i, \"age\"], X.loc[i, \"risk\"], lambda_star)\n", + " for i in X.index\n", + "])\n", + "\n", + "X_star = X.copy()\n", + "X_star[\"price\"] = prices_star\n", + "\n", + "demands_star = model.predict_proba(X_star)[:, 1]\n", + "profits_star = demands_star * (prices_star - cost)\n", + "\n", + "new_avg_demand = demands_star.mean()\n", + "new_avg_profit = profits_star.mean()\n", + "\n", + "plt.figure(figsize=(8, 6))\n", + "\n", + "# Efficient frontier\n", + "plt.plot(\n", + " avg_demands,\n", + " avg_profits,\n", + " marker=\"o\",\n", + " label=\"Efficient Frontier\"\n", + ")\n", + "\n", + "# Current performance\n", + "plt.scatter(\n", + " current_avg_demand,\n", + " current_avg_profit,\n", + " color=\"gray\",\n", + " s=120,\n", + " marker=\"*\",\n", + " label=\"Current Pricing\"\n", + ")\n", + "\n", + "# New strategy\n", + "plt.scatter(\n", + " new_avg_demand,\n", + " new_avg_profit,\n", + " color=\"blue\",\n", + " s=120,\n", + " marker=\"*\",\n", + " label=\"Optimized Pricing\"\n", + ")\n", + "\n", + "plt.xlabel(\"Average Portfolio Demand\")\n", + "plt.ylabel(\"Average Portfolio Profit\")\n", + "plt.title(\"Efficient Frontier with Current and Optimized Strategies\")\n", + "plt.legend()\n", + "plt.grid(True)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "f341a94b", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "## Optimal prices for new cases" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "b1016087", + "metadata": {}, + "outputs": [], + "source": [ + "def optimal_price_for_customer(age, risk):\n", + " return optimal_price(age, risk, lambda_star)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "9413f9aa", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Optimal price: 3.012667038843836\n" + ] + } + ], + "source": [ + "new_age = 45\n", + "new_risk = 0.2\n", + "\n", + "price = optimal_price_for_customer(new_age, new_risk)\n", + "print(\"Optimal price:\", price)\n" + ] + }, + { + "cell_type": "markdown", + "id": "8ea62103-54e6-4bc5-ba70-e65ccffd265b", + "metadata": {}, + "source": [ + "# Productization" + ] + }, + { + "cell_type": "markdown", + "id": "8b87c43c-93e8-46c2-bb78-2e1164bccbd6", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "## Model Deployment" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "a2a69c96-20c2-418f-9fb9-91a05f2884d5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "WARNING:ads.common:In the future model input will be serialized by `cloudpickle` by default. Currently, model input are serialized into a dictionary containing serialized input data and original data type information.Set `model_input_serializer=\"cloudpickle\"` to use cloudpickle model input serializer.\n", + " ?, ?it/s]" + ] + }, + { + "data": { + "text/plain": [ + "algorithm: LogisticRegression\n", + "artifact_dir:\n", + " /home/datascience/code/operational_research/individual_optimization/demand_model_artifacts_2:\n", + " - - .model-ignore\n", + " - score.py\n", + " - model.joblib\n", + " - test_json_output.json\n", + " - output_schema.json\n", + " - runtime.yaml\n", + " - input_schema.json\n", + "framework: scikit-learn\n", + "model_deployment_id: null\n", + "model_id: null" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "demand_model_serialized = SklearnModel(estimator=model, artifact_dir=\"demand_model_artifacts_1\")\n", + "conda_env=\"generalml_p311_cpu_x86_64_v1\"\n", + "demand_model_serialized.prepare(\n", + " inference_conda_env=conda_env,\n", + " training_conda_env=conda_env,\n", + " X_sample=X_test,\n", + " y_sample=y_test,\n", + " use_case_type=UseCaseType.BINARY_CLASSIFICATION,\n", + " force_overwrite=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "f18fdc19-6bef-47f7-ad17-e18100b619e7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Actions Needed
StepStatusDetails
initiateDoneInitiated the model
prepare()DoneGenerated runtime.yaml
Generated score.py
Serialized model
Populated metadata(Custom, Taxonomy and Provenance)
verify()AvailableLocal tested .predict from score.py
save()AvailableConducted Introspect Test
Uploaded artifact to model catalog
deploy()UNKNOWNDeployed the model
predict()Not AvailableCalled deployment predict endpoint
\n", + "
" + ], + "text/plain": [ + " Actions Needed\n", + "Step Status Details \n", + "initiate Done Initiated the model \n", + "prepare() Done Generated runtime.yaml \n", + " Generated score.py \n", + " Serialized model \n", + " Populated metadata(Custom, Taxonomy and Provenance) \n", + "verify() Available Local tested .predict from score.py \n", + "save() Available Conducted Introspect Test \n", + " Uploaded artifact to model catalog \n", + "deploy() UNKNOWN Deployed the model \n", + "predict() Not Available Called deployment predict endpoint " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "demand_model_serialized.summary_status()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "c4a56f08-6e80-45ec-8071-6d5012b91952", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Start loading model.joblib from model directory /home/datascience/code/operational_research/individual_optimization/demand_model_artifacts_2 ...\n", + "Model is successfully loaded.\n", + "WARNING:py.warnings:/home/datascience/code/operational_research/individual_optimization/demand_model_artifacts_2/score.py:100: FutureWarning: Passing literal json to 'read_json' is deprecated and will be removed in a future version. To read from a literal string, wrap it in a 'StringIO' object.\n", + " return pd.read_json(json_data, dtype=fetch_data_type_from_schema(input_schema_path))\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "{'prediction': [0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1]}" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "demand_model_serialized.verify(X_test.iloc[:20], auto_serialize_data=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "0d57df51-9583-4cbc-8f3e-07829202dc2c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Start loading model.joblib from model directory /home/datascience/code/operational_research/individual_optimization/demand_model_artifacts_2 ...\n", + "Model is successfully loaded.\n", + "['.model-ignore', 'score.py', 'model.joblib', 'test_json_output.json', 'output_schema.json', 'runtime.yaml', 'input_schema.json']\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "27d9759b4cfe485ca54bcc4375549f10", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "loop1: 0%| | 0/4 [00:00" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "object_storage = oci.object_storage.ObjectStorageClient({}, signer=signer)\n", + "namespace = object_storage.get_namespace().data\n", + "\n", + "bucket_name = \"filesdemo\"\n", + "object_name = \"operational_research/optimization_parameters.txt\"\n", + "\n", + "params_dict = {\n", + " \"lambda_star\": lambda_star,\n", + " \"cost\": cost,\n", + " \"p_min\": p_min,\n", + " \"p_max\": p_max\n", + "}\n", + "\n", + "params_txt = str(params_dict)\n", + "\n", + "object_storage.put_object(\n", + " namespace_name=namespace,\n", + " bucket_name=bucket_name,\n", + " object_name=object_name,\n", + " put_object_body=params_txt\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "c574077c-99a9-41a0-9527-3fb27058e0fc", + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, + "source": [ + "## Job Automation" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "bfcf81f9-0471-43dd-ba9a-6cdbab10429a", + "metadata": {}, + "outputs": [], + "source": [ + "job = (\n", + " Job(name=\"price_optimization_new_cases\")\n", + " .with_infrastructure(\n", + " DataScienceJob()\n", + " .with_log_group_id(\"\")\n", + " .with_shape_name(\"VM.Standard.E4.Flex\")\n", + " .with_shape_config_details(memory_in_gbs=4, ocpus=1)\n", + " .with_block_storage_size(50) # minimus is 50\n", + " )\n", + " .with_runtime(\n", + " PythonRuntime()\n", + " .with_service_conda(\"generalml_p311_cpu_x86_64_v1\")\n", + " .with_source(\"/home/datascience/code/operational_research/individual_optimization/job_script.ipynb\")\n", + " )\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "e5502a49-aae4-4425-bb54-2a7e596cae27", + "metadata": {}, + "outputs": [], + "source": [ + "job.create()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "0596cd87-5cb4-4502-915e-8da18df0ed0f", + "metadata": {}, + "outputs": [], + "source": [ + "# Start a job run\n", + "run = job.run()\n", + "# Stream the job run outputs\n", + "run.watch()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [conda env:generalml_p311_cpu_x86_64_v1]", + "language": "python", + "name": "conda-env-generalml_p311_cpu_x86_64_v1-py" + }, + "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.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/data-platform/data-science/oracle-data-science/operational-research/files/individual_optimization/job_script.ipynb b/data-platform/data-science/oracle-data-science/operational-research/files/individual_optimization/job_script.ipynb new file mode 100644 index 000000000..2ea932637 --- /dev/null +++ b/data-platform/data-science/oracle-data-science/operational-research/files/individual_optimization/job_script.ipynb @@ -0,0 +1,360 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "0d2f22ee-c780-4cd7-af20-44c3ad089354", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from scipy.optimize import minimize_scalar\n", + "\n", + "import json\n", + "import requests\n", + "import ast\n", + "from tqdm import tqdm\n", + "import io\n", + "from io import StringIO\n", + "\n", + "import oci\n", + "import ads" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a8298191-7800-4f76-8a0c-bfe586331802", + "metadata": {}, + "outputs": [], + "source": [ + "ads.set_auth(\"resource_principal\") # a signer for all ads operations, managed automatically\n", + "auth = oci.auth.signers.get_resource_principals_signer()\n", + "object_storage = oci.object_storage.ObjectStorageClient({}, signer=auth)" + ] + }, + { + "cell_type": "markdown", + "id": "f73f1008-2b97-4c89-b3a8-e47acece8f4f", + "metadata": {}, + "source": [ + "# Import Data and Model" + ] + }, + { + "cell_type": "markdown", + "id": "0d83e386-c3f4-4604-bcd6-9321ea518288", + "metadata": {}, + "source": [ + "### Import new cases csv" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "bf89507a-a92c-45e6-9b1e-dbc2250f82f8", + "metadata": {}, + "outputs": [], + "source": [ + "namespace = object_storage.get_namespace().data\n", + "bucket_name='filesdemo'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ff03d190-3fe0-43e5-8811-6adcfd71d70d", + "metadata": {}, + "outputs": [], + "source": [ + "new_cases_file= 'operational_research/new_cases.csv'\n", + "\n", + "obj = object_storage.get_object(namespace, bucket_name, new_cases_file)\n", + "df = pd.read_csv(io.BytesIO(obj.data.content))\n", + "df.columns=['id','age','risk']" + ] + }, + { + "cell_type": "markdown", + "id": "80371f5a-61ee-4bcc-b7f8-c499e60d69be", + "metadata": {}, + "source": [ + "### Import parameters" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7920abd3-ce12-47b8-99a3-2edda56b6da0", + "metadata": {}, + "outputs": [], + "source": [ + "parameters_file= 'operational_research/optimization_parameters.txt'\n", + "\n", + "parameters = object_storage.get_object(\n", + " namespace_name=namespace,\n", + " bucket_name=bucket_name,\n", + " object_name=parameters_file\n", + ")\n", + "\n", + "params_txt = parameters.data.content.decode(\"utf-8\")\n", + "params = ast.literal_eval(params_txt)\n", + "\n", + "lambda_star = params[\"lambda_star\"]\n", + "cost = params[\"cost\"]\n", + "p_min = params[\"p_min\"]\n", + "p_max = params[\"p_max\"]" + ] + }, + { + "cell_type": "markdown", + "id": "ddb8211e-3848-4aa6-952a-edbf05afb6d3", + "metadata": {}, + "source": [ + "### Demand model endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "eb315a45-039d-42d2-ae80-eac873c075b1", + "metadata": {}, + "outputs": [], + "source": [ + "endpoint = ''" + ] + }, + { + "cell_type": "markdown", + "id": "c18a7b53-0dd1-49a7-b82b-6cf12e0a2010", + "metadata": {}, + "source": [ + "# Individual Optimization of New Cases" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "30b31954-cfe5-4ebc-9377-0ebd309a55ab", + "metadata": {}, + "outputs": [], + "source": [ + "def predict_demand_batch(df_row):\n", + " body = {\n", + " \"data_type\": \"pandas.core.frame.DataFrame\",\n", + " \"data\": df_row.to_json(orient='records')\n", + " }\n", + " response = requests.post(endpoint, json=body, auth=auth)\n", + " predictions = response.json()['prediction']\n", + " return predictions" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "e38bcb6b-c767-4720-b5aa-7076be2a04e8", + "metadata": {}, + "outputs": [], + "source": [ + "def inner_objective(price, age, risk):\n", + " X_tmp = pd.DataFrame([[price, age, risk]], columns=['price', 'age', 'risk'])\n", + " \n", + " d = predict_demand_batch(X_tmp)[0]\n", + " return -(d * (price - cost) + lambda_star * d)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "2a0057c9-87d9-40f5-a45a-21936483d941", + "metadata": {}, + "outputs": [], + "source": [ + "def optimal_price(age, risk):\n", + " res = minimize_scalar(\n", + " inner_objective,\n", + " bounds=(p_min, p_max),\n", + " args=(age, risk),\n", + " method=\"bounded\",\n", + " options={\"xatol\": 1e-4}\n", + " )\n", + " return res.x" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "61904c3f-0c99-4ef5-969e-52a63005ac87", + "metadata": {}, + "outputs": [], + "source": [ + "def compute_optimal_prices(df_new):\n", + " results = []\n", + " \n", + " for idx, row in tqdm(df_new.iterrows(), total=len(df_new), desc=\"ind optimzation\"):\n", + " customer_id = row['id']\n", + " age = row['age']\n", + " risk = row['risk']\n", + " \n", + " opt_price = optimal_price(\n", + " age=age,\n", + " risk=risk,\n", + " )\n", + " \n", + " results.append({\n", + " 'id': customer_id,\n", + " 'optimal_price': opt_price\n", + " })\n", + " \n", + " return pd.DataFrame(results)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "145cba09-a732-4643-9654-0946144c3dcd", + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ind optimzation: 100%|██████████| 50/50 [00:39<00:00, 1.28it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " id optimal_price\n", + "0 0.0 3.898726\n", + "1 1.0 5.999938\n", + "2 2.0 3.617225\n", + "3 3.0 5.999938\n", + "4 4.0 3.942123\n", + "5 5.0 5.999938\n", + "6 6.0 5.999938\n", + "7 7.0 3.664838\n", + "8 8.0 5.999938\n", + "9 9.0 5.999938\n", + "10 10.0 5.999938\n", + "11 11.0 5.999938\n", + "12 12.0 5.999938\n", + "13 13.0 5.999938\n", + "14 14.0 3.889174\n", + "15 15.0 5.999938\n", + "16 16.0 3.948781\n", + "17 17.0 5.999938\n", + "18 18.0 5.999938\n", + "19 19.0 5.999938\n", + "20 20.0 5.999938\n", + "21 21.0 3.982222\n", + "22 22.0 5.999938\n", + "23 23.0 5.999938\n", + "24 24.0 5.999938\n", + "25 25.0 5.999938\n", + "26 26.0 5.999938\n", + "27 27.0 5.999938\n", + "28 28.0 3.740368\n", + "29 29.0 5.999938\n", + "30 30.0 5.999938\n", + "31 31.0 5.999938\n", + "32 32.0 5.999938\n", + "33 33.0 3.953262\n", + "34 34.0 5.999938\n", + "35 35.0 5.999938\n", + "36 36.0 3.573766\n", + "37 37.0 3.818489\n", + "38 38.0 5.999938\n", + "39 39.0 5.999938\n", + "40 40.0 3.867386\n", + "41 41.0 5.999938\n", + "42 42.0 5.999938\n", + "43 43.0 5.999938\n", + "44 44.0 5.999938\n", + "45 45.0 4.256146\n", + "46 46.0 3.856021\n", + "47 47.0 5.999938\n", + "48 48.0 5.999938\n", + "49 49.0 4.354935\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "optimal_prices=compute_optimal_prices(df)" + ] + }, + { + "cell_type": "markdown", + "id": "d2c90fd4-da03-4c45-a68d-16b169332956", + "metadata": {}, + "source": [ + "# Export prices files to Object Storage" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "991570cc-54f1-4782-9f8b-752138e8d214", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "object_name = \"operational_research/optimal_prices.csv\"\n", + "\n", + "csv_buffer = StringIO()\n", + "optimal_prices.to_csv(csv_buffer, index=False)\n", + "\n", + "object_storage.put_object(\n", + " namespace_name=namespace,\n", + " bucket_name=bucket_name,\n", + " object_name=object_name,\n", + " put_object_body=csv_buffer.getvalue()\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [conda env:generalml_p311_cpu_x86_64_v1]", + "language": "python", + "name": "conda-env-generalml_p311_cpu_x86_64_v1-py" + }, + "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.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}