{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# How to add smoothing and band-limits to optimized controls\n",
    "**Incorporate smoothing of optimized waveforms**\n",
    "\n",
    "Boulder Opal exposes a highly-flexible optimization engine for general-purpose gradient-based optimization.\n",
    "It can be directly applied to model-based control optimization for arbitrary-dimensional quantum systems.\n",
    "In general the optimizer will employ whatever freedom it is given, including infinite-bandwidth transitions between time-slices of a piecewise-constant signal.\n",
    "However, such controls will not generally be faithfully reproduced on hardware, causing a challenge in realizing high-fidelity controls.\n",
    "However, by incorporating smoothing into the optimization routine we can ensure that the outputs of an optimization are well reproduced in hardware.\n",
    "\n",
    "In this user guide we introduce two different techniques for creating smooth or band-limited optimized controls: incorporating linear time-invariant filters into an optimization and using bounding slew rates in controls.\n",
    "To learn the basics about control optimization, you can follow our [robust optimization tutorial](https://docs.q-ctrl.com/boulder-opal/toolkit/design/design-error-robust-quantum-logic-gates/learn-to-design-robust-single-qubit-gates-using-computational-graphs)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Summary workflow\n",
    "\n",
    "### 1. Define smoothing constraint in computational graph\n",
    "The flexible [Boulder Opal optimization engine](https://docs.q-ctrl.com/references/boulder-opal/boulderopal/graph/run_optimization) expresses all optimization problems as data flow [graphs](https://docs.q-ctrl.com/boulder-opal/toolkit/design/calculate-with-graphs/get-an-introduction-to-graphs-in-boulder-opal), which describe how optimization variables (variables that can be tuned by the optimizer) are transformed into the cost function (the objective that the optimizer attempts to minimize).\n",
    "\n",
    "In order to add smoothing you can pursue several different methods:\n",
    "\n",
    "#### Filtering control signals\n",
    "One can achieve tight frequency-domain control over the spectral content of a waveform using filtering.\n",
    "The technique we use here is to pass the controls through a linear time-invariant filter in order to enforce explicit bandwidth limits.\n",
    "To implement this behavior, we can create optimizable signals as usual, and then use the `graph.filter_and_resample_pwc` node to generate the filtered piecewise-constant (PWC) signal.\n",
    "\n",
    "The effect of these filters is to transform the control signals before they reach the quantum system, via convolution with the filter impulse response.\n",
    "Failing to take the filters into account during the optimization can lead to poor results, since in that case the system used for the optimization does not accurately model reality.\n",
    "\n",
    "You can also additionally multiply the values of the signal by an envelope function that goes to zero at its extremities, which will effectively anchor the beginning and the end of the optimized pulse at zero.\n",
    "Note, however, that depending on the functional form of the envelope, the banwidth of the optimized signal can go beyond the bandwidth limit set by the filter.\n",
    "\n",
    "#### Bounding slew rates\n",
    "A simple alternative is to constrain the rate of change of a signal between timesteps.\n",
    "To implement a bounded slew rate, you create signal values using a Boulder Opal graph operation,\n",
    "`graph.anchored_difference_bounded_variables`.\n",
    "This function produces values that are constrained to satisfy the slew rate requirement, and in addition are anchored to zero at the start and end of the gate.\n",
    "\n",
    "\n",
    "### 2. Run graph-based optimization\n",
    "\n",
    "With the graph object created, an optimization can be run using the `boulderopal.run_optimization` function.\n",
    "The cost, the outputs, and the graph must be provided.\n",
    "The function returns the results of the optimization.\n",
    "Note that this example code block uses naming that should be replaced with the naming used in your graph."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example: Smoothing control pulses using linear filters\n",
    "    \n",
    "In this section we present examples showing how linear time-invariant filters may be incorporated into an optimization.\n",
    "To exemplify the use of filters, we consider a basic single-qubit system described by the Hamiltonian:\n",
    "\n",
    "\\begin{align*}\n",
    "H(t) &= \\frac{1}{2} \\Omega(t) L(\\alpha)(t) \\sigma_{x} + \\beta(t) \\sigma_{z} , \n",
    "\\end{align*}\n",
    "\n",
    "where $\\alpha(t)$ is a real time-dependent pulse,\n",
    "$L$ is the filter applied to the pulse,\n",
    "$\\Omega(t)$ is an envelope fixing the pulse edges to zero,\n",
    "and $\\beta(t)$ is a small, slowly-varying stochastic dephasing noise process.\n",
    "\n",
    "The effect of the filter is to transform the control signal before it reaches the quantum system, via convolution with the filter impulse response.\n",
    "\n",
    "\n",
    "In this example, we use an in-built Boulder Opal function to produce the sinc filter to smooth the control pulse. Furthermore, we modulate the smoothed pulse with an envelope that enforces the final solution to start and end at zero. \n",
    "From the optimizations we output three sets of signals: the raw piecewise-constant signal, its smoothed version, and the final modulated signal.\n",
    "The latter is the filtered signal that actually reaches the quantum system and performs the optimized gate. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import boulderopal as bo\n",
    "from qctrlvisualizer import plot_controls"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Your task (action_id=\"1827755\") is queued.\n",
      "Your task (action_id=\"1827755\") has started.\n",
      "Your task (action_id=\"1827755\") has completed.\n",
      "Optimized cost: 1.771e-11\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 720x540 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Define physical constraints.\n",
    "alpha_max = 2 * np.pi * 8.5e6  # rad/s\n",
    "sinc_cutoff_frequency = 2 * np.pi * 48e6  # rad/s\n",
    "optimizable_variable_count = 32\n",
    "segment_count = 128\n",
    "duration = 250e-9  # s\n",
    "\n",
    "# Create graph object.\n",
    "graph = bo.Graph()\n",
    "\n",
    "# Create unfiltered signal.\n",
    "unfiltered_alpha = graph.real_optimizable_pwc_signal(\n",
    "    segment_count=optimizable_variable_count,\n",
    "    duration=duration,\n",
    "    maximum=alpha_max,\n",
    "    minimum=-alpha_max,\n",
    "    name=\"$\\\\alpha$\",\n",
    ")\n",
    "\n",
    "# Filter signal.\n",
    "rediscretized_alpha = graph.filter_and_resample_pwc(\n",
    "    pwc=unfiltered_alpha,\n",
    "    kernel=graph.sinc_convolution_kernel(sinc_cutoff_frequency),\n",
    "    segment_count=segment_count,\n",
    "    name=\"$L(\\\\alpha)$\",\n",
    ")\n",
    "\n",
    "# Modulate signal with envelope.\n",
    "envelope_signal = graph.signals.cosine_pulse_pwc(\n",
    "    duration=duration, segment_count=segment_count, amplitude=1.0\n",
    ")\n",
    "alpha = envelope_signal * rediscretized_alpha\n",
    "alpha.name = \"$\\\\Omega L(\\\\alpha)$\"\n",
    "\n",
    "# Create control term.\n",
    "control_term = alpha * graph.pauli_matrix(\"X\") / 2\n",
    "\n",
    "# Create dephasing noise term.\n",
    "dephasing_term = graph.pauli_matrix(\"Z\") / duration\n",
    "\n",
    "# Create infidelity.\n",
    "infidelity = graph.infidelity_pwc(\n",
    "    hamiltonian=control_term,\n",
    "    target=graph.target(graph.pauli_matrix(\"X\")),\n",
    "    noise_operators=[dephasing_term],\n",
    "    name=\"infidelity\",\n",
    ")\n",
    "\n",
    "# Run the optimization.\n",
    "result = bo.run_optimization(\n",
    "    graph=graph,\n",
    "    cost_node_name=\"infidelity\",\n",
    "    output_node_names=[\"$\\\\alpha$\", \"$L(\\\\alpha)$\", \"$\\\\Omega L(\\\\alpha)$\"],\n",
    "    optimization_count=8,\n",
    ")\n",
    "print(f\"Optimized cost: {result['cost']:.3e}\")\n",
    "\n",
    "# Visualize controls.\n",
    "plot_controls(result[\"output\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Unfiltered (top), filtered (center), and pinned (bottom) control amplitudes as a function of time."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example: Band-limited pulses with bounded slew rates\n",
    "\n",
    "Next we show how to optimize a system in which the rates of change of the controls are limited.\n",
    "Using this constraint can help to ensure that optimized controls can be reliably implemented on physical hardware (which may be subject to bandwidth limits).\n",
    "We consider a standard single-qubit system subject to dephasing noise:\n",
    "\n",
    "\\begin{align*}\n",
    "H(t) &= \\frac{1}{2} \\alpha_1(t)\\sigma_{x} + \\frac{1}{2} \\alpha_2(t) \\sigma_{z} + \\beta(t) \\sigma_{z} , \n",
    "\\end{align*}\n",
    "\n",
    "where $\\alpha_1(t)$ and $\\alpha_2(t)$ are real time-dependent pulse and $\\beta(t)$ is a small, slowly-varying stochastic dephasing noise process.\n",
    "In this case, we enforce a maximum slew rate constraint on $\\alpha_1(t)$ and $\\alpha_2(t)$, to cap the variation between adjacent segment values."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "pycharm": {
     "is_executing": true
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Your task (action_id=\"1827757\") has started.\n",
      "Your task (action_id=\"1827757\") has completed.\n",
      "Optimized cost: 2.107e-03\n"
     ]
    },
    {
     "data": {
      "image/png": "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+mP8smkH/jx9IlxuF/626GX07tsLl159sexzees6IrKy47eWm7yq6QzH45/c8dZxRPbEW9cFcdEfRqNrjy6Y98CTePzBp9ClWyYuvPx8s8tqJj1O0UpZpFqYOVZ2yVq3LUekvlsti1QLs7XGymi2/8o4FC63C+Nvuhrjb7ra7FL8qvXUWzaLVAszx8ouWeu25YjUd6tlkWphttZYGY2fEBIRERE5HCeEFuByRVo2i1QLM8fKLlnrtuWI1HerZZFqYbbWWBmNJ5WoFOjgTCIiK+BJJUTOEmjeYu50lEJSWFJh2SxSLcwcK7tkrduWI1LfrZZFqoXZWmNlNE4ILaCotMqyWaRamDlWdslaty1HpL5bLYtUC7O1xspoblPXTkREQuCdQ4icjZ8QEhE5WP/R0a0eyxppQiFEZC4vqfJbTpHu66iu8Vg2i1QLM8fKLlmkWpg5VnbJItWip0DzFn5CSERERORwnBBawP7co5bNItXCzLGySxapFmaOlV2ySLWYgRNCIiIiIofjhJCIiIjI4XinEpV2HyxAlNul6zoqyiqQkJSg6zpE5eS+A87uv5P7Dji7/+y7M/sOOLv/RvW9rr4BvbuktV5gyCktpMpTDy80uwTTOLnvXq+z++/kvnu9zu4/++5cTu6/2X3nV8ZEREREDscJIREREZHDcUJoASPOGW52CaZxct8BZ/ffyX0HnN1/9t25nNx/s/vOk0qIiIiIHI6fEBIRERE5HCeERERERA7HCSERERGRw3FCSERERORwnBASERERORwnhEREREQOxwkhERERkcNxQkhERETkcJwQEhERETkcJ4REREREDscJIREREZHDcUJIRERE5HCcEBIRERE5HCeERERERA7HCSERERGRw3FCSERERORwnBASERERORwnhEREREQOxwkhERERkcO5zS7A6nYfLECU26XvSrxeICLCmlmkWpg5VnbJItXCzLGySxapFh3V1Tegd5e01gu8pMpvOUW6r2PHvjzLZpFqYeZY2SWLVAszx8ouWaRa9BRo3sKvjImIiIgcjhNCIiIiIofjhNACkhNiLZtFqoWZY2WXLFItzBwru2SRajFDhNfr9ZpagcXtO1KMrI6pZpdBfiwdW4Ktaz0tHus/OhpTVqeYU5BCVq+fiIjEE2jewk8ILWDfkWLLZjPXLZ1M+XtMpG0lzUbXL1LfmTlW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",
      "text/plain": [
       "<Figure size 720x360 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Define physical constraints.\n",
    "alpha_max = 2 * np.pi * 8.5e6  # rad/s\n",
    "max_slew_rate = alpha_max / 10\n",
    "segment_count = 128\n",
    "duration = 400e-9  # s\n",
    "\n",
    "# Create graph object.\n",
    "graph = bo.Graph()\n",
    "\n",
    "# Create signals.\n",
    "alpha_1_values = graph.anchored_difference_bounded_variables(\n",
    "    count=segment_count,\n",
    "    lower_bound=-alpha_max,\n",
    "    upper_bound=alpha_max,\n",
    "    difference_bound=max_slew_rate,\n",
    ")\n",
    "alpha_1 = graph.pwc_signal(values=alpha_1_values, duration=duration, name=\"$\\\\alpha_1$\")\n",
    "alpha_2_values = graph.anchored_difference_bounded_variables(\n",
    "    count=segment_count,\n",
    "    lower_bound=-alpha_max,\n",
    "    upper_bound=alpha_max,\n",
    "    difference_bound=max_slew_rate,\n",
    ")\n",
    "alpha_2 = graph.pwc_signal(values=alpha_2_values, duration=duration, name=\"$\\\\alpha_2$\")\n",
    "\n",
    "# Create control Hamiltonian.\n",
    "hamiltonian = (\n",
    "    alpha_1 * graph.pauli_matrix(\"X\") + alpha_2 * graph.pauli_matrix(\"Z\")\n",
    ") / 2\n",
    "\n",
    "# Create dephasing noise term.\n",
    "dephasing_term = graph.pauli_matrix(\"Z\") / duration\n",
    "\n",
    "# Create infidelity.\n",
    "infidelity = graph.infidelity_pwc(\n",
    "    hamiltonian=hamiltonian,\n",
    "    target=graph.target(operator=graph.pauli_matrix(\"Y\")),\n",
    "    noise_operators=[dephasing_term],\n",
    "    name=\"infidelity\",\n",
    ")\n",
    "\n",
    "# Run the optimization.\n",
    "result = bo.run_optimization(\n",
    "    graph=graph,\n",
    "    cost_node_name=\"infidelity\",\n",
    "    output_node_names=[\"$\\\\alpha_1$\", \"$\\\\alpha_2$\"],\n",
    "    optimization_count=20,\n",
    ")\n",
    "print(f\"Optimized cost: {result['cost']:.3e}\")\n",
    "\n",
    "# Plot the optimized controls.\n",
    "plot_controls(result[\"output\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pulse amplitudes obtained from a band-limited optimization with bounded-slew rates for $\\alpha_1(t)$ (top) and $\\alpha_2(t)$ (bottom)."
   ]
  }
 ],
 "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
}
