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")

Post-process the results

Plot the optimization history view

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

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)
History plot

Out:

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

Plot the constraints and objective history

scenario.post_process("ObjConstrHist", save=False, show=True)
Evolution of the objective value and maximal constraint

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"]
)
Evolution of the constraints w.r.t. iterations, g_1_1, g_1_2, g_1_3, g_1_4, g_1_5, g_1_6, g_1_7, g_2, g_3_1, g_3_2, g_3_3, g_3_4

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"]
)
Constraints at last iteration

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)
  • Hessian matrix SR1 approximation of -y_4
  • plot sobieski mdf example

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)
Self Organizing Maps of the design space, -y_4, g_1_0, g_1_1, g_1_2, g_1_3, g_1_4, g_1_5, g_1_6, g_2, g_3_0, g_3_1, g_3_2, g_3_3

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,
)
plot sobieski mdf example

Out:

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

Plot the variables using the parallel coordinates

scenario.post_process("ParallelCoordinates", save=False, show=True)
  • Design variables history colored by '-y_4'  value
  • Objective function and constraints history colored by '-y_4' value

Out:

<gemseo.post.para_coord.ParallelCoordinates object at 0x7fc2990df5b0>

Plot the robustness of the solution

scenario.post_process("Robustness", save=False, show=True)
Box plot of the optimization functions with normalized stddev 0.01

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
)
Partial variation of the functions wrt design variables, 9 variables required to explain 99% of -y_4 variations, 5 variables required to explain 99% of g_1_0 variations, 5 variables required to explain 99% of g_1_1 variations, 5 variables required to explain 99% of g_1_2 variations, 5 variables required to explain 99% of g_1_3 variations, 5 variables required to explain 99% of g_1_4 variations, 4 variables required to explain 99% of g_1_5 variations, 4 variables required to explain 99% of g_1_6 variations, 1 variables required to explain 99% of g_2 variations, 7 variables required to explain 99% of g_3_0 variations, 7 variables required to explain 99% of g_3_1 variations, 3 variables required to explain 99% of g_3_2 variations, 3 variables required to explain 99% of g_3_3 variations

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)

Gallery generated by Sphinx-Gallery