{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# How to find time-optimal controls\n",
    "**Optimizing over the duration of your controls**\n",
    "\n",
    "Boulder Opal provides a highly-flexible optimization engine for general-purpose gradient-based optimization,\n",
    "which can be directly applied to model-based control optimization in arbitrary quantum systems.\n",
    "By expressing the problem as a [graph](https://docs.q-ctrl.com/boulder-opal/toolkit/design/calculate-with-graphs/get-an-introduction-to-graphs-in-boulder-opal) which defines the cost function to be minimized, one can obtain optimized controls which achieve the desired objectives within the constraints imposed by the system.\n",
    "\n",
    "Boulder Opal is also capable of generating time-optimal controls by aiming to minimize the duration of the generated pulses.\n",
    "This allows you to obtain not only pulses which minimize a target infidelity, but also do so in a short timescale.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Summary workflow\n",
    "\n",
    "### 1. Define an optimizable duration tensor\n",
    "\n",
    "Create an optimization variable for the optimized duration\n",
    "```python\n",
    "optimizable_duration = graph.optimizable_scalar(\n",
    "    lower_bound=0, upper_bound=max_duration, name=\"optimizable_duration\"\n",
    ")\n",
    "```\n",
    "\n",
    "### 2. Scale the values in your calculation\n",
    "\n",
    "Set up your optimization graph similarly to [how you would otherwise](https://docs.q-ctrl.com/boulder-opal/toolkit/design/design-model-based-controls/how-to-optimize-controls-in-arbitrary-quantum-systems-using-graphs), but multiply the energies and frequencies by the duration, and divide the times by the duration.\n",
    "For example, multiply the Hamiltonian by `optimizable_duration`, and set the duration to 1.\n",
    "\n",
    "This will lead to the same evolution, as the dynamics driven by a Hamiltonian $H$ for a time $T$ are equivalent to those driven by a (unitless) Hamiltonian $\\tilde{H} = H T$ for a (unitless) time $\\tilde{T} = 1$.\n",
    "\n",
    "### 3. Define the optimization cost\n",
    "\n",
    "As now your optimization has two targets (minimizing infidelity and duration), you need to combine them in a single node. One way of doing this is with a weighted sum of both items, for instance,\n",
    "\n",
    "```python\n",
    "cost = infidelity + 0.1 * optimizable_duration / max_duration\n",
    "cost.name = \"cost\"\n",
    "```\n",
    "\n",
    "You can alter the incentives of the optimizer to minimize the duration or the infidelity by changing the weight of each term in the sum (or using a different form for the cost function).\n",
    "\n",
    "### 4. Execute graph-based optimization\n",
    "\n",
    "You can now run the optimization as usual using, for instance `boulderopal.run_optimization`.\n",
    "Note that some of the output graph values might need to be rescaled back by a factor of `optimizable_duration` (or its inverse)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example: Optimal control of a single qubit\n",
    "\n",
    "This example shows how to optimize a Hamiltonian with multiple controls.\n",
    "Specifically, consider a single-qubit system represented by the following Hamiltonian:\n",
    "$$\n",
    "H(t) = \\frac{1 + \\beta(t)}{2} \\left[\\gamma(t)\\sigma_{-} + \\gamma^*(t)\\sigma_{+}\\right] + \\frac{\\alpha(t)}{2} \\sigma_{z} \\, , \n",
    "$$\n",
    "where $\\gamma(t)$ and $\\alpha(t)$ are, respectively, complex and real time-dependent pulses, $\\sigma_{\\pm}$ are the qubit ladder operators, and $\\sigma_{z}$ is the Pauli-Z operator.\n",
    "$\\beta(t)$ is a small, slowly-varying amplitude noise acting on $\\gamma(t)$.\n",
    "\n",
    "We will obtain optimal pulses for $\\gamma(t)$ and $\\alpha(t)$, robust to the amplitude noise $\\beta(t)$, to achieve a target Y-gate operation.\n",
    "Moreover, we will aim to obtain a pulse that is as short as possible by adding a penalty to the cost function that increases with the pulse duration."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "pycharm": {
     "is_executing": true,
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import qctrlvisualizer as qv\n",
    "import boulderopal as bo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Your task (action_id=\"1829418\") has started.\n",
      "Your task (action_id=\"1829418\") has completed.\n",
      "Optimized cost:\t\t4.475e-02\n",
      "Optimized infidelity:\t6.819e-05\n",
      "Optimized duration:\t4.468e-06\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 720x540 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Define physical constants.\n",
    "gamma_max = 2 * np.pi * 3e5  # rad/s\n",
    "alpha_max = 2 * np.pi * 1e5  # rad/s\n",
    "cutoff_frequency = 5e6  # Hz\n",
    "segment_count = 16\n",
    "max_duration = 10e-6  # s\n",
    "\n",
    "# Create the graph describing the system.\n",
    "graph = bo.Graph()\n",
    "\n",
    "# Define optimizable duration.\n",
    "duration = graph.optimizable_scalar(0, max_duration)\n",
    "duration.name = \"duration\"\n",
    "\n",
    "# Create a optimizable complex-valued piecewise-constant (PWC) signal.\n",
    "rough_gamma = graph.complex_optimizable_pwc_signal(\n",
    "    segment_count=segment_count, maximum=gamma_max, duration=1.0\n",
    ")\n",
    "# Smooth the signal.\n",
    "gamma = graph.filter_and_resample_pwc(\n",
    "    pwc=rough_gamma,\n",
    "    segment_count=256,\n",
    "    kernel=graph.sinc_convolution_kernel(cutoff_frequency * duration),\n",
    "    name=r\"$\\gamma$\",\n",
    ")\n",
    "\n",
    "# Create a PWC operator representing the drive term.\n",
    "drive = graph.hermitian_part(gamma * graph.pauli_matrix(\"M\"))\n",
    "\n",
    "# Create an optimizable real-valued PWC signal.\n",
    "rough_alpha = graph.real_optimizable_pwc_signal(\n",
    "    segment_count=segment_count, minimum=-alpha_max, maximum=alpha_max, duration=1.0\n",
    ")\n",
    "# Smooth the signal.\n",
    "alpha = graph.filter_and_resample_pwc(\n",
    "    pwc=rough_alpha,\n",
    "    segment_count=256,\n",
    "    kernel=graph.sinc_convolution_kernel(cutoff_frequency * duration),\n",
    "    name=r\"$\\alpha$\",\n",
    ")\n",
    "# Create a PWC operator representing the clock shift term.\n",
    "shift = alpha * graph.pauli_matrix(\"Z\") / 2\n",
    "\n",
    "# Define the total Hamiltonian.\n",
    "hamiltonian = drive + shift\n",
    "\n",
    "# Create the infidelity.\n",
    "infidelity = graph.infidelity_pwc(\n",
    "    hamiltonian=hamiltonian * duration,\n",
    "    target=graph.target(graph.pauli_matrix(\"Y\")),\n",
    "    noise_operators=[drive * duration],\n",
    "    name=\"infidelity\",\n",
    ")\n",
    "\n",
    "cost = infidelity + 0.1 * duration / max_duration\n",
    "cost.name = \"cost\"\n",
    "\n",
    "# Run the optimization.\n",
    "result = bo.run_optimization(\n",
    "    graph=graph,\n",
    "    cost_node_name=\"cost\",\n",
    "    output_node_names=[r\"$\\alpha$\", r\"$\\gamma$\", \"duration\", \"infidelity\"],\n",
    "    optimization_count=20,\n",
    ")\n",
    "print(f\"Optimized cost:\\t\\t{result['cost']:.3e}\")\n",
    "print(f\"Optimized infidelity:\\t{result['output']['infidelity']['value']:.3e}\")\n",
    "optimized_duration = result[\"output\"][\"duration\"][\"value\"]\n",
    "print(f\"Optimized duration:\\t{optimized_duration:.3e}\")\n",
    "\n",
    "# Plot the optimized controls, scaling back the durations.\n",
    "gamma_durations = result[\"output\"][r\"$\\gamma$\"][\"durations\"] * optimized_duration\n",
    "gamma_values = result[\"output\"][r\"$\\gamma$\"][\"values\"]\n",
    "\n",
    "alpha_durations = result[\"output\"][r\"$\\alpha$\"][\"durations\"] * optimized_duration\n",
    "alpha_values = result[\"output\"][r\"$\\alpha$\"][\"values\"]\n",
    "\n",
    "qv.plot_controls(\n",
    "    {\n",
    "        r\"$\\gamma$\": {\"durations\": gamma_durations, \"values\": gamma_values},\n",
    "        r\"$\\alpha$\": {\"durations\": alpha_durations, \"values\": alpha_values},\n",
    "    },\n",
    "    polar=False,\n",
    ")\n",
    "plt.show()"
   ]
  }
 ],
 "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.11.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
