Note
Click here to download the full example code
MDF-based MDO on the Sobieski SSBJ test case¶
from __future__ import absolute_import, division, print_function, unicode_literals
from future import standard_library
from gemseo.api import configure_logger, create_discipline, create_scenario
from gemseo.problems.sobieski.core import SobieskiProblem
standard_library.install_aliases()
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
MDF
formulation. We tell the scenario to minimize -y_4 instead of
minimizing y_4 (range), which is the default option.
Instantiate the scenario¶
During the instantiation of the scenario, we provide some options for the MDF formulations:
formulation_options = {
"tolerance": 1e-10,
"max_mda_iter": 50,
"warm_start": True,
"use_lu_fact": True,
"linear_solver_tolerance": 1e-15,
}
'warm_start
: warm starts MDA,'warm_start
: optimize the adjoints resolution by storing the Jacobian matrix LU factorization for the multiple RHS (objective + constraints). This saves CPU time if you can pay for the memory and have the full Jacobians available, not just matrix vector products.'linear_solver_tolerance'
: set the linear solver tolerance, idem we need full convergence
design_space = SobieskiProblem().read_design_space()
scenario = create_scenario(
disciplines,
"MDF",
objective_name="y_4",
design_space=design_space,
maximize_objective=True,
**formulation_options
)
Set the design constraints¶
for c_name in ["g_1", "g_2", "g_3"]:
scenario.add_constraint(c_name, "ineq")
XDSMIZE the scenario¶
Generate the XDSM file on the fly, setting print_statuses=true will print the status in the console html_output (default True), will generate a self contained html file, that can be automatically open using open_browser=True
scenario.xdsmize(html_output=True, print_statuses=False, open_browser=False)
Define the algorithm inputs¶
We set the maximum number of iterations, the optimizer
and the optimizer options. Algorithm specific options are passed there.
Use get_algorithm_options_schema()
API function for more
information or read the documentation.
Here ftol_rel option is a stop criteria based on the relative difference in the objective between two iterates ineq_tolerance the tolerance determination of the optimum; this is specific to the GEMSEO wrapping and not in the solver.
algo_options = {
"ftol_rel": 1e-10,
"ineq_tolerance": 2e-3,
"normalize_design_space": True,
}
scn_inputs = {"max_iter": 10, "algo": "SLSQP", "algo_options": algo_options}
See also
We can also generates a backup file for the optimization,
as well as plots on the fly of the optimization history if option
generate_opt_plot
is True
.
This slows down a lot the process, here since SSBJ is very light
scenario.set_optimization_history_backup(file_path="mdf_backup.h5",
each_new_iter=True,
each_store=False, erase=True,
pre_load=False,
generate_opt_plot=True)
Execute the scenario¶
scenario.execute(scn_inputs)
Out:
{'max_iter': 10, 'algo': 'SLSQP', 'algo_options': {'ftol_rel': 1e-10, 'ineq_tolerance': 0.002, '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("mdf_history.h5", file_format="hdf5")
We can also save only calls to functions and design variables history:
scenario.save_optimization_history("mdf_history.xml", file_format="ggobi")
Print optimization metrics¶
scenario.print_execution_metrics()
Post-process the results¶
Plot the optimization history view¶
scenario.post_process("OptHistoryView", save=False, show=True)
Out:
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/conda/3.0.3/lib/python3.8/site-packages/gemseo/post/opt_history_view.py:312: UserWarning: FixedFormatter should only be used together with FixedLocator
ax1.set_yticklabels(y_labels)
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/conda/3.0.3/lib/python3.8/site-packages/gemseo/post/opt_history_view.py:716: MatplotlibDeprecationWarning: default base will change from np.e to 10 in 3.4. To suppress this warning specify the base keyword argument.
norm=SymLogNorm(linthresh=linthresh, vmin=-vmax, vmax=vmax),
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/conda/3.0.3/lib/python3.8/site-packages/gemseo/post/opt_history_view.py:626: MatplotlibDeprecationWarning: default base will change from np.e to 10 in 3.4. To suppress this warning specify the base keyword argument.
norm=SymLogNorm(linthresh=1.0, vmin=-vmax, vmax=vmax),
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/conda/3.0.3/lib/python3.8/site-packages/gemseo/post/opt_history_view.py:619: MatplotlibDeprecationWarning: Passing parameters norm and vmin/vmax simultaneously is deprecated since 3.3 and will become an error two minor releases later. Please pass vmin/vmax directly to the norm when creating it.
im1 = ax1.imshow(
<gemseo.post.opt_history_view.OptHistoryView object at 0x7fc29af65940>
Plot the basic history view¶
scenario.post_process("BasicHistory", data_list=["x_shared"], save=False, show=True)
Out:
<gemseo.post.basic_history.BasicHistory object at 0x7fc29af65ee0>
Plot the constraints and objective history¶
scenario.post_process("ObjConstrHist", save=False, show=True)
Out:
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/conda/3.0.3/lib/python3.8/site-packages/gemseo/post/obj_constr_hist.py:139: MatplotlibDeprecationWarning: default base will change from np.e to 10 in 3.4. To suppress this warning specify the base keyword argument.
norm=SymLogNorm(linthresh=1.0, vmin=vmin * 0.75, vmax=vmax * 0.75),
<gemseo.post.obj_constr_hist.ObjConstrHist object at 0x7fc2989a39a0>
Plot the constraints history¶
scenario.post_process(
"ConstraintsHistory", save=False, show=True, constraints_list=["g_1", "g_2", "g_3"]
)
Out:
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/conda/3.0.3/lib/python3.8/site-packages/gemseo/post/constraints_history.py:152: MatplotlibDeprecationWarning: default base will change from np.e to 10 in 3.4. To suppress this warning specify the base keyword argument.
norm=SymLogNorm(linthresh=1.0, vmin=-vmax, vmax=vmax),
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/conda/3.0.3/lib/python3.8/site-packages/gemseo/post/constraints_history.py:152: MatplotlibDeprecationWarning: default base will change from np.e to 10 in 3.4. To suppress this warning specify the base keyword argument.
norm=SymLogNorm(linthresh=1.0, vmin=-vmax, vmax=vmax),
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/conda/3.0.3/lib/python3.8/site-packages/gemseo/post/constraints_history.py:152: MatplotlibDeprecationWarning: default base will change from np.e to 10 in 3.4. To suppress this warning specify the base keyword argument.
norm=SymLogNorm(linthresh=1.0, vmin=-vmax, vmax=vmax),
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/conda/3.0.3/lib/python3.8/site-packages/gemseo/post/constraints_history.py:152: MatplotlibDeprecationWarning: default base will change from np.e to 10 in 3.4. To suppress this warning specify the base keyword argument.
norm=SymLogNorm(linthresh=1.0, vmin=-vmax, vmax=vmax),
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/conda/3.0.3/lib/python3.8/site-packages/gemseo/post/constraints_history.py:152: MatplotlibDeprecationWarning: default base will change from np.e to 10 in 3.4. To suppress this warning specify the base keyword argument.
norm=SymLogNorm(linthresh=1.0, vmin=-vmax, vmax=vmax),
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/conda/3.0.3/lib/python3.8/site-packages/gemseo/post/constraints_history.py:152: MatplotlibDeprecationWarning: default base will change from np.e to 10 in 3.4. To suppress this warning specify the base keyword argument.
norm=SymLogNorm(linthresh=1.0, vmin=-vmax, vmax=vmax),
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/conda/3.0.3/lib/python3.8/site-packages/gemseo/post/constraints_history.py:152: MatplotlibDeprecationWarning: default base will change from np.e to 10 in 3.4. To suppress this warning specify the base keyword argument.
norm=SymLogNorm(linthresh=1.0, vmin=-vmax, vmax=vmax),
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/conda/3.0.3/lib/python3.8/site-packages/gemseo/post/constraints_history.py:152: MatplotlibDeprecationWarning: default base will change from np.e to 10 in 3.4. To suppress this warning specify the base keyword argument.
norm=SymLogNorm(linthresh=1.0, vmin=-vmax, vmax=vmax),
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/conda/3.0.3/lib/python3.8/site-packages/gemseo/post/constraints_history.py:152: MatplotlibDeprecationWarning: default base will change from np.e to 10 in 3.4. To suppress this warning specify the base keyword argument.
norm=SymLogNorm(linthresh=1.0, vmin=-vmax, vmax=vmax),
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/conda/3.0.3/lib/python3.8/site-packages/gemseo/post/constraints_history.py:152: MatplotlibDeprecationWarning: default base will change from np.e to 10 in 3.4. To suppress this warning specify the base keyword argument.
norm=SymLogNorm(linthresh=1.0, vmin=-vmax, vmax=vmax),
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/conda/3.0.3/lib/python3.8/site-packages/gemseo/post/constraints_history.py:152: MatplotlibDeprecationWarning: default base will change from np.e to 10 in 3.4. To suppress this warning specify the base keyword argument.
norm=SymLogNorm(linthresh=1.0, vmin=-vmax, vmax=vmax),
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/conda/3.0.3/lib/python3.8/site-packages/gemseo/post/constraints_history.py:152: MatplotlibDeprecationWarning: default base will change from np.e to 10 in 3.4. To suppress this warning specify the base keyword argument.
norm=SymLogNorm(linthresh=1.0, vmin=-vmax, vmax=vmax),
<gemseo.post.constraints_history.ConstraintsHistory object at 0x7fc299b861c0>
Plot the constraints history using a radar chart¶
scenario.post_process(
"RadarChart", save=False, show=True, constraints_list=["g_1", "g_2", "g_3"]
)
Out:
<gemseo.post.radar_chart.RadarChart object at 0x7fc299b86d60>
Plot the quadratic approximation of the objective¶
scenario.post_process("QuadApprox", function="-y_4", save=False, show=True)
Out:
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/conda/3.0.3/lib/python3.8/site-packages/gemseo/post/quad_approx.py:151: MatplotlibDeprecationWarning: default base will change from np.e to 10 in 3.4. To suppress this warning specify the base keyword argument.
norm=SymLogNorm(linthresh=linthresh, vmin=-vmax, vmax=vmax),
<gemseo.post.quad_approx.QuadApprox object at 0x7fc299ca4e20>
Plot the functions using a SOM¶
scenario.post_process("SOM", save=False, show=True)
Out:
<gemseo.post.som.SOM object at 0x7fc29b185eb0>
Plot the scatter matrix of variables of interest¶
scenario.post_process(
"ScatterPlotMatrix",
save=False,
show=True,
variables_list=["-y_4", "g_1"],
figsize_x=14,
figsize_y=14,
)
Out:
<gemseo.post.scatter_mat.ScatterPlotMatrix object at 0x7fc2999a0e50>
Plot the variables using the parallel coordinates¶
scenario.post_process("ParallelCoordinates", save=False, show=True)
Out:
<gemseo.post.para_coord.ParallelCoordinates object at 0x7fc2990df5b0>
Plot the robustness of the solution¶
scenario.post_process("Robustness", save=False, show=True)
Out:
<gemseo.post.robustness.Robustness object at 0x7fc2990df460>
Plot the influence of the design variables¶
scenario.post_process(
"VariableInfluence", save=False, show=True, figsize_x=14, figsize_y=14
)
Out:
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/conda/3.0.3/lib/python3.8/site-packages/gemseo/post/variable_influence.py:242: UserWarning: FixedFormatter should only be used together with FixedLocator
axe.set_xticklabels(x_labels, fontsize=14)
<gemseo.post.variable_influence.VariableInfluence object at 0x7fc298dd7fd0>
Total running time of the script: ( 0 minutes 9.097 seconds)