{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Pyquil Tutorials\n", "\n", "**Warning:** The pyquil binder is deprecated for python 3.6, trying to execute this notebook without a recent enough version of python will only yield exceptions.\n", "\n", "We have made a binder that converts QLM circuits into pyquil circuits, we have also made the `PyquilQPU` class which is a qpu wrapper around pyquil's simulator/real chip which takes QLM jobs, converts them to pyquil jobs, executes them on a pyquil simulator/real quantum chip, then returns a QLM Result.\n", "\n", "## QLM to Pyquil conversion\n", "\n", "A function that converts a QLM circuit into a pyquil circuit" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from qat.interop.pyquil.converters import qlm_to_pyquil\n", "from qat.lang.AQASM import Program\n", "from qat.lang.AQASM.gates import *\n", "\n", "nbqubits = 2\n", "\n", "prog = Program()\n", "\n", "qreg = prog.qalloc(nbqubits)\n", "creg = prog.calloc(nbqubits)\n", "\n", "prog.apply(H, qreg[0])\n", "prog.apply(CNOT, qreg[0], qreg[1])\n", "\n", "prog.measure(qreg, creg)\n", "qlm_circuit = prog.to_circ()\n", "\n", "# Conversion\n", "pyquil_circuit = qlm_to_pyquil(qlm_circuit)\n", "\n", "print(pyquil_circuit)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pyquil to QLM conversion\n", "\n", "A function that converts a Pyquil circuit into a QLM circuit" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from qat.interop.pyquil.converters import pyquil_to_qlm\n", "from pyquil import Program\n", "from pyquil.gates import H, CNOT, MEASURE\n", "from qat.core.util import get_syntax\n", "\n", "nbqubits = 2\n", "\n", "prog = Program()\n", "\n", "creg = prog.declare(\"ro\", \"BIT\", 2)\n", "prog += H(0)\n", "prog += CNOT(0, 1)\n", "prog += MEASURE(0, creg[0])\n", "prog += MEASURE(1, creg[1])\n", "\n", "# get result with included measures\n", "qlm_circuit = pyquil_to_qlm(prog)\n", "\n", "for index, op in enumerate(qlm_circuit.ops):\n", " print(\"Gate {} with params {} on qubits {} and cbits {}\".format(*get_syntax(qlm_circuit, index), op.cbits))\n", "\n", "# get result with separated measures\n", "print(\"---------------------------------------------------------\")\n", "qlm_circuit, to_measure = pyquil_to_qlm(prog, sep_measures=True)\n", "\n", "for index, op in enumerate(qlm_circuit.ops):\n", " print(\"Gate {} with params {} on qubits {}\".format(*get_syntax(qlm_circuit, index)))\n", "print(\"qubits to measure {}\".format(to_measure))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## PyquilQPU\n", "\n", "The wrapper around whatever pyquil simulator or quantum chip you wish to use.\n", "In this example we use the [qvm](https://github.com/rigetti/qvm) that we have running as server. We used this same method to show the qiskit connector working with pyquilqpu to execute qiskit code on pyquil's qvm and retrieving the result in QLM format.
\n", "**Warning:** This will only yield an error if there is no qvm running." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import os\n", "from qat.interop.pyquil.providers import PyquilQPU\n", "from qat.lang.AQASM import Program\n", "from qat.lang.AQASM.gates import *\n", "\n", "from pyquil import get_qc\n", "\n", "nbqubits = 2\n", "\n", "prog = Program()\n", "\n", "qreg = prog.qalloc(nbqubits)\n", "creg = prog.calloc(nbqubits)\n", "\n", "prog.apply(H, qreg[0])\n", "prog.apply(CNOT, qreg[0], qreg[1])\n", "\n", "prog.measure(qreg, creg)\n", "qlm_circuit = prog.to_circ()\n", "\n", "qlm_job = qlm_circuit.to_job(nbshots=1024)\n", "\n", "# get a QuantumComputer object from the vqm\n", "os.environ[\"QCS_SETTINGS_APPLICATIONS_PYQUIL_QVM_URL\"] = \"http://127.0.0.1:15011\"\n", "os.environ[\"QCS_SETTINGS_APPLICATIONS_PYQUIL_QUILC_URL\"] = \"tcp://127.0.0.1:15012\"\n", "qvm = get_qc('9q-qvm')\n", "\n", "# create the QPU from the QuantumComputer object\n", "qpu = PyquilQPU(qvm)\n", "\n", "result = qpu.submit(qlm_job)\n", "for entry in result.raw_data:\n", " print(\"State: {}\\t probability: {}\".format(entry.state, entry.probability))\n" ] } ], "metadata": { "authors": [ "Simon Martiel", "Arnaud Gazda" ], "constraints": { "have_second_server": "15012", "have_server": "15011", "python_version_superior_to_36": true }, "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.6.8" } }, "nbformat": 4, "nbformat_minor": 2 }