{ "cells": [ { "cell_type": "markdown", "id": "f69e1833-fcac-45ad-b97e-cf6854c101e1", "metadata": {}, "source": [ "# 05 - ADMM Optimizer\n", "### Modified for use with Quantum Rings toolkit for Qiskit 2.x" ] }, { "cell_type": "code", "execution_count": 1, "id": "ea11a07e-bf13-4169-b586-bcf029a351f5", "metadata": {}, "outputs": [], "source": [ "# This code is from the tutorial at:\n", "# https://qiskit-community.github.io/qiskit-optimization/tutorials/05_admm_optimizer.html\n", "\n", "# Modified for use with Quantum Rings SDK" ] }, { "cell_type": "code", "execution_count": 2, "id": "18d1c690-741e-4d0a-8072-6bb00cfc2116", "metadata": {}, "outputs": [], "source": [ "#\n", "# Setup your account\n", "# You can also save your account locally using the class method QrRuntimeService.save_account(...) and\n", "# invoke the QrRuntimeService class constructor without any arguments.\n", "#\n", "\n", "import os\n", "my_token = os.environ[\"QR_TOKEN\"]\n", "my_name = os.environ[\"QR_ACCOUNT\"]\n", "\n", "#\n", "# Set the backend of your choice, depending upon the task and your hardware configuration.\n", "# See SDK documentation for additional help.\n", "#\n", "\n", "my_backend = \"scarlet_quantum_rings\"" ] }, { "cell_type": "code", "execution_count": 3, "id": "eef2a950-d26e-4a4e-93ce-0f66554afbc4", "metadata": {}, "outputs": [], "source": [ "# Import from Quantum Rings Toolkit\n", "from quantumrings.toolkit.qiskit import QrRuntimeService\n", "\n", "# Acquire Quantum Rings backend\n", "qr_services = QrRuntimeService(name = my_name, token = my_token)\n", "qr_backend = qr_services.backend(name = my_backend, precision = \"single\")" ] }, { "cell_type": "markdown", "id": "7c1207a0-93ed-467d-81f4-fdd92f50465b", "metadata": {}, "source": [ "# Initialization" ] }, { "cell_type": "code", "execution_count": 4, "id": "df8b51b6-451d-4a02-8e71-fb61793c95be", "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", "\n", "# Switch to Quantum Rings's Sampler\n", "#from qiskit.primitives import Sampler\n", "from quantumrings.toolkit.qiskit import QrSamplerV2 as Sampler\n", "\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": "code", "execution_count": 5, "id": "8aeb3cba-74f0-4857-bdb9-4ddcc70b4467", "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(backend = qr_backend), 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", "id": "605c2852-1213-481a-ac20-8a75986bfe83", "metadata": {}, "source": [ "# Example" ] }, { "cell_type": "code", "execution_count": 6, "id": "31ae6c67-aa9b-4493-a198-f77ee029e753", "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", "id": "9182d467-c78c-4afc-b701-334d508482d8", "metadata": {}, "source": [ "# Classical Solution" ] }, { "cell_type": "code", "execution_count": 7, "id": "eec9fc96-4ab3-4bb7-82bf-67b22e5ce943", "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", "id": "9151720d-91bd-4ba7-887a-024b4dad3ea2", "metadata": {}, "source": [ "# Calling 3-ADMM-H algorithm" ] }, { "cell_type": "code", "execution_count": 8, "id": "d6e9a85e-c44f-41f4-a229-764acb232092", "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": 9, "id": "38eb0715-ec73-4be6-8ed6-a07209b5a6b8", "metadata": {}, "outputs": [], "source": [ "# run ADMM to solve problem\n", "result = admm.solve(qp)" ] }, { "cell_type": "markdown", "id": "1e823fa4-956c-4cb4-9ff6-59b02ba1e431", "metadata": {}, "source": [ "# Classical Solver Result" ] }, { "cell_type": "code", "execution_count": 10, "id": "17ff4b3d-bf60-4d67-ab8a-c6d0a5915a26", "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": 11, "id": "84277d01-dcf8-4aa5-9c5d-fb928037fc0e", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "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", "id": "bc5d796d-f203-4d8e-9523-8c607f3787dc", "metadata": {}, "source": [ "# Quantum Solution" ] }, { "cell_type": "code", "execution_count": 12, "id": "c01f0c9a-6f7f-4a71-9093-58874c9d4f4e", "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": 13, "id": "26afe748-c6f4-4b1e-9c8a-1603c1c8ef4f", "metadata": {}, "outputs": [], "source": [ "# run ADMM to solve problem\n", "result_q = admm_q.solve(qp)" ] }, { "cell_type": "markdown", "id": "00de8302-ae01-4ad7-9852-0e04ab1c32bb", "metadata": {}, "source": [ "# Quantum Solver Results" ] }, { "cell_type": "code", "execution_count": 14, "id": "b80336e5-ff4a-4ee7-aec6-608c7a286ab2", "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": 15, "id": "04587ef5-7b00-4348-990f-0ee90222fd35", "metadata": {}, "outputs": [ { "data": { "image/png": "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Cx4FpjjW4bF27VpfQkKC74knnvBt377dN3/+fF/16tV9f/zjHwPbTJ061XyH/OUvf/F9/PHHvhtvvNHXtGlT33fffWe17NFm8ODBvkaNGvkWLVrk27Fjh+/NN9/0paen+8aOHRvYhmN97iNGN27caBaNGzNmzDDXv/766wof12uuucbXsWNH35o1a3zvvfeeGYE6cOBAXzgQgCLoueeeM/85JCUlmWHxq1evtl2kqKcfqvKWP/zhD4Ft9MN09913++rUqWP+E/nJT35iQhLCH4A41uHzt7/9zdemTRvzw6lVq1a+F154IeR+HUY8YcIEX0ZGhtmmZ8+evm3btlkrb7TKz88372H9bk5JSfE1a9bM9/DDD/sKCwsD23Csz83y5cvL/X7W0FnR43r48GETeFJTU321atXyDRkyxASrcIjTf86/HgkAACB60AcIAADEHAIQAACIOQQgAAAQcwhAAAAg5hCAAABAzCEAAQCAmEMAAgAAMYcABAAAYg4BCABEpEmTJjJz5kzbxQAQIQQgABF3xx13SL9+/cz1q6++WkaOHBmx5543b57Url37lPUffPCBDBs2LGLlAGBXguXnB4CwKCoqkqSkpHN+/A9+8IOwlgeAu1EDBMBqTdDKlSvlmWeekbi4OLN89dVX5r5NmzZJ3759JTU1VTIyMuT222+XQ4cOBR6rNUf33nuvqT1KT0+XPn36mPUzZsyQtm3bSo0aNaRx48Zy9913y9GjR819K1askCFDhkheXl7g+R599NFym8B27twpN954o3n+WrVqyU9/+lPZv39/4H59XIcOHeSVV14xj01LS5MBAwbIkSNHAtv8+c9/NmWpVq2a1KtXT3r16iXHjh2LwJEFcCYEIADWaPDJzs6WoUOHyr59+8yioSU3N1d+9KMfSceOHWXdunWyZMkSEz40hAR76aWXTK3Pf//7X5kzZ45ZFx8fL88++6xs3rzZ3P/uu+/K2LFjzX3dunUzIUcDjfN8o0ePPqVcXq/XhJ9vvvnGBLSlS5fKl19+Kf379w/Z7osvvpC3335bFi1aZBbddurUqeY+3ffAgQPl5z//uWzdutWEr5tuukk4/zTgDjSBAbBGa000wFSvXl0yMzMD62fNmmXCz5NPPhlY9+KLL5pw9Nlnn8kll1xi1rVo0UKmT58ess/g/kRaM/P444/LXXfdJb/97W/Nc+lzas1P8POdbNmyZfLJJ5/Ijh07zHOql19+WS677DLTV6hz586BoKR9imrWrGluay2VPvaJJ54wAaikpMSEnosuusjcr7VBANyBGiAArvPRRx/J8uXLTfOTs7Rq1SpQ6+LIyso65bH/+te/pGfPntKoUSMTTDSUHD58WAoKCir8/Fpjo8HHCT+qdevWpvO03hccsJzwoxo0aCAHDhww19u3b2/KoaHn1ltvlblz58q33357DkcDQGUgAAFwHe2zc/3118uHH34Ysmzfvl2uuuqqwHbazyeY9h/63//9X2nXrp288cYbsn79epk9e3agk3S4JSYmhtzWmiWtFVIej8c0nS1evNiEp+eee05atmxpapUA2EcAAmCVNkuVlpaGrLv88stNHx6tYWnevHnIcnLoCaaBRwPI008/LT/84Q9NU9nevXvP+Hwnu/TSS2XXrl1mcWzZssX0TdIwU1EaiK644gp57LHHZOPGjea533rrrQo/HkDlIQABsEpDzpo1a0ztjY7y0gBzzz33mA7I2olY+9xos9c//vEPM4Lr+8KLBqTi4mJT26KdlnWEltM5Ovj5tIZJ++ro85XXNKajtbTp6rbbbpMNGzbI2rVrZdCgQdKjRw/p1KlThV6Xvibtw6SduHVE2ZtvvikHDx404QqAfQQgAFbpKCxtLtKaFZ2LR8NCw4YNzcguDTu9e/c2YUQ7N2sfHB3ldTra70aHwU+bNk3atGkj8+fPlylTpoRsoyPBtFO0jujS5zu5E7VTc/OXv/xF6tSpY5rcNBA1a9ZMFixYUOHXpSPN/v3vf8u1115raqIeeeQRUzOlQ/sB2BfnY0wmAACIMdQAAQCAmEMAAgAAMYcABAAAYg4BCAAAxBwCEAAAiDkEIAAAEHMIQAAAIOYQgAAAQMwhAAEAgJhDAAIAADGHAAQAACTW/H8TiwpECrR7TQAAAABJRU5ErkJggg==", "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": 16, "id": "4b72b64d-4736-4559-a6a2-98c9297f540f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "

Version Information

SoftwareVersion
qiskit2.2.1
qiskit_optimization0.7.0
qiskit_algorithms0.4.0
qiskit_aer0.17.1
qiskit_ibm_runtime0.40.1
System information
Python version3.12.9
OSWindows
Tue Oct 21 15:28:01 2025 Mountain Daylight Time
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

Quantum Rings Version Information

SoftwareVersion
QuantumRingsLib0.11.0
quantumrings-toolkit-qiskit0.2.0
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

This code is a part of a Qiskit project

© Copyright IBM 2017, 2025.

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.

Modifications (c) Copyright Quantum Rings Inc, 2025
Modified from the originals
Added support for Quantum Rings toolkit for Qiskit.

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import tutorial_magics\n", "\n", "%qiskit_version_table\n", "%quantumrings_version_table\n", "%qiskit_copyright" ] }, { "cell_type": "code", "execution_count": null, "id": "e066e093-87b3-4ac1-8966-30ec65f342e7", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.9" } }, "nbformat": 4, "nbformat_minor": 5 }