{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Calculation of control fields for Hadamard gate on single qubit using L-BFGS-B algorithm" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Alexander Pitchford (agp1@aber.ac.uk)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Example to demonstrate using the control library to determine control\n", "pulses using the ctrlpulseoptim.optimize_pulse_unitary function.\n", "The (default) L-BFGS-B algorithm is used to optimise the pulse to\n", "minimise the fidelity error, which is equivalent maximising the fidelity\n", "to an optimal value of 1.\n", "\n", "The system in this example is a single qubit in a constant field in z\n", "with a variable control field in x\n", "The target evolution is the Hadamard gate irrespective of global phase\n", "\n", "The user can experiment with the timeslicing, by means of changing the\n", "number of timeslots and/or total time for the evolution.\n", "Different initial (starting) pulse types can be tried.\n", "The initial and final pulses are displayed in a plot\n", "\n", "An in depth discussion of using methods of this type can be found in [1]" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import datetime" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from qutip import Qobj, identity, sigmax, sigmaz\n", "from qutip.qip import hadamard_transform\n", "import qutip.logging_utils as logging\n", "logger = logging.get_logger()\n", "#Set this to None or logging.WARN for 'quiet' execution\n", "log_level = logging.INFO\n", "#QuTiP control modules\n", "import qutip.control.pulseoptim as cpo\n", "\n", "example_name = 'Hadamard'\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Defining the physics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The dynamics of the system are governed by the combined Hamiltonian:\n", "H(t) = H_d + sum(u1(t)*Hc1 + u2(t)*Hc2 + ....)\n", "That is the time-dependent Hamiltonian has a constant part (called here the drift) and time vary parts, which are the control Hamiltonians scaled by some functions u_j(t) known as control amplitudes\n", "In this case the drift is simply a rotation about z and the (time-varying) control is a rotation about x\n", "In theory this system is fully controllable (irrespective of global phase) and so any unitary target could be chosen; we have chosen the Hadamard gate." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Drift Hamiltonian\n", "H_d = sigmaz()\n", "# The (single) control Hamiltonian\n", "H_c = [sigmax()]\n", "# start point for the gate evolution\n", "U_0 = identity(2)\n", "# Target for the gate evolution Hadamard gate\n", "U_targ = hadamard_transform(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Defining the time evolution parameters" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To solve the evolution the control amplitudes are considered constant within piecewise timeslots, hence the evolution during the timeslot can be calculated using U(t_k) = expm(-i*H(t_k)*dt). Combining these for all the timeslots gives the approximation to the evolution from the identity at t=0 to U(T) at the t=evo_time\n", "The number of timeslots and evo_time have to be chosen such that the timeslot durations (dt) are small compared with the dynamics of the system." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Number of time slots\n", "n_ts = 10\n", "# Time allowed for the evolution\n", "evo_time = 10" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Set the conditions which will cause the pulse optimisation to terminate" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "At each iteration the fidelity of the evolution is tested by comparaing the calculated evolution U(T) with the target U_targ. For unitary systems such as this one this is typically:\n", "f = normalise(overlap(U(T), U_targ))\n", "For details of the normalisation see [1] or the source code.\n", "The maximum fidelity (for a unitary system) calculated this way would be 1, and hence the error is calculated as fid_err = 1 - fidelity. As such the optimisation is considered completed when the fid_err falls below such a target value.\n", "\n", "In some cases the optimisation either gets stuck in some local minima, or the fid_err_targ is just not achievable, therefore some limits are set to the time/effort allowed to find a solution.\n", "\n", "The algorithm uses gradients to direct its search for the minimum fidelity error. If the sum of all the gradients falls below the min_grad, then it is assumed some local minima has been found." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# Fidelity error target\n", "fid_err_targ = 1e-10\n", "# Maximum iterations for the optisation algorithm\n", "max_iter = 200\n", "# Maximum (elapsed) time allowed in seconds\n", "max_wall_time = 120\n", "# Minimum gradient (sum of gradients squared)\n", "# as this tends to 0 -> local minima has been found\n", "min_grad = 1e-20" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Set the initial pulse type" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The control amplitudes must be set to some initial values. Typically these are just random values for each control in each timeslot. These do however result in erratic optimised pulses. For this example, a solution will be found for any initial pulse, and so it can be interesting to look at the other initial pulse alternatives." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "# pulse type alternatives: RND|ZERO|LIN|SINE|SQUARE|SAW|TRIANGLE|\n", "p_type = 'RND'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Give an extension for output files" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "#Set to None to suppress output files\n", "f_ext = \"{}_n_ts{}_ptype{}.txt\".format(example_name, n_ts, p_type)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Run the optimisation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this step the L-BFGS-B algorithm is invoked. At each iteration the gradient of the fidelity error w.r.t. each control amplitude in each timeslot is calculated using an exact gradient method (see [1]). Using the gradients the algorithm will determine a set of piecewise control amplitudes that reduce the fidelity error. With repeated iterations an approximation of the Hessian matrix (the 2nd order differentials) is calculated, which enables a quasi 2nd order Newton method for finding a minima. The algorithm continues until one of the termination conditions defined above has been reached." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:qutip.control.dynamics:Setting memory optimisations for level 0\n", "INFO:qutip.control.dynamics:Internal operator data type choosen to be \n", "INFO:qutip.control.dynamics:phased dynamics generator caching True\n", "INFO:qutip.control.dynamics:propagator gradient caching True\n", "INFO:qutip.control.dynamics:eigenvector adjoint caching True\n", "INFO:qutip.control.dynamics:use sparse eigen decomp False\n", "INFO:qutip.control.pulseoptim:System configuration:\n", "Drift Hamiltonian:\n", "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = True\n", "Qobj data =\n", "[[ 1. 0.]\n", " [ 0. -1.]]\n", "Control 1 Hamiltonian:\n", "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = True\n", "Qobj data =\n", "[[ 0. 1.]\n", " [ 1. 0.]]\n", "Initial state / operator:\n", "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = True\n", "Qobj data =\n", "[[ 1. 0.]\n", " [ 0. 1.]]\n", "Target state / operator:\n", "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = True\n", "Qobj data =\n", "[[ 0.70710678 0.70710678]\n", " [ 0.70710678 -0.70710678]]\n", "INFO:qutip.control.pulseoptim:Initial amplitudes output to file: ctrl_amps_initial_Hadamard_n_ts10_ptypeRND.txt\n", "INFO:qutip.control.optimizer:Optimising pulse(s) using GRAPE with 'fmin_l_bfgs_b' method\n", "INFO:qutip.control.pulseoptim:Final amplitudes output to file: ctrl_amps_final_Hadamard_n_ts10_ptypeRND.txt\n" ] } ], "source": [ "result = cpo.optimize_pulse_unitary(H_d, H_c, U_0, U_targ, n_ts, evo_time, \n", " fid_err_targ=fid_err_targ, min_grad=min_grad, \n", " max_iter=max_iter, max_wall_time=max_wall_time, \n", " out_file_ext=f_ext, init_pulse_type=p_type, \n", " log_level=log_level, gen_stats=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Report the results" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Firstly the performace statistics are reported, which gives a breadown of the processing times. The times given are those that are associated with calculating the fidelity and the gradients. Any remaining processing time can be assumed to be used by the optimisation algorithm (L-BFGS-B) itself. In this example it can be seen that the majority of time is spent calculating the propagators, i.e. exponentiating the combined Hamiltonian.\n", "\n", "The optimised U(T) is reported as the 'final evolution', which is essentially the string representation of the Qobj that holds the full time evolution at the point when the optimisation is terminated.\n", "\n", "The key information is in the summary (given) last. Here the final fidelity is reported and the reasonn for termination of the algorithm." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "------------------------------------\n", "---- Control optimisation stats ----\n", "**** Timings (HH:MM:SS.US) ****\n", "Total wall time elapsed during optimisation: 0:00:00.079766\n", "Wall time computing Hamiltonians: 0:00:00.000455 (0.57%)\n", "Wall time computing propagators: 0:00:00.014075 (17.65%)\n", "Wall time computing forward propagation: 0:00:00.000148 (0.19%)\n", "Wall time computing onward propagation: 0:00:00.000145 (0.18%)\n", "Wall time computing gradient: 0:00:00.000529 (0.66%)\n", "\n", "**** Iterations and function calls ****\n", "Number of iterations: 5\n", "Number of fidelity function calls: 7\n", "Number of times fidelity is computed: 7\n", "Number of gradient function calls: 6\n", "Number of times gradients are computed: 6\n", "Number of times timeslot evolution is recomputed: 7\n", "\n", "**** Control amplitudes ****\n", "Number of control amplitude updates: 6\n", "Mean number of updates per iteration: 1.2\n", "Number of timeslot values changed: 60\n", "Mean number of timeslot changes per update: 10.0\n", "Number of amplitude values changed: 60\n", "Mean number of amplitude changes per update: 10.0\n", "------------------------------------\n", "Final evolution\n", "Quantum object: dims = [[2], [2]], shape = (2, 2), type = oper, isherm = False\n", "Qobj data =\n", "[[ 3.10467786e-08+0.70710743j 5.97691111e-07+0.70710614j]\n", " [ -5.97691111e-07+0.70710614j 3.10467785e-08-0.70710743j]]\n", "\n", "********* Summary *****************\n", "Final fidelity error 5.941913627793838e-13\n", "Final gradient normal 6.91241029719096e-05\n", "Terminated due to Goal achieved\n", "Number of iterations 5\n", "Completed in 0:00:00.079766 HH:MM:SS.US\n" ] } ], "source": [ "result.stats.report()\n", "print(\"Final evolution\\n{}\\n\".format(result.evo_full_final))\n", "print(\"********* Summary *****************\")\n", "print(\"Final fidelity error {}\".format(result.fid_err))\n", "print(\"Final gradient normal {}\".format(result.grad_norm_final))\n", "print(\"Terminated due to {}\".format(result.termination_reason))\n", "print(\"Number of iterations {}\".format(result.num_iter))\n", "print(\"Completed in {} HH:MM:SS.US\".format(\n", " datetime.timedelta(seconds=result.wall_time)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plot the initial and final amplitudes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here the (random) starting pulse is plotted along with the pulse (control amplitudes) that was found to produce the target gate evolution to within the specified error." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig1 = plt.figure()\n", "ax1 = fig1.add_subplot(2, 1, 1)\n", "ax1.set_title(\"Initial control amps\")\n", "#ax1.set_xlabel(\"Time\")\n", "ax1.set_ylabel(\"Control amplitude\")\n", "ax1.step(result.time,\n", " np.hstack((result.initial_amps[:, 0], result.initial_amps[-1, 0])),\n", " where='post')\n", "\n", "ax2 = fig1.add_subplot(2, 1, 2)\n", "ax2.set_title(\"Optimised Control Sequences\")\n", "ax2.set_xlabel(\"Time\")\n", "ax2.set_ylabel(\"Control amplitude\")\n", "ax2.step(result.time,\n", " np.hstack((result.final_amps[:, 0], result.final_amps[-1, 0])),\n", " where='post')\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Versions" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
SoftwareVersion
QuTiP4.1.0
Numpy1.11.3
SciPy0.18.1
matplotlib2.0.0
Cython0.25.2
Number of CPUs4
BLAS InfoINTEL MKL
IPython5.1.0
Python3.6.0 |Anaconda 4.3.1 (64-bit)| (default, Dec 23 2016, 12:22:00) \n", "[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]
OSposix [linux]
Fri Jul 14 16:45:36 2017 BST
" ], "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from qutip.ipynbtools import version_table\n", "\n", "version_table()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### References" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[1] Machnes et.al., DYNAMO - Dynamic Framework for Quantum Optimal Control. arXiv.1011.4874" ] } ], "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.7.3" } }, "nbformat": 4, "nbformat_minor": 1 }