{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# ADMM Optimizer" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Introduction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The ADMM Optimizer can solve classes of mixed-binary constrained optimization problems, hereafter (MBCO), which often appear in logistic, finance, and operation research. In particular, the ADMM Optimizer here designed can tackle the following optimization problem $(P)$:\n", "\n", "$$\n", "\\min_{x \\in \\mathcal{X},u\\in\\mathcal{U} \\subseteq \\mathbb{R}^l } \\quad q(x) + \\varphi(u),\n", "$$\n", "\n", "subject to the constraints:\n", "\n", "$$\n", "\\mathrm{s.t.:~} \\quad G x = b, \\quad g(x) \\leq 0, \\quad \\ell(x, u) \\leq 0, \n", "$$\n", "\n", "with the corresponding functional assumptions.\n", "\n", "1. Function $q: \\mathbb{R}^n \\to \\mathbb{R}$ is quadratic, i.e., $q(x) = x^{\\intercal} Q x + a^{\\intercal} x$ for a given symmetric squared matrix $Q \\in \\mathbb{R}^n \\times \\mathbb{R}^n, Q = Q^{\\intercal}$, and vector $a \\in \\mathbb{R}^n$;\n", "2. The set $\\mathcal{X} = \\{0,1\\}^n = \\{x_{(i)} (1-x_{(i)}) = 0, \\forall i\\}$ enforces the binary constraints;\n", "3. Matrix $G\\in\\mathbb{R}^n \\times \\mathbb{R}^{n'}$, vector $b \\in \\mathbb{R}^{n'}$, and function $g: \\mathbb{R}^n \\to \\mathbb{R}$ is convex;\n", "4. Function $\\varphi: \\mathbb{R}^l \\to \\mathbb{R}$ is convex and $\\mathcal{U}$ is a convex set;\n", "5. Function $\\ell: \\mathbb{R}^n\\times \\mathbb{R}^l \\to \\mathbb{R}$ is *jointly* convex in $x, u$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In order to solve MBO problems, [1] proposed heuristics for $(P)$ based on the Alternating Direction Method of Multipliers (ADMM) [2]. ADMM is an operator splitting algorithm with a long history in convex optimization, and it is known to have residual, objective and dual variable convergence properties, provided that convexity assumptions are holding.\n", "\n", "The method of [1] (referred to as 3-ADMM-H) leverages the ADMM operator-splitting procedure to devise a decomposition for certain classes of MBOs into:\n", "\n", "- a QUBO subproblem to be solved by on the quantum device via variational algorithms, such as VQE or QAOA;\n", "- continuous convex constrained subproblem, which can be efficiently solved with classical optimization solvers.\n", "\n", "The algorithm 3-ADMM-H works as follows:\n", "\n", "0. Initialization phase (set the parameters and the QUBO and convex solvers);\n", "1. For each ADMM iterations ($k = 1, 2, \\ldots, $) until termination:\n", " - Solve a properly defined QUBO subproblem (with a classical or quantum solver);\n", " - Solve properly defined convex problems (with a classical solver);\n", " - Update the dual variables.\n", "2. Return optimizers and cost.\n", "\n", " \n", "A comprehensive discussion on the conditions for convergence, feasibility and optimality of the algorithm can be found in [1]. A variant with 2 ADMM blocks, namely a QUBO subproblem, and a continuous convex constrained subproblem, is also introduced in [1].\n", "\n", "## References\n", "\n", "[1] [C. Gambella and A. Simonetto, *Multi-block ADMM heuristics for mixed-binary optimization, on classical and quantum computers,* arXiv preprint arXiv:2001.02069 (2020).](https://arxiv.org/abs/2001.02069)\n", "\n", "[2] [S. Boyd, N. Parikh, E. Chu, B. Peleato, and J. Eckstein, *Distributed optimization and statistical learning via the alternating direction method of multipliers,* Foundations and Trends in Machine learning, 3, 1–122 (2011).](https://web.stanford.edu/~boyd/papers/pdf/admm_distr_stats.pdf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Initialization\n", "First of all we load all the packages that we need." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "\n", "from docplex.mp.model import Model\n", "\n", "from qiskit_algorithms import QAOA, NumPyMinimumEigensolver\n", "from qiskit_algorithms.optimizers import COBYLA\n", "from qiskit.primitives import Sampler\n", "from qiskit_optimization.algorithms import CobylaOptimizer, MinimumEigenOptimizer\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", "# but also as a reference to solve the QUBO, or even the full problem.\n", "#\n", "# from qiskit.optimization.algorithms import CplexOptimizer" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We first initialize all the algorithms we plan to use later in this tutorial.\n", "\n", "To solve the QUBO problems we can choose between \n", "\n", "- `MinimumEigenOptimizer` using different `MinimumEigensolver`, such as `SamplingVQE`, `QAOA` or `NumpyMinimumEigensolver` (classical)\n", "- `GroverOptimizer`\n", "- `CplexOptimizer` (classical, if CPLEX is installed)\n", "\n", "and to solve the convex continuous problems we can choose between the following classical solvers:\n", "\n", "- `CplexOptimizer` (if CPLEX is installed)\n", "- `CobylaOptimizer`\n", "\n", "In case CPLEX is not available, the `CobylaOptimizer` (for convex continuous problems) and the `MinimumEigenOptimizer` using the `NumpyMinimumEigensolver` (for QUBOs) can be used as classical alternatives to CPLEX for testing, validation, and benchmarking." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# define COBYLA optimizer to handle convex continuous problems.\n", "cobyla = CobylaOptimizer()\n", "\n", "# define QAOA via the minimum eigen optimizer\n", "qaoa = MinimumEigenOptimizer(QAOA(sampler=Sampler(), optimizer=COBYLA()))\n", "\n", "# exact QUBO solver as classical benchmark\n", "exact = MinimumEigenOptimizer(NumPyMinimumEigensolver()) # to solve QUBOs\n", "\n", "# in case CPLEX is installed it can also be used for the convex problems, the QUBO,\n", "# or as a benchmark for the full problem.\n", "#\n", "# cplex = CplexOptimizer()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example\n", "\n", "We test 3-ADMM-H algorithm on a simple Mixed-Binary Quadratic Problem with equality and inequality constraints (Example 6 reported in [1]). We first construct a docplex problem and then load it into a `QuadraticProgram`." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Problem name: ex6\n", "\n", "Minimize\n", " 5*u^2 + t - 20*u + v + w + 20\n", "\n", "Subject to\n", " Linear constraints (3)\n", " t + u + v + 2*w <= 3 'cons1'\n", " t + v + w >= 1 'cons2'\n", " v + w == 1 'cons3'\n", "\n", " Continuous variables (1)\n", " 0 <= u\n", "\n", " Binary variables (3)\n", " v w t\n", "\n" ] } ], "source": [ "# construct model using docplex\n", "mdl = Model(\"ex6\")\n", "\n", "v = mdl.binary_var(name=\"v\")\n", "w = mdl.binary_var(name=\"w\")\n", "t = mdl.binary_var(name=\"t\")\n", "u = mdl.continuous_var(name=\"u\")\n", "\n", "mdl.minimize(v + w + t + 5 * (u - 2) ** 2)\n", "mdl.add_constraint(v + 2 * w + t + u <= 3, \"cons1\")\n", "mdl.add_constraint(v + w + t >= 1, \"cons2\")\n", "mdl.add_constraint(v + w == 1, \"cons3\")\n", "\n", "# load quadratic program from docplex model\n", "qp = from_docplex_mp(mdl)\n", "print(qp.prettyprint())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Classical Solution\n", "\n", "3-ADMM-H needs a QUBO optimizer to solve the QUBO subproblem, and a continuous optimizer to solve the continuous convex constrained subproblem. We first solve the problem classically: we use the `MinimumEigenOptimizer` with the `NumPyMinimumEigenSolver` as a classical and exact QUBO solver and we use the `CobylaOptimizer` as a continuous convex solver. 3-ADMM-H supports any other suitable solver available in Qiskit optimization. For instance, `SamplingVQE`, `QAOA`, and `GroverOptimizer` can be invoked as quantum solvers, as demonstrated later.\n", "If CPLEX is installed, the `CplexOptimizer` can also be used as both, a QUBO and convex solver." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Parameters\n", "The 3-ADMM-H are wrapped in class `ADMMParameters`. Customized parameter values can be set as arguments of the class. In this example, parameters $\\rho, \\beta$ are initialized to $1001$ and $1000$, respectively. The penalization `factor_c` of equality constraints $Gx = b$ is set to $900$. The tolerance `tol` for primal residual convergence is set to `1.e-6`. \n", "In this case, the 3-block implementation is guaranteed to converge for Theorem 4 of [1], because the inequality constraint with the continuous variable is always active. The 2-block implementation can be run by setting `three_block=False`, and practically converges to a feasible not optimal solution. \n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "admm_params = ADMMParameters(\n", " rho_initial=1001, beta=1000, factor_c=900, maxiter=100, three_block=True, tol=1.0e-6\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Calling 3-ADMM-H algorithm\n", "To invoke the 3-ADMM-H algorithm, an instance of the `ADMMOptimizer` class needs to be created. This takes ADMM-specific parameters and the subproblem optimizers separately into the constructor. The solution returned is an instance of `OptimizationResult` class." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# define QUBO optimizer\n", "qubo_optimizer = exact\n", "# qubo_optimizer = cplex # uncomment to use CPLEX instead\n", "\n", "# define classical optimizer\n", "convex_optimizer = cobyla\n", "# convex_optimizer = cplex # uncomment to use CPLEX instead\n", "\n", "# initialize ADMM with classical QUBO and convex optimizer\n", "admm = ADMMOptimizer(\n", " params=admm_params, qubo_optimizer=qubo_optimizer, continuous_optimizer=convex_optimizer\n", ")" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# run ADMM to solve problem\n", "result = admm.solve(qp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Classical Solver Result\n", "The 3-ADMM-H solution can be then printed and visualized. The `x` attribute of the solution contains respectively, the\n", "values of the binary decision variables and the values of the continuous decision variables. The `fval` is the objective\n", "value of the solution." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "objective function value: 1.0\n", "variable values: v=1.0, w=0.0, t=0.0, u=2.0\n", "status: SUCCESS\n" ] } ], "source": [ "print(result.prettyprint())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Solution statistics can be accessed in the `state` field and visualized. We here display the convergence of 3-ADMM-H, in terms of primal residuals." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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9NBDGjhwoPr166f7779fqampmjhxol2nCQAAoojtAWjSpEk6cOCA5syZo7KyMmVkZKiwsNAcxFxaWiqns7GhasyYMXrxxRf1s5/9TPfee68GDhyo1157TUOGDDH3ueeee1RdXa3p06ersrJSF110kQoLCxUbG9npdgAAoH2yfR2gaNSR1gECAKCzOJW/37avBA0AAGA1AhAAAOh0CEAAAKDTIQABAIBOhwAEAAA6HQIQAADodAhAAACg0yEAAQCATocABAAAOh3bL4URjUKLY/t8PptLAgAAWir0d7slF7kgADXj8OHDkqS0tDSbSwIAAE7V4cOHlZCQ8JX7cC2wZgQCAe3du1fdu3eXw+GI6LF9Pp/S0tK0e/durjPWxqhr61DX1qGurUNdWydSdW0Yhg4fPqzU1NSwC6k3hxagZjidTn3jG99o0+eIj4/nA2UR6to61LV1qGvrUNfWiURdf13LTwiDoAEAQKdDAAIAAJ0OAchiXq9Xc+fOldfrtbsoHR51bR3q2jrUtXWoa+vYUdcMggYAAJ0OLUAAAKDTIQABAIBOhwAEAAA6HQIQAADodAhAFlq6dKnS09MVGxurrKwsbdiwwe4itXsFBQUaNWqUunfvrt69e2vixInasWNH2D7Hjh3TrbfeqjPOOENxcXG65pprVF5eblOJO4758+fL4XBo5syZ5jbqOnL27Nmj73//+zrjjDPUpUsXDR06VJs2bTLvNwxDc+bMUZ8+fdSlSxfl5ORo586dNpa4ffL7/br//vvVr18/denSRWeffbbmzZsXdi0p6rp1/vnPf+rKK69UamqqHA6HXnvttbD7W1Kvhw4d0vXXX6/4+HglJibqhz/8oY4cORKR8hGALLJy5Url5+dr7ty52rx5s4YPH67c3Fzt37/f7qK1a2vXrtWtt96qdevWafXq1aqrq9Nll12m6upqc5877rhDf/nLX/Tyyy9r7dq12rt3r66++mobS93+bdy4Ub/61a80bNiwsO3UdWR88cUXuvDCC+V2u/XGG2/ogw8+0GOPPaYePXqY+yxcuFBPPPGEli1bpvXr16tbt27Kzc3VsWPHbCx5+7NgwQI99dRTWrJkibZv364FCxZo4cKFevLJJ819qOvWqa6u1vDhw7V06dJm729JvV5//fV6//33tXr1aq1atUr//Oc/NX369MgU0IAlRo8ebdx6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9a1vacSIEdq0aZMKCwtVXl6u6667LuzxK1askMfj0b/+9S8tW7ZMkuR0OvXEE0/o/fff14oVK/Tmm2/qnnvukSSNGTNGixcvVnx8vPl8d9111wnlCgQCuuqqq3To0CGtXbtWq1ev1qeffqpJkyaF7ffJJ5/otdde06pVq7Rq1SqtXbtW8+fPlyTt27dPU6ZM0Q9+8ANt375da9as0dVXXy2uPw1EB7rAANgmISFBHo9HXbt2VUpKirl9yZIlGjFihB555BFz2zPPPKO0tDR99NFHOueccyRJAwcO1MKFC8OO2XQ8UXp6uh566CHdfPPN+uUvfymPx6OEhAQ5HI6w5zteUVGR/v3vf2vXrl1KS0uTJD333HM6//zztXHjRo0aNUpSMCg9++yz6t69uyTphhtuUFFRkR5++GHt27dP9fX1uvrqq3XWWWdJkoYOHXoatQUgkmgBAhB13n33Xb311luKi4szb4MGDZIUbHUJGTly5AmP/cc//qFx48apb9++6t69u2644QYdPHhQR48ebfHzb9++XWlpaWb4kaTBgwcrMTFR27dvN7elp6eb4UeS+vTpo/3790uShg8frnHjxmno0KG69tprtXz5cn3xxRctrwQAbYoABCDqHDlyRFdeeaW2bt0adtu5c6cuueQSc79u3bqFPe6zzz7Tf//3f2vYsGF65ZVXVFJSoqVLl0oKDpKONLfbHfazw+FQIBCQJLlcLq1evVpvvPGGBg8erCeffFLnnnuudu3aFfFyADh1BCAAtvJ4PPL7/WHbLrjgAr3//vtKT0/XgAEDwm7Hh56mSkpKFAgE9Nhjj+mb3/ymzjnnHO3du/drn+945513nnbv3q3du3eb2z744ANVVlZq8ODBLT43h8OhCy+8UA8++KC2bNkij8ejV199tcWPB9B2CEAAbJWenq7169frs88+U0VFhQKBgG699VYdOnRIU6ZM0caNG/XJJ5/ob3/7m/Ly8r4yvAwYMEB1dXV68skn9emnn+r55583B0c3fb4jR46oqKhIFRUVzXaN5eTkaOjQobr++uu1efNmbdiwQVOnTtXYsWOVmZnZovNav369HnnkEW3atEmlpaX64x//qAMHDui88847tQoC0CYIQABsddddd8nlcmnw4MHq1auXSktLlZqaqn/961/y+/267LLLNHToUM2cOVOJiYlyOk/+a2v48OFatGiRFixYoCFDhuiFF15QQUFB2D5jxozRzTffrEmTJqlXr14nDKKWgi03f/rTn9SjRw9dcsklysnJUf/+/bVy5coWn1d8fLz++c9/6vLLL9c555yjn/3sZ3rsscc0YcKEllcOgDbjMJiTCQAAOhlagAAAQKdDAAIAAJ0OAQgAAHQ6BCAAANDpEIAAAECnQwACAACdDgEIAAB0OgQgAADQ6RCAAABAp0MAAgAAnQ4BCAAAdDr/H1/DGGgmjLCZAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot(result.state.residuals)\n", "plt.xlabel(\"Iterations\")\n", "plt.ylabel(\"Residuals\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Quantum Solution\n", "We now solve the same optimization problem with QAOA as QUBO optimizer, running on simulated quantum device. \n", "First, one need to select the classical optimizer of the eigensolver QAOA. Then, the simulation backend is set. Finally, \n", "the eigensolver is wrapped into the `MinimumEigenOptimizer` class. A new instance of `ADMMOptimizer` is populated with QAOA as QUBO optimizer." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# define QUBO optimizer\n", "qubo_optimizer = qaoa\n", "\n", "# define classical optimizer\n", "convex_optimizer = cobyla\n", "# convex_optimizer = cplex # uncomment to use CPLEX instead\n", "\n", "# initialize ADMM with quantum QUBO optimizer and classical convex optimizer\n", "admm_q = ADMMOptimizer(\n", " params=admm_params, qubo_optimizer=qubo_optimizer, continuous_optimizer=convex_optimizer\n", ")" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# run ADMM to solve problem\n", "result_q = admm_q.solve(qp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Quantum Solver Results\n", "Here we present the results obtained from the quantum solver. As in the example above `x` stands for the solution, the `fval` is for objective value." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "objective function value: 1.0\n", "variable values: v=1.0, w=0.0, t=0.0, u=2.0\n", "status: SUCCESS\n" ] } ], "source": [ "print(result.prettyprint())" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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9NBDGjhwoPr166f7779fqampmjhxol2nCQAAoojtAWjSpEk6cOCA5syZo7KyMmVkZKiwsNAcxFxaWiqns7GhasyYMXrxxRf1s5/9TPfee68GDhyo1157TUOGDDH3ueeee1RdXa3p06ersrJSF110kQoLCxUbG9npdgAAoH2yfR2gaNSR1gECAKCzOJW/37avBA0AAGA1AhAAAOh0CEAAAKDTIQABAIBOhwAEAAA6HQIQAADodAhAAACg0yEAAQCATocABAAAOh3bL4URjUKLY/t8PptLAgAAWir0d7slF7kgADXj8OHDkqS0tDSbSwIAAE7V4cOHlZCQ8JX7cC2wZgQCAe3du1fdu3eXw+GI6LF9Pp/S0tK0e/durjPWxqhr61DX1qGurUNdWydSdW0Yhg4fPqzU1NSwC6k3hxagZjidTn3jG99o0+eIj4/nA2UR6to61LV1qGvrUNfWiURdf13LTwiDoAEAQKdDAAIAAJ0OAchiXq9Xc+fOldfrtbsoHR51bR3q2jrUtXWoa+vYUdcMggYAAJ0OLUAAAKDTIQABAIBOhwAEAAA6HQIQAADodAhAFlq6dKnS09MVGxurrKwsbdiwwe4itXsFBQUaNWqUunfvrt69e2vixInasWNH2D7Hjh3TrbfeqjPOOENxcXG65pprVF5eblOJO4758+fL4XBo5syZ5jbqOnL27Nmj73//+zrjjDPUpUsXDR06VJs2bTLvNwxDc+bMUZ8+fdSlSxfl5ORo586dNpa4ffL7/br//vvVr18/denSRWeffbbmzZsXdi0p6rp1/vnPf+rKK69UamqqHA6HXnvttbD7W1Kvhw4d0vXXX6/4+HglJibqhz/8oY4cORKR8hGALLJy5Url5+dr7ty52rx5s4YPH67c3Fzt37/f7qK1a2vXrtWtt96qdevWafXq1aqrq9Nll12m6upqc5877rhDf/nLX/Tyyy9r7dq12rt3r66++mobS93+bdy4Ub/61a80bNiwsO3UdWR88cUXuvDCC+V2u/XGG2/ogw8+0GOPPaYePXqY+yxcuFBPPPGEli1bpvXr16tbt27Kzc3VsWPHbCx5+7NgwQI99dRTWrJkibZv364FCxZo4cKFevLJJ819qOvWqa6u1vDhw7V06dJm729JvV5//fV6//33tXr1aq1atUr//Oc/NX369MgU0IAlRo8ebdx6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9a1vacSIEdq0aZMKCwtVXl6u6667LuzxK1askMfj0b/+9S8tW7ZMkuR0OvXEE0/o/fff14oVK/Tmm2/qnnvukSSNGTNGixcvVnx8vPl8d9111wnlCgQCuuqqq3To0CGtXbtWq1ev1qeffqpJkyaF7ffJJ5/otdde06pVq7Rq1SqtXbtW8+fPlyTt27dPU6ZM0Q9+8ANt375da9as0dVXXy2uPw1EB7rAANgmISFBHo9HXbt2VUpKirl9yZIlGjFihB555BFz2zPPPKO0tDR99NFHOueccyRJAwcO1MKFC8OO2XQ8UXp6uh566CHdfPPN+uUvfymPx6OEhAQ5HI6w5zteUVGR/v3vf2vXrl1KS0uTJD333HM6//zztXHjRo0aNUpSMCg9++yz6t69uyTphhtuUFFRkR5++GHt27dP9fX1uvrqq3XWWWdJkoYOHXoatQUgkmgBAhB13n33Xb311luKi4szb4MGDZIUbHUJGTly5AmP/cc//qFx48apb9++6t69u2644QYdPHhQR48ebfHzb9++XWlpaWb4kaTBgwcrMTFR27dvN7elp6eb4UeS+vTpo/3790uShg8frnHjxmno0KG69tprtXz5cn3xxRctrwQAbYoABCDqHDlyRFdeeaW2bt0adtu5c6cuueQSc79u3bqFPe6zzz7Tf//3f2vYsGF65ZVXVFJSoqVLl0oKDpKONLfbHfazw+FQIBCQJLlcLq1evVpvvPGGBg8erCeffFLnnnuudu3aFfFyADh1BCAAtvJ4PPL7/WHbLrjgAr3//vtKT0/XgAEDwm7Hh56mSkpKFAgE9Nhjj+mb3/ymzjnnHO3du/drn+945513nnbv3q3du3eb2z744ANVVlZq8ODBLT43h8OhCy+8UA8++KC2bNkij8ejV199tcWPB9B2CEAAbJWenq7169frs88+U0VFhQKBgG699VYdOnRIU6ZM0caNG/XJJ5/ob3/7m/Ly8r4yvAwYMEB1dXV68skn9emnn+r55583B0c3fb4jR46oqKhIFRUVzXaN5eTkaOjQobr++uu1efNmbdiwQVOnTtXYsWOVmZnZovNav369HnnkEW3atEmlpaX64x//qAMHDui88847tQoC0CYIQABsddddd8nlcmnw4MHq1auXSktLlZqaqn/961/y+/267LLLNHToUM2cOVOJiYlyOk/+a2v48OFatGiRFixYoCFDhuiFF15QQUFB2D5jxozRzTffrEmTJqlXr14nDKKWgi03f/rTn9SjRw9dcsklysnJUf/+/bVy5coWn1d8fLz++c9/6vLLL9c555yjn/3sZ3rsscc0YcKEllcOgDbjMJiTCQAAOhlagAAAQKdDAAIAAJ0OAQgAAHQ6BCAAANDpEIAAAECnQwACAACdDgEIAAB0OgQgAADQ6RCAAABAp0MAAgAAnQ4BCAAAdDr/H1/DGGgmjLCZAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.clf()\n", "plt.plot(result_q.state.residuals)\n", "plt.xlabel(\"Iterations\")\n", "plt.ylabel(\"Residuals\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "

Version Information

Qiskit SoftwareVersion
qiskit-terra0.23.0
qiskit-aer0.11.1
qiskit-optimization0.5.0
qiskit-machine-learning0.6.0
System information
Python version3.9.15
Python compilerClang 14.0.0 (clang-1400.0.29.102)
Python buildmain, Oct 11 2022 22:27:25
OSDarwin
CPUs4
Memory (Gb)16.0
Tue Dec 06 21:47:54 2022 JST
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

This code is a part of Qiskit

© Copyright IBM 2017, 2022.

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": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import tutorial_magics\n", "\n", "%qiskit_version_table\n", "%qiskit_copyright" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 4 }