{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "![MOSEK ApS](https://www.mosek.com/static/images/branding/webgraphmoseklogocolor.png )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We implement a Python Fusion model for the problem known as F-SPARC (fractional subcarrier and power allocation with rate constraints). Our implementation defines a mixed-integer exponential cone problem.\n", "\n", "The model comes from the paper *Bi-Perspective Functions for Mixed-Integer Fractional Programs with Indicator Variables* by Adam N. Letchford, Qiang N and, Zhaoyu Zhong, http://www.optimization-online.org/DB_HTML/2017/09/6222.html.\n", "\n", "Some test data come from http://www.research.lancs.ac.uk/portal/en/datasets/ofdma-optimisation(48d843b0-1fb6-4e3d-af39-ca533a37b7ab).html\n", "\n", "# Problem formulation\n", "\n", "We consider a set $I$ of communication channels (subcarriers) to be assigned to a set $J$ of users. Each channel can be assigned to at most one user, while one user will typically have more channels assigned to them, subject to the requirement that user $j$ achieves a total data rate of at least $d_j$ (bits per second). The data rate of a channel is computed as follows: for a channel of bandwidth $B$ (hertz), noise level $N_i$ (watts) and operating with power $p_i$ (watts), the maximum data rate is\n", "$$f_i = B \\log_2(1+\\frac{p_i}{N_i}).$$\n", "Finally, we assume a minimal system power of $\\sigma$ required to keep the system running and a maximum power level $P$. \n", "\n", "The goal is to map the channels to users and assign their power levels so that the *energy efficiency*\n", "\n", "$$\\frac{\\textrm{total data rate}}{\\textrm{total power}}$$\n", "is maximized.\n", "\n", "The mixed-integer formulation is then:\n", "$$\n", "\\begin{array}{rl}\n", "\\mathrm{maximize} & \\frac{\\sum_{i,j} B \\log_2(1+p_{i,j}/N_i)}{\\sigma+\\sum_{i,j}p_{i,j}} \\\\\n", "\\textrm{subject to} & B \\sum_i \\log_2(1+p_{i,j}/N_i) \\geq d_j, \\quad j\\in J, \\\\\n", "& \\sigma + \\sum_{i,j}p_{ij} \\leq P, \\\\\n", "& 0 \\leq p_{ij}\\leq Px_{ij}, x_{ij}\\in \\{0,1\\}, \\\\\n", "& \\sum_j x_{ij} \\leq 1,\\quad i\\in I,\n", "\\end{array}\n", "$$\n", "\n", "where $p_{ij}$ is the power assigned to channel $i$ when used by user $j$. The first constraint describes the total bitrate of each user, the second bounds total power, and the remaining constraints with indicator variables model the assignment requirements.\n", "\n", "\n", "# Conic reformulation\n", "\n", "To obtain a problem in conic form we perform a homogenization as in Section 5.2 of Letchfort et al. That is, we introduce new variables $t$, $z_{ij}$ and $\\tilde{p_{ij}}$ with the intention of representing\n", "$$t = 1/(\\sigma+\\sum_{ij}p_{ij}),\\quad z_{ij}=Bt\\log_2(1+p_{ij}/N_i),\\quad \\tilde{p_{ij}} = p_{ij}t.$$\n", "In terms of the new variables the problem is equivalent with\n", "\n", "$$\n", "\\begin{array}{rl}\n", "\\mathrm{maximize} & \\sum_{i,j} z_{ij} \\\\\n", "\\textrm{subject to} & z_{ij} \\leq B t \\log_2(1+\\tilde{p_{i,j}}/(tN_i)), \\quad i \\in I, j\\in J, \\\\\n", "& d_jt \\leq \\sum_i z_{ij},\\quad j\\in J \\\\\n", "& t\\sigma + \\sum_{i,j} \\tilde{p_{i,j}} = 1, \\\\\n", "& 1/P \\leq t \\leq 1/\\sigma, \\\\\n", "& 0 \\leq \\tilde{p_{i,j}} \\leq x_{ij}, x_{ij}\\in \\{0,1\\}, \\\\\n", "& \\sum_j x_{ij} \\leq 1,\\quad i\\in I,\n", "\\end{array}\n", "$$\n", "The first constraint can equivalently be written as\n", "$$t+\\tilde{p_{i,j}}/N_i \\geq t \\exp(\\log(2)z_{i,j}/(Bt))$$\n", "which, using the exponential cone, is\n", "$$(t+\\tilde{p_{i,j}}/N_i , t, \\log(2)z_{i,j}/B)\\in K_\\mathrm{exp}.$$\n", "\n", "# Implementation in Fusion\n", "\n", "We start that functions which parse examples in the format of http://www.research.lancs.ac.uk/portal/en/datasets/ofdma-optimisation(48d843b0-1fb6-4e3d-af39-ca533a37b7ab).html and set up some global constants. The data files contain user demands and channel noise for each example." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import ast, sys\n", "\n", "constants = {\n", " \"System Power\": 10, \n", " \"Bandwidth\": 1.25, \n", " \"Maximum Power\": 36\n", "}\n", "\n", "def parse(filename):\n", " data = []\n", " with open(filename, 'r') as file:\n", " content = file.read()\n", " if 'Instance: ' not in content: raise Exception\n", " \n", " for inst in content.split('Instance: ')[1:]:\n", " if 'noise' not in inst or 'demand' not in inst: raise Exception\n", "\n", " data.append({\n", " \"noise\" : ast.literal_eval(inst.split('noise')[1].split('demand')[0].strip()), \n", " \"demand\" : ast.literal_eval(inst.split('demand')[1].strip())\n", " })\n", " return data \n", "\n", "BW = constants[\"Bandwidth\"]\n", "P = constants[\"Maximum Power\"]\n", "SIGMA = constants[\"System Power\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The next function is a direct implementation of the conic model above." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from mosek.fusion import *\n", "from math import log\n", "\n", "def fsparc_model(n, d):\n", " M = Model()\n", " I, J = len(n), len(d)\n", "\n", " # create variables\n", " z = M.variable('z', [I, J], Domain.greaterThan(0.0)) \n", " x = M.variable('x', [I, J], Domain.binary()) \n", " p_tilde = M.variable('p_tilde', [I, J], Domain.greaterThan(0.0))\n", " t = M.variable('t', 1, Domain.inRange(1.0/P, 1.0/SIGMA)) \n", "\n", " # add linear constraints\n", " M.constraint(Expr.sum(x, 1), Domain.lessThan(1.0)) \n", " M.constraint(Expr.add(Expr.mul(SIGMA, t), Expr.sum(p_tilde)), Domain.equalsTo(1.0))\n", " M.constraint(Expr.sub(p_tilde, x), Domain.lessThan(0.0)) \n", " M.constraint(Expr.sub(Expr.sum(z, 0), Expr.mulElm(Expr.repeat(t, J, 0), d)), Domain.greaterThan(0.0))\n", " \n", " # objective\n", " M.objective(\"obj\", ObjectiveSense.Maximize, Expr.sum(z))\n", " \n", " # add conic constraint\n", " p_over_n = Expr.mulElm(p_tilde, [[1 / n_i] * J for n_i in n])\n", " multi_t = Expr.repeat(Expr.repeat(t, I, 0), J, 1)\n", " M.constraint(Expr.stack(2, Expr.add(multi_t, p_over_n), multi_t, Expr.mul(log(2.0) / BW, z)), \n", " Domain.inPExpCone())\n", " \n", " return M\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next we run the model and present some statistics for a few examples." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "\n", "def stats(M, n, d):\n", " I, J = len(n), len(d)\n", " t = M.getVariable('t').level()[0]\n", " pval = M.getVariable('p_tilde').level().reshape([I, J]) / t\n", " xval = M.getVariable('x').level().reshape([I, J])\n", " power = [sum(pval[i,:]) for i in range(I)]\n", " user = [int(sum([xval[i][j]*j for j in range(J)])) for i in range(I)]\n", " print(\"Total data rate: demanded {0}, provided {1}\".format(\n", " sum(d), \n", " sum([BW*log(1+power[i]/n[i])/log(2.0) for i in range(I)])))\n", " print(\"Power: system {0:.3f}, used {1:.3f}, maximal: {2:.3f}\".format(SIGMA, SIGMA+sum(power), P))\n", " colors = ['red', 'green', 'blue', 'cyan', 'yellow', 'violet'] \n", " plt.bar(range(I), power, color = [colors[user[i]] for i in range(I)])\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Example 1\n", "\n", "We run an example with realistic data (72 channels, 4 users) with a very short time limit." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Problem\n", " Name : \n", " Objective sense : max \n", " Type : CONIC (conic optimization problem)\n", " Constraints : 1229 \n", " Cones : 288 \n", " Scalar variables : 1729 \n", " Matrix variables : 0 \n", " Integer variables : 288 \n", "\n", "Optimizer started.\n", "Mixed integer optimizer started.\n", "Threads used: 20\n", "Presolve started.\n", "Presolve terminated. Time = 0.01\n", "Presolved problem: 1440 variables, 940 constraints, 2883 non-zeros\n", "Presolved problem: 0 general integer, 288 binary, 1152 continuous\n", "Clique table size: 72\n", "BRANCHES RELAXS ACT_NDS DEPTH BEST_INT_OBJ BEST_RELAX_OBJ REL_GAP(%) TIME \n", "0 1 1 0 NA 3.2821073370e+02 NA 0.1 \n", "Cut generation started.\n", "0 2 1 0 NA 3.2821073370e+02 NA 0.6 \n", "Cut generation terminated. Time = 0.00\n", "8 12 9 2 NA 3.2564092596e+02 NA 1.0 \n", "21 25 22 5 NA 3.2564092596e+02 NA 1.1 \n", "36 40 37 5 NA 3.2564092596e+02 NA 1.2 \n", "49 53 50 6 NA 3.2564092596e+02 NA 1.3 \n", "79 83 80 8 NA 3.2564092596e+02 NA 1.5 \n", "159 163 160 12 NA 3.2564092596e+02 NA 1.7 \n", "319 323 320 20 NA 3.2564092596e+02 NA 2.3 \n", "639 643 640 36 NA 3.2564092596e+02 NA 3.3 \n", "1079 1083 1080 58 NA 3.2564092596e+02 NA 5.1 \n", "1540 1544 1519 4 9.6388958662e+01 3.2355936051e+02 235.68 7.0 \n", "2003 2003 1610 76 9.7146226251e+01 3.1948388561e+02 228.87 8.8 \n", "2483 2483 2056 10 9.7146226251e+01 3.1418591147e+02 223.42 10.4 \n", "2963 2963 2534 16 9.7146226251e+01 3.1198674503e+02 221.15 11.8 \n", "3442 3442 3011 40 9.7146226251e+01 3.1198674503e+02 221.15 13.4 \n", "3917 3917 3486 64 9.7146226251e+01 3.1198674503e+02 221.15 15.1 \n", "4389 4389 3870 13 9.7146226251e+01 3.1198474109e+02 221.15 17.0 \n", "4863 4863 4200 10 9.7146226251e+01 3.1068358231e+02 219.81 18.6 \n", "5343 5343 4680 11 9.7146226251e+01 3.0978236788e+02 218.88 20.1 \n", "5823 5823 5160 12 9.7146226251e+01 3.0943340745e+02 218.52 21.6 \n", "6303 6303 5624 9 9.7146226251e+01 3.0892256489e+02 218.00 23.2 \n", "6783 6783 6104 20 9.7146226251e+01 3.0848648896e+02 217.55 24.6 \n", "7260 7260 6581 44 9.7146226251e+01 3.0848648896e+02 217.55 26.1 \n", "7740 7740 7061 68 9.7146226251e+01 3.0848648896e+02 217.55 27.7 \n", "8209 8209 7522 12 9.7146226251e+01 3.0843778266e+02 217.50 29.5 \n", "8678 8678 7845 13 9.7146226251e+01 3.0824261215e+02 217.30 31.2 \n", "9156 9156 8281 14 9.7146226251e+01 3.0782433694e+02 216.87 33.0 \n", "9636 9636 8723 15 9.7146226251e+01 3.0758164100e+02 216.62 34.6 \n", "10115 10115 9152 16 9.7146226251e+01 3.0726996741e+02 216.30 36.2 \n", "10556 10556 9527 38 9.7146226251e+01 3.0726996741e+02 216.30 38.1 \n", "11034 11034 9989 62 9.7146226251e+01 3.0726996741e+02 216.30 39.7 \n", "\n", "Objective of best integer solution : 9.714622625080e+01 \n", "Best objective bound : 3.072699674120e+02 \n", "Construct solution objective : Not employed\n", "Construct solution # roundings : 0\n", "User objective cut value : 0\n", "Number of cuts generated : 0\n", "Number of branches : 11034\n", "Number of relaxations solved : 11034\n", "Number of interior point iterations: 242428\n", "Number of simplex iterations : 0\n", "Time spend presolving the root : 0.01\n", "Time spend optimizing the root : 0.09\n", "Mixed integer optimizer terminated. Time: 40.03\n", "\n", "Optimizer terminated. Time: 40.08 \n", "\n", "\n", "Integer solution solution summary\n", " Problem status : PRIMAL_FEASIBLE\n", " Solution status : PRIMAL_FEASIBLE\n", " Primal. obj: 9.7146226251e+01 nrm: 8e+03 Viol. con: 6e-05 var: 6e-10 cones: 0e+00 itg: 0e+00 \n", "Total data rate: demanded 1144.5349999999999, provided 1144.5614497476022\n", "Power: system 10.000, used 11.782, maximal: 36.000\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAD8CAYAAAB3u9PLAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAEz5JREFUeJzt3X+MZWV9x/H3pzvu+qMFdHcwlIXuGrZW1PprQjW2TQuFrkZdEzGuIcofJNsYSTS2aSANVEn8g39q25SaYEGR1IKlpU4UXX+gaTQGd1ZQWHDriBjGtbIUStUG6Npv/7jPlsvdO3vPzNzZueu+X8nNPec5z3nme865s5895957JlWFJEm/tNYFSJImg4EgSQIMBElSYyBIkgADQZLUGAiSJMBAkCQ1BoIkCTAQJEnN1FoXsBSbNm2qLVu2rHUZknRc2bt378NVNT2q33EVCFu2bGFubm6ty5Ck40qSH3Tp5yUjSRJgIEiSGgNBkgQYCJKkxkCQJAEGgiSpMRAkSYCBIElqDARJEnCcfVNZK5A8NV21tP6LrbMaY47DUuta7jpLtRo/Y3CfDupy3FbjWC/Hcuo6FnUcbXmXPpP0GhzBMwRJEmAgSJIaA0GSBBgIkqTGQJAkASfwp4xGfDaDLu/xdxkjK5jvus6oukb16TJmF122Zal1LGeMUbqMOY4xVnufdh1zHHWMGnMcvwvjqONoy7v0We4YS3WsXj9L5RmCJAkwECRJjYEgSQIMBElSYyBIkoCOgZBke5L9SeaTXDZk+YYkN7fldyTZ0trPT7I3yd3t+dy+db7SxryrPU4d10ZJkpZu5MdOk6wDrgHOBxaAPUlmq+revm6XAI9W1VlJdgJXA28DHgbeWFUHkrwE2A2c3rfeRVU1N6ZtkSStQJczhHOA+aq6v6qeBG4Cdgz02QHc0KZvAc5Lkqq6s6oOtPZ9wDOTbBhH4ZKk8eoSCKcDD/bNL/D0/+U/rU9VHQIeAzYO9HkLcGdVPdHX9tF2ueiKZNR9fCVJq6lLIAz7h3rwi3NH7ZPkxfQuI/1R3/KLquqlwO+0xzuG/vBkV5K5JHMHDx7sUK4kaTm6BMICcEbf/GbgwGJ9kkwBJwOPtPnNwK3AO6vqe4dXqKoftuefAJ+gd2nqCFV1bVXNVNXM9PR0l22SJC1Dl0DYA2xLsjXJemAnMDvQZxa4uE1fCNxeVZXkFOAzwOVV9bXDnZNMJdnUpp8BvAG4Z2WbIklaiZGB0N4TuJTeJ4TuAz5ZVfuSXJXkTa3bdcDGJPPA+4DDH029FDgLuGLg46UbgN1Jvg3cBfwQ+Mg4N0yStDSpNfrbncsxMzNTc3Pj+ZTqCXe304G/1zpyzGX83diR2zJkzFW52+mIv03bZf+Mshp1jfo5nY7ToCH7eBx/U3lV7na6jLpW5W6nR9lWGP46PnLQlb8Gx3m30yR7q2pmVD+/qSxJAgwESVJjIEiSAANBktQYCJIkwECQJDUGgiQJMBAkSY2BIEkCDARJUmMgSJIAA0GS1BgIkiTAQJAkNQaCJAkwECRJjYEgSQIMBElSYyBIkgADQZLUGAiSJMBAkCQ1BoIkCTAQJEmNgSBJAgwESVJjIEiSAANBktQYCJIkoGMgJNmeZH+S+SSXDVm+IcnNbfkdSba09vOT7E1yd3s+t2+dV7X2+SR/nSTj2ihJ0tKNDIQk64BrgNcBZwNvT3L2QLdLgEer6izgQ8DVrf1h4I1V9VLgYuDGvnU+DOwCtrXH9hVshyRphbqcIZwDzFfV/VX1JHATsGOgzw7ghjZ9C3BeklTVnVV1oLXvA57ZziZOA06qqq9XVQEfB9684q2RJC1bl0A4HXiwb36htQ3tU1WHgMeAjQN93gLcWVVPtP4LI8aUJB1DUx36DLu2X0vpk+TF9C4jXbCEMQ+vu4vepSXOPPPMUbVKkpapyxnCAnBG3/xm4MBifZJMAScDj7T5zcCtwDur6nt9/TePGBOAqrq2qmaqamZ6erpDucMlTz20dP37by334VrVMQnbfqxMyrFeLauxbb8o+6tLIOwBtiXZmmQ9sBOYHegzS+9NY4ALgdurqpKcAnwGuLyqvna4c1X9CPhJkle3Txe9E/jUCrdFkrQCIwOhvSdwKbAbuA/4ZFXtS3JVkje1btcBG5PMA+8DDn809VLgLOCKJHe1x6lt2buAvwPmge8Bnx3XRkmSli69D/kcH2ZmZmpubm5Z6/afylUNfxOjX5e90mWMrGC+6zqj6io4YgeMHHPg3DcDP6lqaWMC1OD5dIc6jtjHRw5x9NqHvL677J8j1hnx+hl1HLr8jGGWepyOMGQfH7kx4z/WR5TBErdlSF2jjmXX34WjHctRvyuwyOt48NCO4TU4atuWIsneqpoZ1c9vKkuSgG6fMjph5QNPZXT9eR0xPykmta5JsZz9cyzW6e8/jMfySKP28aT+LhxxrCeotn6eIUiSAANBktQYCJIkwECQJDUGgiQJMBAkSY2BIEkCDARJUmMgSJIAA0GS1BgIkiTAQJAkNQaCJAkwECRJjYEgSQIMBElSYyBIkgADQZLUGAiSJMBAkCQ1BoIkCTAQJEmNgSBJAgwESVJjIEiSAANBktQYCJIkoGMgJNmeZH+S+SSXDVm+IcnNbfkdSba09o1Jvpzkp0n+ZmCdr7Qx72qPU8exQZKk5Zka1SHJOuAa4HxgAdiTZLaq7u3rdgnwaFWdlWQncDXwNuBx4ArgJe0x6KKqmlvhNkiSxqDLGcI5wHxV3V9VTwI3ATsG+uwAbmjTtwDnJUlV/ayqvkovGCRJE6xLIJwOPNg3v9DahvapqkPAY8DGDmN/tF0uuiJJOvSXJK2SLoEw7B/qWkafQRdV1UuB32mPdwz94cmuJHNJ5g4ePDiyWEnS8nQJhAXgjL75zcCBxfokmQJOBh452qBV9cP2/BPgE/QuTQ3rd21VzVTVzPT0dIdyJUnL0SUQ9gDbkmxNsh7YCcwO9JkFLm7TFwK3V9WiZwhJppJsatPPAN4A3LPU4iVJ4zPyU0ZVdSjJpcBuYB1wfVXtS3IVMFdVs8B1wI1J5umdGew8vH6SB4CTgPVJ3gxcAPwA2N3CYB3wReAjY90ySdKSjAwEgKq6DbhtoO3KvunHgbcusu6WRYZ9VbcSJUnHgt9UliQBBoIkqTEQJEmAgSBJagwESRJgIEiSGgNBkgQYCJKkxkCQJAEGgiSpMRAkSYCBIElqDARJEmAgSJIaA0GSBBgIkqTGQJAkAQaCJKkxECRJgIEgSWoMBEkSYCBIkhoDQZIEGAiSpMZAkCQBBoIkqTEQJEmAgSBJagwESRJgIEiSmk6BkGR7kv1J5pNcNmT5hiQ3t+V3JNnS2jcm+XKSnyb5m4F1XpXk7rbOXyfJODZIkrQ8IwMhyTrgGuB1wNnA25OcPdDtEuDRqjoL+BBwdWt/HLgC+JMhQ38Y2AVsa4/ty9kASdJ4dDlDOAeYr6r7q+pJ4CZgx0CfHcANbfoW4LwkqaqfVdVX6QXD/0tyGnBSVX29qgr4OPDmlWyIJGllugTC6cCDffMLrW1on6o6BDwGbBwx5sKIMQFIsivJXJK5gwcPdihXkrQcXQJh2LX9WkafZfWvqmuraqaqZqanp48ypCRpJboEwgJwRt/8ZuDAYn2STAEnA4+MGHPziDElScdQl0DYA2xLsjXJemAnMDvQZxa4uE1fCNze3hsYqqp+BPwkyavbp4veCXxqydVLksZmalSHqjqU5FJgN7AOuL6q9iW5CpirqlngOuDGJPP0zgx2Hl4/yQPAScD6JG8GLqiqe4F3AR8DngV8tj0kSWtkZCAAVNVtwG0DbVf2TT8OvHWRdbcs0j4HvKRroZKk1eU3lSVJgIEgSWoMBEkSYCBIkhoDQZIEGAiSpMZAkCQBBoIkqTEQJEmAgSBJagwESRJgIEiSGgNBkgQYCJKkxkCQJAEGgiSpMRAkSYCBIElqDARJEmAgSJIaA0GSBBgIkqTGQJAkAQaCJKkxECRJgIEgSWoMBEkSYCBIkhoDQZIEdAyEJNuT7E8yn+SyIcs3JLm5Lb8jyZa+ZZe39v1J/rCv/YEkdye5K8ncODZGkrR8U6M6JFkHXAOcDywAe5LMVtW9fd0uAR6tqrOS7ASuBt6W5GxgJ/Bi4FeBLyb59ar6eVvv96vq4TFujyRpmbqcIZwDzFfV/VX1JHATsGOgzw7ghjZ9C3BekrT2m6rqiar6PjDfxpMkTZgugXA68GDf/EJrG9qnqg4BjwEbR6xbwOeT7E2ya+mlS5LGaeQlIyBD2qpjn6Ot+9qqOpDkVOALSb5TVf96xA/vhcUugDPPPLNDuZKk5ehyhrAAnNE3vxk4sFifJFPAycAjR1u3qg4/PwTcyiKXkqrq2qqaqaqZ6enpDuVKkpajSyDsAbYl2ZpkPb03iWcH+swCF7fpC4Hbq6pa+872KaStwDbgG0mek+RXAJI8B7gAuGflmyNJWq6Rl4yq6lCSS4HdwDrg+qral+QqYK6qZoHrgBuTzNM7M9jZ1t2X5JPAvcAh4N1V9fMkzwdu7b3vzBTwiar63CpsnySpoy7vIVBVtwG3DbRd2Tf9OPDWRdb9IPDBgbb7gZcttVhJ0urxm8qSJMBAkCQ1BoIkCTAQJEmNgSBJAgwESVJjIEiSAANBktQYCJIkwECQJDUGgiQJMBAkSY2BIEkCDARJUmMgSJIAA0GS1BgIkiTAQJAkNQaCJAkwECRJjYEgSQIMBElSYyBIkgADQZLUGAiSJMBAkCQ1BoIkCTAQJEmNgSBJAjoGQpLtSfYnmU9y2ZDlG5Lc3JbfkWRL37LLW/v+JH/YdUxJ0rE1MhCSrAOuAV4HnA28PcnZA90uAR6tqrOADwFXt3XPBnYCLwa2A3+bZF3HMSVJx1CXM4RzgPmqur+qngRuAnYM9NkB3NCmbwHOS5LWflNVPVFV3wfm23hdxpQkHUNdAuF04MG++YXWNrRPVR0CHgM2HmXdLmNKko6hqQ59MqStOvZZrH1YEA2O2Rs42QXsarM/TbJ/kTq72pTw8KhOg4Xn/TnqfKcxlja/CXh4yWMMqeuIluSoy4dv2cA6T81uAh4eNeb46jjqEKN+xqa8P0cc+5F1DR77IYWNfL2M+BkDesd+xBhd9s/I4zK0jhHbO7hPWcbv04j54Tt5xHEZ7P705cN/n5b2+unUZ8T+6lm89s6/T0v0a106dQmEBeCMvvnNwIFF+iwkmQJOBh4Zse6oMQGoqmuBazvU2UmSuaqaGdd4q8U6x+94qfV4qROOn1qts5sul4z2ANuSbE2ynt6bxLMDfWaBi9v0hcDtVVWtfWf7FNJWYBvwjY5jSpKOoZFnCFV1KMmlwG5gHXB9Ve1LchUwV1WzwHXAjUnm6Z0Z7Gzr7kvySeBe4BDw7qr6OcCwMce/eZKkrrpcMqKqbgNuG2i7sm/6ceCti6z7QeCDXcY8RsZ2+WmVWef4HS+1Hi91wvFTq3V2kN6VHUnSic5bV0iSgBMoECb5VhlJrk/yUJJ7+tqel+QLSb7bnp+7ljW2ms5I8uUk9yXZl+Q9k1hrkmcm+UaSb7U6P9Dat7Zbq3y33Wpl/VrWeVj79v6dST7d5ie1zgeS3J3kriRzrW2ijn2r6ZQktyT5TnutvmZC63xh25eHH/+V5L1rWesJEQjHwa0yPkbv1h79LgO+VFXbgC+1+bV2CPjjqnoR8Grg3W0/TlqtTwDnVtXLgJcD25O8mt4tVT7U6nyU3i1XJsF7gPv65ie1ToDfr6qX9300ctKOPcBfAZ+rqt8AXkZv305cnVW1v+3LlwOvAv4buJW1rLWqfuEfwGuA3X3zlwOXr3VdAzVuAe7pm98PnNamTwP2r3WNQ2r+FHD+JNcKPBv4JvBb9L5ANTXsNbGG9W2m90t/LvBpet9Bmrg6Wy0PAJsG2ibq2AMnAd+nvT86qXUOqfsC4GtrXesJcYbA8XmrjOdX1Y8A2vOpa1zP07Q72r4CuIMJrLVdhrkLeAj4AvA94D+rd2sVmJzXwF8Cfwr8b5vfyGTWCb27CXw+yd52BwGYvGP/AuAg8NF2Ge7vkjyHyatz0E7gH9r0mtV6ogRCl9tvqKMkvwz8E/Deqvqvta5nmKr6efVOxTfTu5nii4Z1O7ZVPV2SNwAPVdXe/uYhXSfltfraqnolvUuv707yu2td0BBTwCuBD1fVK4CfMQGXh46mvUf0JuAf17qWEyUQutx+Y9L8OMlpAO35oTWuB4Akz6AXBn9fVf/cmieyVoCq+k/gK/Te8zil3VoFJuM18FrgTUkeoHfH33PpnTFMWp0AVNWB9vwQvWvd5zB5x34BWKiqO9r8LfQCYtLq7Pc64JtV9eM2v2a1niiBcDzeKqP/diAX07tev6aShN630u+rqr/oWzRRtSaZTnJKm34W8Af03lj8Mr1bq8AE1FlVl1fV5qraQu81eXtVXcSE1QmQ5DlJfuXwNL1r3vcwYce+qv4deDDJC1vTefTulDBRdQ54O09dLoK1rHWt30w5hm/avB74N3rXkv9sresZqO0fgB8B/0PvfziX0LuW/CXgu+35eRNQ52/Tu3zxbeCu9nj9pNUK/CZwZ6vzHuDK1v4CevfSmqd3er5hrfdpX82/B3x6UutsNX2rPfYd/h2atGPfano5MNeO/78Az53EOlutzwb+Azi5r23NavWbypIk4MS5ZCRJGsFAkCQBBoIkqTEQJEmAgSBJagwESRJgIEiSGgNBkgTA/wHgv9+9X3gbawAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "instance = parse(\"data/lancaster/4_0.8.txt\")[0]\n", "n, d = instance[\"noise\"], instance[\"demand\"]\n", "M = fsparc_model(n, d)\n", "M.setLogHandler(sys.stdout)\n", "M.setSolverParam(\"optimizerMaxTime\", 40.0)\n", "M.solve()\n", "M.acceptedSolutionStatus(AccSolutionStatus.Feasible)\n", "stats(M, n, d)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The bar plot shows power assignments to the channels. Each color represents one user.\n", "\n", "# Example 2\n", "\n", "The next example is a small, randomly generated set of data with 15 channels and 3 users, which we should solve to optimality." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Problem\n", " Name : \n", " Objective sense : max \n", " Type : CONIC (conic optimization problem)\n", " Constraints : 199 \n", " Cones : 45 \n", " Scalar variables : 271 \n", " Matrix variables : 0 \n", " Integer variables : 45 \n", "\n", "Optimizer started.\n", "Mixed integer optimizer started.\n", "Threads used: 20\n", "Presolve started.\n", "Presolve terminated. Time = 0.00\n", "Presolved problem: 225 variables, 153 constraints, 452 non-zeros\n", "Presolved problem: 0 general integer, 45 binary, 180 continuous\n", "Clique table size: 15\n", "BRANCHES RELAXS ACT_NDS DEPTH BEST_INT_OBJ BEST_RELAX_OBJ REL_GAP(%) TIME \n", "0 1 1 0 NA 6.2736906817e+01 NA 0.0 \n", "Cut generation started.\n", "0 2 1 0 NA 6.2736906817e+01 NA 0.1 \n", "Cut generation terminated. Time = 0.00\n", "8 12 9 2 NA 5.8418013107e+01 NA 0.2 \n", "20 24 21 5 NA 5.7248034543e+01 NA 0.3 \n", "36 40 37 7 NA 5.7248034543e+01 NA 0.3 \n", "48 52 49 8 NA 5.7248034543e+01 NA 0.3 \n", "80 84 81 10 NA 5.7248034543e+01 NA 0.4 \n", "160 164 161 14 NA 5.7248034543e+01 NA 0.5 \n", "320 313 249 17 1.9890365163e+01 5.5150531676e+01 177.27 0.8 \n", "560 515 269 5 2.0074632174e+01 5.4015323987e+01 169.07 1.1 \n", "820 769 353 18 2.0886038578e+01 5.2713196601e+01 152.38 1.6 \n", "1160 1102 503 18 2.0886038578e+01 5.1086229306e+01 144.60 2.0 \n", "1619 1558 686 13 2.0886038578e+01 5.0036307959e+01 139.57 2.7 \n", "2081 2015 816 22 2.0886038578e+01 4.7777192266e+01 128.75 3.3 \n", "2545 2475 950 18 2.0886038578e+01 4.5168505100e+01 116.26 4.0 \n", "3008 2933 1043 21 2.0886038578e+01 4.2765322708e+01 104.76 4.6 \n", "3467 3391 1090 18 2.0886038578e+01 4.0000720055e+01 91.52 5.3 \n", "3913 3843 1186 21 2.0886038578e+01 3.8961479080e+01 86.54 6.0 \n", "4353 4292 1242 15 2.0886038578e+01 3.7279206008e+01 78.49 6.8 \n", "4803 4743 1316 9 2.0886038578e+01 3.6233564889e+01 73.48 7.5 \n", "5263 5200 1394 17 2.0886038578e+01 3.6162281699e+01 73.14 8.1 \n", "5717 5652 1446 21 2.0886038578e+01 3.5396585587e+01 69.47 8.8 \n", "6155 6097 1474 10 2.0886038578e+01 3.4835152140e+01 66.79 9.6 \n", "6574 6521 1477 19 2.0886038578e+01 3.4008845027e+01 62.83 10.4 \n", "7033 6977 1514 18 2.0886038578e+01 3.3563414586e+01 60.70 11.1 \n", "7474 7424 1523 14 2.0886038578e+01 3.3441191697e+01 60.11 11.9 \n", "7927 7879 1482 21 2.0886038578e+01 3.3056697831e+01 58.27 12.6 \n", "8376 8329 1467 18 2.0886038578e+01 3.2055350146e+01 53.48 13.2 \n", "8821 8777 1392 15 2.0886156731e+01 3.1721254007e+01 51.88 14.1 \n", "9275 9230 1338 14 2.0886156731e+01 3.1296712465e+01 49.84 14.8 \n", "9730 9684 1293 10 2.0886156731e+01 3.1084824213e+01 48.83 15.5 \n", "10172 10133 1255 16 2.0886156731e+01 3.0927284262e+01 48.08 16.2 \n", "10618 10580 1173 17 2.0886156731e+01 3.0531538141e+01 46.18 16.9 \n", "11060 11028 1089 14 2.0886156731e+01 3.0358038321e+01 45.35 17.7 \n", "11473 11455 1030 20 2.0886156731e+01 3.0272515219e+01 44.94 18.5 \n", "11898 11896 991 18 2.0886156731e+01 2.9876691828e+01 43.05 19.3 \n", "12327 12338 900 18 2.0886156731e+01 2.9590258263e+01 41.67 20.2 \n", "12743 12777 834 16 2.0886156731e+01 2.9590258263e+01 41.67 21.1 \n", "13180 13222 759 18 2.0886156731e+01 2.9590258263e+01 41.67 21.9 \n", "13600 13664 691 17 2.0886156731e+01 2.8856240125e+01 38.16 22.8 \n", "14033 14108 610 17 2.0886156731e+01 2.8758742060e+01 37.69 23.6 \n", "14483 14558 524 16 2.0886156731e+01 2.8140325871e+01 34.73 24.3 \n", "14918 14992 435 18 2.0886156731e+01 2.7798746872e+01 33.10 25.0 \n", "15335 15415 344 16 2.0886156731e+01 2.7511073832e+01 31.72 25.7 \n", "15675 15756 290 17 2.0886156731e+01 2.7223697972e+01 30.34 26.3 \n", "15955 16043 240 22 2.0886156731e+01 2.7223697972e+01 30.34 26.9 \n", "16195 16303 194 15 2.0886156731e+01 2.6706954318e+01 27.87 27.5 \n", "16375 16495 140 14 2.0886156731e+01 2.6240947330e+01 25.64 28.1 \n", "16515 16642 118 21 2.0886156731e+01 2.6240947330e+01 25.64 28.5 \n", "16614 16744 77 13 2.0886156731e+01 2.5988521964e+01 24.43 28.8 \n", "16673 16804 54 15 2.0886156731e+01 2.5988521964e+01 24.43 28.9 \n", "16713 16844 44 18 2.0886156731e+01 2.5988521964e+01 24.43 29.1 \n", "16750 16882 23 18 2.0886156731e+01 2.5988521964e+01 24.43 29.2 \n", "16761 16893 16 16 2.0886156731e+01 2.5988521964e+01 24.43 29.2 \n", "16776 16909 7 14 2.0886156731e+01 2.4433909459e+01 16.99 29.3 \n", "16786 16921 3 8 2.0886156731e+01 2.4433909459e+01 16.99 29.4 \n", "An optimal solution satisfying the relative gap tolerance of 1.00e-02(%) has been located.\n", "The relative gap is 0.00e+00(%).\n", "An optimal solution satisfying the absolute gap tolerance of 0.00e+00 has been located.\n", "The absolute gap is 0.00e+00.\n", "\n", "Objective of best integer solution : 2.088615673080e+01 \n", "Best objective bound : 2.088615673080e+01 \n", "Construct solution objective : Not employed\n", "Construct solution # roundings : 0\n", "User objective cut value : 0\n", "Number of cuts generated : 0\n", "Number of branches : 16791\n", "Number of relaxations solved : 16927\n", "Number of interior point iterations: 418244\n", "Number of simplex iterations : 0\n", "Time spend presolving the root : 0.00\n", "Time spend optimizing the root : 0.02\n", "Mixed integer optimizer terminated. Time: 29.53\n", "\n", "Optimizer terminated. Time: 29.55 \n", "\n", "\n", "Integer solution solution summary\n", " Problem status : PRIMAL_FEASIBLE\n", " Solution status : INTEGER_OPTIMAL\n", " Primal. obj: 2.0886156731e+01 nrm: 6e+04 Viol. con: 1e-05 var: 7e-10 cones: 0e+00 itg: 0e+00 \n", "Total data rate: demanded 297.7325530926529, provided 301.222514307648\n", "Power: system 10.000, used 14.422, maximal: 36.000\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "instance = parse(\"data/small-random/random_15_3_0.85.txt\")[0]\n", "n, d = instance[\"noise\"], instance[\"demand\"]\n", "M = fsparc_model(n, d)\n", "M.setLogHandler(sys.stdout)\n", "M.solve()\n", "stats(M, n, d)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "\"Creative
This work is licensed under a Creative Commons Attribution 4.0 International License. The **MOSEK** logo and name are trademarks of Mosek ApS. The code is provided as-is. Compatibility with future release of **MOSEK** or the `Fusion API` are not guaranteed. For more information contact our [support](mailto:support@mosek.com). " ] } ], "metadata": { "anaconda-cloud": {}, "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.6.4" } }, "nbformat": 4, "nbformat_minor": 1 }