FICO
FICO Xpress Optimization Examples Repository
FICO Optimization Community FICO Xpress Optimization Home
Back to examples browser

Python notebooks

Description

Python notebooks available in the GitHub repository python-notebooks.


pythonnotebooks.zip[download all files]

Source Files

Data Files
mc11.mps.gz[download]





tsp_callbacks.ipynb

{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **Solving a TSP problem using callbacks**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "***tsp_callbacks.ipynb***\n",
    "\n",
    "Solve an instance of the [Traveling Salesperson Problem (TSP)](https://en.wikipedia.org/wiki/Travelling_salesman_problem) with Xpress using callbacks and *NumPy* arrays. \n",
    "\n",
    "Generate random TSP data, then solve the problem using the FICO® Xpress Optimizer library with the appropriate callback. Once the optimization is over (i.e. the time limit is reached or we find an optimal solution) the optimal tour is displayed using *matplotlib*.\n",
    "\n",
    "*This example requires a full license of the FICO® Xpress Optimizer. Click on [this link](https://www.fico.com/en/fico-xpress-trial-and-licensing-options) for more information about trial and licensing options.*\n",
    "\n",
    "© Copyright 2025 Fair Isaac Corporation\n",
    "\n",
    "Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n",
    " \n",
    "Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.\n",
    "\n",
    "This example uses FICO® Xpress software. By running it, you agree to the Community License terms of the [Xpress Shrinkwrap License Agreement](https://community.fico.com/s/contentdocument/06980000002h0i5AAA) with respect to the FICO® Xpress software. See the [licensing options](https://www.fico.com/en/fico-xpress-trial-and-licensing-options) overview for additional details and information about obtaining a paid license."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Install the xpress package\n",
    "%pip install -q xpress"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Standard formulation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's start with the standard formulation, where binary variables $use_{ij} \\in \\{0,1\\}, \\forall i,j \\in \\mathcal{N}$ represent the decision of whether the tour uses the arc $(i,j)$ (i.e. if we go from city $i$ to $j$) or not. An optimal tour can be found by solving:\n",
    "$$\n",
    "\\min \\sum_{i,j \\in \\mathcal{N}} dist_{ij} \\cdot use_{ij}\n",
    "$$\n",
    "\n",
    "subject to:\n",
    "\n",
    "* We have to enter and leave every city, and source node cannot be the same as the destination node: \n",
    "$$\n",
    "\\sum_{j \\in \\mathcal{N}} use_{ij} = 1, \\quad \\forall i \\in \\mathcal{N} \\\\\n",
    "\\sum_{j \\in \\mathcal{N}} use_{ji} = 1, \\quad \\forall i \\in \\mathcal{N} \\\\\n",
    "use_{ii} = 0, \\quad \\forall i \\in \\mathcal{N}\n",
    "$$\n",
    "\n",
    "Where $dist_{ij}, \\forall i,j \\in \\mathcal{N}$ represents the distance (or cost) associated with traveling on an arc $(i,j)$. We overlook subtour elimination constraints for now."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import xpress as xp\n",
    "import numpy as np\n",
    "import networkx as nx \n",
    "import matplotlib.pyplot as plt\n",
    "import itertools\n",
    "\n",
    "rndseed = 10\n",
    "\n",
    "np.random.seed(rndseed)\n",
    "\n",
    "'''Create random TSP problem data'''\n",
    "n = 17\n",
    "CITIES = range(n)  # set of cities: 0..n-1\n",
    "\n",
    "np.random.seed(0)\n",
    "\n",
    "X = 100 * np.random.rand(n)\n",
    "Y = 100 * np.random.rand(n)\n",
    "\n",
    "XY = (X, Y)\n",
    "\n",
    "# Compute distance matrix\n",
    "dist = np.ceil(np.sqrt ((X.reshape(n,1) - X.reshape(1,n))**2 +\n",
    "                        (Y.reshape(n,1) - Y.reshape(1,n))**2))\n",
    "\n",
    "# Create problem\n",
    "p = xp.problem()\n",
    "\n",
    "# Create variables as a square matrix of binary variables. Note\n",
    "# the use of p.addVariables to ensure NumPy uses the Xpress operations for handling these vectors.\n",
    "use = p.addVariables(n,n, vartype=xp.binary, name='x')\n",
    "\n",
    "# Degree constraints\n",
    "p.addConstraint(xp.Sum(use[i,:]) == 1  for i in CITIES)\n",
    "p.addConstraint(xp.Sum(use[:,i]) == 1  for i in CITIES)\n",
    "\n",
    "# Fix diagonals (i.e. city X -> city X) to zero\n",
    "p.addConstraint(use[i,i] == 0 for i in CITIES)\n",
    "\n",
    "# Objective function\n",
    "p.setObjective(xp.Sum((dist * use).flatten()))\n",
    "\n",
    "p.optimize()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's use the *matplotlib* and *networkx* Python packages to visualize the solution obtained by Xpress and check if there are any subtours:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/sAAAJrCAYAAAC/aYPNAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAghtJREFUeJzt3Qd0VNXaxvEnbQJJgNASpChgAbGAiogKIk0EBKRXaTbs2Pv1Xuxd0YsNLEhHpCldQEAQECkqolSlCKElkATSJt/aW8InFxJSZnKm/H9rZQWm7LPvRcg8Z7/73SHZ2dnZAgAAAAAAASPU6QkAAAAAAADPIuwDAAAAABBgCPsAAAAAAAQYwj4AAAAAAAGGsA8AAAAAQIAh7AMAAAAAEGAI+wAAAAAABBjCPgAAAAAAAYawDwAAAABAgCHsAwAAAAAQYAj7AAAAAAAEGMI+AAAAAAABhrAPAAAAAECAIewDAAAAABBgCPsAAAAAAAQYwj4AAAAAAAGGsA8AAAAAQIAh7AMAAAAAEGAI+wAAAAAABBjCPgAAAAAAAYawDwAAAABAgCHsAwAAAAAQYAj7AAAAAAAEGMI+AAAAAAABhrAPAAAAAECAIewDAAAAABBgCPsAAAAAAAQYwj4AAAAAAAGGsA8AAAAAQIAh7AMAAAAAEGAI+wAAAAAABBjCPgAAAAAAAYawDwAAAABAgCHsAwAAAAAQYAj7AAAAAAAEGMI+AAAAAAABhrAPAAAAAECAIewDAAAAABBgCPsAAAAAAAQYwj4AAAAAAAGGsA8AAAAAQIAh7AMAAAAAEGAI+wAAAAAABBjCPgAAAAAAAYawDwAAAABAgCHsAwAAAAAQYAj7AAAAAAAEmHCnJwAAAJCbTLdbyelZcmdnKzQkRDGuMIWHslYBAMDpEPYBAIBPOZSWoa2JqdqdkqaUjKyTno+OCFOl6EjViI1S6cgIR+YIAICvC8nOzs52ehIAAAAp6ZlavSdJCanpCpGU1weUnOfjoly6JL6Mol2sXwAA8E+EfQAA4Dizkr82IUnmU0lBPpiY0B8SItWNK2NX+gEAwN8I+wAAwFEb9h/W+n3JRR6nToUY1S5fyiNzAgDA39HhBgAAOLqi74mgb5hxtiWmemQsAAD8HRvcAACAY3v0Ten+qfy58TdNePd1bf5lnRL3JSiyRElVPec8dRh4hy5vdl2uY65JSFLFKBd7+AEAQY+VfQAA4AjTjC+3zYR7d+3QkZRkNb2xqwY+8ay63Hm/ffylO/trzvhRuY5pxjPjAgAQ7NizDwAAHDleb962fQV6T1ZWlh7p3ErpaWl6Z+biPF/bonoFjuUDAAQ1VvYBAIAje/VNJ/2CCAsLU/lKlZV6+FCerws5Nj4AAMGMDW0AAKDY7U5Jy9cRe0dTU5WedkSphw9r5fw5Wr14ga5u3T7P92QfG7+ux2YLAID/IewDAIBileF2KyUjK1+v/ezl/2jO+M/tr0NDQ3VFyza65ennT/s+M36m263wUIoYAQDBibAPAACKVUp6/oK+0bbfLWrYqq0OJuzR0pnT5XZnKTMjI1/vTU7PUmwJwj4AIDjRoA8AABSrA0fStfDP/YV675CBPZRy+JBemvC1QkLy3vV/7ZnlVa6kq5CzBADAv3G7GwAAFKvQ04T0vDRsdYM2/bRGu7Zu9up1AADwd4R9AABQrGJcYYV+b3raUfs9NfmwV68DAIC/I+wDAIBiZZrmRUfkHcST9u876TGzV//bKRPlKlFCVc8+L8/3m/FpzgcACGY06AMAAMWuUnSktiSm5nr83vvPPKIjycmqU/8KlYuvpMR9e7Vo+pfauWWT+j36jEpGR+c6dsix8QEACGY06AMAAMXuUFqG5m07efU+x5Kvp+ibSWP15+8bdDjxoEpGx6jmBRepTZ+BurxZq9OO36J6BZWOjPDwrAEA8B+EfQAA4Igl2/drb2p6rqv7hWFW9StGudSoWnkPjgoAgP9hMxsAAHDEJfFl5OmG+WY8My6A/Ml0u5V4NMMeiWm+m98DCAys7AMAAMdsTUzV6j1JHhvv0vgyqh4b5bHxgEDdRmP+7u1OSVNKRtYpG1yavhc1YqPYDgP4McI+AABw1Ib9h7V+X3Kh328+yoSEhKhmTLjqVano0bkBgSQlPdPeXEtITbdbXvIKATnPx0W5bLVMtIu+3oC/IewDAADHmVXGtQlJMp9KCvLB5O9dANn6+Pmnlbl3l7766iuFheV9rB8QjIryd8xsj6kbV8au9APwH+zZBwAAjjMhomX1ira5nnG6rfw5z5vXX1cjTvf06a45c+boySef9PpcAX+snjEr+u4CBn3DvN68z7zfjAPAf7CyDwAAAmI/8euvv66HHnpIY8aMUc+ePYt51oBvoi8GELwI+wAAwGeZzuDJ6Vm6+dZbVbVyZb3+4nMKDz11YaL5SNO3b19NmjRJ3333nS655JJiny/ga3v0527bq5TkFE0dMUwb163Wpp/WKDkpUXe98Kaadep+0nt2bN6oT158Rht+XKHwCJcubdJc/R/7t8qU+/s4y9AQ2SqcaPbwAz6PMn4AAOCzTLCPLRGhQ7t3ave2zbkGfcM06fvwww9Vp04d3XjjjUpISCjWuQK+xqzom2W9wwcPaOKwN7Vjy0adVatOrq/fv3uXnu7TUbv/3KZegx9T+wGD9OO332jIwO7KSE+3rzHjebJSAID3cEsOAAD4vOjoaKWkpJz2dSVLltTkyZNVv359de3aVfPmzVNEBEeHITi3w5iu+0bZuDgNX7xGZSvGadNPa/Vo19anfM+kD97R0SOpemXSLFWsXNU+ds7F9TRkYA8tmDxB13XvY/fwm3HN+BzLB/g2VvYBAIDPi4qKUmpqar5eW61aNVvKv2zZMg0ePNjrcwN8da9+TiPLCFekDfqn8/2cr3XZtS2PB32j7lXXqHL1mlo6a9rxx0KOjQ/AtxH2AQBAwKzs52jUqJHeffddDRs2TB999JFX5wb4ItPgsiCNufbv+UtJ+/fpnAsvPum5cy6+RFvX/3L899nHxgfg2yjjBwAAAbWyn+O2227T6tWrddddd9l9/FdffbXX5gf4kgy3+5QnWeTl4LEeF7EV4096zlQFJCcdVEZ6mq0SMMz4poFmXn00ADiLv50AAMAvwn5BVvZzvP3227riiivUuXNn7dixwytzA3xNSnrBgr6RnnbUfo9wuU56LiLy74CffvTv1+QwJ2UA8F2EfQAA4Bdl/AVd2TdcLpe++OIL+71jx446cuSIV+YH+BJ3IU7WdkWWsN9zuu7/U0ba3yX7rhIlinwdAMWHsA8AAAJ2Zd+Ij4+3Hfp//vln3X777comoCDAhYbktObLP9Ox30jcu+ek5w7uTVBMmbLHS/iLch0AxYewDwAA/GZlv7BB/bLLLtOIESP0+eef66233vL4/ABfEuMKK/B7ysefodLlymvTz+tOem7TutWqcf4FHrkOgOJD2AcAAH6xsu92u5V2rJy4MHr16qWHH35YDz30kObNm+fR+QG+xDTNi44oeBBveF1brVo4V/v+2nn8sXXLFmvXti268vobTnitGZ/mfIBvoxs/AADwi5V9w6zul/iffcMF8eKLL2rdunXq1q2bVq5cqbPPPtuDswR8R6XoSG1JTD1+/N6MUR8r9fAhHUj4u0z/hwVzdWDPX/bXrfsMVHSp0up8+z1aNmu6nunXVW1vullHU1M19eP3dOZ556tZp+7Hxw45Nj4A3xaSzcY1AADg42bNmqXWrVvrzz//VLVq1Yo01sGDB9WgQQN702DZsmWKiYnx2DwBX3EoLUPztu07/vtBzRpo765Tn0jx3rzliqv699+rPzf+pk9f+rc2/LhC4REuXdakufo9+oxiK1Q84T0tqldQ6cgIL/+vAFAUhH0AAODzFi9erGuuuUYbNmxQrVq1ijze+vXr7ZF8LVu2tN36QylHRgBasn2/9qamH1/d9wSzql8xyqVG1cp7cFQA3sBPNgAA4Bd79o3CduT/X3Xq1NGoUaNsl/7nnnvOI2MCvuaS+DLydMN8M54ZF4DvI+wDAAC/2rPvKR06dNCQIUP0zDPPaOrUqR4bF/AV0a5w1Y3zbDCvF1fGjgvA9xH2AQBA0K3s53jyySfVqVMn9enTR7/88otHxwZ8QY3YKJXP+vsmWWF37+a8r5orW9Vj//67CMD3EfYBAEBQruwbZq/+Z599purVq+vGG2+0zfuAQGKOq7yvV2dNGfa6wkJD7J77gjCvDw2Rxrz2rAZ1aefxG24AvIewDwAAgnZl3zDd+E0Z/4EDB9SjRw9lZWV5/BqAU/71r3/ZhpQPDOijltUr2uZ6xulCf87z5vXX1YjT03ffrt9//129evXi7wjgJwj7AADA55lj8kJCQjy+sp+jZs2aGj9+vObNm6fHH3/cK9cAituiRYv06quv6tlnn1W9evXsXnvTRd8cm1czNkrREWGnfJ953DxvXmdeb95Xt25d+3fkq6++0kMPPVTM/0sAFAbdNQAAgM8zQd+s7nsr7BstWrTQ66+/rvvvv98Gm969e3vtWoC3JSUlqW/fvmrUqNFJ4bx0ZITqxpdRXUmZbreS07Pkzs5WaEiIYlxhCs/lKMo2bdpo6NChuvvuu3XOOeforrvuKqb/NQAKg7APAAD8ggn73t4vfN9992nNmjW65ZZbVLt2bV122WVevR7gLffee6/dmrJw4UKFhZ16Bd8wwT62RP6LfU3A37hxox2/Ro0a9gYAAN9EGT8AAPCbJn3eXNnPqSB4//33ddFFF9mGfXv27PHq9QBv+OKLLzRy5Ei9++67tvmkp5kKmLZt26p79+5au3atx8cH4BmEfQAA4BeKY2U/pz/A5MmTlZmZqS5duig9Pd3r1wQ8ZdeuXbr99tvVuXNn3XTTTV65hqkUGDNmjM4991zdcMMN9poAfA9hHwAA+IXiWNnPUaVKFU2aNEnLly+3pf2AP3C73RowYIAiIyP1wQcf2EoVbzGnWJhmfYYJ/MnJyV67FoDCIewDAAC/UFwr+zmuuuoqDRs2zJb1m+AE+Drz3+ucOXP0ySefqHz58l6/XuXKlW3gN3v4OZIP8D2EfQAA4BeKc2U/h2nUZxqSme7jS5YsKdZrAwXx66+/6uGHH7b/rbZq1arYrptzJN/XX3/NkXyAjwnJzs7OdnoSAAAAp9O1a1d7nJhZuSxOGRkZatmypQ1TP/zwg6pVq1as1wdOx/SVuPLKK+3NsFWrVtkqmOL23//+195oME0BOZIP8A2s7AMAAL/gxMq+ERERoYkTJ9rGfR07dtSRI0eKfQ5AXv7zn/9o3bp1GjVqlCNB3zABf/DgwfZIvhkzZjgyBwAnIuwDAAC/UNx79v+pYsWKmjp1qtavX69bb71VFEbCV3z33Xd66aWX9O9//1uXXXaZo3N57bXXbLM+juQDfANhHwAA+AWnVvZz1KtXzzY+Gz16tN544w3H5gHkOHTokD1er2HDhnr00Uedns7xI/nOO+88tW3bVjt37nR6SkBQI+wDAAC/4OTKfg6zYvnYY4/pkUceKfbeAcD/uv/++7V37159/vnnCg8Pl6/clJs+fbo99q9du3YcyQc4iLAPAAD8gtMr+zmee+452+3cBP9NmzY5PR0EqSlTpujjjz/W22+/rZo1a8qXmCP5THd+juQDnEXYBwAAfsEXVvb/WaocFxenDh066PDhw05PCUFm9+7dtnfEjTfeqAEDBsgXXXzxxZowYYIN/Q8++KDT0wGCEmEfAAD4zcq+OWIsMzPT6akoNjbWNuzbsWOH+vbtK7fb7fSUECRMc8iBAwfam04ffvihLZf3Va1bt9Y777xjqw/MkXwAihdhHwAA+IWcI8V8oZTfqF27tm3WZ0L/kCFDnJ4OgsT777+vmTNnasSIEfaUCF9355132t4C9913n13lB1B8CPsAAMBvVvZ9Kewb5pixZ5991p5zPnnyZKengwD322+/2ZL4QYMG2W73/uLVV189fiTfmjVrnJ4OEDRCsjkoFgAA+IH58+erefPmtine2WefLV9hPkqZEGNWW5ctW6YLL7zwlK/LdLuVnJ4ld3a2QkNCFOMKU3go6y7In4yMDF111VVKSkrS6tWrj9/88hem38Y111yjPXv2aPny5apSpYrTUwICnm+c0QEAAOBnZfw5zJ7pTz75xAYx07Bv5cqVKleunH3uUFqGtiamandKmlIyTu5IHh0RpkrRkaoRG6XSkREOzB7+wpwCYUL+0qVL/S7o//NIviuuuMIeybdo0SLFxMQ4PS0goHE7GQAA+IWcgOMLHflPNTdzFJpZde3Ro4eSjqRpyfb9mrdtn7Ykpp4y6BvmcfO8eZ15fUq6880H4Xu+//57Pf/88/rXv/6lBg0ayF/980i+nj17ciQf4GWEfQAA4Bd8dWU/R40aNTRx4kSpbJzmbNmjvanp9vHT7ZfMed68fu62vbYSAMiRnJysPn36qH79+nriiSfk73KO5JsxY4YeeOABp6cDBDTK+AEAgF/w5ZX9HGdcXF+DhtS2+/gL2hTJvN50Ulq9J0lpWVmqXb6Ul2YJf2IC8V9//WV7QoSHB8ZHd3MknzmKz3TqP+ecc3TPPfc4PSUgIAXGvxgAACDg+frKvlmRX78v2f66qGefm3FKhIWpeuzf/5sRnKZNm6aPPvpIH3zwgc4991wFkjvuuMOW8w8ePFg1a9b0q9MFAH9B2AcAAH4V9n1xZd/stV+bkHTK5zb9tEYLJk/QzyuWau/O7SoVW1bn1r1Mve57RJVr5H6qwJqEJFWMcinaxce1YGS61t9yyy32yLpbb71VgcgcybdlyxZ7msWSJUtUr149p6cEBBT27AMAAL9gSphdLpdPruyb0vvcDjOe/NF/9f3cGbq4YSMNfGKIWnbro19/+F4Pd26lP3/fkOuYOSX9CD5mG0hOwB8+fHiRK0V8VVhYmEaPHq3atWvblf2dO3c6PSUgoBD2AQCAX+3b97WVfXO8XkJqeq579Nv1v03vf7NCNz/1nFp07a0udwzWs6MmKyszS5M/ejfXcc14ZlwzPoKLCfjmmLoRI0YoPj5egf532mxXMMHfVDGYhoQAPIOwDwAA/KqU39dW9s1e/bzWXWtferkiXK4THqtcvaaqnXOedmzemOfYZly68weXTZs26f7777cr++Y8+mBgjuT76quvtHnzZo7kAzyIsA8AAPxqFdDXwv7ulLSCd97Pzlbi/n0qVbZc3q87Nj6CQ2Zmpj1mr1KlSnrjjTcUTHKO5DOnDnAkH+AZhH0AAOBXK/u+VMaf4XYrJaPgq5CLpn+pA3v+0tVt2p/2tWb8TLe7kDOEP3nhhRe0cuVKff7554qJiVGwuf766/XOO+9o6NCh9juAoqG9KwAA8Bu+trKfkl7woL9jy0YNH/KEatW7TNfe2C1f70lOz1JsCdZoAtmKFSs0ZMgQPfnkk7ryyisVrMyRfGYrgzmSr0aNGnYfP4DC4acGAADwG762su/OrQV/Lg7uTdALt/dVVKlSeujtj2xTMm9cB/7F/DdtyvcvvfRSPf300wp2r7zyiu1X0KNHD61evdrp6QB+i7APAAD8hq+t7IcW4Ei0lMOH9PxtvZVy6JCe+miMysVX8sp14H8efvhh7dixw5bvR0REKNj980g+s7Jv/r8BUHCEfQAA4Dd8bWU/xpW/lfn0tKN68Y5+2rVti554/zPbid8b14H/mTFjht577z29/vrrqlWrltPT8akbe+b4QRP8zSo/R/IBBUfYBwAAfsPXVvbDQ0MVHZF3EDfHiL1x/yD9vmaVHnzrQ9W6pH6BrmHGN9dB4Nm7d68GDhyo1q1ba9CgQU5Px+ecccYZx4/kMyX9HMkHFAwN+gAAgN/wpZX99PR0jRs3Tr/sT1H9625QWPipP1Z99vJ/tHL+HNVv2lLJSYn6dtqkE55v0r5zrtcwxfuVoiM9Pnc4zxy/eNttt9nj9kaMGKEQtmrkeSSfKee///77bad+APlD2AcAAH4V9p1e2U9KStKHH36ot99+Wzt37lTvgbfoijY35vr6bb/+Yr//sGCu/fpfeYV905avRmyUh2YOX/LJJ59oypQp+vLLL+0KNk5/JN+dd96pc845R/fee6/TUwL8AmEfAAD4VRm/Uyv7pkmYCfgffPCB0tLSbPf0Bx54QBdccIGWbN+vvanpNpz/ryGfn7iSn19mnbdilEulI2nYFmi2bNmi++67TwMGDFDHjh2dno5fHclnVvdr1qzJkXxAPrABDAAA+A0nVvbXrVunvn372jO/P/roI911113atm2bLb02Qd+4JL6MPF2FbcYz4yKwmH3nN910kypWrGhvHqFgR/K1b9+eI/mAfCLsAwAAvxFdqrTizqyh/alpSjyaoUy322v7qefNm2fLh+vWrauFCxfaoLF9+3a9+OKLJ5VdR7vCVTfOs8G8XlwZOy4Cy8svv6zvv//eHrNXqlQpp6fjV0xn/lGjRun888/nSD4gH0KyzU8zAAAAH3UoLUNbE1O1OyVNyemZJzUyM93qTRM7s7e9qCXvGRkZmjhxol577TW7clivXj17BnrXrl3zdf75hv2HtX5f0Y8Iq1OhlGqXjynyOPAtq1atUsOGDfXII4/o+eefd3o6fuuvv/7SFVdcofLly2vRokXcNAFyQdgHAAA+KSU9U6v3JCkhNd3uX8/rA0vO83FRLlv6Hl3AFfHDhw9r+PDheuutt/Tnn3+qVatWNuQ3a9aswF3SzY2JtQlJMp+wCvIhy1zFXMqs6FenKV/AMdtPLrvsMrsVZdmyZXK5XE5Pya/99NNPuvrqq9W4cWNNnTpV4bmchgEEM8I+AADwOUUNzKakPj9d7M0KoTnK6/3331dycrJ69uyphx56yB735S83KuAf7rnnHntD6ccff7Rl6Ci62bNnq23btrZ5n+nWD+BEhH0AAOBTPFcKH6Pa5U9d3rt+/Xpbqj969GhFRkbq9ttvt8d5VatWTd7agpCSkXXS857cggDfDqWm/4O5sWRCPzzHnI4xaNAg2+yQI/mAExH2AQCAzzDB2KyIe8ql8f9fEm8+8pj9va+++qq+/vprValSxR5/dtttt6lMGe93vTfNBJPTs+TOzlZoSIhiXGEKD6VXcqDbv3+/LrroIvs1c+ZMhfJn7nGmGueNN96w5fzt2rVzejqAzyDsAwAAn2BK3+du2yt3Lp9MMtLTNG7oq/p26iSlHErSWbXOV8/7HlHdq5vkOmZoiNS0WjnNnj7VruSvXLnShi4TDszxXeybhjeZj9ndunXT/Pnz7R7zypUrOz2lgOR2u9WlSxdbQbF48WJdeumlTk8J8AncWgQAAD7BrOjntQTxzmODNf3TD9W4XUcNeGKIXSF9/vab9Ouq5bm+JyvLrWGTZ6p79+4qXbq0XVldu3at+vbtS9CH15nj9b744gtbak7Q9x7zb4E5kq9OnTp2ZZ8j+YC/sbIPAAAcZ/a2z9u2L9fnN65brce6tVXfh59Wh5vvsI+lpx3V/e2aqUy58nph3PQ8x6+culcNLyla0z2gILZt22YbPd54440aOXKk09MJCrt377ZH8pUtW9au8HMkH4IdK/sAAMAn9urndcDdstlfKTQsTC279zn+mCuyhJp37qnf1qzSvr925vpeM27Jymd5eMZA7rKysmz1SLly5egSX4wqVapk+3Fs2bLFbtPJzMx0ekqAowj7AADAcaZbfV6lhlt//VmVq9dUVMyJK3XnXFzv2PO/5Pre7GPjA8XF9IdYsmSJXdEvjuaP+H8XXnihJk6caPfvDx482PZNAIIVYR8AADgqw+0+5bF0/3Rwb4LKVow/6fGcxw4m7Mnz/WZ80w0f8LbVq1fr6aef1sMPP6xrrrnG6ekEpVatWum///2v/TLHHQLBKtzpCQAAgOCWkp530DfSjx5V+Cka6kVERv79fNrR045hjr2LLcE6B7zn6NGj6tOnj20UN2TIEKenE9Ruv/12bdq0Sffff79q1Kih9u3bOz0loNgR9gEAgKPMufOn4ypRQpnp6Sc9npGWdnz/vieuAxTF448/rs2bN+uHH35Q5LEbUXDOyy+/bP88evbsyZF8CErc3gYAAI4KDcmrNd/fylaM08G9J5fq5zxWNi7eI9cBCmvevHl666239OKLL9p94/CdI/kuuOAC3XDDDdq+fbvTUwKKFWEfAAA4KsYVdtrXVK99gXZt26LU5MMnPL5x7Wr7vcb5F3jkOkBhHDhwQP3791fz5s113333OT0d/ENUVJSmTZumiIgIG/gPHz7x3xAgkBH2AQCAo8JDQxUdkXcQv7LVDXJnZWnu+FHHH8tIT9P8yeN1bt1LVeGMKnm+34xvrgN4mun2fueddyolJUWffvqpXU2Gbx7Jt23bNo7kQ1Bhzz4AAHBcpehIbUlMzfX4vfPqXqorr2+n0W++qKQD+1TpzBpaOGWC9u7crjufez3PsUOOjQ94w5gxYzR+/HiNHTtWVatWdXo6OM2RfG3atLFH8r3zzjsKYWsPAlxINodPAgAAhx1Ky9C8bfvyfI3puD/27Ve0aPqXSklK0lm1zlePex/RJY2vPe34LapXUOnICA/OGJD+/PNPXXzxxWrbtq1Gjx7t9HSQDx9++KHt1G/6K7DlAoGOsA8ACErmzHVzFJvp0G4at5n93JR5O2vJ9v3am5qe6+p+YZh1u4pRLjWqVt6DowKS2+1WixYt7PFu69atU2xsrNNTQj49/PDDev311zVlyhSO5ENAo4wfABBUq8dbE1O1OyVNKRlZp9zXbcq9a8RGsQrsgEviy2jutr3y5DKEqdI14wKe9uabb2rBggWaP38+Qd8Pj+TbsmWLPZJv0aJFuuyyy5yeEuAVrOwDAAJeSnqmVu9JUkJqul3pzesHX87zcVEuGxKjXdwXL07mZoz5s/KUS+PLqHpslMfGAwyzkn/55Zfr7rvvtivE8D+pqam69tprtWPHDi1fvlzVqlVzekqAxxH2AQABHx7XJiTZ1eKC/MALObYqXDeujF3pR/HZsP+w1u9LLvI4dSqUUu3yMR6ZE5Dj6NGjatCggf31ihUrVKJECaenhELavXu3rrjiCluZsWTJEpUqVcrpKQEexeZEAEBAh0azSuwuYNA3zOvN+8z7zTgoPrXLl7JVFaEhf990KQjzevM+s6JP0Ic3PPXUU/rtt980atQogn4AHcnXvXt3juRDwCHsAwACdkXfE6vDhhlnW2KqR8ZC/phqipbVK9rmesbpQn/O8+b15n2U7sMbzB79N954Q88//7ztwo/AOZJvzpw5tjs/Rc8IJJTxAwACco++afRmVubz44v339bYt15WtXNr6a3pC075GrNabEJkNHv4ix2NFeELEhMTbcA/++yz9c033yiU0zsC8kg+03hx8ODBTk8H8Ag+sQAAAo4pvc/vrez9u3fpyw+GqkRU3ivBZjwzLke4FT8T4OvGl1FdjkyEg0wzvqSkJH322WcE/QB022232WMUH3jgAdWoUUMdOnRwekpAkRH2AQABtwpsuu7n12evDNF5dS+TOytLhxIP5Po6c+/AjGvGZ/XYOSbYx5YgaKF4jR8/XqNHj9bnn3+uM8880+npwEteeuklbd68Wb169eJIPgQEfloCAAKKKffOb1O3X1Z+r2Wzv9aAx/+Tr9eHHBsfQPAwR7MNGjRI3bp1U+/evZ2eDrzIVGyYGzoXXHCB2rVrp+3btzs9JaBICPsAgIBi9nXnp4I/KytLI557Si269NJZtc7P19jZx8YHEBzcbrf69++v6Ohovffeewox53EioEVFRWnatGlyuVy64YYbdPgwp7HAfxH2AQABI8PtPmUDt1OZM26k9u7aoR73PVKga5jx9x9Js3vHAQS2oUOH2mZ8n376qcqVK+f0dFBMOJIPgYKwDwAIGCnp+Qv6hw8e0Lihr6nrHYNVplzBG+59++cBTdu4R7O3JGjtniS7jx9AYPnll1/02GOP2ePYWrRo4fR0UMxMKf8XX3xhj+S79957OZIPfomwDwAIGKZDe36MefsVxcTGqnWfgUW6nlnl35KYqnnb9mnJ9v32yD8Avs9U5iQezdCBI+n2+/9W6qSnp6tPnz72mL0XX3zRsXnCWS1btrTbN8zXW2+95fR0gAKjGz8AIGCYo9hOZ9e2LZo3YZRtyncwYc/xx9PT05SVkaGEHdtVMiZGpWLL5uuaObcX9qama+62vaobV8ae9w7At5gKHNNg0/TdONV2n+iIMFWKjrR/f1945l92ZX/58uUqWbKkI/OFb7j11lvtkXwPPvigatasyZF88Csh2dSkIJ842xiAP/w7Zcrr8/Lz8qV6pl+XPF/Ttu8tGvjEkELPo06FGNUuX6rQ7wfgOabiZvWeJHt0prkdmNcH35zn13z3rUon79ND995djDOFLzdqNKcxzJw5kyP54FcI+/DYXXDOnQbgC8w++rya9B06uF+/rlpx0uNj335FR1KSbcivVK16vjv05+bS+DKqzgo/4CjzGWZtQpLMp92CfOB1Z2UpPDyMSh0cl5qaqqZNm+rPP/+0FR9nnnmm01MCTouwD4/dBY+LcumS+DKKdrE7BIBzTMM8s4++oD/c/nVTZx1KPKC3pi845fNbflmn8e++rg0/rlR62lHFVztLLbv2tlUApxIaIrWsXpF/EwGHbNh/WOv3JRd5HCp1kGPPnj264oorVLp0aS1ZssR+B3wZNdg45V1ws+/U7D81sgu4X9W8HwCcYlbhPH0Xe82ShXq8R3slHdivLncM1sAnntVl17bQ/j1/5foecyvd3DQFUPzMZxFPBH3DjLONzzaQFB8fb4/k++OPPziSD36BlX2cgLvgAAKB6YxvbkB64gdcavJh3XN9I9W6pL4eevsjhRawV0mL6hXY5gQUc3WiWXxwn+IfgCMpKZo6Ypg2rlutTT+tUXJSou564U0169Q9zzGp1ME/zZ07V61bt9Ztt92m//73vwrJR3NYwAms7OM47oIDCBRmS5GnPnst/mqyEvftVa/Bj9mgfzQ11TZryg8zBaqdgOJlKmpyW8o6fPCAJg57Uzu2bNRZterke0wqdfBPHMkHf0HYx/G74KaBTc5d73FDX9Wzt/RSvyvqqHPtypr/5fg835+ZkaH72jaxr5064j372JqEJM6cBuCIaFe4bazlCeuWLlZUTClbsm9W+Htfeo5uqn+ePvj3Y3bvfl5M3jANTgEUX2PhhDyqesrGxWn44jX6YP5K9X346XyPa8Yz45rxgZwj+R555BF7JN+UKVOcng5wSoR9nHQXvDB3vWeM+lj7/tp5wmPcBQfg9N59s6WoqP76Y6uysjL18l0DVK/RtXp46HA169RDc8aN1LuP33/a95uTAcyRgAC8z1TS5FXUE+GKVNmKcYUam0od/K8XX3xRnTp1Uu/evfXDDz84PR3gJIR9nHQXvKB3vZP277M3B2685a4THucuOACnmd4hpqTf7LctbFX/0dQUpR05oiYduurmp55Tw+va2O/Xdb9J382Yql3btpx2jOT03I8CBOA5ppLGW82oqNTB/zJbuz7//HNdeOGFateunT2WD/AlhH2cdBe8oHe9R73+vKrUOFvXtO980nPcBQfgCyv8prFWxSiX/X1BQ7+rRAn7vVHbG094vNENHe3339esOu0YbnrhAl6X4XbbShpvolIH/6tkyZKaNm2aIiMjdcMNN+jQoUNOTwk4jrCPIt0FN91sF06ZqAGP/0chp/gIzV1wAL4g2hWuRtXK2874NWOjFB0Rlu/3lqsYb7/Hlq9wwuNlype335MPnX67UiidmgGvSymmChoqdXCqI/lmzJjBkXzwOYT9IFeUu+Dm1MYRzz2lq1q3t0dS5Ya74AB8hTkCr258GbWqGaf258brmmp/B/a81LzgYvv9QMLuEx4/mLDHfi9Tttxpx4hx5f/mAoDCKa4KGip1cCp16tTRpEmTNG/ePN1zzz32czLgNMJ+kCvKXfAFX47XH7//qpseevK0r+UuOABfEx4aqgpRrtOu8l/Vup39/s0XY094fN7EMQoLD9cFDa7K8/1mfHMtAN5VXBU0VOogNy1atLDH8b3//vt68803nZ4OoHCnJwBnFfbudGryYY1+80V1GHiHKpxRxWvXAQBvqxQdqS2JqbluZ6pZ5yI169xD8yeNs135L7j8Sv28YpmWzZquTrfdo3LxlXIdO+TY+AC8r7gqaKjUQV5uueUWbdq0SQ899JBq1qypG288sd8LUJwI+0GusHenp378njIzMnR1mw5K2LHdPrZ/z67j+1fNY2Xj4hXh+rshFnfBAfhyA7/Np2kkevu/X1bFM6po/pfjtWLeLFWoXNX2Krmh3615vi/72PgAvM9U0JhKGm826ctKTdbhpBIqW7as164B//fCCy9o8+bN6tWrlxYtWqT69XPf7gp4E2E/yBX27vS+XbuUnJSowTdce9JzX34w1H69NnmOapx/YZGuAwDFsY8/Lsqlvf84gvR/hUdEqNvdD9qv/DK3OM0JAGZ8AL5RqWPMGPWxUg8f0oFjfTd+WDBXB/b8ZX/dus9ARZcqfcr3ubOyNPvLCerzyhC1b99effv21fXXX6+ICP6O4+Qj+UaOHKmmTZvaI/mWL1+uM8880+lpIQgR9oNcYe+Ct71poBq0aHXCY0n79+uDZx5R047ddHnzVoqr+vc/auxXBeDrLokvo7nb9sqTO45MQZMZF4BvVepM+/h97d214/jvl8+dYb+Ma9p1zjXsh4aF6fHbB6pO2ZI2yJnAX6FCBfXs2dMG/8suu0whVDLiH0fyTZ06VQ0bNlTbtm313XffqXTpU/+3BXhLSDatIoPe2j1JJ90F/+dd79ljP9MVLduoZp0L87zrbUr372hxhfo+/LQ63HyHfcz8yDPHXJnu1wDgy7Ympmr1ntMfo5dfl8aXUXVK+IFit2T7/jwrdQojp1LHHOGZY926dfr88881atQo7d69W7Vr17ahv0+fPqpWrZoHrw5/tn79el111VU29H/11VcKD2etFcWHsA8dSsvQvG37TnhsULMGJ9z1/qf35i1XXNVq+Qr7hjnXmjJWAP5gw/7DWr8vucjj1KlQSrXLx3hkTgAKJiU901bquD34CTc0RGpZvaKiXScHNXOm+jfffGOD/5dffqmjR4/a8u2bbrpJnTt3VqlSpTw3Efglcxxf69atbfO+YcOGUQGCYkPYR7HeBQcAf1jhX5uQZEv6swv4b575/FYvjhV9IFgrdQ4fPmzPWjfBf8GCBSpRooQ6depkg785li0sjB5GwWr48OG69dZb9frrr+uBBx5wejoIEoR9OHIXHAB8/d9EExQSUtNtiM/rn8ac502TP7NHP5p/8wCf4HSlzp9//qnRo0fb/f0bNmzQGWecod69e9tS/4suuqjI84L/eeyxx/TKK6/YChCO5ENxIOzjOParAsDJ25zMv427U9JO2cjUNCA13b9NUzC2KwG+xxcqdcxH7VWrVtnQP3bsWO3bt09169a1od8czVapUqUijQ//4Xa71b17d3399dccyYdiQdiHT90FBwBflel2Kzk9S+7sbIWGhNgjRTlpBPB9vlSpk56erlmzZtky/2nTptn9/tddd50N/h06dFBUFIskge7IkSO2p8Mff/zBkXzwOsI+fPIuOAAAQCBX6hw8eFATJkywwd8cy2Ya+XXp0sUG/2uuucae1Y7AtGfPHtudPyYmhiP54FWEfeR6F/zHPUm2aZ87K8ueLZsb9qsCAAB/4muVOps2bbJH+Jngv2XLFrvaa5r6ma9atWo5Ni94D0fyoTgQ9pGrH3/8UR269dC7oyeqRMUzfOIuOAAAQKAyH8uXLl1q9/ebVf/ExEQ1aNDArvabvd4VKlRweorwIHNk4/XXX6+bb75Z7733HkfyweMI+8jVvffeq4kTJ2r79u32bmPOXfAZs2bpyccf19qVy1U6JtrpaQIAAASco0eP2hVfE/xnzpxpg2CbNm1s8G/btq0iIyOdniI8YMSIEbrlllv02muv6cEHH3R6OggwbAbCKaWlpdnjYkz5WE5ZkSlviy0RoXIlIrRtwy9KOnjA6WkCAAAEpBIlStg9/KaR365du+z57Dt37lTnzp3tMX533HGHli1bZqsB4L/Mqr45ku/hhx/W5MmTnZ4OAgxhH6dkjgQ5cOCA+vXrd9JzOSVk+/fvd2BmAAAAwaVixYq65557tHLlSrvXe9CgQXbV3+z5Pu+88zRkyBC71x/+6fnnn7c3dnr37m3/jAFPoYwfp9S+fXvt3r1bK1asOOm5bdu2qUaNGpo7d65atGjhyPwAAACC/cz2hQsX2jL/SZMmKTk5WY0bN7ZVmV27dlVsbKzTU0QBj+Rr1qyZtm7dao/kO+uss5yeEgIAK/s45XEgM2bMUP/+/U/5fPny5e33ffv2FfPMAAAAYJij+Uw4/PTTT+0CjenmX7JkSbvqX6lSJdvQz1RqZmRkOD1V5IP5s5s6dar9fsMNNygpKcnpKSEAEPZxErNXPywsTD169Djl8+ZMUJfLRdgHAADwAdHR0bYEfPbs2bax8nPPPWfL/U1orFKligYPHmxPWaKg17fFxcXZBTfzZ9itWzdu1KDICPs4gfkh8Mknn6hDhw4qV67cKV9jusGaffvs2QcAAPAtlStX1kMPPaR169Zp9erVtqx/3Lhxuuyyy3ThhRfq5Zdf1o4dO5yeJnJx/vnn220Z8+fPt30auEGDoiDs4wTmru/PP/+sAQMG5Pk6E/ZZ2QcAAPBNZnGmXr16tou/Cfdmxbhu3br697//rTPPPFMtW7a0+/3NXn/4lubNm+uDDz6wX+bPDygswj5OYPZ9meNczA+AvJh9+4R9AAAA32eOUW7durXGjBljezMNHz7cloibU5fi4+PVt29f23g5KyvL6animIEDB+rxxx/XI488oi+//NLp6cBP0Y0fx6WlpdnSr1tuucWWeOXF7CNKTEzUnDlzim1+AAAA8BxzwpLp1WRW+H///Xf7ObBPnz629N+U/MP5ExdMDy1zzOK3336ryy+/3Okpwc+wso/jzD8kBw4csHd5T4cyfgAAAP9WvXp1Pfnkk9qwYYM97q1jx4521f+iiy7SpZdeqrfeestWAsC5Exc+++wzu/2iXbt2+uOPP5yeEvwMYR8nlPA3aNBAderUOe1rKeMHAAAInP395jPgu+++q7/++ktTpkxRjRo1bAm56ebftm1bjR8/3p4FD2eO5IuKirJ/DhzJh4Ig7MMy57POnDlT/fv3z9fr6cYPAAAQeMzxyuZUJtMR3gT/d955RwcPHrTl5JUqVbLbPRctWmRLzFF8R/J9/fXXttFi165dOZIP+UbYh2X2a4WFhdl/yPMb9lNTU+0XAAAAAo+p5Lzjjju0dOlSu6f/vvvu0zfffKMmTZro7LPP1tNPP20fR/EcyWca9S1YsEB33303R/IhXwj7sP9YmBL+G2+8UWXLls33P/4Gq/sAAACB79xzz9WQIUO0efNmu7LfokULDR06VLVq1dKVV16p9957z/Z+gvc0a9bMHsf34YcfciQf8oWwD/3444/6+eef813Cn7OybxD2AQAAgqtpXOPGjfXRRx/ZbaBmL79ZBLrnnntsmX+nTp3snv/09HSnpxqQOJIPBUHYh13VP+OMM9SyZcsCh32a9AEAAARv8zhzHLM50Wnnzp169dVXbcd409XffLa86667bJd/Ss4967nnnrN7980xiStWrHB6OvBhhP0gl5aWpjFjxtjzVMPDw/P9vpwyfsI+AAAA4uPj7Z7+VatW2YrRW2+91XaRb9iwoWrXrm0D6rZt25yeZsBUV5jFOnMkX/v27TmSD7ki7Ac5cyfW7K/q169fgd4XExNju7VSxg8AAIB/uuCCC/TSSy/ZEDp37lwb+M3vzXF+1157rUaMGMERckXEkXzID8J+kDN3Bc25qnXq1CnweaymlJ+VfQAAAJyKOenJNPL77LPP7P7+kSNHKiIiwq76m/39PXv21IwZM5SZmen0VP0SR/LhdAj7Qcz8oztz5kwNGDCgUO83pfyEfQAAAOSnKtRsGzUr/X/++af+85//6KeffrKr0lWrVtUDDzygNWvWsL+/CEfymR4J/P+HfyLsB7FRo0bZffrdu3cv1PtZ2QcAAEBBmXBvusmbsG9OhTIr/KNHj9Yll1yiiy++2Db627Vrl9PT9Ksj+cxxfOaEhNdee83p6cCHhGRz+ycomT/2iy66SBdeeKHGjRtXqDFM99XExETNmTPH4/MDAABA8DAl6OYz5eeff26P7jO/b968ufr27Wu7+0dHRzs9RZ/35JNP6oUXXtAXX3yhzp07Oz0d+ABW9oOU6ZT6yy+/qH///oUegzJ+AAAAeILZy29K+s0ilNlq+sEHH9hTo0zpv+n0b5pJf/PNN8rKynJ6qj7r2WeftRW7HMmHHIT9IG7MV7lyZbVs2bLQY1DGDwAAAE+LjY3VLbfcom+//VZbtmzRo48+qqVLl9pmf9WrV9fjjz+u9evXOz1NnzyS75NPPrHbIdq1a8dRhyDsByNzl3TMmDH2TqnpklqUsM/RewAAAPAWc1zf008/rd9//13Lli2zIdas+pvj/erXr6+hQ4cqISHB6Wn63JF8ZtsDR/KBsB+Epk+froMHD9pyqKIwYT81NdV+AQAAAN5ijn1u2LChhg0bpr/++st2oK9WrZoeeughValSxd4EmDhxoo4ePapgV7FiRXskn2lyyJF8wY2wH6Ql/FdccYU9qqMozJ59g9V9AAAAFJfIyEjbtG/y5Mk2+L/99tvau3evbR5dqVIl3XbbbVqyZElQH0PHkXwwCPtBxvyDOGvWrCI15vvnyr5B2AcAAIATzOLTnXfeqe+//14bNmzQPffcY7v6N27cWOecc47+/e9/a/PmzQpGTZs2tcfxcSRf8CLsBxlzhml4eLjt1OmpsE+TPgAAADitVq1atiO9aeq3cOFCXXvttXrjjTds6L/66qvtXn+zlTWYmAU+cyTfI488Yo/kQ3AJyaamI2iYP+qLLrpIF154oT3WpKgOHz6s0qVLa+zYserRo4dH5ggAAAB4iuktNW3aNI0cOdKu+Jvm1GZ/f9++fXX99dfL5XIp0LndbvXq1cs27jM3Qcx2XgQHVvaDyKpVq/TLL794pITfiImJsf9AUsYPAAAAXxQVFWUXpWbMmKEdO3bopZdesmX9HTp0sMdQm7L/lStXBvSednMkn+nZdemll6p9+/YcyRdECPtBxPwlN/+otWzZ0mNdUU0pP2X8AAAA8HWmed/999+v1atXa926dRo4cKAmTZqkBg0a2IZ2L7zwgv78808FohIlSmjKlCl2sc4cyZeYmOj0lFAMCPtBwhxDMmbMGFuyZMqXPNkUhbAPAAAAf2K2tr7yyivavn27Zs+erfr16+v555/XWWedpWbNmumTTz7RoUOHFEg4ki/4EPaDxPTp021Dkn79+nl0XLOyTxk/AAAA/JFZBLvuuus0atQo7d6921bCmurVm2++2VYC9O7d255klZmZqUBQu3ZteySf2btvTjEI5O0LIOwHDfMPV8OGDe1fcE+ijB8AAACBoFSpUnZh7JtvvtEff/yhf/3rX7bkv3Xr1qpWrZoeeughW/4fKEfyDR8+XK+++qrT04EXEfaDwF9//WXvSHqqMd8/UcYPAACAQGPC/WOPPWabW//www/q1q2bPvvsM9WtW9d+vf766/Yztr8fyffoo49yJF8AI+wHAVOWFBERoe7du3t8bMr4AQAAEKhMSf9ll12mt99+2+51N8f41apVS0888YSqVq1qj+8zfbHMEX/+ZsiQIfakgptuuknLly93ejrwAsJ+gDP7cEwJf8eOHRUbG+vx8SnjBwAAQDAwi2ft2rXThAkT7P7+9957TykpKXZff3x8vO3uv2DBAnuuvb8cyWcaEXIkX+Ai7Ac4U3a0fv16r5Tw55TxmzuZ/ng3EwAAACiMsmXL6rbbbtPixYu1adMmu59/0aJFtpN/jRo1bIn8hg0b5Os4ki+wEfYDnFnVr1y5slq0aOGV8c3KvkEpPwAAAILR2WefrWeeeUYbN27Ud999Zxv6DRs2TOeff74aNGigd99916crYf95JF+XLl04ki+AEPYD2NGjRzV27Fj17dvXHiviDYR9AAAA4O/9/VdddZXef/9927zPNL4744wzdP/999vvHTp00KRJk5SWliZfY07smjx5sq1OuOOOOziSL0AQ9gPY9OnTdfDgQXuEiLfkhH1fvlsJAAAAFHd5fOfOnTV16lS7Yv7mm2/aGwBm5dwE/0GDBmnp0qU+FaqvvfZaeyTfiBEj9Morrzg9HXhASLYv/RcGjzL7bg4cOKBly5Z57RqHDx9W6dKlbQWB6eYJAAAA4NR+/fVXff755/a0rO3bt9stAKYbvvmqWbOmfMHTTz+t5557ThMnTrQ3J+C/WNkPUObO4axZs7zWmC+Haebhcrko4wcAAABOw+zjf+GFF2zn+/nz56tx48Z67bXXbOg3v/7www8db5L3zyP5vv/+e0fngqIh7Acoc7fQhPDu3bt7fW8Sx+8BAAAABTv2rmnTpvbouz179mj06NGKjo62++UrVaqkbt266auvvnKkWZ75fJ9zJJ/pM7B169ZinwM8g7AfgMzODPMXtGPHjoqNjfX69czxe4R9AAAAoOCioqLUq1cvW5W7Y8cOPf/88/rtt9/Url07ValSRffdd59WrVpVrPv7OZIvMBD2A9DKlSvtfiBvl/DnMCv7lPEDAAAARWOa9z344INau3at1qxZY0/VmjBhgurXr68LLrhAL730kt3rX1xH8s2YMUO7d+/mSD4/RdgPQJ9++qm9C9i8efNiuR5l/AAAAIBn1a1b1+7nN+F+5syZuuSSS+x++rPOOst+zv/ss89ss2xvqlWrlr788kuO5PNThP0Ac/ToUdsZ39wFDAsLK5ZrUsYPAAAAeEd4eLiuv/56u6/frLKbo/FM6DZVvGZ/v2mkN3fuXGVlZXnl+hzJ578I+wFm2rRpdk9Nv379iu2alPEDAAAA3meOvB4wYIDt5G86+j/55JN2C+91112nM888U4888oh++uknj1/XZIunnnpKjz32mD2SD/4hJJtajIDSpk0bG/aXLl1abNd8++239cQTTyglJaXYrgkAAADg7+bcP/zwg0aOHGkrfM0iXL169Wylb8+ePe3qv6eu07t3b02ePFkLFixQw4YNc31tptut5PQsubOzFRoSohhXmMJDWWcuboT9ALJr1y5Vq1ZN7733nm677bZiPebPlA+lpqaqZMmSxXZdAAAAAP8vPT3ddvU3wX/69Om2tN+s+pvgb47RK+pndbNluEWLFvr999+1fPly1ahR4/hzh9IytDUxVbtT0pSScfKWguiIMFWKjlSN2CiVjowo0jyQP9xeCSAmdLtcLnsuZ3EyZfwGpfwAAACAc0wWaN++vb744gv99ddfevfdd5WUlHR8hf/mm2/Wt99+K7fbXegj+czKvtlOkHMkX0p6ppZs36952/ZpS2LqKYO+YR43z5vXmdeb98G7WNkPEOaP0RzHYUp2xowZU6zXNmVDl19+uVavXm2vDwAAAMB3bNy40S4Mfv7559q6davt6G8q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",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Visualize solution using networkx and matplotlib\n",
    "def plot_sol(p):\n",
    "\n",
    "    # collect the edges: if the value of x[i,j] is 1, then the edge (i,j) is in the solution\n",
    "    edges = []\n",
    "    sol = p.getSolution(use) # get solution values\n",
    "    for (i,j) in itertools.permutations(CITIES, 2):\n",
    "        if sol[i,j] > 0.5: # variable is binary so > 0.5 --> is 1\n",
    "            edges.append( (i,j) )\n",
    "\n",
    "    # create dictionary with coordinates for each node to plot the graph\n",
    "    xy = {}\n",
    "    for i in range(n):\n",
    "        xy[i] = (X[i], Y[i])\n",
    "\n",
    "    # make figure look nicer\n",
    "    plt.figure(figsize=(10,6), dpi=100)\n",
    "\n",
    "    # create empty graph\n",
    "    optgraph = nx.Graph()\n",
    "\n",
    "    # add edges\n",
    "    optgraph.add_edges_from(edges)\n",
    "\n",
    "    # draw the cities, with labels in the position xy (see when we read the instance)\n",
    "    nx.draw(optgraph, node_size=300, pos=xy, with_labels=True, node_color='lightblue')\n",
    "\n",
    "    # show drawing\n",
    "    plt.show()\n",
    "\n",
    "# Plot solution\n",
    "if p.attributes.solstatus not in [xp.SolStatus.OPTIMAL, xp.SolStatus.FEASIBLE]:\n",
    "    print(\"Solve status:\", p.attributes.solvestatus.name)\n",
    "    print(\"Solution status:\", p.attributes.solstatus.name)\n",
    "else:\n",
    "    plot_sol(p)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As you can see, the solution contains subtours, and therefore it is not yet a valid solution for the problem yet. We need to add constraints that eliminate any such subtour.\n",
    "\n",
    "A straightforward approach for formulating subtour elimination constraints is to add a constraint for each subtour contained in the set of all subtours $\\mathcal{S}$ as follows:\n",
    "\n",
    "$$\n",
    "\\sum_{i,j \\in S} use_{ij} \\leq |\\mathcal{S}| - 1 \\quad \\forall \\mathcal{S} \\subsetneq \\mathcal{N},\\ |\\mathcal{S}| \\geq 2\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Add subtour elimination constraints, solve and plot solution\n",
    "p.addConstraint(xp.Sum(use[i,j] for i in subset for j in subset) <= len(subset) - 1 \n",
    "    for L in range(2,len(CITIES)) \n",
    "    for subset in itertools.combinations(CITIES, L)) \n",
    "\n",
    "p.controls.outputlog = 0 # Turn off output log for cleaner output\n",
    "\n",
    "p.optimize()\n",
    "\n",
    "# Plot solution\n",
    "plot_sol(p) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The solution is now valid and complete, since an Hamiltonian tour (no subtours) has been formed. However, you could experience that the problem building and solving times are rather high for a TSP with only 17 cities.\n",
    "\n",
    "This is due to the complete enumeration of all possible subtours, whose number grows exponentially with the instance size making the problem creation and solving times prohibitively long when problems grow just somewhat larger."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Formulation using the Miller, Tucker, Zemlin subtour elimination constraints"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we will model the same problem but using the Miller, Tucker, Zemlin subtour elimination constraints, which requires a new set of continuous variables:\n",
    "\n",
    "$step_i$ = step at which node $i$ is visited, $\\forall i = {2,...,|\\mathcal{N}|}$\n",
    "\n",
    "which are used as auxiliary variables for the formulation of subtour elimination constraints. Although a new set of real variables of size $|\\mathcal{N}|$ is introduced, we are able to prevent all subtours by introducing a set of constraints of size $(|\\mathcal{N}|-1)^2$, considerably reducing the problem size and complexity when comparing with the previous formulation:\n",
    "\n",
    "$$\n",
    "\\min \\sum_{i,j \\in \\mathcal{N}} cost_{ij} \\cdot use_{ij}\n",
    "$$\n",
    "\n",
    "subject to:\n",
    "\n",
    "* We have to enter and leave every city, and source node cannot be the destination node for any move: \n",
    "$$\n",
    "\\sum_{j \\in \\mathcal{N}} use_{ij} = 1, \\quad \\forall i \\in \\mathcal{N} \\\\\n",
    "\\sum_{j \\in \\mathcal{N}} use_{ji} = 1, \\quad \\forall i \\in \\mathcal{N} \\\\\n",
    "use_{ii} = 0, \\quad \\forall i \\in \\mathcal{N}\n",
    "$$\n",
    "* Miller, Tucker, Zemlin subtour elimination constraints:\n",
    "$$\n",
    "step_j \\geq step_i + 1 - (n-1) \\cdot (1 - use_{ij}), \\forall i,j = {2,..,n}\n",
    "$$\n",
    "\n",
    "with $n = |\\mathcal{N}|$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create problem\n",
    "p = xp.problem()\n",
    "\n",
    "# Create variables as a square matrix of binary variables. Note\n",
    "# the use of p.addVariables to ensure NumPy uses the Xpress operations for handling these vectors.\n",
    "use = p.addVariables(n,n, vartype=xp.binary, name='x')\n",
    "step = p.addVariables(n, name='t')\n",
    "\n",
    "# Degree constraints\n",
    "p.addConstraint(xp.Sum(use[i,:]) == 1  for i in CITIES)\n",
    "p.addConstraint(xp.Sum(use[:,i]) == 1  for i in CITIES)\n",
    "\n",
    "# Fix diagonals (i.e. city X -> city X) to zero\n",
    "p.addConstraint(use[i,i] == 0 for i in CITIES)\n",
    "\n",
    "# Miller, Tucker, Zemlin subtour elimination constraints\n",
    "p.addConstraint([step[j] >= step[i] + 1 - (n-1)*(1 - use[i,j]) for i in range(1,n) for j in range(1,n)])\n",
    "\n",
    "# Objective function\n",
    "p.setObjective (xp.Sum((dist * use).flatten()))\n",
    "\n",
    "p.optimize()\n",
    "\n",
    "# Plot solution\n",
    "if p.attributes.solstatus not in [xp.SolStatus.OPTIMAL, xp.SolStatus.FEASIBLE]:\n",
    "    print(\"Solve status:\", p.attributes.solvestatus.name)\n",
    "    print(\"Solution status:\", p.attributes.solstatus.name)\n",
    "else:\n",
    "    plot_sol(p)  # print solution and cost"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As you can confirm by looking at the graph and solver logs, this formulation yields the same solution as the previous one, but solves the problem much faster. Let's try to beat that in the next section!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Using callbacks"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's try to speed up the problem creation and solving times even more by using **solver callbacks** to add only those subtour elimination constraints that are really needed during the solving process using the standard formulation.\n",
    "\n",
    "Callback functions are user–defined routines to be specified to the Optimizer which are called at specific stages during the optimization process, prompting the Optimizer to return to the user's program before continuing with the solution algorithm. They are a useful tool particularly for Mixed Integer Programming (MIP) problems by allowing the user to interact with the solver during the solution search process (Branch-and-Bound). There are specific callbacks for other problem types, too.\n",
    "\n",
    "[Using callback functions](https://www.fico.com/fico-xpress-optimization/docs/latest/solver/optimizer/python/HTML/chCallbacks.html) is simple: \n",
    "  * the user first defines a function (say *myfunction*) with a specific signature that is to be run every time the branch-and-bound reaches a well-specified point\n",
    "  * secondly, the user specifies that the function is to be invoked every time the algorithm reaches a well-specified point calls a function (such as [problem.addcbpreintsol](https://www.fico.com/fico-xpress-optimization/docs/latest/solver/optimizer/python/HTML/problem.addcbpreintsol.html)) with *myfunction* as its argument\n",
    "  * finally, the user runs the *optimize* command that launches the branch-and-bound, the simplex solver, or the barrier solver; it is while these are run that myfunction is called at the intended points (depending on the selected callback type, check the [list of callbacks accepted by the Xpress Optimizer](https://www.fico.com/fico-xpress-optimization/docs/latest/solver/optimizer/HTML/chapter5.html?scroll=section5002))\n",
    "\n",
    "In this TSP example, we will relax (leave out) the subtour elimination constraints, and instead add a callback funtion that is triggered every time an integer (feasible) solution to the relaxed problem is found during the B&B process. By using the [problem.addcbpreintsol](https://www.fico.com/fico-xpress-optimization/docs/latest/solver/optimizer/python/HTML/problem.addcbpreintsol.html) solver callback, we will instruct the solver whether to accept (if no subtours) or discard (subtours exist) the solution found. In the latter case we add suitable subtour elimination constraints to the problem by calling the function [problem.addcuts](https://www.fico.com/fico-xpress-optimization/docs/dms2024-03/solver/optimizer/python/HTML/problem.addcuts.html) with the appropriate arguments. Therefore, the user-defined callback function needs to perform two main tasks:\n",
    "  * checking whether a given solution forms a Hamiltonian tour\n",
    "  * applying subtour elimination constraints to exclude the current node solution subtours from being found again"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define callback function\n",
    "def cb_preintsol(prob, data, soltype, cutoff):\n",
    "    '''Callback for checking if solution is acceptable\n",
    "    prob: Xpress problem object\n",
    "    data: data object = number of cities\n",
    "    soltype: type of MIP solution that has been found. 0 - LP relaxation is integer feasible, 1 - MIP solution found by a heuristic, 2 - MIP solution provided by the user\n",
    "    '''\n",
    "\n",
    "    n = data                             # number of cities\n",
    "    xsol=prob.getCallbackSolution(use)   # get array with values of x variables in the current context-specific solution\n",
    "    xsol = np.array(xsol).reshape(n,n)   # convert into matrix-shaped np array\n",
    "    tour = np.argmax(xsol, axis=1)       # get indices of the max (non-zero) element in each column = resulting tour\n",
    "\n",
    "    i = 0       # to store next city\n",
    "    ncities = 1 # to count number of cities visited\n",
    "\n",
    "    # Scan cities in order until we get back to 0 or the solution is wrong.\n",
    "    while tour[i] != 0 and ncities < n:\n",
    "        ncities += 1\n",
    "        i = tour[i]\n",
    "\n",
    "    reject = False # at this point do not reject the solution\n",
    "    if ncities < n:\n",
    "        # The tour given by the current solution does not pass through\n",
    "        # all the cities and thus contains subtours.\n",
    "        # If soltype is non-zero, the solution was found by a heuristic\n",
    "        # or provided by the user, so we reject it by setting reject=True without further branching.\n",
    "        # If instead soltype is zero, the solution came from the LP relaxation\n",
    "        # of the current B&B node which was found to be integer feasible. In this case\n",
    "        # we will reject it by adding a cut that cuts off that solution.\n",
    "        # Note that we must NOT set reject=True in that case because that would result in just\n",
    "        # dropping the node, no matter whether we add cuts or not.\n",
    "        if soltype != 0:\n",
    "            reject = True\n",
    "        else:\n",
    "            # Obtain an order by checking the maximum of the variable matrix\n",
    "            # for each row\n",
    "            unchecked = np.zeros(n) # np array of zeros of size n to assign each city to a subtour\n",
    "            nsubtour = 0            # to number and identify subtours\n",
    "\n",
    "            # Initialize the vectors to be passed to problem.addcuts\n",
    "            cut_mstart = [0]\n",
    "            cut_ind = []\n",
    "            cut_coe = []\n",
    "            cut_rhs = []\n",
    "\n",
    "            nnz = 0   # to mark the start of the variables indices for each cut\n",
    "            ncuts = 0 # to count number of cuts (subtours)\n",
    "\n",
    "            # while there are cities that are not assigned to a subtour\n",
    "            while np.min(unchecked) == 0:\n",
    "                nsubtour += 1                    # current subtour id\n",
    "                firstcity = np.argmin(unchecked) # first city (index) in unchecked that is not assigned a subtour yet (i.e., =0)\n",
    "                i = firstcity \n",
    "\n",
    "                # Scan cities in order for each subtour\n",
    "                while True:\n",
    "                    unchecked[i] = nsubtour  # mark city i as belonging to current subtour\n",
    "                    i = tour[i]              # proceed to next city in the current subtour\n",
    "\n",
    "                    if i == firstcity:       # if next city is the first city, subtour is finished, stop\n",
    "                        break\n",
    "\n",
    "                # Find indices of all variables with origin in this subtour and destination\n",
    "                # outside this subtour. We will force the sum of those variables to be >= 1\n",
    "                # (i.e. subtour will be excluded after the cut is added). S is the set of cities\n",
    "                # traversed by the subtour, compS is its complement (list of cities not contained in subtour S)\n",
    "                S     = np.where(unchecked == nsubtour)[0].tolist()\n",
    "                compS = np.where(unchecked != nsubtour)[0].tolist()\n",
    "                indices = [i*n+j for i in S for j in compS] # convert into decision variables array indices\n",
    "\n",
    "                # We need to presolve new row to adapt its data (rhs, column indices and row coefficients) for the presolved problem (instead of the original problem)\n",
    "                mcolsp, dvalp = [], [] # lists to be populated by the 'presolverow' method\n",
    "\n",
    "                # Presolve new row (cut) in order to add it to the presolved problem via addcuts\n",
    "                drhsp, status = prob.presolverow(rowtype='G',\n",
    "                                                    origcolind=indices,\n",
    "                                                    origrowcoef=np.ones(len(indices)),\n",
    "                                                    origrhs=1,\n",
    "                                                    maxcoefs=prob.attributes.cols,\n",
    "                                                    colind=mcolsp,\n",
    "                                                    rowcoef=dvalp)\n",
    "\n",
    "                nnz += len(mcolsp)\n",
    "                ncuts += 1\n",
    "\n",
    "                cut_ind.extend(mcolsp) # array which will be filled with the columns of the presolved row\n",
    "                cut_coe.extend(dvalp)  # array which will be filled with the coefficients of the presolved row\n",
    "                cut_rhs.append(drhsp)  # array containing the right hand side elements for the cuts\n",
    "                cut_mstart.append(nnz) # array containing offset into the colind and cutcoef arrays indicating the start of each cut\n",
    "\n",
    "            # add cuts\n",
    "            if ncuts > 0:\n",
    "                # call prob.addcuts and pass the necessary arguments to add the subtour elimination constraints (list of cuts)\n",
    "                prob.addcuts(cuttype=[0] * ncuts,\n",
    "                        rowtype=['G'] * ncuts,\n",
    "                        rhs=cut_rhs,\n",
    "                        start=cut_mstart,\n",
    "                        colind=cut_ind,\n",
    "                        cutcoef=cut_coe)            \n",
    "\n",
    "    return (reject, None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we will solve the problem with the standard formulation (without subtour elimination constraints), but **adding the callback function** and plotting the solution to validate the approach. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create problem\n",
    "p = xp.problem()\n",
    "\n",
    "# Create variables as a square matrix of binary variables. Note\n",
    "# the use of p.addVariables to ensure NumPy uses the Xpress operations for handling these vectors.\n",
    "use = p.addVariables(n,n, vartype=xp.binary, name='x')\n",
    "\n",
    "# Degree constraints\n",
    "p.addConstraint(xp.Sum(use[i,:]) == 1  for i in CITIES)\n",
    "p.addConstraint(xp.Sum(use[:,i]) == 1  for i in CITIES)\n",
    "\n",
    "# Fix diagonals (i.e. city X -> city X) to zero\n",
    "p.addConstraint(use[i,i] == 0 for i in CITIES)\n",
    "\n",
    "# Objective function\n",
    "p.setObjective(xp.Sum((dist * use).flatten()))\n",
    "\n",
    "# Add callback function\n",
    "p.addcbpreintsol(cb_preintsol, n)\n",
    "\n",
    "# Solve the problem and print solution\n",
    "p.optimize()\n",
    "\n",
    "print(p.attributes.solstatus.name)\n",
    "\n",
    "if p.attributes.solstatus not in [xp.SolStatus.OPTIMAL, xp.SolStatus.FEASIBLE]:\n",
    "    print(\"Solve status:\", p.attributes.solvestatus.name)\n",
    "    print(\"Solution status:\", p.attributes.solstatus.name)\n",
    "else:\n",
    "    plot_sol(p)  # plot solution"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As we can observe, the problem has been solved even faster than using the MTZ formulation, yielding the same solution and objective value in considerably less time, making the problem even more scalable. \n",
    "\n",
    "As an optional exercise, you can experiment with increasing the number the number of cities (*n* below) in the cell below and run the previous code cell again to see how high the number of cities <tt>n</tt> can go before the problem becomes computationally too expensive (let's say, takes more than 1 minute to solve to proven optimality)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Create random TSP problem data\n",
    "n = 150\n",
    "\n",
    "CITIES = range(n)  # set of cities: 0..n-1\n",
    "\n",
    "np.random.seed(0)\n",
    "\n",
    "X = 100 * np.random.rand(n)\n",
    "Y = 100 * np.random.rand(n)\n",
    "\n",
    "XY = (X, Y)\n",
    "\n",
    "# Compute distance matrix\n",
    "dist = np.ceil(np.sqrt ((X.reshape(n,1) - X.reshape(1,n))**2 +\n",
    "                        (Y.reshape(n,1) - Y.reshape(1,n))**2))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}

Back to examples browser