MDF-based DOE on the Sobieski SSBJ test case

from __future__ import division, unicode_literals

from os import name as os_name

from matplotlib import pyplot as plt

from gemseo.api import configure_logger, create_discipline, create_scenario
from gemseo.problems.sobieski.core import SobieskiProblem

IS_NT = os_name == "nt"

configure_logger()

Out:

<RootLogger root (INFO)>

Instantiate the disciplines

First, we instantiate the four disciplines of the use case: SobieskiPropulsion, SobieskiAerodynamics, SobieskiMission and SobieskiStructure.

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

Build, execute and post-process the scenario

Then, we build the scenario which links the disciplines with the formulation and the optimization algorithm. Here, we use the BiLevel formulation. We tell the scenario to minimize -y_4 instead of minimizing y_4 (range), which is the default option.

We need to define the design space.

design_space = SobieskiProblem().read_design_space()

Instantiate the scenario

scenario = create_scenario(
    disciplines,
    formulation="MDF",
    objective_name="y_4",
    design_space=design_space,
    maximize_objective=True,
    scenario_type="DOE",
)

Set the design constraints

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

Execute the scenario

Use provided analytic derivatives

scenario.set_differentiation_method("user")

n_processes = 4
if IS_NT:  # Under windows, don't do multiprocessing
    n_processes = 1

We define the algorithm options. Here the criterion = center option of pyDOE centers the points within the sampling intervals.

algo_options = {
    "criterion": "center",
    # Evaluate gradient of the MDA
    # with coupled adjoint
    "eval_jac": True,
    # Run in parallel on 4 processors
    "n_processes": n_processes,
}
run_inputs = {"n_samples": 30, "algo": "lhs", "algo_options": algo_options}
scenario.execute(run_inputs)

Out:

    INFO - 09:24:48:
    INFO - 09:24:48: *** Start DOE Scenario execution ***
    INFO - 09:24:48: DOEScenario
    INFO - 09:24:48:    Disciplines: SobieskiPropulsion SobieskiAerodynamics SobieskiMission SobieskiStructure
    INFO - 09:24:48:    MDOFormulation: MDF
    INFO - 09:24:48:    Algorithm: lhs
    INFO - 09:24:48: Optimization problem:
    INFO - 09:24:48:    Minimize: -y_4(x_shared, x_1, x_2, x_3)
    INFO - 09:24:48:    With respect to: x_shared, x_1, x_2, x_3
    INFO - 09:24:48:    Subject to constraints:
    INFO - 09:24:48:       g_1(x_shared, x_1, x_2, x_3) <= 0.0
    INFO - 09:24:48:       g_2(x_shared, x_1, x_2, x_3) <= 0.0
    INFO - 09:24:48:       g_3(x_shared, x_1, x_2, x_3) <= 0.0
    INFO - 09:24:48: DOE sampling:   0%|          | 0/30 [00:00<?, ?it]
    INFO - 09:24:48: Running DOE in parallel on n_processes = 4
    INFO - 09:24:52: DOE sampling:   0%|          | 0/30 [00:03<00:03,  8.20 it/sec]
    INFO - 09:24:52: Optimization result:
    INFO - 09:24:52: Objective value = 485.49220045924955
    INFO - 09:24:52: The result is feasible.
    INFO - 09:24:52: Status: None
    INFO - 09:24:52: Optimizer message: None
    INFO - 09:24:52: Number of calls to the objective function by the optimizer: 30
    INFO - 09:24:52: Constraints values w.r.t. 0:
    INFO - 09:24:52:    g_1 = [-0.11350951 -0.10812292 -0.1045109  -0.10204971 -0.10028641 -0.01838903
    INFO - 09:24:52:  -0.22161097]
    INFO - 09:24:52:    g_2 = -0.02400000000000002
    INFO - 09:24:52:    g_3 = [-0.33063157 -0.66936843 -0.73821755 -0.07789536]
    INFO - 09:24:52: Design Space:
    INFO - 09:24:52: +----------+-------------+---------------------+-------------+-------+
    INFO - 09:24:52: | name     | lower_bound |        value        | upper_bound | type  |
    INFO - 09:24:52: +----------+-------------+---------------------+-------------+-------+
    INFO - 09:24:52: | x_shared |     0.01    | 0.05400000000000001 |     0.09    | float |
    INFO - 09:24:52: | x_shared |    30000    |        46500        |    60000    | float |
    INFO - 09:24:52: | x_shared |     1.4     |  1.686666666666667  |     1.8     | float |
    INFO - 09:24:52: | x_shared |     2.5     |         5.2         |     8.5     | float |
    INFO - 09:24:52: | x_shared |      40     |         66.5        |      70     | float |
    INFO - 09:24:52: | x_shared |     500     |  583.3333333333334  |     1500    | float |
    INFO - 09:24:52: | x_1      |     0.1     |        0.185        |     0.4     | float |
    INFO - 09:24:52: | x_1      |     0.75    |  0.9416666666666667 |     1.25    | float |
    INFO - 09:24:52: | x_2      |     0.75    |        0.775        |     1.25    | float |
    INFO - 09:24:52: | x_3      |     0.1     |        0.115        |      1      | float |
    INFO - 09:24:52: +----------+-------------+---------------------+-------------+-------+
    INFO - 09:24:52: *** DOE Scenario run terminated ***

{'eval_jac': False, 'algo': 'lhs', 'n_samples': 30, 'algo_options': {'criterion': 'center', 'eval_jac': True, 'n_processes': 4, 'seed': 1}}

Plot the optimization history view

scenario.post_process("OptHistoryView", show=False, save=False)
  • Evolution of the optimization variables
  • Evolution of the objective value
  • Distance to the optimum
  • Hessian diagonal approximation
  • Evolution of the inequality constraints

Out:

<gemseo.post.opt_history_view.OptHistoryView object at 0x7f61b4c81eb0>

Plot the scatter matrix

scenario.post_process(
    "ScatterPlotMatrix", show=False, save=False, variables_list=["y_4", "x_shared"]
)
plot doe sobieski mdf example

Out:

<gemseo.post.scatter_mat.ScatterPlotMatrix object at 0x7f61b4c81940>

Plot correlations

scenario.post_process("Correlations", show=False, save=False)
# Workaround for HTML rendering, instead of ``show=True``
plt.show()
R=0.98987, R=0.97511, R=0.99671, R=0.96235, R=0.99119, R=0.99866, R=0.95205, R=0.98584, R=0.99618, R=0.99936

Out:

INFO - 09:24:56: Detected 10 correlations > 0.95

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

Gallery generated by Sphinx-Gallery