Example for exterior penalty applied to the Sobieski test case.#

This section describes how to set up and solve the MDO problem relative to the Sobieski test case with GEMSEO applying external penalty.

See also

To start with a simpler MDO problem, and for a detailed description of how to plug a test case into GEMSEO, see Tutorial: How to solve an MDO problem.

Solving with an MDF formulation#

In this example, we solve the range optimization using the following MDF formulation:

Imports#

All the imports needed for the tutorials are performed here.

from __future__ import annotations

from gemseo import configure_logger
from gemseo import create_discipline
from gemseo import create_scenario
from gemseo import get_available_formulations
from gemseo.disciplines.utils import get_all_inputs
from gemseo.disciplines.utils import get_all_outputs
from gemseo.formulations.mdf_settings import MDF_Settings
from gemseo.problems.mdo.sobieski.core.design_space import SobieskiDesignSpace

configure_logger()
<RootLogger root (INFO)>

Step 1: Creation of Discipline#

To build the scenario, we first instantiate the disciplines. Here, the disciplines themselves have already been developed and interfaced with GEMSEO (see Benchmark problems).

disciplines = create_discipline([
    "SobieskiPropulsion",
    "SobieskiAerodynamics",
    "SobieskiMission",
    "SobieskiStructure",
])

Tip

For the disciplines that are not interfaced with GEMSEO, the GEMSEO's gemseo eases the creation of disciplines without having to import them.

See API reference.

Step 2: Creation of Scenario#

The scenario delegates the creation of the optimization problem to the MDO formulation.

Therefore, it needs the list of disciplines, the name of the formulation (or its settings model), the name of the objective function and the design space.

  • The design_space (shown below for reference) defines the unknowns of the optimization problem, and their bounds. It contains all the design variables needed by the MDF formulation. It can be imported from a text file, or created from scratch with the methods create_design_space() and add_variable(). In this case, we will use SobieskiDesignSpace already defined in GEMSEO.

design_space = SobieskiDesignSpace()
x_0 = design_space.get_current_value(as_dict=True)
name      lower_bound      value      upper_bound  type
x_shared      0.01          0.05          0.09     float
x_shared    30000.0       45000.0       60000.0    float
x_shared      1.4           1.6           1.8      float
x_shared      2.5           5.5           8.5      float
x_shared      40.0          55.0          70.0     float
x_shared     500.0         1000.0        1500.0    float
x_1           0.1           0.25          0.4      float
x_1           0.75          1.0           1.25     float
x_2           0.75          1.0           1.25     float
x_3           0.1           0.5           1.0      float
y_14        24850.0    50606.9741711    77100.0    float
y_14        -7700.0    7306.20262124    45000.0    float
y_32         0.235       0.50279625      0.795     float
y_31         2960.0    6354.32430691    10185.0    float
y_24          0.44       4.15006276      11.13     float
y_34          0.44       1.10754577       1.98     float
y_23         3365.0    12194.2671934    26400.0    float
y_21        24850.0    50606.9741711    77250.0    float
y_12        24850.0      50606.9742     77250.0    float
y_12          0.45          0.95          1.5      float
get_available_formulations()
['BiLevel', 'DisciplinaryOpt', 'IDF', 'MDF']
  • \(y\_4\) corresponds to the objective_name. This name must be one of the disciplines outputs, here the SobieskiMission discipline. The list of all outputs of the disciplines can be obtained by using get_all_outputs():

get_all_outputs(disciplines)
get_all_inputs(disciplines)
['c_0', 'c_1', 'c_2', 'c_3', 'c_4', 'x_1', 'x_2', 'x_3', 'x_shared', 'y_12', 'y_14', 'y_21', 'y_23', 'y_24', 'y_31', 'y_32', 'y_34']

From these Discipline, design space, MDO formulation name and objective function name, we build the scenario:

scenario = create_scenario(
    disciplines,
    "y_4",
    design_space,
    maximize_objective=True,
    formulation_name="MDF",
)
WARNING - 16:10:51: Unsupported feature 'minItems' in JSONGrammar 'SobieskiMission_discipline_output' for property 'y_4' in conversion to SimpleGrammar.
WARNING - 16:10:51: Unsupported feature 'maxItems' in JSONGrammar 'SobieskiMission_discipline_output' for property 'y_4' in conversion to SimpleGrammar.

Note that both the formulation settings passed to create_scenario() can be provided via a Pydantic model. For more information, see Formulation Settings.

The range function (\(y\_4\)) should be maximized. However, optimizers minimize functions by default. Which is why, when creating the scenario, the argument maximize_objective shall be set to True.

Differentiation method#

We may choose the way derivatives are computed:

Function derivatives. As analytical disciplinary derivatives are available for the Sobieski test-case, they can be used instead of computing the derivatives with finite-differences or with the complex-step method. The easiest way to set a method is to let the optimizer determine it:

scenario.set_differentiation_method()

The default behavior of the optimizer triggers finite differences. It corresponds to:

scenario.set_differentiation_method("finite_differences",1e-7)

It is also possible to differentiate functions by means of the complex step method:

scenario.set_differentiation_method("complex_step",1e-30j)

Constraints#

Similarly to the objective function, the constraints names are a subset of the disciplines' outputs. They can be obtained by using get_all_outputs().

The formulation has a powerful feature to automatically dispatch the constraints (\(g\_1, g\_2, g\_3\)) and plug them to the optimizers depending on the formulation. To do that, we use the method add_constraint():

for constraint in ["g_1", "g_2", "g_3"]:
    scenario.add_constraint(constraint, constraint_type="ineq")

Step 3: Apply the exterior penalty and execute the scenario#

scenario.formulation.optimization_problem.apply_exterior_penalty(
    objective_scale=10.0, scale_inequality=10.0
)

In this way the L-BFGS-B algorithm can be used to solve the optimization problem. Note that this algorithm is not suited for constrained optimization problems.

scenario.execute(algo_name="L-BFGS-B", max_iter=10)
INFO - 16:10:51:
INFO - 16:10:51: *** Start MDOScenario execution ***
INFO - 16:10:51: MDOScenario
INFO - 16:10:51:    Disciplines: SobieskiAerodynamics SobieskiMission SobieskiPropulsion SobieskiStructure
INFO - 16:10:51:    MDO formulation: MDF
INFO - 16:10:51: Optimization problem:
INFO - 16:10:51:    minimize [[[[-y_4/10.0]+pos_sum_g_1]+pos_sum_g_2]+pos_sum_g_3](x_1, x_2, x_3, x_shared) = -y_4(x_shared, x_1, x_2, x_3)/10.0+sum(heaviside()***2)+sum(heaviside()***2)+sum(heaviside()***2)
INFO - 16:10:51:    with respect to x_1, x_2, x_3, x_shared
INFO - 16:10:51:    over the design space:
INFO - 16:10:51:       +-------------+-------------+-------+-------------+-------+
INFO - 16:10:51:       | Name        | Lower bound | Value | Upper bound | Type  |
INFO - 16:10:51:       +-------------+-------------+-------+-------------+-------+
INFO - 16:10:51:       | x_shared[0] |     0.01    |  0.05 |     0.09    | float |
INFO - 16:10:51:       | x_shared[1] |    30000    | 45000 |    60000    | float |
INFO - 16:10:51:       | x_shared[2] |     1.4     |  1.6  |     1.8     | float |
INFO - 16:10:51:       | x_shared[3] |     2.5     |  5.5  |     8.5     | float |
INFO - 16:10:51:       | x_shared[4] |      40     |   55  |      70     | float |
INFO - 16:10:51:       | x_shared[5] |     500     |  1000 |     1500    | float |
INFO - 16:10:51:       | x_1[0]      |     0.1     |  0.25 |     0.4     | float |
INFO - 16:10:51:       | x_1[1]      |     0.75    |   1   |     1.25    | float |
INFO - 16:10:51:       | x_2         |     0.75    |   1   |     1.25    | float |
INFO - 16:10:51:       | x_3         |     0.1     |  0.5  |      1      | float |
INFO - 16:10:51:       +-------------+-------------+-------+-------------+-------+
INFO - 16:10:51: Solving optimization problem with algorithm L-BFGS-B:
INFO - 16:10:51:     10%|█         | 1/10 [00:00<00:00, 16.37 it/sec, obj=-53.3]
INFO - 16:10:51:     20%|██        | 2/10 [00:00<00:00, 11.86 it/sec, obj=-401]
INFO - 16:10:51:     30%|███       | 3/10 [00:00<00:00, 11.47 it/sec, obj=103]
INFO - 16:10:51:     40%|████      | 4/10 [00:00<00:00, 10.93 it/sec, obj=-488]
INFO - 16:10:51:     50%|█████     | 5/10 [00:00<00:00, 10.49 it/sec, obj=-489]
INFO - 16:10:51:     60%|██████    | 6/10 [00:00<00:00, 10.17 it/sec, obj=-489]
INFO - 16:10:51:     70%|███████   | 7/10 [00:00<00:00,  9.96 it/sec, obj=-489]
INFO - 16:10:51:     80%|████████  | 8/10 [00:00<00:00,  9.85 it/sec, obj=-489]
INFO - 16:10:51:     90%|█████████ | 9/10 [00:00<00:00,  9.76 it/sec, obj=-489]
INFO - 16:10:52:    100%|██████████| 10/10 [00:01<00:00,  9.67 it/sec, obj=-489]
INFO - 16:10:52: Optimization result:
INFO - 16:10:52:    Optimizer info:
INFO - 16:10:52:       Status: None
INFO - 16:10:52:       Message: Maximum number of iterations reached. GEMSEO stopped the driver.
INFO - 16:10:52:       Number of calls to the objective function by the optimizer: 12
INFO - 16:10:52:    Solution:
INFO - 16:10:52:       Objective: -489.2416290389579
INFO - 16:10:52:       Design space:
INFO - 16:10:52:          +-------------+-------------+--------------------+-------------+-------+
INFO - 16:10:52:          | Name        | Lower bound |       Value        | Upper bound | Type  |
INFO - 16:10:52:          +-------------+-------------+--------------------+-------------+-------+
INFO - 16:10:52:          | x_shared[0] |     0.01    |        0.09        |     0.09    | float |
INFO - 16:10:52:          | x_shared[1] |    30000    |       60000        |    60000    | float |
INFO - 16:10:52:          | x_shared[2] |     1.4     |        1.4         |     1.8     | float |
INFO - 16:10:52:          | x_shared[3] |     2.5     |        2.5         |     8.5     | float |
INFO - 16:10:52:          | x_shared[4] |      40     |         70         |      70     | float |
INFO - 16:10:52:          | x_shared[5] |     500     |        1500        |     1500    | float |
INFO - 16:10:52:          | x_1[0]      |     0.1     | 0.2486534942780023 |     0.4     | float |
INFO - 16:10:52:          | x_1[1]      |     0.75    |        0.75        |     1.25    | float |
INFO - 16:10:52:          | x_2         |     0.75    |        0.75        |     1.25    | float |
INFO - 16:10:52:          | x_3         |     0.1     | 0.258406178367566  |      1      | float |
INFO - 16:10:52:          +-------------+-------------+--------------------+-------------+-------+
INFO - 16:10:52: *** End MDOScenario execution (time: 0:00:01.084234) ***

Note that the algorithm settings passed to execute can be provided via a Pydantic model. For more information, Algorithm Settings.

Post-processing options#

To visualize the optimization history of the constraint violation one can use the BasicHistory:

scenario.post_process(
    post_name="BasicHistory",
    variable_names=["g_1", "g_2", "g_3"],
    save=False,
    show=True,
)
History plot
<gemseo.post.basic_history.BasicHistory object at 0x7f65f5324040>

This solution is almost feasible. The solution can better approximate the original problem solution increasing the value of objective_scale and scale_inequality parameters. Step 4: Rerun the scenario with increased penalty and objective scaling. ------------------------------------------------------------------------

design_space.set_current_value(x_0)

Here, we use the MDF_Settings model to define the formulation instead of passing the settings one by one as we did the first time. Both ways of defining the settings are equally valid.

scenario_2 = create_scenario(
    disciplines,
    "y_4",
    design_space,
    formulation_settings_model=MDF_Settings(),
    maximize_objective=True,
)
for constraint in ["g_1", "g_2", "g_3"]:
    scenario_2.add_constraint(constraint, constraint_type="ineq")
scenario_2.set_differentiation_method()
scenario_2.formulation.optimization_problem.apply_exterior_penalty(
    objective_scale=1000.0, scale_inequality=1000.0
)
WARNING - 16:10:52: Unsupported feature 'minItems' in JSONGrammar 'SobieskiMission_discipline_output' for property 'y_4' in conversion to SimpleGrammar.
WARNING - 16:10:52: Unsupported feature 'maxItems' in JSONGrammar 'SobieskiMission_discipline_output' for property 'y_4' in conversion to SimpleGrammar.

Here, we use the L_BFGS_B_Settings model to define the algorithm settings instead of passing them one by one as we did the first time. Both ways of defining the settings are equally valid.

from gemseo.settings.opt import L_BFGS_B_Settings  # noqa: E402

scenario_2.execute(L_BFGS_B_Settings(max_iter=1000))
scenario_2.post_process(
    post_name="BasicHistory", variable_names=["-y_4"], save=False, show=True
)
History plot
    INFO - 16:10:52:
    INFO - 16:10:52: *** Start MDOScenario execution ***
    INFO - 16:10:52: MDOScenario
    INFO - 16:10:52:    Disciplines: SobieskiAerodynamics SobieskiMission SobieskiPropulsion SobieskiStructure
    INFO - 16:10:52:    MDO formulation: MDF
    INFO - 16:10:52: Optimization problem:
    INFO - 16:10:52:    minimize [[[[-y_4/1000.0]+pos_sum_g_1]+pos_sum_g_2]+pos_sum_g_3](x_1, x_2, x_3, x_shared) = -y_4(x_shared, x_1, x_2, x_3)/1000.0+sum(heaviside()***2)+sum(heaviside()***2)+sum(heaviside()***2)
    INFO - 16:10:52:    with respect to x_1, x_2, x_3, x_shared
    INFO - 16:10:52:    over the design space:
    INFO - 16:10:52:       +-------------+-------------+-------+-------------+-------+
    INFO - 16:10:52:       | Name        | Lower bound | Value | Upper bound | Type  |
    INFO - 16:10:52:       +-------------+-------------+-------+-------------+-------+
    INFO - 16:10:52:       | x_shared[0] |     0.01    |  0.05 |     0.09    | float |
    INFO - 16:10:52:       | x_shared[1] |    30000    | 45000 |    60000    | float |
    INFO - 16:10:52:       | x_shared[2] |     1.4     |  1.6  |     1.8     | float |
    INFO - 16:10:52:       | x_shared[3] |     2.5     |  5.5  |     8.5     | float |
    INFO - 16:10:52:       | x_shared[4] |      40     |   55  |      70     | float |
    INFO - 16:10:52:       | x_shared[5] |     500     |  1000 |     1500    | float |
    INFO - 16:10:52:       | x_1[0]      |     0.1     |  0.25 |     0.4     | float |
    INFO - 16:10:52:       | x_1[1]      |     0.75    |   1   |     1.25    | float |
    INFO - 16:10:52:       | x_2         |     0.75    |   1   |     1.25    | float |
    INFO - 16:10:52:       | x_3         |     0.1     |  0.5  |      1      | float |
    INFO - 16:10:52:       +-------------+-------------+-------+-------------+-------+
    INFO - 16:10:52: Solving optimization problem with algorithm L-BFGS-B:
    INFO - 16:10:53:      1%|          | 6/1000 [00:00<01:31, 10.87 it/sec, obj=-0.428]
    INFO - 16:10:53:      1%|          | 7/1000 [00:00<01:30, 10.96 it/sec, obj=-0.504]
    INFO - 16:10:53:      1%|          | 8/1000 [00:00<01:29, 11.11 it/sec, obj=-0.413]
    INFO - 16:10:53:      1%|          | 9/1000 [00:00<01:28, 11.22 it/sec, obj=-0.521]
    INFO - 16:10:53:      1%|          | 10/1000 [00:00<01:27, 11.37 it/sec, obj=-0.537]
    INFO - 16:10:53:      1%|          | 11/1000 [00:00<01:26, 11.47 it/sec, obj=-0.54]
    INFO - 16:10:53:      1%|          | 12/1000 [00:01<01:25, 11.55 it/sec, obj=-0.541]
    INFO - 16:10:53:      1%|▏         | 13/1000 [00:01<01:24, 11.63 it/sec, obj=-0.521]
    INFO - 16:10:53:      1%|▏         | 14/1000 [00:01<01:24, 11.72 it/sec, obj=-0.541]
    INFO - 16:10:53:      2%|▏         | 15/1000 [00:01<01:24, 11.72 it/sec, obj=4.92]
    INFO - 16:10:53:      2%|▏         | 16/1000 [00:01<01:23, 11.77 it/sec, obj=-0.542]
    INFO - 16:10:54:      2%|▏         | 17/1000 [00:01<01:23, 11.82 it/sec, obj=-0.542]
    INFO - 16:10:54:      2%|▏         | 18/1000 [00:01<01:22, 11.84 it/sec, obj=0.751]
    INFO - 16:10:54:      2%|▏         | 19/1000 [00:01<01:22, 11.89 it/sec, obj=-0.542]
    INFO - 16:10:54:      2%|▏         | 20/1000 [00:01<01:22, 11.90 it/sec, obj=-0.589]
    INFO - 16:10:54:      2%|▏         | 21/1000 [00:01<01:22, 11.84 it/sec, obj=28.5]
    INFO - 16:10:54:      2%|▏         | 22/1000 [00:01<01:22, 11.83 it/sec, obj=-0.601]
    INFO - 16:10:54:      2%|▏         | 23/1000 [00:01<01:22, 11.84 it/sec, obj=-0.609]
    INFO - 16:10:54:      2%|▏         | 24/1000 [00:02<01:22, 11.80 it/sec, obj=2.4]
    INFO - 16:10:54:      2%|▎         | 25/1000 [00:02<01:22, 11.78 it/sec, obj=-0.625]
    INFO - 16:10:54:      3%|▎         | 26/1000 [00:02<01:22, 11.77 it/sec, obj=-0.639]
    INFO - 16:10:54:      3%|▎         | 27/1000 [00:02<01:22, 11.75 it/sec, obj=-0.311]
    INFO - 16:10:55:      3%|▎         | 28/1000 [00:02<01:22, 11.74 it/sec, obj=-0.645]
    INFO - 16:10:55:      3%|▎         | 29/1000 [00:02<01:22, 11.73 it/sec, obj=-0.65]
    INFO - 16:10:55:      3%|▎         | 30/1000 [00:02<01:22, 11.73 it/sec, obj=-0.611]
    INFO - 16:10:55:      3%|▎         | 31/1000 [00:02<01:22, 11.72 it/sec, obj=2.98]
    INFO - 16:10:55:      3%|▎         | 32/1000 [00:02<01:22, 11.71 it/sec, obj=-0.651]
    INFO - 16:10:55:      3%|▎         | 33/1000 [00:02<01:22, 11.70 it/sec, obj=0.77]
    INFO - 16:10:55:      3%|▎         | 34/1000 [00:02<01:22, 11.69 it/sec, obj=-0.652]
    INFO - 16:10:55:      4%|▎         | 35/1000 [00:02<01:22, 11.68 it/sec, obj=-0.103]
    INFO - 16:10:55:      4%|▎         | 36/1000 [00:03<01:22, 11.66 it/sec, obj=-0.654]
    INFO - 16:10:55:      4%|▎         | 37/1000 [00:03<01:22, 11.65 it/sec, obj=-0.444]
    INFO - 16:10:55:      4%|▍         | 38/1000 [00:03<01:22, 11.65 it/sec, obj=-0.655]
    INFO - 16:10:55:      4%|▍         | 39/1000 [00:03<01:22, 11.64 it/sec, obj=-0.574]
    INFO - 16:10:56:      4%|▍         | 40/1000 [00:03<01:22, 11.63 it/sec, obj=-0.656]
    INFO - 16:10:56:      4%|▍         | 41/1000 [00:03<01:22, 11.63 it/sec, obj=-0.624]
    INFO - 16:10:56:      4%|▍         | 42/1000 [00:03<01:22, 11.63 it/sec, obj=-0.657]
    INFO - 16:10:56:      4%|▍         | 43/1000 [00:03<01:22, 11.62 it/sec, obj=-0.658]
    INFO - 16:10:56:      4%|▍         | 44/1000 [00:03<01:22, 11.61 it/sec, obj=-0.669]
    INFO - 16:10:56:      4%|▍         | 45/1000 [00:03<01:22, 11.60 it/sec, obj=-0.68]
    INFO - 16:10:56:      5%|▍         | 46/1000 [00:03<01:22, 11.59 it/sec, obj=-0.686]
    INFO - 16:10:56:      5%|▍         | 47/1000 [00:04<01:22, 11.58 it/sec, obj=-0.694]
    INFO - 16:10:56:      5%|▍         | 48/1000 [00:04<01:22, 11.53 it/sec, obj=-0.774]
    INFO - 16:10:56:      5%|▍         | 49/1000 [00:04<01:22, 11.49 it/sec, obj=-1.19]
    INFO - 16:10:57:      5%|▌         | 50/1000 [00:04<01:23, 11.39 it/sec, obj=-1.69]
    INFO - 16:10:57:      5%|▌         | 51/1000 [00:04<01:23, 11.30 it/sec, obj=-1.7]
    INFO - 16:10:57:      5%|▌         | 52/1000 [00:04<01:24, 11.21 it/sec, obj=-1.71]
    INFO - 16:10:57:      5%|▌         | 53/1000 [00:04<01:25, 11.14 it/sec, obj=-1.75]
    INFO - 16:10:57:      5%|▌         | 54/1000 [00:04<01:25, 11.08 it/sec, obj=-1.93]
    INFO - 16:10:57:      6%|▌         | 55/1000 [00:04<01:25, 11.04 it/sec, obj=-2.17]
    INFO - 16:10:57:      6%|▌         | 56/1000 [00:05<01:25, 11.00 it/sec, obj=-2.19]
    INFO - 16:10:57:      6%|▌         | 57/1000 [00:05<01:25, 10.97 it/sec, obj=-2.28]
    INFO - 16:10:57:      6%|▌         | 58/1000 [00:05<01:26, 10.94 it/sec, obj=-2.29]
    INFO - 16:10:58:      6%|▌         | 59/1000 [00:05<01:26, 10.91 it/sec, obj=-2.3]
    INFO - 16:10:58:      6%|▌         | 60/1000 [00:05<01:26, 10.88 it/sec, obj=-2.35]
    INFO - 16:10:58:      6%|▌         | 61/1000 [00:05<01:26, 10.86 it/sec, obj=-2.1]
    INFO - 16:10:58:      6%|▌         | 62/1000 [00:05<01:26, 10.83 it/sec, obj=-2.4]
    INFO - 16:10:58:      6%|▋         | 63/1000 [00:05<01:26, 10.80 it/sec, obj=25.5]
    INFO - 16:10:58:      6%|▋         | 64/1000 [00:05<01:26, 10.77 it/sec, obj=-2.41]
    INFO - 16:10:58:      6%|▋         | 65/1000 [00:06<01:27, 10.74 it/sec, obj=3.96]
    INFO - 16:10:58:      7%|▋         | 66/1000 [00:06<01:27, 10.72 it/sec, obj=-2.42]
    INFO - 16:10:58:      7%|▋         | 67/1000 [00:06<01:27, 10.70 it/sec, obj=0.179]
    INFO - 16:10:58:      7%|▋         | 68/1000 [00:06<01:27, 10.68 it/sec, obj=-2.43]
    INFO - 16:10:59:      7%|▋         | 69/1000 [00:06<01:27, 10.67 it/sec, obj=-1.35]
    INFO - 16:10:59:      7%|▋         | 70/1000 [00:06<01:27, 10.65 it/sec, obj=-2.43]
    INFO - 16:10:59:      7%|▋         | 71/1000 [00:06<01:27, 10.64 it/sec, obj=-2.51]
    INFO - 16:10:59:      7%|▋         | 72/1000 [00:06<01:27, 10.62 it/sec, obj=-2.9]
    INFO - 16:10:59:      7%|▋         | 73/1000 [00:06<01:27, 10.60 it/sec, obj=-3.17]
    INFO - 16:10:59:      7%|▋         | 74/1000 [00:06<01:27, 10.58 it/sec, obj=-3.17]
    INFO - 16:10:59:      8%|▊         | 75/1000 [00:07<01:27, 10.56 it/sec, obj=-3.2]
    INFO - 16:10:59:      8%|▊         | 76/1000 [00:07<01:27, 10.54 it/sec, obj=-2.81]
    INFO - 16:10:59:      8%|▊         | 77/1000 [00:07<01:27, 10.52 it/sec, obj=-3.2]
    INFO - 16:11:00:      8%|▊         | 78/1000 [00:07<01:27, 10.50 it/sec, obj=-3.23]
    INFO - 16:11:00:      8%|▊         | 79/1000 [00:07<01:27, 10.48 it/sec, obj=-3.35]
    INFO - 16:11:00:      8%|▊         | 80/1000 [00:07<01:27, 10.48 it/sec, obj=-3.39]
    INFO - 16:11:00:      8%|▊         | 81/1000 [00:07<01:27, 10.47 it/sec, obj=-3.67]
    INFO - 16:11:00:      8%|▊         | 82/1000 [00:07<01:27, 10.45 it/sec, obj=-3.73]
    INFO - 16:11:00:      8%|▊         | 83/1000 [00:07<01:27, 10.43 it/sec, obj=-3.96]
    INFO - 16:11:00:      8%|▊         | 84/1000 [00:08<01:27, 10.41 it/sec, obj=-4.24]
    INFO - 16:11:00:      8%|▊         | 85/1000 [00:08<01:28, 10.39 it/sec, obj=-4.27]
    INFO - 16:11:00:      9%|▊         | 86/1000 [00:08<01:28, 10.38 it/sec, obj=-4.27]
    INFO - 16:11:01:      9%|▊         | 87/1000 [00:08<01:28, 10.36 it/sec, obj=-4.28]
    INFO - 16:11:01:      9%|▉         | 88/1000 [00:08<01:28, 10.35 it/sec, obj=-4.31]
    INFO - 16:11:01:      9%|▉         | 89/1000 [00:08<01:28, 10.34 it/sec, obj=-4.39]
    INFO - 16:11:01:      9%|▉         | 90/1000 [00:08<01:28, 10.33 it/sec, obj=-4.39]
    INFO - 16:11:01:      9%|▉         | 91/1000 [00:08<01:28, 10.32 it/sec, obj=-4.39]
    INFO - 16:11:01:      9%|▉         | 92/1000 [00:08<01:28, 10.31 it/sec, obj=-4.4]
    INFO - 16:11:01:      9%|▉         | 93/1000 [00:09<01:28, 10.29 it/sec, obj=-3.7]
    INFO - 16:11:01:      9%|▉         | 94/1000 [00:09<01:28, 10.27 it/sec, obj=-4.4]
    INFO - 16:11:01:     10%|▉         | 95/1000 [00:09<01:28, 10.26 it/sec, obj=-4.15]
    INFO - 16:11:01:     10%|▉         | 96/1000 [00:09<01:28, 10.25 it/sec, obj=-4.41]
    INFO - 16:11:02:     10%|▉         | 97/1000 [00:09<01:28, 10.24 it/sec, obj=-4.31]
    INFO - 16:11:02:     10%|▉         | 98/1000 [00:09<01:28, 10.23 it/sec, obj=-4.41]
    INFO - 16:11:02:     10%|▉         | 99/1000 [00:09<01:28, 10.22 it/sec, obj=-4.37]
    INFO - 16:11:02:     10%|█         | 100/1000 [00:09<01:28, 10.20 it/sec, obj=-4.41]
    INFO - 16:11:02:     10%|█         | 101/1000 [00:09<01:28, 10.19 it/sec, obj=-1.72]
    INFO - 16:11:02:     10%|█         | 102/1000 [00:10<01:28, 10.17 it/sec, obj=-4.41]
    INFO - 16:11:02:     10%|█         | 103/1000 [00:10<01:28, 10.16 it/sec, obj=-4.41]
    INFO - 16:11:02:     10%|█         | 104/1000 [00:10<01:28, 10.15 it/sec, obj=-4.41]
    INFO - 16:11:02:     10%|█         | 105/1000 [00:10<01:28, 10.14 it/sec, obj=-4.41]
    INFO - 16:11:03:     11%|█         | 106/1000 [00:10<01:28, 10.14 it/sec, obj=-4.41]
    INFO - 16:11:03:     11%|█         | 107/1000 [00:10<01:28, 10.13 it/sec, obj=-4.41]
    INFO - 16:11:03:     11%|█         | 108/1000 [00:10<01:28, 10.12 it/sec, obj=-4.41]
    INFO - 16:11:03:     11%|█         | 109/1000 [00:10<01:28, 10.11 it/sec, obj=-4.41]
    INFO - 16:11:03:     11%|█         | 110/1000 [00:10<01:28, 10.10 it/sec, obj=-4.41]
    INFO - 16:11:03:     11%|█         | 111/1000 [00:10<01:28, 10.09 it/sec, obj=-4.41]
    INFO - 16:11:03:     11%|█         | 112/1000 [00:11<01:28, 10.08 it/sec, obj=-4.41]
    INFO - 16:11:03:     11%|█▏        | 113/1000 [00:11<01:28, 10.07 it/sec, obj=-4.41]
    INFO - 16:11:03:     11%|█▏        | 114/1000 [00:11<01:28, 10.07 it/sec, obj=-4.41]
    INFO - 16:11:04:     12%|█▏        | 115/1000 [00:11<01:28, 10.06 it/sec, obj=-4.41]
    INFO - 16:11:04:     12%|█▏        | 116/1000 [00:11<01:27, 10.05 it/sec, obj=-4.41]
    INFO - 16:11:04: Optimization result:
    INFO - 16:11:04:    Optimizer info:
    INFO - 16:11:04:       Status: 0
    INFO - 16:11:04:       Message: CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL
    INFO - 16:11:04:       Number of calls to the objective function by the optimizer: 118
    INFO - 16:11:04:    Solution:
    INFO - 16:11:04:       Objective: -4.4116962873840135
    INFO - 16:11:04:       Design space:
    INFO - 16:11:04:          +-------------+-------------+--------------------+-------------+-------+
    INFO - 16:11:04:          | Name        | Lower bound |       Value        | Upper bound | Type  |
    INFO - 16:11:04:          +-------------+-------------+--------------------+-------------+-------+
    INFO - 16:11:04:          | x_shared[0] |     0.01    |        0.09        |     0.09    | float |
    INFO - 16:11:04:          | x_shared[1] |    30000    |       60000        |    60000    | float |
    INFO - 16:11:04:          | x_shared[2] |     1.4     |        1.4         |     1.8     | float |
    INFO - 16:11:04:          | x_shared[3] |     2.5     |        2.5         |     8.5     | float |
    INFO - 16:11:04:          | x_shared[4] |      40     |         70         |      70     | float |
    INFO - 16:11:04:          | x_shared[5] |     500     |        1500        |     1500    | float |
    INFO - 16:11:04:          | x_1[0]      |     0.1     |        0.4         |     0.4     | float |
    INFO - 16:11:04:          | x_1[1]      |     0.75    |        0.75        |     1.25    | float |
    INFO - 16:11:04:          | x_2         |     0.75    |        0.75        |     1.25    | float |
    INFO - 16:11:04:          | x_3         |     0.1     | 0.1563542074363522 |      1      | float |
    INFO - 16:11:04:          +-------------+-------------+--------------------+-------------+-------+
    INFO - 16:11:04: *** End MDOScenario execution (time: 0:00:11.589887) ***

<gemseo.post.basic_history.BasicHistory object at 0x7f65f5f8e3d0>

Here, we use the BasicHistory_Settings model to define the post-processor settings instead of passing them one by one as we did the first time. Both ways of defining the settings are equally valid.

from gemseo.settings.post import BasicHistory_Settings  # noqa: E402

scenario_2.post_process(
    BasicHistory_Settings(
        variable_names=["g_1", "g_2", "g_3"],
        save=False,
        show=True,
    )
)
History plot
<gemseo.post.basic_history.BasicHistory object at 0x7f65f5c136d0>

The solution feasibility was improved but this comes with a much higher number of iterations.

Total running time of the script: (0 minutes 13.890 seconds)

Gallery generated by Sphinx-Gallery