-
Notifications
You must be signed in to change notification settings - Fork 206
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
e186a2e
commit d866d11
Showing
104 changed files
with
4,434 additions
and
38 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
171 changes: 171 additions & 0 deletions
171
pr-2542/_sources/examples/python/executing_photonic_kernels.ipynb.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,171 @@ | ||
{ | ||
"cells": [ | ||
{ | ||
"attachments": {}, | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"# Executing Quantum Photonic Circuits \n", | ||
"\n", | ||
"In CUDA-Q, there are 2 ways in which one can execute quantum photonic kernels: \n", | ||
"\n", | ||
"1. `sample`: yields measurement counts \n", | ||
"3. `get_state`: yields the quantum statevector of the computation \n", | ||
"\n", | ||
"## Sample\n", | ||
"\n", | ||
"Quantum states collapse upon measurement and hence need to be sampled many times to gather statistics. The CUDA-Q `sample` call enables this: \n", | ||
"\n" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": null, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"import cudaq\n", | ||
"import numpy as np\n", | ||
"\n", | ||
"qumode_count = 2\n", | ||
"\n", | ||
"# Define the simulation target.\n", | ||
"cudaq.set_target(\"orca-photonics\")\n", | ||
"\n", | ||
"# Define a quantum kernel function.\n", | ||
"\n", | ||
"\n", | ||
"@cudaq.kernel\n", | ||
"def kernel(qumode_count: int):\n", | ||
" level = qumode_count + 1\n", | ||
" qumodes = [qudit(level) for _ in range(qumode_count)]\n", | ||
"\n", | ||
" # Apply the create gate to the qumodes.\n", | ||
" for i in range(qumode_count):\n", | ||
" create(qumodes[i]) # |00⟩ -> |11⟩\n", | ||
"\n", | ||
" # Apply the beam_splitter gate to the qumodes.\n", | ||
" beam_splitter(qumodes[0], qumodes[1], np.pi / 6)\n", | ||
"\n", | ||
" # measure all qumodes\n", | ||
" mz(qumodes)\n", | ||
"\n", | ||
"\n", | ||
"result = cudaq.sample(kernel, qumode_count, shots_count=1000)\n", | ||
"\n", | ||
"print(result)" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"\n", | ||
"## Get state\n", | ||
"\n", | ||
"The `get_state` function gives us access to the quantum statevector of the computation." | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": null, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"import cudaq\n", | ||
"import numpy as np\n", | ||
"\n", | ||
"qumode_count = 2\n", | ||
"\n", | ||
"# Define the simulation target.\n", | ||
"cudaq.set_target(\"orca-photonics\")\n", | ||
"\n", | ||
"# Define a quantum kernel function.\n", | ||
"\n", | ||
"\n", | ||
"@cudaq.kernel\n", | ||
"def kernel(qumode_count: int):\n", | ||
" level = qumode_count + 1\n", | ||
" qumodes = [qudit(level) for _ in range(qumode_count)]\n", | ||
"\n", | ||
" # Apply the create gate to the qumodes.\n", | ||
" for i in range(qumode_count):\n", | ||
" create(qumodes[i]) # |00⟩ -> |11⟩\n", | ||
"\n", | ||
" # Apply the beam_splitter gate to the qumodes.\n", | ||
" beam_splitter(qumodes[0], qumodes[1], np.pi / 6)\n", | ||
"\n", | ||
" # measure some of all qumodes if need to be measured\n", | ||
" # mz(qumodes)\n", | ||
"\n", | ||
"\n", | ||
"# Compute the statevector of the kernel\n", | ||
"result = cudaq.get_state(kernel, qumode_count)\n", | ||
"\n", | ||
"print(np.array(result))" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"The statevector generated by the `get_state` command follows little-endian convention for associating numbers with their digit string representations, which places the least significant digit on the right. That is, for the example of a 2-qumode system of level 3 (in which possible states are 0, 1, and 2), we have the following translation between integers and digit string:\n", | ||
"$$\\begin{matrix} \n", | ||
"\\text{Integer} & \\text{digit string representation}\\\\\n", | ||
"& \\text{least significant bit on right}\\\\\n", | ||
"0 = \\textcolor{blue}{0}*3^1 + \\textcolor{red}{0}*3^0 & \\textcolor{blue}{0}\\textcolor{red}{0} \\\\\n", | ||
"1 = \\textcolor{blue}{0}*3^1 + \\textcolor{red}{1}*3^0 & \\textcolor{blue}{0}\\textcolor{red}{1}\\\\\n", | ||
"2 = \\textcolor{blue}{0}*3^1 + \\textcolor{red}{2}*3^0 & \\textcolor{blue}{0}\\textcolor{red}{2}\\\\\n", | ||
"3 = \\textcolor{blue}{1}*3^1 + \\textcolor{red}{0}*3^0 & \\textcolor{blue}{1}\\textcolor{red}{0} \\\\\n", | ||
"4 = \\textcolor{blue}{1}*3^1 + \\textcolor{red}{1}*3^0 & \\textcolor{blue}{1}\\textcolor{red}{1} \\\\\n", | ||
"5 = \\textcolor{blue}{1}*3^1 + \\textcolor{red}{2}*3^0 & \\textcolor{blue}{1}\\textcolor{red}{2} \\\\\n", | ||
"6 = \\textcolor{blue}{2}*3^1 + \\textcolor{red}{0}*3^0 & \\textcolor{blue}{2}\\textcolor{red}{0} \\\\\n", | ||
"7 = \\textcolor{blue}{2}*3^1 + \\textcolor{red}{1}*3^0 & \\textcolor{blue}{2}\\textcolor{red}{1} \\\\\n", | ||
"8 = \\textcolor{blue}{2}*3^1 + \\textcolor{red}{2}*3^0 & \\textcolor{blue}{2}\\textcolor{red}{2} \n", | ||
"\\end{matrix}\n", | ||
"$$\n" | ||
] | ||
}, | ||
{ | ||
"attachments": {}, | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"\n", | ||
"## Parallelization Techniques\n", | ||
"\n", | ||
"The most intensive task in the computation is the execution of the quantum photonic kernel hence each execution function: `sample`, and `get_state` can be parallelized given access to multiple quantum processing units (multi-QPU). We emulate each QPU with a CPU." | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": null, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"print(cudaq.__version__)" | ||
] | ||
} | ||
], | ||
"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.10.12" | ||
} | ||
}, | ||
"nbformat": 4, | ||
"nbformat_minor": 4 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.