{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Routing"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We consider a backbone network with $n$ nodes, and $n(n − 1)$ ingress-egress (IE)pairs. We index nodes as $i = 1,\\ldots,n$, and IE pairs as $(k, l)$, which refers to ingress (source)\n",
    "$l$ and egress (destination) $k$, i.e., from node $l$ to node $k$. The traffic from node $l$ to node $k$\n",
    "is denoted $T_{kl} \\geq 0$. Note that the traffic exiting at node $k$ is given by\n",
    "$E_k = \\sum_l T_{kl}$. We refer to the matrix $T$ as a traffic pattern.\n",
    "\n",
    "The network has m directed edges, with adjacency\n",
    "matrix $A$, where\n",
    "$$\n",
    "A_{ij} = \\begin{cases} +1 \\textrm{ if edge }j \\textrm{ enters node }$i$ \\\\\n",
    "−1 \\textrm{ if edge }j\\textrm{ leaves node }i\\\\\n",
    "0\\textrm{ otherwise}.\n",
    "\\end{cases}\n",
    "$$\n",
    "We allow the splitting of traffic corresponding to one IE pair, which means we can aggregate\n",
    "all flows in the network that share the same destination or egress node. We let $F_{kj} \\geq 0$\n",
    "denote the flow on edge $j$ that is destined for destination $k$.\n",
    "\n",
    "Conservation of flow and capacity constraints are given by the convex constraints\n",
    "$$\n",
    "\\begin{array}{cc}\n",
    "T + AF^T = 0, \\\\\n",
    "F^T1 \\leq c,\\; 0 \\leq F\n",
    "\\end{array}\n",
    "$$\n",
    "\n",
    "The optimization problem is to maximize the utility $U(T) = \\sum_{k\\neq l}\\psi(T_{kl})$ of the traffic flows,\n",
    "subject to conservation of flow and edge capacity constraints:\n",
    "$$\n",
    "\\begin{array}{cc}\n",
    "\\textrm{minimize} & \\sum_{k\\neq l}\\psi(T_{kl}) \\\\\n",
    "subject to & T + AF^T = 0, \\\\\n",
    "& F^T1 \\leq c, \\\\\n",
    "& 0 \\leq F\n",
    "\\end{array}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import cvxpy as cvx\n",
    "import matplotlib.pyplot as plt\n",
    "# import networkx as nx\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "ECOS 2.0.4 - (C) embotech GmbH, Zurich Switzerland, 2012-15. Web: www.embotech.com/ECOS\n",
      "\n",
      "It     pcost       dcost      gap   pres   dres    k/t    mu     step   sigma     IR    |   BT\n",
      " 0  +0.000e+00  -3.175e+01  +2e+02  6e-01  5e-01  1e+00  3e+00    ---    ---    1  1  - |  -  - \n",
      " 1  -1.278e+01  -1.768e+01  +6e+01  1e-01  7e-02  3e-01  8e-01  0.8189  7e-02   1  1  1 |  0  0\n",
      " 2  -1.033e+01  -1.324e+01  +4e+01  7e-02  3e-02  3e-01  5e-01  0.6356  4e-01   1  1  1 |  0  0\n",
      " 3  -8.634e+00  -9.016e+00  +6e+00  8e-03  4e-03  4e-02  8e-02  0.8547  2e-02   1  1  1 |  0  0\n",
      " 4  -8.482e+00  -8.607e+00  +2e+00  3e-03  1e-03  1e-02  2e-02  0.8731  2e-01   1  1  1 |  0  0\n",
      " 5  -8.353e+00  -8.390e+00  +5e-01  7e-04  3e-04  2e-03  7e-03  0.9334  2e-01   1  1  1 |  0  0\n",
      " 6  -8.307e+00  -8.308e+00  +2e-02  2e-05  1e-05  7e-05  2e-04  0.9713  7e-04   1  1  1 |  0  0\n",
      " 7  -8.306e+00  -8.306e+00  +4e-04  6e-07  3e-07  2e-06  6e-06  0.9718  4e-04   2  1  1 |  0  0\n",
      " 8  -8.306e+00  -8.306e+00  +7e-06  9e-09  4e-09  3e-08  9e-08  0.9849  1e-04   2  1  1 |  0  0\n",
      " 9  -8.306e+00  -8.306e+00  +3e-07  4e-10  2e-10  1e-09  3e-09  0.9613  1e-04   2  1  1 |  0  0\n",
      "10  -8.306e+00  -8.306e+00  +1e-08  2e-11  9e-12  7e-11  2e-10  0.9432  7e-04   2  1  1 |  0  0\n",
      "\n",
      "OPTIMAL (within feastol=2.4e-11, reltol=1.8e-09, abstol=1.5e-08).\n",
      "Runtime: 0.001182 seconds.\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "8.3056585833248224"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.random.seed(1)\n",
    "n = 5\n",
    "edges = [(0,1), (3, 4), (1,2), (2,3), (4,2), (4, 0)]\n",
    "m = len(edges)\n",
    "A = np.zeros((n, m))\n",
    "for idx, edge in enumerate(edges):\n",
    "    A[edge[0], idx] = -1\n",
    "    A[edge[1], idx] = +1\n",
    "F = cvx.Variable((n, m))\n",
    "T = cvx.Variable((n, n))\n",
    "# Masks out diagonals.\n",
    "M = (np.ones((n, n)) - np.eye(n)).astype(bool)\n",
    "c = np.ones(m)\n",
    "T_min = np.zeros((n, n))\n",
    "\n",
    "obj = cvx.Maximize(cvx.sum(cvx.sqrt(T[M])))\n",
    "prob = cvx.Problem(obj, \n",
    "                   [A*F.T == T,\n",
    "                    F >= 0,\n",
    "                    cvx.sum(F, 0) <= c,\n",
    "                    (T - T_min)[M] >= 0])\n",
    "\n",
    "# Define problem data.\n",
    "prob.solve(solver=cvx.ECOS, verbose=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Nodes of graph: \n",
      "[0, 1, 2, 3, 4]\n",
      "Edges of graph: \n",
      "[(0, 1), (0, 4), (1, 2), (2, 3), (2, 4), (3, 4)]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nGP8f2UgdAi8/hNsAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1190af910>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot results.\n",
    "import networkx as nx\n",
    "\n",
    "G=nx.Graph()\n",
    "G.add_nodes_from(range(n))\n",
    "G.add_edges_from(edges)\n",
    "\n",
    "print(\"Nodes of graph: \")\n",
    "print(G.nodes())\n",
    "print(\"Edges of graph: \")\n",
    "print(G.edges())\n",
    "\n",
    "# Plot the result.\n",
    "plt.figure(figsize=(12,10))\n",
    "pos=nx.spring_layout(G)\n",
    "node_colors = cvx.diag(T).value.tolist()\n",
    "nodes = nx.draw_networkx_nodes(G,pos,node_color=node_colors, with_labels=False,\n",
    "                               node_size=100, node_cmap=plt.cm.Reds)\n",
    "edge_colors = cvx.sum(F, 0).value.tolist()\n",
    "edges = nx.draw_networkx_edges(G,pos,edge_color=edge_colors,width=4,\n",
    "                               edge_cmap=plt.cm.Blues, arrows=True)\n",
    "plt.colorbar(edges, label='Edge flow')\n",
    "plt.colorbar(nodes, label='Node traffic')\n",
    "plt.axis('off')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "ename": "NameError",
     "evalue": "name 'nodes' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-3-ef0b1e23c6e0>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m     31\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m12\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     32\u001b[0m \u001b[0mpos\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mzip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mG\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mG\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# dictionary of node names->positions\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 33\u001b[0;31m \u001b[0mnode_colors\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mnode\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mnodes\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     34\u001b[0m nodes = nx.draw_networkx_nodes(G,pos,node_color=node_colors, with_labels=False,\n\u001b[1;32m     35\u001b[0m                                node_size=100, node_cmap=plt.cm.Reds)\n",
      "\u001b[0;31mNameError\u001b[0m: name 'nodes' is not defined"
     ]
    }
   ],
   "source": [
    "\n",
    "\n",
    "grid_dim = 7\n",
    "p = grid_dim*grid_dim\n",
    "k = 6\n",
    "n = 2*(grid_dim-1)*grid_dim\n",
    "U = np.random.uniform(20, 50, size=k)\n",
    "L = -np.random.uniform(0, 5, size=p)\n",
    "c = np.random.uniform(5, 10, size=n)\n",
    "\n",
    "# Create a networkx graph.\n",
    "# G.nodes() is a list of node keys.\n",
    "# G.edges() is a list of edge keys of the form (node key, node key).\n",
    "G = nx.grid_2d_graph(grid_dim, grid_dim)\n",
    "# Map node key to the index in nodes.\n",
    "node_key_to_idx = {key:i for i, key in enumerate(G.nodes())}\n",
    "\n",
    "\n",
    "# Connect nodes via edges.\n",
    "for i, key in enumerate(G.edges()):\n",
    "    idx1 = node_key_to_idx[key[0]]\n",
    "    idx2 = node_key_to_idx[key[1]]\n",
    "    #edges[i].connect(nodes[idx1], nodes[idx2])\n",
    " \n",
    "# Plot the result.\n",
    "plt.figure(figsize=(12,10))\n",
    "pos = dict(zip(G,G)) # dictionary of node names->positions\n",
    "node_colors = [1 for node in nodes]\n",
    "nodes = nx.draw_networkx_nodes(G,pos,node_color=node_colors, with_labels=False,\n",
    "                               node_size=100, node_cmap=plt.cm.Reds)\n",
    "edge_colors = [1 for edge in edges]\n",
    "edges = nx.draw_networkx_edges(G,pos,edge_color=edge_colors,width=4,\n",
    "                               edge_cmap=plt.cm.Blues, arrows=True)\n",
    "plt.colorbar(edges, label='Edge flow')\n",
    "plt.colorbar(nodes, label='Node source')\n",
    "plt.axis('off')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
