{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# How to optimize controls robust to strong noise sources\n",
    "**Design controls that are robust against strong time-dependent noise sources with stochastic optimization**\n",
    "\n",
    "In this notebook we demonstrate how to apply stochastic optimization to design robust pulses using our highly-flexible optimization engine. \n",
    "\n",
    "The stochastic optimizer is well suited to treat strong and non-static noises, allowing us to go beyond the weak noise regime required for using [filter functions](https://docs.q-ctrl.com/boulder-opal/toolkit/design/design-model-based-controls/estimate-noise-resilience/how-to-calculate-and-use-filter-functions-for-arbitrary-controls) in robust optimization as illustrated in [this 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).\n",
    "For stronger noise fields, typically neither the first-order Magnus approximation of the toggling frame Hamiltonian nor the second-order approximation of the time evolution operator hold."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Summary workflow\n",
    "\n",
    "### 1. Define the system, variables to be optimized and cost function in the computational graph\n",
    "\n",
    "The flexible Boulder Opal optimization engine expresses all optimization problems as data flow graphs, 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",
    "You can define physical constraints, decide on which variables to optimize and provide a value range, include noise terms, and specify the cost function, which can be based on the target operator and the infidelity.\n",
    "\n",
    "### 2. Run graph-based optimization\n",
    "\n",
    "With the graph object created, an optimization can be run by providing the name of the graph node representing the cost function to be minimized, the names of the desired output nodes and the graph itself to the `boulderopal.run_stochastic_optimization` function.\n",
    "\n",
    "Optionally, you can also set the number of iterations to perform, after which the results with the lowest cost are returned (defaults to 1000), a target cost which early-stops the optimization when/if reached (else the optimizer runs until all iterations are completed), and an optimization algorithm (with Adam as the default). \n",
    "\n",
    "The function returns the results of the optimization, which include the lowest cost achieved across all iterations, as well as the specified nodes evaluated at the optimized variables.\n",
    "\n",
    "You can then use the [qctrlvisualizer](https://docs.q-ctrl.com/references/qctrl-visualizer/qctrlvisualizer) package to plot the optimized pulses, which are available in the result object."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Example: Robust control of a qubit under strong noise\n",
    "\n",
    "In this example we show how to find robust controls with the stochastic optimizer.\n",
    "The single-qubit system is represented by the Hamiltonian\n",
    "$$ H(t) = (1 + \\beta(t))(\\gamma_x(t) \\sigma_x + \\gamma_y(t) \\sigma_y) , $$\n",
    "where $\\gamma_x(t)$ and $\\gamma_y(t)$ are the real time pulses and $\\beta(t)$ is a stochastic noise process.\n",
    "\n",
    "To perform a stochastic optimization, we assume that the stochastic process can be decomposed into 10 Fourier components\n",
    "$$ \\beta(t) = \\sum_{i=1}^{10} a_i \\cos(\\omega_i t + \\phi_i) ,$$\n",
    "where $a_i$ are random amplitudes sampled from a normal distribution,\n",
    "$\\omega_i$ are random frequencies sampled from a uniform distribution,\n",
    "and $\\phi_i$ are random phases sampled from a uniform distribution.\n",
    "At each iteration step a new set of samples is taken.\n",
    "\n",
    "This example uses the nodes `graph.random.uniform` and `graph.random.normal` to generate the stochastic process.\n",
    "These nodes provide random values sampled from uniform and normal probability distributions, respectively.\n",
    "Other ways of generating a stochastic process include using the `graph.random.choices` node to shuffle your own set of numerical values (which you can sample from any distribution you want) or `graph.random.colored_noise_stf_signal` to create a stochastic signal from a power spectral density.\n",
    "\n",
    "The cost is calculated by averaging the infidelities corresponding to a batch of samples of the stochastic process.\n",
    "Averaging over a batch can lead to more reliable cost function estimates and gradients, which in turn can result in better overall optimization performance."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import qctrlvisualizer as qv\n",
    "import boulderopal as bo\n",
    "\n",
    "plt.style.use(qv.get_qctrl_style())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define physical constraints.\n",
    "duration = 2e-6  # s\n",
    "gamma_max = 2 * np.pi * 0.5e6  # rad/s\n",
    "segment_count = 20\n",
    "batch_size = 200\n",
    "\n",
    "graph = bo.Graph()\n",
    "\n",
    "# Define optimizable controls.\n",
    "gamma_x = graph.real_optimizable_pwc_signal(\n",
    "    segment_count=segment_count,\n",
    "    minimum=-gamma_max,\n",
    "    maximum=gamma_max,\n",
    "    duration=duration,\n",
    "    name=\"gamma_x\",\n",
    ")\n",
    "gamma_y = graph.real_optimizable_pwc_signal(\n",
    "    segment_count=segment_count,\n",
    "    minimum=-gamma_max,\n",
    "    maximum=gamma_max,\n",
    "    duration=duration,\n",
    "    name=\"gamma_y\",\n",
    ")\n",
    "\n",
    "# Create noise signals, aᵢ cos(ωᵢt + ϕᵢ).\n",
    "noise_signals = []\n",
    "sample_times = (0.5 + np.arange(segment_count)) * duration / segment_count\n",
    "for _ in range(10):\n",
    "    a = graph.random.normal(shape=(batch_size, 1), mean=0.0, standard_deviation=0.05)\n",
    "    omega = graph.random.uniform(\n",
    "        shape=(batch_size, 1), lower_bound=np.pi, upper_bound=2 * np.pi\n",
    "    )\n",
    "    phi = graph.random.uniform(\n",
    "        shape=(batch_size, 1), lower_bound=0.0, upper_bound=2 * np.pi\n",
    "    )\n",
    "    noise_signals.append(\n",
    "        graph.pwc_signal(\n",
    "            values=a * graph.cos(omega * sample_times[None] + phi), duration=duration\n",
    "        )\n",
    "    )\n",
    "\n",
    "# Define Hamiltonian.\n",
    "total_noise = graph.pwc_sum(noise_signals)\n",
    "hamiltonian = (1 + total_noise) * (\n",
    "    gamma_x * graph.pauli_matrix(\"X\") + gamma_y * graph.pauli_matrix(\"Y\")\n",
    ")\n",
    "\n",
    "# Create infidelity.\n",
    "infidelities = graph.infidelity_pwc(\n",
    "    hamiltonian, target=graph.target(graph.pauli_matrix(\"X\")), name=\"infidelities\"\n",
    ")\n",
    "\n",
    "# Define cost (average infidelity).\n",
    "cost = graph.sum(infidelities) / batch_size\n",
    "cost.name = \"cost\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Your task (action_id=\"1828670\") has started.\n",
      "Your task (action_id=\"1828670\") has completed.\n",
      "\n",
      "Optimized cost:\t 3.977e-05\n",
      "\n"
     ]
    }
   ],
   "source": [
    "# Run the optimization.\n",
    "optimization_result = bo.run_stochastic_optimization(\n",
    "    graph=graph,\n",
    "    cost_node_name=\"cost\",\n",
    "    output_node_names=[\"gamma_x\", \"gamma_y\", \"infidelities\"],\n",
    "    iteration_count=10000,\n",
    "    target_cost=1e-6,\n",
    ")\n",
    "\n",
    "print(f\"\\nOptimized cost:\\t {optimization_result['cost']:.3e}\\n\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Batch mean: 1.10e-04, standard deviation: 6.24e-04\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 720x360 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot histogram of infidelities evaluated at the optimized variables.\n",
    "print(\n",
    "    f'Batch mean: {optimization_result[\"output\"][\"infidelities\"][\"value\"].mean():.2e}, '\n",
    "    f'standard deviation: {optimization_result[\"output\"][\"infidelities\"][\"value\"].std():.2e}'\n",
    ")\n",
    "\n",
    "plt.title(\"Batch of optimized infidelities\")\n",
    "plt.xlabel(\"Infidelities\")\n",
    "plt.ylabel(\"Count\")\n",
    "plt.hist(\n",
    "    optimization_result[\"output\"][\"infidelities\"][\"value\"], bins=\"auto\", ec=\"black\"\n",
    ")\n",
    "plt.xlim([0.0, 1e-4])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 720x360 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Plot the optimized controls.\n",
    "qv.plot_controls(\n",
    "    {\n",
    "        r\"$\\gamma_x$\": optimization_result[\"output\"][\"gamma_x\"],\n",
    "        r\"$\\gamma_y$\": optimization_result[\"output\"][\"gamma_y\"],\n",
    "    }\n",
    ")"
   ]
  }
 ],
 "metadata": {
  "interpreter": {
   "hash": "7b5611a93b8f2d5e719094b77c0c70650a725e72d24d099332f318c640341dad"
  },
  "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
}
