Note
Click here to download the full example code
IDF-based MDO on the Sobieski SSBJ test case¶
from __future__ import division, unicode_literals
from matplotlib import pyplot as plt
from gemseo.api import configure_logger, create_discipline, create_scenario
from gemseo.problems.sobieski.core import SobieskiProblem
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
IDF
formulation. We tell the scenario to minimize -y_4 instead of
minimizing y_4 (range), which is the default option.
Instantiate the scenario¶
design_space = SobieskiProblem().read_design_space()
scenario = create_scenario(
disciplines,
"IDF",
objective_name="y_4",
design_space=design_space,
maximize_objective=True,
)
Set the design constraints¶
for c_name in ["g_1", "g_2", "g_3"]:
scenario.add_constraint(c_name, "ineq")
Define the algorithm inputs¶
We set the maximum number of iterations, the optimizer and the optimizer options
algo_options = {
"ftol_rel": 1e-10,
"ineq_tolerance": 1e-3,
"eq_tolerance": 1e-3,
"normalize_design_space": True,
}
scn_inputs = {"max_iter": 20, "algo": "SLSQP", "algo_options": algo_options}
Execute the scenario¶
scenario.execute(scn_inputs)
Out:
INFO - 09:24:44:
INFO - 09:24:44: *** Start MDO Scenario execution ***
INFO - 09:24:44: MDOScenario
INFO - 09:24:44: Disciplines: SobieskiPropulsion SobieskiAerodynamics SobieskiMission SobieskiStructure
INFO - 09:24:44: MDOFormulation: IDF
INFO - 09:24:44: Algorithm: SLSQP
INFO - 09:24:44: Optimization problem:
INFO - 09:24:44: Minimize: -y_4(x_shared, y_14, y_24, y_34)
INFO - 09:24:44: With respect to: x_shared, x_1, x_2, x_3, y_14, y_32, y_31, y_24, y_34, y_23, y_21, y_12
INFO - 09:24:44: Subject to constraints:
INFO - 09:24:44: g_1(x_shared, x_1, y_31, y_21) <= 0.0
INFO - 09:24:44: g_2(x_shared, x_2, y_32, y_12) <= 0.0
INFO - 09:24:44: g_3(x_shared, x_3, y_23) <= 0.0
INFO - 09:24:44: y_31_y_32_y_34(x_shared, x_3, y_23): y_31(x_shared, x_3, y_23) - y_31 == 0.0
INFO - 09:24:44: y_32(x_shared, x_3, y_23) - y_32 == 0.0
INFO - 09:24:44: y_34(x_shared, x_3, y_23) - y_34 == 0.0
INFO - 09:24:44: y_21_y_23_y_24(x_shared, x_2, y_32, y_12): y_21(x_shared, x_2, y_32, y_12) - y_21 == 0.0
INFO - 09:24:44: y_23(x_shared, x_2, y_32, y_12) - y_23 == 0.0
INFO - 09:24:44: y_24(x_shared, x_2, y_32, y_12) - y_24 == 0.0
INFO - 09:24:44: y_12_y_14(x_shared, x_1, y_31, y_21): y_12(x_shared, x_1, y_31, y_21) - y_12 == 0.0
INFO - 09:24:44: y_14(x_shared, x_1, y_31, y_21) - y_14 == 0.0
INFO - 09:24:44: Design Space:
INFO - 09:24:44: +----------+-------------+--------------------+-------------+-------+
INFO - 09:24:44: | name | lower_bound | value | upper_bound | type |
INFO - 09:24:44: +----------+-------------+--------------------+-------------+-------+
INFO - 09:24:44: | x_shared | 0.01 | 0.05 | 0.09 | float |
INFO - 09:24:44: | x_shared | 30000 | 45000 | 60000 | float |
INFO - 09:24:44: | x_shared | 1.4 | 1.6 | 1.8 | float |
INFO - 09:24:44: | x_shared | 2.5 | 5.5 | 8.5 | float |
INFO - 09:24:44: | x_shared | 40 | 55 | 70 | float |
INFO - 09:24:44: | x_shared | 500 | 1000 | 1500 | float |
INFO - 09:24:44: | x_1 | 0.1 | 0.25 | 0.4 | float |
INFO - 09:24:44: | x_1 | 0.75 | 1 | 1.25 | float |
INFO - 09:24:44: | x_2 | 0.75 | 1 | 1.25 | float |
INFO - 09:24:44: | x_3 | 0.1 | 0.5 | 1 | float |
INFO - 09:24:44: | y_14 | 24850 | 50606.9741711 | 77100 | float |
INFO - 09:24:44: | y_14 | -7700 | 7306.20262124 | 45000 | float |
INFO - 09:24:44: | y_32 | 0.235 | 0.5027962499999999 | 0.795 | float |
INFO - 09:24:44: | y_31 | 2960 | 6354.32430691 | 10185 | float |
INFO - 09:24:44: | y_24 | 0.44 | 4.15006276 | 11.13 | float |
INFO - 09:24:44: | y_34 | 0.44 | 1.10754577 | 1.98 | float |
INFO - 09:24:44: | y_23 | 3365 | 12194.2671934 | 26400 | float |
INFO - 09:24:44: | y_21 | 24850 | 50606.9741711 | 77250 | float |
INFO - 09:24:44: | y_12 | 24850 | 50606.9742 | 77250 | float |
INFO - 09:24:44: | y_12 | 0.45 | 0.95 | 1.5 | float |
INFO - 09:24:44: +----------+-------------+--------------------+-------------+-------+
INFO - 09:24:44: Optimization: 0%| | 0/20 [00:00<?, ?it]
INFO - 09:24:44: Optimization: 30%|███ | 6/20 [00:00<00:00, 168.27 it/sec, obj=3.96e+3]
INFO - 09:24:44: Optimization: 30%|███ | 6/20 [00:00<00:00, 141.88 it/sec, obj=3.96e+3]
INFO - 09:24:44: Optimization result:
INFO - 09:24:44: Objective value = 3962.9526217985263
INFO - 09:24:44: The result is feasible.
INFO - 09:24:44: Status: 8
INFO - 09:24:44: Optimizer message: Positive directional derivative for linesearch
INFO - 09:24:44: Number of calls to the objective function by the optimizer: 7
INFO - 09:24:44: Constraints values w.r.t. 0:
INFO - 09:24:44: g_1 = [-0.01805183 -0.03333975 -0.04424427 -0.05183035 -0.05732248 -0.13720303
INFO - 09:24:44: -0.10279697]
INFO - 09:24:44: g_2 = -2.166209250198392e-06
INFO - 09:24:44: g_3 = [-7.67165451e-01 -2.32834549e-01 -1.78465879e-05 -1.83253517e-01]
INFO - 09:24:44: y_12_y_14 = [3.31196595e-08 1.29015182e-08 3.32147398e-08 2.33971913e-08]
INFO - 09:24:44: y_21_y_23_y_24 = [0.00000000e+00 9.50788249e-08 2.44492523e-07]
INFO - 09:24:44: y_31_y_32_y_34 = [-1.00976229e-07 -1.26724891e-07 -9.53784673e-08]
INFO - 09:24:44: Design Space:
INFO - 09:24:44: +----------+-------------+---------------------+-------------+-------+
INFO - 09:24:44: | name | lower_bound | value | upper_bound | type |
INFO - 09:24:44: +----------+-------------+---------------------+-------------+-------+
INFO - 09:24:44: | x_shared | 0.01 | 0.05999945844768744 | 0.09 | float |
INFO - 09:24:44: | x_shared | 30000 | 59999.36188472858 | 60000 | float |
INFO - 09:24:44: | x_shared | 1.4 | 1.400011395953098 | 1.8 | float |
INFO - 09:24:44: | x_shared | 2.5 | 2.500062481153684 | 8.5 | float |
INFO - 09:24:44: | x_shared | 40 | 69.99949948899524 | 70 | float |
INFO - 09:24:44: | x_shared | 500 | 1499.986640198356 | 1500 | float |
INFO - 09:24:44: | x_1 | 0.1 | 0.3999633933729535 | 0.4 | float |
INFO - 09:24:44: | x_1 | 0.75 | 0.7500061364948122 | 1.25 | float |
INFO - 09:24:44: | x_2 | 0.75 | 0.7500056408385082 | 1.25 | float |
INFO - 09:24:44: | x_3 | 0.1 | 0.1562473006335393 | 1 | float |
INFO - 09:24:44: | y_14 | 24850 | 44750.2308549515 | 77100 | float |
INFO - 09:24:44: | y_14 | -7700 | 19349.94590290229 | 45000 | float |
INFO - 09:24:44: | y_32 | 0.235 | 0.7328346197705424 | 0.795 | float |
INFO - 09:24:44: | y_31 | 2960 | 9437.653099153551 | 10185 | float |
INFO - 09:24:44: | y_24 | 0.44 | 8.057175760897779 | 11.13 | float |
INFO - 09:24:44: | y_34 | 0.44 | 0.9239561506019203 | 1.98 | float |
INFO - 09:24:44: | y_23 | 3365 | 5554.079992829635 | 26400 | float |
INFO - 09:24:44: | y_21 | 24850 | 44750.2308549515 | 77250 | float |
INFO - 09:24:44: | y_12 | 24850 | 44750.2308549515 | 77250 | float |
INFO - 09:24:44: | y_12 | 0.45 | 0.9027969578958603 | 1.5 | float |
INFO - 09:24:44: +----------+-------------+---------------------+-------------+-------+
INFO - 09:24:44: *** MDO Scenario run terminated in 0:00:00.165821 ***
{'max_iter': 20, 'algo': 'SLSQP', 'algo_options': {'ftol_rel': 1e-10, 'ineq_tolerance': 0.001, 'eq_tolerance': 0.001, 'normalize_design_space': True}}
Save the optimization history¶
We can save the whole optimization problem and its history for further post processing:
scenario.save_optimization_history("idf_history.h5", file_format="hdf5")
Out:
INFO - 09:24:44: Export optimization problem to file: idf_history.h5
We can also save only calls to functions and design variables history:
scenario.save_optimization_history("idf_history.xml", file_format="ggobi")
Out:
INFO - 09:24:44: Export to ggobi for functions: ['-y_4', 'Iter', 'g_1', 'g_2', 'g_3', 'y_12_y_14', 'y_21_y_23_y_24', 'y_31_y_32_y_34']
INFO - 09:24:44: Export to ggobi file: idf_history.xml
Print optimization metrics¶
scenario.print_execution_metrics()
Out:
INFO - 09:24:44: * Scenario Executions statistics *
INFO - 09:24:44: * Discipline: SobieskiPropulsion
INFO - 09:24:44: Executions number: 6
INFO - 09:24:44: Execution time: 0.006237466000129643 s
INFO - 09:24:44: Linearizations number: 6
INFO - 09:24:44: * Discipline: SobieskiAerodynamics
INFO - 09:24:44: Executions number: 6
INFO - 09:24:44: Execution time: 0.009919864000494272 s
INFO - 09:24:44: Linearizations number: 6
INFO - 09:24:44: * Discipline: SobieskiMission
INFO - 09:24:44: Executions number: 6
INFO - 09:24:44: Execution time: 0.00042065799880219856 s
INFO - 09:24:44: Linearizations number: 6
INFO - 09:24:44: * Discipline: SobieskiStructure
INFO - 09:24:44: Executions number: 6
INFO - 09:24:44: Execution time: 0.04902356200045688 s
INFO - 09:24:44: Linearizations number: 6
INFO - 09:24:44: Total number of executions calls 24
INFO - 09:24:44: Total number of linearizations 24
Plot the optimization history view¶
scenario.post_process("OptHistoryView", save=False, show=False)
Out:
<gemseo.post.opt_history_view.OptHistoryView object at 0x7f61b8bbd220>
Plot the quadratic approximation of the objective¶
scenario.post_process("QuadApprox", function="-y_4", save=False, show=False)
# Workaround for HTML rendering, instead of ``show=True``
plt.show()
Total running time of the script: ( 0 minutes 4.388 seconds)