{ "cells": [ { "cell_type": "markdown", "id": "f17a116a", "metadata": {}, "source": [ "# Design Space Exploration\n", "\n", "In this demonstration we show how we can leverage the `OptProblem` class from the `standard_evaluator` library to perform optimization studies that can be version controlled. \n", "\n", "![Design Space Exploration (running multiple optimizations) process](design_space_exploration.drawio.png)\n", "\n", "The idea is that we will want to run multiple optimization problems that are driven by JSOn files that we can version control. In a future step we will also manage the assembly information itself in a JSON file that can be version controlled, but for this demonstration we went down an easier path.\n", "\n", "We first load all required libraries and methods." ] }, { "cell_type": "code", "execution_count": 1, "id": "acef51ce-e90f-43a3-9716-ecb16167b371", "metadata": { "metadata": {} }, "outputs": [], "source": [ "import typing\n", "import openmdao.api as om\n", "import openmdao.core.system as oms\n", "import pandas as pd\n", "\n", "from standard_evaluator import get_interface, show_structure, create_problem, get_state, set_state, load_state, save_state\n", "from standard_evaluator import load_assembly, save_assembly, convert_om_var, get_opt_problem, set_opt_problem\n", "from standard_evaluator import Variable, FloatVariable, IntVariable, ArrayVariable, OptProblem" ] }, { "cell_type": "markdown", "id": "763bdf4f-e824-456c-898f-1513dcff5e7c", "metadata": {}, "source": [ "## Creating the OpenMDAO assembly\n", "\n", "In this example we use the Sellar Problem from the [OpenMDAO documentation](https://openmdao.org/newdocs/versions/latest/basic_user_guide/multidisciplinary_optimization/sellar_opt.html). \n", "\n", "We first setup the assembly, set the optimization variables, constraints, and the objective. We can then run the optimization." ] }, { "cell_type": "code", "execution_count": 2, "id": "d9bdb3c0", "metadata": { "metadata": {} }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 3.183393951729169\n", " Iterations: 6\n", " Function evaluations: 6\n", " Gradient evaluations: 6\n", "Optimization Complete\n", "-----------------------------------\n", "minimum found at\n", "0.0\n", "[1.97763888e+00 8.83056605e-15]\n", "minumum objective\n", "3.183393951729169\n" ] } ], "source": [ "import numpy as np\n", "import openmdao.api as om\n", "\n", "from openmdao.test_suite.components.sellar import SellarDis1, SellarDis2\n", "\n", "\n", "class SellarMDA(om.Group):\n", " \"\"\"\n", " Group containing the Sellar MDA.\n", " \"\"\"\n", "\n", " def setup(self):\n", " cycle = self.add_subsystem('cycle', om.Group(), promotes=['*'])\n", " cycle.add_subsystem('d1', SellarDis1(), promotes_inputs=['x', 'z', 'y2'],\n", " promotes_outputs=['y1'])\n", " cycle.add_subsystem('d2', SellarDis2(), promotes_inputs=['z', 'y1'],\n", " promotes_outputs=['y2'])\n", "\n", " cycle.set_input_defaults('x', 1.0)\n", " cycle.set_input_defaults('z', np.array([5.0, 2.0]))\n", "\n", " # Nonlinear Block Gauss Seidel is a gradient free solver\n", " cycle.nonlinear_solver = om.NonlinearBlockGS()\n", "\n", " self.add_subsystem('obj_cmp', om.ExecComp('obj = x**2 + z[1] + y1 + exp(-y2)',\n", " z=np.array([0.0, 0.0]), x=0.0),\n", " promotes=['x', 'z', 'y1', 'y2', 'obj'])\n", "\n", " self.add_subsystem('con_cmp1', om.ExecComp('con1 = 3.16 - y1'), promotes=['con1', 'y1'])\n", " self.add_subsystem('con_cmp2', om.ExecComp('con2 = y2 - 24.0'), promotes=['con2', 'y2'])\n", "\n", "class SellarMDA(om.Group):\n", " \"\"\"\n", " Group containing the Sellar MDA.\n", " \"\"\"\n", "\n", " def setup(self):\n", " cycle = self.add_subsystem('cycle', om.Group(), promotes=['*'])\n", " cycle.add_subsystem('d1', SellarDis1(), promotes_inputs=['x', 'z', 'y2'],\n", " promotes_outputs=['y1'])\n", " cycle.add_subsystem('d2', SellarDis2(), promotes_inputs=['z', 'y1'],\n", " promotes_outputs=['y2'])\n", "\n", " cycle.set_input_defaults('x', 1.0)\n", " cycle.set_input_defaults('z', np.array([5.0, 2.0]))\n", "\n", " # Nonlinear Block Gauss Seidel is a gradient free solver\n", " cycle.nonlinear_solver = om.NonlinearBlockGS()\n", "\n", " self.add_subsystem('obj_cmp', om.ExecComp('obj = x**2 + z[1] + y1 + exp(-y2)',\n", " z=np.array([0.0, 0.0]), x=0.0),\n", " promotes=['x', 'z', 'y1', 'y2', 'obj'])\n", "\n", " self.add_subsystem('con_cmp1', om.ExecComp('con1 = 3.16 - y1'), promotes=['con1', 'y1'])\n", " self.add_subsystem('con_cmp2', om.ExecComp('con2 = y2 - 24.0'), promotes=['con2', 'y2'])\n", "\n", "import openmdao.api as om\n", "from openmdao.test_suite.components.sellar_feature import SellarMDA\n", "\n", "prob = om.Problem()\n", "prob.model = SellarMDA()\n", "\n", "prob.driver = om.ScipyOptimizeDriver()\n", "prob.driver.options['optimizer'] = 'SLSQP'\n", "# prob.driver.options['maxiter'] = 100\n", "prob.driver.options['tol'] = 1e-8\n", "\n", "prob.model.add_design_var('x', lower=0, upper=10)\n", "prob.model.add_design_var('z', lower=0, upper=10)\n", "prob.model.add_objective('obj')\n", "prob.model.add_constraint('con1', upper=0)\n", "prob.model.add_constraint('con2', upper=0)\n", "\n", "# Ask OpenMDAO to finite-difference across the model to compute the gradients for the optimizer\n", "prob.model.approx_totals()\n", "\n", "prob.setup()\n", "prob.set_solver_print(level=0)\n", "\n", "prob.run_driver()\n", "\n", "print('minimum found at')\n", "print(prob.get_val('x')[0])\n", "print(prob.get_val('z'))\n", "\n", "print('minumum objective')\n", "print(prob.get_val('obj')[0])" ] }, { "cell_type": "markdown", "id": "44266398", "metadata": {}, "source": [ "In the next step we get the description of the optimization problem and store that in an instance of the neutral `OptProblem`. We also capture the structure of the assembly in the neutral format.\n", "\n", "We show the content of the `original_opt` variable," ] }, { "cell_type": "code", "execution_count": 3, "id": "c4baddaf", "metadata": { "metadata": {} }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Warning: More work is needed to support array variables\n" ] }, { "data": { "text/plain": [ "OptProblem(name='opt_problem', class_type='OptProblem', variables=[FloatVariable(name='x', default=None, bounds=(0.0, 10.0), shift=0.0, scale=1.0, units=None, description='', options={'parallel_deriv_color': None}, class_type='float'), ArrayVariable(name='z', default=None, bounds=(array([0., 0.]), array([10., 10.])), shift=array([0., 0.]), scale=array([1., 1.]), units=None, description='', options={'parallel_deriv_color': None}, class_type='floatarray', shape=(2,))], responses=[FloatVariable(name='con1', default=None, bounds=(-1e+30, 0.0), shift=0.0, scale=1.0, units=None, description='', options={'parallel_deriv_color': None}, class_type='float'), FloatVariable(name='con2', default=None, bounds=(-1e+30, 0.0), shift=0.0, scale=1.0, units=None, description='', options={'parallel_deriv_color': None}, class_type='float'), FloatVariable(name='obj', default=None, bounds=(-inf, inf), shift=0.0, scale=1.0, units=None, description='', options={'parallel_deriv_color': None}, class_type='float')], objectives=['obj'], constraints=['con1', 'con2'], description=None, cite=None, options={})" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "original_opt = get_opt_problem(prob)\n", "info = get_interface(prob.model)\n", "original_opt" ] }, { "cell_type": "markdown", "id": "6376615a", "metadata": {}, "source": [ "## Setting up a series of optimization studies\n", "\n", "In the next step we take the original optimization problem and create a series of optimization problems where we change the upper bound of the first nonlinear constraint. This is a typical scenario in industry, we are trying to explore the design space and often the constraints are not fully defined.\n", "\n", "We store all of the optimization problems in JSON files. This will allow us to fully describe the studies we are doing, and they can be version controlled. \n", "\n", "In this example we are actually varying the bounds for both constraints, and not just one." ] }, { "cell_type": "code", "execution_count": 4, "id": "bde3dddc", "metadata": { "metadata": {} }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ -2. -22.5 ]\n", " [ -1. -22.5 ]\n", " [ 0. -22.5 ]\n", " [ 1. -22.5 ]\n", " [ 2. -22.5 ]\n", " [ -2. -21.125]\n", " [ -1. -21.125]\n", " [ 0. -21.125]\n", " [ 1. -21.125]\n", " [ 2. -21.125]\n", " [ -2. -19.75 ]\n", " [ -1. -19.75 ]\n", " [ 0. -19.75 ]\n", " [ 1. -19.75 ]\n", " [ 2. -19.75 ]\n", " [ -2. -18.375]\n", " [ -1. -18.375]\n", " [ 0. -18.375]\n", " [ 1. -18.375]\n", " [ 2. -18.375]\n", " [ -2. -17. ]\n", " [ -1. -17. ]\n", " [ 0. -17. ]\n", " [ 1. -17. ]\n", " [ 2. -17. ]]\n" ] } ], "source": [ "import numpy as np\n", "\n", "# Define the lower and upper bounds\n", "x_lower, x_upper = -2, 2\n", "y_lower, y_upper = -22.5, -17\n", "\n", "# Define the number of points along each axis\n", "num_points_x = 5\n", "num_points_y = 5\n", "\n", "# Create evenly spaced values for x and y\n", "x_values = np.linspace(x_lower, x_upper, num_points_x)\n", "y_values = np.linspace(y_lower, y_upper, num_points_y)\n", "\n", "# Create a meshgrid from the x and y values\n", "X, Y = np.meshgrid(x_values, y_values)\n", "\n", "# Combine the X and Y coordinates into a single array of points\n", "grid_points = np.column_stack((X.ravel(), Y.ravel()))\n", "\n", "# Add the point [0, 0] if it's not already included\n", "#if not np.array_equal([0, 0], [x_lower, y_lower]):\n", "# grid_points = np.vstack((grid_points, [0, 0]))\n", "print(grid_points)" ] }, { "cell_type": "code", "execution_count": 5, "id": "38f38d48", "metadata": { "metadata": {} }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-2.0 -22.5\n", "-1.0 -22.5\n", "0.0 -22.5\n", "1.0 -22.5\n", "2.0 -22.5\n", "-2.0 -21.125\n", "-1.0 -21.125\n", "0.0 -21.125\n", "1.0 -21.125\n", "2.0 -21.125\n", "-2.0 -19.75\n", "-1.0 -19.75\n", "0.0 -19.75\n", "1.0 -19.75\n", "2.0 -19.75\n", "-2.0 -18.375\n", "-1.0 -18.375\n", "0.0 -18.375\n", "1.0 -18.375\n", "2.0 -18.375\n", "-2.0 -17.0\n", "-1.0 -17.0\n", "0.0 -17.0\n", "1.0 -17.0\n", "2.0 -17.0\n" ] } ], "source": [ "import json\n", "\n", "indx = 0\n", "for upper1, upper2 in grid_points:\n", " print(upper1, upper2)\n", " new_opt = original_opt.model_copy()\n", " new_opt.responses[0].bounds = (-np.inf, upper1)\n", " new_opt.responses[1].bounds = (-np.inf, upper2)\n", " optproblem_name = f'optproblem{indx:02}.json'\n", " indx += 1\n", " # Convert and write JSON object to file\n", " with open(optproblem_name, \"w\") as outfile:\n", " json.dump(new_opt.model_dump(exclude_unset=True), outfile, indent=2, skipkeys=True)\n" ] }, { "cell_type": "markdown", "id": "16cd0670", "metadata": {}, "source": [ "## Running a series of optimization problems\n", "\n", "In the next step we actually run the different optimization problems. To do this we first create a pattern for all the optimization files, and get the names of all of them.\n", "\n", "Then we run a loop through all the file names, first loading the optimization problem formulation into a dictionary, convert it into `OptProblem`'s, create a new instance of the Sellar problem, set the optimization problem, the optimzition parameters, and run the optimization. We store the results from the optimization in a Pandas DataFrame together with the name of the file that defined the specific optimization problem.\n", "\n", "After running all the optimizations we combine the results into a single DataFrame, and show the summary." ] }, { "cell_type": "code", "execution_count": 6, "id": "8a7cf9a4", "metadata": { "metadata": {} }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Positive directional derivative for linesearch (Exit mode 8)\n", " Current function value: 36.7744422015937\n", " Iterations: 16\n", " Function evaluations: 62\n", " Gradient evaluations: 12\n", "Optimization FAILED.\n", "Positive directional derivative for linesearch\n", "-----------------------------------\n", "Optimization failed.\n", "Positive directional derivative for linesearch (Exit mode 8)\n", " Current function value: 25.106465928943965\n", " Iterations: 11\n", " Function evaluations: 17\n", " Gradient evaluations: 7\n", "Optimization FAILED.\n", "Positive directional derivative for linesearch\n", "-----------------------------------\n", "Optimization failed.\n", "NL: NLBGSSolver 'NL: NLBGS' on system 'cycle' failed to converge in 10 iterations.\n", "Inequality constraints incompatible (Exit mode 4)\n", " Current function value: 15.314007967433286\n", " Iterations: 13\n", " Function evaluations: 58\n", " Gradient evaluations: 12\n", "Optimization FAILED.\n", "Inequality constraints incompatible\n", "-----------------------------------\n", "Optimization failed.\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 8.316848498193089\n", " Iterations: 9\n", " Function evaluations: 8\n", " Gradient evaluations: 8\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "NL: NLBGSSolver 'NL: NLBGS' on system 'cycle' failed to converge in 10 iterations.\n", "NL: NLBGSSolver 'NL: NLBGS' on system 'cycle' failed to converge in 10 iterations.\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 2.8815345618132655\n", " Iterations: 6\n", " Function evaluations: 7\n", " Gradient evaluations: 6\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 32.15279509345695\n", " Iterations: 6\n", " Function evaluations: 6\n", " Gradient evaluations: 6\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 20.258749369476174\n", " Iterations: 6\n", " Function evaluations: 6\n", " Gradient evaluations: 6\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 11.27091613374096\n", " Iterations: 6\n", " Function evaluations: 6\n", " Gradient evaluations: 6\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 5.389808017048902\n", " Iterations: 6\n", " Function evaluations: 7\n", " Gradient evaluations: 6\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "NL: NLBGSSolver 'NL: NLBGS' on system 'cycle' failed to converge in 10 iterations.\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 2.615642164038142\n", " Iterations: 8\n", " Function evaluations: 8\n", " Gradient evaluations: 8\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 9.566593149581722\n", " Iterations: 7\n", " Function evaluations: 7\n", " Gradient evaluations: 7\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 4.189681516258113\n", " Iterations: 7\n", " Function evaluations: 7\n", " Gradient evaluations: 7\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 3.183393952145962\n", " Iterations: 7\n", " Function evaluations: 7\n", " Gradient evaluations: 7\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 2.2033093084417064\n", " Iterations: 8\n", " Function evaluations: 8\n", " Gradient evaluations: 8\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "NL: NLBGSSolver 'NL: NLBGS' on system 'cycle' failed to converge in 10 iterations.\n", "NL: NLBGSSolver 'NL: NLBGS' on system 'cycle' failed to converge in 10 iterations.\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 1.2549821858007038\n", " Iterations: 9\n", " Function evaluations: 9\n", " Gradient evaluations: 9\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 5.168711366061382\n", " Iterations: 6\n", " Function evaluations: 6\n", " Gradient evaluations: 6\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 4.173853524365584\n", " Iterations: 7\n", " Function evaluations: 7\n", " Gradient evaluations: 7\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 3.1833939516764156\n", " Iterations: 6\n", " Function evaluations: 6\n", " Gradient evaluations: 6\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 2.2033093084548656\n", " Iterations: 6\n", " Function evaluations: 7\n", " Gradient evaluations: 6\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "NL: NLBGSSolver 'NL: NLBGS' on system 'cycle' failed to converge in 10 iterations.\n", "NL: NLBGSSolver 'NL: NLBGS' on system 'cycle' failed to converge in 10 iterations.\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 1.2549821858072014\n", " Iterations: 7\n", " Function evaluations: 7\n", " Gradient evaluations: 7\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 5.168711365989337\n", " Iterations: 6\n", " Function evaluations: 6\n", " Gradient evaluations: 6\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 4.173853524378517\n", " Iterations: 6\n", " Function evaluations: 6\n", " Gradient evaluations: 6\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 3.183393951729169\n", " Iterations: 6\n", " Function evaluations: 6\n", " Gradient evaluations: 6\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 2.2033093084479907\n", " Iterations: 6\n", " Function evaluations: 7\n", " Gradient evaluations: 6\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "NL: NLBGSSolver 'NL: NLBGS' on system 'cycle' failed to converge in 10 iterations.\n", "NL: NLBGSSolver 'NL: NLBGS' on system 'cycle' failed to converge in 10 iterations.\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 1.2549821858054697\n", " Iterations: 7\n", " Function evaluations: 7\n", " Gradient evaluations: 7\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n", "Optimization terminated successfully (Exit mode 0)\n", " Current function value: 3.183393951729169\n", " Iterations: 6\n", " Function evaluations: 6\n", " Gradient evaluations: 6\n", "Optimization Complete\n", "-----------------------------------\n", "Optimization was successful!\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
y1y2zxcon1con2objname
02.161.5[0.0, 0.03030615433010159]2.4296941.0-22.58.316848optproblem03.json
01.161.5[1.056894812204979e-13, 0.422967038573036]1.0370332.0-22.52.881535optproblem04.json
05.162.875[0.0, 0.6034366616784598]5.131563-2.0-21.12532.152795optproblem05.json
04.162.875[6.582959922515623e-15, 0.835392194558752]3.899608-1.0-21.12520.258749optproblem06.json
03.162.875[0.0, 1.097361116516697]2.6376390.0-21.12511.270916optproblem07.json
02.162.875[0.0, 1.4053061543301015]1.3296941.0-21.1255.389808optproblem08.json
01.162.109774[0.0, 1.0327406260261245]0.5492142.0-21.8902262.615642optproblem09.json
05.164.25[1.978436661679349, 1.34947960803124e-12]2.095788-2.0-19.759.566593optproblem10.json
04.164.25[2.210392194518491, 4.795678246750001e-13]0.124166-1.0-19.754.189682optproblem11.json
03.163.755278[1.977638883605749, 7.444231462403437e-14]0.0-0.0-20.2447223.183394optproblem12.json
02.163.139388[1.6696938456669281, 3.8634046702380526e-14]0.01.0-20.8606122.203309optproblem13.json
01.162.354066[1.2770329614250442, 1.4182406177508744e-14]0.02.0-21.6459341.254982optproblem14.json
05.164.743127[2.471563338346374, 3.851586669543894e-12]0.0-2.0-19.2568735.168711optproblem15.json
04.164.279216[2.2396078054336765, 1.5650485625672098e-13]0.0-1.0-19.7207844.173854optproblem16.json
03.163.755278[1.9776388834729854, 1.8925849432621544e-15]0.0-0.0-20.2447223.183394optproblem17.json
02.163.139388[1.6696938456715893, 8.66652570560973e-15]0.01.0-20.8606122.203309optproblem18.json
01.162.354066[1.2770329614291231, 1.951237785459953e-15]0.02.0-21.6459341.254982optproblem19.json
05.164.743127[2.4715633383321443, 0.0]0.0-2.0-19.2568735.168711optproblem20.json
04.164.279216[2.239607805437483, 3.363869713064246e-14]0.0-1.0-19.7207844.173854optproblem21.json
03.163.755278[1.977638883487764, 8.830566052859473e-15]0.0-0.0-20.2447223.183394optproblem22.json
02.163.139388[1.6696938456710986, 1.4729587173841369e-15]0.01.0-20.8606122.203309optproblem23.json
01.162.354066[1.2770329614285358, 3.876178038906271e-15]0.02.0-21.6459341.254982optproblem24.json
03.163.755278[1.977638883487764, 8.830566052859473e-15]0.0-0.0-20.2447223.183394optproblem25.json
\n", "
" ], "text/plain": [ " y1 y2 z x \\\n", "0 2.16 1.5 [0.0, 0.03030615433010159] 2.429694 \n", "0 1.16 1.5 [1.056894812204979e-13, 0.422967038573036] 1.037033 \n", "0 5.16 2.875 [0.0, 0.6034366616784598] 5.131563 \n", "0 4.16 2.875 [6.582959922515623e-15, 0.835392194558752] 3.899608 \n", "0 3.16 2.875 [0.0, 1.097361116516697] 2.637639 \n", "0 2.16 2.875 [0.0, 1.4053061543301015] 1.329694 \n", "0 1.16 2.109774 [0.0, 1.0327406260261245] 0.549214 \n", "0 5.16 4.25 [1.978436661679349, 1.34947960803124e-12] 2.095788 \n", "0 4.16 4.25 [2.210392194518491, 4.795678246750001e-13] 0.124166 \n", "0 3.16 3.755278 [1.977638883605749, 7.444231462403437e-14] 0.0 \n", "0 2.16 3.139388 [1.6696938456669281, 3.8634046702380526e-14] 0.0 \n", "0 1.16 2.354066 [1.2770329614250442, 1.4182406177508744e-14] 0.0 \n", "0 5.16 4.743127 [2.471563338346374, 3.851586669543894e-12] 0.0 \n", "0 4.16 4.279216 [2.2396078054336765, 1.5650485625672098e-13] 0.0 \n", "0 3.16 3.755278 [1.9776388834729854, 1.8925849432621544e-15] 0.0 \n", "0 2.16 3.139388 [1.6696938456715893, 8.66652570560973e-15] 0.0 \n", "0 1.16 2.354066 [1.2770329614291231, 1.951237785459953e-15] 0.0 \n", "0 5.16 4.743127 [2.4715633383321443, 0.0] 0.0 \n", "0 4.16 4.279216 [2.239607805437483, 3.363869713064246e-14] 0.0 \n", "0 3.16 3.755278 [1.977638883487764, 8.830566052859473e-15] 0.0 \n", "0 2.16 3.139388 [1.6696938456710986, 1.4729587173841369e-15] 0.0 \n", "0 1.16 2.354066 [1.2770329614285358, 3.876178038906271e-15] 0.0 \n", "0 3.16 3.755278 [1.977638883487764, 8.830566052859473e-15] 0.0 \n", "\n", " con1 con2 obj name \n", "0 1.0 -22.5 8.316848 optproblem03.json \n", "0 2.0 -22.5 2.881535 optproblem04.json \n", "0 -2.0 -21.125 32.152795 optproblem05.json \n", "0 -1.0 -21.125 20.258749 optproblem06.json \n", "0 0.0 -21.125 11.270916 optproblem07.json \n", "0 1.0 -21.125 5.389808 optproblem08.json \n", "0 2.0 -21.890226 2.615642 optproblem09.json \n", "0 -2.0 -19.75 9.566593 optproblem10.json \n", "0 -1.0 -19.75 4.189682 optproblem11.json \n", "0 -0.0 -20.244722 3.183394 optproblem12.json \n", "0 1.0 -20.860612 2.203309 optproblem13.json \n", "0 2.0 -21.645934 1.254982 optproblem14.json \n", "0 -2.0 -19.256873 5.168711 optproblem15.json \n", "0 -1.0 -19.720784 4.173854 optproblem16.json \n", "0 -0.0 -20.244722 3.183394 optproblem17.json \n", "0 1.0 -20.860612 2.203309 optproblem18.json \n", "0 2.0 -21.645934 1.254982 optproblem19.json \n", "0 -2.0 -19.256873 5.168711 optproblem20.json \n", "0 -1.0 -19.720784 4.173854 optproblem21.json \n", "0 -0.0 -20.244722 3.183394 optproblem22.json \n", "0 1.0 -20.860612 2.203309 optproblem23.json \n", "0 2.0 -21.645934 1.254982 optproblem24.json \n", "0 -0.0 -20.244722 3.183394 optproblem25.json " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solutions = []\n", "import glob\n", "\n", "# Specify the pattern for the JSON files\n", "pattern = 'optproblem*.json'\n", "\n", "# Use glob to find all files matching the pattern\n", "json_files = glob.glob(pattern)\n", "\n", "# Loop through the list of files and load each JSON file\n", "data_list = []\n", "for file in json_files:\n", " with open(file, 'r') as f:\n", " data = json.load(f) # Load the JSON data\n", " new_opt = OptProblem.model_validate(data)\n", " new_prob = om.Problem()\n", " new_prob.model = SellarMDA()\n", "\n", " # Setting the optimization problem\n", " set_opt_problem(new_prob, new_opt)\n", "\n", " # Setting the optimizer options.\n", " new_prob.driver = om.ScipyOptimizeDriver()\n", " new_prob.driver.options['optimizer'] = 'SLSQP'\n", " # prob.driver.options['maxiter'] = 100\n", " new_prob.driver.options['tol'] = 1e-8\n", "\n", " # Ask OpenMDAO to finite-difference across the model to compute the gradients for the optimizer\n", " new_prob.model.approx_totals()\n", "\n", " new_prob.set_solver_print(level=0)\n", "\n", " # Run the optimization\n", " new_prob.run_driver()\n", " # Check if the optimization was successful\n", " if not new_prob.driver.fail:\n", " print(\"Optimization was successful!\")\n", " # Get the state of the assembly, which will be the optimization solution\n", " state = get_state(new_prob, info)\n", " # We will store the solution in a dictionary, including the name of the file.\n", " state = {key: value.flatten()[0] if len(value) == 1 else value for key, value in state.items()}\n", " state['name'] = file\n", " # Convert the dictionary to a Pandas Series, and store as a DataFrame\n", " solutions.append(pd.Series(state).to_frame().T)\n", " else:\n", " print(\"Optimization failed.\")\n", "\n", "\n", "# Combine all the solutions into a single DataFrame\n", "df = pd.concat(solutions)\n", "# Show the result DataFrame\n", "df\n" ] }, { "cell_type": "markdown", "id": "a66b228a", "metadata": {}, "source": [ "Since in this example we only varied one constraint we can create a plot showing the impact of the change of the constraint on the value of the objective function, which is what we show next to finish this demonstration." ] }, { "cell_type": "code", "execution_count": 7, "id": "327ce5d1", "metadata": { "metadata": {} }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "# Ensure that plots are displayed inline in Jupyter Notebook\n", "%matplotlib inline\n", "\n", "# Create a 3D plot\n", "fig = plt.figure()\n", "ax = fig.add_subplot(111, projection='3d')\n", "\n", "# Plot the data\n", "ax.scatter(df['con1'], df['con2'], df['obj'], c='b', marker='o') # 'o' for dots\n", "\n", "# Set labels\n", "ax.set_xlabel('con1')\n", "ax.set_ylabel('con2')\n", "ax.set_zlabel('obj')\n", "\n", "# Show the plot\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.9" } }, "nbformat": 4, "nbformat_minor": 5 }