{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Define your own problem\n", "\n", "Apart from giving you access to already implemented problems, QLauncher allows you to easily define your own problems." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To define a problem you need two key components, problem initialization and problem formulations in at least one of the formats used by quantum computers such as QUBO, Hamiltonian or BQM." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this tutorial we will implement the initialization and formulation for the Vertex Cover problem." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Problem initialization\n", "\n", "To complete a problem initialization you need to create a subclass of class problem. When you initialize it it takes as an argument an object of problem instance in any form, e.g. a graph if the problem is graph based." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from qlauncher.base import Problem\n", "import networkx as nx\n", "\n", "\n", "class VertexCover(Problem):\n", " pass\n", "\n", "\n", "graph = nx.from_edgelist([(0, 1), (0, 2), (1, 3), (2, 3), (2, 4), (3, 4)])\n", "pr = VertexCover(graph)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You could leave the class declaration like that, but in practice it might be worth to define a set of helper functions, such as one generating a random instance, reading an instance from a file or visualizing the problem with some proposed solution:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from qlauncher.base import Problem\n", "import pickle\n", "import matplotlib.pyplot as plt\n", "\n", "\n", "class VertexCover(Problem):\n", "\n", " # method to visualize a problem and optionally a solution to it\n", " def visualize(self, solution: list[int] | None = None):\n", " pos = nx.spring_layout(self.instance)\n", " plt.figure(figsize=(8, 6))\n", " if solution is not None:\n", " solution_colors = [\"red\" if x else \"skyblue\" for x in solution]\n", " nx.draw_networkx_nodes(self.instance, pos, node_size=500, node_color=solution_colors)\n", " else:\n", " nx.draw_networkx_nodes(self.instance, pos, node_size=500, node_color=\"skyblue\")\n", " nx.draw_networkx_edges(self.instance, pos, edge_color=\"gray\")\n", " nx.draw_networkx_labels(self.instance, pos, font_size=10, font_weight=\"bold\")\n", " plt.title(\"Vertex Cover Problem Instance Visualization\")\n", " plt.show()\n", "\n", " # method to load a predefined toy example\n", " @staticmethod\n", " def from_preset(instance_name: str) -> \"VertexCover\":\n", " match instance_name:\n", " case 'default':\n", " node_list = list(range(5))\n", " edge_list = [(0, 1), (0, 2), (1, 3), (2, 3), (2, 4), (3, 4)]\n", " graph = nx.Graph()\n", " graph.add_nodes_from(node_list)\n", " graph.add_edges_from(edge_list)\n", " return VertexCover(graph, instance_name=instance_name)\n", "\n", " # method to load problem instance from file\n", " @staticmethod\n", " def from_file(path: str) -> \"VertexCover\":\n", " with open(path, 'rb') as f:\n", " graph = pickle.load(f)\n", " return VertexCover(graph, instance_name=path)\n", "\n", " # method to save problem instance to file\n", " def to_file(self, path: str):\n", " with open(path, 'wb') as f:\n", " pickle.dump((self.instance), f, pickle.HIGHEST_PROTOCOL)\n", "\n", " # method which generates ransom problem instance\n", " @staticmethod\n", " def generate_vertex_cover_instance(num_vertices: int, edge_probability: int) -> \"VertexCover\":\n", " graph = nx.gnp_random_graph(num_vertices, edge_probability)\n", " return VertexCover(graph)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we will use one of the methods we just implemented to see the graph matching the provided edge list." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "graph = nx.from_edgelist([(0, 1), (0, 2), (1, 3), (2, 3), (2, 4), (3, 4)])\n", "pr = VertexCover(graph)\n", "pr.visualize()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Problem Formulation\n", "\n", "To add a problem formulation you need to define a callable, a function or callable class, and decorate it with the formatter decorator." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The formatter decorator needs to be provided with two arguments, the class of a problem you add a formulation for and format in which problem formulation will be returned e.g. \\\"qubo\\\" or \\\"hamiltonian\\\". Additionally, the decorated function needs to take an instance of the specified problem class and return a problem formulation in the selected format." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Qubits and Penalty Function" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To create a proper problem formulation you need to do two things:\n", "\n", "1. Find a way to express a solution (any solution, not just the optimal one) as a set of binary variables, those binary variables will be mapped to qubits by a quantum computer.\n", "2. Construct a penalty function which acts on the qubit representation and based on the values of qubits assigns a \"penalty\" to it, for the quantum algorithm to work properly the penalty function should assign higher values to invalid or suboptimal solutions and lower values, possibly 0, to an optimal solution.\n", "\n", "The penalty function needs to follow a format specified in the formatter, e.g. a QUBO formulation needs to be a polynomial of at most second order expressed as a QUBO matrix and offset where $i'th$, $j'th$ matrix entry corresponds to the coefficient of $x_{i}x_{j}$ term in the function and offset corresponds to the constant. On the other hand the Hamiltonian formulation can be of higher order and needs to be represented by a SparsePauliOp from the qiskit library." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below you can see a formulation of the vertex cover problem using QUBO as a return format:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from qlauncher.base import formatter\n", "from pyqubo import Array\n", "import numpy as np\n", "\n", "\n", "@formatter(problem=VertexCover, alg_format=\"qubo\")\n", "def get_qubo(problem: VertexCover, constraint_weight=5, cost_weight=1):\n", " vertices = problem.instance.nodes()\n", " edges = problem.instance.edges()\n", " x = Array.create(\"x\", shape=(len(vertices),), vartype=\"BINARY\")\n", " qubo = 0\n", " # penalty for number of vertices used\n", " for v in vertices:\n", " qubo += cost_weight*x[v]\n", " # penalty for violating constraint, not covering all edges\n", " for e in edges:\n", " qubo += constraint_weight*(1-x[e[0]]-x[e[1]]+x[e[0]]*x[e[1]])\n", " qubo_dict, offset = qubo.compile().to_qubo()\n", " # turn qubo dict into qubo matrix\n", " Q_matrix = np.zeros((len(vertices), len(vertices)))\n", " for i in range(len(vertices)):\n", " for j in range(len(vertices)):\n", " key = (\"x[\"+str(i)+\"]\", \"x[\"+str(j)+\"]\")\n", " if key in qubo_dict:\n", " Q_matrix[i, j] = qubo_dict[key]\n", " return Q_matrix, offset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that you have created a problem initialization and formulation decorated with @formatter, you can pass an instance of the problem to QLauncher which will automatically find the formulation." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Result(bitstring=01110, energy=4.7587890625)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from qlauncher.launcher import QLauncher\n", "from qlauncher.routines.qiskit import QAOA, QiskitBackend\n", "\n", "pr = VertexCover.from_preset(\"default\")\n", "\n", "solution = QLauncher(pr, QAOA(p=5), QiskitBackend(\"local_simulator\")).run()\n", "solution" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can once again use the problem's visualize method, this time to check the solution's correctness, unfortunately due to algorithm's indeterminism we cannot guarantee the correct solution each time" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAH4CAYAAADaVFwSAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAae1JREFUeJzt3Ql81dWd//9PIAlJSECWQNj3XZFFBGQHBQRFFEVRwH3aaaftzH/m16nT6XRmukyndqbtOO10XxBQcEFBFEVQQUVFQAVkDRAIBAhr9j3/x/vgTUNISO7Nvbnb6/l4XMGQ3Pu9N/fe7/uecz6fE1NZWVlpAAAAiBrNgn0AAAAAaFoEQAAAgChDAAQAAIgyBEAAAIAoQwAEAACIMgRAAACAKEMABAAAiDIEQAAAgChDAAQAAIgyBEAAfvX2229bTEyMPf/88/V+70MPPWQ9e/ZskuNCcP3pT39yz4sjR46E3HFMnjzZXZpasG4XEAIg6jVnzhxLSkqy3NzcOr/ngQcesPj4eDt79myjb+/EiRP2r//6r/bJJ59YMOn2Fy5caN26dbMWLVpY27Zt7eabb7Y//vGPVl5ebuFGYUsnPs+lVatWdv3119t//dd/WXFxcbAPL+zCazg/t8PxfSFcff755+53HuzgC9REAES99CZeWFhoq1atqvXfCwoK7OWXX7aZM2dau3bt/HKS/Ld/+7egniR/97vf2Q033GBvvfWWu/+//OUv7V/+5V8sMTHRHn30UfvP//xPC0cKsk8//bS7/PCHP3Sh9h/+4R/swQcfDPahRYVQeG4H631h0aJF7vt79OhhoeaNN95wl0AFQP3OawuAgbxdoD6x9X4Hop4+6aekpNjy5ctt8eLFV/y73uTz8/PdCaExysrKrKKiwoLtgw8+sC9/+cs2duxYe/XVV9199/jbv/1b+/jjj23Xrl0WaiorK62oqMiF1LrExsa6UU2Pr3zlKzZ69GhbsWKF/fd//7d17tzZp+tF9PH2faF58+buEoo0ShlNtwsII4Col078d911l23YsMFOnz59xb/rBKATgU4IcuHCBReUPFOnffv2dSNm1cOdPg1rqu0nP/mJ/exnP7M+ffq479VI26hRo9z3PPzww1XTlVq34/Hhhx+6UYXWrVu7KahJkybZe++9V/Xve/bsccdc86T07rvvuhPQP/7jP171/urTum5z2bJll4U/D40MajrVQye5v//7v6+6vwMGDHD3S8HJ49prr7UpU6ZccV16TLp06WJ33333ZV/TYzJkyBBLSEiwjh072pe+9CU7f/78ZT+rtXO33Xabvf766+6YdJ9//etfmzeaNWtWtQbJM0Jxtes9dOiQ3XPPPW7kUI/9mDFjbO3atbVet6bJ/+mf/snS0tKsZcuW7vlx7Nixeo/J2/uvaVvPcV533XXu/+XFF190/6/rGDlypO3YscN8oek7PR8OHjzofu/XXHONe+7p+alRrurWr19v48ePd9+TnJzsngt6DETHdbXn9ubNm91j2717d/c80vPp7/7u79yoWXU6Bl338ePHbe7cue7vqampbiS35tIEPZY///nPqx4HfZ9eO/oQU93SpUvdY6THUL/b++67r97flbfvC7WtvdNxzJgxw9q3b++ur1evXvbII49cMSXv+Z3WfP+o/r7w2Wefucemd+/e7r7qeafrasj0c821eHpuVV8uUf3iOZaMjAz3AUq/Yx27Rjn1+6t+/3R8+pro9V/zOmpbA6jHUrMMet7rfmiZxp///Oda77/eZ37zm99UvX/q+bV169Z67y8gjACiQfQpXm9CK1eutL/5m7+p+vq5c+dcUFiwYIF7E9QJUYFMJyedtHUye//99+2JJ56wrKwsd2KvTuvpNLr0V3/1V+4N7M4773RrijTdqq9NmDDBfd9NN93k/ty4caPdeuut7mT13e9+1wUYXcfUqVPdCfTGG2+0QYMG2fe+9z37f//v/7lgpROQQppODgMHDrR///d/r/N+6vh1Qps4caI79voo5On6NVWsN+1hw4a5x0O3rcfgpz/9qfu+e++91wWJkydPuhNT9VCqaUGdcD30uOnEoZDw9a9/3Q4fPmz/+7//6wKMgm5cXFzV9+7bt8899vqZxx9/3J2MvJWenu7+rD59X9v1njp1yv0e9BjpuPT9ek7o/mvNnH531f3gBz9wJykFbp3U9LvXGkpNf15tNNGb+69Qdv/997uf0cimToi33367/epXv3LBSydo+Y//+A+bP3++u196zvhCP6+Aouvavn27WybQoUOHquUAu3fvdoF06NCh7jmm57OOz/PhRM9Lfb2u5/Zzzz3nHtu//uu/do/tRx99ZE899ZRlZma6f6tOQU/BSaO3us9vvvmmW8upIKCf99BzUo+lXjOPPfaYG2XX60Sj3ArNnt/Td77zHXf/9D3Z2dnudvUa0GOuMNvY94Xa6Dkxffp0F0q/9a1vudtRsFFw94XCtz6g6Hmj15h+HwpH+lP3V8/FhtJzNS8v77Kv6bWs567ndaKgpfc2vXa7du3qjv3//u//XKDTtK8+IOkx1HP4f/7nf9zzUc8B8fxZk8K+fl7PGz2eer7pd6/3Ln2w/sY3vnFFyNb7pZ7/un8//vGPXSjX41D9dQLUqhJogLKysspOnTpVjh079rKv/+pXv9IwV+Xrr7/u/v973/teZcuWLSv3799/2fd961vfqmzevHnl0aNH3f8fPnzY/VyrVq0qT58+fdn3bt261f3bH//4x8u+XlFRUdmvX7/KGTNmuL97FBQUVPbq1avylltuqfpaeXl55fjx4ys7duxYeebMmcqvfvWrlbGxse66r+bTTz91t/2Nb3yjQY/LSy+95L7/+9///mVfv/vuuytjYmIqDx486P5/37597vueeuqpy77vK1/5SmVycrK7D7J582b3fcuWLbvs+9atW3fF13v06OG+pn9riAcffND9brKzs91Fx/bDH/7QHefQoUPrvd6//du/dV/XMXrk5ua6x75nz57uMZe33nrLfV+XLl0qc3Jyqr535cqV7us///nPLzsm3Z6HL/f//fffr/qanof6WmJiYmVGRkbV13/961+7r+vYrsZz7M8991zV17773e+6rz3yyCOXfe+dd95Z2a5du6r//+lPf+q+T49tXep6bovnOVDdf/zHf7jfT/X7osdM1/Hv//7vl33v8OHDK0eOHFn1/xs3bnTf9/Wvf/2K6/W8fo4cOeJelz/4wQ8u+/edO3e610vNr/v6viC6z/qaXvuyatUq9/9Xe016fh81f2+e94/qj2Ntj98zzzzjvm/Tpk11HodMmjTJXeriee5Wf8xru70tW7a471uyZEnV1/Rcquu5V/N2f/azn7nvXbp0adXXSkpK3OOr9wnP68lz//X8O3fuXNX3vvzyy+7ra9asqfO+AB5MAaNBNHWqT7pbtmy5bIpDn0A1VTFt2jT3//q0qpGNNm3a2JkzZ6ouGvnRqMWmTZsuu9558+a5EYCG0KfvAwcOuBEfTet4rluje7p9XbdnmlmjPBr50Kd4jX5oalmjkJ5Rj7rk5OS4P2ub+q2N1gjqsdGn/Oo0JazRwddee839f//+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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pr.visualize([int(x) for x in solution.best_bitstring])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A nice convenience introduced by QLauncher is the fact that you don't need to define formulations in both formats, QLauncher uses adapters which allow it to transform between problem formulations. Since QAOA requires the problem to be formulated as a Hamiltonian and we provided a QUBO formulation, QLauncher will use a QUBO to hamiltonian adapter, which looks as follows:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "from qiskit.quantum_info import SparsePauliOp\n", "from qlauncher.base.adapter_structure import adapter\n", "\n", "\n", "@adapter(\"qubo\", \"hamiltonian\")\n", "def qubo_to_hamiltonian(qubo: np.ndarray) -> SparsePauliOp:\n", " q_matrix, offset = qubo\n", " num_vars = q_matrix.shape[0]\n", " pauli = 0\n", " for i, col in enumerate(q_matrix):\n", " for j, entry in enumerate(col):\n", " if entry == 0:\n", " continue\n", " if i == j:\n", " pauli += SparsePauliOp.from_sparse_list([('I', [0], .5), ('Z', [i], -.5)], num_vars)*entry\n", " else:\n", " pauli += SparsePauliOp.from_sparse_list([('I', [0], .25), ('Z', [i], -.25),\n", " ('Z', [j], -.25), ('ZZ', [i, j], .25)], num_vars)*entry\n", " pauli += SparsePauliOp.from_sparse_list([('I', [], offset)], num_vars)\n", " return pauli" ] } ], "metadata": { "kernelspec": { "display_name": "launcher", "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.11" } }, "nbformat": 4, "nbformat_minor": 2 }