{ "cells": [ { "cell_type": "markdown", "id": "c4b0ecb6-f9a7-4bfd-9378-536d77a8a030", "metadata": {}, "source": [ "# 03 - Minimum Eigen Optimizer\n", "### Modified for Quantum Rings toolkit for Qiskit 2.x" ] }, { "cell_type": "code", "execution_count": 1, "id": "d3357337-1596-4725-b1bd-a940c4dab6ba", "metadata": {}, "outputs": [], "source": [ "# This code is from the tutorial at:\n", "# https://qiskit-community.github.io/qiskit-optimization/tutorials/03_minimum_eigen_optimizer.html\n", "\n", "# Modified for use with Quantum Rings SDK" ] }, { "cell_type": "code", "execution_count": 2, "id": "1b265ada-a07a-4cfc-9087-57dbe4825d18", "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": "63396c70-d58d-495a-9596-0352d7e2071f", "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": "645b600f-8e3c-46ff-8748-8311197fd505", "metadata": {}, "outputs": [], "source": [ "from qiskit_algorithms.utils import algorithm_globals\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 (\n", " MinimumEigenOptimizer,\n", " RecursiveMinimumEigenOptimizer,\n", " SolutionSample,\n", " OptimizationResultStatus,\n", ")\n", "from qiskit_optimization import QuadraticProgram\n", "from qiskit.visualization import plot_histogram\n", "from typing import List, Tuple\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 5, "id": "383f5ae1-2028-4be2-97a8-b7b0783f710c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Problem name: \n", "\n", "Minimize\n", " x*y - x*z + 2*y*z + x - 2*y + 3*z\n", "\n", "Subject to\n", " No constraints\n", "\n", " Binary variables (3)\n", " x y z\n", "\n" ] } ], "source": [ "# create a QUBO\n", "qubo = QuadraticProgram()\n", "qubo.binary_var(\"x\")\n", "qubo.binary_var(\"y\")\n", "qubo.binary_var(\"z\")\n", "qubo.minimize(linear=[1, -2, 3], quadratic={(\"x\", \"y\"): 1, (\"x\", \"z\"): -1, (\"y\", \"z\"): 2})\n", "print(qubo.prettyprint())" ] }, { "cell_type": "code", "execution_count": 6, "id": "e9fe0345-9848-4b99-acc0-fa6d224ab0fd", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "offset: 1.5\n", "operator:\n", "SparsePauliOp(['IIZ', 'IZI', 'ZII', 'IZZ', 'ZIZ', 'ZZI'],\n", " coeffs=[-0.5 +0.j, 0.25+0.j, -1.75+0.j, 0.25+0.j, -0.25+0.j, 0.5 +0.j])\n" ] } ], "source": [ "op, offset = qubo.to_ising()\n", "print(\"offset: {}\".format(offset))\n", "print(\"operator:\")\n", "print(op)" ] }, { "cell_type": "code", "execution_count": 7, "id": "bfae70e3-dfd7-4ca6-a444-542b00f9cba1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Problem name: \n", "\n", "Minimize\n", " x0*x1 - x0*x2 + 2*x1*x2 + x0 - 2*x1 + 3*x2\n", "\n", "Subject to\n", " No constraints\n", "\n", " Binary variables (3)\n", " x0 x1 x2\n", "\n" ] } ], "source": [ "qp = QuadraticProgram()\n", "qp.from_ising(op, offset, linear=True)\n", "print(qp.prettyprint())" ] }, { "cell_type": "code", "execution_count": 8, "id": "5f389ab6-3142-4503-bff4-620df7bbf794", "metadata": {}, "outputs": [], "source": [ "algorithm_globals.random_seed = 10598\n", "qaoa_mes = QAOA(sampler=Sampler(backend = qr_backend), optimizer=COBYLA(), initial_point=[0.0, 0.0])\n", "exact_mes = NumPyMinimumEigensolver()" ] }, { "cell_type": "code", "execution_count": 9, "id": "62f53d2e-149d-4d3c-b4f4-67b4c95b15ab", "metadata": {}, "outputs": [], "source": [ "qaoa = MinimumEigenOptimizer(qaoa_mes) # using QAOA\n", "exact = MinimumEigenOptimizer(exact_mes) # using the exact classical numpy minimum eigen solver" ] }, { "cell_type": "code", "execution_count": 10, "id": "fd4a5baa-58ce-4596-aaa1-6d7d3b6fe6c2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "objective function value: -2.0\n", "variable values: x=0.0, y=1.0, z=0.0\n", "status: SUCCESS\n" ] } ], "source": [ "exact_result = exact.solve(qubo)\n", "print(exact_result.prettyprint())" ] }, { "cell_type": "code", "execution_count": 11, "id": "462ccb59-d9aa-4971-a194-40cae0184f8c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "objective function value: -2.0\n", "variable values: x=0.0, y=1.0, z=0.0\n", "status: SUCCESS\n" ] } ], "source": [ "qaoa_result = qaoa.solve(qubo)\n", "print(qaoa_result.prettyprint())" ] }, { "cell_type": "code", "execution_count": 12, "id": "c19ba583-69ef-49da-b75b-c12b504b7b4c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "variable order: ['x', 'y', 'z']\n", "SolutionSample(x=array([0., 1., 0.]), fval=np.float64(-2.0), probability=0.2558937072753906, status=)\n", "SolutionSample(x=array([0., 0., 0.]), fval=np.float64(0.0), probability=0.02691650390625, status=)\n", "SolutionSample(x=array([1., 1., 0.]), fval=np.float64(0.0), probability=0.0087890625, status=)\n", "SolutionSample(x=array([1., 0., 0.]), fval=np.float64(1.0), probability=0.012612342834472656, status=)\n", "SolutionSample(x=array([1., 0., 1.]), fval=np.float64(3.0), probability=0.0022897720336914062, status=)\n", "SolutionSample(x=array([0., 0., 1.]), fval=np.float64(3.0), probability=0.0019311904907226562, status=)\n", "SolutionSample(x=array([0., 1., 1.]), fval=np.float64(3.0), probability=0.0009164810180664062, status=)\n", "SolutionSample(x=array([1., 1., 1.]), fval=np.float64(4.0), probability=3.814697265625e-06, status=)\n" ] } ], "source": [ "print(\"variable order:\", [var.name for var in qaoa_result.variables])\n", "for s in qaoa_result.samples:\n", " print(s)" ] }, { "cell_type": "code", "execution_count": 13, "id": "e66a78b4-3430-46ed-b0e4-d83980539750", "metadata": {}, "outputs": [], "source": [ "def get_filtered_samples(\n", " samples: List[SolutionSample],\n", " threshold: float = 0,\n", " allowed_status: Tuple[OptimizationResultStatus] = (OptimizationResultStatus.SUCCESS,),\n", "):\n", " res = []\n", " for s in samples:\n", " if s.status in allowed_status and s.probability > threshold:\n", " res.append(s)\n", "\n", " return res" ] }, { "cell_type": "code", "execution_count": 14, "id": "00576e4d-18f3-4556-8afe-6d864fd166cf", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SolutionSample(x=array([0., 1., 0.]), fval=np.float64(-2.0), probability=0.2558937072753906, status=)\n", "SolutionSample(x=array([0., 0., 0.]), fval=np.float64(0.0), probability=0.02691650390625, status=)\n", "SolutionSample(x=array([1., 1., 0.]), fval=np.float64(0.0), probability=0.0087890625, status=)\n", "SolutionSample(x=array([1., 0., 0.]), fval=np.float64(1.0), probability=0.012612342834472656, status=)\n" ] } ], "source": [ "filtered_samples = get_filtered_samples(\n", " qaoa_result.samples, threshold=0.005, allowed_status=(OptimizationResultStatus.SUCCESS,)\n", ")\n", "for s in filtered_samples:\n", " print(s)" ] }, { "cell_type": "code", "execution_count": 15, "id": "9d08b416-3707-40cc-a7c5-72e41ad6c4c7", "metadata": {}, "outputs": [], "source": [ "fvals = [s.fval for s in qaoa_result.samples]\n", "probabilities = [s.probability for s in qaoa_result.samples]" ] }, { "cell_type": "code", "execution_count": 16, "id": "8efb3f0d-6455-45d9-a912-985cfbb056e1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(1.5)" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean(fvals)" ] }, { "cell_type": "code", "execution_count": 17, "id": "ed217b9e-a87c-4716-bca8-da6a8c5f486b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(1.9364916731037085)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.std(fvals)" ] }, { "cell_type": "code", "execution_count": 18, "id": "702e6d7d-24c6-47fd-9aa2-53fa37d71e36", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'x=0 y=1 z=0': 0.2558937072753906,\n", " 'x=0 y=0 z=0': 0.02691650390625,\n", " 'x=1 y=1 z=0': 0.0087890625,\n", " 'x=1 y=0 z=0': 0.012612342834472656}" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "samples_for_plot = {\n", " \" \".join(f\"{qaoa_result.variables[i].name}={int(v)}\" for i, v in enumerate(s.x)): s.probability\n", " for s in filtered_samples\n", "}\n", "samples_for_plot" ] }, { "cell_type": "code", "execution_count": 19, "id": "35b02ccb-091f-48ac-87fd-f4d891de76c4", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plot_histogram(samples_for_plot)" ] }, { "cell_type": "code", "execution_count": 20, "id": "d8b98959-e970-4588-9fcb-da12ec63ab68", "metadata": {}, "outputs": [], "source": [ "rqaoa = RecursiveMinimumEigenOptimizer(qaoa, min_num_vars=1, min_num_vars_optimizer=exact)" ] }, { "cell_type": "code", "execution_count": 21, "id": "344a5ea3-a87b-4608-bbbe-96d08d8a5b24", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\vkasi\\.conda\\envs\\Qiskit20\\Lib\\site-packages\\scipy\\sparse\\linalg\\_dsolve\\linsolve.py:597: SparseEfficiencyWarning: splu converted its input to CSC format\n", " return splu(A).solve\n", "C:\\Users\\vkasi\\.conda\\envs\\Qiskit20\\Lib\\site-packages\\scipy\\sparse\\linalg\\_matfuncs.py:707: SparseEfficiencyWarning: spsolve is more efficient when sparse b is in the CSC matrix format\n", " return spsolve(Q, P)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "objective function value: -2.0\n", "variable values: x=0.0, y=1.0, z=0.0\n", "status: SUCCESS\n" ] } ], "source": [ "rqaoa_result = rqaoa.solve(qubo)\n", "print(rqaoa_result.prettyprint())" ] }, { "cell_type": "code", "execution_count": 22, "id": "37ed7a8d-1b9c-483f-8fe3-5b7e7101eec6", "metadata": {}, "outputs": [], "source": [ "filtered_samples = get_filtered_samples(\n", " rqaoa_result.samples, threshold=0.005, allowed_status=(OptimizationResultStatus.SUCCESS,)\n", ")" ] }, { "cell_type": "code", "execution_count": 23, "id": "8ee38dc4-bbf3-47fe-a1e2-ae9dfd7905b1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'x=0 y=1 z=0': 1.0}" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "samples_for_plot = {\n", " \" \".join(f\"{rqaoa_result.variables[i].name}={int(v)}\" for i, v in enumerate(s.x)): s.probability\n", " for s in filtered_samples\n", "}\n", "samples_for_plot" ] }, { "cell_type": "code", "execution_count": 24, "id": "cf96bf7a-c610-487c-ab54-7fa0a8a47180", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plot_histogram(samples_for_plot)" ] }, { "cell_type": "code", "execution_count": 25, "id": "2b044762-576f-4bfc-aa54-27cd54c55f40", "metadata": {}, "outputs": [ { "data": { "text/html": [ "

Version Information

SoftwareVersion
qiskit2.2.1
qiskit_ibm_runtime0.40.1
qiskit_aer0.17.1
qiskit_algorithms0.4.0
qiskit_optimization0.7.0
System information
Python version3.12.9
OSWindows
Tue Oct 21 15:18:40 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": "1867b8bc-bc1c-403f-bbaf-41e1ae963552", "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 }