{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "978d3174",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:48:41.603880Z",
     "iopub.status.busy": "2026-10-02T14:48:41.603651Z",
     "iopub.status.idle": "2026-10-02T14:48:41.607660Z",
     "shell.execute_reply": "2026-10-02T14:48:41.607220Z"
    },
    "hide_input": true,
    "papermill": {
     "duration": 0.00758,
     "end_time": "2026-10-02T14:48:41.608491+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:41.600911+00:00",
     "status": "completed"
    },
    "tags": [
     "active-ipynb",
     "remove-input",
     "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": "code",
   "execution_count": 2,
   "id": "f7451e7b",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:48:41.612242Z",
     "iopub.status.busy": "2026-10-02T14:48:41.612101Z",
     "iopub.status.idle": "2026-10-02T14:48:41.652011Z",
     "shell.execute_reply": "2026-10-02T14:48:41.651328Z"
    },
    "papermill": {
     "duration": 0.042368,
     "end_time": "2026-10-02T14:48:41.652528+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:41.610160+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "# Need to set seeds.\n",
    "import numpy as np\n",
    "np.random.seed(1)\n",
    "\n",
    "import os\n",
    "os.environ['SimpleGADriver_seed'] = '11'"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "e307d25d",
   "metadata": {
    "papermill": {
     "duration": 0.001622,
     "end_time": "2026-10-02T14:48:41.655672+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:41.654050+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "# SimpleGADriver\n",
    "\n",
    "```{Note}\n",
    "SimpleGADriver is based on a simple genetic algorithm implementation sourced from the lecture notes for the class 2009 AAE550 taught by Prof. William A. Crossley at Purdue University.\n",
    "```\n",
    "\n",
    "This genetic algorithm optimizer supports integer and continuous variables. It uses a binary encoding scheme to encode any continuous variables into a user-definable number of bits. The number of bits you choose should be equal to the base-2 logarithm of the number of discrete values you want between the min and max value. A higher value means more accuracy for this variable, but it also increases the number of generations (and hence total evaluations) that will be required to find the minimum. If you do not specify a value for bits for a continuous variable, then the variable is assumed to be integer, and encoded as such. Note that if the range between the upper and lower bounds is not a power of two, then the variable is discretized beyond the upper bound, but those points that the GA generates which exceed the declared upper bound are discarded before evaluation.\n",
    "\n",
    "The SimpleGADriver supports both constrained and unconstrained optimization."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "b9430b3b",
   "metadata": {
    "papermill": {
     "duration": 0.001303,
     "end_time": "2026-10-02T14:48:41.658311+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:41.657008+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## SimpleGADriver Options"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "aab5e5a5",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:48:41.781640Z",
     "iopub.status.busy": "2026-10-02T14:48:41.781405Z",
     "iopub.status.idle": "2026-10-02T14:48:42.898617Z",
     "shell.execute_reply": "2026-10-02T14:48:42.897862Z"
    },
    "papermill": {
     "duration": 1.239362,
     "end_time": "2026-10-02T14:48:42.899154+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:41.659792+00:00",
     "status": "completed"
    },
    "scrolled": true,
    "tags": [
     "remove-input"
    ]
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/runner/work/OpenMDAO/OpenMDAO/.pixi/envs/dev/lib/python3.13/site-packages/openmdao/drivers/genetic_algorithm_driver.py:106: OMDeprecationWarning:The `SimpleGADriver` is deprecated. Please use `pymooDriver` for population based optimizations.\n"
     ]
    },
    {
     "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;\">Pc</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">0.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;\">Crossover rate.</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">Pm</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">0.01</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;\">Mutation rate.</td></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">bits</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;\">Number of bits of resolution. Default is an empty dict, where every unspecified variable is assumed to be integer, and the number of bits is calculated automatically. If you have a continuous var, you should set a bits value as a key in this dictionary.</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">compute_pareto</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;\">N/A</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;\">When True, compute a set of non-dominated points based on all given objectives and update it each generation. The multi-objective weight and exponents are ignored because the algorithm uses all objective values instead of a composite.</td></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">cross_bits</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;\">If True, crossover swaps single bits instead the default k-point crossover.</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><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: ghostwhite;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">elitism</td><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">True</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;\">If True, replace worst performing point with best from previous generation each iteration.</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><td style=\"border: 1px solid #999; border-collapse: collapse; padding: 5px; text-align: left;\">gray</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;\">If True, use Gray code for binary encoding. Gray coding makes the binary representation of adjacent integers differ by one bit.</td></tr>\n",
       "       <tr style=\"background-color: ghostwhite;\"><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: #F3F3F3;\"><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: ghostwhite;\"><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: #F3F3F3;\"><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: ghostwhite;\"><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: #F3F3F3;\"><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: ghostwhite;\"><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 four times the number of bits.</td></tr>\n",
       "       <tr style=\"background-color: #F3F3F3;\"><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: ghostwhite;\"><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": [
    "import openmdao.api as om\n",
    "om.show_options_table(\"openmdao.drivers.genetic_algorithm_driver.SimpleGADriver\")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "be31b2d3",
   "metadata": {
    "papermill": {
     "duration": 0.024114,
     "end_time": "2026-10-02T14:48:42.925148+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:42.901034+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## SimpleGADriver Constructor\n",
    "\n",
    "The call signature for the `SimpleGADriver` constructor is:\n",
    "\n",
    "\n",
    "```{eval-rst}\n",
    "    .. automethod:: openmdao.drivers.genetic_algorithm_driver.SimpleGADriver.__init__\n",
    "       :noindex:\n",
    "```  \n",
    "\n",
    "## Using SimpleGADriver\n",
    "\n",
    "The examples below show a mixed-integer problem to illustrate usage of this driver with both integer and discrete design variables.  The driver `iter_count` attribute reflects the number of times the model is evaluated in the course of the run."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "78b6421a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:48:42.929094Z",
     "iopub.status.busy": "2026-10-02T14:48:42.928770Z",
     "iopub.status.idle": "2026-10-02T14:48:43.631847Z",
     "shell.execute_reply": "2026-10-02T14:48:43.631176Z"
    },
    "papermill": {
     "duration": 0.705736,
     "end_time": "2026-10-02T14:48:43.632361+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:42.926625+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_src17"
      }
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from openmdao.utils.notebook_utils import get_code\n",
    "from myst_nb import glue\n",
    "glue(\"code_src17\", get_code(\"openmdao.test_suite.components.branin.Branin\"), display=False)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "ffc98026",
   "metadata": {
    "papermill": {
     "duration": 0.001648,
     "end_time": "2026-10-02T14:48:43.635983+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:43.634335+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    ":::{dropdown} `Branin` class definition \n",
    "\n",
    "{glue:}`code_src17`\n",
    ":::"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "abd85839",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:48:43.640112Z",
     "iopub.status.busy": "2026-10-02T14:48:43.639914Z",
     "iopub.status.idle": "2026-10-02T14:48:45.759122Z",
     "shell.execute_reply": "2026-10-02T14:48:45.758298Z"
    },
    "papermill": {
     "duration": 2.122116,
     "end_time": "2026-10-02T14:48:45.759687+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:43.637571+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1790952524.847040] [runnervm8df0l:11438:0]        ib_iface.c:1269 UCX  ERROR mana_0: iface 0x55da1526e7d0 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",
      "[1790952524.847326] [runnervm8df0l:11438: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:11438] pml_ucx.c:313  Error: Failed to create UCP worker\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "4849\n"
     ]
    }
   ],
   "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(),\n",
    "                    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.SimpleGADriver()\n",
    "prob.driver.options['bits'] = {'xC': 8}\n",
    "\n",
    "prob.setup()\n",
    "\n",
    "prob.set_val('xC', 7.5)\n",
    "prob.set_val('xI', 0.0)\n",
    "\n",
    "prob.run_driver()\n",
    "print(prob.driver.iter_count)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "e4fc4c98",
   "metadata": {
    "papermill": {
     "duration": 0.050697,
     "end_time": "2026-10-02T14:48:45.812628+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:45.761931+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "You can change the number of generations to run the genetic algorithm by setting the “max_gen” option."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "a2b16f89",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:48:45.828808Z",
     "iopub.status.busy": "2026-10-02T14:48:45.828592Z",
     "iopub.status.idle": "2026-10-02T14:48:45.890373Z",
     "shell.execute_reply": "2026-10-02T14:48:45.889645Z"
    },
    "papermill": {
     "duration": 0.076227,
     "end_time": "2026-10-02T14:48:45.890991+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:45.814764+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "289\n"
     ]
    }
   ],
   "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(),\n",
    "                    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.SimpleGADriver()\n",
    "prob.driver.options['bits'] = {'xC': 8}\n",
    "prob.driver.options['max_gen'] = 5\n",
    "\n",
    "prob.setup()\n",
    "\n",
    "prob.set_val('xC', 7.5)\n",
    "prob.set_val('xI', 0.0)\n",
    "\n",
    "prob.run_driver()\n",
    "print(prob.driver.iter_count)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "e233eebe",
   "metadata": {
    "papermill": {
     "duration": 0.001818,
     "end_time": "2026-10-02T14:48:45.894881+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:45.893063+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 4 times the total number of bits for all variables encoded."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "4bbee45a",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:48:45.899275Z",
     "iopub.status.busy": "2026-10-02T14:48:45.899102Z",
     "iopub.status.idle": "2026-10-02T14:48:46.102707Z",
     "shell.execute_reply": "2026-10-02T14:48:46.101848Z"
    },
    "papermill": {
     "duration": 0.206699,
     "end_time": "2026-10-02T14:48:46.103273+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:45.896574+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1011\n"
     ]
    }
   ],
   "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(),\n",
    "                    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.SimpleGADriver()\n",
    "prob.driver.options['bits'] = {'xC': 8}\n",
    "prob.driver.options['pop_size'] = 10\n",
    "\n",
    "prob.setup()\n",
    "\n",
    "prob.set_val('xC', 7.5)\n",
    "prob.set_val('xI', 0.0)\n",
    "\n",
    "prob.run_driver()\n",
    "print(prob.driver.iter_count)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "32448929",
   "metadata": {
    "papermill": {
     "duration": 0.026285,
     "end_time": "2026-10-02T14:48:46.131689+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:46.105404+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "If you have more than one objective, you can use the `SimpleGADriver` to compute a set of non-dominated candidate optima by setting the “compute_pareto” option to True. In this case, the final state of the model will only be one of the pareto-optimal designs. The full set can be accessed via the ‘desvar_nd’ and ‘obj_nd’ attributes on the driver for the design variable values and their corresponding objectives."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "e2215a77",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:48:46.136262Z",
     "iopub.status.busy": "2026-10-02T14:48:46.136056Z",
     "iopub.status.idle": "2026-10-02T14:48:46.138619Z",
     "shell.execute_reply": "2026-10-02T14:48:46.138064Z"
    },
    "papermill": {
     "duration": 0.005588,
     "end_time": "2026-10-02T14:48:46.139206+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:46.133618+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "# Reset seed\n",
    "np.random.seed(1)\n",
    "os.environ['SimpleGADriver_seed'] = '11'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "afea6558",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:48:46.159134Z",
     "iopub.status.busy": "2026-10-02T14:48:46.158966Z",
     "iopub.status.idle": "2026-10-02T14:48:46.597726Z",
     "shell.execute_reply": "2026-10-02T14:48:46.596982Z"
    },
    "papermill": {
     "duration": 0.44188,
     "end_time": "2026-10-02T14:48:46.598163+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:46.156283+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/runner/work/OpenMDAO/OpenMDAO/.pixi/envs/dev/lib/python3.13/site-packages/openmdao/core/group.py:1197: DerivativesWarning:Constraints or objectives [box.front_area, box.top_area, box.volume] 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": [
      "[[1.83607843 0.54705882 0.95686275]\n",
      " [1.50823529 0.28627451 1.95529412]\n",
      " [1.45607843 1.90313725 0.34588235]\n",
      " [1.76156863 0.54705882 1.01647059]\n",
      " [1.85098039 1.03137255 0.49490196]\n",
      " [1.87333333 0.57686275 0.90470588]\n",
      " [1.38156863 1.87333333 0.38313725]\n",
      " [1.68705882 0.39803922 1.47098039]\n",
      " [1.86588235 0.50980392 1.01647059]\n",
      " [2.         0.42784314 1.13568627]\n",
      " [1.99254902 0.69607843 0.70352941]\n",
      " [1.74666667 0.39803922 1.40392157]\n",
      " [1.99254902 0.30117647 1.38901961]\n",
      " [1.97764706 0.20431373 1.95529412]\n",
      " [1.99254902 0.57686275 0.84509804]\n",
      " [1.9254902  0.30117647 1.50823529]\n",
      " [1.75411765 0.57686275 0.97176471]\n",
      " [1.94039216 0.92705882 0.5545098 ]\n",
      " [1.74666667 0.81529412 0.70352941]\n",
      " [1.75411765 0.42039216 1.35176471]]\n"
     ]
    }
   ],
   "source": [
    "import openmdao.api as om\n",
    "\n",
    "class Box(om.ExplicitComponent):\n",
    "\n",
    "    def setup(self):\n",
    "        self.add_input('length', val=1.)\n",
    "        self.add_input('width', val=1.)\n",
    "        self.add_input('height', val=1.)\n",
    "\n",
    "        self.add_output('front_area', val=1.0)\n",
    "        self.add_output('top_area', val=1.0)\n",
    "        self.add_output('area', val=1.0)\n",
    "        self.add_output('volume', val=1.)\n",
    "\n",
    "    def compute(self, inputs, outputs):\n",
    "        length = inputs['length']\n",
    "        width = inputs['width']\n",
    "        height = inputs['height']\n",
    "\n",
    "        outputs['top_area'] = length * width\n",
    "        outputs['front_area'] = length * height\n",
    "        outputs['area'] = 2*length*height + 2*length*width + 2*height*width\n",
    "        outputs['volume'] = length*height*width\n",
    "\n",
    "prob = om.Problem()\n",
    "\n",
    "prob.model.add_subsystem('box', Box(), promotes=['*'])\n",
    "\n",
    "# setup the optimization\n",
    "prob.driver = om.SimpleGADriver()\n",
    "prob.driver.options['max_gen'] = 20\n",
    "prob.driver.options['bits'] = {'length': 8, 'width': 8, 'height': 8}\n",
    "prob.driver.options['penalty_parameter'] = 10.\n",
    "prob.driver.options['compute_pareto'] = True\n",
    "\n",
    "prob.model.add_design_var('length', lower=0.1, upper=2.)\n",
    "prob.model.add_design_var('width', lower=0.1, upper=2.)\n",
    "prob.model.add_design_var('height', lower=0.1, upper=2.)\n",
    "prob.model.add_objective('front_area', scaler=-1)  # maximize\n",
    "prob.model.add_objective('top_area', scaler=-1)  # maximize\n",
    "prob.model.add_constraint('volume', upper=1.)\n",
    "\n",
    "prob.setup()\n",
    "\n",
    "prob.set_val('length', 1.5)\n",
    "prob.set_val('width', 1.5)\n",
    "prob.set_val('height', 1.5)\n",
    "\n",
    "prob.run_driver()\n",
    "\n",
    "desvar_nd = prob.driver.desvar_nd\n",
    "nd_obj = prob.driver.obj_nd\n",
    "\n",
    "print(desvar_nd)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "10ac3be1",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:48:46.602918Z",
     "iopub.status.busy": "2026-10-02T14:48:46.602779Z",
     "iopub.status.idle": "2026-10-02T14:48:46.607524Z",
     "shell.execute_reply": "2026-10-02T14:48:46.606903Z"
    },
    "papermill": {
     "duration": 0.007626,
     "end_time": "2026-10-02T14:48:46.607981+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:46.600355+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(2.295000803420113e-09)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from openmdao.utils.assert_utils import assert_near_equal\n",
    "assert_near_equal(desvar_nd, np.array([[1.83607843, 0.54705882, 0.95686275],\n",
    "                                    [1.50823529, 0.28627451, 1.95529412],\n",
    "                                    [1.45607843, 1.90313725, 0.34588235],\n",
    "                                    [1.76156863, 0.54705882, 1.01647059],\n",
    "                                    [1.85098039, 1.03137255, 0.49490196],\n",
    "                                    [1.87333333, 0.57686275, 0.90470588],\n",
    "                                    [1.38156863, 1.87333333, 0.38313725],\n",
    "                                    [1.68705882, 0.39803922, 1.47098039],\n",
    "                                    [1.86588235, 0.50980392, 1.01647059],\n",
    "                                    [2.        , 0.42784314, 1.13568627],\n",
    "                                    [1.99254902, 0.69607843, 0.70352941],\n",
    "                                    [1.74666667, 0.39803922, 1.40392157],\n",
    "                                    [1.99254902, 0.30117647, 1.38901961],\n",
    "                                    [1.97764706, 0.20431373, 1.95529412],\n",
    "                                    [1.99254902, 0.57686275, 0.84509804],\n",
    "                                    [1.9254902 , 0.30117647, 1.50823529],\n",
    "                                    [1.75411765, 0.57686275, 0.97176471],\n",
    "                                    [1.94039216, 0.92705882, 0.5545098 ],\n",
    "                                    [1.74666667, 0.81529412, 0.70352941],\n",
    "                                    [1.75411765, 0.42039216, 1.35176471]]),\n",
    "                          1e-6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "5533a530",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:48:46.612182Z",
     "iopub.status.busy": "2026-10-02T14:48:46.612055Z",
     "iopub.status.idle": "2026-10-02T14:48:46.614959Z",
     "shell.execute_reply": "2026-10-02T14:48:46.614292Z"
    },
    "papermill": {
     "duration": 0.005501,
     "end_time": "2026-10-02T14:48:46.615345+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:46.609844+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[-3.86688166 -0.40406044]\n",
      " [-2.9490436  -0.43176932]\n",
      " [-2.90409227 -0.57991234]\n",
      " [-2.76768966 -0.60010888]\n",
      " [-2.48163045 -0.67151557]\n",
      " [-2.45218301 -0.69524183]\n",
      " [-2.37115433 -0.7374173 ]\n",
      " [-2.27137255 -0.85568627]\n",
      " [-1.89661453 -0.95123414]\n",
      " [-1.7905827  -0.96368166]\n",
      " [-1.75687505 -1.00444291]\n",
      " [-1.70458962 -1.01188512]\n",
      " [-1.69481569 -1.08065621]\n",
      " [-1.68389927 -1.1494273 ]\n",
      " [-1.40181684 -1.3869704 ]\n",
      " [-1.21024148 -1.40545716]\n",
      " [-1.07596647 -1.79885767]\n",
      " [-0.91605383 -1.90905037]\n",
      " [-0.52933041 -2.58813856]\n",
      " [-0.50363183 -2.77111711]]\n"
     ]
    }
   ],
   "source": [
    "sorted_obj = nd_obj[nd_obj[:, 0].argsort()]\n",
    "\n",
    "print(sorted_obj)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "67e70fe0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:48:46.647458Z",
     "iopub.status.busy": "2026-10-02T14:48:46.647325Z",
     "iopub.status.idle": "2026-10-02T14:48:46.651135Z",
     "shell.execute_reply": "2026-10-02T14:48:46.650423Z"
    },
    "papermill": {
     "duration": 0.006623,
     "end_time": "2026-10-02T14:48:46.651583+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:46.644960+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "np.float64(1.4301992022181488e-09)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "assert_near_equal(sorted_obj, np.array([[-3.86688166, -0.40406044],\n",
    "                                    [-2.9490436 , -0.43176932],\n",
    "                                    [-2.90409227, -0.57991234],\n",
    "                                    [-2.76768966, -0.60010888],\n",
    "                                    [-2.48163045, -0.67151557],\n",
    "                                    [-2.45218301, -0.69524183],\n",
    "                                    [-2.37115433, -0.7374173 ],\n",
    "                                    [-2.27137255, -0.85568627],\n",
    "                                    [-1.89661453, -0.95123414],\n",
    "                                    [-1.7905827 , -0.96368166],\n",
    "                                    [-1.75687505, -1.00444291],\n",
    "                                    [-1.70458962, -1.01188512],\n",
    "                                    [-1.69481569, -1.08065621],\n",
    "                                    [-1.68389927, -1.1494273 ],\n",
    "                                    [-1.40181684, -1.3869704 ],\n",
    "                                    [-1.21024148, -1.40545716],\n",
    "                                    [-1.07596647, -1.79885767],\n",
    "                                    [-0.91605383, -1.90905037],\n",
    "                                    [-0.52933041, -2.58813856],\n",
    "                                    [-0.50363183, -2.77111711]]),\n",
    "                          1e-6)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "6744efc5",
   "metadata": {
    "papermill": {
     "duration": 0.002011,
     "end_time": "2026-10-02T14:48:46.687941+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:46.685930+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## Constrained Optimization\n",
    "\n",
    "The SimpleGADriver supports both constrained and unconstrained optimization. If you have constraints,\n",
    "the constraints are added to the objective after they have been weighted using a user-tunable\n",
    "penalty multiplier and exponent. \n",
    "\n",
    "All constraints are converted to the form of $g(x)_i \\leq 0$ for\n",
    "inequality constraints and $h(x)_i = 0$ for equality constraints.\n",
    "The constraint vector for inequality constraints is the following:\n",
    "\n",
    "   $g = [g_1, g_2  \\dots g_N], g_i \\in R^{N_{g_i}}$\n",
    "   $h = [h_1, h_2  \\dots h_N], h_i \\in R^{N_{h_i}}$\n",
    "\n",
    "The number of all constraints:\n",
    "\n",
    "   $N_g = \\sum_{i=1}^N N_{g_i},  N_h = \\sum_{i=1}^N N_{h_i}$\n",
    "\n",
    "The fitness function is constructed with the penalty parameter $p$\n",
    "and the exponent $\\kappa$:\n",
    "\n",
    "   $\\Phi(x) = f(x) + p \\cdot \\sum_{k=1}^{N^g}(\\delta_k \\cdot g_k^{\\kappa})\n",
    "   + p \\cdot \\sum_{k=1}^{N^h}|h_k|^{\\kappa}$\n",
    "\n",
    "where $\\delta_k = 0$ if $g_k$ is satisfied, 1 otherwise\n",
    "\n",
    "The following example shows how to set the penalty parameter $p$ and the exponent $\\kappa$:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "8f3140c0",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:48:46.692757Z",
     "iopub.status.busy": "2026-10-02T14:48:46.692574Z",
     "iopub.status.idle": "2026-10-02T14:48:47.357594Z",
     "shell.execute_reply": "2026-10-02T14:48:47.356835Z"
    },
    "papermill": {
     "duration": 0.668599,
     "end_time": "2026-10-02T14:48:47.358413+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:46.689814+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/runner/work/OpenMDAO/OpenMDAO/.pixi/envs/dev/lib/python3.13/site-packages/openmdao/core/group.py:1197: DerivativesWarning:Constraints or objectives [cylinder.Area, cylinder.Volume] 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": [
      "[1.25882353]\n",
      "[2.01764706]\n"
     ]
    }
   ],
   "source": [
    "import openmdao.api as om\n",
    "\n",
    "class Cylinder(om.ExplicitComponent):\n",
    "    \"\"\"Main class\"\"\"\n",
    "\n",
    "    def setup(self):\n",
    "        self.add_input('radius', val=1.0)\n",
    "        self.add_input('height', val=1.0)\n",
    "\n",
    "        self.add_output('Area', val=1.0)\n",
    "        self.add_output('Volume', val=1.0)\n",
    "\n",
    "    def compute(self, inputs, outputs):\n",
    "        radius = inputs['radius']\n",
    "        height = inputs['height']\n",
    "\n",
    "        area = height * radius * 2 * 3.14 + 3.14 * radius ** 2 * 2\n",
    "        volume = 3.14 * radius ** 2 * height\n",
    "        outputs['Area'] = area\n",
    "        outputs['Volume'] = volume\n",
    "\n",
    "prob = om.Problem()\n",
    "prob.model.add_subsystem('cylinder', Cylinder(), promotes=['*'])\n",
    "\n",
    "# setup the optimization\n",
    "prob.driver = om.SimpleGADriver()\n",
    "prob.driver.options['penalty_parameter'] = 3.\n",
    "prob.driver.options['penalty_exponent'] = 1.\n",
    "prob.driver.options['max_gen'] = 50\n",
    "prob.driver.options['bits'] = {'radius': 8, 'height': 8}\n",
    "\n",
    "prob.model.add_design_var('radius', lower=0.5, upper=5.)\n",
    "prob.model.add_design_var('height', lower=0.5, upper=5.)\n",
    "prob.model.add_objective('Area')\n",
    "prob.model.add_constraint('Volume', lower=10.)\n",
    "\n",
    "prob.setup()\n",
    "\n",
    "prob.set_val('radius', 2.)\n",
    "prob.set_val('height', 3.)\n",
    "\n",
    "prob.run_driver()\n",
    "\n",
    "# These go to 0.5 for unconstrained problem. With constraint and penalty, they\n",
    "# will be above 1.0 (actual values will vary.)\n",
    "print(prob.get_val('radius'))\n",
    "print(prob.get_val('height'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "4045fa91",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:48:47.363500Z",
     "iopub.status.busy": "2026-10-02T14:48:47.363329Z",
     "iopub.status.idle": "2026-10-02T14:48:47.365895Z",
     "shell.execute_reply": "2026-10-02T14:48:47.365247Z"
    },
    "papermill": {
     "duration": 0.005708,
     "end_time": "2026-10-02T14:48:47.366326+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:47.360618+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "assert(prob.get_val('radius') > 1.0)\n",
    "assert(prob.get_val('height') > 1.0)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "2f7049bf",
   "metadata": {
    "papermill": {
     "duration": 0.001906,
     "end_time": "2026-10-02T14:48:47.370259+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:47.368353+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## Running a GA in Parallel\n",
    "\n",
    "If you have a model that doesn’t contain any distributed components or parallel groups, then the model evaluations for a new generation can be performed in parallel by turning on the “run_parallel” option:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "ab517568",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:48:47.402660Z",
     "iopub.status.busy": "2026-10-02T14:48:47.402511Z",
     "iopub.status.idle": "2026-10-02T14:48:47.515420Z",
     "shell.execute_reply": "2026-10-02T14:48:47.514730Z"
    },
    "papermill": {
     "duration": 0.143653,
     "end_time": "2026-10-02T14:48:47.515867+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:47.372214+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Optimal Solution:\n",
      "prob.get_val('comp.f')=array([0.50279674])\n",
      "prob.get_val('xI')=array([3.])\n",
      "prob.get_val('xC')=array([2.29411765])\n"
     ]
    }
   ],
   "source": [
    "\n",
    "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(),\n",
    "                    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.SimpleGADriver()\n",
    "prob.driver.options['bits'] = {'xC': 8}\n",
    "prob.driver.options['max_gen'] = 10\n",
    "prob.driver.options['run_parallel'] = True\n",
    "\n",
    "prob.setup()\n",
    "\n",
    "prob.set_val('xC', 7.5)\n",
    "prob.set_val('xI', 0.0)\n",
    "\n",
    "prob.run_driver()\n",
    "\n",
    "if prob.comm.rank == 0:\n",
    "    print(\"\\nOptimal Solution:\")\n",
    "    print(f\"{prob.get_val('comp.f')=}\")\n",
    "    print(f\"{prob.get_val('xI')=}\")\n",
    "    print(f\"{prob.get_val('xC')=}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "0452c733",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:48:47.520980Z",
     "iopub.status.busy": "2026-10-02T14:48:47.520838Z",
     "iopub.status.idle": "2026-10-02T14:48:47.523087Z",
     "shell.execute_reply": "2026-10-02T14:48:47.522657Z"
    },
    "papermill": {
     "duration": 0.005577,
     "end_time": "2026-10-02T14:48:47.523803+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:47.518226+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input",
     "remove-output"
    ]
   },
   "outputs": [],
   "source": [
    "# The Branin function has a global minimum of ~0.398; verify the GA found a reasonable solution.\n",
    "assert prob.get_val('comp.f') < 2.0, f\"GA result {prob.get_val('comp.f')} not near Branin optimum\""
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "dc882510",
   "metadata": {
    "papermill": {
     "duration": 0.002046,
     "end_time": "2026-10-02T14:48:47.527959+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:47.525913+00:00",
     "status": "completed"
    },
    "tags": []
   },
   "source": [
    "## Running a GA on a Parallel Model in Parallel\n",
    "\n",
    "If you have a model that does contain distributed components or parallel groups, you can also use SimpleGADriver to optimize it. If you have enough processors, you can also simultaneously evaluate multiple points in your population by turning on the “run_parallel” option and setting the “procs_per_model” to the number of processors that your model requires. Take care that you submit your parallel run with enough processors such that the number of processors the model requires divides evenly into it, as in this example, where the model requires 2 and we give it 4."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "99a0e7bd",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:48:47.533173Z",
     "iopub.status.busy": "2026-10-02T14:48:47.533030Z",
     "iopub.status.idle": "2026-10-02T14:48:47.536282Z",
     "shell.execute_reply": "2026-10-02T14:48:47.535833Z"
    },
    "papermill": {
     "duration": 0.007015,
     "end_time": "2026-10-02T14:48:47.536890+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:47.529875+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-cell"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Overwriting mpi_script_0.py\n"
     ]
    }
   ],
   "source": [
    "%%writefile mpi_script_0.py\n",
    "# Need to set seeds.\n",
    "import numpy as np\n",
    "np.random.seed(1)\n",
    "\n",
    "import os\n",
    "os.environ['SimpleGADriver_seed'] = '11'\n",
    "\n",
    "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",
    "par = model.add_subsystem('par', om.ParallelGroup(),\n",
    "                          promotes_inputs=['*'])\n",
    "\n",
    "par.add_subsystem('comp1', Branin(),\n",
    "                  promotes_inputs=[('x0', 'xI'), ('x1', 'xC')])\n",
    "par.add_subsystem('comp2', Branin(),\n",
    "                  promotes_inputs=[('x0', 'xI'), ('x1', 'xC')])\n",
    "\n",
    "model.add_subsystem('comp', om.ExecComp('f = f1 + f2'))\n",
    "model.connect('par.comp1.f', 'comp.f1')\n",
    "model.connect('par.comp2.f', 'comp.f2')\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.SimpleGADriver()\n",
    "prob.driver.options['bits'] = {'xC': 8}\n",
    "prob.driver.options['max_gen'] = 10\n",
    "prob.driver.options['pop_size'] = 25\n",
    "prob.driver.options['run_parallel'] = True\n",
    "prob.driver.options['procs_per_model'] = 2\n",
    "\n",
    "prob.driver._randomstate = 1\n",
    "\n",
    "prob.setup()\n",
    "\n",
    "prob.set_val('xC', 7.5)\n",
    "prob.set_val('xI', 0.0)\n",
    "\n",
    "prob.run_driver()\n",
    "\n",
    "if prob.comm.rank == 0:\n",
    "    print(\"\\nOptimal Solution:\")\n",
    "    print(f\"{prob.get_val('comp.f')=}\")\n",
    "    print(f\"{prob.get_val('xI')=}\")\n",
    "    print(f\"{prob.get_val('xC')=}\")\n",
    "\n",
    "assert prob.get_val('comp.f') < 2.0\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "116a6ce7",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-02T14:48:47.541516Z",
     "iopub.status.busy": "2026-10-02T14:48:47.541394Z",
     "iopub.status.idle": "2026-10-02T14:48:51.543898Z",
     "shell.execute_reply": "2026-10-02T14:48:51.543194Z"
    },
    "papermill": {
     "duration": 4.005488,
     "end_time": "2026-10-02T14:48:51.544352+00:00",
     "exception": false,
     "start_time": "2026-10-02T14:48:47.538864+00:00",
     "status": "completed"
    },
    "tags": [
     "remove-input"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div class=\"admonition note\"><p class=\"admonition-title\">Note</p><p>This feature requires MPI, and may not be able to be run on Colab or Binder.</p></div>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<p>The following script is executed using <code>mpiexec -n 4 mpi_script_0.py</code>:</p><style>pre { line-height: 125%; }\n",
       "td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\n",
       "span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }\n",
       "td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n",
       "span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }\n",
       ".highlight .hll { background-color: #ffffcc }\n",
       ".highlight { background: #f8f8f8; }\n",
       ".highlight .c { color: #3D7B7B; font-style: italic } /* Comment */\n",
       ".highlight .err { border: 1px solid #F00 } /* Error */\n",
       ".highlight .k { color: #008000; font-weight: bold } /* Keyword */\n",
       ".highlight .o { color: #666 } /* Operator */\n",
       ".highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */\n",
       ".highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */\n",
       ".highlight .cp { color: #9C6500 } /* Comment.Preproc */\n",
       ".highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */\n",
       ".highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */\n",
       ".highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */\n",
       ".highlight .gd { color: #A00000 } /* Generic.Deleted */\n",
       ".highlight .ge { font-style: italic } /* Generic.Emph */\n",
       ".highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */\n",
       ".highlight .gr { color: #E40000 } /* Generic.Error */\n",
       ".highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n",
       ".highlight .gi { color: #008400 } /* Generic.Inserted */\n",
       ".highlight .go { color: #717171 } /* Generic.Output */\n",
       ".highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n",
       ".highlight .gs { font-weight: bold } /* Generic.Strong */\n",
       ".highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n",
       ".highlight .gt { color: #04D } /* Generic.Traceback */\n",
       ".highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n",
       ".highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n",
       ".highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n",
       ".highlight .kp { color: #008000 } /* Keyword.Pseudo */\n",
       ".highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n",
       ".highlight .kt { color: #B00040 } /* Keyword.Type */\n",
       ".highlight .m { color: #666 } /* Literal.Number */\n",
       ".highlight .s { color: #BA2121 } /* Literal.String */\n",
       ".highlight .na { color: #687822 } /* Name.Attribute */\n",
       ".highlight .nb { color: #008000 } /* Name.Builtin */\n",
       ".highlight .nc { color: #00F; font-weight: bold } /* Name.Class */\n",
       ".highlight .no { color: #800 } /* Name.Constant */\n",
       ".highlight .nd { color: #A2F } /* Name.Decorator */\n",
       ".highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */\n",
       ".highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */\n",
       ".highlight .nf { color: #00F } /* Name.Function */\n",
       ".highlight .nl { color: #767600 } /* Name.Label */\n",
       ".highlight .nn { color: #00F; font-weight: bold } /* Name.Namespace */\n",
       ".highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */\n",
       ".highlight .nv { color: #19177C } /* Name.Variable */\n",
       ".highlight .ow { color: #A2F; font-weight: bold } /* Operator.Word */\n",
       ".highlight .w { color: #BBB } /* Text.Whitespace */\n",
       ".highlight .mb { color: #666 } /* Literal.Number.Bin */\n",
       ".highlight .mf { color: #666 } /* Literal.Number.Float */\n",
       ".highlight .mh { color: #666 } /* Literal.Number.Hex */\n",
       ".highlight .mi { color: #666 } /* Literal.Number.Integer */\n",
       ".highlight .mo { color: #666 } /* Literal.Number.Oct */\n",
       ".highlight .sa { color: #BA2121 } /* Literal.String.Affix */\n",
       ".highlight .sb { color: #BA2121 } /* Literal.String.Backtick */\n",
       ".highlight .sc { color: #BA2121 } /* Literal.String.Char */\n",
       ".highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */\n",
       ".highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n",
       ".highlight .s2 { color: #BA2121 } /* Literal.String.Double */\n",
       ".highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */\n",
       ".highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */\n",
       ".highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */\n",
       ".highlight .sx { color: #008000 } /* Literal.String.Other */\n",
       ".highlight .sr { color: #A45A77 } /* Literal.String.Regex */\n",
       ".highlight .s1 { color: #BA2121 } /* Literal.String.Single */\n",
       ".highlight .ss { color: #19177C } /* Literal.String.Symbol */\n",
       ".highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */\n",
       ".highlight .fm { color: #00F } /* Name.Function.Magic */\n",
       ".highlight .vc { color: #19177C } /* Name.Variable.Class */\n",
       ".highlight .vg { color: #19177C } /* Name.Variable.Global */\n",
       ".highlight .vi { color: #19177C } /* Name.Variable.Instance */\n",
       ".highlight .vm { color: #19177C } /* Name.Variable.Magic */\n",
       ".highlight .il { color: #666 } /* Literal.Number.Integer.Long */</style><div class=\"highlight\"><pre><span></span><span class=\"c1\"># Need to set seeds.</span>\n",
       "<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">numpy</span><span class=\"w\"> </span><span class=\"k\">as</span><span class=\"w\"> </span><span class=\"nn\">np</span>\n",
       "<span class=\"n\">np</span><span class=\"o\">.</span><span class=\"n\">random</span><span class=\"o\">.</span><span class=\"n\">seed</span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n",
       "\n",
       "<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">os</span>\n",
       "<span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">environ</span><span class=\"p\">[</span><span class=\"s1\">&#39;SimpleGADriver_seed&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;11&#39;</span>\n",
       "\n",
       "<span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">openmdao.api</span><span class=\"w\"> </span><span class=\"k\">as</span><span class=\"w\"> </span><span class=\"nn\">om</span>\n",
       "<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">openmdao.test_suite.components.branin</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Branin</span>\n",
       "\n",
       "<span class=\"n\">prob</span> <span class=\"o\">=</span> <span class=\"n\">om</span><span class=\"o\">.</span><span class=\"n\">Problem</span><span class=\"p\">()</span>\n",
       "<span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">prob</span><span class=\"o\">.</span><span class=\"n\">model</span>\n",
       "\n",
       "<span class=\"n\">par</span> <span class=\"o\">=</span> <span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">add_subsystem</span><span class=\"p\">(</span><span class=\"s1\">&#39;par&#39;</span><span class=\"p\">,</span> <span class=\"n\">om</span><span class=\"o\">.</span><span class=\"n\">ParallelGroup</span><span class=\"p\">(),</span>\n",
       "                          <span class=\"n\">promotes_inputs</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;*&#39;</span><span class=\"p\">])</span>\n",
       "\n",
       "<span class=\"n\">par</span><span class=\"o\">.</span><span class=\"n\">add_subsystem</span><span class=\"p\">(</span><span class=\"s1\">&#39;comp1&#39;</span><span class=\"p\">,</span> <span class=\"n\">Branin</span><span class=\"p\">(),</span>\n",
       "                  <span class=\"n\">promotes_inputs</span><span class=\"o\">=</span><span class=\"p\">[(</span><span class=\"s1\">&#39;x0&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;xI&#39;</span><span class=\"p\">),</span> <span class=\"p\">(</span><span class=\"s1\">&#39;x1&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;xC&#39;</span><span class=\"p\">)])</span>\n",
       "<span class=\"n\">par</span><span class=\"o\">.</span><span class=\"n\">add_subsystem</span><span class=\"p\">(</span><span class=\"s1\">&#39;comp2&#39;</span><span class=\"p\">,</span> <span class=\"n\">Branin</span><span class=\"p\">(),</span>\n",
       "                  <span class=\"n\">promotes_inputs</span><span class=\"o\">=</span><span class=\"p\">[(</span><span class=\"s1\">&#39;x0&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;xI&#39;</span><span class=\"p\">),</span> <span class=\"p\">(</span><span class=\"s1\">&#39;x1&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;xC&#39;</span><span class=\"p\">)])</span>\n",
       "\n",
       "<span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">add_subsystem</span><span class=\"p\">(</span><span class=\"s1\">&#39;comp&#39;</span><span class=\"p\">,</span> <span class=\"n\">om</span><span class=\"o\">.</span><span class=\"n\">ExecComp</span><span class=\"p\">(</span><span class=\"s1\">&#39;f = f1 + f2&#39;</span><span class=\"p\">))</span>\n",
       "<span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">connect</span><span class=\"p\">(</span><span class=\"s1\">&#39;par.comp1.f&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;comp.f1&#39;</span><span class=\"p\">)</span>\n",
       "<span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">connect</span><span class=\"p\">(</span><span class=\"s1\">&#39;par.comp2.f&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;comp.f2&#39;</span><span class=\"p\">)</span>\n",
       "\n",
       "<span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">add_design_var</span><span class=\"p\">(</span><span class=\"s1\">&#39;xI&#39;</span><span class=\"p\">,</span> <span class=\"n\">lower</span><span class=\"o\">=-</span><span class=\"mf\">5.0</span><span class=\"p\">,</span> <span class=\"n\">upper</span><span class=\"o\">=</span><span class=\"mf\">10.0</span><span class=\"p\">)</span>\n",
       "<span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">add_design_var</span><span class=\"p\">(</span><span class=\"s1\">&#39;xC&#39;</span><span class=\"p\">,</span> <span class=\"n\">lower</span><span class=\"o\">=</span><span class=\"mf\">0.0</span><span class=\"p\">,</span> <span class=\"n\">upper</span><span class=\"o\">=</span><span class=\"mf\">15.0</span><span class=\"p\">)</span>\n",
       "<span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">add_objective</span><span class=\"p\">(</span><span class=\"s1\">&#39;comp.f&#39;</span><span class=\"p\">)</span>\n",
       "\n",
       "<span class=\"n\">prob</span><span class=\"o\">.</span><span class=\"n\">driver</span> <span class=\"o\">=</span> <span class=\"n\">om</span><span class=\"o\">.</span><span class=\"n\">SimpleGADriver</span><span class=\"p\">()</span>\n",
       "<span class=\"n\">prob</span><span class=\"o\">.</span><span class=\"n\">driver</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;bits&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"p\">{</span><span class=\"s1\">&#39;xC&#39;</span><span class=\"p\">:</span> <span class=\"mi\">8</span><span class=\"p\">}</span>\n",
       "<span class=\"n\">prob</span><span class=\"o\">.</span><span class=\"n\">driver</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;max_gen&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mi\">10</span>\n",
       "<span class=\"n\">prob</span><span class=\"o\">.</span><span class=\"n\">driver</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;pop_size&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mi\">25</span>\n",
       "<span class=\"n\">prob</span><span class=\"o\">.</span><span class=\"n\">driver</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;run_parallel&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"kc\">True</span>\n",
       "<span class=\"n\">prob</span><span class=\"o\">.</span><span class=\"n\">driver</span><span class=\"o\">.</span><span class=\"n\">options</span><span class=\"p\">[</span><span class=\"s1\">&#39;procs_per_model&#39;</span><span class=\"p\">]</span> <span class=\"o\">=</span> <span class=\"mi\">2</span>\n",
       "\n",
       "<span class=\"n\">prob</span><span class=\"o\">.</span><span class=\"n\">driver</span><span class=\"o\">.</span><span class=\"n\">_randomstate</span> <span class=\"o\">=</span> <span class=\"mi\">1</span>\n",
       "\n",
       "<span class=\"n\">prob</span><span class=\"o\">.</span><span class=\"n\">setup</span><span class=\"p\">()</span>\n",
       "\n",
       "<span class=\"n\">prob</span><span class=\"o\">.</span><span class=\"n\">set_val</span><span class=\"p\">(</span><span class=\"s1\">&#39;xC&#39;</span><span class=\"p\">,</span> <span class=\"mf\">7.5</span><span class=\"p\">)</span>\n",
       "<span class=\"n\">prob</span><span class=\"o\">.</span><span class=\"n\">set_val</span><span class=\"p\">(</span><span class=\"s1\">&#39;xI&#39;</span><span class=\"p\">,</span> <span class=\"mf\">0.0</span><span class=\"p\">)</span>\n",
       "\n",
       "<span class=\"n\">prob</span><span class=\"o\">.</span><span class=\"n\">run_driver</span><span class=\"p\">()</span>\n",
       "\n",
       "<span class=\"k\">if</span> <span class=\"n\">prob</span><span class=\"o\">.</span><span class=\"n\">comm</span><span class=\"o\">.</span><span class=\"n\">rank</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"p\">:</span>\n",
       "    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"s2\">&quot;</span><span class=\"se\">\\n</span><span class=\"s2\">Optimal Solution:&quot;</span><span class=\"p\">)</span>\n",
       "    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"sa\">f</span><span class=\"s2\">&quot;</span><span class=\"si\">{</span><span class=\"n\">prob</span><span class=\"o\">.</span><span class=\"n\">get_val</span><span class=\"p\">(</span><span class=\"s1\">&#39;comp.f&#39;</span><span class=\"p\">)</span><span class=\"si\">=}</span><span class=\"s2\">&quot;</span><span class=\"p\">)</span>\n",
       "    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"sa\">f</span><span class=\"s2\">&quot;</span><span class=\"si\">{</span><span class=\"n\">prob</span><span class=\"o\">.</span><span class=\"n\">get_val</span><span class=\"p\">(</span><span class=\"s1\">&#39;xI&#39;</span><span class=\"p\">)</span><span class=\"si\">=}</span><span class=\"s2\">&quot;</span><span class=\"p\">)</span>\n",
       "    <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"sa\">f</span><span class=\"s2\">&quot;</span><span class=\"si\">{</span><span class=\"n\">prob</span><span class=\"o\">.</span><span class=\"n\">get_val</span><span class=\"p\">(</span><span class=\"s1\">&#39;xC&#39;</span><span class=\"p\">)</span><span class=\"si\">=}</span><span class=\"s2\">&quot;</span><span class=\"p\">)</span>\n",
       "\n",
       "<span class=\"k\">assert</span> <span class=\"n\">prob</span><span class=\"o\">.</span><span class=\"n\">get_val</span><span class=\"p\">(</span><span class=\"s1\">&#39;comp.f&#39;</span><span class=\"p\">)</span> <span class=\"o\">&lt;</span> <span class=\"mf\">2.0</span>\n",
       "</pre></div>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1790952529.216097] [runnervm8df0l:11463:0]        ib_iface.c:1269 UCX  ERROR mana_0: iface 0x55f72dce1130 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",
      "[1790952529.216401] [runnervm8df0l:11463:0]      ucp_worker.c:1412 UCX  ERROR uct_iface_open(ud_verbs/mana_0:1) failed: Input/output error\n",
      "[1790952529.254839] [runnervm8df0l:11465:0]        ib_iface.c:1269 UCX  ERROR mana_0: iface 0x55d445f97e20 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",
      "[1790952529.255601] [runnervm8df0l:11465:0]      ucp_worker.c:1412 UCX  ERROR uct_iface_open(ud_verbs/mana_0:1) failed: Input/output error\n",
      "[1790952529.255671] [runnervm8df0l:11462:0]        ib_iface.c:1269 UCX  ERROR mana_0: iface 0x56124f0ca250 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",
      "[1790952529.255752] [runnervm8df0l:11464:0]        ib_iface.c:1269 UCX  ERROR mana_0: iface 0x55ccf1a7a0f0 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",
      "[1790952529.256136] [runnervm8df0l:11462:0]      ucp_worker.c:1412 UCX  ERROR uct_iface_open(ud_verbs/mana_0:1) failed: Input/output error\n",
      "[1790952529.256196] [runnervm8df0l:11464:0]      ucp_worker.c:1412 UCX  ERROR uct_iface_open(ud_verbs/mana_0:1) failed: Input/output error\n",
      "\n",
      "Optimal Solution:\n",
      "prob.get_val('comp.f')=array([1.9736105])\n",
      "prob.get_val('xI')=array([-3.])\n",
      "prob.get_val('xC')=array([11.23529412])\n",
      "\n"
     ]
    }
   ],
   "source": [
    "from openmdao.utils.notebook_utils import mpi_exec\n",
    "mpi_exec(4, 'mpi_script_0.py')"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Tags",
  "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.13.14"
  },
  "mpi": true,
  "orphan": true,
  "papermill": {
   "default_parameters": {},
   "duration": 11.315654,
   "end_time": "2026-10-02T14:48:52.262872+00:00",
   "environment_variables": {},
   "exception": null,
   "input_path": "/home/runner/work/OpenMDAO/OpenMDAO/openmdao/docs/openmdao_book/features/building_blocks/drivers/genetic_algorithm.ipynb",
   "output_path": "/home/runner/work/OpenMDAO/OpenMDAO/openmdao/docs/_executed_book/features/building_blocks/drivers/genetic_algorithm.ipynb",
   "parameters": {},
   "start_time": "2026-10-02T14:48:40.947218+00:00",
   "version": "2.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}