{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "f6f9557f",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:41:49.973796Z",
     "iopub.status.busy": "2026-10-02T14:41:49.973502Z",
     "iopub.status.idle": "2026-10-02T14:41:49.978433Z",
     "shell.execute_reply": "2026-10-02T14:41:49.977675Z"
    },
    "papermill": {
     "duration": 0.008409,
     "end_time": "2026-10-02T14:41:49.979398+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:41:49.970989+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "active-ipynb",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "try:\n",
    "    from openmdao.utils.notebook_utils import notebook_mode  # noqa: F401\n",
    "except ImportError:\n",
    "    !python -m pip install openmdao[notebooks]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "66ec00db",
   "metadata": {
    "papermill": {
     "duration": 0.001276,
     "end_time": "2026-10-02T14:41:49.982143+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:41:49.980867+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "# DifferentialEvolutionDriver\n",
    "\n",
    "```{note}\n",
    "DifferentialEvolutionDriver is based on SimpleGADriver and supports most of the same options and capabilities.\n",
    "```\n",
    "\n",
    "This [differential evolution](https://en.wikipedia.org/wiki/Differential_evolution) variant of a genetic algorithm optimizer supports only continuous variables. The DifferentialEvolutionDriver supports both constrained and unconstrained optimization.\n",
    "\n",
    "The DifferentialEvolutionDriver has advantages and disadvantages when compared to the SimpleGADriver:\n",
    "\n",
    " - Pros\n",
    "    - DifferentialEvolutionDriver is typically about 3 times faster than SimpleGADriver\n",
    "    - DifferentialEvolutionDriver is usually more accurate than SimpleGADriver because it does not limit the number of bits available to represent inputs\n",
    "    - DifferentialEvolutionDriver does not require the user to manually specify a number of representation bits\n",
    "\n",
    " - Cons\n",
    "    - DifferentialEvolutionDriver only supports continuous input variables; SimpleGADriver also supports discrete\n",
    "    - DifferentialEvolutionDriver does not support SimpleGADriver’s “compute_pareto” option for multi-objective optimization\n",
    "\n",
    "Genetic algorithms do not use gradient information to find optimal solutions. This makes them ideal for problems that do not have gradients or problems with many local minima where gradient information is not helpful in finding the global minimum. A well known example of this is finding the global minimum of of the Rastrigin function: ![2D Rastrigin Example](rastrigin2d.png)\n",
    "\n",
    "The example below shows an OpenMDAO solution of a higher order [Rastrigin function](https://en.wikipedia.org/wiki/Rastrigin_function)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "a3109f11",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:41:49.985593Z",
     "iopub.status.busy": "2026-10-02T14:41:49.985411Z",
     "iopub.status.idle": "2026-10-02T14:42:04.122333Z",
     "shell.execute_reply": "2026-10-02T14:42:04.121322Z"
    },
    "papermill": {
     "duration": 14.13951,
     "end_time": "2026-10-02T14:42:04.123009+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:41:49.983499+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1790952112.547304] [runnervm8df0l:6879 :0]        ib_iface.c:1269 UCX  ERROR mana_0: iface 0x5588ab0b2000 failed to create UD QP TX wr:256 sge:6 inl:64 resp:0 RX wr:4096 sge:1 resp:0 failed: Operation not supported\n",
      "[1790952112.547549] [runnervm8df0l:6879 :0]      ucp_worker.c:1412 UCX  ERROR uct_iface_open(ud_verbs/mana_0:1) failed: Input/output error\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[runnervm8df0l:06879] pml_ucx.c:313  Error: Failed to create UCP worker\n",
      "/home/runner/work/OpenMDAO/OpenMDAO/.pixi/envs/dev/lib/python3.13/site-packages/openmdao/drivers/differential_evolution_driver.py:100: OMDeprecationWarning:The `DifferentialEvolutionDriver` is deprecated. Please use `pymooDriver` for population based optimizations.\n",
      "/home/runner/work/OpenMDAO/OpenMDAO/.pixi/envs/dev/lib/python3.13/site-packages/openmdao/core/group.py:1197: DerivativesWarning:Constraints or objectives [rastrigin.y] cannot be impacted by the design variables of the problem because no partials were defined for them in their parent component(s).\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.]\n",
      "[0. 0. 0. 0. 0. 0.]\n"
     ]
    }
   ],
   "source": [
    "import openmdao.api as om\n",
    "import numpy as np\n",
    "\n",
    "ORDER = 6  # dimension of problem\n",
    "span = 5   # upper and lower limits\n",
    "\n",
    "class RastriginComp(om.ExplicitComponent):\n",
    "    def setup(self):\n",
    "        self.add_input('x', np.zeros(ORDER))\n",
    "        self.add_output('y', 0.0)\n",
    "\n",
    "    def compute(self, inputs, outputs):\n",
    "        x = inputs['x']\n",
    "\n",
    "        # nth dimensional Rastrigin function, array input and scalar output\n",
    "        # global minimum at f(0,0,0...) = 0\n",
    "        n = len(x)\n",
    "        s = 10 * n\n",
    "        for i in range(n):\n",
    "            if np.abs(x[i]) < 1e-200:  # avoid underflow runtime warnings from squaring tiny numbers\n",
    "                x[i] = 0.0\n",
    "            s += x[i] * x[i] - 10 * np.cos(2 * np.pi * x[i])\n",
    "\n",
    "        outputs['y'] = s\n",
    "\n",
    "prob = om.Problem()\n",
    "\n",
    "prob.model.add_subsystem('rastrigin', RastriginComp(), promotes_inputs=['x'])\n",
    "prob.model.add_design_var('x',\n",
    "                          lower=-span * np.ones(ORDER),\n",
    "                          upper=span * np.ones(ORDER))\n",
    "prob.model.add_objective('rastrigin.y')\n",
    "\n",
    "prob.driver = om.DifferentialEvolutionDriver()\n",
    "prob.driver.options['max_gen'] = 400\n",
    "prob.driver.options['Pc'] = 0.5\n",
    "prob.driver.options['F'] = 0.5\n",
    "\n",
    "prob.setup()\n",
    "prob.run_driver()\n",
    "\n",
    "print(prob['rastrigin.y'])\n",
    "print(prob['x'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "d5b9017d",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:42:04.127152Z",
     "iopub.status.busy": "2026-10-02T14:42:04.126794Z",
     "iopub.status.idle": "2026-10-02T14:42:04.133516Z",
     "shell.execute_reply": "2026-10-02T14:42:04.132758Z"
    },
    "papermill": {
     "duration": 0.009648,
     "end_time": "2026-10-02T14:42:04.134054+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:04.124406+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(0.0)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from openmdao.utils.assert_utils import assert_near_equal\n",
    "assert_near_equal(prob['rastrigin.y'], 0.0, 1e-6)\n",
    "assert_near_equal(prob['x'], np.zeros(ORDER), 1e-6)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6c0d9c22",
   "metadata": {
    "papermill": {
     "duration": 0.002079,
     "end_time": "2026-10-02T14:42:04.137438+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:04.135359+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## DifferentialEvolutionDriver Options"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "adfbdc60",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:42:04.140756Z",
     "iopub.status.busy": "2026-10-02T14:42:04.140575Z",
     "iopub.status.idle": "2026-10-02T14:42:04.145927Z",
     "shell.execute_reply": "2026-10-02T14:42:04.144927Z"
    },
    "papermill": {
     "duration": 0.008034,
     "end_time": "2026-10-02T14:42:04.146567+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:04.138533+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "<!DOCTYPE html>\n",
       "<html lang=\"en\">\n",
       "<head>\n",
       "    <style>\n",
       "        h2 {\n",
       "            text-align: center;\n",
       "        }\n",
       "    </style>\n",
       "</head>\n",
       "<body>\n",
       "    <h2></h2>\n",
       "        <table style=\"border: 1px solid #999; border-collapse: collapse;\">\n",
       "        <tr><th style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; background-color: #E9E9E9; text-align: left;\">Option</th><th style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; background-color: #E9E9E9; text-align: left;\">Default</th><th style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; background-color: #E9E9E9; text-align: left;\">Acceptable Values</th><th style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; background-color: #E9E9E9; text-align: left;\">Acceptable Types</th><th style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; background-color: #E9E9E9; text-align: left;\">Description</th></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">F</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">0.9</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">Differential rate.</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">Pc</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">0.9</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">Crossover probability.</td></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">debug_print</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">[]</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">[&#x27;desvars&#x27;, &#x27;nl_cons&#x27;, &#x27;ln_cons&#x27;, &#x27;objs&#x27;, &#x27;totals&#x27;]</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">[&#x27;list&#x27;]</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">List of what type of Driver variables to print at each iteration.</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">invalid_desvar_behavior</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">warn</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">[&#x27;warn&#x27;, &#x27;raise&#x27;, &#x27;ignore&#x27;]</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">Behavior of driver if the initial value of a design variable exceeds its bounds. The default value may beset using the `OPENMDAO_INVALID_DESVAR_BEHAVIOR` environment variable to one of the valid options.</td></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">max_gen</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">100</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">Number of generations before termination.</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">multi_obj_exponent</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">1.0</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">Multi-objective weighting exponent.</td></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">multi_obj_weights</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">{}</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">[&#x27;dict&#x27;]</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">Weights of objectives for multi-objective optimization.Weights are specified as a dictionary with the absolute namesof the objectives. The same weights for all objectives are assumed, if not given.</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">penalty_exponent</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">1.0</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">Penalty function exponent.</td></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">penalty_parameter</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">10.0</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">Penalty function parameter.</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">pop_size</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">0</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">Number of points in the GA. Set to 0 and it will be computed as 20 times the total number of inputs.</td></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">procs_per_model</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">1</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">N/A</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">Number of processors to give each model under MPI.</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">run_parallel</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">False</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">[True, False]</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">[&#x27;bool&#x27;]</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">Set to True to execute the points in a generation in parallel.</td></tr>\n",
       "    </table>\n",
       "</body>\n",
       "</html>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "om.show_options_table(\"openmdao.drivers.differential_evolution_driver.DifferentialEvolutionDriver\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "06b7da15",
   "metadata": {
    "papermill": {
     "duration": 0.001893,
     "end_time": "2026-10-02T14:42:04.149971+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:04.148078+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## DifferentialEvolutionDriver Constructor\n",
    "\n",
    "The call signature for the DifferentialEvolutionDriver constructor is:\n",
    "\n",
    "```{eval-rst}\n",
    "    .. automethod:: openmdao.drivers.differential_evolution_driver.DifferentialEvolutionDriver.__init__\n",
    "       :noindex:\n",
    "``` \n",
    "\n",
    "## Using DifferentialEvolutionDriver\n",
    "\n",
    "You can change the number of generations to run the genetic algorithm by setting the “max_gen” option."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "a3420135",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:42:04.153810Z",
     "iopub.status.busy": "2026-10-02T14:42:04.153630Z",
     "iopub.status.idle": "2026-10-02T14:42:05.100905Z",
     "shell.execute_reply": "2026-10-02T14:42:05.100161Z"
    },
    "papermill": {
     "duration": 0.950466,
     "end_time": "2026-10-02T14:42:05.101956+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:04.151490+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "application/papermill.record/text/html": "<style>pre { line-height: 125%; }\ntd.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\nspan.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\ntd.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\nspan.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n.output_html .hll { background-color: #ffffcc }\n.output_html { background: #f8f8f8; }\n.output_html .c { color: #3D7B7B; font-style: italic } /* Comment */\n.output_html .err { border: 1px solid #F00 } /* Error */\n.output_html .k { color: #008000; font-weight: bold } /* Keyword */\n.output_html .o { color: #666 } /* Operator */\n.output_html .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */\n.output_html .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */\n.output_html .cp { color: #9C6500 } /* Comment.Preproc */\n.output_html .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */\n.output_html .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */\n.output_html .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */\n.output_html .gd { color: #A00000 } /* Generic.Deleted */\n.output_html .ge { font-style: italic } /* Generic.Emph */\n.output_html .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */\n.output_html .gr { color: #E40000 } /* Generic.Error */\n.output_html .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n.output_html .gi { color: #008400 } /* Generic.Inserted */\n.output_html .go { color: #717171 } /* Generic.Output */\n.output_html .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n.output_html .gs { font-weight: bold } /* Generic.Strong */\n.output_html .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n.output_html .gt { color: #04D } /* Generic.Traceback */\n.output_html .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n.output_html .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n.output_html .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n.output_html .kp { color: #008000 } /* Keyword.Pseudo */\n.output_html .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n.output_html .kt { color: #B00040 } /* Keyword.Type */\n.output_html .m { color: #666 } /* Literal.Number */\n.output_html .s { color: #BA2121 } /* Literal.String */\n.output_html .na { color: #687822 } /* Name.Attribute */\n.output_html .nb { color: #008000 } /* Name.Builtin */\n.output_html .nc { color: #00F; font-weight: bold } /* Name.Class */\n.output_html .no { color: #800 } /* Name.Constant */\n.output_html .nd { color: #A2F } /* Name.Decorator */\n.output_html .ni { color: #717171; font-weight: bold } /* Name.Entity */\n.output_html .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */\n.output_html .nf { color: #00F } /* Name.Function */\n.output_html .nl { color: #767600 } /* Name.Label */\n.output_html .nn { color: #00F; font-weight: bold } /* Name.Namespace */\n.output_html .nt { color: #008000; font-weight: bold } /* Name.Tag */\n.output_html .nv { color: #19177C } /* Name.Variable */\n.output_html .ow { color: #A2F; font-weight: bold } /* Operator.Word */\n.output_html .w { color: #BBB } /* Text.Whitespace */\n.output_html .mb { color: #666 } /* Literal.Number.Bin */\n.output_html .mf { color: #666 } /* Literal.Number.Float */\n.output_html .mh { color: #666 } /* Literal.Number.Hex */\n.output_html .mi { color: #666 } /* Literal.Number.Integer */\n.output_html .mo { color: #666 } /* Literal.Number.Oct */\n.output_html .sa { color: #BA2121 } /* Literal.String.Affix */\n.output_html .sb { color: #BA2121 } /* Literal.String.Backtick */\n.output_html .sc { color: #BA2121 } /* Literal.String.Char */\n.output_html .dl { color: #BA2121 } /* Literal.String.Delimiter */\n.output_html .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n.output_html .s2 { color: #BA2121 } /* Literal.String.Double */\n.output_html .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */\n.output_html .sh { color: #BA2121 } /* Literal.String.Heredoc */\n.output_html .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */\n.output_html .sx { color: #008000 } /* Literal.String.Other */\n.output_html .sr { color: #A45A77 } /* Literal.String.Regex */\n.output_html .s1 { color: #BA2121 } /* Literal.String.Single */\n.output_html .ss { color: #19177C } /* Literal.String.Symbol */\n.output_html .bp { color: #008000 } /* Name.Builtin.Pseudo */\n.output_html .fm { color: #00F } /* Name.Function.Magic */\n.output_html .vc { color: #19177C } /* Name.Variable.Class */\n.output_html .vg { color: #19177C } /* Name.Variable.Global */\n.output_html .vi { color: #19177C } /* Name.Variable.Instance */\n.output_html .vm { color: #19177C } /* Name.Variable.Magic */\n.output_html .il { color: #666 } /* Literal.Number.Integer.Long */</style><div class=\"highlight\"><pre><span></span><span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Branin</span><span class=\"p\">(</span><span class=\"n\">om</span><span class=\"o\">.</span><span class=\"n\">ExplicitComponent</span><span class=\"p\">):</span>\n<span class=\"w\">    </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">    The Branin test problem. This version is the standard version and</span>\n<span class=\"sd\">    contains two continuous parameters.</span>\n<span class=\"sd\">    &quot;&quot;&quot;</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">setup</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Define the independent variables, output variables, and partials.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"c1\"># Inputs</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">add_input</span><span class=\"p\">(</span><span class=\"s1\">&#39;x0&#39;</span><span class=\"p\">,</span> <span class=\"mf\">0.0</span><span class=\"p\">)</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">add_input</span><span class=\"p\">(</span><span class=\"s1\">&#39;x1&#39;</span><span class=\"p\">,</span> <span class=\"mf\">0.0</span><span class=\"p\">)</span>\n\n        <span class=\"c1\"># Outputs</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">add_output</span><span class=\"p\">(</span><span class=\"s1\">&#39;f&#39;</span><span class=\"p\">,</span> <span class=\"n\">val</span><span class=\"o\">=</span><span class=\"mf\">0.0</span><span class=\"p\">)</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">setup_partials</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">declare_partials</span><span class=\"p\">(</span><span class=\"n\">of</span><span class=\"o\">=</span><span class=\"s1\">&#39;f&#39;</span><span class=\"p\">,</span> <span class=\"n\">wrt</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;x0&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;x1&#39;</span><span class=\"p\">])</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">compute</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">inputs</span><span class=\"p\">,</span> <span class=\"n\">outputs</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Define the function f(xI, xC).</span>\n\n<span class=\"sd\">        When Branin is used in a mixed integer problem, x0 is integer and x1 is continuous.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"n\">x0</span> <span class=\"o\">=</span> <span class=\"n\">inputs</span><span class=\"p\">[</span><span class=\"s1\">&#39;x0&#39;</span><span class=\"p\">]</span>\n        <span class=\"n\">x1</span> <span class=\"o\">=</span> <span class=\"n\">inputs</span><span class=\"p\">[</span><span class=\"s1\">&#39;x1&#39;</span><span class=\"p\">]</span>\n\n        <span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"mf\">1.0</span>\n        <span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"mf\">5.1</span><span class=\"o\">/</span><span class=\"p\">(</span><span class=\"mf\">4.0</span><span class=\"o\">*</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">pi</span><span class=\"o\">**</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n        <span class=\"n\">c</span> <span class=\"o\">=</span> <span class=\"mf\">5.0</span><span class=\"o\">/</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">pi</span>\n        <span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"mf\">6.0</span>\n        <span class=\"n\">e</span> <span class=\"o\">=</span> <span class=\"mf\">10.0</span>\n        <span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"mf\">1.0</span><span class=\"o\">/</span><span class=\"p\">(</span><span class=\"mf\">8.0</span><span class=\"o\">*</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">pi</span><span class=\"p\">)</span>\n\n        <span class=\"n\">outputs</span><span class=\"p\">[</span><span class=\"s1\">&#39;f&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"n\">a</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"n\">x1</span> <span class=\"o\">-</span> <span class=\"n\">b</span><span class=\"o\">*</span><span class=\"n\">x0</span><span class=\"o\">**</span><span class=\"mi\">2</span> <span class=\"o\">+</span> <span class=\"n\">c</span><span class=\"o\">*</span><span class=\"n\">x0</span> <span class=\"o\">-</span> <span class=\"n\">d</span><span class=\"p\">)</span><span class=\"o\">**</span><span class=\"mi\">2</span> <span class=\"o\">+</span> <span class=\"n\">e</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"o\">-</span><span class=\"n\">f</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">cos</span><span class=\"p\">(</span><span class=\"n\">x0</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">e</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">compute_partials</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">inputs</span><span class=\"p\">,</span> <span class=\"n\">partials</span><span class=\"p\">):</span>\n<span class=\"w\">        </span><span class=\"sd\">&quot;&quot;&quot;</span>\n<span class=\"sd\">        Provide the Jacobian.</span>\n<span class=\"sd\">        &quot;&quot;&quot;</span>\n        <span class=\"n\">x0</span> <span class=\"o\">=</span> <span class=\"n\">inputs</span><span class=\"p\">[</span><span class=\"s1\">&#39;x0&#39;</span><span class=\"p\">]</span>\n        <span class=\"n\">x1</span> <span class=\"o\">=</span> <span class=\"n\">inputs</span><span class=\"p\">[</span><span class=\"s1\">&#39;x1&#39;</span><span class=\"p\">]</span>\n\n        <span class=\"n\">a</span> <span class=\"o\">=</span> <span class=\"mf\">1.0</span>\n        <span class=\"n\">b</span> <span class=\"o\">=</span> <span class=\"mf\">5.1</span><span class=\"o\">/</span><span class=\"p\">(</span><span class=\"mf\">4.0</span><span class=\"o\">*</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">pi</span><span class=\"o\">**</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n        <span class=\"n\">c</span> <span class=\"o\">=</span> <span class=\"mf\">5.0</span><span class=\"o\">/</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">pi</span>\n        <span class=\"n\">d</span> <span class=\"o\">=</span> <span class=\"mf\">6.0</span>\n        <span class=\"n\">e</span> <span class=\"o\">=</span> <span class=\"mf\">10.0</span>\n        <span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"mf\">1.0</span><span class=\"o\">/</span><span class=\"p\">(</span><span class=\"mf\">8.0</span><span class=\"o\">*</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">pi</span><span class=\"p\">)</span>\n\n        <span class=\"n\">partials</span><span class=\"p\">[</span><span class=\"s1\">&#39;f&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;x1&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mf\">2.0</span><span class=\"o\">*</span><span class=\"n\">a</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"n\">x1</span> <span class=\"o\">-</span> <span class=\"n\">b</span><span class=\"o\">*</span><span class=\"n\">x0</span><span class=\"o\">**</span><span class=\"mi\">2</span> <span class=\"o\">+</span> <span class=\"n\">c</span><span class=\"o\">*</span><span class=\"n\">x0</span> <span class=\"o\">-</span> <span class=\"n\">d</span><span class=\"p\">)</span>\n        <span class=\"n\">partials</span><span class=\"p\">[</span><span class=\"s1\">&#39;f&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;x0&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mf\">2.0</span><span class=\"o\">*</span><span class=\"n\">a</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"n\">x1</span> <span class=\"o\">-</span> <span class=\"n\">b</span><span class=\"o\">*</span><span class=\"n\">x0</span><span class=\"o\">**</span><span class=\"mi\">2</span> <span class=\"o\">+</span> <span class=\"n\">c</span><span class=\"o\">*</span><span class=\"n\">x0</span> <span class=\"o\">-</span> <span class=\"n\">d</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"mf\">2.</span><span class=\"o\">*</span><span class=\"n\">b</span><span class=\"o\">*</span><span class=\"n\">x0</span> <span class=\"o\">+</span> <span class=\"n\">c</span><span class=\"p\">)</span> <span class=\"o\">-</span> <span class=\"n\">e</span><span class=\"o\">*</span><span class=\"p\">(</span><span class=\"mf\">1.</span><span class=\"o\">-</span><span class=\"n\">f</span><span class=\"p\">)</span><span class=\"o\">*</span><span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">sin</span><span class=\"p\">(</span><span class=\"n\">x0</span><span class=\"p\">)</span>\n</pre></div>\n",
      "application/papermill.record/text/latex": "\\begin{Verbatim}[commandchars=\\\\\\{\\}]\n\\PY{k}{class}\\PY{+w}{ }\\PY{n+nc}{Branin}\\PY{p}{(}\\PY{n}{om}\\PY{o}{.}\\PY{n}{ExplicitComponent}\\PY{p}{)}\\PY{p}{:}\n\\PY{+w}{    }\\PY{l+s+sd}{\\PYZdq{}\\PYZdq{}\\PYZdq{}}\n\\PY{l+s+sd}{    The Branin test problem. This version is the standard version and}\n\\PY{l+s+sd}{    contains two continuous parameters.}\n\\PY{l+s+sd}{    \\PYZdq{}\\PYZdq{}\\PYZdq{}}\n\n    \\PY{k}{def}\\PY{+w}{ }\\PY{n+nf}{setup}\\PY{p}{(}\\PY{n+nb+bp}{self}\\PY{p}{)}\\PY{p}{:}\n\\PY{+w}{        }\\PY{l+s+sd}{\\PYZdq{}\\PYZdq{}\\PYZdq{}}\n\\PY{l+s+sd}{        Define the independent variables, output variables, and partials.}\n\\PY{l+s+sd}{        \\PYZdq{}\\PYZdq{}\\PYZdq{}}\n        \\PY{c+c1}{\\PYZsh{} Inputs}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{add\\PYZus{}input}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{x0}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+m+mf}{0.0}\\PY{p}{)}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{add\\PYZus{}input}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{x1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+m+mf}{0.0}\\PY{p}{)}\n\n        \\PY{c+c1}{\\PYZsh{} Outputs}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{add\\PYZus{}output}\\PY{p}{(}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{f}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{val}\\PY{o}{=}\\PY{l+m+mf}{0.0}\\PY{p}{)}\n\n    \\PY{k}{def}\\PY{+w}{ }\\PY{n+nf}{setup\\PYZus{}partials}\\PY{p}{(}\\PY{n+nb+bp}{self}\\PY{p}{)}\\PY{p}{:}\n        \\PY{n+nb+bp}{self}\\PY{o}{.}\\PY{n}{declare\\PYZus{}partials}\\PY{p}{(}\\PY{n}{of}\\PY{o}{=}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{f}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{n}{wrt}\\PY{o}{=}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{x0}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{x1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\\PY{p}{)}\n\n    \\PY{k}{def}\\PY{+w}{ }\\PY{n+nf}{compute}\\PY{p}{(}\\PY{n+nb+bp}{self}\\PY{p}{,} \\PY{n}{inputs}\\PY{p}{,} \\PY{n}{outputs}\\PY{p}{)}\\PY{p}{:}\n\\PY{+w}{        }\\PY{l+s+sd}{\\PYZdq{}\\PYZdq{}\\PYZdq{}}\n\\PY{l+s+sd}{        Define the function f(xI, xC).}\n\n\\PY{l+s+sd}{        When Branin is used in a mixed integer problem, x0 is integer and x1 is continuous.}\n\\PY{l+s+sd}{        \\PYZdq{}\\PYZdq{}\\PYZdq{}}\n        \\PY{n}{x0} \\PY{o}{=} \\PY{n}{inputs}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{x0}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\n        \\PY{n}{x1} \\PY{o}{=} \\PY{n}{inputs}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{x1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\n\n        \\PY{n}{a} \\PY{o}{=} \\PY{l+m+mf}{1.0}\n        \\PY{n}{b} \\PY{o}{=} \\PY{l+m+mf}{5.1}\\PY{o}{/}\\PY{p}{(}\\PY{l+m+mf}{4.0}\\PY{o}{*}\\PY{n}{np}\\PY{o}{.}\\PY{n}{pi}\\PY{o}{*}\\PY{o}{*}\\PY{l+m+mi}{2}\\PY{p}{)}\n        \\PY{n}{c} \\PY{o}{=} \\PY{l+m+mf}{5.0}\\PY{o}{/}\\PY{n}{np}\\PY{o}{.}\\PY{n}{pi}\n        \\PY{n}{d} \\PY{o}{=} \\PY{l+m+mf}{6.0}\n        \\PY{n}{e} \\PY{o}{=} \\PY{l+m+mf}{10.0}\n        \\PY{n}{f} \\PY{o}{=} \\PY{l+m+mf}{1.0}\\PY{o}{/}\\PY{p}{(}\\PY{l+m+mf}{8.0}\\PY{o}{*}\\PY{n}{np}\\PY{o}{.}\\PY{n}{pi}\\PY{p}{)}\n\n        \\PY{n}{outputs}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{f}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]} \\PY{o}{=} \\PY{n}{a}\\PY{o}{*}\\PY{p}{(}\\PY{n}{x1} \\PY{o}{\\PYZhy{}} \\PY{n}{b}\\PY{o}{*}\\PY{n}{x0}\\PY{o}{*}\\PY{o}{*}\\PY{l+m+mi}{2} \\PY{o}{+} \\PY{n}{c}\\PY{o}{*}\\PY{n}{x0} \\PY{o}{\\PYZhy{}} \\PY{n}{d}\\PY{p}{)}\\PY{o}{*}\\PY{o}{*}\\PY{l+m+mi}{2} \\PY{o}{+} \\PY{n}{e}\\PY{o}{*}\\PY{p}{(}\\PY{l+m+mi}{1}\\PY{o}{\\PYZhy{}}\\PY{n}{f}\\PY{p}{)}\\PY{o}{*}\\PY{n}{np}\\PY{o}{.}\\PY{n}{cos}\\PY{p}{(}\\PY{n}{x0}\\PY{p}{)} \\PY{o}{+} \\PY{n}{e}\n\n    \\PY{k}{def}\\PY{+w}{ }\\PY{n+nf}{compute\\PYZus{}partials}\\PY{p}{(}\\PY{n+nb+bp}{self}\\PY{p}{,} \\PY{n}{inputs}\\PY{p}{,} \\PY{n}{partials}\\PY{p}{)}\\PY{p}{:}\n\\PY{+w}{        }\\PY{l+s+sd}{\\PYZdq{}\\PYZdq{}\\PYZdq{}}\n\\PY{l+s+sd}{        Provide the Jacobian.}\n\\PY{l+s+sd}{        \\PYZdq{}\\PYZdq{}\\PYZdq{}}\n        \\PY{n}{x0} \\PY{o}{=} \\PY{n}{inputs}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{x0}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\n        \\PY{n}{x1} \\PY{o}{=} \\PY{n}{inputs}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{x1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]}\n\n        \\PY{n}{a} \\PY{o}{=} \\PY{l+m+mf}{1.0}\n        \\PY{n}{b} \\PY{o}{=} \\PY{l+m+mf}{5.1}\\PY{o}{/}\\PY{p}{(}\\PY{l+m+mf}{4.0}\\PY{o}{*}\\PY{n}{np}\\PY{o}{.}\\PY{n}{pi}\\PY{o}{*}\\PY{o}{*}\\PY{l+m+mi}{2}\\PY{p}{)}\n        \\PY{n}{c} \\PY{o}{=} \\PY{l+m+mf}{5.0}\\PY{o}{/}\\PY{n}{np}\\PY{o}{.}\\PY{n}{pi}\n        \\PY{n}{d} \\PY{o}{=} \\PY{l+m+mf}{6.0}\n        \\PY{n}{e} \\PY{o}{=} \\PY{l+m+mf}{10.0}\n        \\PY{n}{f} \\PY{o}{=} \\PY{l+m+mf}{1.0}\\PY{o}{/}\\PY{p}{(}\\PY{l+m+mf}{8.0}\\PY{o}{*}\\PY{n}{np}\\PY{o}{.}\\PY{n}{pi}\\PY{p}{)}\n\n        \\PY{n}{partials}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{f}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{x1}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]} \\PY{o}{=} \\PY{l+m+mf}{2.0}\\PY{o}{*}\\PY{n}{a}\\PY{o}{*}\\PY{p}{(}\\PY{n}{x1} \\PY{o}{\\PYZhy{}} \\PY{n}{b}\\PY{o}{*}\\PY{n}{x0}\\PY{o}{*}\\PY{o}{*}\\PY{l+m+mi}{2} \\PY{o}{+} \\PY{n}{c}\\PY{o}{*}\\PY{n}{x0} \\PY{o}{\\PYZhy{}} \\PY{n}{d}\\PY{p}{)}\n        \\PY{n}{partials}\\PY{p}{[}\\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{f}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{,} \\PY{l+s+s1}{\\PYZsq{}}\\PY{l+s+s1}{x0}\\PY{l+s+s1}{\\PYZsq{}}\\PY{p}{]} \\PY{o}{=} \\PY{l+m+mf}{2.0}\\PY{o}{*}\\PY{n}{a}\\PY{o}{*}\\PY{p}{(}\\PY{n}{x1} \\PY{o}{\\PYZhy{}} \\PY{n}{b}\\PY{o}{*}\\PY{n}{x0}\\PY{o}{*}\\PY{o}{*}\\PY{l+m+mi}{2} \\PY{o}{+} \\PY{n}{c}\\PY{o}{*}\\PY{n}{x0} \\PY{o}{\\PYZhy{}} \\PY{n}{d}\\PY{p}{)}\\PY{o}{*}\\PY{p}{(}\\PY{o}{\\PYZhy{}}\\PY{l+m+mf}{2.}\\PY{o}{*}\\PY{n}{b}\\PY{o}{*}\\PY{n}{x0} \\PY{o}{+} \\PY{n}{c}\\PY{p}{)} \\PY{o}{\\PYZhy{}} \\PY{n}{e}\\PY{o}{*}\\PY{p}{(}\\PY{l+m+mf}{1.}\\PY{o}{\\PYZhy{}}\\PY{n}{f}\\PY{p}{)}\\PY{o}{*}\\PY{n}{np}\\PY{o}{.}\\PY{n}{sin}\\PY{p}{(}\\PY{n}{x0}\\PY{p}{)}\n\\end{Verbatim}\n",
      "application/papermill.record/text/plain": "class Branin(om.ExplicitComponent):\n    \"\"\"\n    The Branin test problem. This version is the standard version and\n    contains two continuous parameters.\n    \"\"\"\n\n    def setup(self):\n        \"\"\"\n        Define the independent variables, output variables, and partials.\n        \"\"\"\n        # Inputs\n        self.add_input('x0', 0.0)\n        self.add_input('x1', 0.0)\n\n        # Outputs\n        self.add_output('f', val=0.0)\n\n    def setup_partials(self):\n        self.declare_partials(of='f', wrt=['x0', 'x1'])\n\n    def compute(self, inputs, outputs):\n        \"\"\"\n        Define the function f(xI, xC).\n\n        When Branin is used in a mixed integer problem, x0 is integer and x1 is continuous.\n        \"\"\"\n        x0 = inputs['x0']\n        x1 = inputs['x1']\n\n        a = 1.0\n        b = 5.1/(4.0*np.pi**2)\n        c = 5.0/np.pi\n        d = 6.0\n        e = 10.0\n        f = 1.0/(8.0*np.pi)\n\n        outputs['f'] = a*(x1 - b*x0**2 + c*x0 - d)**2 + e*(1-f)*np.cos(x0) + e\n\n    def compute_partials(self, inputs, partials):\n        \"\"\"\n        Provide the Jacobian.\n        \"\"\"\n        x0 = inputs['x0']\n        x1 = inputs['x1']\n\n        a = 1.0\n        b = 5.1/(4.0*np.pi**2)\n        c = 5.0/np.pi\n        d = 6.0\n        e = 10.0\n        f = 1.0/(8.0*np.pi)\n\n        partials['f', 'x1'] = 2.0*a*(x1 - b*x0**2 + c*x0 - d)\n        partials['f', 'x0'] = 2.0*a*(x1 - b*x0**2 + c*x0 - d)*(-2.*b*x0 + c) - e*(1.-f)*np.sin(x0)"
     },
     "metadata": {
      "scrapbook": {
       "mime_prefix": "application/papermill.record/",
       "name": "code_src15"
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from openmdao.utils.notebook_utils import get_code\n",
    "from myst_nb import glue\n",
    "glue(\"code_src15\", get_code(\"openmdao.test_suite.components.branin.Branin\"), display=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "49f9629f",
   "metadata": {
    "papermill": {
     "duration": 0.001773,
     "end_time": "2026-10-02T14:42:05.105377+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:05.103604+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    ":::{dropdown} `Branin` class definition \n",
    "\n",
    "{glue:}`code_src15`\n",
    ":::"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "9016697c",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:42:05.109999Z",
     "iopub.status.busy": "2026-10-02T14:42:05.109792Z",
     "iopub.status.idle": "2026-10-02T14:42:05.178677Z",
     "shell.execute_reply": "2026-10-02T14:42:05.177660Z"
    },
    "papermill": {
     "duration": 0.072213,
     "end_time": "2026-10-02T14:42:05.179301+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:05.107088+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Problem: problem2\n",
       "Driver:  DifferentialEvolutionDriver\n",
       "  success     : True\n",
       "  iterations  : 241\n",
       "  runtime     : 5.8878E-02 s\n",
       "  model_evals : 241\n",
       "  model_time  : 1.1275E-02 s\n",
       "  deriv_evals : 0\n",
       "  deriv_time  : 0.0000E+00 s\n",
       "  exit_status : SUCCESS"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import openmdao.api as om\n",
    "from openmdao.test_suite.components.branin import Branin\n",
    "\n",
    "prob = om.Problem()\n",
    "model = prob.model\n",
    "\n",
    "model.add_subsystem('comp', Branin(), promotes_inputs=[('x0', 'xI'), ('x1', 'xC')])\n",
    "\n",
    "model.add_design_var('xI', lower=-5.0, upper=10.0)\n",
    "model.add_design_var('xC', lower=0.0, upper=15.0)\n",
    "model.add_objective('comp.f')\n",
    "\n",
    "prob.driver = om.DifferentialEvolutionDriver()\n",
    "prob.driver.options['max_gen'] = 5\n",
    "\n",
    "prob.setup()\n",
    "prob.run_driver()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "97fc61c0",
   "metadata": {
    "papermill": {
     "duration": 0.001876,
     "end_time": "2026-10-02T14:42:05.183203+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:05.181327+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "You can change the population size by setting the “pop_size” option. The default value for pop_size is 0, which means that the driver automatically computes a population size that is 20 times the total number of input variables."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a872ac59",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:42:05.187952Z",
     "iopub.status.busy": "2026-10-02T14:42:05.187767Z",
     "iopub.status.idle": "2026-10-02T14:42:05.528620Z",
     "shell.execute_reply": "2026-10-02T14:42:05.527237Z"
    },
    "papermill": {
     "duration": 0.34474,
     "end_time": "2026-10-02T14:42:05.529829+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:42:05.185089+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Problem: problem3\n",
       "Driver:  DifferentialEvolutionDriver\n",
       "  success     : True\n",
       "  iterations  : 1011\n",
       "  runtime     : 3.3249E-01 s\n",
       "  model_evals : 1011\n",
       "  model_time  : 6.9063E-02 s\n",
       "  deriv_evals : 0\n",
       "  deriv_time  : 0.0000E+00 s\n",
       "  exit_status : SUCCESS"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import openmdao.api as om\n",
    "from openmdao.test_suite.components.branin import Branin\n",
    "\n",
    "prob = om.Problem()\n",
    "model = prob.model\n",
    "\n",
    "model.add_subsystem('comp', Branin(), promotes_inputs=[('x0', 'xI'), ('x1', 'xC')])\n",
    "\n",
    "model.add_design_var('xI', lower=-5.0, upper=10.0)\n",
    "model.add_design_var('xC', lower=0.0, upper=15.0)\n",
    "model.add_objective('comp.f')\n",
    "\n",
    "prob.driver = om.DifferentialEvolutionDriver()\n",
    "prob.driver.options['pop_size'] = 10\n",
    "\n",
    "prob.setup()\n",
    "prob.run_driver()"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Tags",
  "kernelspec": {
   "display_name": "Python 3",
   "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.13.14"
  },
  "nbsphinx": {
   "timeout": 90
  },
  "orphan": true,
  "papermill": {
   "default_parameters": {},
   "duration": 17.036168,
   "end_time": "2026-10-02T14:42:06.349687+00:00",
   "environment_variables": {},
   "exception": null,
   "input_path": "/home/runner/work/OpenMDAO/OpenMDAO/openmdao/docs/openmdao_book/features/building_blocks/drivers/differential_evolution.ipynb",
   "output_path": "/home/runner/work/OpenMDAO/OpenMDAO/openmdao/docs/_executed_book/features/building_blocks/drivers/differential_evolution.ipynb",
   "parameters": {},
   "start_time": "2026-10-02T14:41:49.313519+00:00",
   "version": "2.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}