{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# SudoQ\n", "\n", "https://github.com/subwayHareArmy/SudoQ" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "#from dwave_qbsolv import QBSolv\n", "import seaborn as sns\n", "sns.set_style(\"dark\")\n", "%matplotlib inline\n", "\n", "#path = 'D:/P.N.I.A/Project - Paper Ideas/Projects/Full Blown Projects/SudoQ/'\n", "path = 'C:/Users/Ayush/PNIA Codes/PS Time Codes/'\n", "inf = 100" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# For uniquely identifying a qubit number from (x,y,z)\n", "\n", "def unique_id(x, y, z):\n", " x = np.asarray(x)\n", " y = np.asarray(y)\n", " z = np.asarray(z)\n", " ids = z + 8 * ((9 * y) + x)\n", "\n", " return np.asarray(ids, dtype = np.int16)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# For uniquely identifying (x,y,z) from qubit unique_id\n", "\n", "def xyz_from_id(ids, as_tuple = False):\n", " ids = np.asarray(ids)\n", " z = np.remainder(ids, 8)\n", " ids = np.subtract(ids, z)\n", " ids = np.divide(ids, 8)\n", " x = np.remainder(ids, 9)\n", " ids = np.subtract(ids, x)\n", " y = np.divide(ids, 9)\n", "\n", " if as_tuple:\n", " return (x, y, z)\n", " else:\n", " return x, y, z" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# For adding values to the QUBO Matrix\n", "\n", "def Q_add(Q, ids1, ids2, add_value ):\n", " Q = np.asarray(Q)\n", " ids1 = np.asarray(ids1)\n", " ids2 = np.asarray(ids2)\n", " Q_added = np.zeros((648,648), dtype = np.int32)\n", " try:\n", " for _ in range(len(ids1)):\n", " Q_added[ids1[_] ][ids2[_] ] = add_value\n", " np.add(Q, Q_added, out = Q)\n", " except TypeError:\n", " Q_added[ids1][ids2] = add_value\n", " np.add(Q, Q_added, out = Q)\n", " return Q" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Checking if QUBO Matrix 'Q' still is an upper triangular matrix\n", "\n", "def upper_triangular_check(Q):\n", " number_qubits = np.shape(Q)[0]\n", " for __ in range(number_qubits):\n", " for _ in range(__):\n", " if Q[__][_] != 0 or Q[__][_] != 0.0:\n", " print(\"Q is an upper triangular matrix: False\")\n", " return\n", " print(\"Q is an upper triangular matrix: True\")\n", " " ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Evaluate the QUBO Q Matrix\n", "\n", "def evaluate(Q):\n", " print(\"The summation of QUBO Q Matrix elements is: \" , np.sum(Q)); print()\n", " print(\"The QUBO Matrix: \"); print(Q); print()\n", " upper_triangular_check(Q); print()\n", " sns.heatmap(data = Q)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Extract solution from qbsolv returned qubit values\n", "\n", "def extract_solution(solution):\n", " solution()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "Q = np.zeros((648, 648), dtype = np.int32)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# For Equation I\n", "\n", "for x_index in range(9):\n", " for y_index in range(9):\n", " for z_index1 in range(8):\n", " z2 = np.arange(z_index1 + 1, 8)\n", " z1 = np.empty((len(z2))); z1.fill(z_index1)\n", " x = np.empty((len(z2))); x.fill(x_index)\n", " y = np.empty((len(z2))); y.fill(y_index)\n", "\n", " ids1 = unique_id(x, y, z1 )\n", " ids2 = unique_id(x, y, z2 )\n", "\n", " Q_add(Q, ids1, ids2, add_value = 2)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The summation of QUBO Q Matrix elements is: 4536\n", "\n", "The QUBO Matrix: \n", "[[0 2 2 ..., 0 0 0]\n", " [0 0 2 ..., 0 0 0]\n", " [0 0 0 ..., 0 0 0]\n", " ..., \n", " [0 0 0 ..., 0 2 2]\n", " [0 0 0 ..., 0 0 2]\n", " [0 0 0 ..., 0 0 0]]\n", "\n", "Q is an upper triangular matrix: True\n", "\n" ] }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "evaluate(Q)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# For Equation IIa\n", "\n", "for z_index in range(8):\n", " for y_index in range(9):\n", " for x_index1 in range(9):\n", " x2 = np.arange(x_index1 + 1, 9)\n", " x1 = np.empty((len(x2))); x1.fill(x_index1)\n", " y = np.empty((len(x2))); y.fill(y_index)\n", " z = np.empty((len(x2))); z.fill(z_index)\n", "\n", " ids1 = unique_id(x1, y, z )\n", " ids2 = unique_id(x2, y, z )\n", "\n", " Q_add(Q, ids1, ids2, add_value = 2) # Off-diagonal elements\n", " Q_add(Q, ids1, ids1, add_value = -1) # Diagonal elements" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The summation of QUBO Q Matrix elements is: 9144\n", "\n", "The QUBO Matrix: \n", "[[-1 2 2 ..., 0 0 0]\n", " [ 0 -1 2 ..., 0 0 0]\n", " [ 0 0 -1 ..., 0 0 0]\n", " ..., \n", " [ 0 0 0 ..., 0 2 2]\n", " [ 0 0 0 ..., 0 0 2]\n", " [ 0 0 0 ..., 0 0 0]]\n", "\n", "Q is an upper triangular matrix: True\n", "\n" ] }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "evaluate(Q)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# For Equation IIb\n", "\n", "for z_index in range(8):\n", " for x_index in range(9):\n", " for y_index1 in range(9):\n", " y2 = np.arange(y_index1 + 1, 9)\n", " y1 = np.empty((len(y2))); y1.fill(y_index1)\n", " x = np.empty((len(y2))); x.fill(x_index)\n", " z = np.empty((len(y2))); z.fill(z_index)\n", "\n", " ids1 = unique_id(x, y1, z )\n", " ids2 = unique_id(x, y2, z )\n", "\n", " Q_add(Q, ids1, ids2, add_value = 2) # Off-diagonal elements\n", " Q_add(Q, ids1, ids1, add_value = -1) # Diagonal elements" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The summation of QUBO Q Matrix elements is: 13752\n", "\n", "The QUBO Matrix: \n", "[[-2 2 2 ..., 0 0 0]\n", " [ 0 -2 2 ..., 0 0 0]\n", " [ 0 0 -2 ..., 0 0 0]\n", " ..., \n", " [ 0 0 0 ..., 0 2 2]\n", " [ 0 0 0 ..., 0 0 2]\n", " [ 0 0 0 ..., 0 0 0]]\n", "\n", "Q is an upper triangular matrix: True\n", "\n" ] }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "evaluate(Q)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# For Equation III\n", "\n", "for z_index in range(8):\n", " for block_x in range(3):\n", " for block_y in range(3):\n", " x = []; y = []; z = []; ids_diagonal = []; ids_off_diagonal = []\n", " for cell_x in range(3):\n", " for cell_y in range(3):\n", "\n", " x.append((3*block_x) + cell_x)\n", " y.append((3*block_y) + cell_y)\n", " z.append(z_index)\n", "\n", " ids = unique_id(x, y, z)\n", "\n", "\n", " # For on-diagonal elements\n", " for _ in range(len(ids)):\n", " for temp in enumerate(ids[_ + 0:_ + 1], ):\n", " ids_diagonal.append([ids[_], temp[1]])\n", " ids_diagonal = np.asarray(ids_diagonal)\n", "\n", "\n", " # For off-diagonal elements\n", " for _ in range(len(ids)):\n", " for temp in enumerate(ids[_ + 1 :], ):\n", " ids_off_diagonal.append((ids[_], temp[1]))\n", " ids_off_diagonal = np.asarray(ids_off_diagonal)\n", "\n", "\n", " # Making changes to the QUBO Matrix\n", " Q_add(Q, ids_diagonal[:,0], ids_diagonal[:,1], add_value = -1) # On-diagonal elements\n", " Q_add(Q, ids_off_diagonal[:,1], ids_off_diagonal[:,1], add_value = 2) # Off-diagonal elements" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The summation of QUBO Q Matrix elements is: 14256\n", "\n", "The QUBO Matrix: \n", "[[-3 2 2 ..., 0 0 0]\n", " [ 0 -3 2 ..., 0 0 0]\n", " [ 0 0 -3 ..., 0 0 0]\n", " ..., \n", " [ 0 0 0 ..., 1 2 2]\n", " [ 0 0 0 ..., 0 1 2]\n", " [ 0 0 0 ..., 0 0 1]]\n", "\n", "Q is an upper triangular matrix: True\n", "\n" ] }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "evaluate(Q)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(1, 1), (2, 2), (3, 3), (4, 4)]" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Just an explanation of why we used this to make the ids tuples for III\n", "# For on-diagonal elements\n", "\n", "x = [1,2,3,4]\n", "lol = []\n", "\n", "for _ in range(len(x)):\n", " for y in enumerate(x[_ + 0:_ + 1], ):\n", " lol.append((x[_], y[1]))\n", "lol" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Just an explanation of why we used this to make the ids tuples for III\n", "# For off-diagonal elements\n", "\n", "x = [1,2,3,4]\n", "lol = []\n", "\n", "for _ in range(len(x)):\n", " for y in enumerate(x[_ + 1 :], ):\n", " lol.append((x[_], y[1]))\n", "lol" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "ename": "FileNotFoundError", "evalue": "[Errno 2] No such file or directory: 'C:/Users/Ayush/PNIA Codes/PS Time Codes/test1.txt'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mtest_num\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mcount\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[1;32mwith\u001b[0m \u001b[0mopen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpath\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;34m\"test\"\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mstr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtest_num\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;34m\".txt\"\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mtest_file\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mx\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m9\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0my\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m9\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'C:/Users/Ayush/PNIA Codes/PS Time Codes/test1.txt'" ] } ], "source": [ "test_num = 1\n", "count = 0\n", "with open(path + \"test\" + str(test_num) + \".txt\") as test_file:\n", " for x in range(9):\n", " for y in range(9):\n", " char = test_file.read(1)\n", " if char != \"_\" and char != \"\\n\":\n", " count += 1\n", " z = int(char)\n", " if z != 9:\n", " ID = unique_id(x,y,z)\n", " Q_add(Q, ID, ID, add_value = -1 * inf)\n", " elif z == 9:\n", " z = np.arange(8)\n", " ones = np.ones(8)\n", " x = ones * x\n", " y = ones * y\n", "\n", " IDS = unique_id(x,y,z)\n", " Q_add(Q, IDS, IDS, add_value = inf)\n", "\n", "print(\"Loaded the template into the QUBO formulation\")\n", "print(\"Count for the number of pre-filled numbers in the template: {}\".format(count))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The summation of QUBO Q Matrix elements is: 14256\n", "\n", "The QUBO Matrix: \n", "[[-3 2 2 ..., 0 0 0]\n", " [ 0 -3 2 ..., 0 0 0]\n", " [ 0 0 -3 ..., 0 0 0]\n", " ..., \n", " [ 0 0 0 ..., 1 2 2]\n", " [ 0 0 0 ..., 0 1 2]\n", " [ 0 0 0 ..., 0 0 1]]\n", "\n", "Q is an upper triangular matrix: True\n", "\n" ] }, { "data": { "image/png": "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", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "evaluate(Q)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Save the QUBO Matrix to file and generate the .qubo file\n", "\n", "Q = np.asarray(Q)\n", "np.save(path + 'Q_matrix', Q)\n", "target = 0\n", "target = str(target) + \" \" # target = 0 indicates topology of an unconstrained problem\n", "maxDiagonals = np.shape(Q)[0]\n", "maxDiagonals = str(\n", " maxDiagonals) + \" \" #Indicates the maximum num of diagonals possible ~ equivalent to max no of qubits\n", "nDiagonals = 0\n", "nElements = 0\n", "\n", "for _ in range(np.shape(Q)[0]):\n", " for __ in range(np.shape(Q)[0]):\n", " if Q[_][__] != 0:\n", " if _ == __:\n", " nDiagonals += 1\n", " nElements += 1\n", " else:\n", " nElements += 1\n", "\n", "nDiagonals = str(nDiagonals) + \" \"\n", "nElements = str(nElements) + \" \"\n", "\n", "# Find the \"nDiagonals\" clauses and \"nElements\" clauses\n", "nDiagonals_clauses = []\n", "nElements_clauses = []\n", "for _ in range(np.shape(Q)[0]):\n", " for __ in range(_, np.shape(Q)[0]):\n", " if Q[_][__] != 0:\n", " temp = [str(_) + \" \" + str(__) + \" \" + str(Q[_][__]) + \"\\n\"]\n", " if _ == __:\n", " nDiagonals_clauses.append(temp[0])\n", " else:\n", " nElements_clauses.append(temp[0])\n", "\n", "# Compiling the .qubo file\n", "with open(path + \"sudoQ.qubo\", \"w\") as qubo_file:\n", " comment_str1 = [\"c This is a QUBO file for solving Sudoku \\n\", \"c \\n\"]\n", " comment_str2 = [\"c The program 'p' line follows \\n\"]\n", " p_str = [\"p qubo \" + target + maxDiagonals + nDiagonals + nElements + \"\\n\"]\n", " comment_str3 = [\"c The nDiagonals on diagonal couplers follow \\n\"]\n", " nDiagonals_couplers = nDiagonals_clauses\n", " comment_str4 = [\"c The nElements off diagonal couplers follow \\n\"]\n", " nElements_couplers = nElements_clauses\n", "\n", " qubo_file.writelines(comment_str1)\n", " qubo_file.writelines(comment_str2)\n", " qubo_file.writelines(p_str)\n", " qubo_file.writelines(comment_str3)\n", " qubo_file.writelines(nDiagonals_couplers)\n", " qubo_file.writelines(comment_str4)\n", " qubo_file.writelines(nElements_couplers)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Compiling the qubo dictionary according to the qbsolv python package's requirement\n", "\n", "nDiagonals_clauses = {}; nElements_clauses = {}\n", "for _ in range(np.shape(Q)[0]):\n", " for __ in range(_, np.shape(Q)[0]):\n", " if Q[_][__] != 0:\n", " if _ == __:\n", " nDiagonals_clauses[(_, __)] = Q[_][__]\n", " else:\n", " nElements_clauses[(_, __)] = Q[_][__]\n", "\n", "qubo = nDiagonals_clauses\n", "qubo.update(nElements_clauses)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Solving qubo, getting the solution\n", "\n", "from dwave_qbsolv.qbsolv_binding import run_qbsolv, ENERGY_IMPACT, SOLUTION_DIVERSITY\n", "\n", "samples, energies, counts = run_qbsolv(Q = qubo)\n", "solution = samples[np.argmin(energies[:])]\n", "\n", "how_many_qubits_are_1 = 0\n", "ids = []\n", "for _ in range(len(solution)):\n", " how_many_qubits_are_1 += solution[_]\n", " ids.append(_)\n", "print(how_many_qubits_are_1)\n", "\n", "xs, ys, zs = xyz_from_id(ids, as_tuple = False)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Compiling the QUBO dictionary according to the qbsolv python package's requirement\n", "\n", "nDiagonals_clauses = {}\n", "nElements_clauses = {}\n", "\n", "for _ in range(np.shape(Q)[0]):\n", " for __ in range(_, np.shape(Q)[0]):\n", " if Q[_][__] != 0:\n", " if _ == __:\n", " nDiagonals_clauses[(_, __)] = Q[_][__]\n", " else:\n", " nElements_clauses[(_, __)] = Q[_][__]\n", "\n", "######\n", "######\n", "######\n", "\n", "response = QBSolv().sample_ising(nDiagonals_clauses, nElements_clauses)\n", "\n", "voting = [v for v in list(response.samples())[0].values()]\n", "for i in range(1, len(list(response.samples()))):\n", " list_vals = [v for v in list(response.samples())[i].values()]\n", " voting = voting + list_vals\n", "voting" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "values = [v for v in list(response.samples())[0].values()]\n", "\n", "keys = [k for k in list(response.samples())[0].keys()]\n", "keys = xyz_from_id(keys)\n", "\n", "sol_x = keys[0]\n", "sol_y = keys[1]\n", "sol_z = keys[2]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Ising sampler\n", "\n", "import neal\n", "sampler_ising = neal.SimulatedAnnealingSampler()\n", "response_ising = sampler_ising.sample_ising(nDiagonals_clauses, nElements_clauses)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "response = QBSolv().sample_qubo(qubo)\n", "list(response.samples())[0] == list(response.samples())[6]" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "sudoku_solved = img.imread(location2 + \"/\" + name2)\n", "plt.imshow(sudoku_solved)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.6.1" } }, "nbformat": 4, "nbformat_minor": 2 }