.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "examples/formulations/plot_doe_sobieski_bilevel_example.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note Click :ref:`here ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr_examples_formulations_plot_doe_sobieski_bilevel_example.py: BiLevel-based DOE on the Sobieski SSBJ test case ================================================ .. GENERATED FROM PYTHON SOURCE LINES 26-40 .. code-block:: default from __future__ import division, unicode_literals from copy import deepcopy 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() .. rst-class:: sphx-glr-script-out Out: .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 41-48 Instantiate the disciplines ---------------------------- First, we instantiate the four disciplines of the use case: :class:`~gemseo.problems.sobieski.wrappers.SobieskiPropulsion`, :class:`~gemseo.problems.sobieski.wrappers.SobieskiAerodynamics`, :class:`~gemseo.problems.sobieski.wrappers.SobieskiMission` and :class:`~gemseo.problems.sobieski.wrappers.SobieskiStructure`. .. GENERATED FROM PYTHON SOURCE LINES 48-57 .. code-block:: default propu, aero, mission, struct = create_discipline( [ "SobieskiPropulsion", "SobieskiAerodynamics", "SobieskiMission", "SobieskiStructure", ] ) .. GENERATED FROM PYTHON SOURCE LINES 58-66 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 :class:`.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. .. GENERATED FROM PYTHON SOURCE LINES 66-68 .. code-block:: default design_space = SobieskiProblem().read_design_space() .. GENERATED FROM PYTHON SOURCE LINES 69-72 Then, we build a sub-scenario for each strongly coupled disciplines, using the following algorithm, maximum number of iterations and algorithm options: .. GENERATED FROM PYTHON SOURCE LINES 72-80 .. code-block:: default algo_options = { "xtol_rel": 1e-7, "xtol_abs": 1e-7, "ftol_rel": 1e-7, "ftol_abs": 1e-7, "ineq_tolerance": 1e-4, } sub_sc_opts = {"max_iter": 30, "algo": "SLSQP", "algo_options": algo_options} .. GENERATED FROM PYTHON SOURCE LINES 81-84 Build a sub-scenario for Propulsion ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This sub-scenario will minimize SFC. .. GENERATED FROM PYTHON SOURCE LINES 84-92 .. code-block:: default sc_prop = create_scenario( propu, "DisciplinaryOpt", "y_34", design_space=deepcopy(design_space).filter("x_3"), name="PropulsionScenario", ) .. GENERATED FROM PYTHON SOURCE LINES 93-96 Build a sub-scenario for Aerodynamics ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This sub-scenario will minimize L/D. .. GENERATED FROM PYTHON SOURCE LINES 96-105 .. code-block:: default sc_aero = create_scenario( aero, "DisciplinaryOpt", "y_24", deepcopy(design_space).filter("x_2"), name="AerodynamicsScenario", maximize_objective=True, ) .. GENERATED FROM PYTHON SOURCE LINES 106-110 Build a sub-scenario for Structure ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This sub-scenario will maximize log(aircraft total weight / (aircraft total weight - fuel weight)). .. GENERATED FROM PYTHON SOURCE LINES 110-119 .. code-block:: default sc_str = create_scenario( struct, "DisciplinaryOpt", "y_11", deepcopy(design_space).filter("x_1"), name="StructureScenario", maximize_objective=True, ) .. GENERATED FROM PYTHON SOURCE LINES 120-124 Build a scenario for Mission ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This scenario is based on the three previous sub-scenarios and on the Mission and aims to maximize the range (Breguet). .. GENERATED FROM PYTHON SOURCE LINES 124-136 .. code-block:: default sub_disciplines = [sc_prop, sc_aero, sc_str] + [mission] design_space = deepcopy(design_space).filter("x_shared") system_scenario = create_scenario( sub_disciplines, "BiLevel", "y_4", design_space, parallel_scenarios=False, reset_x0_before_opt=True, scenario_type="DOE", ) .. GENERATED FROM PYTHON SOURCE LINES 137-141 .. note:: Setting :code:`reset_x0_before_opt=True` is mandatory when doing a DOE in parallel. If we want reproducible results, don't reuse previous xopt. .. GENERATED FROM PYTHON SOURCE LINES 141-145 .. code-block:: default system_scenario.formulation.mda1.warm_start = False system_scenario.formulation.mda2.warm_start = False .. GENERATED FROM PYTHON SOURCE LINES 146-151 .. note:: This is mandatory when doing a DOE in parallel if we want always exactly the same results, don't warm start mda1 to have exactly the same process whatever the execution order and process dispatch. .. GENERATED FROM PYTHON SOURCE LINES 151-169 .. code-block:: default for sub_sc in sub_disciplines[0:3]: sub_sc.default_inputs = {"max_iter": 20, "algo": "L-BFGS-B"} n_processes = 4 if IS_NT: # Under windows, dont do multiprocessing n_processes = 1 run_inputs = { "n_samples": 30, "algo": "lhs", "algo_options": {"n_processes": n_processes}, } system_scenario.execute(run_inputs) system_scenario.print_execution_metrics() .. rst-class:: sphx-glr-script-out Out: .. code-block:: none INFO - 09:24:14: INFO - 09:24:14: *** Start DOE Scenario execution *** INFO - 09:24:14: DOEScenario INFO - 09:24:14: Disciplines: PropulsionScenario AerodynamicsScenario StructureScenario SobieskiMission INFO - 09:24:14: MDOFormulation: BiLevel INFO - 09:24:14: Algorithm: lhs INFO - 09:24:14: Optimization problem: INFO - 09:24:14: Minimize: y_4(x_shared) INFO - 09:24:14: With respect to: x_shared INFO - 09:24:14: DOE sampling: 0%| | 0/30 [00:00 .. GENERATED FROM PYTHON SOURCE LINES 175-177 Plot the scatter matrix ^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 177-181 .. code-block:: default system_scenario.post_process( "ScatterPlotMatrix", show=False, save=False, variables_list=["y_4", "x_shared"] ) .. image:: /examples/formulations/images/sphx_glr_plot_doe_sobieski_bilevel_example_004.png :alt: plot doe sobieski bilevel example :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out Out: .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 182-184 Plot parallel coordinates ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 184-186 .. code-block:: default system_scenario.post_process("ParallelCoordinates", show=False, save=False) .. rst-class:: sphx-glr-horizontal * .. image:: /examples/formulations/images/sphx_glr_plot_doe_sobieski_bilevel_example_005.png :alt: Design variables history colored by 'y_4' value :class: sphx-glr-multi-img * .. image:: /examples/formulations/images/sphx_glr_plot_doe_sobieski_bilevel_example_006.png :alt: Objective function and constraints history colored by 'y_4' value :class: sphx-glr-multi-img .. rst-class:: sphx-glr-script-out Out: .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 187-189 Plot correlations ^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 189-192 .. code-block:: default system_scenario.post_process("Correlations", show=False, save=False) # Workaround for HTML rendering, instead of ``show=True`` plt.show() .. rst-class:: sphx-glr-script-out Out: .. code-block:: none INFO - 09:24:26: Detected 0 correlations > 0.95 .. rst-class:: sphx-glr-timing **Total running time of the script:** ( 0 minutes 12.087 seconds) .. _sphx_glr_download_examples_formulations_plot_doe_sobieski_bilevel_example.py: .. only :: html .. container:: sphx-glr-footer :class: sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_doe_sobieski_bilevel_example.py ` .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_doe_sobieski_bilevel_example.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_