\n",
"

\n",
" \n",
" Play\n",
" \n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/javascript": [
"\n",
" function visualizerLoader() {\n",
" if ((typeof Visualizer) == \"function\") {\n",
" console.log(\"Using preloaded Q-CTRL Visualizer JavaScript package.\");\n",
" displayBlochSphere();\n",
" return;\n",
" }\n",
"\n",
" try {\n",
" console.log(\"Attempting to load https://cdn.jsdelivr.net/npm/@qctrl/visualizer@3.1.14/umd/visualizer.min.js with require.js.\");\n",
" requirejs([\"https://cdn.jsdelivr.net/npm/@qctrl/visualizer@3.1.14/umd/visualizer.min.js\"], displayBlochSphere, displayErrorMessage);\n",
" } catch(error) {\n",
" var existing_script = document.getElementById(\"qctrlvisualizer-script\");\n",
"\n",
" if (existing_script !== null) {\n",
" console.log(\n",
" \"Script tag for the Q-CTRL Visualizer JavaScript package already exists.\"\n",
" + \" Delaying execution of function until script is loaded.\"\n",
" );\n",
" existing_script.addEventListener(\"load\", displayBlochSphere);\n",
" existing_script.addEventListener(\"error\", displayErrorMessage);\n",
" return;\n",
" }\n",
"\n",
" console.log(\"Attempting to load https://cdn.jsdelivr.net/npm/@qctrl/visualizer@3.1.14/umd/visualizer.min.js with script tag.\");\n",
" var script = document.createElement(\"script\");\n",
" script.onload = displayBlochSphere;\n",
" script.onerror = displayErrorMessage;\n",
" script.id = \"qctrlvisualizer-script\";\n",
" script.src = \"https://cdn.jsdelivr.net/npm/@qctrl/visualizer@3.1.14/umd/visualizer.min.js\";\n",
" document.head.appendChild(script);\n",
" }\n",
" }\n",
"\n",
" function displayBlochSphere() { \n",
" let isPlaying = false;\n",
" let progress = 0;\n",
"\n",
" const visualizationData = {\"data\": {\"qubits\": [{\"name\": \"qubit1\", \"x\": [0.0, 0.006430619526280447, 0.025552931348405705, 0.05686276538803276, 0.09953462096158826, 0.1524434315516091, 0.2141942277930763, 0.2831589165940872, 0.3575192066894886, 0.43531454887206433, 0.5144938269311933, 0.5929694364394638, 0.668672325570829, 0.7396065467694081, 0.8039018809847254, 0.859863147007, 0.9060148958352392, 0.9411403116869772, 0.9643132940035296, 0.974922874591372, 0.9726893261285195, 0.9576715373264406, 0.9302654602973747, 0.8911936710630586, 0.8414863184476763, 0.7824539636477743, 0.7156530265785325, 0.6428447500221455, 0.5659487635106955, 0.4869924712568316, 0.40805759854678403, 0.3312253059289424, 0.25852131829205216, 0.19186251553451134, 0.1330063929906253, 0.08350472411696948, 0.04466264714715723, 0.017504254417462315, 0.0027455916193038802, 0.000775778867885417, 0.011646751340210716, 0.035071889976094124, 0.07043357834447268, 0.11679948643416029, 0.1729471520381046, 0.2373962116296751, 0.30844743094652627, 0.3842275062196078, 0.4627384548387277, 0.5419102932430959, 0.6196556131558179, 0.6939246172304302, 0.7627591630649564, 0.8243443906838381, 0.8770565723013238, 0.9195059227814473, 0.9505732420736986, 0.969439423526791, 0.9756070500778865, 0.9689135089220909, 0.9495352788868755, 0.9179832774724819, 0.8750893902361031, 0.821984537679904, 0.760068857921214, 0.6909747912949148, 0.6165240401823954, 0.5386795388444414, 0.4594936995993546, 0.3810542998637589, 0.3054294367734873, 0.2346130006857091, 0.17047210518284447, 0.11469785961461278, 0.06876078208673476, 0.033872028456907954, 0.010951459556523813, 0.0006033885630722515, 0.0031006479568514668, 0.018377396145280212, 0.046030853412043986, 0.0853319214218412, 0.13524440629174692, 0.1944523384025412, 0.2613946686484215, 0.33430642633973023, 0.4112652536083754, 0.4902420894112098, 0.5691546668202383, 0.6459224131147224, 0.718521305204593, 0.7850372340923055, 0.843716471390292, 0.8930119073170154, 0.9316238410818847, 0.9585342481985151, 0.9730336212501027, 0.9747396764356435, 0.9636074326888026, 0.93993039762802], \"y\": [0.0, -0.12637476841820008, -0.2494175978173812, -0.3658843975502003, -0.47270445754290374, -0.5670614092247825, -0.646467480606541, -0.7088290877323349, -0.7525020331514232, -0.7763348560719191, -0.7796991912464231, -0.7625063361611238, -0.7252095897254799, -0.6687923008016644, -0.5947419416807476, -0.5050108900724231, -0.40196495361229373, -0.28832099406588774, -0.16707529580094757, -0.04142456713190681, 0.08531834262122479, 0.20981178819431592, 0.32877343266118153, 0.43906678801929433, 0.5377839103898571, 0.6223220695286221, 0.6904523712144081, 0.7403785232489719, 0.7707841956709172, 0.7808677265060198, 0.7703632580181237, 0.7395477461919314, 0.6892336586388973, 0.6207475534498694, 0.535895103774608, 0.43691349027402565, 0.3264124166438519, 0.20730530336730696, 0.08273247381064795, -0.044021642098342494, -0.16961510363918111, -0.29073657137062203, -0.4041926123833372, -0.5069918968832129, -0.5964240662168597, -0.6701311929412592, -0.726169948854218, -0.7630628418919264, -0.7798371710051524, -0.7760506719477195, -0.7518031778122047, -0.707733986876539, -0.6450050071596479, -0.5652701220890395, -0.47063158497104407, -0.3635845919470513, -0.24695149479969764, -0.12380738812388252, 0.002600967202959436, 0.12894074662482283, 0.2518809336264719, 0.36818014378280994, 0.4747720856097739, 0.5688464049952907, 0.6479227817031978, 0.7099163243557799, 0.7531925397209085, 0.7766104270088271, 0.779552560974178, 0.7619413706660423, 0.7242411846279537, 0.6674459886250842, 0.5930532186727361, 0.5030242803270932, 0.3997328351684655, 0.2859022179318066, 0.1645336343156659, 0.03882703257312827, -0.08790326485203834, -0.21231594522654273, -0.3311308010422763, -0.44121521445877593, -0.5396667504643737, -0.6238896811427662, -0.6916634234413729, -0.741201086042755, -0.7711965817192286, -0.780859063027984, -0.7699337734310175, -0.7387087640888411, -0.6880072992360686, -0.6191661503752631, -0.5340003515743365, -0.4347553451131229, -0.3240477791850083, -0.2047965185541664, -0.08014568710969679, 0.046618228658716857, 0.17215302965201026, 0.29314892304595047], \"z\": [1.0, 0.9919617255921492, 0.9680588358144924, 0.9289215432649582, 0.8755817237980136, 0.8094457105604873, 0.732257215258653, 0.6460513542573891, 0.5531009916381371, 0.45585681390991717, 0.35688271633600593, 0.2587882044506678, 0.1641595930364611, 0.07549181653823678, -0.004877351230910099, -0.07482893375875366, -0.13251861979405333, -0.1764253896087261, -0.2053916175044168, -0.21865359323921968, -0.21586165766065435, -0.19708942165805565, -0.16283182537172392, -0.11399208882882866, -0.05185789805960117, 0.02193254544027584, 0.10543371677682772, 0.19644406247231144, 0.29256404561162364, 0.39125941092895333, 0.4899280018165127, 0.5859683675888144, 0.6768483521349271, 0.7601718555818526, 0.8337420087617099, 0.8956190948537796, 0.9441716910660446, 0.9781196819781628, 0.9965680104758606, 0.9990302764151333, 0.9854415608247266, 0.9561601375298717, 0.9119580270693983, 0.8540006419572888, 0.783816059952358, 0.7032547354628946, 0.6144407113168306, 0.5197156172254782, 0.42157693145157793, 0.3226121334461175, 0.22543048355521478, 0.13259422846194896, 0.0465510461687908, -0.030430488354811824, -0.09632071537666925, -0.1493824034768237, -0.1882165525921385, -0.21179927940850418, -0.21950881259737404, -0.21114188615262947, -0.18691909860861056, -0.14747909684061855, -0.09386173779514573, -0.02748067209989702, 0.04991392759846508, 0.13628151088133905, 0.22934494977198783, 0.3266505764444302, 0.42563287550078865, 0.523682125170283, 0.6182132040331224, 0.7067337491428446, 0.7869098685214252, 0.8566276754817144, 0.9140490223915616, 0.9576599644288447, 0.9863106755543243, 0.9992457642961383, 0.9961241900539137, 0.9770282548183773, 0.9424614332349222, 0.8933350982226751, 0.8309444921352926, 0.7569345769967993, 0.6732566641894486, 0.5821169670753122, 0.48591843298950527, 0.387197388235962, 0.28855666647467587, 0.19259698360657052, 0.10184836849423196, 0.018703457384591005, -0.05464558923789259, -0.11626488414629732, -0.16452980135238426, -0.19816781024817248, -0.21629202656265717, -0.2184245955445836, -0.20450929086103292, -0.17491299703505475]}]}};\n",
" const themeSettings = {\"highlightColor\": \"#EB6467\", \"pathColor\": \"#EB6467\"};\n",
" const labels = {\"xAxis\": true, \"yAxis\": true, \"zAxis\": true, \"theta\": true, \"phi\": true, \"northPole\": true, \"southPole\": true, \"nonErrorState\": false};\n",
"\n",
" const wrapper = document.getElementById(\"qctrlvisualizer-wrapper-c5c6c5895c1a4d33a2dc2324f0015553\");\n",
" const progressBar = document.getElementById(\"qctrlvisualizer-progress-bar-c5c6c5895c1a4d33a2dc2324f0015553\");\n",
" const button = document.getElementById(\"qctrlvisualizer-button-c5c6c5895c1a4d33a2dc2324f0015553\");\n",
"\n",
" function updateButton () {\n",
" button.classList.remove(...[\n",
" \"qctrlvisualizer-button-play\",\n",
" \"qctrlvisualizer-button-pause\",\n",
" \"qctrlvisualizer-button-replay\"\n",
" ]);\n",
" if (isPlaying) {\n",
" button.classList.add(\"qctrlvisualizer-button-pause\");\n",
" button.innerHTML = \"Pause\";\n",
" return;\n",
" }\n",
" if (progress>=1) {\n",
" button.classList.add(\"qctrlvisualizer-button-replay\");\n",
" button.innerHTML = \"Replay\";\n",
" return;\n",
" }\n",
" button.classList.add(\"qctrlvisualizer-button-play\");\n",
" button.innerHTML = \"Play\";\n",
" }\n",
"\n",
" button.onclick = () => {\n",
" isPlaying = !isPlaying;\n",
" if (progress >= 1) progress = 0;\n",
" updateButton();\n",
" visualizer.update({ isPlaying, progress });\n",
" };\n",
"\n",
" progressBar.oninput = ({ target }) => {\n",
" progress = +target.value;\n",
" visualizer.update({ progress });\n",
" updateButton();\n",
" };\n",
"\n",
" const onUpdate = ({ target, data }) => {\n",
" progress = data.progress;\n",
" progressBar.value = progress;\n",
" if (progress >= 1) {\n",
" isPlaying = false;\n",
" target.update({ isPlaying });\n",
" updateButton();\n",
" }\n",
" };\n",
"\n",
" const visualizer = new Visualizer({\n",
" visualizationData,\n",
" wrapper,\n",
" onUpdate,\n",
" labels,\n",
" }).init();\n",
"\n",
" visualizer.update({ themeSettings });\n",
" }\n",
"\n",
" function displayErrorMessage() {\n",
" console.log(\"Failed to load https://cdn.jsdelivr.net/npm/@qctrl/visualizer@3.1.14/umd/visualizer.min.js.\");\n",
" const wrapper = document.getElementById(\"qctrlvisualizer-wrapper-c5c6c5895c1a4d33a2dc2324f0015553\");\n",
" wrapper.innerHTML = \"Could not load JavaScript at https://cdn.jsdelivr.net/npm/@qctrl/visualizer@3.1.14/umd/visualizer.min.js.\";\n",
" }\n",
"\n",
" visualizerLoader();\n",
" "
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"qctrlvisualizer.display_bloch_sphere(states.squeeze())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Simulating a $\\pi/2$ gate in a single qubit with a time-dependent Hamiltonian\n",
"\n",
"The next simulation you will perform will implement a $\\pi/2$ gate for a qubit,\n",
"$$\n",
"U_{\\pi/2} = \\frac{1}{\\sqrt{2}} \\left( \\begin{array}{cc} 1 & -1 \\\\ 1 & 1 \\end{array} \\right) ,\n",
"$$\n",
"by applying a Gaussian pulse for the time-dependent Rabi drive,\n",
"$$\n",
"\\Omega(t) = \\Omega_\\mathrm{max} \\exp(- a (t-t_0)^2) .\n",
"$$\n",
"Assuming the system is in resonance ($\\delta = 0$), so the Hamiltonian describing the single-qubit dynamics simplifies to\n",
"$$\n",
"H(t) = \\frac{1}{2}\\Big(\\Omega(t) \\sigma_- + \\mathrm{H. c.} \\Big) .\n",
"$$\n",
"\n",
"Assuming the driving field is purely imaginary (or more generally applied with a fixed phase),\n",
"$\\Omega(t) = -i \\omega(t)$ with real $\\omega(t)$,\n",
"then one can show that the resulting unitary will also be a $\\pi/2$ gate as long as the integral of the Rabi rate is equal to $\\pi/2$, that is,\n",
"$$\n",
"\\int_0^T |\\Omega(t)| \\mathrm{d}t = \\frac{\\pi}{2} .\n",
"$$\n",
"\n",
"Many experiments require the inputs to be discretized in the time domain over constantly spaced segments.\n",
"A piecewise-constant (PWC) description of the pulse is better suited to describe the control in that case.\n",
"In particular, the PWC control pulse takes discrete values $\\{\\Omega_n\\}$ at $N$ different segments:\n",
"$$\n",
"\\Omega(t) = \\Omega_n \\quad \\mathrm{for} \\ t \\in \\left[ \\frac{(n-1)T}{N}, \\frac{nT}{N} \\right) .\n",
"$$\n",
"\n",
"Under this discretization, the above integral becomes a sum and the equation can be solved to obtain the precise duration of the pulse to implement a $\\pi/2$ pulse:\n",
"$$\n",
"T = \\frac{\\pi N}{2 \\sum_{n=1}^{N} |\\Omega_n|} .\n",
"$$\n",
"\n",
"In what follows, you will learn how to use a Boulder Opal to simulate this PWC pulse in a qubit and verify that this digitized Gaussian pulse implements a $\\pi/2$ gate."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 1. Define the time-dependent signal\n",
"\n",
"Start by defining the values and duration of the Gaussian pulse to use in the simulation.\n",
"In this case, you can use NumPy to create the values of a Gaussian function at the different PWC segments, and calculate its duration so that it implements a $\\pi/2$ gate."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"# Gaussian pulse parameters.\n",
"omega_max = 2.0 * np.pi * 1e6 # Hz\n",
"segment_count = 50\n",
"times = np.linspace(-3, 3, segment_count)\n",
"omega_values = -1j * omega_max * np.exp(-(times**2))\n",
"\n",
"# Total duration of the pulse to achieve a π/2 gate.\n",
"pulse_duration = 0.5 * segment_count * np.pi / np.sum(np.abs(omega_values))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can use the `plot_controls` function in the [Q-CTRL Visualizer](https://docs.q-ctrl.com/boulder-opal/references/qctrl-visualizer/) to represent the real and imaginary parts of the Gaussian pulse that you just defined."
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Plot Gaussian pulse.\n",
"qctrlvisualizer.plot_controls(\n",
" {\"$\\\\Omega$\": qctrl.utils.pwc_arrays_to_pairs(pulse_duration, omega_values)},\n",
" polar=False,\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2. Create the graph defining the simulation\n",
"\n",
"The graph in this example is very similar to the previous case, so you can follow roughly the same steps as before."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Create the graph object"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [],
"source": [
"graph = qctrl.create_graph()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Create signals for the Hamiltonian terms\n",
"\n",
"Create the signal $\\Omega(t)$ for the Rabi drive in the Hamiltonian using the `omega_values` you defined above.\n",
"You can use the `graph.pwc_signal` operation that will create equally long segments out of the total `pulse_duration`."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"# Times at which to sample the simulation.\n",
"sample_times = np.linspace(0.0, pulse_duration, 100)\n",
"\n",
"# Time-dependent Hamiltonian term coefficient.\n",
"omega_signal = graph.pwc_signal(values=omega_values, duration=pulse_duration)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Construct the Hamiltonian and solve Schrödinger's equation\n",
"\n",
"Construct the rest of the graph in the same way you did in the previous example.\n",
"Remember to assign a `name` to the nodes whose values want to extract out of the graph."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [],
"source": [
"# Total Hamiltonian, [Ω σ- + H.c.]/2\n",
"hamiltonian = graph.hermitian_part(omega_signal * graph.pauli_matrix(\"M\"))\n",
"\n",
"# Time-evolution operators, U(t).\n",
"unitaries = graph.time_evolution_operators_pwc(\n",
" hamiltonian=hamiltonian, sample_times=sample_times, name=\"unitaries\"\n",
")\n",
"\n",
"# Initial state of the qubit, |0⟩.\n",
"initial_state = graph.fock_state(2, 0)[:, None]\n",
"\n",
"# Evolved states, |ψ(t)⟩ = U(t) |0⟩\n",
"evolved_states = unitaries @ initial_state\n",
"evolved_states.name = \"states\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3. Execute the graph and retrieve the results\n",
"\n",
"Execute the graph `qctrl.functions.calculate_graph` function to evaluate the graph and retrieve the arrays with the values that you requested."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
" 0%| | 0/100 [00:00"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Calculate qubit populations |⟨ψ|0⟩|².\n",
"qubit_populations = np.abs(states.squeeze()) ** 2\n",
"\n",
"# Plot populations.\n",
"qctrlvisualizer.plot_population_dynamics(\n",
" sample_times, {rf\"$|{k}\\rangle$\": qubit_populations[:, k] for k in [0, 1]}\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Our [user guides](https://docs.q-ctrl.com/boulder-opal/user-guides/) can help you extend this simulation tool to any quantum system.\n",
"In particular, you might be interested in reading about [Hamiltonians with nonlinear dependences](https://docs.q-ctrl.com/boulder-opal/user-guides/how-to-optimize-controls-with-nonlinear-dependences), [noisy quantum systems](https://docs.q-ctrl.com/boulder-opal/user-guides/how-to-simulate-quantum-dynamics-subject-to-noise-with-graphs), [quantum circuits](https://docs.q-ctrl.com/boulder-opal/user-guides/how-to-simulate-multi-qubit-circuits-in-quantum-computing), or [open quantum systems](https://docs.q-ctrl.com/boulder-opal/user-guides/how-to-simulate-open-system-dynamics).\n",
"\n",
"If you want to learn more about Boulder Opal and its capabilities, visit our [topics page](https://docs.q-ctrl.com/boulder-opal/topics)."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"| Package | Version |\n",
"| --------------------- | ------------ |\n",
"| Python | 3.10.8 |\n",
"| matplotlib | 3.6.3 |\n",
"| numpy | 1.23.1 |\n",
"| scipy | 1.10.0 |\n",
"| qctrl | 20.2.0 |\n",
"| qctrl-commons | 17.10.0 |\n",
"| boulder-opal-toolkits | 2.0.0-beta.4 |\n",
"| qctrl-visualizer | 4.6.0 |\n"
]
}
],
"source": [
"from qctrl.utils import print_environment_related_packages\n",
"\n",
"print_environment_related_packages()"
]
}
],
"metadata": {
"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.10.8"
}
},
"nbformat": 4,
"nbformat_minor": 4
}