{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# How to optimize controls using gradient-free optimization\n",
    "**Perform graph-based optimizations when gradients are costly**\n",
    "\n",
    "In addition to a highly-flexible optimization engine for general-purpose gradient-based optimization, Boulder Opal also features a gradient-free optimizer which can be directly applied to model-based control optimization for arbitrary-dimensional quantum systems.\n",
    "\n",
    "The gradient-free optimizer is exposed by the `boulderopal.run_gradient_free_optimization` function, which works similarly to `boulderopal.run_optimization`, with most of the parameters overlapping between the two functions.\n",
    "While the gradient-based optimization is more likely to find better results quicker, the gradient-free optimizer is useful in cases where the gradient is either very costly to compute or inaccessible (for example if the graph includes a node that does not allow gradients).\n",
    "Also since the gradient is not computed, the memory requirements for the gradient-free optimizer are much lower.\n",
    "\n",
    "The optimization engine from Boulder Opal allows the user to express their system Hamiltonians as almost-arbitrary functions of the controllable parameters.\n",
    "The underlying structure of this map is 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 and can be efficiently evaluated.\n",
    "The resulting optimized controls thus achieve the desired objectives within the constraints imposed by the user-defined Hamiltonian structure.\n",
    "\n",
    "The example in this user guide illustrates how to optimize multiple controls under different constraints in a single system using the gradient-free optimizer."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Summary workflow\n",
    "### 1. Define the computational graph\n",
    "The Boulder Opal optimization engine 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 you can create by initializing a `boulderopal.Graph` class.\n",
    "The methods of the graph object allow you to represent the mathematical structure of the problem that you want to solve.\n",
    "\n",
    "For an optimization, a typical workflow is to:\n",
    "- Create \"signals\", or scalar-valued functions of time, which typically represent control pulses.\n",
    "- Create \"operators\", or matrix-valued functions of time, by modulating constant operators by signals. These typically represent terms of a Hamiltonian.\n",
    "- Combine the operators into a single Hamiltonian operator.\n",
    "- Calculate the optimization cost function (typically an infidelity) from the Hamiltonian.\n",
    "\n",
    "### 2. Run graph-based gradient-free optimization\n",
    "\n",
    "You can calculate an optimization from an input graph using the `boulderopal.run_gradient_free_optimization` function.\n",
    "Provide the name of the node of the graph that represents the cost, and this function will return the optimized value of the output nodes that you requested. \n",
    "Unlike `boulderopal.run_optimization`, which uses the gradient and halts when it has converged to a minimum, `boulderopal.run_gradient_free_optimization` cannot rely on such convergence criteria. \n",
    "Instead, the function stops after performing `iteration_count` iterations (which defaults to 100), unless the cost reaches a value below `target_cost` (if you provide one)."
   ]
  },
  {
   "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{\\nu}{2} \\sigma_{z} + \\frac{1}{2}\\left[\\gamma(t)\\sigma_{-} + \\gamma^*(t)\\sigma_{+}\\right] + \\frac{\\alpha(t)}{2} \\sigma_{z} ,$$\n",
    "\n",
    "where $\\nu$ is the qubit detuning, $\\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",
    "\n",
    "The functions of time $\\gamma(t)$ and $\\alpha(t)$ are not predetermined, and instead are optimized by Boulder Opal in order to achieve the target operation, which in this case is a Y-gate."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "pycharm": {
     "is_executing": true,
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import qctrlvisualizer as qv\n",
    "import boulderopal as bo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "pycharm": {
     "is_executing": true,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Your task (action_id=\"1824881\") is queued.\n",
      "Your task (action_id=\"1824881\") has started.\n",
      "Your task (action_id=\"1824881\") has completed.\n",
      "Optimized cost:\t5.715e-03\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",
    "nu = 2 * np.pi * 5e5  # rad/s\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 = 50\n",
    "duration = 10e-6  # s\n",
    "\n",
    "graph = bo.Graph()\n",
    "\n",
    "# Create the time-independent detuning term.\n",
    "detuning = nu * graph.pauli_matrix(\"Z\") / 2\n",
    "\n",
    "# Add a cosine envelope to the signals, to ensure\n",
    "# they go to zero at the beginning and end of pulse.\n",
    "cos_envelope = graph.signals.cosine_pulse_pwc(\n",
    "    duration=duration, segment_count=256, amplitude=1.0\n",
    ")\n",
    "\n",
    "# Create an optimizable complex-valued piecewise-constant (PWC) signal.\n",
    "rough_gamma = graph.complex_optimizable_pwc_signal(\n",
    "    segment_count=segment_count, maximum=gamma_max, duration=duration\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),\n",
    ")\n",
    "gamma = gamma * cos_envelope\n",
    "gamma.name = r\"$\\gamma$\"\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,\n",
    "    minimum=-alpha_max,\n",
    "    maximum=alpha_max,\n",
    "    duration=duration,\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),\n",
    ")\n",
    "alpha = alpha * cos_envelope\n",
    "alpha.name = r\"$\\alpha$\"\n",
    "\n",
    "# Create a PWC operator representing the clock shift term.\n",
    "shift = alpha * cos_envelope * graph.pauli_matrix(\"Z\") / 2\n",
    "\n",
    "# Define the total Hamiltonian and the target operation.\n",
    "hamiltonian = detuning + drive + shift\n",
    "target = graph.target(graph.pauli_matrix(\"Y\"))\n",
    "\n",
    "# Create the infidelity.\n",
    "infidelity = graph.infidelity_pwc(hamiltonian, target, name=\"infidelity\")\n",
    "\n",
    "# Run the optimization.\n",
    "result = bo.run_gradient_free_optimization(\n",
    "    graph=graph,\n",
    "    cost_node_name=\"infidelity\",\n",
    "    output_node_names=[r\"$\\alpha$\", r\"$\\gamma$\"],\n",
    "    target_cost=5e-3,\n",
    ")\n",
    "print(f\"Optimized cost:\\t{result['cost']:.3e}\")\n",
    "\n",
    "# Plot the optimized controls.\n",
    "qv.plot_controls(result[\"output\"])"
   ]
  }
 ],
 "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
}
