{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Implement quantum operations using Paddle Quantum's `gate` and `channel`\n", "\n", "_Copyright (c) 2023 Institute for Quantum Computing, Baidu Inc. All Rights Reserved._\n", "\n", "The `gate` and `channel` modules allow basic quantum operations to be defined. They can act on a state object directly or be inserted into a quantum circuit. Paddle Quantum provides a list of common operations but customized ones can also be created." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "import paddle_quantum\n", "from paddle_quantum.ansatz import Circuit\n", "from paddle_quantum.gate.custom import Oracle\n", "from paddle_quantum.channel import *\n", "from paddle_quantum.state.common import zero_state\n", "from paddle_quantum.qinfo import qft_generation, random_channel\n", "from paddle_quantum.linalg import dagger" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Custom gates\n", "Previously, we've seen how to create a gate object and insert it into a circuit. Users can also implement customized unitary operation using the Oracle class.\n", "\n", "For example, consider the n qubit inverse quantum Fourier transform (QFT), it's a unitary operation whose matrix is given by\n", "\n", "$$\n", "\\frac{1}{\\sqrt{N}}\\begin{pmatrix}\n", " 1 & 1 & 1 & \\ldots & 1 \\\\\n", " 1 & \\omega^{N-1} & \\omega^{N-2} & \\ldots & \\omega \\\\\n", " 1 & \\omega^{2(N-1)} & \\omega^{2(N-2)} & \\ldots & \\omega^2 \\\\\n", " \\ldots & \\ldots & \\ldots & \\ldots & \\ldots \\\\\n", " 1 & \\omega^{(N-1)(N-1)} & \\omega^{(N-1)(N-2)} & \\ldots & \\omega^{N-1}\n", "\\end{pmatrix}\n", "$$\n", "\n", "where $N=2^n$ is the dimension of the Hilbert space and $\\omega = e^{2\\pi i/N}$." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "The following code creates an oracle that implements a 2-qubit inverse QFT." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "unitary = qft_generation(2) # obtain matrix for 2-qubit QFT using Paddle Quantum's built-in function\n", "unitary = dagger(unitary) # obtain matrix for inverse QFT by calculating conjugate transpose of QFT matrix using Paddle Quantum's built-in function\n", "QFT_inverse = Oracle(unitary)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "As a gate object, we can insert it into a circuit and print the circuit. " ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cir = Circuit(3)\n", "cir.h()\n", "cir.cnot([0,1])\n", "cir.append(QFT_inverse) # insert the oracle\n", "cir.cnot([2,1])\n", "cir.plot()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "**Note**: to print the oracle, it must not be disconnected, otherwise error message will be displayed." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "\n", "To change how the oracle is printed, users can modify the content of gate_info. Users can change the name of the oracle printed and the width of the gate in the plot." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "gate_info = {\n", " 'texname': r'$QFT^{\\dagger}$', # change the name of the oracle when printing the circuit\n", " 'plot_width': 1.5, # change the width of the box representing the oracle\n", "}\n", "# update gate_info of the oracle\n", "QFT_inverse.gate_info.update(gate_info)\n", "# create the same circuit as before\n", "cir = Circuit(3)\n", "cir.h()\n", "cir.cnot([0,1])\n", "cir.append(QFT_inverse) # insert the oracle gate\n", "cir.cnot([2,1])\n", "cir.plot()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Another way of inserting an oracle into a circuit is by calling `Circuit.oracle` directly when creating the circuit." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "cir=Circuit(3)\n", "cir.h()\n", "cir.cnot([0,1])\n", "# call cir.oracle directly to create an oracle gate, its gate_info can also be specified when creating\n", "cir.oracle(unitary, qubits_idx=[0,1], latex_name=r'$QFT^{\\dagger}$', plot_width=1.5) \n", "cir.cnot([2,1])\n", "cir.plot()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "## Channel\n", "\n", "Paddle Quantum also supports channel as the most general quantum operation.\n", "\n", "There are two ways of creating a channel. Users can either create one of the common channels provided by Paddle Quantum, or create a custom channel." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "**Note**: Unlike `gate` object which supports both in `'state_vector'` and `'density_matrix'` backend, `channel` must be used in `'density_matrix'` backend." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "paddle_quantum.set_backend('density_matrix') # set the backend to density matrix" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "For example, we can create a bit flip channel and apply it to the zero state. For the full list of common channels, see [API of Paddle Quantum](https://qml.baidu.com/api/paddle_quantum.channel.common.html)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0.49999997+0.j 0. +0.j]\n", " [0. +0.j 0.49999997+0.j]]\n" ] } ], "source": [ "bit_flip_channel = BitFlip(prob=0.5, num_qubits=1) # define a single qubit bit flip channel with probability 0.5\n", "input = zero_state(1)\n", "output = bit_flip_channel(input) # apply bit flip channel to input zero state\n", "print(output)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "A custom channel can be created using either its Kraus operators, Stinespring isometry, or Choi matrix. We show how to create a custom channel using these three different representations. We generate them randomly using the built-in function from Paddle Quantum." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "**Note**: the convention for Choi matrix in PaddleQuantum is that the channel acts on the second system, i.e.\n", "\n", "$$\n", " J(\\Lambda) = \\sum_{i,j} |i\\rangle\\langle j| \\otimes \\Lambda(|i\\rangle\\langle j|).\n", "$$\n", "where $\\Lambda$ denotes the channel." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "# generate Kraus operators of a random channel\n", "kraus = random_channel(num_qubits=1, target='Kraus') \n", "# create channel using Kraus operators\n", "custom_kraus = KrausRepr(kraus)\n", "\n", "# generate Stinespring isometry of a random channel\n", "stinespring = random_channel(num_qubits=1, target='Stinespring')\n", "# create channel using Stinespring isometry\n", "custom_stinespring = StinespringRepr(stinespring)\n", "\n", "# generate Choi matrix of a random channel\n", "choi = random_channel(num_qubits=1, target='Choi')\n", "# create channel using Choi matrix\n", "custom_choi = ChoiRepr(choi)" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Channel can also be inserted into a circuit using the same syntax as for gate. However, currently printing circuit containing a channel is not supported." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ " # by default, the channel would act on qubit with index 0, we can specify which qubit it acts on by providing qubits_idx\n", "custom_choi = ChoiRepr(choi, qubits_idx=[2])\n", "cir = Circuit(3)\n", "cir.append(bit_flip_channel) # insert a channel object at the end of the circuit\n", "cir.h()\n", "cir.insert(index=2, operator = custom_choi) # insert a channel object at specific position\n", "cir.bit_flip(0.5, qubits_idx=[2]) # create a channel when building the circuit" ] } ], "metadata": { "kernelspec": { "display_name": "PaddleQu", "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.7.15" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "f5d4b275a355082aa93d1cfb501360a5fbfc9f440cd049520a322ef6c5deb126" } } }, "nbformat": 4, "nbformat_minor": 2 }