{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Quantum Inspire performance test\n", "\n", "We compare performance of the simulator with the circuit from \n", "\n", "\"Overview and Comparison of Gate Level Quantum Software Platforms\", https://arxiv.org/abs/1807.02500" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Define the circuit" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import time\n", "import os\n", "import numpy as np\n", "from getpass import getpass\n", "from IPython.display import display\n", "\n", "from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister, execute\n", "from qiskit.tools.visualization import plot_histogram, circuit_drawer\n", "\n", "from quantuminspire.credentials import load_account, get_token_authentication, get_basic_authentication\n", "from quantuminspire.qiskit import QI\n", "\n", "QI_EMAIL = os.getenv('QI_EMAIL')\n", "QI_PASSWORD = os.getenv('QI_PASSWORD')\n", "QI_URL = os.getenv('API_URL', 'https://api.quantum-inspire.com/')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def format_vector(state_vector, decimal_precision=7):\n", " \"\"\" Format the state vector into a LaTeX formatted string.\n", "\n", " Args:\n", " state_vector (list or array): The state vector with complex\n", " values e.g. [-1, 2j+1].\n", "\n", " Returns:\n", " str: The LaTeX format.\n", " \"\"\"\n", " result = []\n", " epsilon = 1/pow(10, decimal_precision)\n", " bit_length = (len(state_vector) - 1).bit_length()\n", " for index, complex_value in enumerate(state_vector):\n", " has_imag_part = np.round(complex_value.imag, decimal_precision) != 0.0\n", " value = complex_value if has_imag_part else complex_value.real\n", " value_round = np.round(value, decimal_precision)\n", " if np.abs(value_round) < epsilon:\n", " continue\n", "\n", " binary_state = '{0:0{1}b}'.format(index, bit_length)\n", " result.append(r'{0:+2g}\\left\\lvert {1}\\right\\rangle '.format(value_round, binary_state))\n", " return ''.join(result)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We define the circuit based on the number of qubits and the depth (e.g. the number of iterations of the unit building block)." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def pcircuit(nqubits, depth = 10):\n", " \"\"\" Circuit to test performance of quantum computer \"\"\"\n", " q = QuantumRegister(nqubits)\n", " ans = ClassicalRegister(nqubits)\n", " qc = QuantumCircuit(q, ans)\n", "\n", " for level in range(depth):\n", " for qidx in range(nqubits):\n", " qc.h( q[qidx] )\n", " qc.barrier()\n", " for qidx in range(nqubits):\n", " qc.rx(np.pi/2, q[qidx])\n", " qc.barrier()\n", " \n", " for qidx in range(nqubits):\n", " if qidx!=0:\n", " qc.cx(q[qidx], q[0])\n", " for qidx in range(nqubits):\n", " qc.measure(q[qidx], ans[qidx])\n", " return q, qc\n", "\n", "q,qc = pcircuit(4, 1)\n", "qc.draw(output='mpl')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Run the cirquit on the Quantum Inspire simulator" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First we make a connection to the Quantum Inspire website." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "token = load_account()\n", "if token is not None:\n", " authentication = get_token_authentication(token)\n", "else:\n", " if QI_EMAIL is None or QI_PASSWORD is None:\n", " print('Enter email')\n", " email = input()\n", " print('Enter password')\n", " password = getpass()\n", " else:\n", " email, password = QI_EMAIL, QI_PASSWORD\n", " authentication = get_basic_authentication(email, password)\n", "\n", "QI.set_authentication(authentication, QI_URL)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We create a QisKit backend for the Quantum Inspire interface and execute the circuit generated above." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "qi_backend = QI.get_backend('QX single-node simulator') \n", "job = execute(qc, qi_backend)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can wait for the results and then print them" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Generated histogram:\n", "{'0111': 66, '1110': 64, '1111': 60, '0011': 65, '1001': 63, '0000': 71, '0010': 50, '1100': 67, '0100': 53, '1000': 60, '1101': 70, '1011': 69, '0001': 68, '0101': 68, '0110': 72, '1010': 58}\n" ] } ], "source": [ "result = job.result()\n", "print('Generated histogram:')\n", "print(result.get_counts())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Visualization can be done with the normal Python plotting routines, or with the QisKit SDK." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plot_histogram(result.get_counts(qc))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To compare we will run the circuit with 20 qubits and depth 20. This takes:\n", "\n", "* QisKit: 3.7 seconds\n", "* ProjectQ: 2.0 seconds" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our simulator runs for multiple shots (unless full state projection is used). More details will follow later." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "time needed: 3.9 [s]\n" ] } ], "source": [ "q, qc = pcircuit(10, 10)\n", "start_time = time.time()\n", "\n", "job = execute(qc, qi_backend, shots=8)\n", "job.result()\n", "interval = time.time() - start_time\n", "\n", "print('time needed: %.1f [s]' % (interval,))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "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.8" }, "latex_envs": { "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 0 }, "nav_menu": {}, "toc": { "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 6, "toc_cell": false, "toc_section_display": "block", "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 1 }