{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# How to optimize controls with nonlinear dependences\n",
    "**Incorporate nonlinear Hamiltonian dependences on control signals**\n",
    "\n",
    "Boulder Opal exposes a highly-flexible [optimization engine](https://docs.q-ctrl.com/references/boulder-opal/boulderopal/graph/run_optimization) for general-purpose gradient-based optimization.  It can be directly applied to model-based control optimization for arbitrary-dimensional quantum systems.  In some cases the relationship between a control parameter and Hamiltonian term is nonlinear, presenting a major challenge for standard optimization routines.  \n",
    "\n",
    "In this notebook we demonstrate how to simply incorporate arbitrary nonlinear relationships between control parameters such that it is possible to directly perform an optimization which returns proper lab-frame control signals to generate and output.\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).\n",
    "\n",
    "## Summary workflow\n",
    "### 1. Define nonlinearity in computational graph\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).  Typical costs involve minimization of an infidelity metric captured using the `graph.infidelity_pwc` graph operation.\n",
    "\n",
    "Expressing non-linear dependence between control parameters and Hamiltonians is achieved by performing standard arithmetical operations on the control parameters prior to constructing signals which are employed in the graph. For instance:\n",
    "```python\n",
    "signal = graph.real_optimizable_pwc_signal(\n",
    "    segment_count=segment_count,\n",
    "    minimum=signal_min,\n",
    "    maximum=signal_max,\n",
    "    duration=duration,\n",
    "    name=\"signal\"\n",
    "    )\n",
    "signal_squared = signal ** 2 / signal_max\n",
    "signal_squared.name = \"signal_squared\"\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. The cost, the outputs, and the graph must be provided. The function returns the results of the optimization. Note that this example code block uses naming that should be replaced with the naming used in your graph."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## Example: Optimized controls with a nonlinear relationship to a single-qubit Hamiltonian\n",
    "\n",
    "We present an example showing how a system with non-linear dependence between controls and Hamiltonian may be optimized. We consider an artificial single-qubit system represented by the following Hamiltonian:\n",
    "$$\n",
    "H(t) = \\alpha_1(t)\\sigma_x + \\frac{\\alpha_1(t)^2}{\\alpha_{\\text{max}}}\\sigma_y + \\alpha_2(t)\\sigma_z  ,\n",
    "$$\n",
    "where $\\alpha_1(t)$ and $\\alpha_2(t)$ are real time-dependent pulses, and we note the non-linear dependence of the Hamiltonian on $\\alpha_1(t)$. \n",
    "\n",
    "While here we have chosen a simple artificial non-linearity for the sake of convenience and brevity, the approach we demonstrate extends trivially to far more complex, physically-relevant situations.\n",
    "\n",
    "Expressing non-linear dependence between control parameters and Hamiltonians is achieved by performing standard arithmetical operations on the control parameters prior to constructing signals. In this case the operations are very simple—we simply square and re-scale the parameters describing the $\\alpha_1(t)$ values—but in general any combination of supported primitive operations may be used."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "pycharm": {
     "is_executing": true
    }
   },
   "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=\"1828726\") has started.\n",
      "Your task (action_id=\"1828726\") has completed.\n",
      "\n",
      "Optimized cost:\t5.467e-13\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 * 6e6  # Hz\n",
    "segment_count = 40\n",
    "duration = 200e-9  # s\n",
    "\n",
    "graph = bo.Graph()\n",
    "\n",
    "# Create the alpha_1(t) signal\n",
    "alpha_1 = graph.real_optimizable_pwc_signal(\n",
    "    segment_count=segment_count,\n",
    "    minimum=-alpha_max,\n",
    "    maximum=alpha_max,\n",
    "    duration=duration,\n",
    "    name=\"alpha_1\",\n",
    ")\n",
    "\n",
    "# Apply a non-linear transformation to create the alpha_1_squared(t) signal\n",
    "alpha_1_squared = alpha_1**2 / alpha_max\n",
    "alpha_1_squared.name = \"alpha_1_squared\"\n",
    "\n",
    "# Create the alpha_2(t) signal\n",
    "alpha_2 = graph.real_optimizable_pwc_signal(\n",
    "    segment_count=segment_count,\n",
    "    minimum=-alpha_max,\n",
    "    maximum=alpha_max,\n",
    "    duration=duration,\n",
    "    name=\"alpha_2\",\n",
    ")\n",
    "\n",
    "# Create Hamiltonian terms\n",
    "x_term = alpha_1 * graph.pauli_matrix(\"X\")\n",
    "y_term = alpha_1_squared * graph.pauli_matrix(\"Y\")\n",
    "z_term = alpha_2 * graph.pauli_matrix(\"Z\")\n",
    "\n",
    "target_operator = graph.target(operator=graph.pauli_matrix(\"X\"))\n",
    "\n",
    "# Create infidelity\n",
    "infidelity = graph.infidelity_pwc(\n",
    "    hamiltonian=x_term + y_term + z_term, target=target_operator, name=\"infidelity\"\n",
    ")\n",
    "\n",
    "# Run the optimization\n",
    "optimization_result = bo.run_optimization(\n",
    "    graph=graph,\n",
    "    cost_node_name=\"infidelity\",\n",
    "    output_node_names=[\"alpha_1\", \"alpha_1_squared\", \"alpha_2\"],\n",
    "    optimization_count=4,\n",
    ")\n",
    "\n",
    "print(f\"\\nOptimized cost:\\t{optimization_result['cost']:.3e}\")\n",
    "\n",
    "# Plot the optimized controls\n",
    "qv.plot_controls(\n",
    "    {\n",
    "        r\"$\\alpha_1$\": optimization_result[\"output\"][\"alpha_1\"],\n",
    "        r\"$\\alpha_1^2$\": optimization_result[\"output\"][\"alpha_1_squared\"],\n",
    "        r\"$\\alpha_2$\": optimization_result[\"output\"][\"alpha_2\"],\n",
    "    }\n",
    ")"
   ]
  }
 ],
 "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
}
