{ "cells": [ { "cell_type": "markdown", "id": "beae46ee-c593-44cf-83be-b0aa38d3863b", "metadata": {}, "source": [ "# 01 - Quadratic Programs\n", "### Modified for use with Quantum Rings toolkit for Qiskit 2.x" ] }, { "cell_type": "code", "execution_count": 1, "id": "88d38c49-0ea5-4f9a-97b3-e3e6d99d9856", "metadata": {}, "outputs": [], "source": [ "# This code is from:\n", "# https://qiskit-community.github.io/qiskit-optimization/tutorials/01_quadratic_program.html\n", "\n", "# Modified for use with Quantum Rings SDK." ] }, { "cell_type": "code", "execution_count": 2, "id": "3284718f-9590-4f6c-a4a6-37a1bea3bcae", "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": "3b1ed8d4-f8ec-46d0-ac11-b1bc4b55eb53", "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": "0c3ba1c4-ab18-4959-945e-979d28209210", "metadata": {}, "outputs": [], "source": [ "from qiskit_optimization import QuadraticProgram\n", "from qiskit_optimization.translators import from_docplex_mp" ] }, { "cell_type": "code", "execution_count": 5, "id": "45630cbf-bfd2-45ec-88c5-176a6ba32bfe", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\\ This file has been generated by DOcplex\n", "\\ ENCODING=ISO-8859-1\n", "\\Problem name: docplex model\n", "\n", "Minimize\n", " obj: x + 2 y\n", "Subject To\n", " c1: x - y = 3\n", " qc1: [ x^2 - y^2 ] <= 1\n", "\n", "Bounds\n", " 0 <= x <= 1\n", " -1 <= y <= 5\n", "\n", "Binaries\n", " x\n", "\n", "Generals\n", " y\n", "End\n", "\n" ] } ], "source": [ "# Make a Docplex model\n", "from docplex.mp.model import Model\n", "\n", "mdl = Model(\"docplex model\")\n", "x = mdl.binary_var(\"x\")\n", "y = mdl.integer_var(lb=-1, ub=5, name=\"y\")\n", "mdl.minimize(x + 2 * y)\n", "mdl.add_constraint(x - y == 3)\n", "mdl.add_constraint((x + y) * (x - y) <= 1)\n", "print(mdl.export_as_lp_string())" ] }, { "cell_type": "code", "execution_count": 6, "id": "d4e983df-71d0-484d-a03f-5f73d669d5c2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "Problem name: docplex model\n", "\n", "Minimize\n", " x + 2*y\n", "\n", "Subject to\n", " Linear constraints (1)\n", " x - y == 3 'c0'\n", "\n", " Quadratic constraints (1)\n", " x^2 - y^2 <= 1 'q0'\n", "\n", " Integer variables (1)\n", " -1 <= y <= 5\n", "\n", " Binary variables (1)\n", " x\n", "\n" ] } ], "source": [ "# load from a Docplex model\n", "mod = from_docplex_mp(mdl)\n", "print(type(mod))\n", "print()\n", "print(mod.prettyprint())" ] }, { "cell_type": "code", "execution_count": 7, "id": "f08ccd53-abb2-44c8-b3ae-b9542a22c305", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Problem name: my problem\n", "\n", "Minimize\n", " 0\n", "\n", "Subject to\n", " No constraints\n", "\n", " No variables\n", "\n" ] } ], "source": [ "# make an empty problem\n", "mod = QuadraticProgram(\"my problem\")\n", "print(mod.prettyprint())" ] }, { "cell_type": "code", "execution_count": 8, "id": "3fd75e6e-629b-42cc-944a-c47a5f6a7b9f", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Problem name: my problem\n", "\n", "Minimize\n", " 0\n", "\n", "Subject to\n", " No constraints\n", "\n", " Integer variables (1)\n", " -1 <= y <= 5\n", "\n", " Continuous variables (1)\n", " -1 <= z <= 5\n", "\n", " Binary variables (1)\n", " x\n", "\n" ] } ], "source": [ "# Add variables\n", "mod.binary_var(name=\"x\")\n", "mod.integer_var(name=\"y\", lowerbound=-1, upperbound=5)\n", "mod.continuous_var(name=\"z\", lowerbound=-1, upperbound=5)\n", "print(mod.prettyprint())" ] }, { "cell_type": "code", "execution_count": 9, "id": "c59c1c0e-38ec-4b2d-8b94-a572a2bcbaa1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Problem name: my problem\n", "\n", "Minimize\n", " 2*x*y - z^2 + x + 3\n", "\n", "Subject to\n", " No constraints\n", "\n", " Integer variables (1)\n", " -1 <= y <= 5\n", "\n", " Continuous variables (1)\n", " -1 <= z <= 5\n", "\n", " Binary variables (1)\n", " x\n", "\n" ] } ], "source": [ "# Add objective function using dictionaries\n", "mod.minimize(constant=3, linear={\"x\": 1}, quadratic={(\"x\", \"y\"): 2, (\"z\", \"z\"): -1})\n", "print(mod.prettyprint())" ] }, { "cell_type": "code", "execution_count": 10, "id": "7b5bf362-d303-4c83-873d-0f255722fd03", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Problem name: my problem\n", "\n", "Minimize\n", " 2*x*y - z^2 + x + 3\n", "\n", "Subject to\n", " No constraints\n", "\n", " Integer variables (1)\n", " -1 <= y <= 5\n", "\n", " Continuous variables (1)\n", " -1 <= z <= 5\n", "\n", " Binary variables (1)\n", " x\n", "\n" ] } ], "source": [ "# Add objective function using lists/arrays\n", "mod.minimize(constant=3, linear=[1, 0, 0], quadratic=[[0, 1, 0], [1, 0, 0], [0, 0, -1]])\n", "print(mod.prettyprint())" ] }, { "cell_type": "code", "execution_count": 11, "id": "df6a0442-97f4-420d-864e-103c33928ad8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "constant:\t\t\t 3\n", "linear dict:\t\t\t {np.int32(0): np.int64(1)}\n", "linear array:\t\t\t [1 0 0]\n", "linear array as sparse matrix:\n", " \n", " Coords\tValues\n", " (0, 0)\t1 \n", "\n", "quadratic dict w/ index:\t {(0, 1): np.int64(2), (2, 2): np.int64(-1)}\n", "quadratic dict w/ name:\t\t {('x', 'y'): np.int64(2), ('z', 'z'): np.int64(-1)}\n", "symmetric quadratic dict w/ name:\t {('x', 'y'): np.int64(1), ('y', 'x'): np.int64(1), ('z', 'z'): np.int64(-1)}\n", "quadratic matrix:\n", " [[ 0 2 0]\n", " [ 0 0 0]\n", " [ 0 0 -1]] \n", "\n", "symmetric quadratic matrix:\n", " [[ 0 1 0]\n", " [ 1 0 0]\n", " [ 0 0 -1]] \n", "\n", "quadratic matrix as sparse matrix:\n", " \n", " Coords\tValues\n", " (0, 1)\t2\n", " (2, 2)\t-1\n" ] } ], "source": [ "print(\"constant:\\t\\t\\t\", mod.objective.constant)\n", "print(\"linear dict:\\t\\t\\t\", mod.objective.linear.to_dict())\n", "print(\"linear array:\\t\\t\\t\", mod.objective.linear.to_array())\n", "print(\"linear array as sparse matrix:\\n\", mod.objective.linear.coefficients, \"\\n\")\n", "print(\"quadratic dict w/ index:\\t\", mod.objective.quadratic.to_dict())\n", "print(\"quadratic dict w/ name:\\t\\t\", mod.objective.quadratic.to_dict(use_name=True))\n", "print(\n", " \"symmetric quadratic dict w/ name:\\t\",\n", " mod.objective.quadratic.to_dict(use_name=True, symmetric=True),\n", ")\n", "print(\"quadratic matrix:\\n\", mod.objective.quadratic.to_array(), \"\\n\")\n", "print(\"symmetric quadratic matrix:\\n\", mod.objective.quadratic.to_array(symmetric=True), \"\\n\")\n", "print(\"quadratic matrix as sparse matrix:\\n\", mod.objective.quadratic.coefficients)" ] }, { "cell_type": "code", "execution_count": 12, "id": "402969a7-3b55-4470-a61e-25bc6832a0a8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Problem name: my problem\n", "\n", "Minimize\n", " 2*x*y - z^2 + x + 3\n", "\n", "Subject to\n", " Linear constraints (3)\n", " x + 2*y == 3 'lin_eq'\n", " x + 2*y <= 3 'lin_leq'\n", " x + 2*y >= 3 'lin_geq'\n", "\n", " Integer variables (1)\n", " -1 <= y <= 5\n", "\n", " Continuous variables (1)\n", " -1 <= z <= 5\n", "\n", " Binary variables (1)\n", " x\n", "\n" ] } ], "source": [ "# Add linear constraints\n", "mod.linear_constraint(linear={\"x\": 1, \"y\": 2}, sense=\"==\", rhs=3, name=\"lin_eq\")\n", "mod.linear_constraint(linear={\"x\": 1, \"y\": 2}, sense=\"<=\", rhs=3, name=\"lin_leq\")\n", "mod.linear_constraint(linear={\"x\": 1, \"y\": 2}, sense=\">=\", rhs=3, name=\"lin_geq\")\n", "print(mod.prettyprint())" ] }, { "cell_type": "code", "execution_count": 13, "id": "57e2500a-1537-49a4-9d8b-b8fc7beffa93", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Problem name: my problem\n", "\n", "Minimize\n", " 2*x*y - z^2 + x + 3\n", "\n", "Subject to\n", " Linear constraints (3)\n", " x + 2*y == 3 'lin_eq'\n", " x + 2*y <= 3 'lin_leq'\n", " x + 2*y >= 3 'lin_geq'\n", "\n", " Quadratic constraints (3)\n", " x^2 - y*z + x + y == 1 'quad_eq'\n", " x^2 - y*z + x + y <= 1 'quad_leq'\n", " x^2 - y*z + x + y >= 1 'quad_geq'\n", "\n", " Integer variables (1)\n", " -1 <= y <= 5\n", "\n", " Continuous variables (1)\n", " -1 <= z <= 5\n", "\n", " Binary variables (1)\n", " x\n", "\n" ] } ], "source": [ "# Add quadratic constraints\n", "mod.quadratic_constraint(\n", " linear={\"x\": 1, \"y\": 1},\n", " quadratic={(\"x\", \"x\"): 1, (\"y\", \"z\"): -1},\n", " sense=\"==\",\n", " rhs=1,\n", " name=\"quad_eq\",\n", ")\n", "mod.quadratic_constraint(\n", " linear={\"x\": 1, \"y\": 1},\n", " quadratic={(\"x\", \"x\"): 1, (\"y\", \"z\"): -1},\n", " sense=\"<=\",\n", " rhs=1,\n", " name=\"quad_leq\",\n", ")\n", "mod.quadratic_constraint(\n", " linear={\"x\": 1, \"y\": 1},\n", " quadratic={(\"x\", \"x\"): 1, (\"y\", \"z\"): -1},\n", " sense=\">=\",\n", " rhs=1,\n", " name=\"quad_geq\",\n", ")\n", "print(mod.prettyprint())" ] }, { "cell_type": "code", "execution_count": 14, "id": "4110da4e-4ba8-4c32-9bf2-ae3169911b99", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "lin_geq: {'x': np.float64(1.0), 'y': np.float64(2.0)} ConstraintSense.GE 3\n", "quad_geq: {'x': np.float64(1.0), 'y': np.float64(1.0)} {('x', 'x'): np.float64(1.0), ('y', 'z'): np.float64(-1.0)} ConstraintSense.GE 3\n" ] } ], "source": [ "lin_geq = mod.get_linear_constraint(\"lin_geq\")\n", "print(\"lin_geq:\", lin_geq.linear.to_dict(use_name=True), lin_geq.sense, lin_geq.rhs)\n", "quad_geq = mod.get_quadratic_constraint(\"quad_geq\")\n", "print(\n", " \"quad_geq:\",\n", " quad_geq.linear.to_dict(use_name=True),\n", " quad_geq.quadratic.to_dict(use_name=True),\n", " quad_geq.sense,\n", " lin_geq.rhs,\n", ")" ] }, { "cell_type": "code", "execution_count": 15, "id": "5f79e5a9-c2b4-4437-8877-364957d3a26c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Problem name: my problem\n", "\n", "Minimize\n", " 2*x*y - z^2 + x + 3\n", "\n", "Subject to\n", " Linear constraints (2)\n", " x + 2*y <= 3 'lin_leq'\n", " x + 2*y >= 3 'lin_geq'\n", "\n", " Quadratic constraints (2)\n", " x^2 - y*z + x + y == 1 'quad_eq'\n", " x^2 - y*z + x + y >= 1 'quad_geq'\n", "\n", " Integer variables (1)\n", " -1 <= y <= 5\n", "\n", " Continuous variables (1)\n", " -1 <= z <= 5\n", "\n", " Binary variables (1)\n", " x\n", "\n" ] } ], "source": [ "# Remove constraints\n", "mod.remove_linear_constraint(\"lin_eq\")\n", "mod.remove_quadratic_constraint(\"quad_leq\")\n", "print(mod.prettyprint())" ] }, { "cell_type": "code", "execution_count": 16, "id": "c581803f-e1b9-43a8-896c-119a06413b8e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Problem name: my problem\n", "\n", "Minimize\n", " -z^2 + 3\n", "\n", "Subject to\n", " Linear constraints (2)\n", " -2*z <= 3 'lin_leq'\n", " -2*z >= 3 'lin_geq'\n", "\n", " Quadratic constraints (2)\n", " z^2 - z == 1 'quad_eq'\n", " z^2 - z >= 1 'quad_geq'\n", "\n", " Continuous variables (1)\n", " -1 <= z <= 1\n", "\n" ] } ], "source": [ "sub = mod.substitute_variables(constants={\"x\": 0}, variables={\"y\": (\"z\", -1)})\n", "print(sub.prettyprint())" ] }, { "cell_type": "code", "execution_count": 17, "id": "3b354fd2-f9fd-4ad3-a511-9e0652ce1def", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Infeasible substitution for variable: x\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "QuadraticProgramStatus.INFEASIBLE\n" ] } ], "source": [ "sub = mod.substitute_variables(constants={\"x\": -1})\n", "print(sub.status)" ] }, { "cell_type": "code", "execution_count": 18, "id": "975c0c00-5664-418f-8de4-59751fb2b1f3", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Error: 'Cannot substitute by variable that gets substituted itself: y <- x 1'\n" ] } ], "source": [ "from qiskit_optimization import QiskitOptimizationError\n", "\n", "try:\n", " sub = mod.substitute_variables(constants={\"x\": -1}, variables={\"y\": (\"x\", 1)})\n", "except QiskitOptimizationError as e:\n", " print(\"Error: {}\".format(e))" ] }, { "cell_type": "code", "execution_count": 19, "id": "53415816-6c15-432f-aa1e-3abc9554f8a1", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\vkasi\\AppData\\Local\\Temp\\ipykernel_45792\\3031034113.py:6: DeprecationWarning: The method ``qiskit_optimization.problems.quadratic_program.QuadraticProgram.export_as_lp_string()`` is deprecated as of Qiskit 0.7.0. It will be removed no earlier than 3 months after the release date. Use prettyprint instead.\n", " print(mod.export_as_lp_string())\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\\ This file has been generated by DOcplex\n", "\\ ENCODING=ISO-8859-1\n", "\\Problem name: CPLEX\n", "\n", "Minimize\n", " obj: _e + 2 f + 3 g\n", "Subject To\n", "\n", "Bounds\n", " 0 <= _e <= 1\n", " 0 <= f <= 1\n", "\n", "Binaries\n", " _e f\n", "End\n", "\n" ] } ], "source": [ "mod = QuadraticProgram()\n", "mod.binary_var(name=\"e\")\n", "mod.binary_var(name=\"f\")\n", "mod.continuous_var(name=\"g\")\n", "mod.minimize(linear=[1, 2, 3])\n", "print(mod.export_as_lp_string())" ] }, { "cell_type": "code", "execution_count": 20, "id": "7dd8ce89-e78d-4fa3-a49b-b27e40730156", "metadata": {}, "outputs": [ { "data": { "text/html": [ "

Version Information

SoftwareVersion
qiskit2.2.1
qiskit_optimization0.7.0
System information
Python version3.12.9
OSWindows
Tue Oct 21 15:12:38 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": "3ddc6002-4874-46ee-b57c-22fdd359de1a", "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 }