{ "cells": [ { "cell_type": "markdown", "id": "8cb30689-a8da-4bc8-abd8-1a9d8864bda8", "metadata": {}, "source": [ "# 10 - Warm-starting quantum optimization\n", "### Modified for use with Quantum Rings toolkit for Qiskit 2.x" ] }, { "cell_type": "code", "execution_count": 1, "id": "55e49736-4a18-4714-90ae-d8ecc493e9af", "metadata": {}, "outputs": [], "source": [ "# This code is from the tutorial at:\n", "# https://qiskit-community.github.io/qiskit-optimization/tutorials/10_warm_start_qaoa.html\n", "\n", "# Modified for Quantum Rings SDK" ] }, { "cell_type": "code", "execution_count": 2, "id": "ab5a5e6e-d05f-43a0-93ec-4f46774ea124", "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", "#\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": "0b13e6a2-091a-4753-8c29-a1ac93e537b6", "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": "code", "execution_count": 4, "id": "e8389463-c551-43c4-8c81-8338ca0140e7", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import copy\n", "\n", "# Problem modelling imports\n", "from docplex.mp.model import Model\n", "\n", "# Qiskit imports\n", "from qiskit_algorithms import QAOA, NumPyMinimumEigensolver\n", "from qiskit_algorithms.optimizers import COBYLA\n", "from qiskit_algorithms.utils import algorithm_globals\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 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\n", "from qiskit_optimization.translators import from_docplex_mp" ] }, { "cell_type": "markdown", "id": "797206c9-b083-4291-883a-a38636855e8f", "metadata": {}, "source": [ "# Preliminaries: relaxing QUBOs" ] }, { "cell_type": "code", "execution_count": 5, "id": "8882d62a-3b1f-4077-9fed-1f298591ca27", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Problem name: docplex_model1\n", "\n", "Maximize\n", " -2.15956824*x0^2 - 0.03075656*x0*x1 - 0.44910424*x0*x2 + 0.27371876*x0*x3\n", " + 0.04067172*x0*x4 + 0.0335906*x0*x5 - 0.21845774*x1^2 + 0.12173696*x1*x2\n", " + 0.008018*x1*x3 - 0.02683716*x1*x4 - 0.0591748*x1*x5 - 1.970706*x2^2\n", " - 0.09229252*x2*x3 + 0.2099914*x2*x4 - 0.03616476*x2*x5 - 1.2087634*x3^2\n", " - 0.1496046*x3*x4 + 0.03781288*x3*x5 - 1.59679268*x4^2 - 0.30467804*x4*x5\n", " - 2.16929088*x5^2 + 3.418*x0 + 2.0913*x1 + 6.2415*x2 + 4.4436*x3 + 10.892*x4\n", " + 3.4051*x5\n", "\n", "Subject to\n", " Linear constraints (1)\n", " x0 + x1 + x2 + x3 + x4 + x5 == 3 'c0'\n", "\n", " Binary variables (6)\n", " x0 x1 x2 x3 x4 x5\n", "\n" ] } ], "source": [ "def create_problem(mu: np.array, sigma: np.array, total: int = 3) -> QuadraticProgram:\n", " \"\"\"Solve the quadratic program using docplex.\"\"\"\n", "\n", " mdl = Model()\n", " x = [mdl.binary_var(\"x%s\" % i) for i in range(len(sigma))]\n", "\n", " objective = mdl.sum([mu[i] * x[i] for i in range(len(mu))])\n", " objective -= 2 * mdl.sum(\n", " [sigma[i, j] * x[i] * x[j] for i in range(len(mu)) for j in range(len(mu))]\n", " )\n", " mdl.maximize(objective)\n", " cost = mdl.sum(x)\n", " mdl.add_constraint(cost == total)\n", "\n", " qp = from_docplex_mp(mdl)\n", " return qp\n", "\n", "\n", "def relax_problem(problem) -> QuadraticProgram:\n", " \"\"\"Change all variables to continuous.\"\"\"\n", " relaxed_problem = copy.deepcopy(problem)\n", " for variable in relaxed_problem.variables:\n", " variable.vartype = VarType.CONTINUOUS\n", "\n", " return relaxed_problem\n", "\n", "mu = np.array([3.418, 2.0913, 6.2415, 4.4436, 10.892, 3.4051])\n", "sigma = np.array(\n", " [\n", " [1.07978412, 0.00768914, 0.11227606, -0.06842969, -0.01016793, -0.00839765],\n", " [0.00768914, 0.10922887, -0.03043424, -0.0020045, 0.00670929, 0.0147937],\n", " [0.11227606, -0.03043424, 0.985353, 0.02307313, -0.05249785, 0.00904119],\n", " [-0.06842969, -0.0020045, 0.02307313, 0.6043817, 0.03740115, -0.00945322],\n", " [-0.01016793, 0.00670929, -0.05249785, 0.03740115, 0.79839634, 0.07616951],\n", " [-0.00839765, 0.0147937, 0.00904119, -0.00945322, 0.07616951, 1.08464544],\n", " ]\n", ")\n", "\n", "qubo = create_problem(mu, sigma)\n", "print(qubo.prettyprint())" ] }, { "cell_type": "code", "execution_count": 6, "id": "81e89f19-00ad-4d4d-9e75-193876d151fa", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "objective function value: 16.7689322\n", "variable values: x0=0.0, x1=0.0, x2=1.0, x3=1.0, x4=1.0, x5=0.0\n", "status: SUCCESS\n" ] } ], "source": [ "result = CplexOptimizer().solve(qubo)\n", "print(result.prettyprint())" ] }, { "cell_type": "code", "execution_count": 7, "id": "95e01db4-1d86-4d8d-9596-90d3db2dbf66", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Problem name: docplex_model1\n", "\n", "Minimize\n", " 44.84880018*x0^2 + 85.40922044*x0*x1 + 85.82756812*x0*x2\n", " + 85.10474511999999*x0*x3 + 85.33779215999999*x0*x4 + 85.34487328*x0*x5\n", " + 42.90768968*x1^2 + 85.25672692*x1*x2 + 85.37044588*x1*x3 + 85.40530104*x1*x4\n", " + 85.43763867999999*x1*x5 + 44.65993794*x2^2 + 85.4707564*x2*x3\n", " + 85.16847247999999*x2*x4 + 85.41462863999999*x2*x5 + 43.89799534*x3^2\n", " + 85.52806848*x3*x4 + 85.34065100000001*x3*x5 + 44.28602462*x4^2\n", " + 85.68314192*x4*x5 + 44.85852282*x5^2 - 259.55339164*x0\n", " - 258.22669163999996*x1 - 262.37689163999994*x2 - 260.57899163999997*x3\n", " - 267.02739163999996*x4 - 259.54049163999997*x5 + 384.20308746\n", "\n", "Subject to\n", " No constraints\n", "\n", " Continuous variables (6)\n", " 0 <= x0 <= 1\n", " 0 <= x1 <= 1\n", " 0 <= x2 <= 1\n", " 0 <= x3 <= 1\n", " 0 <= x4 <= 1\n", " 0 <= x5 <= 1\n", "\n" ] } ], "source": [ "qp = relax_problem(QuadraticProgramToQubo().convert(qubo))\n", "print(qp.prettyprint())" ] }, { "cell_type": "code", "execution_count": 8, "id": "15fb5d09-1c72-4a46-8721-3e5c9e073042", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "objective function value: -17.01205502568274\n", "variable values: x0=0.17524995761801201, x1=1.4803888163984595e-07, x2=0.9709053264087679, x3=0.7384168677494151, x4=0.9999999916475085, x5=0.14438904470168346\n", "status: SUCCESS\n" ] } ], "source": [ "sol = CplexOptimizer().solve(qp)\n", "print(sol.prettyprint())" ] }, { "cell_type": "code", "execution_count": 9, "id": "c0d80069-512b-4edb-8994-86e31ab1e87d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.17524995761801201, 1.4803888163984595e-07, 0.9709053264087679, 0.7384168677494151, 0.9999999916475085, 0.14438904470168346]\n" ] } ], "source": [ "c_stars = sol.samples[0].x\n", "print(c_stars)" ] }, { "cell_type": "markdown", "id": "3404f2f6-4ae5-4ddf-80f0-1502af2397cd", "metadata": {}, "source": [ "# QAOA" ] }, { "cell_type": "code", "execution_count": 10, "id": "315312b2-f3ca-45c7-a402-440d900888b7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "objective function value: 16.768932200000002\n", "variable values: x0=0.0, x1=0.0, x2=1.0, x3=1.0, x4=1.0, x5=0.0\n", "status: SUCCESS\n" ] } ], "source": [ "algorithm_globals.random_seed = 12345\n", "qaoa_mes = QAOA(sampler=Sampler(backend = qr_backend), optimizer=COBYLA(), initial_point=[0.0, 1.0])\n", "exact_mes = NumPyMinimumEigensolver()\n", "\n", "qaoa = MinimumEigenOptimizer(qaoa_mes)\n", "\n", "qaoa_result = qaoa.solve(qubo)\n", "print(qaoa_result.prettyprint())" ] }, { "cell_type": "code", "execution_count": 11, "id": "c488615b-8961-45f2-a197-8bc7ad84c512", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from qiskit import QuantumCircuit\n", "\n", "thetas = [2 * np.arcsin(np.sqrt(c_star)) for c_star in c_stars]\n", "\n", "init_qc = QuantumCircuit(len(sigma))\n", "for idx, theta in enumerate(thetas):\n", " init_qc.ry(theta, idx)\n", "\n", "init_qc.draw(output=\"mpl\", style=\"clifford\")" ] }, { "cell_type": "code", "execution_count": 12, "id": "8a03c506-4822-43cd-a88d-540b50505a2a", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from qiskit.circuit import Parameter\n", "\n", "beta = Parameter(\"β\")\n", "\n", "ws_mixer = QuantumCircuit(len(sigma))\n", "for idx, theta in enumerate(thetas):\n", " ws_mixer.ry(-theta, idx)\n", " ws_mixer.rz(-2 * beta, idx)\n", " ws_mixer.ry(theta, idx)\n", "\n", "ws_mixer.draw(output=\"mpl\", style=\"clifford\")" ] }, { "cell_type": "code", "execution_count": 13, "id": "6fe8fe8e-dd2e-4468-bc0f-46ef3ca4ebe8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "objective function value: 16.768932200000002\n", "variable values: x0=0.0, x1=0.0, x2=1.0, x3=1.0, x4=1.0, x5=0.0\n", "status: SUCCESS\n" ] } ], "source": [ "ws_qaoa_mes = QAOA(\n", " sampler=Sampler(backend = qr_backend),\n", " optimizer=COBYLA(),\n", " initial_state=init_qc,\n", " mixer=ws_mixer,\n", " initial_point=[0.0, 1.0],\n", ")\n", "\n", "ws_qaoa = MinimumEigenOptimizer(ws_qaoa_mes)\n", "\n", "ws_qaoa_result = ws_qaoa.solve(qubo)\n", "print(ws_qaoa_result.prettyprint())" ] }, { "cell_type": "markdown", "id": "07d4610d-d701-4512-9799-1fd002c7122a", "metadata": {}, "source": [ "# Analysis" ] }, { "cell_type": "code", "execution_count": 14, "id": "9d31c88a-b2b1-477d-b66b-a1ee5b6f1a36", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['001110: value: 16.769, probability: 0.0%',\n", " '011010: value: 15.744, probability: 0.0%',\n", " '001011: value: 14.671, probability: 0.0%',\n", " '101010: value: 14.626, probability: 0.0%',\n", " '010110: value: 14.234, probability: 0.0%',\n", " '100110: value: 13.953, probability: 0.0%',\n", " '000111: value: 13.349, probability: 0.0%',\n", " '110010: value: 12.410, probability: 0.0%',\n", " '010011: value: 12.013, probability: 0.1%',\n", " '100011: value: 11.559, probability: 0.0%']" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def format_qaoa_samples(samples, max_len: int = 10):\n", " qaoa_res = []\n", " for s in samples:\n", " if sum(s.x) == 3:\n", " qaoa_res.append((\"\".join([str(int(_)) for _ in s.x]), s.fval, s.probability))\n", "\n", " res = sorted(qaoa_res, key=lambda x: -x[1])[0:max_len]\n", "\n", " return [(_[0] + f\": value: {_[1]:.3f}, probability: {1e2*_[2]:.1f}%\") for _ in res]\n", "\n", "\n", "format_qaoa_samples(qaoa_result.samples)" ] }, { "cell_type": "code", "execution_count": 15, "id": "db28bc64-b48a-4673-b58f-11cbedfd1e84", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['001110: value: 16.769, probability: 56.0%',\n", " '001011: value: 14.671, probability: 0.0%',\n", " '101010: value: 14.626, probability: 0.0%']" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "format_qaoa_samples(ws_qaoa_result.samples)" ] }, { "cell_type": "markdown", "id": "7b5abf98-4104-411e-81e9-c5970ea17daf", "metadata": {}, "source": [ "# Warm-start QAOA" ] }, { "cell_type": "code", "execution_count": 16, "id": "a958de71-da61-4e1d-b559-aeff1a83b872", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "objective function value: 16.768932200000002\n", "variable values: x0=0.0, x1=0.0, x2=1.0, x3=1.0, x4=1.0, x5=0.0\n", "status: SUCCESS\n" ] } ], "source": [ "from qiskit_optimization.algorithms import WarmStartQAOAOptimizer\n", "\n", "qaoa_mes = QAOA(sampler=Sampler(backend = qr_backend), optimizer=COBYLA(), initial_point=[0.0, 1.0])\n", "ws_qaoa = WarmStartQAOAOptimizer(\n", " pre_solver=CplexOptimizer(), relax_for_pre_solver=True, qaoa=qaoa_mes, epsilon=0.0\n", ")\n", "\n", "ws_result = ws_qaoa.solve(qubo)\n", "print(ws_result.prettyprint())\n" ] }, { "cell_type": "code", "execution_count": 17, "id": "c125c19f-6a95-41b6-b3a0-0808a7c63ce4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['001110: value: 16.769, probability: 27.9%',\n", " '001011: value: 14.671, probability: 0.1%',\n", " '101010: value: 14.626, probability: 0.2%',\n", " '100110: value: 13.953, probability: 0.0%']" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "format_qaoa_samples(ws_result.samples)" ] }, { "cell_type": "code", "execution_count": 18, "id": "d218d188-b02c-42fe-afaf-f8844d7c4b7a", "metadata": {}, "outputs": [ { "data": { "text/html": [ "

Version Information

SoftwareVersion
qiskit2.2.1
qiskit_aer0.17.1
qiskit_optimization0.7.0
qiskit_algorithms0.4.0
qiskit_ibm_runtime0.40.1
System information
Python version3.12.9
OSWindows
Tue Oct 21 15:42:57 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" ] } ], "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 }