diff --git a/.pylintdict b/.pylintdict index 77f56f507..07e036844 100644 --- a/.pylintdict +++ b/.pylintdict @@ -110,6 +110,7 @@ nosignatures np num numpy +october optimality optimizationresult optimizationresultstatus diff --git a/docs/tutorials/01_quadratic_program.ipynb b/docs/tutorials/01_quadratic_program.ipynb index 1678c47bf..ecaa78fbf 100644 --- a/docs/tutorials/01_quadratic_program.ipynb +++ b/docs/tutorials/01_quadratic_program.ipynb @@ -55,7 +55,8 @@ "metadata": {}, "outputs": [], "source": [ - "from qiskit_optimization import QuadraticProgram" + "from qiskit_optimization import QuadraticProgram\n", + "from qiskit_optimization.translators import from_docplex_mp" ] }, { @@ -72,7 +73,7 @@ "Qiskit's optimization module supports the conversion from Docplex model. You can easily make a model of an optimization problem with Docplex.\n", "You can find the documentation of Docplex at https://ibmdecisionoptimization.github.io/docplex-doc/mp/index.html\n", "\n", - "You can load a Docplex model to `QuadraticProgram` by invoking `from_docplex`." + "You can load a Docplex model to `QuadraticProgram` by using `from_docplex_mp` function." ] }, { @@ -167,8 +168,7 @@ ], "source": [ "# load from a Docplex model\n", - "mod = QuadraticProgram()\n", - "mod.from_docplex(mdl)\n", + "mod = from_docplex_mp(mdl)\n", "print(mod.export_as_lp_string())" ] }, @@ -821,4 +821,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file diff --git a/docs/tutorials/04_grover_optimizer.ipynb b/docs/tutorials/04_grover_optimizer.ipynb index 01e3ac102..4b1ba6e60 100644 --- a/docs/tutorials/04_grover_optimizer.ipynb +++ b/docs/tutorials/04_grover_optimizer.ipynb @@ -69,7 +69,7 @@ "\\min_{x \\in \\{0, 1\\}^3} -2x_1x_3 - x_2x_3 - 1x_1 + 2x_2 - 3x_3.\n", "\\end{eqnarray}\n", "\n", - "For our initial steps, we create a docplex model that defines the problem above, and then use the ```from_docplex()``` function to convert the model to a ```QuadraticProgram```, which can be used to represent a QUBO in Qiskit Optimization." + "For our initial steps, we create a docplex model that defines the problem above, and then use the ```from_docplex_mp()``` function to convert the model to a ```QuadraticProgram```, which can be used to represent a QUBO in Qiskit Optimization." ] }, { @@ -81,6 +81,7 @@ "from qiskit.algorithms import NumPyMinimumEigensolver\n", "from qiskit_optimization.algorithms import GroverOptimizer, MinimumEigenOptimizer\n", "from qiskit_optimization.problems import QuadraticProgram\n", + "from qiskit_optimization.translators import from_docplex_mp\n", "from qiskit import BasicAer\n", "from docplex.mp.model import Model\n", "\n", @@ -124,8 +125,7 @@ "x1 = model.binary_var(name='x1')\n", "x2 = model.binary_var(name='x2')\n", "model.minimize(-x0+2*x1-3*x2-2*x0*x2-1*x1*x2)\n", - "qp = QuadraticProgram()\n", - "qp.from_docplex(model)\n", + "qp = from_docplex_mp(model)\n", "print(qp.export_as_lp_string())" ] }, @@ -312,4 +312,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file diff --git a/docs/tutorials/05_admm_optimizer.ipynb b/docs/tutorials/05_admm_optimizer.ipynb index 49d588561..bea2ef349 100644 --- a/docs/tutorials/05_admm_optimizer.ipynb +++ b/docs/tutorials/05_admm_optimizer.ipynb @@ -94,6 +94,7 @@ "from qiskit_optimization.algorithms import CobylaOptimizer, MinimumEigenOptimizer\n", "from qiskit_optimization.problems import QuadraticProgram\n", "from qiskit_optimization.algorithms.admm_optimizer import ADMMParameters, ADMMOptimizer\n", + "from qiskit_optimization.translators import from_docplex_mp\n", "\n", "# If CPLEX is installed, you can uncomment this line to import the CplexOptimizer.\n", "# CPLEX can be used in this tutorial to solve the convex continuous problem, \n", @@ -199,8 +200,7 @@ "mdl.add_constraint(v + w == 1, \"cons3\")\n", "\n", "# load quadratic program from docplex model\n", - "qp = QuadraticProgram()\n", - "qp.from_docplex(mdl)\n", + "qp = from_docplex_mp(mdl)\n", "print(qp.export_as_lp_string())" ] }, @@ -530,4 +530,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file diff --git a/docs/tutorials/06_examples_max_cut_and_tsp.ipynb b/docs/tutorials/06_examples_max_cut_and_tsp.ipynb index c049119e6..dd07d8819 100644 --- a/docs/tutorials/06_examples_max_cut_and_tsp.ipynb +++ b/docs/tutorials/06_examples_max_cut_and_tsp.ipynb @@ -109,7 +109,6 @@ "# useful additional packages \n", "import matplotlib.pyplot as plt\n", "import matplotlib.axes as axes\n", - "%matplotlib inline\n", "import numpy as np\n", "import networkx as nx\n", "\n", @@ -137,395 +136,13 @@ "metadata": {}, "outputs": [ { + "output_type": "display_data", "data": { - "image/png": "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//3vTs+9dujQgcTExCquUggHu92O0WjkxIkTLFy4kM2bNzN16lRMJlOp1xxcjYSuG8rOzmbdunWoqsrhw4e58847mT17dnFTGiFqErvdzoIFC4ov2L755pssWbKEjh078s0339CwYUPAfZYhSui6icLCQr777jvMZjPff/89Xbt2ZdSoUXTv3r3cixVC6MloNHLmzBkGDBhAWFgY2dnZvPbaa/Tp0wdwhLLBYJDQFfrTNI2ff/4ZVVVZs2YNzZo1Q1EUnn32WQICAvQuTwinzZs3j8jISDp16lS8BBF+n25wJxK6LujkyZMkJiYWz7UqisKSJUuIjIzUuTIhbozJZOKll17i119/BRybcNz1qCbZHOEirFYra9aswWw2c+LECQYMGEB8fDy33HKL27zsEkJVVZo2bUq7du0oKioqXrHw448/kpGRAUBoaGiNP9JdNke4qIKCArZs2YKqqvzwww90796d8ePHExsb6zbLZ4S4UkxMDJ9//jnt2rXDZDJx6tQpFi1axLFjx2jSpAknTpzgyJEjfP311y77yk5GujWMpmns3bsXVVVZu3Yt0dHRKIpC//79ZTOCqBVSUlJo2bIle/fuZcGCBTRq1IihQ4fSoEEDIiMjmT59OjabrUZ3KZORrgs4fvw4qqqiqire3t4oisKnn35K/fr19S5NiGrVsmVLAL766itatGjBI488QmRkZPE0mt1up3///nqWeFMkdHWUmZlZPE97+vRpBg8ezLx582jdurXM04pa7cCBA6xfv56VK1cSEhICwI4dO3jxxRfJy8tj1qxZOld44yR0q1l+fj6bN29GVVV+/PFHevbsyYQJE+jatavbXq0VoqLatGlDZmYmSUlJdOrUiddff53U1FQGDBhAQkKCS1/TkDndamC32/nxxx8xm81s3LiRNm3aoCgK/fr1w9fXV+/yhKiRNmzYwIoVK9i+fTu9evXioYceIioqCl9f3xq/JbisOV0J3Sp05MiR4vW0fn5+KIrC4MGDCQ8P17s0IVxGbm6uyw1O5EJaNbpw4QKrVq1CVVXOnz/P4MGDee2112jVqpXepQnhknx9fd1qZ5qEbiXIy8tj48aNqKrKvn376NOnDwkJCdx+++1u84MihJ4u/x7V9GkFZ0jo3iC73c7OnTtRVZVNmzbxhz/8AUVR+Nvf/iY9Z4WoArm5uaxevZp7771X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\n", - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2021-03-11T18:37:19.271591\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.3.2, https://matplotlib.org/\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", - " \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", - " \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" - ], - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/svg+xml": "\n\n\n \n \n \n \n 2021-06-13T22:28:58.062670\n image/svg+xml\n \n \n Matplotlib v3.4.2, https://matplotlib.org/\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 \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 \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", + "image/png": "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\n" }, - "metadata": {}, - "output_type": "display_data" + "metadata": {} } ], "source": [ @@ -558,13 +175,10 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "[[0. 1. 1. 1.]\n", - " [1. 0. 1. 0.]\n", - " [1. 1. 0. 1.]\n", - " [1. 0. 1. 0.]]\n" + "[[0. 1. 1. 1.]\n [1. 0. 1. 0.]\n [1. 1. 0. 1.]\n [1. 0. 1. 0.]]\n" ] } ], @@ -596,419 +210,20 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "case = [0, 0, 0, 0] cost = 0.0\n", - "case = [1, 0, 0, 0] cost = 3.0\n", - "case = [0, 1, 0, 0] cost = 2.0\n", - "case = [1, 1, 0, 0] cost = 3.0\n", - "case = [0, 0, 1, 0] cost = 3.0\n", - "case = [1, 0, 1, 0] cost = 4.0\n", - "case = [0, 1, 1, 0] cost = 3.0\n", - "case = [1, 1, 1, 0] cost = 2.0\n", - "case = [0, 0, 0, 1] cost = 2.0\n", - "case = [1, 0, 0, 1] cost = 3.0\n", - "case = [0, 1, 0, 1] cost = 4.0\n", - "case = [1, 1, 0, 1] cost = 3.0\n", - "case = [0, 0, 1, 1] cost = 3.0\n", - "case = [1, 0, 1, 1] cost = 2.0\n", - "case = [0, 1, 1, 1] cost = 3.0\n", - "case = [1, 1, 1, 1] cost = 0.0\n", - "\n", - "Best solution = [1, 0, 1, 0] cost = 4.0\n" + "case = [0, 0, 0, 0] cost = 0.0\ncase = [1, 0, 0, 0] cost = 3.0\ncase = [0, 1, 0, 0] cost = 2.0\ncase = [1, 1, 0, 0] cost = 3.0\ncase = [0, 0, 1, 0] cost = 3.0\ncase = [1, 0, 1, 0] cost = 4.0\ncase = [0, 1, 1, 0] cost = 3.0\ncase = [1, 1, 1, 0] cost = 2.0\ncase = [0, 0, 0, 1] cost = 2.0\ncase = [1, 0, 0, 1] cost = 3.0\ncase = [0, 1, 0, 1] cost = 4.0\ncase = [1, 1, 0, 1] cost = 3.0\ncase = [0, 0, 1, 1] cost = 3.0\ncase = [1, 0, 1, 1] cost = 2.0\ncase = [0, 1, 1, 1] cost = 3.0\ncase = [1, 1, 1, 1] cost = 0.0\n\nBest solution = [1, 0, 1, 0] cost = 4.0\n" ] }, { + "output_type": "display_data", "data": { - "image/png": "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\n", - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2021-03-11T18:37:19.603352\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.3.2, https://matplotlib.org/\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", - " \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", - " \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" - ], - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/svg+xml": "\n\n\n \n \n \n \n 2021-06-13T22:28:58.510457\n image/svg+xml\n \n \n Matplotlib v3.4.2, https://matplotlib.org/\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 \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 \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", + "image/png": "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qlWraiqecHNuW7oAkyZNYs2aNZw4cULrKEKU+M9//kObNm2IL+dEiIooisLUqVNZtGgRFy5cqIF0wt25delGR0fz1FNPMXPmTNkQR7gFm83GsmXLGDx4cLWv0bBhQ5KSkpg3b54LkwlP4dalC/C3v/2NnJwcNm3apHUUIdi6dStRUVFOH/BZnieeeIKjR4/y7bffuiiZ8BRuX7p6vZ6UlBRee+01MjMztY4jfJiqqnz44Yc3Ncot5u/vz9SpU5kzZw55lZwuIbyL25cuQLNmzejevTuvv/661lGED/v111/Jzs6mc+fOLrleu3btaN26Ne+++65Lric8g0eULjgOs/z+++/57bfftI4ifNTSpUsZOHAgOhcubhg/fjz/+c9/OHr0qMuuKdybx5Su0WgsOcyyqKhI6zjCx6SlpbF3714edvLEa2dFREQwatQoZsyYIRs9+QiPKV2A7t27Ex0dLYdZilq3bNky+vXrV2rPXFfo06cPqqryySefuPzawv14VOkWz3H84IMPSE9P1zqO8BEZGRls2bKFfv361cj1dTod06ZN46233iIjI6NG3kO4D48qXYBbbrmFgQMHMmfOHJm7K2rFmjVr6NGjBxGVbOF4M5o0acLDDz/Mq6++WmPvIdyDx5UuOA6zPHPmDFu3btU6ivBy+fn5rF27loEDB9b4e40YMYLdu3ej1X4nonZ4ZOn6+fkxbdo05s2bR25urtZxhBfbuHEjLVu2pGHDhjX+XsHBwUyZMoUZM2ZgtVpr/P2ENjyydAHatGnDvffey8KFC7WOIryU3W6/6SW/VdW5c2duu+02Pvzww1p7T1G7PLZ0AcaOHctnn33GwYMHtY4ivNC2bdswmUy0atWqVt938uTJrFixgpMnT9bq+4ra4dGlGx4ezrPPPitzHEWNWLp0KYMHD65wq8aaEBsby9///ndmzZolD4u9kEeXLjgOswwICGDt2rVaRxFeZM+ePVy6dImuXbtq8v6PP/44ZrOZL774QpP3FzXH40tXURSmTZvGO++8w6VLl7SOI7xEamoqgwYNcumS36rQ6/VMmzaNV155haysLE0yiJrh8aULkJCQwKOPPiqHWQqXOHXqFLt376Z3796a5mjRogVdunThzTff1DSHcC2vKF2AJ598kr1797Jjxw6towgPt3z5cvr27UtQUJDWURg9ejTffPMNe/fu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eHg4zz77rDwsroCUroY6d+7MbbfdxgcffKB1FLeRmprK448/jsEgsxk9Ve/evQkMDGTt2rVaR3FLUroamzJlCitXruTkyZNaR9Hc2bNn2bFjB48++qjWUcRNKN7o6Z133pE9j8sgpauxmJgYhg0bxqxZs3x+juOKFSt45JFHCAkJ0TqKuEkJCQn07duXl19+WesobkdK1w0kJydjNpv54osvtI6imaysLDZu3EhycrLWUYSLDBs2jP379/PDDz9oHcWtSOm6ATnMEj7++GM6depUsnWg8HyBgYE899xzzJ49m4KCAq3juA0pXTfRvHlzunTp4pO77hcWFrJy5UpZDOGFOnToQLNmzVi0aJHWUdyGlK4befbZZ/nmm2/Yu3ev1lFq1RdffMGtt95KkyZNtI4iasCECRNYt24dv//+u9ZR3IKUrhsJDQ1l3LhxzJgxA5vNpnWcWqGqasliCOGdoqKiGDFiBDNnzvT5h8Ugpet2HnzwQcLDw1m5cqXWUWrFzp07UVWV++67T+soogb169eP/Px8Nm7cqHUUzUnpupniOY6LFy/m3LlzWsepcbLk1zfodDqmTZvG/PnzMZvNWsfRlJSuG2rQoAHJyclef5jl4cOHOX78OA8++KDWUUQtaNq0KX/+8595/fXXtY6iKSldNzV06FCOHz/O9u3btY5SY1JTU0lOTpZDJ33IqFGj+PHHH/nll1+0jqIZKV035e/vT0pKCnPmzPHK/UkvXLjAd999R9++fbWOImpRSEgIEydOZObMmRQWFmodRxNSum6sbdu2tGnTxisPs1y5ciW9evUiNDRU6yiilnXr1o169eqRmpqqdRRNSOm6uXHjxrFx40aOHDmidRSXycnJYf369bLk10cpisJzzz1HamoqZ86c0TpOrZPSdXMRERE888wzXrU/6fr167nvvvuIi4vTOorQSFxcHIMHD2b27Nk+N3dXStcDPPLIIyiKwvr167WOctOKiopYvny5LPkVDBo0iHPnzvHVV19pHaVWSel6gOLDLBcsWODxh1l++eWXxMfH06xZM62jCI0ZDAZSUlJ4+eWXycnJ0TpOrZHS9RCNGzemd+/evPLKK1pHqTZZ8itu1Lp1a9q3b89bb72ldZRaI6XrQYYPH86vv/7KTz/9pHWUatm1axdWq5UOHTpoHUW4kTFjxrBlyxb279+vdZRaIaXr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\n" }, - "metadata": {}, - "output_type": "display_data" + "metadata": {} } ], "source": [ @@ -1051,31 +266,17 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "// This file has been generated by DOcplex\n", - "// model name is: Max-cut\n", - "// single vars section\n", - "dvar bool x_0;\n", - "dvar bool x_1;\n", - "dvar bool x_2;\n", - "dvar bool x_3;\n", - "\n", - "maximize\n", - " 3 x_0 + 2 x_1 + 3 x_2 + 2 x_3 [ - 2 x_0*x_1 - 2 x_0*x_2 - 2 x_0*x_3\n", - " - 2 x_1*x_2 - 2 x_2*x_3 ];\n", - " \n", - "subject to {\n", - "\n", - "}\n" + "\\ This file has been generated by DOcplex\n\\ ENCODING=ISO-8859-1\n\\Problem name: Max-cut\n\nMaximize\n obj: 3 x_0 + 2 x_1 + 3 x_2 + 2 x_3 + [ - 4 x_0*x_1 - 4 x_0*x_2 - 4 x_0*x_3\n - 4 x_1*x_2 - 4 x_2*x_3 ]/2\nSubject To\n\nBounds\n 0 <= x_0 <= 1\n 0 <= x_1 <= 1\n 0 <= x_2 <= 1\n 0 <= x_3 <= 1\n\nBinaries\n x_0 x_1 x_2 x_3\nEnd\n\n" ] } ], "source": [ "max_cut = Maxcut(w)\n", "qp = max_cut.to_quadratic_program()\n", - "qp.to_docplex().prettyprint()" + "print(qp.export_as_lp_string())" ] }, { @@ -1084,16 +285,10 @@ "metadata": {}, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "Offset: -2.5\n", - "Ising Hamiltonian:\n", - "0.5 * ZZII\n", - "+ 0.5 * IZZI\n", - "+ 0.5 * ZIIZ\n", - "+ 0.5 * IZIZ\n", - "+ 0.5 * IIZZ\n" + "Offset: -2.5\nIsing Hamiltonian:\n0.5 * ZZII\n+ 0.5 * IZZI\n+ 0.5 * ZIIZ\n+ 0.5 * IZIZ\n+ 0.5 * IIZZ\n" ] } ], @@ -1112,12 +307,10 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "optimal function value: 4.0\n", - "optimal value: [1. 0. 1. 0.]\n", - "status: SUCCESS\n" + "optimal function value: 4.0\noptimal value: [1. 0. 1. 0.]\nstatus: SUCCESS\n" ] } ], @@ -1150,405 +343,20 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "energy: -1.5\n", - "max-cut objective: -4.0\n", - "solution: [1 0 1 0]\n", - "solution objective: 4.0\n" + "energy: -1.5\nmax-cut objective: -4.0\nsolution: [1 0 1 0]\nsolution objective: 4.0\n" ] }, { + "output_type": "display_data", "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAADnCAYAAAC9roUQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAA4WUlEQVR4nO3dd3hUZfr/8feUVNJJAUIzEAgiBBGB0AUpOdm1UFzkK82GsERR2s9edmVdirhiWQvfFXXVVdDV784JoYOACwICAkEMkRAIhASSSW9zzu+PQARJmUCSk3K/rmsvIJlM7nHhk2eecj8mXdcRQghRP8xGFyCEEM2JhK4QQtQjCV0hhKhHErpCCFGPJHSFEKIeWav6ZGBgoN6xY8d6KkUIUS8yMuDs2bLfWyzOf52ug8MBrq5www1lv4oK7d27N0PX9aCKPldl6Hbs2JE9e/bUTVVCiPr3xhuwfDl07QouLtf2HHY7uLvDl19C27a1W18TYTKZkiv7nEwvCNFcxMeXBa6397UHLoCvL2RmwuTJUFRUe/U1ExK6QjQHFy7AggVlI1RrlW9wnePrCykp8Le/Xf9zNTMSukI0B8uWQW4ueHjU3nN6ecF770Fype+kRQUkdIVo6rKzYc2asmmF2mS1gqbBJ5/U7vM2cRK6QjR18fFQWlrttMLnFy4w+ZdfiDp6lBdSU517bi8v+Oc/y55fOEVCV4imbvt2px4WaLXyQGAgd/j6Ov/cLi5QUgK//HKNxTU/ErpCNHV795YtoFVjuI8Pw7y98a3J3l0o27+bkHCNxTU/ErpCNHXp6U4fZNABh65To4avxcWQlnYtlTVLtbB3RAjRoDkc1T6kpKQEu92OPTubjIIC8t3cnH9+XZc53RqQ0BWiqfPwKNtlYL7yja1D08jJzsZut1NYVISPtzetW7Wipd3O+YwMiktKcHXmEIXFAi1a1FHxTY+ErhBNXUQE/PgjeHmh6zq5eXnY7XZyc3Np0aIF/gEBeHl5YTaZALDm5uLh4cG5tDTaOnPM19UVwsPr+EU0HRK6QjRxet++FO/cSWZuLtnZ2bi6uuLr60urVq2wXrZo5tB1HLqOBrh7eGDPz8cnNxcfL68qnlwv273QrVvdv5AmQkJXiCYqNTWVuLg4Dq1dy3y7HZeAADp27IhrJYtqKzMyeDcjo/zP/3E4GJ+SwlPdumGq7Jvk5EBkJPj51Xr9TZWErhBNSHZ2Nhs2bEBVVU6cOMHIkSO5f/lyWs+bh+nkySp3MTwcFMTDQb92I9SBkydPkpmZSYC/f8VfpOswY0Ytv4qmTUJXiEaupKSEHTt2oKoqu3bton///kyZMoWoqChcLi2ELVwIDz9c4YJaZUxAq5AQTiQn4+Pjc8VUBFB2vLhdOxg+vHZfUBMnoStEI6TrOj/++COqqrJ+/Xo6depEdHQ0zz77LN4V9VgYMQKioyEuDiobtVbAzc0NX19f0s+do3Xr1r9+orS0bJT7t79dX5vIZkhCV4hGJCUlhbi4OFRVxWKxEBMTw0cffUSbNm2q/+I//QkOHoQzZ8paMzopKCiI44mJ+Pn74+HuXha4OTllrSJ79LiOV9M8SegK0cDZ7XbWrVuHqqqcPn2aUaNGsWjRIrp164bJVOkS19X8/eGzz2DiRDh9uix4nZhqsJjNBAUHk3b2LB1atcJUUACxsWXTFaLGJHSFaICKi4v59ttvUVWVvXv3MmDAAB588EH69euH9XqakLdpA19/DU8/XdZ9zMWl7GBDNeHt5+VFcVoaObm5+Lz5JsTEXHsNzZyErhANhKZp7N+/n7i4ODZu3EiXLl1QFIWXXnqJFrV54svfH958EzZuhMWLyzqElZaCm1tZYxyL5df9t4WFoOuYLBZM48fzcEoK/3vbbXjWXjXNjknXK29t0adPH10uphSibiUnJ2Oz2YiLi8PDw4OYmBjGjBlDSEhI3X9zXS+b5127Fnbvhp9+gvz8suANCoLevWHgQFAU8PXlueeeIzg4mNmzZ9d9bY2YyWTaq+t6nwo/J6ErRP27cOFC+TxtWloaY8aMISYmhvDw8JrN09az9PR0Jk6cyD/+8Q/at29vdDkNVlWhK9MLQtSToqIitm7diqqq7N+/nyFDhjBz5kz69u2LpaY9bA0SFBTE1KlTWb58OcuXLze6nEZJQleIOqRpGvv27UNVVTZv3syNN95ITEwMixYtwtOzcc6MTpw4kX//+9/s2LGDgQMHGl1OoyOhK0QdSEpKKp+n9fPzQ1EUZs6cSdBlx2wbK1dXV+bOncuyZcvo27fvr6fehFMkdIWoJRkZGcTHx2Oz2cjKymLMmDG8/vrrdO7c2ejSat3AgQP54osv+PTTT5kyZYrR5TQqErpCXIeCggI2b95c1s3r0CGGDh3KnDlz6NOnD2Ynexw0Vk888QTTp09HURQCAwONLqfRkN0LQtSQpml8//332Gw2tm3bRs+ePYmJiWHo0KG4O3EBZFOyYsUKMjIyePHFF40upUGR3QtC1IJjx46hqipr164lKCgIRVGYM2cOAQEBRpdmmAceeIBx48Zx8OBBevbsaXQ5jYKErhBVOHfuHGvXrkVVVXJzc1EUhbfffpsbbrjB6NIaBE9PT2JjY1myZAmrVq1q8lMqtUFCV4jfyM/PZ+PGjcTFxXH06FFuu+02FixYQK9evSRUKhAdHc3q1av5v//7P+68806jy2nwJHSFABwOB7t27cJms7Fjxw569+7N2LFjGTJkSKXX24gyJpOJ+fPn89hjjzF8+PCK+/mKchK6otnSdZ2jR4+iqirx8fG0adMGRVGYN28e/jVo9C2gW7duDB06lPfee48nnnjC6HIaNAld0eycOXOGuLg44uLiKCoqIiYmhvfff196CVynWbNmMWHCBO666y7CwsKMLqfBktAVzUJubi4bN27EZrORmJjI7bffzjPPPEPPnj0bdIOZxsTf358HH3yQpUuX8uabb8p/10pI6Iomq6SkhO+++w5VVfnuu+/o27cv9957LwMHDpR52joyfvx4vvzyS7Zu3cqwYcOMLqdBktAVTYqu6xw+fBhVVVm3bh0dOnQgJiaGp556Ch8fH6PLa/KsVivz5s3jz3/+M1FRUbi5uRldUoMjoSuahNOnT5df2KjrOoqisGrVKkJDQ40urdnp27cvERERfPzxxzzwwANGl9PgSOiKRis7O5sNGzZgs9lITk5m1KhRvPTSS3Tv3l3mEw02Z84cJk+ezO9+97v6uQGjEZHQFY1KcXExO3bsQFVVdu/eTVRUFFOnTiUqKkpaDDYgbdq04Q9/+AN/+9vfWLRokdHlNCgSuqLB03WdgwcPoqoqGzZsoFOnTiiKwnPPPScb8RuwKVOmMGHCBPbt20fv3r2NLqfBkNAVDdbJkyfL52ldXFxQFIWPP/6Y1q1bG12acIK7uztz5sxhyZIlfPzxx43mSqK6JqErGpSsrKzyCxtTU1MZPXo0r7zyChERETJP2wgNHz6cL774gi+//JIJEyYYXU6DIKErDFdcXMy2bdtQVZW9e/cyaNAgHnroIfr37y+jo0bOZDIxb948Zs6cyahRo/D19TW6JMNJE3NhCE3T2L9/P6qqsmnTJiIiIoiOjmb48OG0aNHC6PJELVuyZAkOh4P/9//+n9Gl1AtpYi4ajBMnTqCqKnFxcXh6ehITE8Nnn31GcHCw0aWJOjRjxgzGjx/P2LFj6dKli9HlGEpCV1yXuLg4QkND6dGjByaTCV3Xr5p7vXDhAvHx8aiqSnp6OmPGjGHZsmWEh4fLPG0z4ePjwyOPPMKSJUt49913m/X/7xK64pokJiYya9Yszp8/T2RkJAEBASxduvSqx6WmpjJp0iSGDBnCH//4R/r27SuNwJupu+66izVr1rB+/XpGjRpldDmGkdAVNXJpJJuUlISPjw/r1q0jLS2tfPGra9euVzw+JCSEuLg4PDw8DKpYNBRms5kFCxbw5JNPMnjw4Gb7d0KGHKJS+fn57Ny5Eyhb+ALK3xYmJyfTq1cvsrOzCQkJYfTo0axZs4bCwsIrnsNisTTbf1ziapGRkdxyyy384x//MLoUw0joigq98sorhIWFoSgKaWlpmM1mdF3n0m6XkpIS7HY7JSUlAIwdO5Zdu3ZdFbpC/FZsbCxr1qzh1KlTRpdiCAldUaGBAwcSHx/PPffcwyeffAL8OtqFsk3vCQkJnD59uvzPiYmJpKWlAVDVVkTRvAUHBzN58mSWL19udCmGkNAVFRowYACRkZGMHDmSb775BiibKrg0vRAREUHbtm3ZtGkTWVlZQNk9WYmJiQDNenVaVG/SpEkcP36c7777zuhS6p2ErqjQpZNgI0aMIDs7m8OHDwNlt+Y6HA6gbO9lYmIiCxcuZObMmRQWFjJ8+HDDahaNh6urK3PnzuWzzz674h1UcyAn0kS5ivbYAsyePRtPT08WL15c/rGCggI8PDy4cOECK1asAGD69OlyuaNwmq7rlJSUYLVam9w2QjmRJiqVl5fHpk2bUFWVKVOmEBUVddVjHnroIWJjYyktLeXIkSMkJCSQnp7OtGnTCAgI4PnnnzegctHYmUymau+qy8zMxN/fv54qqh9N68eLcEppaSk7duzgqaeeQlEUNm/ezPjx4+nTp8IfzCQkJLB9+3Z8fHzYsmULUVFRzJ49Gy8vr3quXDQnSUlJTJ48mZUrVxpdSq2SkW4zoes6CQkJ5Rc2hoaGoigKCxYswM/Pr9KvO3jwIKtWreK9995j0qRJsudW1JuwsDCGDRvGs88+y9SpU7Fam0ZcNY1XISp15syZ8kbgJSUlKIrC+++/7/Tca8+ePYmLi6vjKoUoo2kaZrOZlJQUli1bxrZt25gzZw5Wq7XSNYfGRkK3CcrJyWHjxo2oqsrx48e5/fbbee6558qb0gjRkGiaxtKlS8sXbF9//XVWrVpFr169+M9//kObNm2AprMNUUK3iSgpKeG7777DZrPx3//+l379+jFp0iQGDBhQ7WKFEEYym82cPXuWkSNHEhQURE5ODq+++ipDhw4FykLZZDJJ6Arj6brOoUOHUFWV9evX07FjRxRF4emnn8bHx8fo8oRw2uLFiwkNDaV3797lWxDh1+mGpkRCtxE6deoUcXFx5XOtiqKwatUqQkNDDa5MiGtjtVp58cUX+emnn4CyQzhN9aomORzRSGRnZ7N+/XpsNhspKSmMHDmSmJgYbrzxxibztksIVVXp0KED3bt3p7S0tHzHwg8//EB6ejoAgYGBDf5Kdzkc0UgVFxezfft2VFXl+++/Z8CAAUyfPp2oqKgms31GiMtFRkby+eef0717d6xWK6dPn2b58uWcOHGC9u3bk5KSQlJSEt98802jfWcnI90GRtd1Dhw4gKqqbNiwgfDwcBRFYcSIEXIYQTQLiYmJdO7cmQMHDrB06VLatm3LuHHjaN26NaGhocybNw+Hw9Ggu5TJSLcROHnyJKqqoqoqbm5uKIrCJ598QqtWrYwuTYh61blzZwC+/vprOnXqxIMPPkhoaGj5NJqmaYwYMcLIEq+LhK6BMjMzy+dpz5w5w5gxY1i8eDFdu3aVeVrRrB09epRNmzbx5ZdfEhAQAMDu3bt54YUXKCwsZOHChQZXeO0kdOtZUVER27ZtQ1VVfvjhBwYNGsSMGTPo169fk12tFaKmIiIiyMzMJD4+nt69e/Paa6+RnJzMyJEjiY2NbdRrGjKnWw80TeOHH37AZrOxZcsWIiIiUBSF4cOH4+npaXR5QjRImzdvZs2aNezatYvBgwdz//33ExYWhqenZ4M/ElzVnK6Ebh1KSkoq30/r5eWFoiiMGTOG4OBgo0sTotHIz89vdIMTWUirRxcuXGDt2rWoqsr58+cZM2YMr776Kl26dDG6NCEaJU9PzyZ1Mk1CtxYUFhayZcsWVFXl4MGDDB06lNjYWG699dYm8xdFCCNd+nfU0KcVnCGhe400TWPPnj2oqsrWrVu56aabUBSFv/71r9JzVog6kJ+fz7p167jrrruMLuW6SOjWUGJiIqqqsnbtWvz9/YmJiSE2NpaWLVsaXZoQTVppaSlvvfUW3bt3Jzw83OhyrpmErhPS09PL52mzs7OJjo7mjTfeICwszOjShGg2fHx8mDFjBkuWLOGdd95ptNMMErqVyM/PZ/PmzdhsNhISErjtttuYO3cuvXv3lnlaIQxy9913s2bNGjZs2MDIkSONLueaSOhexuFwsHv3blRV5dtvv6VXr17cddddLF++HDc3N6PLE6LZM5vNzJ8/n2eeeYZBgwY1yvWTZh+6uq5z7NgxbDYb8fHxhISEEBMTw+OPP15+/FAI0XDcfPPN9OrVi1WrVvHII48YXU6NNdvQTUtLK7+wsaCggOjoaN555x06duxodGlCiGo89thj3Hvvvdxxxx3ld6g1Fs0qdPPy8sovbDx27BgjRozgySefJDIyUuZphWhEgoOD+Z//+R+WL1/OkiVLjC6nRpp86JaWlvLf//4XVVXZsWMHffr04Z577mHQoEFyYaMQjdh9993HhAkT2LVrF/369TO6HKfVWugm5uezJyeH73NyOFZQQImm4WGxcJOnJzd7e9Pfx4c29bQYpes6CQkJ2Gw21q1bR7t27VAUhYULF+Lr61svNQgh6parqytz585l6dKlfPrpp42m89h1NbzRdZ0NmZm8efo0h/Py0AEdcDOZMAEaUKRpWEwmdGCwnx+zQ0O5xdu7ll9GmdTU1PJ5WofDgaIoREdH065duzr5fkIIY+m6zqOPPkpUVBSTJk0yupxyddJl7FxxMQuTkvg2KwsL4GWxVLlZWdN1sh0OAP4QHMxTHTrQohb6x2ZnZ7Nhwwbi4uJISkpi5MiRKIpCjx49Gu3maSGE806cOMGDDz7I559/3mB2HNV66B7Oy+N/jhwh1+HAt5qw/S2HrpPjcNDWzY3PbryRVtcw5VBSUsLOnTux2Wzl8zkxMTEMGDAAFxeXGj+fEKJxe+2118jJyeHZZ581uhSglls7HsvPZ+KRIxRrGn7XMIdiMZnws1o5XVzMhMOH+eqmmwh0YkFL13V+/PFHVFVl/fr1hIWFER0dzTPPPIOPj0+N6xBCNB0PPfQQ48aN48iRI9x4441Gl1OlGqVmocPBQz/9RJGm4XOdUwO+FgupxcU8cfw4qyIiKh0tp6SklM/Tms1mYmJi+Oijjxrd3jwhRN1p0aIFf/zjH1myZAkrV65s0FtAaxS6y0+d4nRR0TWNcCviZ7Gww27nq4wMxgYFlX/cbrezfv16VFUlJSWFUaNGsWjRIrp16ybztEKICsXExLB69Wri4uKIiYkxupxKOZ2e6cXF/OPsWbxr8fJEk8mEh9nMouRkxvj48N8dO7DZbOzZs4eBAwcyffp0oqKiGs1WECGEccxmMwsWLGDu3LkMGzaMFi1aGF1ShZxOsy/S03HoOpZqRpqO3FzOvP8+uYcOYfX2JmjCBHwHDKj08VpRESdycxkwaxb9XVxQFIUXX3wRLy8v51+FEEIA3bt3Z8CAAaxcuZJHH33U6HIq5HTofnruHO5OzJOcXbUKk9VKlzfeoDA5mZRly3Bv3x63tm3LH1NcXIzdbsdut2M2m3Hx96f77Nn8/eabr+1VCCHERbNnz+aee+7hzjvvpEOHDkaXcxWnZptzS0tJLSrCvZpRrlZYSM6ePQSNH4/Z3R3Prl3x7t0b+44dlDocZGZm8suJEyQnJ6NpGm3btSMsLIwQX19+uriHVwghrkdAQADTp09n2bJlVLUl1ihOhe6xggJcTaZqF7GKz54FsxnXVq2Asm1eWlAQGUePcvz4cQoKCggKCiI8PJyQkBDcL+7RdTGZyCwtJbOk5DpfjhBCwD333ENqairbt283upSrOBW69tJSnPl5oRUVYb7YVDjl1CkOHzlCdlERppIS2oaGEhgYWGHTYZPJhNVkKj+xJoQQ18PFxYV58+axbNkyiouLjS7nCk7N6Tq7Scvs5oZWUABAfl4eXl5eOIAiV1fS09NxOByUOhxomobFYsFqsWCxWLBYrZS6uvLxRx/RydsbPz8//P398fPzK/+9dAQTQtRE//796dSpE5988gnTpk0zupxyToWuv5NHa11btQJNo/jsWdq2a8eZ1FQ8srPx7tqV4Muag+uUXY3jKC3F4XBQUlpKtq7jbTZz8uRJDh48SFZWVvn/MjMzsVqtVwTx5YFcUUh7e3s36A3SQoi698QTTzBlyhQURSE4ONjocgAnQzfcw4MSXUfX9Srndc3u7nj36UP6mjW0fuABLGfPkrlrF+F/+tMVjzMB1osjXSjrRNbSYuHRBx6o8Hl1XaegoIDMzMwrgvjSr6dOnbriY1lZWeTl5eHj43NVOFcV2O7u7k7+ZxNCNAahoaGMGzeOFStW8Kff5JBRnApdT4uFDu7unC0qwrOawxGtpk4l9b33ODZ7NmZPT8yKgvniwlpl8jWNYf7+lX7eZDLh6emJp6cnoaGhzpSMw+HAbrdXGNKpqakcOXLkio9lZWVhMpkqHTlXFNi+vr4ymhaigZs2bRrjx4/nwIEDREZGGl2O813GPjhzhj8nJ9f4CHB6RgbFRUWVhqWu62RrGh9ERDDQwAbjuq5TWFh4xWi5osC+/GM5OTl4X5yDrmqq4/Kw9vDwkKPMQtSz+Ph4PvzwQz766KN6GSjVSmvHrJIS+u3bh7vJhEsNitZ1nePHj9OmTRs8PT2v+ny+w4Gfiwvbb74ZcyMLI03TKhxNVxXYmqZVGMiVBbavry+WWjx6LURzpOs6Dz30EIqiMHbs2Dr/frXS2tHPxYXH2rZlWUoKfk7s2b3smxMSEsLZs2cJCwu74nOarlOk6/z5hhsaXeBC2Vlvf39//KuYGvmtwsLCCkM6MzOTY8eOXRXY2dnZtGjRwukFRD8/Pzw9PWU0LcRlTCYTCxYsYPbs2dx+++2GtoOtURPzUk3jzkOH+Ck/v8bTDCdPnsTb27s8oHRdJ9Ph4PctW/K38PBrq74Z0DSNnJycaqc6Lg/rkpKSGi0g+vr6Ntjm7zk5Odx9990kJSURGxvL448/ftWCrqZpnD59GqvVSnBwsLwzEJX6y1/+gtVqZf78+XX6fWr15ojTRUXcfegQmSUl+NYgeIuKikg+eZJOYWGYzWayHA66enryrxtvxFu6iNWq4uJip0L60q92ux0PDw+nFxD9/Pzw8vKql9F0Xl4e+/bt49NPPwXgrbfewuFwXBGs69at4+WXXyY5OZkRI0bw+uuvN9gOU8JYWVlZTJgwgbfffpvOnTvX2fep9et6ThYWcu+RI5wtLsbXYnF6aiAtLY1SXcczMJCeLVrwQbduNQpuUTc0TSM3N9fpBcSsrCyKiorw9fV1egHRz8/vug64PPnkk7i5ufHCCy/gcDgwm82YTCaOHTvGkiVLGDFiBBMnTmTOnDkEBwfz1FNPoWma7C4RV/n888/ZtGkTb7/9dp0NHGr1uh6A9u7uxPfsycvJyXyRno4O+FgsVbZ9LNV1rP7+nD9zhodcXXm2e/caLciJumM2m/Hx8cHHx4f27ds79TWXOsVVNL2RnJzM/v37r/qcq6trlQuII0aMqLSlZ1paGrfccgtQNj93aYrh22+/pWXLlgy42D7U09MTu91e/jghfmvcuHF8+eWXbNq0iREjRtT797/mYaaX1cpfOnXinuBg3jtzhg2ZmZgpO+jgctkV7KX8eiX7fa1a0SY9nb1vvYX1vfdq6SUII7i6uhIUFETQZTd+VEXXdfLy8iodOZ88eZIhQ4ZU+vVZWVkVnig6ffo03t7etGzZEgCr1Yqnp6eMckWlLBYL8+fP5/nnn2fgwIHlh6LOl5RwJC+PnwsKsJeW4moyEeLqSrcWLQj38MC1lv4+Xfd7+5u9vXnL25vzJSUcyM3lYG4uCfn5FGsaLSwWenh50d3Tk15eXnhZrWgdOzLliy9Yt24do0ePro3XIBoBk8mEl5cXXl5etL2st7IzHA4HWVlZ5cGqXzwdaTabycvLu+L5MjMz6dKlyxUt/TRN46OPPio/oXj5SNvHx0fCuRm65ZZb6NGjB//74Yd0HDeOd1NTOZSXh9VkokjTyht8uZjNWCg7RTs+KIgprVoRXsHW15qotQnVli4uDPf3Z3g126fMZjPz58/nySefZPDgwRXu3RXichaLBU3T6NWrV/mfL7nhhhs4efJk+Z8PHTrEqFGjrtrBkJOTw8mTJ68aaefm5uLj4+P0AqK/v78cF28iRs6YwdgtW/A/ehRXqxVfi6VscFDB7pdSXeeTc+f49Nw57gsJYUH79tWezq2MIatYkZGR9OnThw8++IBZs2YZUYJoJJ577jn++c9/8ssvvzBs2DCef/55/Pz8MJvNDBkyhDvvvJOpU6dy4MABPDw8KCwsvOqop9lsZvbs2RU+/2+Pi18eypeOi/92UdFkMtVoAfFSvaJh0HWdd1NTWXL2LG5t2lCQkUHLatoLWE0m/K1WHLrOR2lprM/M5KNu3QiroFVtda5p90JtSE9PZ+LEiaxatarGbzdF8+FwOMjIyCArK4tTp04RGhpKfn4+drudIUOGYLFYePfdd3nvvfcoKirirbfeYtCgQXVWz6Xj4s6eQMzKyiI7OxsvLy+nTiBe+r0cF687r6WksOL0abwtFizA8ePHad2mDS1q8K472+GghcXCmu7dKwzeWt8yVltWrVrFgQMHePXVV+vsewhhNE3TyM7OrvJAy28D+/Lj4lXt+Lj0q4+Pj9ya7YS48+eZ/fPPeFssWC/+UMvJySE9PZ0bwsKc7h0OZcEb5OLC+sjIq6Yaan3LWG259957+fe//83OnTvLt/wI0dSYzebywHTW5cfFfxvIFR0Xt9vttGjRokY9p5vbcfGM4mL+X1IS7mZzeeACeHt7k5mZSWZmJgE1ONLvY7FwtriYJSkpPH9Zv/DqGBq6rq6uzJ07l2XLlnHrrbc22KOoQtQ3d3d3WrVqRatq2qJecumAS0XTGxkZGSQmJlZ5XNyZBcSGfFzcGa+eOkWuw4F/Be8IQlq1IvnECXx9fGp0jNzHYuHjs2f5n+BgOjs5PWHo9MIljz32GLfeeiv33XdfnX8vIUSZy4+LV3cC8dJo2t3dvUY9p+vruHh1sktLuXXvXjx+M8q9XFpaGpqu09rJH3SXZJaWMjkkhBduuKH8Yw12TveSkydPMn36dD7//PPyvZhCiIZF1/UrRtPOBPblx8Wd3fFRF/chfnHuHE8mJVXZqEvTNH7+6Sc8tmyh+NgxHHl5uAQHEzxhAl5VND8v0XWKdZ0DffqUH6BosHO6l7Rv354777yTN954g+eff97ocoQQFTCZTHh7e+Pt7e30cfGSkpIKwznrN8fFL//cpePi1YX05c2XqtuSt+Pi0fCqmM1mggICOGe1EvbUU7i0bEnugQOcfvNNbnj5ZVwrOX3pcvFAxfGCAro50WipQYQuwIMPPsi4ceM4dOgQN910k9HlCCFqgYuLyzUfF69oBH3pgMvlH8vPz79iNF1ROG/18MBkNlNC2f2MlU15BISEYB85kgJXV1zNZrxvvhmXwEAKT5yoNHQBHEBCfn7jCl1PT09iY2NZvHgxH3zwgWwmF6IZupbj4qWlpRU2X7p0ae2PP/7Iif79MRUVce7iLeQmkwmLxYLFYsFqtZb/3mK14unhQWpqKt7e3mg5ORSfPYtbNYcnijWNtOJip+ptMKELMGbMGFavXs1//vMf7rjjDqPLEUI0AlarlZYtW1a5HrR61y68zObyNrSapuFwOHA4HJReDOKioiKys7MpyM/HZDZj0jRS334b38GDcWvTpsoaTICjivWxyzWo4aTZbGbevHm8+eab5ObmGl2OEKKJaGE2XxGKZrMZFxcXXFxcKCkuLhsh2+208PSkU6dOdOvaldR33gGrlVaTJ1f7/CZw+jKGBhW6ADfeeCODBw/mPWn9KISoJd1atKDwYujquk5OTg6nTp0iMTGR/Px8AgMDCQ8PJyQkBDc3N86sXEmp3U7bRx/F5ESYupnNhDvZh6HBhS7ArFmzsNls/PLLL0aXIoRoAvp6eZFbWMiZs2f5+eefuZCZiZe3N+Hh4YSGhpbtJ7742LMffEDx6dO0e+IJzE5sX9N1nVJdJ8LJwxENak73koCAAB544AGWLVvGihUrGsTmaiFE45OcnIzNZuPr3bux33UXgR4e3BAWhkslo9eSjAyyNm/GZLXyc2xs+cdbTZuG78CBFX5NjsNBpJcXAU6e1muQoQswYcIEvvrqK7Zt28bQoUONLkcI0UhcuHCBdevWoaoqaWlpjBkzhr8/+SRzi4r4uaAAlyqO+boEBtLtww+d/l66rqMDM6pZaLtcgw1dq9XKvHnz+POf/0xUVFSdnFIRQjQNRUVFbN26FVVV2b9/P4MHD2bmzJn07du3vJfCwqwsph89iqbrTl+mW50cTaODuzu31aCZUYMNXYC+ffsSERHBxx9/zP333290OUKIBkTTNPbt24eqqmzevJkbb7yRmJgYFi1aVOGNNIP9/LgrMJCvMjIqbHpTUyUXr436W3h4jS7ZbdChCzBnzhwmT55MTEwMISEhRpcjhDBYUlISNpuNuLg4/Pz8UBSFmTNnOnXq7bmOHdmfm8uJwsIq+zBUp1TXyXE4eLpDB7o7cQrtcg2i4U113nnnHZKTk1m0aJHRpQghDHD+/HnWrl2LzWYjKyuLMWPGoCgKnTt3rvFzpRcXc++RI/xSWIivxVLjqYYCh4MiXefxtm2ZFRpa4UJ/g294U52pU6cyfvx49u3bR+/evY0uRwhRDwoKCtiyZQuqqnLo0CGGDh3KnDlz6NOnz3W1CQhydeXLm27ipRMn+CojAyvgVUU/hksujW69LRaWd+rEqICAa/r+jWKkC7B+/Xr+93//l48//rhGTYaFEI2Hpml8//332Gw2tm3bRs+ePYmJiWHo0KF1cgvz9qwslqSkcDgvD42yjmHuJlP56LdY1ynUNMyUXU45ITiYOW3bVrs9rMH303WGruvMmDGDUaNGMX78eKPLEULUomPHjqGqKmvXriUoKAhFURg9ejQB1ziarKmjeXmsz8xkV3Y2Cfn55DkcWEwmgl1cuMXbmwG+vozy98fLyXngJhG6AD///DOzZs1i9erV+Pr6Gl2OEOI6nDt3jrVr16KqKrm5uSiKQnR0NDdcdgNDY9Xo53QvCQ8PZ+TIkfz9739n4cKFRpcjhKih/Px8Nm3ahKqqHD16lNtuu40FCxbQq1evZtPOtVGFLsAjjzzC+PHjufvuu+nSpYvR5QghquFwONi1axc2m40dO3bQu3dvxo4dy+DBg3FzczO6vHrX6ELXx8eHGTNmsHTpUt555x3pyyBEA6TrOkePHkVVVeLj42nTpg2KojBv3jz8a3DNeVPU6EIX4O6772bNmjWsX7+eUaNGGV2OEOKiM2fOlM/TFhUVoSgK77//vtN3qjUHjTJ0zWYz8+fP55lnnmHw4MF4ONnHUghR+3Jzc9m4cSM2m43ExERuv/12nnnmGXr27CnvRCvQKEMX4Oabb6ZXr1588MEHzJw50+hyhGhWSktL2blzJ6qq8t1339G3b1/uvfdeBg4cKM2pqtFoQxfgscceY+LEidxxxx2EVnNxnBDi+ui6zuHDh1FVlfXr19O+fXsUReGpp57Cx8fH6PIajUYdusHBwTz88MNkZmZK6ApRR1JTU1FVFVVV0XUdRVH44IMP5N/cNWrUoQvwhz/8gdLSUqPLEKJJyc7OZsOGDdhsNpKTkxk1ahQvvfQS3bt3l3na69ToQ9dkMuFSxTnozMzMZr9FRQhnFBcXs2PHDlRVZffu3URFRTF16lSioqKq/DcmaqbRh25VkpKSePTRR7n77rt54IEHjC5HiAZH13UOHjyIqqps2LCBTp06oSgKzz33HN7e3kaX1yQ16dANCwtj2LBhPPvss0ydOhVrLXSLF6IpOHnyJHFxcaiqiouLC4qi8PHHH9O6dWujS2vymlwKaZqG2WwmJSWFZcuWsW3bNubMmYPVakXXdZmPEs1WVlZW+YWNqampjB49mldeeYWIiAj5d1GPmkToaprG0qVLmT17Np6enrz++uusWrWKXr168Z///Ic2F2/qlL9YorkpLi5m27ZtqKrK3r17GTRoEA899BD9+/eXvtQGaRKhazabOXv2LCNHjiQoKIicnBxeffXV8qvbNU3DZDJJ6IpmQdM09u/fj6qqbNq0iYiICKKjo/nTn/5Eixre5yVqX5MIXYDFixcTGhpK7969WbFiRfnHL003CNHUnThxAlVViYuLw9PTk5iYGD777DOCg4ONLk1cpsmErtVq5cUXX+Snn34CytrJydsn0dRduHCB+Ph4VFUlPT2dMWPGsGzZMsLDw+WdXQPVqG6OcIaqqnTo0IHu3btTWlpavmPhhx9+ID09HYDAwEC54FI0WoWFhWzbtg2bzcaBAwcYMmQIiqLQt29feVfXQDSZmyOcERkZyeeff0737t2xWq2cPn2a5cuXc+LECdq3b09KSgpJSUl88803coxRNBqaprF3715UVWXLli10794dRVH4y1/+gqenp9HliRpociNdgMTERDp37syBAwdYunQpbdu2Zdy4cbRu3ZrQ0FDmzZuHw+Fg+fLlRpcqRJWOHz+OzWZj7dq1+Pn5ERMTw+jRowkMDDS6NFGFZjXSBejcuTMAX3/9NZ06deLBBx8kNDS0fI5L0zRGjBhhZIlCVCojI6O8EXhWVhbR0dGsWLGCTp06GV2aqAVNMnQBjh49yqZNm/jyyy/Lr3HevXs3L7zwAoWFhXKxpWhQ8vPz2bJlC6qqcvjwYW677TYef/xxbrnlFpmnbWKabOhGRESQmZlJfHw8vXv35rXXXiM5OZmRI0cSGxsrR4KF4TRNY/fu3aiqyrZt24iMjOSOO+5g6dKluLu7G12eqCNNck73ks2bN7NmzRp27drF4MGDuf/++wkLC8PT01OOBAtD6LrOzz//jM1mIz4+nuDgYBRFYdSoUeXvyETjV9WcbpMO3Uvy8/NlhVfUmbi4OEJDQ+nRowcmk6nCH+jnzp0rbzCTn59PdHQ0iqLQsWNHY4oWdarZLaT9lqenp5xME7UuMTGRWbNmcf78eSIjIwkICGDp0qVXPS4tLY17772X4cOHs3DhQnr16iV/F5uxZhG6QPlf8sLCQtzc3GRqQVyzSyPZpKQkfHx8WLduHWlpaeXNZLp27XrF4wMDA1m7dq1c2CgAaFY/bnVd56uvvuLf//630aWIRiI/P5+dO3cCZQtf8Gu3uuTkZHr16kV2djYhISGMHj2aNWvWUFhYeMVzWCwWCVxRrlmFrslk4pZbbuHtt98mOzvb6HJEA/fKK68QFhaGoiikpaVhNpvRdZ1L6yAlJSXY7XZKSkoAGDt2LLt27boqdIW4XLMKXYAuXbowfPhw3nnnHaNLEQ3cwIEDiY+P55577uGTTz4Bfh3tAgwfPpyEhAROnz5d/ufExETS0tIAqGqRWjRfzS50AWbOnMm6detITEw0uhTRgA0YMIDIyEhGjhzJN998A5RNFVyaXoiIiKBt27Zs2rSJrKwsALp161b+90rWDURFmmXo+vr68vDDD7N06VIZjYhKXWoNOmLECLKzszl8+DBQ1jbU4XAAMGPGDBITE1m4cCEzZ86ksLCQ4cOHG1azaPiaZehC2fyb3W5n06ZNRpciGpCKfggHBAQQFRXFqlWrgLIwtlgsFBQUcPPNN/PSSy/Rpk0bWrVqxVtvvYWHh0d9ly0akWZxOKIy+/bt47nnnmP16tVy7LIZy87OZv369dhsNqZPn87AgQOv2kd74MABYmNj2bRpE0eOHCEhIYH09HSmTZuGl5eXQZWLhqqqwxHNdqQL0Lt3b3r27MmHH35odCminhUXF7Np0ybmzZvH73//e/bs2cP06dMZMGBAhQcXEhIS2L59Oz4+PmzZsoWoqChmz54tgStqrNkcjqjMY489xqRJk/jd735XfmuwaJp0XefAgQOoqsqGDRsIDw9HURReeOGFKsPz4MGDrFq1ivfee49JkybJ9IG4Ls16euGSlStX8tNPP7F48WKjSxF14OTJk6iqiqqquLm5oSgK0dHRtGrVyujSRBPV7HsvVGfy5MmMHz+e3bt307dvX6PLEbUgMzOzfJ72zJkzjBkzhsWLF9O1a1fZyiUMJaELuLq68sQTT7B06VI++eQT6bXbSBUVFbFt2zZUVeWHH35g0KBBzJgxg379+snN0KLBkHS5aOjQoXzxxResXr2aiRMnGl2OcJKmaezfvx+bzcbmzZuJiIhAURRefvllaecpGiQJ3YtMJhPz5s3joYceYvTo0fj7+xtdkqjCL7/8gqqqxMXF4eXlhaIofPbZZwQHBxtdmhBVktC9zA033ICiKLz11ls8/fTTRpcjfuPChQvlFzaeP3+eMWPGsHz5csLDw40uTQinSej+xsMPP8y4ceMYO3Ys3bp1M7qcZq+wsLD8wsaDBw8ydOhQYmNjufXWW6URuGiUJHR/w8vLiz/+8Y8sWbKElStXykq3ATRNY8+ePaiqytatW+nRowfR0dH89a9/lT2yotGT0K3A7373O1avXk1cXByKohhdTrORmJiIqqqsXbsWf39/YmJiiI2NpWXLlkaXJkStkdCtgNlsZv78+SxYsIBhw4bJKngdSk9PZ+3atcTFxWG324mOjuaNN94gLCzM6NKEqBMSupXo0aMH/fr1Y+XKlcTGxhpdTpOSn5/P5s2bUVWVhIQEhg0bxhNPPEHv3r1lnlY0eRK6VZg9ezZ/+MMfuPPOO2nfvr3R5TRqDoeD3bt3o6oq3377Lb169eLOO+/k1Vdfxc3NzejyhKg3ErpVCAwMZNq0abz66qu89tprRpfT6Oi6zrFjx7DZbMTHxxMSEkJMTAyPP/44AQEBRpcnhCEkdKsxceJEvvrqK7Zv386gQYOMLqdRSEtLIy4uDlVVKSwsJDo6mnfeeYeOHTsaXZoQhpPQrYaLiwvz5s1j6dKl9O3bV67SrkReXh4bN25EVVWOHTvGiBEjePLJJ4mMjJR5WiEuI6HrhAEDBtCxY0c+++wzpkyZYnQ5DUZpaSn//e9/UVWVHTt20KdPH+655x4GDRokP5yEqISErpMef/xxpk2bRnR0NEFBQUaXYxhd10lISMBms7F+/Xratm2LoigsXLgQX19fo8sTosGT0HVSu3btGDt2LCtWrOCll14yupx6l5qaWj5P63A4UBSFlStX0q5dO6NLE6JRkdCtgenTpzN+/HgOHjxIz549jS6nzmVnZ5fP0yYlJTFy5Eief/55evToIcejhbhGEro14OnpyaOPPsqSJUtYtWpVk1wgKikpYefOndhsNnbt2kW/fv247777GDBgAC4uLkaXJ0SjJ6FbQ6NHj+aLL77gm2++4a677jK6nFqh6zo//vhj+YWNl1pcPvPMM/j4+BhdnhBNioRuDZlMJhYsWEBsbCwjRozA29vb6JKu2alTp8obgZtMJmJiYvjwww/lVmQh6pCE7jXo2rUrw4YN491332Xu3LlGl1Mjdrud9evXo6oqKSkpjBo1ipdffplu3brJPK0Q9UBC9xrNmjWLCRMmcPfddzf4jljFxcVs374dm83Gnj17GDhwIPfffz/9+/eXSziFqGcmXdcr/WSfPn30PXv21GM5jcu//vUvtm7dyptvvokJICEBvv8edu+Gn3+GkhJwd4du3eDWWyEqCurpKKymaRw4cABVVdm4cSNdunRBURSGDx+Ol5dXvdQgRHNlMpn26rrep8LPSeheO4fDwb0TJ/J0795EfvttWdBqGpjN4OoKJhPoOhQV/fpFffpAbCwMHFgnNSUnJ5fP07q7u6MoCtHR0YSEhNTJ9xNCXE1Ct66kpnL+/vsp/vZbQtq2xezlVRa0ldF1yM4u+/X3v4cXXoBaOMWVmZnJunXrsNlspKWlMXr0aGJiYujSpYvM0wphgKpCVyb0rtXBgzB5Mi3z8jjl5cX5oiKCqtvJYDKVhaymwf/9X9k0xKefwjX06i0qKmLr1q2oqsr+/fsZPHgwjzzyCP369cNisVzjixJC1DUJ3WuRkACTJkFpKfj5EdyiBb/88gu+vr64OnOAwGwGPz84dw4mTICvv4ZWrar9Mk3T2LdvH6qqsmXLFrp164aiKCxatEiuFBKikZDQramCAnj4YSguhosHB1xdXAjw9+fcuXO0DQ11/rl8fSEjAx57rGzEW8kJt6SkpPJ5Wh8fHxRFYebMmc268Y4QjZWEbk0tWwapqeDvf8WHWwYGcvz4cfLy82lRk1Gnnx/s2QP/+hfce2/5h8+fP098fDw2m40LFy4QHR3Na6+9Rnh4eC29ECGEEWQhrSbS08t2HbRoARXMm2bn5JCenk5YWBg1Wr4qKgKLhYKtW9mycydxcXH8+OOPDB06FEVR6NOnT5Ps8yBEUyULabXliy/A4agwcAG8vb3JzMxk/vHj/KhpFGgagVYrU1q25C4/vwq/RgfySkspTE1l8aBBFN52G4qi8Ne//hUPD4+6ey1CCENI6NbEZ5+VHXaohAkICQkh+pdfeKlTJzxdXDhRVMTDycl0dXOj22UhWlhUhN1ux263Y7VaCXRx4aXu3XF//fV6eCFCCKNI6DorNxdOnbpqLve33N3c6O7vjz0jA8/WrTFR1iTnVEkJnV1csNvtZNvtOBwOfH196dC+fdkV5CUlcPRo2R5e2VsrRJMloeusn3/+9ZRZNYICA1l45Ag7MjMpAW6wWGiXmUnS2bN4e3sT0qoVnp6eV877Wq1gt8P58xAYWFevQghhMAldZ+XkOD0CtVgsPN2uHenp6RwpKeFnk4lgPz/8fHwwV/YcJlNZ8GZnS+gK0YTJknhNVLHT47f8/Pxo364dv+valRJvb9Y5HJUH7uVkakGIJk1Gus5q2bJGDzcB7hcX3RzAqeLiqr9A18vmdQMCrq0+IUSjICNdZ3XuXBaKmlblwy6UlrIuO5t8TUPTdb7LzSXebqdvixZVP39JSdm0glxjLkSTJiNdZ7m5QXg4JCeXHY6ohAlYnZnJojNn0IDWLi7MDQlhSHXNcPLyYMiQWi1ZCNHwSOjWxNSp8NxzVT7E32rl3Q4dava8ul7Wd2HSpOsoTgjRGMj0Qk38/vfg4lLW7KY25edDUBD071+7zyuEaHAkdGvCywvmzSubCqjBToYqaVpZiC9aVGmXMSFE0yH/ymtq2jTo2bPsIMP10nXIyiobQQ8bdv3PJ4Ro8CR0a8pshr//HUJCri94LwVu9+7w8su1Vp4QomGT0L0WISGwejW0bQuZmWWdx2qipKQscG++Gf75zyp3QwghmpYq++maTKZ0ILn+yhFCiCahg67rFV7tUmXoCiGEqF0yvSCEEPVIQlcIIeqRhK4QQtQjCV0hhKhHErpCCFGP/j/l9Sa4S2gxOAAAAABJRU5ErkJggg==\n", - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2021-03-11T18:37:20.151559\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.3.2, https://matplotlib.org/\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", - " \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", - " \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" - ], - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/svg+xml": "\n\n\n \n \n \n \n 2021-06-13T22:28:59.388342\n image/svg+xml\n \n \n Matplotlib v3.4.2, https://matplotlib.org/\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 \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 \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", + "image/png": "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qlWraiqecHNuW7oAkyZNYs2aNZw4cULrKEKU+M9//kObNm2IL+dEiIooisLUqVNZtGgRFy5cqIF0wt25delGR0fz1FNPMXPmTNkQR7gFm83GsmXLGDx4cLWv0bBhQ5KSkpg3b54LkwlP4dalC/C3v/2NnJwcNm3apHUUIdi6dStRUVFOH/BZnieeeIKjR4/y7bffuiiZ8BRuX7p6vZ6UlBRee+01MjMztY4jfJiqqnz44Yc3Ncot5u/vz9SpU5kzZw55lZwuIbyL25cuQLNmzejevTuvv/661lGED/v111/Jzs6mc+fOLrleu3btaN26Ne+++65Lric8g0eULjgOs/z+++/57bfftI4ifNTSpUsZOHAgOhcubhg/fjz/+c9/OHr0qMuuKdybx5Su0WgsOcyyqKhI6zjCx6SlpbF3714edvLEa2dFREQwatQoZsyYIRs9+QiPKV2A7t27Ex0dLYdZilq3bNky+vXrV2rPXFfo06cPqqryySefuPzawv14VOkWz3H84IMPSE9P1zqO8BEZGRls2bKFfv361cj1dTod06ZN46233iIjI6NG3kO4D48qXYBbbrmFgQMHMmfOHJm7K2rFmjVr6NGjBxGVbOF4M5o0acLDDz/Mq6++WmPvIdyDx5UuOA6zPHPmDFu3btU6ivBy+fn5rF27loEDB9b4e40YMYLdu3ej1X4nonZ4ZOn6+fkxbdo05s2bR25urtZxhBfbuHEjLVu2pGHDhjX+XsHBwUyZMoUZM2ZgtVpr/P2ENjyydAHatGnDvffey8KFC7WOIryU3W6/6SW/VdW5c2duu+02Pvzww1p7T1G7PLZ0AcaOHctnn33GwYMHtY4ivNC2bdswmUy0atWqVt938uTJrFixgpMnT9bq+4ra4dGlGx4ezrPPPitzHEWNWLp0KYMHD65wq8aaEBsby9///ndmzZolD4u9kEeXLjgOswwICGDt2rVaRxFeZM+ePVy6dImuXbtq8v6PP/44ZrOZL774QpP3FzXH40tXURSmTZvGO++8w6VLl7SOI7xEamoqgwYNcumS36rQ6/VMmzaNV155haysLE0yiJrh8aULkJCQwKOPPiqHWQqXOHXqFLt376Z3796a5mjRogVdunThzTff1DSHcC2vKF2AJ598kr1797Jjxw6towgPt3z5cvr27UtQUJDWURg9ejTffPMNe/fu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eHg4zz77rDwsroCUroY6d+7MbbfdxgcffKB1FLeRmprK448/jsEgsxk9Ve/evQkMDGTt2rVaR3FLUroamzJlCitXruTkyZNaR9Hc2bNn2bFjB48++qjWUcRNKN7o6Z133pE9j8sgpauxmJgYhg0bxqxZs3x+juOKFSt45JFHCAkJ0TqKuEkJCQn07duXl19+WesobkdK1w0kJydjNpv54osvtI6imaysLDZu3EhycrLWUYSLDBs2jP379/PDDz9oHcWtSOm6ATnMEj7++GM6depUsnWg8HyBgYE899xzzJ49m4KCAq3juA0pXTfRvHlzunTp4pO77hcWFrJy5UpZDOGFOnToQLNmzVi0aJHWUdyGlK4befbZZ/nmm2/Yu3ev1lFq1RdffMGtt95KkyZNtI4iasCECRNYt24dv//+u9ZR3IKUrhsJDQ1l3LhxzJgxA5vNpnWcWqGqasliCOGdoqKiGDFiBDNnzvT5h8Ugpet2HnzwQcLDw1m5cqXWUWrFzp07UVWV++67T+soogb169eP/Px8Nm7cqHUUzUnpupniOY6LFy/m3LlzWsepcbLk1zfodDqmTZvG/PnzMZvNWsfRlJSuG2rQoAHJyclef5jl4cOHOX78OA8++KDWUUQtaNq0KX/+8595/fXXtY6iKSldNzV06FCOHz/O9u3btY5SY1JTU0lOTpZDJ33IqFGj+PHHH/nll1+0jqIZKV035e/vT0pKCnPmzPHK/UkvXLjAd999R9++fbWOImpRSEgIEydOZObMmRQWFmodRxNSum6sbdu2tGnTxisPs1y5ciW9evUiNDRU6yiilnXr1o169eqRmpqqdRRNSOm6uXHjxrFx40aOHDmidRSXycnJYf369bLk10cpisJzzz1HamoqZ86c0TpOrZPSdXMRERE888wzXrU/6fr167nvvvuIi4vTOorQSFxcHIMHD2b27Nk+N3dXStcDPPLIIyiKwvr167WOctOKiopYvny5LPkVDBo0iHPnzvHVV19pHaVWSel6gOLDLBcsWODxh1l++eWXxMfH06xZM62jCI0ZDAZSUlJ4+eWXycnJ0TpOrZHS9RCNGzemd+/evPLKK1pHqTZZ8itu1Lp1a9q3b89bb72ldZRaI6XrQYYPH86vv/7KTz/9pHWUatm1axdWq5UOHTpoHUW4kTFjxrBlyxb279+vdZRaIaXr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\n" }, - "metadata": {}, - "output_type": "display_data" + "metadata": {} } ], "source": [ @@ -1597,406 +405,20 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "energy: -1.4999796718931908\n", - "time: 3.5326640605926514\n", - "max-cut objective: -3.9999796718931906\n", - "solution: [0. 1. 0. 1.]\n", - "solution objective: 4.0\n" + "energy: -1.4997993934173706\ntime: 2.370492458343506\nmax-cut objective: -3.9997993934173706\nsolution: [0. 1. 0. 1.]\nsolution objective: 4.0\n" ] }, { + "output_type": "display_data", "data": { - "image/png": "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\n", - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2021-03-11T18:37:25.030601\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.3.2, https://matplotlib.org/\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", - " \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", - " \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" - ], - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/svg+xml": "\n\n\n \n \n \n \n 2021-06-13T22:29:02.641297\n image/svg+xml\n \n \n Matplotlib v3.4.2, https://matplotlib.org/\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 \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 \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", + "image/png": "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HMehrKwMV69epTWOFmYwGMBxHERRhCAIkEqlCA8PR+PGjalwbYR217MMKl0L43keH3zwAY4cOcI6ilO4cuUKgP89DPHoY9YpKSnYtGkTk1yugnbXszwqXQuTSCSIjY3FihUrkJ+fzzqOQ1u3bh06d+6MIUOGYO/evQCMv76mqZvLly/j6aefZhnR6T26u96gQYNw/fp17N69GzExMQD+9x0IMR+VrhV06NABzz33HD777DPWURzatm3b8MknnyAyMhLLly9H7969sXbtWgDGY9avXbuG8PBwximdH+2uZ1lUulby7rvv4qeffsLFixdZR3FIoihiyZIl6NmzJ6Kjo3Ho0CHMmDED+/fvR69evdCyZUvcu3ePdUyXQbvrWQ6tXrCiAwcOICEhAfHx8TQisKCdO3fijTfeQEZGBhQKBes4LqO63fW2b9+OjIwMPHjwAP7+/vjHP/7BOCl7tHqBkUGDBkGtVmPr1q2soziVGzduIDo6mgrXxqrbXW/v3r3lu+vt2LGDdterBT1YbUUcx2H+/Pl48803MWDAAAQEBLCO5JAe3zv37bffZpjGddHuepZBI10rCwkJQUREBJYvX846isNKTEyEVqst/7FKpYJKpWKYyHXR7noNR6VrA2+88QZu3LiBX375hXUUh3Pnzh1s3LiRzj+zI7S7XsNQ6dqATCbD/PnzsXTpUhQXF7OO41ASExMxYsQIeHp6so5CHlKr1WjVqhViY2Nx4MABDB48GBs3bsSkSZPKl/TRaobqUenaSLdu3dCpUyesX7+edRSHodVqcejQIURERLCOQh5Du+vVH91Is6GZM2ciIiICf/vb39CyZUvWcezed999h+effx5+fn6so5DH8DyPGTNm0A2zeqC/jmzI19cX77zzDuLi4ujbr1rodDps3boVUVFRrKOQGpg2ITKhfRhqR6VrY8OHD4coinS8TC0OHjyIp556Ci1atGAdhdTCVLylpaVISUlhHcfuUenaGM/ziI2NxWeffYacnBzWceySIAhISEhAdHQ06yjETBzH4dq1a5g2bRodZlkLKl0GwsLCMGTIEKxcuZJ1FLt08uRJuLm5oWvXrqyjkDpo3749unfvXr6CgVSNSpeRiRMn4uzZs6C9LSqLj4/HmDFj6AaNA5o2bRp++OGH8n2QSWVUuox4enpi3rx5iIuLg06nYx3Hbly+fBm3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\n" }, - "metadata": {}, - "output_type": "display_data" + "metadata": {} } ], "source": [ @@ -2029,404 +451,20 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "optimal function value: 4.0\n", - "optimal value: [1. 0. 1. 0.]\n", - "status: SUCCESS\n" + "optimal function value: 4.0\noptimal value: [1. 0. 1. 0.]\nstatus: SUCCESS\n" ] }, { + "output_type": "display_data", "data": { - "image/png": "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\n", - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2021-03-11T18:37:28.843186\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.3.2, https://matplotlib.org/\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", - " \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", - " \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" - ], - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/svg+xml": "\n\n\n \n \n \n \n 2021-06-13T22:29:05.250840\n image/svg+xml\n \n \n Matplotlib v3.4.2, https://matplotlib.org/\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 \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 \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", + "image/png": "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qlWraiqecHNuW7oAkyZNYs2aNZw4cULrKEKU+M9//kObNm2IL+dEiIooisLUqVNZtGgRFy5cqIF0wt25delGR0fz1FNPMXPmTNkQR7gFm83GsmXLGDx4cLWv0bBhQ5KSkpg3b54LkwlP4dalC/C3v/2NnJwcNm3apHUUIdi6dStRUVFOH/BZnieeeIKjR4/y7bffuiiZ8BRuX7p6vZ6UlBRee+01MjMztY4jfJiqqnz44Yc3Ncot5u/vz9SpU5kzZw55lZwuIbyL25cuQLNmzejevTuvv/661lGED/v111/Jzs6mc+fOLrleu3btaN26Ne+++65Lric8g0eULjgOs/z+++/57bfftI4ifNTSpUsZOHAgOhcubhg/fjz/+c9/OHr0qMuuKdybx5Su0WgsOcyyqKhI6zjCx6SlpbF3714edvLEa2dFREQwatQoZsyYIRs9+QiPKV2A7t27Ex0dLYdZilq3bNky+vXrV2rPXFfo06cPqqryySefuPzawv14VOkWz3H84IMPSE9P1zqO8BEZGRls2bKFfv361cj1dTod06ZN46233iIjI6NG3kO4D48qXYBbbrmFgQMHMmfOHJm7K2rFmjVr6NGjBxGVbOF4M5o0acLDDz/Mq6++WmPvIdyDx5UuOA6zPHPmDFu3btU6ivBy+fn5rF27loEDB9b4e40YMYLdu3ej1X4nonZ4ZOn6+fkxbdo05s2bR25urtZxhBfbuHEjLVu2pGHDhjX+XsHBwUyZMoUZM2ZgtVpr/P2ENjyydAHatGnDvffey8KFC7WOIryU3W6/6SW/VdW5c2duu+02Pvzww1p7T1G7PLZ0AcaOHctnn33GwYMHtY4ivNC2bdswmUy0atWqVt938uTJrFixgpMnT9bq+4ra4dGlGx4ezrPPPitzHEWNWLp0KYMHD65wq8aaEBsby9///ndmzZolD4u9kEeXLjgOswwICGDt2rVaRxFeZM+ePVy6dImuXbtq8v6PP/44ZrOZL774QpP3FzXH40tXURSmTZvGO++8w6VLl7SOI7xEamoqgwYNcumS36rQ6/VMmzaNV155haysLE0yiJrh8aULkJCQwKOPPiqHWQqXOHXqFLt376Z3796a5mjRogVdunThzTff1DSHcC2vKF2AJ598kr1797Jjxw6towgPt3z5cvr27UtQUJDWURg9ejTffPMNe/fu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eHg4zz77rDwsroCUroY6d+7MbbfdxgcffKB1FLeRmprK448/jsEgsxk9Ve/evQkMDGTt2rVaR3FLUroamzJlCitXruTkyZNaR9Hc2bNn2bFjB48++qjWUcRNKN7o6Z133pE9j8sgpauxmJgYhg0bxqxZs3x+juOKFSt45JFHCAkJ0TqKuEkJCQn07duXl19+WesobkdK1w0kJydjNpv54osvtI6imaysLDZu3EhycrLWUYSLDBs2jP379/PDDz9oHcWtSOm6ATnMEj7++GM6depUsnWg8HyBgYE899xzzJ49m4KCAq3juA0pXTfRvHlzunTp4pO77hcWFrJy5UpZDOGFOnToQLNmzVi0aJHWUdyGlK4befbZZ/nmm2/Yu3ev1lFq1RdffMGtt95KkyZNtI4iasCECRNYt24dv//+u9ZR3IKUrhsJDQ1l3LhxzJgxA5vNpnWcWqGqasliCOGdoqKiGDFiBDNnzvT5h8Ugpet2HnzwQcLDw1m5cqXWUWrFzp07UVWV++67T+soogb169eP/Px8Nm7cqHUUzUnpupniOY6LFy/m3LlzWsepcbLk1zfodDqmTZvG/PnzMZvNWsfRlJSuG2rQoAHJyclef5jl4cOHOX78OA8++KDWUUQtaNq0KX/+8595/fXXtY6iKSldNzV06FCOHz/O9u3btY5SY1JTU0lOTpZDJ33IqFGj+PHHH/nll1+0jqIZKV035e/vT0pKCnPmzPHK/UkvXLjAd999R9++fbWOImpRSEgIEydOZObMmRQWFmodRxNSum6sbdu2tGnTxisPs1y5ciW9evUiNDRU6yiilnXr1o169eqRmpqqdRRNSOm6uXHjxrFx40aOHDmidRSXycnJYf369bLk10cpisJzzz1HamoqZ86c0TpOrZPSdXMRERE888wzXrU/6fr167nvvvuIi4vTOorQSFxcHIMHD2b27Nk+N3dXStcDPPLIIyiKwvr167WOctOKiopYvny5LPkVDBo0iHPnzvHVV19pHaVWSel6gOLDLBcsWODxh1l++eWXxMfH06xZM62jCI0ZDAZSUlJ4+eWXycnJ0TpOrZHS9RCNGzemd+/evPLKK1pHqTZZ8itu1Lp1a9q3b89bb72ldZRaI6XrQYYPH86vv/7KTz/9pHWUatm1axdWq5UOHTpoHUW4kTFjxrBlyxb279+vdZRaIaXr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\n" }, - "metadata": {}, - "output_type": "display_data" + "metadata": {} } ], "source": [ @@ -2483,463 +521,20 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "distance\n", - " [[ 0. 48. 91.]\n", - " [48. 0. 63.]\n", - " [91. 63. 0.]]\n" + "distance\n [[ 0. 48. 91.]\n [48. 0. 63.]\n [91. 63. 0.]]\n" ] }, { + "output_type": "display_data", "data": { - "image/png": "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\n", - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2021-03-11T18:37:29.081040\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.3.2, https://matplotlib.org/\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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/svg+xml": "\n\n\n \n \n \n \n 2021-06-13T22:29:05.585796\n image/svg+xml\n \n \n Matplotlib v3.4.2, https://matplotlib.org/\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 \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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAADnCAYAAAC9roUQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAsDUlEQVR4nO3dd3xUVf7/8dedZDJJIJOQRgqBJEAUsNDEAipfFRRdbD9Mo4QmgmGpCyhFXIgUEQQUBUTAAKYsC6yggoK6IoJItaAgJaFNSCAkIb3M/P6YJYKkQjJ3JvN5Ph55CN6ZO5/syjuHc8/5HMVkMiGEEMIyNGoXIIQQ9kRCVwghLEhCVwghLEhCVwghLEhCVwghLMixqove3t6m4ODgGy8YjZCaCnl5oCigqUV2G43mL09PCAgwv18IIRqQ/fv3XzSZTD4VXasydIODg9m3b9/1/zI3F6KjITsbgoNvLjSNRvP777sPFi8GB4fa30MIIayUoiiplV2r3fSCyQTjxsGvv4KHx82PUjUacHeHzz+HRYtu7h5CCGGDahe6n30GO3bcWuCWf7IG9Hp4/31ziAshhB2oeegWFcGUKeDiUnfzsI6O5nu98krd3E8IIaxczUP3iy/MD86cneu2Ajc3+P13OHKkbu8rhBBWqOahu3JltasUio1GZpw/z9+OH+eho0eJPnmS73Nzq76vokBZGaxbV+NShBDCVlW5eqFcSQn8/LN5DrYKZYCfVsvy5s3x02rZlZvLK+fOkRgSQoCTU+VvdHWFXbtqUbYQQtimmo10T5wwL+uqZqTrotEwzMeHACcnNIrCg25uBGi1/F5YWPX9dTo4cwYKCmpatxBC2KSahe6FC7XbAAEYTSYyS0s5XVxMqE5X9YsVxRzqFy/W6jOEEMLW1Gx6oazMvEa3hkwmE7/89htvAU96eBBcXejCn3O7QgjRgNVs+NqoUa1uagLeKytDq9Hw/JUrZOfkUG1kG43muV0hhGjAajbSbdXK/DDNZKp2ja7JZGKmwcAVjYbFAQG4arWcNxjIzs7G388PrVZ745tKS83zuj4VblUWQogGo2YjXS8v8y60kpJqXzo7LY1TxcXM9PSEkhJcXFwICQnBxcWFk6dOcTkr68ZRb0EB3HmnNL8RQjR4NX869swz5s0RVTCUlLAhK4tjhYX0zczkyfPnefDoUbbl5ODj7U1wixZkZWWRmppKUXHxn280GuG55272exBCCJuhVHUwZefOnU3lXcZOnoSePc1rdWuwkiG/oIALFy4Q8pfWkCYgMzOTixcv4uXlhZdej1JSAvv2yZyuEKJBUBRlv8lk6lzRtZqPdENDoUcPyMmp0ct1Tk4UFRXdMJWgAF6enoSEhJCXm0v6yZOkP/+8BK4Qwi7UbvFtXJx5JUMNNjE4ODigURRKS0srvO6k1dLcwwMlNJQB33/P0qVLKb52ykEIIRqg2oWul5e56XhRkfmrGjqdjqLKXpebi6LT4fuvfxGfmMixY8fo168fP//8c61KEkIIW1L7M9IefvjP4L1ypcqXVhi6JhNkZYFWa25yExaGr68v8+fPZ+jQoYwfP54FCxZQIFuChRAN0M0dTPnkk5CYaF5Xe/kyVDIt4KTTUXxt6BYWmgO3XTvYvBnuvrv8kqIo9OzZk+TkZLKysoiIiGDv3r03VZ4QQlirmq9eqEhBgfnkh1WrzIFqNJr77ep0oCjk5eaSnZ5OQJMm5oblHh4wciT07VvtuWi7du1i1qxZ3HvvvYwdOxY3N7eb/BaFEMKy6mb1QkVcXMxnpu3bBwsXQp8+4OdnPrzy8mWcjUZOazSY+veHFStg924YMKBGB1F27dqV5ORknJycCA8P55tvvrmlUoUQwhrc2ki3GiaTiUcffZT169fj6el50/c5cOAAcXFxhIWFMXHixFu6lxBC1Lf6G+lW/8GEhoZy6tSpW7pPx44dSUhIICAggMjISD777DOq+mEhhBDWql5DFyA0NJSTJ0/e8n10Oh2jRo1i4cKFrFmzhtGjR5OWllYHFQohhOXUe+gGBwff8kj3Wm3btmXNmjW0b9+evn37kpycjNForLP7CyFEfbLISLcuQxfA0dGRwYMHs2LFCrZu3cqwYcNITU2t088QQoj6YDPTCxUJCQlhxYoVPPbYYwwePJjVq1dTJqdPCCGsWL2Hro+PDwUFBeTUsFFObWk0GiIjI1mzZg179+4lJiaGY8eO1ctnCSHErar30K2rFQzVCQgIYMmSJYSHhxMbG8t7770nDXSEEFan3kMXzNMA9R26YA74p59+moSEBE6dOkV0dDSHDx+u988VQoiasljo1te8bkW8vb2ZN28eL7/8MpMmTWLevHnk5+db7POFEKIyFgldS0wvVOSRRx4hOTmZvLw8IiIi2LNnj8VrEEKIa9XsNOBbVJ8rGKqj1+t5/fXX2b17N2+88QadO3dm7Nix6PV6VeoRQtg3i4x0/fz8yM7OVvWv+Pfffz9JSUm4uLgQHh7OV199pVotQgj7ZZHQ1Wg0tGjRgpSUFEt8XKVcXV2ZOHEic+bMYcmSJUycOJFLly6pWpMQwr5YJHRB3SmGv2rfvj0JCQm0aNGCyMhINm/eLA10hBAWYbHQtfQKhuo4OTkRGxvLu+++S0JCAiNHjuT8+fNqlyWEaOAsOtJVYwVDdW677Tbi4+Pp3Lkz/fv3JykpSRroCCHqjV1OL/yVo6MjgwYN4sMPP+SLL75g6NChVvkDQghh+ywWuoGBgWRkZFR+JLsVCA4O5oMPPuCJJ55g6NChrFy5ktLSUrXLEkI0IBYLXQcHB4KCgqy+BaNGoyE8PJy1a9dy8OBBBgwYwO+//652WUKIBsJioQvWPcXwV/7+/ixevJi+ffvy97//nXfeeceqR+lCCNtg0dC1thUM1VEUhaeeeoqkpCTOnj1LVFQUBw8eVLssIYQNs3jo2uIDKk9PT+bOncvIkSOZPHkyc+fOlQY6QoibYvHpBVsM3aseeeQRkpKSKCoqIjw8nO+//17tkoQQNsYiDW+uCgoK4vz585SUlKDVai350XVGr9fz2muv8cMPP/DGG2/Qvn17xo8fj7u7u9qlCSFsgEVHuk5OTvj7+3PmzBlLfmy9uPfee0lMTMTd3Z3w8HC2b98uW4mFENWyaOiCba1gqI6rqyvjx49n3rx5LFu2jAkTJpCRkaF2WUIIK2bx0LW1FQw1cdddd7Fu3TpatmxJVFQU//nPf2TUK4SokCqhq3aLx/rg5OTEiBEjeO+991i/fj2xsbGcO3dO7bKEEFZGphfqWFhYGKtXr+a+++5jwIABfPzxx9JARwhRzuKh26JFC06fPk1ZWZmlP9piHBwcGDBgAKtWreLrr79myJAhDfoHjRCi5iweus7Ozvj4+NjFX72bN2/OsmXLeOqppxg2bBgrVqygpKRE7bKEECqyeOhCw3yYVhmNRkOfPn1Yt24dP/30E/379+fIkSNqlyWEUIkqoWvrO9NuRtOmTVm0aBExMTGMGTOGxYsXU1hYqHZZQggLU22ka2+hC+YGOr169SIxMZG0tDSioqI4cOCA2mUJISxItZGuvUwvVMTT05NZs2YxZswYpk6dyuzZs8nLy1O7LCGEBag20k1JSbH7pVQPP/wwSUlJlJWVER4eznfffad2SUKIeqZK6Lq6uqLX60lLS1Pj462Km5sbU6dOZfr06cybN4+pU6dy+fJltcsSQtQTVUIX7PNhWlW6dOlCYmIiXl5eRERE8MUXX8hWYiEaIFVD157ndSvi4uLC2LFjWbBgAStWrGD8+PGkp6erXZYQog6pFrr2uoKhJu644w7Wrl3L7bffTnR0NBs3bpRRrxANhIx0rZSTkxPDhg1j6dKlbNy4kREjRnD27Fm1yxJC3CLVR7oygqtaq1atWLVqFd26dSMmJoa1a9fa/aoPIWyZaqGr1+vR6XTS9LsGHBwc6NevH6tXr2bnzp0MHDiQEydOqF2WEOImqBa6ICsYaisoKIj333+fZ599lpdeeonly5dLAx0hbIzqoSvzurWj0Wh4/vnn+fjjj/ntt9/o27cvv/76q9plCSFqSNXQlRUMN8/X15cFCxYwZMgQxo4dy9tvvy0NdISwAaqHrox0b56iKDz++OMkJSVx6dIlIiIi2Ldvn9plCSGq4Kjmh1+dXjCZTCiKomYpNq1JkybExcXx7bff8tprr9G1a1dGjRqFm5ub2qUJIf5C1ZFukyZNAKTXQB156KGHSE5ORlEUIiIi+Pbbb9UuSQjxF6qGrqIosoKhjjVu3JjJkyczc+ZMFixYwOTJk8nMzFS7LCHE/6gauiDzuvWlU6dOJCYm0rRpUyIjI/n8889lI4oQVsAqQldGuvXD2dmZ0aNHs3DhQj766CPGjh3LhQsX1C5LCLumeujK9EL9a9u2LWvWrKFdu3b07duXf//737KVWAiVqB66rVu3JiAgQO0yGjytVsuLL77I8uXL2bx5M8OHD+f06dNqlyWE3VE9dD09PRk7dqzMN1pIaGgoK1eupHv37gwaNIj4+HjKysrULksIu6F66CqKQuPGjWWdrgVpNBqio6OJj49nz549DBw4kGPHjqldlhB2QfXQFeoJDAxkyZIl9OnTh5dffpn333+f4uJitcsSokGT0LVziqLwzDPPkJCQwPHjx+nbty8//fST2mUJ0WBZXejm5eWRmppKWloaqampapdjN3x8fHjrrbcYNmwYEyZMYP78+RQUFKhdlhANjtWE7pYtWxg0aBDt2rWjX79+PPTQQ4wYMYKkpCRyc3PVLs8uKIpCjx49SE5OJjs7m4iICPbu3at2WUI0KKo2vLlq//79bNq0iTvvvJP77ruP3bt3s2zZMoKCgoiIiECr1fL888+rXabdcHd3Z8aMGXz//ffMmDGDLl26MGbMGPR6vdqlCWHzrGKku2rVKtq1a8e4ceN46aWXuO2229iwYQNubm507tyZr776Su0S7dIDDzxAUlISOp2OiIgIvv76a7VLEsLmWUXodujQgR9++IG0tDR+//13fv31V7y8vADo1q0b7dq1U7lC+9WoUSMmTZrEG2+8wTvvvMMrr7wiDXSEuAVWEbo9e/YkLCyMKVOm8PrrrxMWFsaIESMwmUzcddddErpWoGPHjiQkJBAYGEhkZCSffvqpbGgR4iYoVf3B6dy5s8lSJxEcPHiQI0eOEBgYSIcOHXB3dwcgPz+f6Oho/v3vf+Pg4GCRWkTVfvvtN2bOnIm3tzeTJ0/Gz89P7ZKEsCqKouw3mUydK7pmFSNdgNjYWB5++GG6d++Ou7s7s2fPJiMjA1dXV9LS0vjjjz/ULlH8T5s2bYiPj6d9+/b07duX5ORkaaAjRA1ZTeg2atSIS5culf/+m2++Yfv27QB4eXlJ6FoZR0dHBg8ezIoVK9i6dSvDhg2TddVC1IDVhG6bNm1Yv349ACkpKRQVFfHJJ5/w6quv0qpVK2677TaVKxQVCQkJYcWKFfTo0YPBgwezevVqSktL1S5LCKtlNaEbHR1NVlYWvXv3Zvjw4YwfP56pU6dSVFREnz59CAsLU7tEUQmNRkNERARr1qzhxx9/JCYmhqNHj6pdlhBWyWoepAFkZmayY8cOQkNDad++vTw4s0Emk4ktW7awePFinnvuOYYOHYqTk5PaZQlhUTbxIA3M87ovvPACnTp1Kg9co9EoD2lsiKIo9O7dm4SEBE6dOkVUVBSHDx9WuywhrIZVhe7y5cvJy8sDKF8DqtFo0Gg0sibUxnh7ezNv3jxiY2OZNGkSb775Jvn5+WqXJYTqrCp0GzduXP4HU1EUTCZTebMbaXJumx555BGSk5PJz88nIiKC3bt3q12SEKqymjldk8lUHqwGg4Evv/wSg8FAaWkpjo6OtGjRgt69e9OoUSOL1CPq3u7du5k1axadOnVi3Lhx0kBHNFg2MaerKAqlpaWsXbuWmJiY8kbaer2e9PR0Nm7cyJtvvqlyleJW3H///SQlJeHq6kp4eLg0MhJ2yWpGugAnT55k1KhRxMbG0qlTJ3x9fcuvpaWl0bVrV06cOGGxekT9OXToEDNnzqRly5ZMnDgRb29vtUsSos7YxEgXzMeEHzx4kF69epUHbk5ODocPH2bhwoU888wzKlco6kr79u1JSEggODiYqKgodu/eXenD0u+++46NGzdauEIh6odVjXQBYmJiuHjxIu3ataNJkybk5uaSmZlJUVER06ZNIyQkxKL1iPr3xx9/4OvrW97k6Kq8vDzee+89kpOTCQ0N5dixY6xfv56WLVuqVKkQNVPVSNcqTo641rx589ixYwfZ2dnk5uYSFBRE9+7d6dGjh9qliXrSunXrCke5J06cYM+ePSxbtoyOHTsybdo0du7cKaErbJrVha6vry9RUVHlGyI0GquaARH1pKIlgX/88Qcmk4mOHTtSVlZGbm4uXl5enDt3juXLl9OlSxeeeuopFaoV4uZZXeheJWErbr/9dgwGA4mJiaSmppKeno6DgwM6nY6goCB69+7Nhg0bePbZZ9UuVYgas8pkMxqNFBcXq12GUFFxcTHt2rXjo48+4quvvmLv3r24u7tz33334e3tjaIohIeH06FDB7VLFaJWrDJ0T506xZYtW9QuQ6hk8+bN9OjRgxMnThAWFkZwcDDNmzfnmWeewdPTk2PHjhEfH8/gwYNp3ry52uUKUStWOb1QWFjIhg0b5Nh1O9W7d29OnTrF448/TseOHXF0dGTy5MnccccdAMTFxdG9e3e6desm28OFzbHK0A0ODiYlJQWj0Shzu3Zq1KhRREVFoSgK3t7e5Y3R161bR1ZWFjExMbi6ulb6/qunkFw9VVoIa2GVoduoUSP0ej1paWkEBASoXY5QiY+PD2A+nHTu3LmkpKRw7tw5XnvttUqnFUwmE2PGjOHs2bN8//33TJ06ldjYWEuWLUSVrHYYGRoaysmTJ9UuQ1gBV1dXRo0axeXLl/nhhx/IycnB0fHP8cLVNb4XLlxgyZIlHD16lFWrVnHw4EG2bNlCSkqKSpULcSOrDt1Tp06pXYawEl5eXnzyyScsX76ct99+m/T09PJriqJgNBrZs2cPhw4dYsqUKej1enJzc8nIyLhhp5sQarLa0A0JCZHQFTeIioriiy++wNfXl4MHD7Jz507A/PD1v//9L23atOHBBx8E4Oeff+b//u//5OQRYVWsOnRlekFU5OpRTiUlJeU/mE+ePMmnn37KwIEDAXPg/vjjj/j4+MjDNGFVrPJBGvwZutc2NxfiWl26dKFLly6AuRvd/fffX75NeMeOHeTk5PDyyy8DyH9HwmpYbei6u7vj7OxMRkbGdX11hahI69atOXjwIH369CEjI4OuXbsSHR1Ns2bNJHCFVbHa0IU/H6ZJ6Irq+Pj4cPjwYVavXo2npydPP/10+TVFUSgqKuLixYsEBgaqWKUQVjynC7JsTNTewIEDywP36lIyk8nEuXPnGDBgAB988AElJSVqlijsnFWHbnBwsKxgEDft6pSCoiiEhoby8ccf88svv9C/f3+OHDmicnXCXll16MpIV9Slpk2bsnDhQmJiYhgzZgyLFi2isLBQ7bKEnbGJ0K3qSCEhakNRFHr16kViYiIXLlwgKiqK/fv3q12WsCNWHbpNmjQB4PLlyypXIhoaT09PZs2axdixY5k2bRqzZs0iNzdX7bKEHbDq0L06FyfzuqK+PPTQQyQlJWEymQgPD+e7775TuyTRwFl16ILsTBP1z83NjSlTpvDPf/6TefPmMXXqVPnblag3NhG6MtIVlnDPPfeQlJSEl5cXERERbNu2TZ4niDpn9aErKxiEJTk7OzN27FgWLFjAhx9+yLhx467raCbErbKJ0JWRrrC0O+64g3Xr1tGmTRuio6PZsGGDdCsTdcLqQ9fHx4eCggJycnLULkXYGa1Wy7Bhw1i6dCmbNm1ixIgRnDlzRu2yhI2z+tBVFEXmdYWqWrVqxerVq3nwwQcZOHAga9eulVGvuGlWH7og87pCfRqNhn79+rF69Wp27tzJwIEDOX78uNplCRtkE6ErI11hLYKCgli6dCnPPfccw4cPZ9myZRQXF6tdlrAhNhG68jBNWBNFUXjuuef4+OOPOXr0KP369eOXX35RuyxhI2widGWDhLBGvr6+zJ8/n6FDhzJu3DgWLFhAQUGB2mUJK2cToevv709WVhZ5eXlqlyLEdRRFoWfPniQnJ5OZmUlkZCQ//vij2mUJK2YToavRaAgODiYlJUXtUoSokIeHB3FxcfzjH/9g+vTpxMXFceXKFbXLElbIJkIXZAWDsA0PPvggycnJODg4EBERwbfffqt2ScLK2EzoygoGYSsaN27Mq6++SlxcHG+//TaTJ08mMzNT7bKElZDQFaKedOzYkYSEBPz8/IiMjOSzzz6TBjrCdkJXpheELXJ2dmbUqFEsXLiQ+Ph4xowZw4ULF9QuS6jIZkK3WbNmZGRkyJlWwia1bduWNWvWcOeddxIdHc369etlK7GdspnQdXBwICgoiNTUVLVLEeKmaLVahg4dygcffMCWLVsYPnw4p0+fVrssYWE2E7ogO9NEwxAaGsrKlSvp3r07gwYNIj4+nrKyMrXLEhZiU6ErO9NEQ6HRaIiOjiY+Pp49e/YQExPDsWPH1C5LWIDNha6MdEVDEhgYyJIlSwgPDyc2Npb3339fGug0cDYVurKCQTREiqLw9NNP8/HHH3P8+HH69u3LTz/9pHZZop7YVOgGBQVhMBgoKSlRuxQh6pyPjw9vvfUWL730EhMmTGD+/Pnk5+erXZaoYzYVuk5OTvj7+8uRKaLBUhSFxx57jOTkZLKzs4mMjOSHH35QuyxRh2wqdEEepgn74O7uzowZM3jllVeYOXMmM2bMkHMCGwibC12Z1xX25IEHHiA5ORlnZ2ciIiL4+uuv1S5J3CKbC11ZwSDsjaurKxMnTmTWrFm88847TJo0iUuXLqldlrhJNhe6skFC2KsOHTqQkJBAUFAQUVFRfPrpp9JAxwbZXOi2aNGC06dPyw4eYZd0Oh0jR45k0aJFrFu3jlGjRmEwGNQuS9SCzYWus7Mz3t7enDt3Tu1ShFBNmzZtiI+Pp0OHDvTr14/k5GRpoGMjbC50QR6mCQHg6OjI4MGD+fDDD9m6dSsvvviiNISyARK6Qti44OBgVqxYQc+ePRk8eDCrVq2itLRU7bJEJWwydENCQuSQSiGuodFoiIiIYM2aNezbt4+YmBiOHj2qdlmiAjYbujLSFeJGAQEBvPvuu0RGRjJy5EiWLFkiDXSsjM2GbkpKijw4EKICiqLQu3dvEhMTSU1NJSoqisOHD6tdlvgfmwzdRo0aodfrSUtLU7sUIayWl5cXb775JrGxsUyaNIk333xTGuhYAZsMXZCHaULU1COPPEJycjIFBQVERESwe/dutUuyazYdurIzTYia0ev1TJ8+nSlTpjBr1iymT58uDXRUYnuhW1QEX35JzwMH6Dx7NnTrBl27Qq9eMHkybNgAmZlqVymEVbrvvvtISkqicePGhIeHs2PHDrVLsjtKVXu3O3fubNq3b58Fy6lCTg4sXw7x8VBYSFFeHpdycwlo3tx8vawMCgvBwcH8+169YPRoaNlSvZqFsGKHDx9mxowZtGzZkokTJ+Lt7a12SQ2Goij7TSZT54qu2cZI99tv4ZFH4P33zb/X63Hw9SXHaMSk04FOB66u4OkJ7u7QuDFs2QJPPmkOalkoLsQN7r77bhISEggODiYqKopPPvlEGuhYgPWH7vvvw+DBkJ8PTZqAkxMAjg4OaBSl4p03Dg7mAHZ2hrlz4cUXzaNgIcR1nJycePnll1myZAlJSUmMHDmS8+fPq11Wg2bdofvhh/DWW+aRq6vrDZd1Oh1FRUWVv1+rBQ8P80h5xAgZ8QpRibCwMOLj4+nSpQv9+/cnMTFR1sHXE+sN3UOHYPZsc+A6Olb4EqfqQhdAUczB+9//wooVdV6mEA2Fg4MDMTExrFy5ku3btzN06FBZIVQPrDN0i4rMD8EcHMyj1UrodDqKqwtdMAevmxssWADHj9dhoUI0PC1atGD58uX06tWLoUOHsnLlSmmgU4esM3Q/+wzOnTMHZRV0Oh1FNd1XrtWaVzgsWlQHBQrRsGk0Gl544QXWrl3LoUOH6N+/P7/99pvaZTUI1he6JhMsXVrplMK1PsnPZ3RWFvf//juv12TyX6+HrVtBzpcSokb8/f1ZtGgR/fv3Z/To0SxevLj6KT1RJesL3TNn4ORJaNSo2pf6Ojnx/7Ra/lbNiLicg4M51L/66haLFMJ+KIrCk08+SWJiIgaDgaioKA4cOKB2WTbL+kL3yBHQaMzzsNV4VK/nIVdXXGuzttBkAmvZ8CGEDfH09GT27NmMGjWKKVOmMGfOHPLy8tQuy+ZYX+j++ivUov+nTqer3SS/szMcPHgThQkhALp3705SUhIlJSWEh4eza9cutUuyKdVPnFrapUvmkW4N6ZydKcjOJr+0lJycHLRaLVqtFgdHRyocKzs4QHZ2nZUrhD3S6/VMmzaNvXv3EhcXR/v27Rk3bhweHh5ql2b1rG+kW4vABfBs0gRXFxeMRiM5OTkY0tI4cfIkR3//neMnTnD69GkMBgMXL14kOyeHgsJCSsrKZOG3EHWgS5cuJCUl4eHhQUREBF9++aVsJa6G9Y10AwLM86614OriQmOtlmYBAeX/rsxopLSkhJKSEor/98/CK1dQCgo4nZXFuK5d8fX1JSAgAH9/f/z8/Mp/7e/vj6+vL441WEEhhL1zcXFh3LhxPPbYY8TFxbF161ZeeeUVfHx81C7NKllfqrRrV95foTplJhNlJhNGwAgUG404KIr5S6PBQadDp9Nd/6ZLlwgcMoT/TpxIWloaBoMBg8HA+fPn2bt3L+fPn8dgMJCZmYmnp2eloezn54dTDesUwh7cddddrF27lpUrVxIVFcXIkSN55plnUGrwUNyeWF9rx4sX4f77zRsjqplqWJ6RwfKLF6/7d8O8vRlW1U/YnBzzBolevaq8d2lpKenp6deFclpaWnkop6eno9frKw1lf39/XFxcavxtC9GQ/PHHH8yYMYPGjRszdepUAgMD1S7Joqpq7Wh9oQsQEwO7dpl7JtSlkhJz05t9++AWA9FoNHLx4sVKQzktLQ1nZ+cqQ9mtpuuLhbBBZWVlrFu3jo8++oghQ4YQGRmJppbPbGyV7YXuzp3mdo56fY3W69ZYZiYMHWo+YaKemUwmLl++XB7IV4P46q8NBgOKotwQxNd+eXh4yF/NhM07ffo0cXFxFBcX89prrxEaGqp2SfXO9kLXZIIBA2D37rob7ebnm5udf/WVuS+vykwmE1euXKkylIuLiysNZH9/f7y8vOxm5CBsm9FoZOPGjbz33ntERkYycOBAtFU0s7J1the6AAYD9OgBRmOFvXRrpbQUrlwxnyLx6KN1U58F5OfnVxnKubm5NG3atNJQ9vX1xeHq8UVCWIELFy4we/ZsDAYD06dPp23btmqXVC9sM3TBPNIdONC8oeFmg/dq4I4cCWPH1ml5aisqKrphHvnaUL58+TLe3t6VhnLTpk1lBYawOJPJxLZt21iwYAFPPvkkw4cPx9nZWe2y6pTthi7A99/DsGHm43bc3Ws3x5ubaw7dMWMgNrZu54dtQElJCenp6ZWGckZGBh4eHlVOYTS0PwzCely+fJl58+Zx5MgRpk2bRqdOndQuqc7YduiCeaphwgTYs+fPhuSVzWWaTOb525ISaNrUvDysc4Xfu90zGo1kZGRcF8TXfqWlpdGoUaPrQjggIAA/P7/yXzeqQTc4SzKZTPLw0cZ8++23zJkzh27dujFq1CgaN26sdkm3zPZDF8xhunOn+cid3bvNUw5FRX92JCsrM2+qMJmgWTN46SV4+ulbXhpmz4xGI5cvX640lA0GA46OjlWGsl6vt3gILlu2jBYtWvD444+jKAplZWUyt23lcnNzWbRoEbt27eLVV1/lwQcfVLukW9IwQvda6enmbmQ//wznz5sD18sL7rgD2raFkBC7m0pQg8lkIicnp8pQLi0trTKUPT096yyUTSYTW7duZeTIkYSEhLB9+3bWrl3L/Pnz0Wq1tGrVig8//FA2rVixH3/8kbi4OO644w7+8Y9/0MQKVhrdjIYXusJm5ObmVhrIBoOBvLy88hCuKJR9fHxqvCzut99+Y8KECXTv3p0zZ84wefJkOnfuzJEjR8jKymLhwoWEhoYSGxt73fuKi4tZsGABycnJtG3blsWLF+Pp6Vkf/3OIGigsLGTp0qV89tlnjB8/np49e9rclFFVoWt9vRdEg9K4cWNat25N69atK7xeUFBwXQ8Mg8HArl27yn+dlZWFj4/PdaHcuXNn7r777uumDA4dOsSKFSsYOHAgeXl5pKenU1paSkhICGVlZQQGBuLk5MS5c+cA89TJ1TD/z3/+w7Zt29iwYQMfffQRb7zxBvPnz5f5YZU4OzszZswYevTowYwZM9i6dSuvvvoqvr6+apdWJyR0hapcXFwICQkhJCSkwuvFxcVcuHDhulDOzMy87jX5+fls3bqVRx99lOeee46ZM2fSqlUrAgMDeeCBB8o3kkRERDBnzpzr3nv06FH27NnDiy++SHBwMF27dmX27Nn19v2KmmvXrh1r165l1apVREdH8/LLL/Pss8/a/IYgCV1h1ZycnAgKCiIoKKjS15w+fZqkpCTKysrYtGkTBw8eJDw8nJkzZ+Lg4EBBQQGff/45mzZtIjU1lVatWpW/NzU1ldLSUu68807AHPJhYWGcOXOmys8UlqHVahk2bBiPPvooM2bMYNu2bUydOtWm/7+x7R8ZQgC33XYbmzdvZvHixbRp04bi4mJSU1NZtmwZ9957LwC9evUiIyOD/fv3A+Y1zAAXL17ExcWlvPlQZmbmDY2IpCm3+lq2bMmqVat46KGHGDhwIGvWrKGsrEztsm6KjHSFzVMUhWbNmtGsWTPatGnD9u3bWbZsGf379yc1NRWAn3/+maysrPJpjKt9lt3c3CgtLS0P1hMnTtCkSRP0en35/QsKCli1ahXHjx+vsGNckyZNZO7XAjQaDX379uXhhx8mLi6OL7/8ktdee+26v7nYAlm9IBoMk8lEeno6mzdvJioqCoPBwJAhQ8jKykKr1TJp0iT69OlDSkoKaWlp3HPPPRQWFvLoo4+yfv16goKC6NixI7Nnz+bxxx+/7r5nz57l5MmT17XxvPrrwsLC64L4r6Hs7e1t8/OQ1sZkMrFp0yaWLFnCCy+8wKBBg6xqS7ssGRN2raSkhIsXL+Lv7w/ATz/9xN69exk0aBAODg7Mnz+fjz76CBcXFx544AHmzp1bqz/A+fn5N5xCcu2W65ycHDkaqp6kp6czZ84czp49y7Rp08rn5tUmoStENc6ePcu5c+e48847cb3VrnZ/UVxcXGUoy9FQt8ZkMvHll1/y1ltv8cQTTzBixIjab4DJzDTveN2/Hw4dMjfJcnCAwEC4917o2BG6dKnxwbkSukJYsWuPhqqoOdFfj4aq6Et22UFWVhbz58/n8OHDTJ06lS5dulT/pmPH4N13YetWcwuBsjJwdv4zXIuLzU2zHB3B0xNefBH69TP35q6ChK4QNuzao6EqCuW/Hg1V0Zc9HQ313XffMXv2bO6//35Gjx5d8fdeUgLLlsHixeag1evNI9uqFBSYux02b25upHXXXZW+VEJXiAZMjoa6UV5eHosXL2bnzp1MmjSJhx9++NqLMGQI/PgjNG4MtT3BIifH/M8334Rnn63wJRK6Qtgxez4a6sCBA8ycOZPbb7+dCRMm4NmokfkosH37zEeB3ewPmuJic3gvWgR/+9sNlyV0hRBVupmjoa5tTmTNR0MVFRWxbNkytmzZwuKAAG7buRPlVgL3zxub53u3bTNPOVxDQlcIcUv+ejTUX78qOhrq2lC2hqOhTmzciOuAAZQ6O+MXEFA3B2NmZcHdd8O//nXdygbpMiaEuCU6nY4WLVrQokWLCq//9Wgog8HAgQMHqjwa6tpQtsTRUC3/9S+MTZtyqbSUk6dO4ePjY95NeCs3dXeHw4fNx4p161ajt0joCiFumVarJTAwkMDAwAqvV3Q01JEjR9ixY4dljoZKSYG9e9Ho9fhoNOjd3Dj/v40r/v7+6K4ZheeUlTHDYGBPbi4ejo6M9PHhCXf3iu97dYpixQoJXSGE9dBoNDRt2pSmTZvSoUOHG64bjUYyMzOvm7I4efLkdb2Vb+loqG3bwGgsnwLQ6XQEBweTmZlJSkoKXl5eeHl5oQBz0tLQKgpfhIVxrLCQ0WfOEObsTGhla3P1evjuO/OGihoszZPQFUKoTqPR4O3tjbe3d4VbeU0mE9nZ2deF8vnz59m/f3+1R0MFBATQ6ptv0Dk6XjeVoABenp64ubmVb9du0rQpX125QnJoKK4aDe1dXXnYzY1Ps7P5e2VN1DUa8+aJ33+He+6p9nuV0BVCWD1FUfDw8MDDw4M2bdpU+JqKjob65ZdfSEtLY+qnn6KUlqLodGi1WrRaLU7/+6dWqyXA35/cvDz2nD6NsaSEZtc8ZGut03EgP7/qAktK4OhRCV0hhP2o8mio227D6OJCSVkZJSUl5V9XcnMpLSmhuKSEsrIyigDH0lKOHj3K7bffjgI01mjIMxqr/vCyMsjOrlGdErpCiIZPUdAoCjqdrryX8l8ZTSZKc3MxnjmDv59f+VREntFIo+o2htSi0b3tbTERQoja8vQ0b2SogkZRaNWoEWg05FzTae5YUVHlD9GucnICH58alSKhK4Ro+O6+29ysphouGg2PuLmxNCODAqORw/n5/PfKFZ6qbMnYVQ4OcPvtNSpFQlcI0fA98IB5yVgNvOLnR5HRSI9jx5h87hyv+vlVPdItKzPfOyysRveXOV0hRMP3xBMwY4Y5IKvpEaF3cGB+bU4bzskxdxur4Y46GekKIRo+Hx94/PE/2zLWFaPRvCstJqbGb5HQFULYh4kTzb1zi4vr7p45OdCrV5UNzf9KQlcIYR+aN4cpU8x9cGs4v1ulvDzztt9//rNWb5PQFULYj7594fnnzS0ZbyV48/LM0worV5qXo9WChK4Qwn5oNDB3LkRFmXeQFRTU7v0mE1y+bJ6mWLsWKmjeU50qm5gripIBpNb6rkIIYd9amEymCndLVBm6Qggh6pZMLwghhAVJ6AohhAVJ6AohhAVJ6AohhAVJ6AohhAX9f51WJasunAACAAAAAElFTkSuQmCC\n" }, - "metadata": {}, - "output_type": "display_data" + "metadata": {} } ], "source": [ @@ -2970,480 +565,20 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "order = (0, 1, 2) Distance = 202.0\n", - "Best order from brute force = (0, 1, 2) with total distance = 202.0\n" + "order = (0, 1, 2) Distance = 202.0\nBest order from brute force = (0, 1, 2) with total distance = 202.0\n" ] }, { + "output_type": "display_data", "data": { - "image/png": "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\n", - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2021-03-11T18:37:29.331913\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.3.2, https://matplotlib.org/\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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/svg+xml": "\n\n\n \n \n \n \n 2021-06-13T22:29:05.950035\n image/svg+xml\n \n \n Matplotlib v3.4.2, https://matplotlib.org/\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 \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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAADnCAYAAAC9roUQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAjM0lEQVR4nO3deXxU1d0G8OdOFkggCQQCCRggEREQFBQQUdQCotTia6mCYFlUCiqyWAoqInUBN0SFigIisogIilpwqwuvhb6IAi6gyCLImoSwSAIEMknmvn88HQMxmWwzc+feeb6fz3wCCUwOxjw58zvn/I5hmiZERCQ4XFYPQEQknCh0RUSCSKErIhJECl0RkSBS6IqIBFGkrw/Wr1/fbNasWZCGIiLiDBs3bjxsmmZSaR/zGbrNmjXDhg0bAjMqERGHMgxjT1kfU3lBRCSIFLoiIkGk0BURCSKFrohIEPlcSAuKwkJg1y5g61YgKwsoKADi4oDmzYGWLYHERKtHKCLiN9aF7t69wOLFfBQUAKYJuN18GxEBREczkNu0AYYPB7p35/tERGws+KGbnw9Mnw68/DLg8QC1anFmWxrTBH78ERg1CmjcGJgxA7jwwuCOV0TEj4Jb092/H+jVC5g9m2Fbt67v2athMJATEoCMDKBPH+DFFxnGIiI2FLyZ7oEDDM1ffmHYVlZ8PMsN06YBp04BY8f6f4wiIgEWnJmu2w0MGsTATUio+vNERjJ8X3wRWLHCf+MTEQmS4ITu9OnA7t3VC1yviAggJgZ48EEgO7v6zyciEkSBD919+7hoVtZiWVXUrAnk5QFPP+2/5xQRCYLAh+6SJUBREUsD/hQfD6xcyZKFiIhNBDZ0PR5g0SLuVPDB7fHg0YwM/OGnn3Dltm0YsGsX1p444fu5IyIY5h984McBi4gEVmBDd/du7sst51BDEYDkqCjMadIEn7dogbuSknD/gQPIcLt9P79hAGvW+G24IiKBFtgtY1u3MhjLEeNyYVhScb/frnFxaBQVha2nT6ORr8CuWRP49ls/DFREJDgCO9M9eJDbxSrpaGEh9rrdSK9Rw/cfjIoCDh2q4uBERIIvsKFbVFTp02OFpomJGRn4Q0ICmpUXuobBzyEiYhOBDd1atbjgVUEe08SkjAxEAhifnFz+XygqAmJjqz4+EZEgC2xN97zzWAKoANM08VhmJo4UFmJGaioiK1ALRn4+2z+KiNhEYEO3ZUv2SzDNchfUnsjKws9uN15s0gQ1XBWcgJ8+DVx6qR8GKiISHIEN3dq1gU6dgPXrfR4BziwowNvHjiHaMHDtjh2/vn9CcjJ6lfX3TJMHLq691t+jFhEJmMB3GRs6lKHrY7abEhWFDa1aVe558/KAJk2Adu2qP0YRkSAJ/DHgq64C0tOB3Fz/PafHg+NH3Tg6dHyF9gGLiISKwIduRAS7jAG8lscfcnKQ2bYn+s7tiTff5GljERE7CE5rx5YtgYkTgRMnuLBWHTk5QEoKWiybgpfnGvjwQ16htmePf4YqIhJIwbuuZ/BgYNw44Phx3vxQWR4PO4olJwPLlgGJiUhLA+bOBXr0AG6/HZg/X2clRCS0BfeOtDvv5P1oUVEM0IrMek2TM+TcXOC664B//hNo1OjXD7tcQL9+bGa2fj2zffv2AP4bRESqIbihC3BaumoVMGAADzfk5ADHjnHPbVERZ7SFhQzaI0cYtk2bMqxnzgQSE0t92kaNgBdeYACPGMEbfarQ9kFEJKAM00dvhA4dOpgbNmwI3Gc/fhz4+GO2Z/z6azbI8XiAmBh4WrSE67JLgWuuAdq2rdQuhSNHgKeeAnbtAiZN0q3tIhJchmFsNE2zQ6kfszR0y7BzJ9CxI/Ddd0BqatWfZ9Uq3ujTvTtnv2rTICLB4Ct0g19eqIA1a1hdGDasepsdunXjmtvJk8AttwDr1vlvjCIiVRGSofvuu5yVbt7MOm11xMcDDz8MPPAAMGUK8Mgj/j2nISJSGSEXukePAt9/z1vWPR7gmWeAb76p/vNedhmwdCmft29flh5ERIIt5EJ348bikkKtWsCf/lTuFWsVFhsLjB8PPPkkN0KMH89FNxGRYAm50L36amDtWmD5ci6ATZ8OXHCBfz9Hu3a8Gb5ZM9Z6V66s9AUXIiJVEnKhGxXFPbfNm3PLV6BERwN3380Z7xtvACNHAhkZgft8IiJACIauV1ISz0sEetGrRQtgwQKgQwdg4EDWfdVAR0QCJWRD1zDYEfLnnwP/uSIjgSFDgHnzgE8+YQvgYHxeEQk/IRu6AJCWFtgSQ0lNmwJz5rDFw9ChDOHqNkUTETlTyIdusGecLhe3lL32GreqDRoEbN0a3DGIiHOFdOimpwd3pnumlBRgxgzg1luBUaN4SCM/35qxiIhzhHzoWllbNQzg+uu5u2H/fqB/f/8c1BCR8BXSoZuczM6PJ09aO47ERB6oGDkSmDCBHczy8qwdk4jYU0iHrsvFxa3du60eCf3ud9xSlp/Puu/atVaPSETsJqRDF7C2rlua+Hj26J00ibPfSZM4GxcRqYiQD10rdjBURKdOrPUmJHDW++mnOkosIuUL+dC1ejHNl9hYYOxYYOpU3iY0bhxw+LDVoxKRUGaL0A2l8kJpLrwQWLyY/SL69wdWrNCsV0RKF/Kh27gxcOgQ+zCEsuhoXnY8cybw5pu8HujAAatHJSKhJuRDNyKC96Tt2WP1SCqmRQtg/nygc2eeZnv9dTXQEZFiIR+6gD1KDGeKiGDgvvoq8PnnwB132Gv8IhI4tgjdUN3BUJ4mTYBZs4A//IGXbM6dCxQUWD0qEbGSLUI3lHcwlMfl4pVDixcDmzZxBrxli9WjEhGr2CJ0g93iMRAaNuTVQ4MGAWPGsJlOqC8Oioj/2SJ0U1OBzEz7vzQ3DKBXLx6qyMri9rKvv7Z6VCISTLYI3ehotlrct8/qkfhHYiLw+OPAvfcCEycCTzxhfVMfEQkOW4QuYL8dDBVx5ZXFd7L17Qv85z9Wj0hEAi3S6gFUlBPquqWJiwMefBBYvx6YPBn41794tLhOHatHJiKBYJuZrl23jVVUx46s9SYmctb78cc6SiziRLYJXSeWF0qKiWGd99lnuad37FggO9vqUYmIP9kmdJs25UJaUZHVIwm8Nm14MWbLlsCAAcA772jWK+IUtgndmjWBpKTwaSITHc1TbLNmMXTvuov3tImIvdkmdIHwKDGU1Lw5G+hccQUweDBPtqmBjoh92Sp0nbqDoTwuF/DnPzN8V68GbrsN2LnT6lGJSFXYLnRD5ZJKK6SmAi+9BPzP/wDDhwNz5tj/lJ5IuLFV6IZjeaEklwvo04d9en/8kTPgH36welQiUlG2Cl3vTFc1TaBBA24tu+MObjN77jk10BGxA1uFbmwsr0DPyrJ6JKHBMICePYFly4AjR4B+/YANG6welYj4YqvQBVRiKE2dOjxC/Le/AZMmAVOmACdOWD0qESmNLUPXyceBq6NrV856DYNHiVevtnpEIlKS7ULX6T0Yqqt2bWDCBOCxx1jznTABOHrU6lGJiJftQlflhYq55BI20GnYELjlFuDDD3WUWCQU2C50vTNdBUj5atYERo8Gnn8eWLCAuxwOHrR6VCLhzXahGx8P1KgBHDpk9Ujso3VrYNEiNtK59VZg+XJtuxOxiu1CF9BiWlVERQFDh/IU28qVwJ13Anv3Wj0qkfBj29BVXbdq0tOBefOAq69mD4eFC8OjXaZIqLBl6A4eDFx/vdWjsC+Xi316Fy4E1q0DhgwBtm+3elQi4cGWoduwIWu7Uj2NGwMzZwI33QTcfTeb6bjdVo9KxNlsGbriP4bBrmVLlgA//cSFtk2brB6ViHMpdAUAb+V45hneVjFuHDBtGnDqlNWjEnEeha78yjCAa67hUeKcHDbQ+eorq0cl4iyRVg+guk6eBA4f5t7d/HxeYCnVk5AAPPoosHYt33bqxIMVcXFWj0zE/mw7033vPW55uuACNvK+8kpe3rh0qTps+UuXLvzvWaMGG+h8/rnVIxKxP1vOdDduBN59F2jbFujcGfjiC2D2bF5n068fDwL06WP1KJ2hVi3gvvtYdpg8GfjoI2D8eCAx0eqRidiTLWe6r77KGe5f/8q7ws4/H3j7bb787dABWLXK6hE6z8UXc4dD48ZsoPP+++p/IVIVtgzd9u2BL7/kDRJbt/KOsHr1+LErrmAgi//VqAGMHAlMn86r4EeP1i0eIpVly/JCz57Anj3Agw9yIa11a9ZzTRO48EJ215LAadWKp9kWLuS+3uHDecDCZcsf4SLBZZg+XiN26NDB3BCil2598w2wZQtf7rZvzxV3AMjL4xHX5cuBiAhrxxgOfv6ZDdNdLuChh7R7RAQADMPYaJpmh9I+Ztu5yYgRwFVXsXFLQgLwxBNs9xgby5e8O3ZYPcLwkJYGzJ3LhbbbbwfmzwcKC60elUjosm3o1qrFG3C9Pv8c+PRT/rpePYVuMLlc3DWyaBGwfj0bEm3bZvWoREKTbUO3VSvgrbf46927eTBixQrggQeA5s25o0GCq1Ej4IUXuLvhnnuAF19UAx2RkmwbugMGAMeOAb17syH32LHAxIkM35tuAlq0sHqE4ckw+DVZsoT13v79ge++s3pUIqHDtgtpAG+5/ewzNuZu104LZ6Fo1Srg6aeB7t1Zh4+NtXpEIoHnyIU0gHXdm2/mzbfewPV4dP9XKOnWjQ10Tp5k3XfdOqtHJGItW4funDn8ZgaKT0e5XHzotFToiI8HHn4YmDABmDIFeOQRIDfX6lGJWMPWoVu7NvflAqwlmmZxsxvDsG5cUrrLLmMDnZgYNtDRcW0JR7at6ZpmcbBmZgKffMK3hYVAZCQ36ffuzRKEhJ5vv+WhinPPZQOd+vWtHpGI/ziypmsYDNjXXuO+UO8VM/HxQHY28M47XMCR0NSuHXc4NG3KHQ5ffFF2Seg//+HXU8QJbDvTBXgN+6hRXBW/5BKgQYPij2VlAZdfDuzcad34pGK2b+dlo96j3F4nT3Kv77Jl3KGyfTv3Zp97rjXjFKkoXzNdWza88YqKYg+GXr2K35eby/2hS5bwwkUJfS1alD7L3bmTux1mz2ZryYceAtasUeiKvdk6dFNTgR49gOuvZzvHunW5kHb0KA9JPPSQ1SOUiipt4XPHDobxxRcDRUX82tarBxw4wJ0rnTrxay9iJ7YOXQCYOpUHJHJy+E2ZmsomONdcY/XIpLpatuTi6BtvsJVndjb3Y9eowa9z795sXn/jjVaPVKTibB+6DRpwIcZ7IEI9XZ3B7earlwULeDX8kSOs+3buzKuCDIPbztq3t3qkIpXjmIjyHooQ+1u5kq9Udu5kvbdZM6BJE9boExO5oLZwIVtJNmli9WhFKsf2M12voiLW/yId8y8KX717czH02mtZz42M5Gm2Nm348cmTWUK64godghH7cUxETZzIpio9elg9EvGHUaNYNjIMHpzwNkZfvJjd5QYP9t08x9tr2Xt3nkiocEzopqZydiTOkZTEt3l5wFNPsW/ygQPApElllxVMExgzBti/H1i7lj+MR4wI1ohFyueYKmhamkLXqWJjOfP95RfeAp2be3YZybvH9+BBYOZM3lrx6qvcw/3eewxrkVDhmNBNT+cJNXGmevV4M8icOcBzz3H7mJdhcPfKunXs6fDggzwOfuIE780redJNxEqOCd2mTYG9e7mgJs7Vvz/w8cfcKvjNNzyhBgCnTwP//jevcerale/bvBn43e/UX1lCi2NCt2ZN1gAPHLB6JBJo3ob1BQXFJaVdu4D33weGDOHvN2/mJZlJSVpMk9DimNAFWGJQXTd8dOoEDBrEX+fmsl+v95jwZ5/xfQMG8ONqai+hwlGhm5amum64Ou88lhtuuolBm53Nt+ecc3bvZRGrOWbLGMDQXb/e6lGIFZKSeOvw/Pk8tXbDDcUfMww2QDp8GGjc2LIhigBw2ExXOxhkyJDiwPWWFEyTJYfBg4G5c1kLFrGKo0I3LY17MrVaLUBxScEw+AN58WLeMDJwILBli7Vjk/DlqNCNjeWezKwsq0cioahhQ2D6dM54x4wBZszgVjORYHJU6AI6mSa+GQZvGnnjDf5w7t8f2LjR6lFJOHFc6KquKxWRmAg8/jhw7728YeTxx3mCTSTQHBe6mulKZVx5JbB0KRfb+vblzcMigeS40NVMVyorLo79Gh55hNc/TZzI5joigeC40PXOdHUCSSqrY0fWeuvVA/r1Y48H/X8k/ua40I2P58WFhw5ZPRKxo5gY1nmffZZ7eseOPbujmUh1OS50AfVgkOpr04b7elu25HHit9/W/m/xD8eGruq6Ul1RUcCwYcCsWcC77wJ33QXs22f1qMTuHBm62sEg/tS8OXs6dO3KY8avvaZZr1SdQlekAlwu4M9/ZviuWcPw3bnT6lGJHTkydNPT+Q2hlWfxt9RU4KWXgD/+ERg+nNcHqYGOVIYjQ7duXb7VXksJBJeLofv668DWrcCttwI//GD1qMQuHBm63q5SKjFIIDVoAEybBgwdym1mzz0HnDpl9agk1DkydAHtYJDgMAygZ09g2TLgyBHgllvUSF98c9TNEWdq1kwzXQmeOnWAyZO5yPb3vwNdugCjR/OIsciZHD3TVehKsHXtylmvy8WjxKtXWz0iCTWODl2VF8QKtWsDEyYAjz3GOu+ECcDRo1aPSkKFY0M3KYmLGrm5Vo9EwtUllwBLlgDJyaz1fvihtjGKg0NXOxgkFNSsCYwaBTz/PLBgAa8JOnjQ6lGJlRwbuoBOpknoaN0aWLQIaNuWDXTeektHicOV40NXdV0JFVFR3NP78svAe+8Bd94J7N1r9agk2BwduiovSChKTwfmzQOuvhq47TZg4UKgqMjqUUmwOD50NdOVUORyscywcCGwbh0b6GzfbvWoJBgcHbrJyUBODpCXZ/VIRErXuDEwcyZw883AiBFspuN2Wz0qCSRHh67LBTRtCuzebfVIRMpmGMANN7CBzk8/sYHOpk1Wj0oCxdGhC6jEIPaRlAQ88wxbRo4bx2Y6epXmPI4PXe1gEDsxDKBHDx4lzsnhoYovv7R6VOJPjg9d7WAQO0pIAB59FLj/fh4nfvRRna50irAIXc10xa66dOGst2ZNNtD53/+1ekRSXY4P3caNgUOHgPx8q0ciUjWxscD48cDjjwP/+Adnv2qgY1+OD92ICN5rtWeP1SMRqZ727dlA55xzWOt9/3010LEjx4cuoBKDOEeNGsA99wDTpwOLF7OZTmam1aOSygiL0NUOBnGaVq14mq19e14Nv2yZGujYRViErnYwiBNFRgK33w688grw0UfAsGEqo9lBWISuWjyKkzVrBsydC1xzDUN4/nygsNDqUUlZHHsx5a+ys9Hk+w3o/tV38PT/Hq78UyyMtWzJ12YdOgCNGlk9SpFq8d7J1rUrMGUK8MknwKRJwPnnWz0yKckwfSx/dujQwdywYUMQh+NH334LzJoFfPYZ4HIh/4QbNeJq8MiPaXIPWVQUf92lC3DXXUDnzlaPWqTaTJP9emfMAG68EfjLX4DoaKtHFV4Mw9hommaHUj/muNDNywOeeopLuwAQH89pQFk8nuKjPjfcwPuzExICP06RADtyhN8KO3dy1nvRRVaPKHyET+hmZQH9+7Mdf3w8N+lWlDd869fnZsi0tMCNUySIVq0Cnn4a6NaN281iY60ekfP5Cl3nLKQdOsSmpPv3A3XrVi5wAc6G69ThUZ+bbwb27QvIMEWCrVs3bik7dYp13y++sHpE4c0ZoevxAKNHAxkZ1S8NxMcDx47xAistAYtDxMezcvbggzxO/PDDaqBjFWeE7ltvsf9dnTr+eb6EBGDrVu7DEXGQzp2BpUuBWrWAvn1ZepDgsn9N1+0GOnXizX41avjveQsK+NxffQXExfnveUVCxHffsWXkueeyoU79+laPyDmcXdP99FPuWCgncJcdPYqBP/+My7ZuxcMZGeU/b1QUg3fFCj8NVCS0XHQR14ybNeP684oVaqATDPYP3ddfr9Afqx8ZiTvq18cNlan5RkUVbz0TcaDoaODuu3k55tKl3N1QkTmJVJ29Q9c0eQgiJqbcP9otPh5Xx8UhoTK7GmJieC+2rmcVh2vRgg10OnUCBg4E3nhDDXQCxd6he/AgcPo0Z6SB4HKxq4halEkYiIgABg8G5s1j1W7oUPUsCQR7h+6xYwzFQDIMfp7/Mk1ej52VFdhPK2KVpk2BOXOAXr0YvPPmafekP9k7dA0jaJ9n1y42ju7SBbjuOuCDD4LzqUWs4HLxjNDixazgDRwI/Pij1aNyBnt3GatTJ/A/gk0T46ck4IVPWcWIiWHWZ2cD27YBKSncURas/BcJpuRkTjY+/JDnj3r3Zt9ef+7ODDf2Dt0GDZiCBQXl1nWLTBNFpgkPAA8At8eDCMNAhK+09HiAwkKMnp6OvQ8Aq1dzBuB2A99/z32OGRksOaSk8NGoEf9HbdSo+H116yqUxb4MA/j973mwYupUbi+bOBG4+GKrR2ZP9j8cMWgQsG4dzzn6MOfQIcw5fPis9w2rXx/DkpLK/ksnT7LxzQcfwDTZo3T8eJZ4v/qKmQ8Ax4/znirvIyODNV/vr0+fPjuIS4Zy/fq+G6GJhJLPP2f3squv5hazWrWsHlHocXaXsY8+4u185YRuleTk8MhO//6/vuvoUW4iHzSo4kGZl1ccwqWFcm4uA7ysUG7QIPDrhSKVkZvLssOXXwIPPABcfrnVIwotzg5d7zHgwkKgZk3/Pa/3GPD69UDt2v573lK43aWHckYGf3/0KJCYWHYoJyerSbVY46uvgMmTgXbtgL/+1X/tT+zO2aELsOHNfffxK+6P4qlpsoZw331cNbBYYSEX7soK5exsTvTLCuWUlAqdHxGpklOngJdeAv71L+BvfwN69NAahvND1zT5en/tWq5aVdcvvwCtWwPvvlv5vrwW8HiAw4eLAzkz8+xQzsrii4CSQXzmQz19pLo2bwYeewxITQXuvx/wtVzidM4PXYB3k/TpU/2eujk5DO533gEaN/bf+Cxkmvw5UlYoZ2ayPl1WIKek+O9FhDib283DFMuXc5HthhvC8/+b8AhdgK+zBwzg2cWqXNeTkwM0bMiD502aBG6cIcY0i3dglBXKbvdvg9i7PS4lBahXz/odGKYZnt/goWjHDq5B167N7WUOmb9UWPiELsAC09SpwKJFDNLywvfMiyn/9Ce21g/ETgiby8vzHconTvDnVVmh3KBBcCo1s2fzGOu11zKAi4psUSFypKIinmhbsAC44w7gllus/8EcLOEVul6bN/MA+UcfFZ9oiI4uvoLd7eaBCo+HGw6HDwc6drR61LaVn//bID7z8csv3I9cVig3bFi9HRimyS/1Pfdwa/WnnwKvvQZMm8Yvc/PmwCuvaEHRCnv3coeD281bidPTrR5R4IVn6HodOQJs3MguNd9/z5lwdDQXyi66CLjkEn7HS0AVFLApXGmBnJnJe0Xr1Ck7lFNSfO8I/PFHYNw4/vzctw+YMAHo0AHYsoUbUZ5/nt/sI0ac/ffcbuDZZ3lxY+vWwIwZ3J4n/uXxcF36xRd5OeaQIYFrDhgKfIWu87fc16sH9OzJh1gmKgo45xw+SlNUxOA9M4i3bOGMNSuLj1q1eKliyRck337L6+yGDOEhwuxsbrNLS+PzNm7Mn7MHDvDPezzFL3P/+U9udXr7bb4MnjKFs2PVh/3L5eI69xVX8Gs4cCBnva1bWz2y4HN+6IotRERwVpucDLRv/9uPezw8JFLyyGleHssK3bsDf/wjtyw1b86g7dKleJGvXz/gySfP/rvbtvEE+V/+witrLr8ceOKJgP0TBaztP/ccf9CNGQNcfz0re/481xTqwqSsLXbncrEmXLImu3cvr5n5+9/ZgPvNNznTfewxBvmpU8DLL3Ohb8+es//unj2cEbdty9+73bxBYd8+zXIDyTDYHnXpUpac+vdnBTBcKHTF1s4/H1i5krXYVq0YnHv2cBfDpZfyz/TqxdKF9xu7oIBvDx9miHsPhhw9+ttDIgUFvLHp4EFdX+Nvdeuy1HDvvcBDD/HXJ05YParAU3lBbM0wimvFrVqxBjx7NmuG3pnt5s1cTEtL4++9vWDj4jjT9a4l79zJICi5Y3DWLC7UHTvGU1beRb6SR64bNlRjoqq48kq2iZwxA+jblw10una1elSB4/zdCxIWTJNlhZUr+XI1M5N7Q48d4yLeffcBN90E7N7NRbmOHdlys3t3tu5ITeU3/hNPcI9vadzu3+7AOLMPxuHD3PlQVignJ6v5d3k2bOD2sgsuYB+HSp/qz8sD/u//2Ox6/Xq+fDEM/rTs1ImdeS67LOAdosJ7y5iEtYIChmFKCn+/aRM7Y912G2u+06Zx10JMDBfennqq6t+PRUVnNyYqGcrZ2TyhVVYop6QAsbH++7fb1enTfHXxwQfA2LHceJSXx2vix4wp4+uTnc19+UuW8OWL282fcN6TMd73RUfziz14MHD77dVrGeCDQlfEh/37uZ2sbdvAhp7Hw23jZYVyZiZzwlcoh9PVUD/8wKPEjRoxOxctYt33jjvO+EOmyX1/EycymePiyt8A7HZzb2GdOtykfdVVfh+7QlfEBrwdRc8M5JJHrr1XQ5XVMc5pV0MVFACPPMJsrF+fWwZXr/5vBzOPh8f2ly3j7LWy+87y8niUcuRIXgDnx/9w4X04QsQmDIOhWbdu2YcGzrwayhvEmzcX/7rk1VAlH3a7Gso0gTVrOCk9cYI/lCZMAF6eY3J2u3QpP1iVf1RsLMsN//gHp9IjR/p59KVT6IrYSFwcHy1alP7xM6+G8gbxjh3Fvy55NVTJR8OGodUg6PRp4MILmY+ZmSwDLV4MTLxwBZpWJ3C9IiP5H3T6dC60efcZBpDKCyJh5MyroUorXxw58tvGRGc+rL4aqqAAOLg5G40Hd4dhmv47ynbiBAP8s8/8ctOmygsiAoCB2aRJ2e2iz7wayhvEmzbxqLX3aqiEBN8N7wPZyS0qCjjnX69wIcyfnYlq1+YJmuXLeQtNAGmmKyIVVt7VUJmZLAX4CuVqXQ116hQ3WUdElLtLIbeoCI9mZmLdiROoExmJe5KScJ2vLWKnTnG2u2ZNtQvfmumKiF+4XKwJN2jAzqgllXY11J49bCzk62qoM9t4+rwa6osvWGOoQFnhyawsRBkGPm7RAttPn8boffvQomZNpJd1QqVmTc52f/ihuCFHACh0RcRvDIOv+hMTeaqspNKuhsrMZHvOilwNde7a71DL7S53HKc8Hqw6fhzL0tMR63KhXWwsroqLw/s5ORjZoEHZg/d4eOZboSsiTmAY7G0RH89mRaUpeTVUZiawdSvfDvlkA66IiUZ5/c/3ut2IANDkjFW/82rUwNd5eb7/omkCX3/NJhABotAVkZASGwucey4fv9HrKLC3/NjK83hQq0RdtrbLhZPltYqLiGDROoBstE1aRKRiYksJ2JOlBHGpAnx6RKErIvbRsGFxQ2QfmkRHowgsM3htz88vexHNq7CQxeMAUuiKiH106sRgLEeMy4VucXGYdegQTnk8+C4vD/8+fhzXl9dVLDKy9Pui/EihKyL2cdFFFb5G+P7kZOR7PLhm+3ZMOHAADyQn+57pmiYfpW278CMtpImIfVx6KY/p5ueX2xE+PiIC01JTK/7cJ08C6enAeedVc5C+aaYrIvYRGcmGuuVt/aos02TZYvjwgPfGVOiKiL0MGgTUq8eZqb/k5gLNmwO9e/vvOcug0BURe4mLA55/nrsYKrCoVi63m7Pb6dMrXC+uDoWuiNhPly68uTI3t3rB63azVPH002UfkfMzLaSJiD0NH86DDFOn8m1l2peZJgPbMIBnngFuvDFgwyxJM10RsSfDAIYN45U9SUm8yycvj4FaFtNkw/KcHNZw33svqIELaKYrInZ38cXAJ58A77wDzJ5dfINnURF3OwAsQURG8v3NmwN33gn8/vdBqeGWpNAVEfuLiQEGDAD69we2bQO2bAG++Yb9cV0uHu1t1w5o0wZIS7P0ymSFrog4h2EALVvy0aeP1aMplWq6IiJBpNAVEQkiha6ISBApdEVEgkihKyISRIbpYyOxYRiHAOwJ3nBERByhqWmaSaV9wGfoioiIf6m8ICISRApdEZEgUuiKiASRQldEJIgUuiIiQfT/GKKWbqpXhY0AAAAASUVORK5CYII=\n" }, - "metadata": {}, - "output_type": "display_data" + "metadata": {} } ], "source": [ @@ -3497,50 +632,16 @@ "metadata": {}, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "// This file has been generated by DOcplex\n", - "// model name is: TSP\n", - "// single vars section\n", - "dvar bool x_0_0;\n", - "dvar bool x_0_1;\n", - "dvar bool x_0_2;\n", - "dvar bool x_1_0;\n", - "dvar bool x_1_1;\n", - "dvar bool x_1_2;\n", - "dvar bool x_2_0;\n", - "dvar bool x_2_1;\n", - "dvar bool x_2_2;\n", - "\n", - "minimize\n", - " [ 48 x_0_0*x_1_1 + 48 x_0_0*x_1_2 + 91 x_0_0*x_2_1 + 91 x_0_0*x_2_2\n", - " + 48 x_0_1*x_1_0 + 48 x_0_1*x_1_2 + 91 x_0_1*x_2_0 + 91 x_0_1*x_2_2\n", - " + 48 x_0_2*x_1_0 + 48 x_0_2*x_1_1 + 91 x_0_2*x_2_0 + 91 x_0_2*x_2_1\n", - " + 63 x_1_0*x_2_1 + 63 x_1_0*x_2_2 + 63 x_1_1*x_2_0 + 63 x_1_1*x_2_2\n", - " + 63 x_1_2*x_2_0 + 63 x_1_2*x_2_1 ];\n", - " \n", - "subject to {\n", - " c0:\n", - " x_0_0 + x_0_1 + x_0_2 == 1;\n", - " c1:\n", - " x_1_0 + x_1_1 + x_1_2 == 1;\n", - " c2:\n", - " x_2_0 + x_2_1 + x_2_2 == 1;\n", - " c3:\n", - " x_0_0 + x_1_0 + x_2_0 == 1;\n", - " c4:\n", - " x_0_1 + x_1_1 + x_2_1 == 1;\n", - " c5:\n", - " x_0_2 + x_1_2 + x_2_2 == 1;\n", - "\n", - "}\n" + "\\ This file has been generated by DOcplex\n\\ ENCODING=ISO-8859-1\n\\Problem name: TSP\n\nMinimize\n obj: [ 96 x_0_0*x_1_1 + 96 x_0_0*x_1_2 + 182 x_0_0*x_2_1 + 182 x_0_0*x_2_2\n + 96 x_0_1*x_1_0 + 96 x_0_1*x_1_2 + 182 x_0_1*x_2_0 + 182 x_0_1*x_2_2\n + 96 x_0_2*x_1_0 + 96 x_0_2*x_1_1 + 182 x_0_2*x_2_0 + 182 x_0_2*x_2_1\n + 126 x_1_0*x_2_1 + 126 x_1_0*x_2_2 + 126 x_1_1*x_2_0 + 126 x_1_1*x_2_2\n + 126 x_1_2*x_2_0 + 126 x_1_2*x_2_1 ]/2\nSubject To\n c0: x_0_0 + x_0_1 + x_0_2 = 1\n c1: x_1_0 + x_1_1 + x_1_2 = 1\n c2: x_2_0 + x_2_1 + x_2_2 = 1\n c3: x_0_0 + x_1_0 + x_2_0 = 1\n c4: x_0_1 + x_1_1 + x_2_1 = 1\n c5: x_0_2 + x_1_2 + x_2_2 = 1\n\nBounds\n 0 <= x_0_0 <= 1\n 0 <= x_0_1 <= 1\n 0 <= x_0_2 <= 1\n 0 <= x_1_0 <= 1\n 0 <= x_1_1 <= 1\n 0 <= x_1_2 <= 1\n 0 <= x_2_0 <= 1\n 0 <= x_2_1 <= 1\n 0 <= x_2_2 <= 1\n\nBinaries\n x_0_0 x_0_1 x_0_2 x_1_0 x_1_1 x_1_2 x_2_0 x_2_1 x_2_2\nEnd\n\n" ] } ], "source": [ "qp = tsp.to_quadratic_program()\n", - "qp.to_docplex().prettyprint()" + "print(qp.export_as_lp_string())" ] }, { @@ -3552,56 +653,10 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "Offset: 7581.0\n", - "Ising Hamiltonian:\n", - "-1290.0 * ZIIIIIIII\n", - "- 1290.0 * IZIIIIIII\n", - "+ 606.5 * ZZIIIIIII\n", - "- 1290.0 * IIZIIIIII\n", - "+ 606.5 * ZIZIIIIII\n", - "+ 606.5 * IZZIIIIII\n", - "- 1268.5 * IIIZIIIII\n", - "+ 606.5 * ZIIZIIIII\n", - "+ 15.75 * IZIZIIIII\n", - "+ 15.75 * IIZZIIIII\n", - "- 1268.5 * IIIIZIIII\n", - "+ 15.75 * ZIIIZIIII\n", - "+ 606.5 * IZIIZIIII\n", - "+ 15.75 * IIZIZIIII\n", - "+ 606.5 * IIIZZIIII\n", - "- 1268.5 * IIIIIZIII\n", - "+ 15.75 * ZIIIIZIII\n", - "+ 15.75 * IZIIIZIII\n", - "+ 606.5 * IIZIIZIII\n", - "+ 606.5 * IIIZIZIII\n", - "+ 606.5 * IIIIZZIII\n", - "- 1282.5 * IIIIIIZII\n", - "+ 606.5 * ZIIIIIZII\n", - "+ 22.75 * IZIIIIZII\n", - "+ 22.75 * IIZIIIZII\n", - "+ 606.5 * IIIZIIZII\n", - "+ 12.0 * IIIIZIZII\n", - "+ 12.0 * IIIIIZZII\n", - "- 1282.5 * IIIIIIIZI\n", - "+ 22.75 * ZIIIIIIZI\n", - "+ 606.5 * IZIIIIIZI\n", - "+ 22.75 * IIZIIIIZI\n", - "+ 12.0 * IIIZIIIZI\n", - "+ 606.5 * IIIIZIIZI\n", - "+ 12.0 * IIIIIZIZI\n", - "+ 606.5 * IIIIIIZZI\n", - "- 1282.5 * IIIIIIIIZ\n", - "+ 22.75 * ZIIIIIIIZ\n", - "+ 22.75 * IZIIIIIIZ\n", - "+ 606.5 * IIZIIIIIZ\n", - "+ 12.0 * IIIZIIIIZ\n", - "+ 12.0 * IIIIZIIIZ\n", - "+ 606.5 * IIIIIZIIZ\n", - "+ 606.5 * IIIIIIZIZ\n", - "+ 606.5 * IIIIIIIZZ\n" + "Offset: 7581.0\nIsing Hamiltonian:\n-1290.0 * ZIIIIIIII\n- 1290.0 * IZIIIIIII\n+ 606.5 * ZZIIIIIII\n- 1290.0 * IIZIIIIII\n+ 606.5 * ZIZIIIIII\n+ 606.5 * IZZIIIIII\n- 1268.5 * IIIZIIIII\n+ 606.5 * ZIIZIIIII\n+ 15.75 * IZIZIIIII\n+ 15.75 * IIZZIIIII\n- 1268.5 * IIIIZIIII\n+ 15.75 * ZIIIZIIII\n+ 606.5 * IZIIZIIII\n+ 15.75 * IIZIZIIII\n+ 606.5 * IIIZZIIII\n- 1268.5 * IIIIIZIII\n+ 15.75 * ZIIIIZIII\n+ 15.75 * IZIIIZIII\n+ 606.5 * IIZIIZIII\n+ 606.5 * IIIZIZIII\n+ 606.5 * IIIIZZIII\n- 1282.5 * IIIIIIZII\n+ 606.5 * ZIIIIIZII\n+ 22.75 * IZIIIIZII\n+ 22.75 * IIZIIIZII\n+ 606.5 * IIIZIIZII\n+ 12.0 * IIIIZIZII\n+ 12.0 * IIIIIZZII\n- 1282.5 * IIIIIIIZI\n+ 22.75 * ZIIIIIIZI\n+ 606.5 * IZIIIIIZI\n+ 22.75 * IIZIIIIZI\n+ 12.0 * IIIZIIIZI\n+ 606.5 * IIIIZIIZI\n+ 12.0 * IIIIIZIZI\n+ 606.5 * IIIIIIZZI\n- 1282.5 * IIIIIIIIZ\n+ 22.75 * ZIIIIIIIZ\n+ 22.75 * IZIIIIIIZ\n+ 606.5 * IIZIIIIIZ\n+ 12.0 * IIIZIIIIZ\n+ 12.0 * IIIIZIIIZ\n+ 606.5 * IIIIIZIIZ\n+ 606.5 * IIIIIIZIZ\n+ 606.5 * IIIIIIIZZ\n" ] } ], @@ -3624,12 +679,10 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "optimal function value: 202.0\n", - "optimal value: [1. 0. 0. 0. 1. 0. 0. 0. 1.]\n", - "status: SUCCESS\n" + "optimal function value: 202.0\noptimal value: [1. 0. 0. 0. 1. 0. 0. 0. 1.]\nstatus: SUCCESS\n" ] } ], @@ -3653,483 +706,20 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "energy: -7379.0\n", - "tsp objective: 202.0\n", - "feasible: True\n", - "solution: [0, 1, 2]\n", - "solution objective: 202.0\n" + "energy: -7379.0\ntsp objective: 202.0\nfeasible: True\nsolution: [0, 1, 2]\nsolution objective: 202.0\n" ] }, { + "output_type": "display_data", "data": { - "image/png": "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\n", - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2021-03-11T18:37:29.919539\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.3.2, https://matplotlib.org/\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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/svg+xml": "\n\n\n \n \n \n \n 2021-06-13T22:29:06.679856\n image/svg+xml\n \n \n Matplotlib v3.4.2, https://matplotlib.org/\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 \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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/png": "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\n" }, - "metadata": {}, - "output_type": "display_data" + "metadata": {} } ], "source": [ @@ -4175,483 +765,20 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "energy: -7204.6830268662625\n", - "time: 8.034800052642822\n", - "feasible: True\n", - "solution: [1, 2, 0]\n", - "solution objective: 202.0\n" + "energy: -7341.272944851356\ntime: 4.881815195083618\nfeasible: True\nsolution: [2, 1, 0]\nsolution objective: 202.0\n" ] }, { + "output_type": "display_data", "data": { - "image/png": "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\n", - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2021-03-11T18:37:38.375832\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.3.2, https://matplotlib.org/\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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/svg+xml": "\n\n\n \n \n \n \n 2021-06-13T22:29:12.028210\n image/svg+xml\n \n \n Matplotlib v3.4.2, https://matplotlib.org/\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 \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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/png": "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\n" }, - "metadata": {}, - "output_type": "display_data" + "metadata": {} } ], "source": [ @@ -4691,483 +818,20 @@ }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "optimal function value: 202.0\n", - "optimal value: [0. 0. 1. 0. 1. 0. 1. 0. 0.]\n", - "status: SUCCESS\n", - "solution: [1, 2, 0]\n", - "solution objective: 202.0\n" + "optimal function value: 202.0\noptimal value: [0. 0. 1. 0. 1. 0. 1. 0. 0.]\nstatus: SUCCESS\nsolution: [2, 1, 0]\nsolution objective: 202.0\n" ] }, { + "output_type": "display_data", "data": { - "image/png": "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\n", - "image/svg+xml": [ - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " 2021-03-11T18:37:49.172126\n", - " image/svg+xml\n", - " \n", - " \n", - " Matplotlib v3.3.2, https://matplotlib.org/\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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "\n" - ], - "text/plain": [ - "
" - ] + "text/plain": "
", + "image/svg+xml": "\n\n\n \n \n \n \n 2021-06-13T22:29:17.401155\n image/svg+xml\n \n \n Matplotlib v3.4.2, https://matplotlib.org/\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 \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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "image/png": "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\n" }, - "metadata": {}, - "output_type": "display_data" + "metadata": {} } ], "source": [ @@ -5197,37 +861,20 @@ }, "outputs": [ { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/atsushi/github/aqua-public/qiskit/aqua/operators/operator_globals.py:49: DeprecationWarning: `from_label` is deprecated and will be removed no earlier than 3 months after the release date. Use Pauli(label) instead.\n", - " X = make_immutable(PauliOp(Pauli.from_label('X')))\n" - ] - }, - { + "output_type": "display_data", "data": { - "text/html": [ - "

Version Information

Qiskit SoftwareVersion
QiskitNone
Terra0.17.0.dev0+89d15f3
Aer0.6.1
Ignis0.4.0
Aqua0.9.0.dev0+84ce2d6
IBM Q Provider0.11.0
System information
Python3.8.6 (default, Mar 10 2021, 14:41:09) \n", - "[Clang 12.0.0 (clang-1200.0.32.29)]
OSDarwin
CPUs8
Memory (Gb)32.0
Thu Mar 11 18:37:49 2021 JST
" - ], - "text/plain": [ - "" - ] + "text/plain": "", + "text/html": "

Version Information

Qiskit SoftwareVersion
QiskitNone
Terra0.18.0
Aer0.8.2
IgnisNone
AquaNone
IBM Q Provider0.13.1
System information
Python3.8.5 (default, May 27 2021, 13:30:53) \n[GCC 9.3.0]
OSLinux
CPUs4
Memory (Gb)14.650382995605469
Sun Jun 13 22:29:17 2021 JST
" }, - "metadata": {}, - "output_type": "display_data" + "metadata": {} }, { + "output_type": "display_data", "data": { - "text/html": [ - "

This code is a part of Qiskit

© Copyright IBM 2017, 2021.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

" - ], - "text/plain": [ - "" - ] + "text/plain": "", + "text/html": "

This code is a part of Qiskit

© Copyright IBM 2017, 2021.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

" }, - "metadata": {}, - "output_type": "display_data" + "metadata": {} } ], "source": [ @@ -5248,9 +895,8 @@ "anaconda-cloud": {}, "celltoolbar": "Tags", "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" + "name": "python3", + "display_name": "Python 3.8.5 64-bit ('dev38': venv)" }, "language_info": { "codemirror_mode": { @@ -5292,8 +938,11 @@ "_Feature" ], "window_display": false + }, + "interpreter": { + "hash": "b4fe86ebdff5cc3f22ee67b3ac6e6e0ad6d0d521745d3575c06ff4d245962764" } }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file diff --git a/docs/tutorials/08_cvar_optimization.ipynb b/docs/tutorials/08_cvar_optimization.ipynb index 2776619d1..e0da103ee 100644 --- a/docs/tutorials/08_cvar_optimization.ipynb +++ b/docs/tutorials/08_cvar_optimization.ipynb @@ -35,6 +35,7 @@ "from qiskit_optimization import QuadraticProgram\n", "from qiskit_optimization.converters import LinearEqualityToPenalty\n", "from qiskit_optimization.algorithms import MinimumEigenOptimizer\n", + "from qiskit_optimization.translators import from_docplex_mp\n", "from qiskit import execute, Aer\n", "from qiskit.utils import algorithm_globals\n", "\n", @@ -109,8 +110,7 @@ "mdl.add_constraint(mdl.sum(x[i] for i in range(n)) == budget)\n", "\n", "# case to \n", - "qp = QuadraticProgram()\n", - "qp.from_docplex(mdl)" + "qp = from_docplex_mp(mdl)" ] }, { @@ -384,4 +384,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file diff --git a/docs/tutorials/10_warm_start_qaoa.ipynb b/docs/tutorials/10_warm_start_qaoa.ipynb index 711a457e6..845af7ed7 100644 --- a/docs/tutorials/10_warm_start_qaoa.ipynb +++ b/docs/tutorials/10_warm_start_qaoa.ipynb @@ -51,7 +51,8 @@ "from qiskit_optimization.algorithms import MinimumEigenOptimizer, CplexOptimizer\n", "from qiskit_optimization import QuadraticProgram\n", "from qiskit_optimization.problems.variable import VarType\n", - "from qiskit_optimization.converters.quadratic_program_to_qubo import QuadraticProgramToQubo" + "from qiskit_optimization.converters.quadratic_program_to_qubo import QuadraticProgramToQubo\n", + "from qiskit_optimization.translators import from_docplex_mp" ] }, { @@ -83,9 +84,7 @@ " cost = mdl.sum(x)\n", " mdl.add_constraint(cost == total)\n", " \n", - " qp = QuadraticProgram()\n", - " qp.from_docplex(mdl)\n", - " \n", + " qp = from_docplex_mp(mdl)\n", " return qp\n", "\n", "def relax_problem(problem) -> QuadraticProgram:\n", @@ -758,4 +757,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/qiskit_optimization/algorithms/cplex_optimizer.py b/qiskit_optimization/algorithms/cplex_optimizer.py index 22e51aa3e..9bb8126b5 100644 --- a/qiskit_optimization/algorithms/cplex_optimizer.py +++ b/qiskit_optimization/algorithms/cplex_optimizer.py @@ -18,12 +18,13 @@ from qiskit.exceptions import MissingOptionalLibraryError +from qiskit_optimization.problems.quadratic_program import QuadraticProgram +from qiskit_optimization.translators import to_docplex_mp from .optimization_algorithm import ( OptimizationAlgorithm, OptimizationResult, OptimizationResultStatus, ) -from ..problems.quadratic_program import QuadraticProgram logger = logging.getLogger(__name__) @@ -139,7 +140,7 @@ def solve(self, problem: QuadraticProgram) -> OptimizationResult: QiskitOptimizationError: If the problem is incompatible with the optimizer. """ - mod = problem.to_docplex() + mod = to_docplex_mp(problem) sol = mod.solve(log_output=self._disp, cplex_parameters=self._cplex_parameters) if sol is None: # no solution is found diff --git a/qiskit_optimization/algorithms/gurobi_optimizer.py b/qiskit_optimization/algorithms/gurobi_optimizer.py index fa1b9fdea..7cc42bb15 100644 --- a/qiskit_optimization/algorithms/gurobi_optimizer.py +++ b/qiskit_optimization/algorithms/gurobi_optimizer.py @@ -15,9 +15,11 @@ import logging from qiskit.exceptions import MissingOptionalLibraryError -from .optimization_algorithm import OptimizationAlgorithm, OptimizationResult + from ..exceptions import QiskitOptimizationError from ..problems.quadratic_program import QuadraticProgram +from ..translators.gurobipy import to_gurobipy +from .optimization_algorithm import OptimizationAlgorithm, OptimizationResult logger = logging.getLogger(__name__) @@ -32,7 +34,7 @@ class GurobiOptimizer(OptimizationAlgorithm): """The Gurobi optimizer wrapped as an Qiskit :class:`OptimizationAlgorithm`. - This class provides a wrapper for ``gurobipy`` (https://pypi.gurobi.com) + This class provides a wrapper for ``gurobipy`` to be used within the optimization module. Examples: @@ -63,7 +65,7 @@ def __init__(self, disp: bool = False) -> None: raise MissingOptionalLibraryError( libname="GUROBI", name="GurobiOptimizer", - pip_install="pip install -i https://pypi.gurobi.com gurobipy", + pip_install="pip install qiskit-optimization[gurobi]", ) self._disp = disp @@ -122,7 +124,7 @@ def solve(self, problem: QuadraticProgram) -> OptimizationResult: """ # convert to Gurobi problem - model = problem.to_gurobipy() + model = to_gurobipy(problem) # Enable non-convex model.Params.NonConvex = 2 diff --git a/qiskit_optimization/applications/clique.py b/qiskit_optimization/applications/clique.py index da7f730c6..527d5d292 100644 --- a/qiskit_optimization/applications/clique.py +++ b/qiskit_optimization/applications/clique.py @@ -19,6 +19,7 @@ from qiskit_optimization.algorithms import OptimizationResult from qiskit_optimization.problems.quadratic_program import QuadraticProgram +from qiskit_optimization.translators import from_docplex_mp from .graph_optimization_application import GraphOptimizationApplication @@ -64,8 +65,7 @@ def to_quadratic_program(self) -> QuadraticProgram: mdl.maximize(mdl.sum(x[i] for i in x)) else: mdl.add_constraint(mdl.sum(x[i] for i in x) == self.size) - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) return op def interpret(self, result: Union[OptimizationResult, np.ndarray]) -> List[int]: diff --git a/qiskit_optimization/applications/exact_cover.py b/qiskit_optimization/applications/exact_cover.py index 125d18093..ed4f821a7 100644 --- a/qiskit_optimization/applications/exact_cover.py +++ b/qiskit_optimization/applications/exact_cover.py @@ -18,6 +18,7 @@ from qiskit_optimization.algorithms import OptimizationResult from qiskit_optimization.problems.quadratic_program import QuadraticProgram +from qiskit_optimization.translators import from_docplex_mp from .optimization_application import OptimizationApplication @@ -55,8 +56,7 @@ def to_quadratic_program(self) -> QuadraticProgram: mdl.add_constraint( mdl.sum(x[i] for i, sub in enumerate(self._subsets) if element in sub) == 1 ) - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) return op def interpret(self, result: Union[OptimizationResult, np.ndarray]) -> List[List[int]]: diff --git a/qiskit_optimization/applications/graph_partition.py b/qiskit_optimization/applications/graph_partition.py index 9d3370e90..42ccf28a2 100644 --- a/qiskit_optimization/applications/graph_partition.py +++ b/qiskit_optimization/applications/graph_partition.py @@ -20,6 +20,7 @@ from qiskit_optimization.algorithms import OptimizationResult from qiskit_optimization.problems.quadratic_program import QuadraticProgram +from qiskit_optimization.translators import from_docplex_mp from .graph_optimization_application import GraphOptimizationApplication @@ -49,8 +50,7 @@ def to_quadratic_program(self) -> QuadraticProgram: ) mdl.minimize(objective) mdl.add_constraint(mdl.sum([x[i] for i in x]) == n // 2) - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) return op def interpret(self, result: Union[OptimizationResult, np.ndarray]) -> List[List[int]]: diff --git a/qiskit_optimization/applications/knapsack.py b/qiskit_optimization/applications/knapsack.py index 329c9d0ad..7e824bb27 100644 --- a/qiskit_optimization/applications/knapsack.py +++ b/qiskit_optimization/applications/knapsack.py @@ -18,6 +18,7 @@ from qiskit_optimization.algorithms import OptimizationResult from qiskit_optimization.problems.quadratic_program import QuadraticProgram +from qiskit_optimization.translators import from_docplex_mp from .optimization_application import OptimizationApplication @@ -52,8 +53,7 @@ def to_quadratic_program(self) -> QuadraticProgram: x = {i: mdl.binary_var(name="x_{0}".format(i)) for i in range(len(self._values))} mdl.maximize(mdl.sum(self._values[i] * x[i] for i in x)) mdl.add_constraint(mdl.sum(self._weights[i] * x[i] for i in x) <= self._max_weight) - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) return op def interpret(self, result: Union[OptimizationResult, np.ndarray]) -> List[int]: diff --git a/qiskit_optimization/applications/max_cut.py b/qiskit_optimization/applications/max_cut.py index 3510773cc..e64974a1d 100644 --- a/qiskit_optimization/applications/max_cut.py +++ b/qiskit_optimization/applications/max_cut.py @@ -20,6 +20,7 @@ from qiskit_optimization.algorithms import OptimizationResult from qiskit_optimization.problems.quadratic_program import QuadraticProgram +from qiskit_optimization.translators import from_docplex_mp from .graph_optimization_application import GraphOptimizationApplication @@ -51,8 +52,7 @@ def to_quadratic_program(self) -> QuadraticProgram: for i, j in self._graph.edges ) mdl.maximize(objective) - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) return op def _draw_result( diff --git a/qiskit_optimization/applications/number_partition.py b/qiskit_optimization/applications/number_partition.py index 4c72e058d..4ba98cd98 100644 --- a/qiskit_optimization/applications/number_partition.py +++ b/qiskit_optimization/applications/number_partition.py @@ -19,6 +19,7 @@ from qiskit_optimization.algorithms import OptimizationResult from qiskit_optimization.problems.quadratic_program import QuadraticProgram +from qiskit_optimization.translators import from_docplex_mp from .optimization_application import OptimizationApplication @@ -50,8 +51,7 @@ def to_quadratic_program(self) -> QuadraticProgram: mdl.add_constraint( mdl.sum(num * (-2 * x[i] + 1) for i, num in enumerate(self._number_set)) == 0 ) - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) return op def interpret(self, result: Union[OptimizationResult, np.ndarray]) -> List[List[int]]: diff --git a/qiskit_optimization/applications/set_packing.py b/qiskit_optimization/applications/set_packing.py index 3341ff455..2507d5e7b 100644 --- a/qiskit_optimization/applications/set_packing.py +++ b/qiskit_optimization/applications/set_packing.py @@ -19,6 +19,7 @@ from qiskit_optimization.algorithms import OptimizationResult from qiskit_optimization.problems.quadratic_program import QuadraticProgram +from qiskit_optimization.translators import from_docplex_mp from .optimization_application import OptimizationApplication @@ -56,8 +57,7 @@ def to_quadratic_program(self) -> QuadraticProgram: mdl.add_constraint( mdl.sum(x[i] for i, sub in enumerate(self._subsets) if element in sub) <= 1 ) - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) return op def interpret(self, result: Union[OptimizationResult, np.ndarray]) -> List[List[int]]: diff --git a/qiskit_optimization/applications/stable_set.py b/qiskit_optimization/applications/stable_set.py index ae2fb8e07..72a4c037b 100644 --- a/qiskit_optimization/applications/stable_set.py +++ b/qiskit_optimization/applications/stable_set.py @@ -20,6 +20,7 @@ from qiskit_optimization.algorithms import OptimizationResult from qiskit_optimization.problems.quadratic_program import QuadraticProgram +from qiskit_optimization.translators import from_docplex_mp from .graph_optimization_application import GraphOptimizationApplication @@ -48,8 +49,7 @@ def to_quadratic_program(self) -> QuadraticProgram: for w, v in self._graph.edges: mdl.add_constraint(x[w] + x[v] <= 1) mdl.maximize(objective) - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) return op def interpret(self, result: Union[OptimizationResult, np.ndarray]) -> List[int]: diff --git a/qiskit_optimization/applications/tsp.py b/qiskit_optimization/applications/tsp.py index 822f8a601..0d4e07ebf 100644 --- a/qiskit_optimization/applications/tsp.py +++ b/qiskit_optimization/applications/tsp.py @@ -18,9 +18,10 @@ from docplex.mp.model import Model from qiskit.utils import algorithm_globals -from ..algorithms import OptimizationResult -from ..exceptions import QiskitOptimizationError -from ..problems.quadratic_program import QuadraticProgram +from qiskit_optimization.algorithms import OptimizationResult +from qiskit_optimization.exceptions import QiskitOptimizationError +from qiskit_optimization.problems import QuadraticProgram +from qiskit_optimization.translators import from_docplex_mp from .graph_optimization_application import GraphOptimizationApplication @@ -60,8 +61,7 @@ def to_quadratic_program(self) -> QuadraticProgram: mdl.add_constraint(mdl.sum(x[(i, k)] for k in range(n)) == 1) for k in range(n): mdl.add_constraint(mdl.sum(x[(i, k)] for i in range(n)) == 1) - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) return op def interpret( diff --git a/qiskit_optimization/applications/vehicle_routing.py b/qiskit_optimization/applications/vehicle_routing.py index 5be280d1d..3bb6bf3aa 100644 --- a/qiskit_optimization/applications/vehicle_routing.py +++ b/qiskit_optimization/applications/vehicle_routing.py @@ -22,6 +22,7 @@ from qiskit_optimization.algorithms import OptimizationResult from qiskit_optimization.problems.quadratic_program import QuadraticProgram +from qiskit_optimization.translators import from_docplex_mp from .graph_optimization_application import GraphOptimizationApplication @@ -99,8 +100,7 @@ def to_quadratic_program(self) -> QuadraticProgram: mdl.add_constraint( mdl.sum(x[(i, j)] for i in clique for j in clique if i != j) <= len(clique) - 1 ) - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) return op def interpret(self, result: Union[OptimizationResult, np.ndarray]) -> List[List[List[int]]]: diff --git a/qiskit_optimization/applications/vertex_cover.py b/qiskit_optimization/applications/vertex_cover.py index a645cd95b..d7c239eaa 100644 --- a/qiskit_optimization/applications/vertex_cover.py +++ b/qiskit_optimization/applications/vertex_cover.py @@ -20,6 +20,7 @@ from qiskit_optimization.algorithms import OptimizationResult from qiskit_optimization.problems.quadratic_program import QuadraticProgram +from qiskit_optimization.translators import from_docplex_mp from .graph_optimization_application import GraphOptimizationApplication @@ -45,8 +46,7 @@ def to_quadratic_program(self) -> QuadraticProgram: for w, v in self._graph.edges: mdl.add_constraint(x[w] + x[v] >= 1) mdl.minimize(objective) - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) return op def interpret(self, result: Union[OptimizationResult, np.ndarray]) -> List[int]: diff --git a/qiskit_optimization/problems/quadratic_program.py b/qiskit_optimization/problems/quadratic_program.py index ca8f56978..3d1e1f972 100644 --- a/qiskit_optimization/problems/quadratic_program.py +++ b/qiskit_optimization/problems/quadratic_program.py @@ -21,37 +21,8 @@ from typing import Dict, List, Optional, Tuple, Union, cast import numpy as np -from docplex.mp.constr import LinearConstraint as DocplexLinearConstraint -from docplex.mp.constr import NotEqualConstraint -from docplex.mp.constr import QuadraticConstraint as DocplexQuadraticConstraint - -try: - # new location since docplex 2.16.196 - from docplex.mp.dvar import Var -except ImportError: - # old location until docplex 2.15.194 - from docplex.mp.linear import Var from docplex.mp.model import Model from docplex.mp.model_reader import ModelReader -from docplex.mp.quad import QuadExpr -from docplex.mp.vartype import BinaryVarType, ContinuousVarType, IntegerVarType - -try: - import gurobipy as gp - from gurobipy import Model as GurobiModel - - _HAS_GUROBI = True -except ImportError: - _HAS_GUROBI = False - - class GurobiModel: # type: ignore - """Empty GurobiModel class - Replacement if gurobipy.Model is not present. - """ - - pass - - from numpy import ndarray, zeros from scipy.sparse import spmatrix @@ -108,7 +79,7 @@ def __init__(self, name: str = "") -> None: self._objective = QuadraticObjective(self) def __repr__(self) -> str: - return self.to_docplex().export_as_lp_string() + return self.export_as_lp_string() def clear(self) -> None: """Clears the quadratic program, i.e., deletes all variables, constraints, the @@ -886,147 +857,8 @@ def maximize( self, constant, linear, quadratic, QuadraticObjective.Sense.MAXIMIZE ) - def from_gurobipy(self, model: GurobiModel) -> None: - """Loads this quadratic program from a gurobipy model. - - Note that this supports only basic functions of gurobipy as follows: - - quadratic objective function - - linear / quadratic constraints - - binary / integer / continuous variables - - Args: - model: The gurobipy model to be loaded. - - Raises: - MissingOptionalLibraryError: gurobipy not installed - QiskitOptimizationError: if the model contains unsupported elements. - """ - if not _HAS_GUROBI: - raise MissingOptionalLibraryError( - libname="GUROBI", - name="GurobiOptimizer", - pip_install="pip install -i https://pypi.gurobi.com gurobipy", - ) - - # clear current problem - self.clear() - - # Update the model to make sure everything works as expected - model.update() - - # get name - self.name = model.ModelName - - # get variables - # keep track of names separately, since gurobipy allows to have None names. - var_names = {} - for x in model.getVars(): - if x.vtype == gp.GRB.CONTINUOUS: - x_new = self.continuous_var(x.lb, x.ub, x.VarName) - elif x.vtype == gp.GRB.BINARY: - x_new = self.binary_var(x.VarName) - elif x.vtype == gp.GRB.INTEGER: - x_new = self.integer_var(x.lb, x.ub, x.VarName) - else: - raise QiskitOptimizationError( - "Unsupported variable type: {} {}".format(x.VarName, x.vtype) - ) - var_names[x] = x_new.name - - # objective sense - minimize = model.ModelSense == gp.GRB.MINIMIZE - - # Retrieve the objective - objective = model.getObjective() - has_quadratic_objective = False - - # Retrieve the linear part in case it is a quadratic objective - if isinstance(objective, gp.QuadExpr): - linear_part = objective.getLinExpr() - has_quadratic_objective = True - else: - linear_part = objective - - # Get the constant - constant = linear_part.getConstant() - - # get linear part of objective - linear = {} - for i in range(linear_part.size()): - linear[var_names[linear_part.getVar(i)]] = linear_part.getCoeff(i) - - # get quadratic part of objective - quadratic = {} - if has_quadratic_objective: - for i in range(objective.size()): - x = var_names[objective.getVar1(i)] - y = var_names[objective.getVar2(i)] - v = objective.getCoeff(i) - quadratic[x, y] = v - - # set objective - if minimize: - self.minimize(constant, linear, quadratic) - else: - self.maximize(constant, linear, quadratic) - - # check whether there are any general constraints - if model.NumSOS > 0 or model.NumGenConstrs > 0: - raise QiskitOptimizationError("Unsupported constraint: SOS or General Constraint") - - # get linear constraints - for constraint in model.getConstrs(): - name = constraint.ConstrName - sense = constraint.Sense - - left_expr = model.getRow(constraint) - rhs = constraint.RHS - - lhs = {} - for i in range(left_expr.size()): - lhs[var_names[left_expr.getVar(i)]] = left_expr.getCoeff(i) - - if sense == gp.GRB.EQUAL: - self.linear_constraint(lhs, "==", rhs, name) - elif sense == gp.GRB.GREATER_EQUAL: - self.linear_constraint(lhs, ">=", rhs, name) - elif sense == gp.GRB.LESS_EQUAL: - self.linear_constraint(lhs, "<=", rhs, name) - else: - raise QiskitOptimizationError("Unsupported constraint sense: {}".format(constraint)) - - # get quadratic constraints - for constraint in model.getQConstrs(): - name = constraint.QCName - sense = constraint.QCSense - - left_expr = model.getQCRow(constraint) - rhs = constraint.QCRHS - - linear = {} - quadratic = {} - - linear_part = left_expr.getLinExpr() - for i in range(linear_part.size()): - linear[var_names[linear_part.getVar(i)]] = linear_part.getCoeff(i) - - for i in range(left_expr.size()): - x = var_names[left_expr.getVar1(i)] - y = var_names[left_expr.getVar2(i)] - v = left_expr.getCoeff(i) - quadratic[x, y] = v - - if sense == gp.GRB.EQUAL: - self.quadratic_constraint(linear, quadratic, "==", rhs, name) - elif sense == gp.GRB.GREATER_EQUAL: - self.quadratic_constraint(linear, quadratic, ">=", rhs, name) - elif sense == gp.GRB.LESS_EQUAL: - self.quadratic_constraint(linear, quadratic, "<=", rhs, name) - else: - raise QiskitOptimizationError("Unsupported constraint sense: {}".format(constraint)) - def from_docplex(self, model: Model) -> None: - """Loads this quadratic program from a docplex model. + """DEPRECATED Loads this quadratic program from a docplex model. Note that this supports only basic functions of docplex as follows: - quadratic objective function @@ -1039,246 +871,22 @@ def from_docplex(self, model: Model) -> None: Raises: QiskitOptimizationError: if the model contains unsupported elements. """ + warnings.warn( + "The from_docplex method is deprecated as of version 0.2.0 and will be " + "removed no sooner than 3 months after the release. Instead use the " + "qiskit_optimization.translators.from_docplex_mp function.", + DeprecationWarning, + stacklevel=2, + ) - # clear current problem - self.clear() - - # get name - self.name = model.name - - # get variables - # keep track of names separately, since docplex allows to have None names. - var_names = {} - for x in model.iter_variables(): - if isinstance(x.vartype, ContinuousVarType): - x_new = self.continuous_var(x.lb, x.ub, x.name) - elif isinstance(x.vartype, BinaryVarType): - x_new = self.binary_var(x.name) - elif isinstance(x.vartype, IntegerVarType): - x_new = self.integer_var(x.lb, x.ub, x.name) - else: - raise QiskitOptimizationError( - "Unsupported variable type: {} {}".format(x.name, x.vartype) - ) - var_names[x] = x_new.name - - # objective sense - minimize = model.objective_sense.is_minimize() - - # make sure objective expression is linear or quadratic and not a variable - if isinstance(model.objective_expr, Var): - model.objective_expr = model.objective_expr + 0 - - # get objective offset - constant = model.objective_expr.constant - - # get linear part of objective - linear = {} - linear_part = model.objective_expr.get_linear_part() - for x in linear_part.iter_variables(): - linear[var_names[x]] = linear_part.get_coef(x) - - # get quadratic part of objective - quadratic = {} - if isinstance(model.objective_expr, QuadExpr): - for quad_triplet in model.objective_expr.iter_quad_triplets(): - i = var_names[quad_triplet[0]] - j = var_names[quad_triplet[1]] - v = quad_triplet[2] - quadratic[i, j] = v - - # set objective - if minimize: - self.minimize(constant, linear, quadratic) - else: - self.maximize(constant, linear, quadratic) - - # get linear constraints - for constraint in model.iter_constraints(): - if isinstance(constraint, DocplexQuadraticConstraint): - # ignore quadratic constraints here and process them later - continue - if not isinstance(constraint, DocplexLinearConstraint) or isinstance( - constraint, NotEqualConstraint - ): - # If any constraint is not linear/quadratic constraints, it raises an error. - # Notice that NotEqualConstraint is a subclass of Docplex's LinearConstraint, - # but it cannot be handled by optimization. - raise QiskitOptimizationError("Unsupported constraint: {}".format(constraint)) - name = constraint.name - sense = constraint.sense - - left_expr = constraint.get_left_expr() - right_expr = constraint.get_right_expr() - # for linear constraints we may get an instance of Var instead of expression, - # e.g. x + y = z - if isinstance(left_expr, Var): - left_expr = left_expr + 0 - if isinstance(right_expr, Var): - right_expr = right_expr + 0 - - rhs = right_expr.constant - left_expr.constant - - lhs = {} - for x in left_expr.iter_variables(): - lhs[var_names[x]] = left_expr.get_coef(x) - for x in right_expr.iter_variables(): - lhs[var_names[x]] = lhs.get(var_names[x], 0.0) - right_expr.get_coef(x) - - if sense == sense.EQ: - self.linear_constraint(lhs, "==", rhs, name) - elif sense == sense.GE: - self.linear_constraint(lhs, ">=", rhs, name) - elif sense == sense.LE: - self.linear_constraint(lhs, "<=", rhs, name) - else: - raise QiskitOptimizationError("Unsupported constraint sense: {}".format(constraint)) - - # get quadratic constraints - for constraint in model.iter_quadratic_constraints(): - name = constraint.name - sense = constraint.sense - - left_expr = constraint.get_left_expr() - right_expr = constraint.get_right_expr() - - rhs = right_expr.constant - left_expr.constant - linear = {} - quadratic = {} - - if left_expr.is_quad_expr(): - for x in left_expr.linear_part.iter_variables(): - linear[var_names[x]] = left_expr.linear_part.get_coef(x) - for quad_triplet in left_expr.iter_quad_triplets(): - i = var_names[quad_triplet[0]] - j = var_names[quad_triplet[1]] - v = quad_triplet[2] - quadratic[i, j] = v - else: - for x in left_expr.iter_variables(): - linear[var_names[x]] = left_expr.get_coef(x) - - if right_expr.is_quad_expr(): - for x in right_expr.linear_part.iter_variables(): - linear[var_names[x]] = linear.get( - var_names[x], 0.0 - ) - right_expr.linear_part.get_coef(x) - for quad_triplet in right_expr.iter_quad_triplets(): - i = var_names[quad_triplet[0]] - j = var_names[quad_triplet[1]] - v = quad_triplet[2] - quadratic[i, j] = quadratic.get((i, j), 0.0) - v - else: - for x in right_expr.iter_variables(): - linear[var_names[x]] = linear.get(var_names[x], 0.0) - right_expr.get_coef(x) - - if sense == sense.EQ: - self.quadratic_constraint(linear, quadratic, "==", rhs, name) - elif sense == sense.GE: - self.quadratic_constraint(linear, quadratic, ">=", rhs, name) - elif sense == sense.LE: - self.quadratic_constraint(linear, quadratic, "<=", rhs, name) - else: - raise QiskitOptimizationError("Unsupported constraint sense: {}".format(constraint)) - - def to_gurobipy(self) -> GurobiModel: - """Returns a gurobipy model corresponding to this quadratic program - - Returns: - The gurobipy model corresponding to this quadratic program. - - Raises: - MissingOptionalLibraryError: gurobipy not installed - QiskitOptimizationError: if non-supported elements (should never happen). - """ - if not _HAS_GUROBI: - raise MissingOptionalLibraryError( - libname="GUROBI", - name="GurobiOptimizer", - pip_install="pip install -i https://pypi.gurobi.com gurobipy", - ) - - # initialize model - mdl = gp.Model(self.name) - - # add variables - var = {} - for idx, x in enumerate(self.variables): - if x.vartype == Variable.Type.CONTINUOUS: - var[idx] = mdl.addVar( - vtype=gp.GRB.CONTINUOUS, lb=x.lowerbound, ub=x.upperbound, name=x.name - ) - elif x.vartype == Variable.Type.BINARY: - var[idx] = mdl.addVar(vtype=gp.GRB.BINARY, name=x.name) - elif x.vartype == Variable.Type.INTEGER: - var[idx] = mdl.addVar( - vtype=gp.GRB.INTEGER, lb=x.lowerbound, ub=x.upperbound, name=x.name - ) - else: - # should never happen - raise QiskitOptimizationError("Unsupported variable type: {}".format(x.vartype)) - - # add objective - objective = self.objective.constant - for i, v in self.objective.linear.to_dict().items(): - objective += v * var[cast(int, i)] - for (i, j), v in self.objective.quadratic.to_dict().items(): - objective += v * var[cast(int, i)] * var[cast(int, j)] - if self.objective.sense == QuadraticObjective.Sense.MINIMIZE: - mdl.setObjective(objective, sense=gp.GRB.MINIMIZE) - else: - mdl.setObjective(objective, sense=gp.GRB.MAXIMIZE) - - # add linear constraints - for i, l_constraint in enumerate(self.linear_constraints): - name = l_constraint.name - rhs = l_constraint.rhs - if rhs == 0 and l_constraint.linear.coefficients.nnz == 0: - continue - linear_expr = 0 - for j, v in l_constraint.linear.to_dict().items(): - linear_expr += v * var[cast(int, j)] - sense = l_constraint.sense - if sense == Constraint.Sense.EQ: - mdl.addConstr(linear_expr == rhs, name=name) - elif sense == Constraint.Sense.GE: - mdl.addConstr(linear_expr >= rhs, name=name) - elif sense == Constraint.Sense.LE: - mdl.addConstr(linear_expr <= rhs, name=name) - else: - # should never happen - raise QiskitOptimizationError("Unsupported constraint sense: {}".format(sense)) - - # add quadratic constraints - for i, q_constraint in enumerate(self.quadratic_constraints): - name = q_constraint.name - rhs = q_constraint.rhs - if ( - rhs == 0 - and q_constraint.linear.coefficients.nnz == 0 - and q_constraint.quadratic.coefficients.nnz == 0 - ): - continue - quadratic_expr = 0 - for j, v in q_constraint.linear.to_dict().items(): - quadratic_expr += v * var[cast(int, j)] - for (j, k), v in q_constraint.quadratic.to_dict().items(): - quadratic_expr += v * var[cast(int, j)] * var[cast(int, k)] - sense = q_constraint.sense - if sense == Constraint.Sense.EQ: - mdl.addConstr(quadratic_expr == rhs, name=name) - elif sense == Constraint.Sense.GE: - mdl.addConstr(quadratic_expr >= rhs, name=name) - elif sense == Constraint.Sense.LE: - mdl.addConstr(quadratic_expr <= rhs, name=name) - else: - # should never happen - raise QiskitOptimizationError("Unsupported constraint sense: {}".format(sense)) + from ..translators.docplex_mp import from_docplex_mp - return mdl + other = from_docplex_mp(model) + for attr, val in vars(other).items(): + setattr(self, attr, val) def to_docplex(self) -> Model: - """Returns a docplex model corresponding to this quadratic program. + """DEPRECATED Returns a docplex model corresponding to this quadratic program. Returns: The docplex model corresponding to this quadratic program. @@ -1286,81 +894,17 @@ def to_docplex(self) -> Model: Raises: QiskitOptimizationError: if non-supported elements (should never happen). """ + warnings.warn( + "The to_docplex method is deprecated as of version 0.2.0 and will be " + "removed no sooner than 3 months after the release. Instead use the " + "qiskit_optimization.translators.to_docplex_mp function.", + DeprecationWarning, + stacklevel=2, + ) - # initialize model - mdl = Model(self.name) - - # add variables - var = {} - for idx, x in enumerate(self.variables): - if x.vartype == Variable.Type.CONTINUOUS: - var[idx] = mdl.continuous_var(lb=x.lowerbound, ub=x.upperbound, name=x.name) - elif x.vartype == Variable.Type.BINARY: - var[idx] = mdl.binary_var(name=x.name) - elif x.vartype == Variable.Type.INTEGER: - var[idx] = mdl.integer_var(lb=x.lowerbound, ub=x.upperbound, name=x.name) - else: - # should never happen - raise QiskitOptimizationError("Unsupported variable type: {}".format(x.vartype)) - - # add objective - objective = self.objective.constant - for i, v in self.objective.linear.to_dict().items(): - objective += v * var[cast(int, i)] - for (i, j), v in self.objective.quadratic.to_dict().items(): - objective += v * var[cast(int, i)] * var[cast(int, j)] - if self.objective.sense == QuadraticObjective.Sense.MINIMIZE: - mdl.minimize(objective) - else: - mdl.maximize(objective) - - # add linear constraints - for i, l_constraint in enumerate(self.linear_constraints): - name = l_constraint.name - rhs = l_constraint.rhs - if rhs == 0 and l_constraint.linear.coefficients.nnz == 0: - continue - linear_expr = 0 - for j, v in l_constraint.linear.to_dict().items(): - linear_expr += v * var[cast(int, j)] - sense = l_constraint.sense - if sense == Constraint.Sense.EQ: - mdl.add_constraint(linear_expr == rhs, ctname=name) - elif sense == Constraint.Sense.GE: - mdl.add_constraint(linear_expr >= rhs, ctname=name) - elif sense == Constraint.Sense.LE: - mdl.add_constraint(linear_expr <= rhs, ctname=name) - else: - # should never happen - raise QiskitOptimizationError("Unsupported constraint sense: {}".format(sense)) - - # add quadratic constraints - for i, q_constraint in enumerate(self.quadratic_constraints): - name = q_constraint.name - rhs = q_constraint.rhs - if ( - rhs == 0 - and q_constraint.linear.coefficients.nnz == 0 - and q_constraint.quadratic.coefficients.nnz == 0 - ): - continue - quadratic_expr = 0 - for j, v in q_constraint.linear.to_dict().items(): - quadratic_expr += v * var[cast(int, j)] - for (j, k), v in q_constraint.quadratic.to_dict().items(): - quadratic_expr += v * var[cast(int, j)] * var[cast(int, k)] - sense = q_constraint.sense - if sense == Constraint.Sense.EQ: - mdl.add_constraint(quadratic_expr == rhs, ctname=name) - elif sense == Constraint.Sense.GE: - mdl.add_constraint(quadratic_expr >= rhs, ctname=name) - elif sense == Constraint.Sense.LE: - mdl.add_constraint(quadratic_expr <= rhs, ctname=name) - else: - # should never happen - raise QiskitOptimizationError("Unsupported constraint sense: {}".format(sense)) + from ..translators.docplex_mp import to_docplex_mp - return mdl + return to_docplex_mp(self) def export_as_lp_string(self) -> str: """Returns the quadratic program as a string of LP format. @@ -1368,37 +912,9 @@ def export_as_lp_string(self) -> str: Returns: A string representing the quadratic program. """ - return self.to_docplex().export_as_lp_string() + from ..translators.docplex_mp import to_docplex_mp - def pprint_as_string(self) -> str: - """DEPRECATED Returns the quadratic program as a string in Docplex's pretty print format. - Returns: - A string representing the quadratic program. - """ - warnings.warn( - "The pprint_as_string method is deprecated and will be " - "removed in a future release. Instead use the" - "to_docplex() method and run pprint_as_string() on that " - "output", - DeprecationWarning, - ) - return self.to_docplex().pprint_as_string() - - def prettyprint(self, out: Optional[str] = None) -> None: - """DEPRECATED Pretty prints the quadratic program to a given output stream (None = default). - - Args: - out: The output stream or file name to print to. - if you specify a file name, the output file name is has '.mod' as suffix. - """ - warnings.warn( - "The prettyprint method is deprecated and will be " - "removed in a future release. Instead use the" - "to_docplex() method and run prettyprint() on that " - "output", - DeprecationWarning, - ) - self.to_docplex().prettyprint(out) + return to_docplex_mp(self).export_as_lp_string() def read_from_lp_file(self, filename: str) -> None: """Loads the quadratic program from a LP file. @@ -1436,9 +952,12 @@ def _parse_problem_name(filename: str) -> str: break return model_name - model_reader = ModelReader() - model = model_reader.read(filename, model_name=_parse_problem_name(filename)) - self.from_docplex(model) + from ..translators.docplex_mp import from_docplex_mp + + model = ModelReader().read(filename, model_name=_parse_problem_name(filename)) + other = from_docplex_mp(model) + for attr, val in vars(other).items(): + setattr(self, attr, val) def write_to_lp_file(self, filename: str) -> None: """Writes the quadratic program to an LP file. @@ -1452,7 +971,10 @@ def write_to_lp_file(self, filename: str) -> None: OSError: If this cannot open a file. DOcplexException: If filename is an empty string """ - self.to_docplex().export_as_lp(filename) + from ..translators.docplex_mp import to_docplex_mp + + mdl = to_docplex_mp(self) + mdl.export_as_lp(filename) def substitute_variables( self, diff --git a/qiskit_optimization/translators/__init__.py b/qiskit_optimization/translators/__init__.py new file mode 100644 index 000000000..4f8655f0d --- /dev/null +++ b/qiskit_optimization/translators/__init__.py @@ -0,0 +1,37 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +""" +Quadratic program translators (:mod:`qiskit_optimization.translators`) +====================================================================== + +.. currentmodule:: qiskit_optimization.translators + +Translators between :class:`~qiskit_optimization.problems.QuadraticProgram` and +other optimization models. + +Translators +====================== +.. autosummary:: + :toctree: ../stubs/ + :nosignatures: + + from_docplex_mp + to_docplex_mp + from_gurobipy + to_gurobipy +""" + +from .docplex_mp import from_docplex_mp, to_docplex_mp +from .gurobipy import from_gurobipy, to_gurobipy + +_all = ["from_docplex_mp", "to_docplex_mp", "from_gurobipy", "to_gurobipy"] diff --git a/qiskit_optimization/translators/docplex_mp.py b/qiskit_optimization/translators/docplex_mp.py new file mode 100644 index 000000000..e708bb6de --- /dev/null +++ b/qiskit_optimization/translators/docplex_mp.py @@ -0,0 +1,292 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Translator between a docplex.mp model and a quadratic program""" + +from typing import TYPE_CHECKING, cast + +from docplex.mp.constr import LinearConstraint as DocplexLinearConstraint +from docplex.mp.constr import NotEqualConstraint +from docplex.mp.constr import QuadraticConstraint as DocplexQuadraticConstraint +from docplex.mp.dvar import Var +from docplex.mp.model import Model +from docplex.mp.quad import QuadExpr +from docplex.mp.vartype import BinaryVarType, ContinuousVarType, IntegerVarType + +from qiskit_optimization.exceptions import QiskitOptimizationError +from qiskit_optimization.problems.constraint import Constraint +from qiskit_optimization.problems.quadratic_objective import QuadraticObjective +from qiskit_optimization.problems.variable import Variable + +if TYPE_CHECKING: + # pylint: disable=cyclic-import + from qiskit_optimization.problems.quadratic_program import QuadraticProgram + + +def to_docplex_mp(quadratic_program: "QuadraticProgram") -> Model: + """Returns a docplex.mp model corresponding to a quadratic program. + + Args: + quadratic_program: The quadratic program to be translated. + + Returns: + The docplex.mp model corresponding to a quadratic program. + + Raises: + QiskitOptimizationError: if the model contains non-supported elements (should never happen). + """ + # initialize model + mdl = Model(quadratic_program.name) + + # add variables + var = {} + for idx, x in enumerate(quadratic_program.variables): + if x.vartype == Variable.Type.CONTINUOUS: + var[idx] = mdl.continuous_var(lb=x.lowerbound, ub=x.upperbound, name=x.name) + elif x.vartype == Variable.Type.BINARY: + var[idx] = mdl.binary_var(name=x.name) + elif x.vartype == Variable.Type.INTEGER: + var[idx] = mdl.integer_var(lb=x.lowerbound, ub=x.upperbound, name=x.name) + else: + # should never happen + raise QiskitOptimizationError( + "Internal error: unsupported variable type: {}".format(x.vartype) + ) + + # add objective + objective = quadratic_program.objective.constant + for i, v in quadratic_program.objective.linear.to_dict().items(): + objective += v * var[cast(int, i)] + for (i, j), v in quadratic_program.objective.quadratic.to_dict().items(): + objective += v * var[cast(int, i)] * var[cast(int, j)] + if quadratic_program.objective.sense == QuadraticObjective.Sense.MINIMIZE: + mdl.minimize(objective) + else: + mdl.maximize(objective) + + # add linear constraints + for i, l_constraint in enumerate(quadratic_program.linear_constraints): + name = l_constraint.name + rhs = l_constraint.rhs + if rhs == 0 and l_constraint.linear.coefficients.nnz == 0: + continue + linear_expr = 0 + for j, v in l_constraint.linear.to_dict().items(): + linear_expr += v * var[cast(int, j)] + sense = l_constraint.sense + if sense == Constraint.Sense.EQ: + mdl.add_constraint(linear_expr == rhs, ctname=name) + elif sense == Constraint.Sense.GE: + mdl.add_constraint(linear_expr >= rhs, ctname=name) + elif sense == Constraint.Sense.LE: + mdl.add_constraint(linear_expr <= rhs, ctname=name) + else: + # should never happen + raise QiskitOptimizationError( + "Internal error: unsupported constraint sense: {}".format(sense) + ) + + # add quadratic constraints + for i, q_constraint in enumerate(quadratic_program.quadratic_constraints): + name = q_constraint.name + rhs = q_constraint.rhs + if ( + rhs == 0 + and q_constraint.linear.coefficients.nnz == 0 + and q_constraint.quadratic.coefficients.nnz == 0 + ): + continue + quadratic_expr = 0 + for j, v in q_constraint.linear.to_dict().items(): + quadratic_expr += v * var[cast(int, j)] + for (j, k), v in q_constraint.quadratic.to_dict().items(): + quadratic_expr += v * var[cast(int, j)] * var[cast(int, k)] + sense = q_constraint.sense + if sense == Constraint.Sense.EQ: + mdl.add_constraint(quadratic_expr == rhs, ctname=name) + elif sense == Constraint.Sense.GE: + mdl.add_constraint(quadratic_expr >= rhs, ctname=name) + elif sense == Constraint.Sense.LE: + mdl.add_constraint(quadratic_expr <= rhs, ctname=name) + else: + # should never happen + raise QiskitOptimizationError( + "Internal error: unsupported constraint sense: {}".format(sense) + ) + + return mdl + + +def from_docplex_mp(model: Model) -> "QuadraticProgram": + """Translate a docplex.mp model into a quadratic program. + + Note that this supports only basic functions of docplex as follows: + - quadratic objective function + - linear / quadratic constraints + - binary / integer / continuous variables + + Args: + model: The docplex.mp model to be loaded. + + Returns: + The quadratic program corresponding to the model. + + Raises: + QiskitOptimizationError: if the model contains unsupported elements. + """ + if not isinstance(model, Model): + raise QiskitOptimizationError(f"The model is not compatible: {model}") + + # pylint: disable=cyclic-import + from qiskit_optimization.problems.quadratic_program import QuadraticProgram + + quadratic_program = QuadraticProgram() + + # get name + quadratic_program.name = model.name + + # get variables + # keep track of names separately, since docplex allows to have None names. + var_names = {} + for x in model.iter_variables(): + if isinstance(x.vartype, ContinuousVarType): + x_new = quadratic_program.continuous_var(x.lb, x.ub, x.name) + elif isinstance(x.vartype, BinaryVarType): + x_new = quadratic_program.binary_var(x.name) + elif isinstance(x.vartype, IntegerVarType): + x_new = quadratic_program.integer_var(x.lb, x.ub, x.name) + else: + raise QiskitOptimizationError( + "Unsupported variable type: {} {}".format(x.name, x.vartype) + ) + var_names[x] = x_new.name + + # objective sense + minimize = model.objective_sense.is_minimize() + + # make sure objective expression is linear or quadratic and not a variable + if isinstance(model.objective_expr, Var): + model.objective_expr = model.objective_expr + 0 + + # get objective offset + constant = model.objective_expr.constant + + # get linear part of objective + linear = {} + linear_part = model.objective_expr.get_linear_part() + for x in linear_part.iter_variables(): + linear[var_names[x]] = linear_part.get_coef(x) + + # get quadratic part of objective + quadratic = {} + if isinstance(model.objective_expr, QuadExpr): + for quad_triplet in model.objective_expr.iter_quad_triplets(): + i = var_names[quad_triplet[0]] + j = var_names[quad_triplet[1]] + v = quad_triplet[2] + quadratic[i, j] = v + + # set objective + if minimize: + quadratic_program.minimize(constant, linear, quadratic) + else: + quadratic_program.maximize(constant, linear, quadratic) + + # get linear constraints + for constraint in model.iter_constraints(): + if isinstance(constraint, DocplexQuadraticConstraint): + # ignore quadratic constraints here and process them later + continue + if not isinstance(constraint, DocplexLinearConstraint) or isinstance( + constraint, NotEqualConstraint + ): + # If any constraint is not linear/quadratic constraints, it raises an error. + # Notice that NotEqualConstraint is a subclass of Docplex's LinearConstraint, + # but it cannot be handled by optimization. + raise QiskitOptimizationError("Unsupported constraint: {}".format(constraint)) + name = constraint.name + sense = constraint.sense + + left_expr = constraint.get_left_expr() + right_expr = constraint.get_right_expr() + # for linear constraints we may get an instance of Var instead of expression, + # e.g. x + y = z + if isinstance(left_expr, Var): + left_expr = left_expr + 0 + if isinstance(right_expr, Var): + right_expr = right_expr + 0 + + rhs = right_expr.constant - left_expr.constant + + lhs = {} + for x in left_expr.iter_variables(): + lhs[var_names[x]] = left_expr.get_coef(x) + for x in right_expr.iter_variables(): + lhs[var_names[x]] = lhs.get(var_names[x], 0.0) - right_expr.get_coef(x) + + if sense == sense.EQ: + quadratic_program.linear_constraint(lhs, "==", rhs, name) + elif sense == sense.GE: + quadratic_program.linear_constraint(lhs, ">=", rhs, name) + elif sense == sense.LE: + quadratic_program.linear_constraint(lhs, "<=", rhs, name) + else: + raise QiskitOptimizationError("Unsupported constraint sense: {}".format(constraint)) + + # get quadratic constraints + for constraint in model.iter_quadratic_constraints(): + name = constraint.name + sense = constraint.sense + + left_expr = constraint.get_left_expr() + right_expr = constraint.get_right_expr() + + rhs = right_expr.constant - left_expr.constant + linear = {} + quadratic = {} + + if left_expr.is_quad_expr(): + for x in left_expr.linear_part.iter_variables(): + linear[var_names[x]] = left_expr.linear_part.get_coef(x) + for quad_triplet in left_expr.iter_quad_triplets(): + i = var_names[quad_triplet[0]] + j = var_names[quad_triplet[1]] + v = quad_triplet[2] + quadratic[i, j] = v + else: + for x in left_expr.iter_variables(): + linear[var_names[x]] = left_expr.get_coef(x) + + if right_expr.is_quad_expr(): + for x in right_expr.linear_part.iter_variables(): + linear[var_names[x]] = linear.get( + var_names[x], 0.0 + ) - right_expr.linear_part.get_coef(x) + for quad_triplet in right_expr.iter_quad_triplets(): + i = var_names[quad_triplet[0]] + j = var_names[quad_triplet[1]] + v = quad_triplet[2] + quadratic[i, j] = quadratic.get((i, j), 0.0) - v + else: + for x in right_expr.iter_variables(): + linear[var_names[x]] = linear.get(var_names[x], 0.0) - right_expr.get_coef(x) + + if sense == sense.EQ: + quadratic_program.quadratic_constraint(linear, quadratic, "==", rhs, name) + elif sense == sense.GE: + quadratic_program.quadratic_constraint(linear, quadratic, ">=", rhs, name) + elif sense == sense.LE: + quadratic_program.quadratic_constraint(linear, quadratic, "<=", rhs, name) + else: + raise QiskitOptimizationError("Unsupported constraint sense: {}".format(constraint)) + + return quadratic_program diff --git a/qiskit_optimization/translators/gurobipy.py b/qiskit_optimization/translators/gurobipy.py new file mode 100644 index 000000000..c019a383c --- /dev/null +++ b/qiskit_optimization/translators/gurobipy.py @@ -0,0 +1,292 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Translator between a gurobipy model and a quadratic program""" + +from typing import TYPE_CHECKING, cast + +try: + import gurobipy as gp + from gurobipy import Model + + _HAS_GUROBI = True +except ImportError: + _HAS_GUROBI = False + + class Model: # type: ignore + """Empty Model class + Replacement if gurobipy.Model is not present. + """ + + pass + + +from qiskit.exceptions import MissingOptionalLibraryError +from qiskit_optimization.exceptions import QiskitOptimizationError +from qiskit_optimization.problems.constraint import Constraint +from qiskit_optimization.problems.quadratic_objective import QuadraticObjective +from qiskit_optimization.problems.variable import Variable + +if TYPE_CHECKING: + # pylint: disable=cyclic-import + from qiskit_optimization.problems.quadratic_program import QuadraticProgram + + +def _check_gurobipy_is_installed(name: str): + if not _HAS_GUROBI: + raise MissingOptionalLibraryError( + libname="GUROBI", + name=name, + pip_install="pip install qiskit-optimization[gurobi]", + ) + + +def to_gurobipy(quadratic_program: "QuadraticProgram") -> Model: + """Returns a gurobipy model corresponding to a quadratic program. + + Args: + quadratic_program: The quadratic program to be translated. + + Returns: + The gurobipy model corresponding to a quadratic program. + + Raises: + QiskitOptimizationError: if non-supported elements (should never happen). + MissingOptionalLibraryError: if gurobipy is not installed. + """ + + _check_gurobipy_is_installed("to_gurobipy") + + # initialize model + mdl = gp.Model(quadratic_program.name) + + # add variables + var = {} + for idx, x in enumerate(quadratic_program.variables): + if x.vartype == Variable.Type.CONTINUOUS: + var[idx] = mdl.addVar( + vtype=gp.GRB.CONTINUOUS, lb=x.lowerbound, ub=x.upperbound, name=x.name + ) + elif x.vartype == Variable.Type.BINARY: + var[idx] = mdl.addVar(vtype=gp.GRB.BINARY, name=x.name) + elif x.vartype == Variable.Type.INTEGER: + var[idx] = mdl.addVar( + vtype=gp.GRB.INTEGER, lb=x.lowerbound, ub=x.upperbound, name=x.name + ) + else: + # should never happen + raise QiskitOptimizationError("Unsupported variable type: {}".format(x.vartype)) + + # add objective + objective = quadratic_program.objective.constant + for i, v in quadratic_program.objective.linear.to_dict().items(): + objective += v * var[cast(int, i)] + for (i, j), v in quadratic_program.objective.quadratic.to_dict().items(): + objective += v * var[cast(int, i)] * var[cast(int, j)] + if quadratic_program.objective.sense == QuadraticObjective.Sense.MINIMIZE: + mdl.setObjective(objective, sense=gp.GRB.MINIMIZE) + else: + mdl.setObjective(objective, sense=gp.GRB.MAXIMIZE) + + # add linear constraints + for i, l_constraint in enumerate(quadratic_program.linear_constraints): + name = l_constraint.name + rhs = l_constraint.rhs + if rhs == 0 and l_constraint.linear.coefficients.nnz == 0: + continue + linear_expr = 0 + for j, v in l_constraint.linear.to_dict().items(): + linear_expr += v * var[cast(int, j)] + sense = l_constraint.sense + if sense == Constraint.Sense.EQ: + mdl.addConstr(linear_expr == rhs, name=name) + elif sense == Constraint.Sense.GE: + mdl.addConstr(linear_expr >= rhs, name=name) + elif sense == Constraint.Sense.LE: + mdl.addConstr(linear_expr <= rhs, name=name) + else: + # should never happen + raise QiskitOptimizationError("Unsupported constraint sense: {}".format(sense)) + + # add quadratic constraints + for i, q_constraint in enumerate(quadratic_program.quadratic_constraints): + name = q_constraint.name + rhs = q_constraint.rhs + if ( + rhs == 0 + and q_constraint.linear.coefficients.nnz == 0 + and q_constraint.quadratic.coefficients.nnz == 0 + ): + continue + quadratic_expr = 0 + for j, v in q_constraint.linear.to_dict().items(): + quadratic_expr += v * var[cast(int, j)] + for (j, k), v in q_constraint.quadratic.to_dict().items(): + quadratic_expr += v * var[cast(int, j)] * var[cast(int, k)] + sense = q_constraint.sense + if sense == Constraint.Sense.EQ: + mdl.addConstr(quadratic_expr == rhs, name=name) + elif sense == Constraint.Sense.GE: + mdl.addConstr(quadratic_expr >= rhs, name=name) + elif sense == Constraint.Sense.LE: + mdl.addConstr(quadratic_expr <= rhs, name=name) + else: + # should never happen + raise QiskitOptimizationError("Unsupported constraint sense: {}".format(sense)) + + return mdl + + +def from_gurobipy(model: Model) -> "QuadraticProgram": + """Translate a gurobipy model into a quadratic program. + + Note that this supports only basic functions of gurobipy as follows: + - quadratic objective function + - linear / quadratic constraints + - binary / integer / continuous variables + + Args: + model: The gurobipy model to be loaded. + + Returns: + The quadratic program corresponding to the model. + + Raises: + QiskitOptimizationError: if the model contains unsupported elements. + MissingOptionalLibraryError: if gurobipy is not installed. + """ + + _check_gurobipy_is_installed("from_gurobipy") + + if not isinstance(model, Model): + raise QiskitOptimizationError(f"The model is not compatible: {model}") + + # pylint: disable=cyclic-import + from qiskit_optimization.problems.quadratic_program import QuadraticProgram + + quadratic_program = QuadraticProgram() + + # Update the model to make sure everything works as expected + model.update() + + # get name + quadratic_program.name = model.ModelName + + # get variables + # keep track of names separately, since gurobipy allows to have None names. + var_names = {} + for x in model.getVars(): + if x.vtype == gp.GRB.CONTINUOUS: + x_new = quadratic_program.continuous_var(x.lb, x.ub, x.VarName) + elif x.vtype == gp.GRB.BINARY: + x_new = quadratic_program.binary_var(x.VarName) + elif x.vtype == gp.GRB.INTEGER: + x_new = quadratic_program.integer_var(x.lb, x.ub, x.VarName) + else: + raise QiskitOptimizationError( + "Unsupported variable type: {} {}".format(x.VarName, x.vtype) + ) + var_names[x] = x_new.name + + # objective sense + minimize = model.ModelSense == gp.GRB.MINIMIZE + + # Retrieve the objective + objective = model.getObjective() + has_quadratic_objective = False + + # Retrieve the linear part in case it is a quadratic objective + if isinstance(objective, gp.QuadExpr): + linear_part = objective.getLinExpr() + has_quadratic_objective = True + else: + linear_part = objective + + # Get the constant + constant = linear_part.getConstant() + + # get linear part of objective + linear = {} + for i in range(linear_part.size()): + linear[var_names[linear_part.getVar(i)]] = linear_part.getCoeff(i) + + # get quadratic part of objective + quadratic = {} + if has_quadratic_objective: + for i in range(objective.size()): + x = var_names[objective.getVar1(i)] + y = var_names[objective.getVar2(i)] + v = objective.getCoeff(i) + quadratic[x, y] = v + + # set objective + if minimize: + quadratic_program.minimize(constant, linear, quadratic) + else: + quadratic_program.maximize(constant, linear, quadratic) + + # check whether there are any general constraints + if model.NumSOS > 0 or model.NumGenConstrs > 0: + raise QiskitOptimizationError("Unsupported constraint: SOS or General Constraint") + + # get linear constraints + for constraint in model.getConstrs(): + name = constraint.ConstrName + sense = constraint.Sense + + left_expr = model.getRow(constraint) + rhs = constraint.RHS + + lhs = {} + for i in range(left_expr.size()): + lhs[var_names[left_expr.getVar(i)]] = left_expr.getCoeff(i) + + if sense == gp.GRB.EQUAL: + quadratic_program.linear_constraint(lhs, "==", rhs, name) + elif sense == gp.GRB.GREATER_EQUAL: + quadratic_program.linear_constraint(lhs, ">=", rhs, name) + elif sense == gp.GRB.LESS_EQUAL: + quadratic_program.linear_constraint(lhs, "<=", rhs, name) + else: + raise QiskitOptimizationError("Unsupported constraint sense: {}".format(constraint)) + + # get quadratic constraints + for constraint in model.getQConstrs(): + name = constraint.QCName + sense = constraint.QCSense + + left_expr = model.getQCRow(constraint) + rhs = constraint.QCRHS + + linear = {} + quadratic = {} + + linear_part = left_expr.getLinExpr() + for i in range(linear_part.size()): + linear[var_names[linear_part.getVar(i)]] = linear_part.getCoeff(i) + + for i in range(left_expr.size()): + x = var_names[left_expr.getVar1(i)] + y = var_names[left_expr.getVar2(i)] + v = left_expr.getCoeff(i) + quadratic[x, y] = v + + if sense == gp.GRB.EQUAL: + quadratic_program.quadratic_constraint(linear, quadratic, "==", rhs, name) + elif sense == gp.GRB.GREATER_EQUAL: + quadratic_program.quadratic_constraint(linear, quadratic, ">=", rhs, name) + elif sense == gp.GRB.LESS_EQUAL: + quadratic_program.quadratic_constraint(linear, quadratic, "<=", rhs, name) + else: + raise QiskitOptimizationError("Unsupported constraint sense: {}".format(constraint)) + + return quadratic_program diff --git a/releasenotes/notes/add-model-translators-11e7f3b53574afa7.yaml b/releasenotes/notes/add-model-translators-11e7f3b53574afa7.yaml new file mode 100644 index 000000000..a666fb10e --- /dev/null +++ b/releasenotes/notes/add-model-translators-11e7f3b53574afa7.yaml @@ -0,0 +1,18 @@ +--- +features: + - | + Adds model translators between modeling libraries (e.g., docplex and gurobipy) and ``QuadraticProgram``. + Adds translator functions :meth:`~qiskit_optimization.translators.from_docplex_mp`, + :meth:`~qiskit_optimization.translators.to_docplex_mp`, + :meth:`~qiskit_optimization.translators.from_gurobipy`, and + :meth:`~qiskit_optimization.translators.to_gurobipy` + to :mod:`~qiskit_optimization.translators`. +upgrade: + - | + :meth:`~qiskit_optimization.problems.QuadraticProgram.pprint_as_string` and + :meth:`~qiskit_optimization.problems.QuadraticProgram.prettyprint` have been removed, + which were deprecated in Qiskit Aqua 0.8.0 release (October 2020). +deprecations: + - | + ``QuadraticProgram.from_docplex``, ``QuadraticProgram.to_docplex`` are deprecated because + ``from_docplex_mp`` and ``to_docplex_mp`` cover the features. diff --git a/test/algorithms/test_admm.py b/test/algorithms/test_admm.py index 774484c55..5a8cf6c57 100644 --- a/test/algorithms/test_admm.py +++ b/test/algorithms/test_admm.py @@ -23,6 +23,7 @@ ADMMState, ) from qiskit_optimization.problems import QuadraticProgram +from qiskit_optimization.translators import from_docplex_mp class TestADMMOptimizer(QiskitOptimizationTestCase): @@ -34,8 +35,7 @@ def test_admm_maximization(self): c = mdl.continuous_var(lb=0, ub=10, name="c") x = mdl.binary_var(name="x") mdl.maximize(c + x * x) - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) admm_params = ADMMParameters() @@ -75,8 +75,7 @@ def test_admm_ex4(self): mdl.add_constraint(2 * v + 10 * w + t <= 3, "cons1") mdl.add_constraint(v + w + t >= b, "cons2") - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) admm_params = ADMMParameters( rho_initial=1001, beta=1000, factor_c=900, maxiter=100, three_block=False @@ -112,8 +111,7 @@ def test_admm_ex4_no_bin_var_in_objective(self): mdl.add_constraint(2 * v + 10 * w + t <= 3, "cons1") mdl.add_constraint(v + w + t >= b, "cons2") - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) admm_params = ADMMParameters( rho_initial=1001, beta=1000, factor_c=900, maxiter=100, three_block=False @@ -148,8 +146,7 @@ def test_admm_ex5(self): mdl.add_constraint(v + w + t >= 1, "cons2") mdl.add_constraint(v + w == 1, "cons3") - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) admm_params = ADMMParameters( rho_initial=1001, beta=1000, factor_c=900, maxiter=100, three_block=False @@ -181,8 +178,7 @@ def test_admm_ex5_warm_start(self): mdl.add_constraint(v + w + t >= 1, "cons2") mdl.add_constraint(v + w == 1, "cons3") - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) admm_params = ADMMParameters( rho_initial=1001, @@ -224,8 +220,7 @@ def test_admm_ex6(self): mdl.add_constraint(v + w + t >= 1, "cons2") mdl.add_constraint(v + w == 1, "cons3") - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) admm_params = ADMMParameters( rho_initial=1001, @@ -264,8 +259,7 @@ def test_admm_ex6_max(self): mdl.add_constraint(v + w + t >= 1, "cons2") mdl.add_constraint(v + w == 1, "cons3") - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) admm_params = ADMMParameters( rho_initial=1001, @@ -301,8 +295,7 @@ def test_equality_constraints_with_continuous_variables(self): mdl.add_constraint(2 * v + w >= 2, "cons1") mdl.add_constraint(w + t == 1, "cons2") - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) admm_params = ADMMParameters( rho_initial=1001, @@ -335,8 +328,7 @@ def test_quad_constraints(self): mdl.add_constraint(v + w >= 1, "cons2") mdl.add_constraint(v ** 2 + w ** 2 <= 1, "cons2") - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) admm_params = ADMMParameters( rho_initial=1001, @@ -378,8 +370,7 @@ def test_integer_variables(self): w = mdl.continuous_var(name="w", lb=0.0) mdl.minimize(v + w) - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) solver = ADMMOptimizer() solution = solver.solve(op) diff --git a/test/algorithms/test_grover_optimizer.py b/test/algorithms/test_grover_optimizer.py index 893920dc5..792973dd1 100644 --- a/test/algorithms/test_grover_optimizer.py +++ b/test/algorithms/test_grover_optimizer.py @@ -34,6 +34,7 @@ QuadraticProgramToQubo, ) from qiskit_optimization.problems import QuadraticProgram +from qiskit_optimization.translators import from_docplex_mp @ddt @@ -74,8 +75,7 @@ def test_qubo_gas_int_zero(self): x_0 = model.binary_var(name="x0") x_1 = model.binary_var(name="x1") model.minimize(0 * x_0 + 0 * x_1) - op = QuadraticProgram() - op.from_docplex(model) + op = from_docplex_mp(model) # Will not find a negative, should return 0. gmf = GroverOptimizer(1, num_iterations=1, quantum_instance=self.sv_simulator) @@ -92,8 +92,7 @@ def test_qubo_gas_int_simple(self): x_0 = model.binary_var(name="x0") x_1 = model.binary_var(name="x1") model.minimize(-x_0 + 2 * x_1) - op = QuadraticProgram() - op.from_docplex(model) + op = from_docplex_mp(model) # Get the optimum key and value. gmf = GroverOptimizer(4, num_iterations=self.n_iter, quantum_instance=self.sv_simulator) @@ -112,8 +111,7 @@ def test_qubo_gas_int_simple_maximize(self): x_0 = model.binary_var(name="x0") x_1 = model.binary_var(name="x1") model.maximize(-x_0 + 2 * x_1) - op = QuadraticProgram() - op.from_docplex(model) + op = from_docplex_mp(model) # Get the optimum key and value. gmf = GroverOptimizer(4, num_iterations=self.n_iter, quantum_instance=self.sv_simulator) @@ -133,8 +131,7 @@ def test_qubo_gas_int_paper_example(self, simulator): x_1 = model.binary_var(name="x1") x_2 = model.binary_var(name="x2") model.minimize(-x_0 + 2 * x_1 - 3 * x_2 - 2 * x_0 * x_2 - 1 * x_1 * x_2) - op = QuadraticProgram() - op.from_docplex(model) + op = from_docplex_mp(model) # Get the optimum key and value. q_instance = self.sv_simulator if simulator == "sv" else self.qasm_simulator @@ -150,8 +147,7 @@ def test_converter_list(self): x_0 = model.binary_var(name="x0") x_1 = model.binary_var(name="x1") model.maximize(-x_0 + 2 * x_1) - op = QuadraticProgram() - op.from_docplex(model) + op = from_docplex_mp(model) # Get the optimum key and value. # a single converter. @@ -231,8 +227,7 @@ def test_bit_ordering(self, simulator): x = mdl.binary_var("x") y = mdl.binary_var("y") mdl.minimize(x - 2 * y) - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) opt_sol = -2 success = OptimizationResultStatus.SUCCESS grover_optimizer = GroverOptimizer( diff --git a/test/algorithms/test_gurobi_optimizer.py b/test/algorithms/test_gurobi_optimizer.py index 6a3e756f9..e562a1900 100644 --- a/test/algorithms/test_gurobi_optimizer.py +++ b/test/algorithms/test_gurobi_optimizer.py @@ -14,7 +14,9 @@ import unittest from test.optimization_test_case import QiskitOptimizationTestCase, requires_extra_library -from ddt import ddt, data + +from ddt import data, ddt + from qiskit_optimization.algorithms import GurobiOptimizer from qiskit_optimization.problems import QuadraticProgram diff --git a/test/algorithms/test_min_eigen_optimizer.py b/test/algorithms/test_min_eigen_optimizer.py index 885ee9804..c91afaa18 100644 --- a/test/algorithms/test_min_eigen_optimizer.py +++ b/test/algorithms/test_min_eigen_optimizer.py @@ -39,6 +39,7 @@ QuadraticProgramToQubo, ) from qiskit_optimization.problems import QuadraticProgram +from qiskit_optimization.translators import from_docplex_mp @ddt @@ -87,8 +88,7 @@ def setUp(self): x = mdl.binary_var("x") y = mdl.binary_var("y") mdl.minimize(x - 2 * y) - self.op_ordering = QuadraticProgram() - self.op_ordering.from_docplex(mdl) + self.op_ordering = from_docplex_mp(mdl) @data( ("exact", None, "op_ip1.lp"), diff --git a/test/algorithms/test_warm_start_qaoa.py b/test/algorithms/test_warm_start_qaoa.py index 78b336117..417b66f77 100644 --- a/test/algorithms/test_warm_start_qaoa.py +++ b/test/algorithms/test_warm_start_qaoa.py @@ -29,6 +29,7 @@ WarmStartQAOAOptimizer, ) from qiskit_optimization.applications.max_cut import Maxcut +from qiskit_optimization.translators import from_docplex_mp class TestWarmStartQAOAOptimizer(QiskitOptimizationTestCase): @@ -80,8 +81,7 @@ def test_constrained_binary(self): model.add_constraint(2 * v + 10 * w + t <= 3, "cons1") model.add_constraint(v + w + t >= 2, "cons2") - problem = QuadraticProgram() - problem.from_docplex(model) + problem = from_docplex_mp(model) backend = BasicAer.get_backend("statevector_simulator") qaoa = QAOA(quantum_instance=backend, reps=1) @@ -109,8 +109,7 @@ def test_simple_qubo(self): v = model.binary_var(name="v") model.minimize((u - v + 2) ** 2) - problem = QuadraticProgram() - problem.from_docplex(model) + problem = from_docplex_mp(model) backend = BasicAer.get_backend("statevector_simulator") qaoa = QAOA(quantum_instance=backend, reps=1) diff --git a/test/converters/test_converters.py b/test/converters/test_converters.py index 48c5089e9..727c1a0a9 100644 --- a/test/converters/test_converters.py +++ b/test/converters/test_converters.py @@ -37,6 +37,7 @@ MaximizeToMinimize, ) from qiskit_optimization.problems import Constraint, Variable +from qiskit_optimization.translators import from_docplex_mp logger = logging.getLogger(__name__) @@ -480,8 +481,7 @@ def test_continuous_variable_decode(self): c = mdl.continuous_var(lb=0, ub=10.9, name="c") x = mdl.binary_var(name="x") mdl.maximize(c + x * x) - op = QuadraticProgram() - op.from_docplex(mdl) + op = from_docplex_mp(mdl) converter = IntegerToBinary() op = converter.convert(op) admm_params = ADMMParameters() diff --git a/test/problems/test_quadratic_program.py b/test/problems/test_quadratic_program.py index c86bed3ee..a46f6347a 100644 --- a/test/problems/test_quadratic_program.py +++ b/test/problems/test_quadratic_program.py @@ -14,6 +14,7 @@ import tempfile import unittest +import warnings from os import path from test.optimization_test_case import QiskitOptimizationTestCase, requires_extra_library @@ -881,7 +882,10 @@ def test_write_to_lp_file(self): q_p.write_to_lp_file("") def test_docplex(self): - """test from_docplex and to_docplex""" + """DEPRECATED test from_docplex and to_docplex + + This test will be removed when `from_docplex` and `to_docplex` are removed. + """ q_p = QuadraticProgram("test") q_p.binary_var(name="x") q_p.integer_var(name="y", lowerbound=-2, upperbound=4) @@ -894,7 +898,9 @@ def test_docplex(self): q_p.linear_constraint({"x": 2, "z": -1}, "==", 1) q_p.quadratic_constraint({"x": 2, "z": -1}, {("y", "z"): 3}, "==", 1) q_p2 = QuadraticProgram() - q_p2.from_docplex(q_p.to_docplex()) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + q_p2.from_docplex(q_p.to_docplex()) self.assertEqual(q_p.export_as_lp_string(), q_p2.export_as_lp_string()) mod = Model("test") @@ -909,34 +915,44 @@ def test_docplex(self): with self.assertRaises(QiskitOptimizationError): mod = Model() mod.semiinteger_var(lb=1, name="x") - q_p.from_docplex(mod) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + q_p.from_docplex(mod) with self.assertRaises(QiskitOptimizationError): mod = Model() x = mod.binary_var("x") mod.add_range(0, 2 * x, 1) - q_p.from_docplex(mod) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + q_p.from_docplex(mod) with self.assertRaises(QiskitOptimizationError): mod = Model() x = mod.binary_var("x") y = mod.binary_var("y") mod.add_indicator(x, x + y <= 1, 1) - q_p.from_docplex(mod) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + q_p.from_docplex(mod) with self.assertRaises(QiskitOptimizationError): mod = Model() x = mod.binary_var("x") y = mod.binary_var("y") mod.add_equivalence(x, x + y <= 1, 1) - q_p.from_docplex(mod) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + q_p.from_docplex(mod) with self.assertRaises(QiskitOptimizationError): mod = Model() x = mod.binary_var("x") y = mod.binary_var("y") mod.add(mod.not_equal_constraint(x, y + 1)) - q_p.from_docplex(mod) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + q_p.from_docplex(mod) # test from_docplex without explicit variable names mod = Model() @@ -951,7 +967,9 @@ def test_docplex(self): mod.add_constraint(x * y >= z) # quadratic GE mod.add_constraint(x * y <= z) # quadratic LE q_p = QuadraticProgram() - q_p.from_docplex(mod) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + q_p.from_docplex(mod) var_names = [v.name for v in q_p.variables] self.assertListEqual(var_names, ["x0", "x1", "x2"]) senses = [Constraint.Sense.EQ, Constraint.Sense.GE, Constraint.Sense.LE] @@ -965,76 +983,6 @@ def test_docplex(self): self.assertDictEqual(c.quadratic.to_dict(use_name=True), {("x0", "x1"): 1}) self.assertEqual(c.sense, senses[i]) - def test_gurobipy(self): - """test from_gurobipy and to_gurobipy""" - try: - import gurobipy as gp - except ImportError as ex: - self.skipTest("gurobipy not installed: {}".format(str(ex))) - return - q_p = QuadraticProgram("test") - q_p.binary_var(name="x") - q_p.integer_var(name="y", lowerbound=-2, upperbound=4) - q_p.continuous_var(name="z", lowerbound=-1.5, upperbound=3.2) - q_p.minimize(constant=1, linear={"x": 1, "y": 2}, quadratic={("x", "y"): -1, ("z", "z"): 2}) - q_p.linear_constraint({"x": 2, "z": -1}, "==", 1) - q_p.quadratic_constraint({"x": 2, "z": -1}, {("y", "z"): 3}, "==", 1) - q_p2 = QuadraticProgram() - q_p2.from_gurobipy(q_p.to_gurobipy()) - self.assertEqual(q_p.export_as_lp_string(), q_p2.export_as_lp_string()) - - mod = gp.Model("test") - x = mod.addVar(vtype=gp.GRB.BINARY, name="x") - y = mod.addVar(vtype=gp.GRB.INTEGER, lb=-2, ub=4, name="y") - z = mod.addVar(vtype=gp.GRB.CONTINUOUS, lb=-1.5, ub=3.2, name="z") - mod.setObjective(1 + x + 2 * y - x * y + 2 * z * z) - mod.optimize() - mod.addConstr(2 * x - z == 1, name="c0") - mod.addConstr(2 * x - z + 3 * y * z == 1, name="q0") - - # Here I am unsure what to do, let's come back to it later - # self.assertEqual(q_p.export_as_lp_string(), mod.export_as_lp_string()) - - with self.assertRaises(QiskitOptimizationError): - mod = gp.Model() - mod.addVar(vtype=gp.GRB.SEMIINT, lb=1, name="x") - q_p.from_gurobipy(mod) - - with self.assertRaises(QiskitOptimizationError): - mod = gp.Model() - x = mod.addVar(vtype=gp.GRB.BINARY, name="x") - y = mod.addVar(vtype=gp.GRB.BINARY, name="y") - mod.addConstr((x == 1) >> (x + y <= 1)) - q_p.from_gurobipy(mod) - - # test from_gurobipy without explicit variable names - mod = gp.Model() - x = mod.addVar(vtype=gp.GRB.BINARY) - y = mod.addVar(vtype=gp.GRB.CONTINUOUS) - z = mod.addVar(vtype=gp.GRB.INTEGER) - mod.setObjective(x + y + z + x * y + y * z + x * z) - mod.optimize() - mod.addConstr(x + y == z) # linear EQ - mod.addConstr(x + y >= z) # linear GE - mod.addConstr(x + y <= z) # linear LE - mod.addConstr(x * y == z) # quadratic EQ - mod.addConstr(x * y >= z) # quadratic GE - mod.addConstr(x * y <= z) # quadratic LE - q_p = QuadraticProgram() - q_p.from_gurobipy(mod) - var_names = [v.name for v in q_p.variables] - self.assertListEqual(var_names, ["C0", "C1", "C2"]) - senses = [Constraint.Sense.EQ, Constraint.Sense.GE, Constraint.Sense.LE] - for i, c in enumerate(q_p.linear_constraints): - self.assertDictEqual(c.linear.to_dict(use_name=True), {"C0": 1, "C1": 1, "C2": -1}) - self.assertEqual(c.rhs, 0) - self.assertEqual(c.sense, senses[i]) - for i, c in enumerate(q_p.quadratic_constraints): - self.assertEqual(c.rhs, 0) - self.assertDictEqual(c.linear.to_dict(use_name=True), {"C2": -1}) - self.assertDictEqual(c.quadratic.to_dict(use_name=True), {("C0", "C1"): 1}) - self.assertEqual(c.sense, senses[i]) - def test_substitute_variables(self): """test substitute variables""" q_p = QuadraticProgram("test") @@ -1119,23 +1067,16 @@ def test_substitute_variables(self): def test_feasibility(self): """Tests feasibility methods.""" - mod = Model("test") - # 0, 5 - x = mod.continuous_var( - -1, - 1, - "x", - ) - y = mod.continuous_var(-10, 10, "y") - mod.minimize(x + y) - mod.add(x + y <= 10, "c0") - mod.add(x + y >= -10, "c1") - mod.add(x + y == 5, "c2") - mod.add(x * x + y <= 10, "c3") - mod.add(x * x + y >= 5, "c4") - mod.add(x * x + y * y == 25, "c5") - q_p = QuadraticProgram() - q_p.from_docplex(mod) + q_p = QuadraticProgram("test") + _ = q_p.continuous_var(-1, 1, "x") + _ = q_p.continuous_var(-10, 10, "y") + q_p.minimize(linear={"x": 1, "y": 1}) + q_p.linear_constraint({"x": 1, "y": 1}, "<=", 10, "c0") + q_p.linear_constraint({"x": 1, "y": 1}, ">=", -10, "c1") + q_p.linear_constraint({"x": 1, "y": 1}, "==", 5, "c2") + q_p.quadratic_constraint({"y": 1}, {("x", "x"): 1}, "<=", 10, "c3") + q_p.quadratic_constraint({"y": 1}, {("x", "x"): 1}, ">=", 5, "c4") + q_p.quadratic_constraint(None, {("x", "x"): 1, ("y", "y"): 1}, "==", 25, "c5") self.assertTrue(q_p.is_feasible([0, 5])) self.assertFalse(q_p.is_feasible([1, 10])) diff --git a/test/translators/__init__.py b/test/translators/__init__.py new file mode 100755 index 000000000..6cf51fe8c --- /dev/null +++ b/test/translators/__init__.py @@ -0,0 +1,13 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +""" Translators test packages """ diff --git a/test/translators/test_docplex_mp.py b/test/translators/test_docplex_mp.py new file mode 100644 index 000000000..66fea9cdc --- /dev/null +++ b/test/translators/test_docplex_mp.py @@ -0,0 +1,108 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Test from_docplex_mp and to_docplex_mp""" + +from test.optimization_test_case import QiskitOptimizationTestCase + +from docplex.mp.model import Model + +from qiskit_optimization.exceptions import QiskitOptimizationError +from qiskit_optimization.problems import Constraint, QuadraticProgram +from qiskit_optimization.translators.docplex_mp import from_docplex_mp, to_docplex_mp + + +class TestDocplexMpTranslator(QiskitOptimizationTestCase): + """Test from_docplex_mp and to_docplex_mp""" + + def test_from_and_to(self): + """test from_docplex_mp and to_docplex_mp""" + q_p = QuadraticProgram("test") + q_p.binary_var(name="x") + q_p.integer_var(name="y", lowerbound=-2, upperbound=4) + q_p.continuous_var(name="z", lowerbound=-1.5, upperbound=3.2) + q_p.minimize( + constant=1, + linear={"x": 1, "y": 2}, + quadratic={("x", "y"): -1, ("z", "z"): 2}, + ) + q_p.linear_constraint({"x": 2, "z": -1}, "==", 1) + q_p.quadratic_constraint({"x": 2, "z": -1}, {("y", "z"): 3}, "==", 1) + q_p2 = from_docplex_mp(to_docplex_mp(q_p)) + self.assertEqual(q_p.export_as_lp_string(), q_p2.export_as_lp_string()) + + mod = Model("test") + x = mod.binary_var("x") + y = mod.integer_var(-2, 4, "y") + z = mod.continuous_var(-1.5, 3.2, "z") + mod.minimize(1 + x + 2 * y - x * y + 2 * z * z) + mod.add(2 * x - z == 1, "c0") + mod.add(2 * x - z + 3 * y * z == 1, "q0") + self.assertEqual(q_p.export_as_lp_string(), mod.export_as_lp_string()) + + with self.assertRaises(QiskitOptimizationError): + mod = Model() + mod.semiinteger_var(lb=1, name="x") + _ = from_docplex_mp(mod) + + with self.assertRaises(QiskitOptimizationError): + mod = Model() + x = mod.binary_var("x") + mod.add_range(0, 2 * x, 1) + _ = from_docplex_mp(mod) + + with self.assertRaises(QiskitOptimizationError): + mod = Model() + x = mod.binary_var("x") + y = mod.binary_var("y") + mod.add_indicator(x, x + y <= 1, 1) + _ = from_docplex_mp(mod) + + with self.assertRaises(QiskitOptimizationError): + mod = Model() + x = mod.binary_var("x") + y = mod.binary_var("y") + mod.add_equivalence(x, x + y <= 1, 1) + _ = from_docplex_mp(mod) + + with self.assertRaises(QiskitOptimizationError): + mod = Model() + x = mod.binary_var("x") + y = mod.binary_var("y") + mod.add(mod.not_equal_constraint(x, y + 1)) + _ = from_docplex_mp(mod) + + # test from_docplex without explicit variable names + mod = Model() + x = mod.binary_var() + y = mod.continuous_var() + z = mod.integer_var() + mod.minimize(x + y + z + x * y + y * z + x * z) + mod.add_constraint(x + y == z) # linear EQ + mod.add_constraint(x + y >= z) # linear GE + mod.add_constraint(x + y <= z) # linear LE + mod.add_constraint(x * y == z) # quadratic EQ + mod.add_constraint(x * y >= z) # quadratic GE + mod.add_constraint(x * y <= z) # quadratic LE + q_p = from_docplex_mp(mod) + var_names = [v.name for v in q_p.variables] + self.assertListEqual(var_names, ["x0", "x1", "x2"]) + senses = [Constraint.Sense.EQ, Constraint.Sense.GE, Constraint.Sense.LE] + for i, c in enumerate(q_p.linear_constraints): + self.assertDictEqual(c.linear.to_dict(use_name=True), {"x0": 1, "x1": 1, "x2": -1}) + self.assertEqual(c.rhs, 0) + self.assertEqual(c.sense, senses[i]) + for i, c in enumerate(q_p.quadratic_constraints): + self.assertEqual(c.rhs, 0) + self.assertDictEqual(c.linear.to_dict(use_name=True), {"x2": -1}) + self.assertDictEqual(c.quadratic.to_dict(use_name=True), {("x0", "x1"): 1}) + self.assertEqual(c.sense, senses[i]) diff --git a/test/translators/test_gurobi.py b/test/translators/test_gurobi.py new file mode 100644 index 000000000..915a1b359 --- /dev/null +++ b/test/translators/test_gurobi.py @@ -0,0 +1,89 @@ +# This code is part of Qiskit. +# +# (C) Copyright IBM 2021. +# +# This code is licensed under the Apache License, Version 2.0. You may +# obtain a copy of this license in the LICENSE.txt file in the root directory +# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0. +# +# Any modifications or derivative works of this code must retain this +# copyright notice, and modified files need to carry a notice indicating +# that they have been altered from the originals. + +"""Test from_gurobipy and to_gurobipy""" + +from test.optimization_test_case import QiskitOptimizationTestCase, requires_extra_library + +from qiskit_optimization.exceptions import QiskitOptimizationError +from qiskit_optimization.problems import Constraint, QuadraticProgram +from qiskit_optimization.translators.gurobipy import from_gurobipy, to_gurobipy + + +class TestGurobiTranslator(QiskitOptimizationTestCase): + """Test from_gurobipy and to_gurobipy""" + + @requires_extra_library + def test_from_and_to(self): + """test from_gurobipy and to_gurobipy""" + q_p = QuadraticProgram("test") + q_p.binary_var(name="x") + q_p.integer_var(name="y", lowerbound=-2, upperbound=4) + q_p.continuous_var(name="z", lowerbound=-1.5, upperbound=3.2) + q_p.minimize(constant=1, linear={"x": 1, "y": 2}, quadratic={("x", "y"): -1, ("z", "z"): 2}) + q_p.linear_constraint({"x": 2, "z": -1}, "==", 1) + q_p.quadratic_constraint({"x": 2, "z": -1}, {("y", "z"): 3}, "==", 1) + q_p2 = from_gurobipy(to_gurobipy(q_p)) + self.assertEqual(q_p.export_as_lp_string(), q_p2.export_as_lp_string()) + + import gurobipy as gp + + mod = gp.Model("test") + x = mod.addVar(vtype=gp.GRB.BINARY, name="x") + y = mod.addVar(vtype=gp.GRB.INTEGER, lb=-2, ub=4, name="y") + z = mod.addVar(vtype=gp.GRB.CONTINUOUS, lb=-1.5, ub=3.2, name="z") + mod.setObjective(1 + x + 2 * y - x * y + 2 * z * z) + mod.optimize() + mod.addConstr(2 * x - z == 1, name="c0") + mod.addConstr(2 * x - z + 3 * y * z == 1, name="q0") + + # Here I am unsure what to do, let's come back to it later + # self.assertEqual(q_p.export_as_lp_string(), mod.export_as_lp_string()) + + with self.assertRaises(QiskitOptimizationError): + mod = gp.Model() + mod.addVar(vtype=gp.GRB.SEMIINT, lb=1, name="x") + _ = from_gurobipy(mod) + + with self.assertRaises(QiskitOptimizationError): + mod = gp.Model() + x = mod.addVar(vtype=gp.GRB.BINARY, name="x") + y = mod.addVar(vtype=gp.GRB.BINARY, name="y") + mod.addConstr((x == 1) >> (x + y <= 1)) + _ = from_gurobipy(mod) + + # test from_gurobipy without explicit variable names + mod = gp.Model() + x = mod.addVar(vtype=gp.GRB.BINARY) + y = mod.addVar(vtype=gp.GRB.CONTINUOUS) + z = mod.addVar(vtype=gp.GRB.INTEGER) + mod.setObjective(x + y + z + x * y + y * z + x * z) + mod.optimize() + mod.addConstr(x + y == z) # linear EQ + mod.addConstr(x + y >= z) # linear GE + mod.addConstr(x + y <= z) # linear LE + mod.addConstr(x * y == z) # quadratic EQ + mod.addConstr(x * y >= z) # quadratic GE + mod.addConstr(x * y <= z) # quadratic LE + q_p = from_gurobipy(mod) + var_names = [v.name for v in q_p.variables] + self.assertListEqual(var_names, ["C0", "C1", "C2"]) + senses = [Constraint.Sense.EQ, Constraint.Sense.GE, Constraint.Sense.LE] + for i, c in enumerate(q_p.linear_constraints): + self.assertDictEqual(c.linear.to_dict(use_name=True), {"C0": 1, "C1": 1, "C2": -1}) + self.assertEqual(c.rhs, 0) + self.assertEqual(c.sense, senses[i]) + for i, c in enumerate(q_p.quadratic_constraints): + self.assertEqual(c.rhs, 0) + self.assertDictEqual(c.linear.to_dict(use_name=True), {"C2": -1}) + self.assertDictEqual(c.quadratic.to_dict(use_name=True), {("C0", "C1"): 1}) + self.assertEqual(c.sense, senses[i])