{ "cells": [ { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from qiskit import QuantumCircuit, QuantumRegister\n", "from qiskit.tools.visualization import matplotlib_circuit_drawer, qx_color_scheme\n", "import math\n", "\n", "# Quantum Fourier Transform\n", "def construct_circuit(num_qubits):\n", " q = QuantumRegister(num_qubits)\n", " circ = QuantumCircuit(q)\n", " \n", " for j in range(num_qubits):\n", " for k in range(j):\n", " circ.cu1(math.pi/float(2**(j-k)), q[j], q[k])\n", " circ.h(q[j])\n", "\n", " return circ\n", "\n", "matplotlib_circuit_drawer(construct_circuit(3))" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "from mpl_toolkits.mplot3d import axes3d \n", "\n", "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from scipy.optimize import curve_fit\n", "from scipy import stats\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "scrolled": true }, "outputs": [], "source": [ "df = pd.read_csv('benchmark_data.csv')\n", "\n", "NUM_QUBITS = 24\n", "\n", "# Pandas Conditions\n", "qiskit = df['name'] == 'bench_qiskit'\n", "qcgpu = df['name'] == 'bench_qcgpu'\n", "projectq = df['name'] == 'bench_projectq'\n", "\n", "# Get mean values\n", "means_qcgpu = []\n", "means_qiskit = []\n", "means_projectq = []\n", "\n", "for i in range(NUM_QUBITS):\n", " means_qcgpu.append(df[qcgpu & (df['num_qubits'] == i+1)]['time'].mean())\n", " means_qiskit.append(df[qiskit & (df['num_qubits'] == i+1)]['time'].mean())\n", " means_projectq.append(df[projectq & (df['num_qubits'] == i+1)]['time'].mean())" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "xdata = np.arange(1, NUM_QUBITS + 1)\n", "\n", "plt.plot(xdata, means_qcgpu, \".\", label=\"QCGPU\")\n", "plt.plot(xdata, means_qiskit, \".\", label=\"Qiskit\")\n", "plt.plot(xdata, means_projectq, \".\", label=\"Project Q\")\n", "\n", "# def model_func(x, o, c):\n", "# return ((x ** 2 + x) / 2) * o * (2 ** x) + c\n", "\n", "# popt, pcov = curve_fit(model_func, xdata, means_qiskit)\n", "\n", "# plt.plot(xdata, model_func(xdata, *popt), label=\"Fitted Curve\")\n", "\n", "plt.legend()\n", "plt.title('QFT Performance')\n", "plt.xlabel('Number of Qubits')\n", "plt.ylabel('Runtime (seconds)')\n", "plt.show()\n" ] } ], "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.6" } }, "nbformat": 4, "nbformat_minor": 2 }