.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "examples/formulations/plot_doe_sobieski_mdf_example.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. .. rst-class:: sphx-glr-example-title .. _sphx_glr_examples_formulations_plot_doe_sobieski_mdf_example.py: MDF-based DOE on the Sobieski SSBJ test case ============================================ .. GENERATED FROM PYTHON SOURCE LINES 24-38 .. code-block:: Python from __future__ import annotations from os import name as os_name from gemseo import configure_logger from gemseo import create_discipline from gemseo import create_scenario from gemseo import generate_n2_plot from gemseo.algos.doe.pydoe.settings.pydoe_lhs import PYDOE_LHS_Settings from gemseo.problems.mdo.sobieski.core.design_space import SobieskiDesignSpace configure_logger() .. rst-class:: sphx-glr-script-out .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 39-46 Instantiate the disciplines ---------------------------- First, we instantiate the four disciplines of the use case: :class:`.SobieskiPropulsion`, :class:`.SobieskiAerodynamics`, :class:`.SobieskiMission` and :class:`.SobieskiStructure`. .. GENERATED FROM PYTHON SOURCE LINES 46-53 .. code-block:: Python disciplines = create_discipline([ "SobieskiPropulsion", "SobieskiAerodynamics", "SobieskiMission", "SobieskiStructure", ]) .. GENERATED FROM PYTHON SOURCE LINES 54-57 We can quickly access the most relevant information of any discipline (name, inputs, and outputs) with Python's ``print()`` function. Moreover, we can get the default input values of a discipline with the attribute :attr:`.Discipline.default_input_data` .. GENERATED FROM PYTHON SOURCE LINES 57-61 .. code-block:: Python for discipline in disciplines: print(discipline) print(f"Default inputs: {discipline.default_input_data}") .. rst-class:: sphx-glr-script-out .. code-block:: none SobieskiPropulsion Default inputs: {'y_23': array([12562.01206488]), 'x_3': array([0.5]), 'x_shared': array([5.0e-02, 4.5e+04, 1.6e+00, 5.5e+00, 5.5e+01, 1.0e+03]), 'c_3': array([4360.])} SobieskiAerodynamics Default inputs: {'x_2': array([1.]), 'y_32': array([0.50279625]), 'x_shared': array([5.0e-02, 4.5e+04, 1.6e+00, 5.5e+00, 5.5e+01, 1.0e+03]), 'y_12': array([5.06069742e+04, 9.50000000e-01]), 'c_4': array([0.01375])} SobieskiMission Default inputs: {'y_14': array([50606.9741711 , 7306.20262124]), 'x_shared': array([5.0e-02, 4.5e+04, 1.6e+00, 5.5e+00, 5.5e+01, 1.0e+03]), 'y_24': array([4.15006276]), 'y_34': array([1.10754577])} SobieskiStructure Default inputs: {'y_21': array([50606.9741711]), 'y_31': array([6354.32430691]), 'x_1': array([0.25, 1. ]), 'x_shared': array([5.0e-02, 4.5e+04, 1.6e+00, 5.5e+00, 5.5e+01, 1.0e+03]), 'c_0': array([2000.]), 'c_1': array([25000.]), 'c_2': array([6.])} .. GENERATED FROM PYTHON SOURCE LINES 62-66 You may also be interested in plotting the couplings of your disciplines. A quick way of getting this information is the high-level function :func:`.generate_n2_plot`. A much more detailed explanation of coupling visualization is available :ref:`here `. .. GENERATED FROM PYTHON SOURCE LINES 66-68 .. code-block:: Python generate_n2_plot(disciplines, save=False, show=True) .. image-sg:: /examples/formulations/images/sphx_glr_plot_doe_sobieski_mdf_example_001.png :alt: plot doe sobieski mdf example :srcset: /examples/formulations/images/sphx_glr_plot_doe_sobieski_mdf_example_001.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 69-77 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 77-80 .. code-block:: Python design_space = SobieskiDesignSpace() design_space .. raw:: html
Sobieski design space:
Name Lower bound Value Upper bound Type
x_shared[0] 0.01 0.05 0.09 float
x_shared[1] 30000 45000 60000 float
x_shared[2] 1.4 1.6 1.8 float
x_shared[3] 2.5 5.5 8.5 float
x_shared[4] 40 55 70 float
x_shared[5] 500 1000 1500 float
x_1[0] 0.1 0.25 0.4 float
x_1[1] 0.75 1 1.25 float
x_2 0.75 1 1.25 float
x_3 0.1 0.5 1 float
y_14[0] 24850 50606.9741711 77100 float
y_14[1] -7700 7306.20262124 45000 float
y_32 0.235 0.5027962499999999 0.795 float
y_31 2960 6354.32430691 10185 float
y_24 0.44 4.15006276 11.13 float
y_34 0.44 1.10754577 1.98 float
y_23 3365 12194.2671934 26400 float
y_21 24850 50606.9741711 77250 float
y_12[0] 24850 50606.9742 77250 float
y_12[1] 0.45 0.95 1.5 float


.. GENERATED FROM PYTHON SOURCE LINES 81-83 Instantiate the scenario ^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 83-92 .. code-block:: Python scenario = create_scenario( disciplines, "y_4", design_space, maximize_objective=True, scenario_type="DOE", formulation_name="MDF", ) .. rst-class:: sphx-glr-script-out .. code-block:: none WARNING - 08:37:27: Unsupported feature 'minItems' in JSONGrammar 'SobieskiMission_discipline_output' for property 'y_4' in conversion to SimpleGrammar. WARNING - 08:37:27: Unsupported feature 'maxItems' in JSONGrammar 'SobieskiMission_discipline_output' for property 'y_4' in conversion to SimpleGrammar. .. GENERATED FROM PYTHON SOURCE LINES 93-95 Set the design constraints ^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 95-98 .. code-block:: Python for constraint in ["g_1", "g_2", "g_3"]: scenario.add_constraint(constraint, constraint_type="ineq") .. GENERATED FROM PYTHON SOURCE LINES 99-106 Visualize the XDSM ^^^^^^^^^^^^^^^^^^ Generate the XDSM on the fly: - ``log_workflow_status=True`` will log the status of the workflow in the console, - ``save_html`` (default ``True``) will generate a self-contained HTML file, that can be automatically opened using ``show_html=True``. .. GENERATED FROM PYTHON SOURCE LINES 106-108 .. code-block:: Python scenario.xdsmize(save_html=False, pdf_build=False) .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 109-112 Execute the scenario ^^^^^^^^^^^^^^^^^^^^ Use provided analytic derivatives .. GENERATED FROM PYTHON SOURCE LINES 112-114 .. code-block:: Python scenario.set_differentiation_method() .. GENERATED FROM PYTHON SOURCE LINES 115-120 Multiprocessing ^^^^^^^^^^^^^^^ It is possible to run a DOE in parallel using multiprocessing, in order to do this, we specify the number of processes to be used for the computation of the samples. .. GENERATED FROM PYTHON SOURCE LINES 122-129 .. warning:: The multiprocessing option has some limitations on Windows. Due to problems with sphinx, we disable it in this example. The features :class:`.MemoryFullCache` and :class:`.HDF5Cache` are not available for multiprocessing on Windows. As an alternative, we recommend the method :meth:`.DOEScenario.set_optimization_history_backup`. .. GENERATED FROM PYTHON SOURCE LINES 131-135 We define the algorithm settings. Here the criterion "center" of pyDOE centers the points within the sampling intervals. Note that it is also possible to pass the settings one by one, see :ref:`algorithm_settings`. .. GENERATED FROM PYTHON SOURCE LINES 135-148 .. code-block:: Python lhs_settings = PYDOE_LHS_Settings( n_samples=30, criterion="center", # Evaluate gradient of the MDA # with coupled adjoint eval_jac=True, # Run in parallel on 1 or 4 processors n_processes=1 if os_name == "nt" else 4, ) scenario.execute(lhs_settings) .. rst-class:: sphx-glr-script-out .. code-block:: none INFO - 08:37:27: INFO - 08:37:27: *** Start DOEScenario execution *** INFO - 08:37:27: DOEScenario INFO - 08:37:27: Disciplines: SobieskiAerodynamics SobieskiMission SobieskiPropulsion SobieskiStructure INFO - 08:37:27: MDO formulation: MDF INFO - 08:37:27: Optimization problem: INFO - 08:37:27: minimize -y_4(x_shared, x_1, x_2, x_3) INFO - 08:37:27: with respect to x_1, x_2, x_3, x_shared INFO - 08:37:27: subject to constraints: INFO - 08:37:27: g_1(x_shared, x_1, x_2, x_3) <= 0 INFO - 08:37:27: g_2(x_shared, x_1, x_2, x_3) <= 0 INFO - 08:37:27: g_3(x_shared, x_1, x_2, x_3) <= 0 INFO - 08:37:27: over the design space: INFO - 08:37:27: +-------------+-------------+-------+-------------+-------+ INFO - 08:37:27: | Name | Lower bound | Value | Upper bound | Type | INFO - 08:37:27: +-------------+-------------+-------+-------------+-------+ INFO - 08:37:27: | x_shared[0] | 0.01 | 0.05 | 0.09 | float | INFO - 08:37:27: | x_shared[1] | 30000 | 45000 | 60000 | float | INFO - 08:37:27: | x_shared[2] | 1.4 | 1.6 | 1.8 | float | INFO - 08:37:27: | x_shared[3] | 2.5 | 5.5 | 8.5 | float | INFO - 08:37:27: | x_shared[4] | 40 | 55 | 70 | float | INFO - 08:37:27: | x_shared[5] | 500 | 1000 | 1500 | float | INFO - 08:37:27: | x_1[0] | 0.1 | 0.25 | 0.4 | float | INFO - 08:37:27: | x_1[1] | 0.75 | 1 | 1.25 | float | INFO - 08:37:27: | x_2 | 0.75 | 1 | 1.25 | float | INFO - 08:37:27: | x_3 | 0.1 | 0.5 | 1 | float | INFO - 08:37:27: +-------------+-------------+-------+-------------+-------+ INFO - 08:37:27: Solving optimization problem with algorithm PYDOE_LHS: INFO - 08:37:27: Running DOE in parallel on n_processes = 4 INFO - 08:37:27: 3%|▎ | 1/30 [00:00<00:11, 2.51 it/sec, obj=-222] INFO - 08:37:27: 7%|▋ | 2/30 [00:00<00:05, 4.98 it/sec, obj=-285] INFO - 08:37:27: 10%|█ | 3/30 [00:00<00:04, 6.55 it/sec, obj=-567] INFO - 08:37:27: 13%|█▎ | 4/30 [00:00<00:03, 7.23 it/sec, obj=-344] INFO - 08:37:27: 17%|█▋ | 5/30 [00:00<00:03, 6.94 it/sec, obj=-429] INFO - 08:37:27: 20%|██ | 6/30 [00:00<00:02, 8.22 it/sec, obj=-235] INFO - 08:37:27: 23%|██▎ | 7/30 [00:00<00:02, 8.50 it/sec, obj=-481] INFO - 08:37:27: 27%|██▋ | 8/30 [00:00<00:02, 9.68 it/sec, obj=-519] INFO - 08:37:28: 30%|███ | 9/30 [00:01<00:02, 8.70 it/sec, obj=-556] INFO - 08:37:28: 33%|███▎ | 10/30 [00:01<00:02, 9.24 it/sec, obj=-419] INFO - 08:37:28: 37%|███▋ | 11/30 [00:01<00:01, 9.71 it/sec, obj=-306] INFO - 08:37:28: 40%|████ | 12/30 [00:01<00:01, 10.46 it/sec, obj=-538] INFO - 08:37:28: 43%|████▎ | 13/30 [00:01<00:01, 9.50 it/sec, obj=-495] INFO - 08:37:28: 47%|████▋ | 14/30 [00:01<00:01, 10.02 it/sec, obj=-621] INFO - 08:37:28: 50%|█████ | 15/30 [00:01<00:01, 10.70 it/sec, obj=-433] INFO - 08:37:28: 53%|█████▎ | 16/30 [00:01<00:01, 11.22 it/sec, obj=-574] INFO - 08:37:28: 57%|█████▋ | 17/30 [00:01<00:01, 10.47 it/sec, obj=-1.07e+3] INFO - 08:37:28: 60%|██████ | 18/30 [00:01<00:01, 10.85 it/sec, obj=-481] INFO - 08:37:28: 63%|██████▎ | 19/30 [00:01<00:00, 11.00 it/sec, obj=-287] INFO - 08:37:28: 67%|██████▋ | 20/30 [00:01<00:00, 11.57 it/sec, obj=-602] INFO - 08:37:28: 70%|███████ | 21/30 [00:01<00:00, 10.99 it/sec, obj=-247] INFO - 08:37:29: 73%|███████▎ | 22/30 [00:01<00:00, 11.12 it/sec, obj=-414] INFO - 08:37:29: 77%|███████▋ | 23/30 [00:01<00:00, 11.50 it/sec, obj=-1.18e+3] INFO - 08:37:29: 80%|████████ | 24/30 [00:02<00:00, 11.42 it/sec, obj=-273] INFO - 08:37:29: 83%|████████▎ | 25/30 [00:02<00:00, 11.33 it/sec, obj=-624] INFO - 08:37:29: 87%|████████▋ | 26/30 [00:02<00:00, 11.73 it/sec, obj=-606] INFO - 08:37:29: 90%|█████████ | 27/30 [00:02<00:00, 11.79 it/sec, obj=-383] INFO - 08:37:29: 93%|█████████▎| 28/30 [00:02<00:00, 11.53 it/sec, obj=-351] INFO - 08:37:29: 97%|█████████▋| 29/30 [00:02<00:00, 11.87 it/sec, obj=-405] INFO - 08:37:29: 100%|██████████| 30/30 [00:02<00:00, 12.17 it/sec, obj=-485] INFO - 08:37:29: Optimization result: INFO - 08:37:29: Optimizer info: INFO - 08:37:29: Status: None INFO - 08:37:29: Message: None INFO - 08:37:29: Number of calls to the objective function by the optimizer: 30 INFO - 08:37:29: Solution: INFO - 08:37:29: The solution is feasible. INFO - 08:37:29: Objective: -485.49213288049987 INFO - 08:37:29: Standardized constraints: INFO - 08:37:29: g_1 = [-0.11350951 -0.10812292 -0.1045109 -0.10204971 -0.10028641 -0.01838903 INFO - 08:37:29: -0.22161097] INFO - 08:37:29: g_2 = -0.02400000000000002 INFO - 08:37:29: g_3 = [-0.33063169 -0.66936831 -0.73821755 -0.07789536] INFO - 08:37:29: Design space: INFO - 08:37:29: +-------------+-------------+---------------------+-------------+-------+ INFO - 08:37:29: | Name | Lower bound | Value | Upper bound | Type | INFO - 08:37:29: +-------------+-------------+---------------------+-------------+-------+ INFO - 08:37:29: | x_shared[0] | 0.01 | 0.05400000000000001 | 0.09 | float | INFO - 08:37:29: | x_shared[1] | 30000 | 46500 | 60000 | float | INFO - 08:37:29: | x_shared[2] | 1.4 | 1.686666666666667 | 1.8 | float | INFO - 08:37:29: | x_shared[3] | 2.5 | 5.2 | 8.5 | float | INFO - 08:37:29: | x_shared[4] | 40 | 66.5 | 70 | float | INFO - 08:37:29: | x_shared[5] | 500 | 583.3333333333334 | 1500 | float | INFO - 08:37:29: | x_1[0] | 0.1 | 0.185 | 0.4 | float | INFO - 08:37:29: | x_1[1] | 0.75 | 0.9416666666666667 | 1.25 | float | INFO - 08:37:29: | x_2 | 0.75 | 0.775 | 1.25 | float | INFO - 08:37:29: | x_3 | 0.1 | 0.115 | 1 | float | INFO - 08:37:29: +-------------+-------------+---------------------+-------------+-------+ INFO - 08:37:29: *** End DOEScenario execution (time: 0:00:02.517307) *** .. GENERATED FROM PYTHON SOURCE LINES 149-155 .. warning:: On Windows, the progress bar may show duplicated instances during the initialization of each subprocess. In some cases it may also print the conclusion of an iteration ahead of another one that was concluded first. This is a consequence of the pickling process and does not affect the computations of the scenario. .. GENERATED FROM PYTHON SOURCE LINES 157-162 Exporting the problem data. ^^^^^^^^^^^^^^^^^^^^^^^^^^^ After the execution of the scenario, you may want to export your data to use it elsewhere. The method :meth:`.Scenario.to_dataset` will allow you to export your results to a :class:`.Dataset`, the basic |g| class to store data. .. GENERATED FROM PYTHON SOURCE LINES 162-164 .. code-block:: Python dataset = scenario.to_dataset("a_name_for_my_dataset") .. GENERATED FROM PYTHON SOURCE LINES 165-167 Plot the optimization history view ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 167-169 .. code-block:: Python scenario.post_process(post_name="OptHistoryView", save=False, show=True) .. rst-class:: sphx-glr-horizontal * .. image-sg:: /examples/formulations/images/sphx_glr_plot_doe_sobieski_mdf_example_002.png :alt: Evolution of the optimization variables :srcset: /examples/formulations/images/sphx_glr_plot_doe_sobieski_mdf_example_002.png :class: sphx-glr-multi-img * .. image-sg:: /examples/formulations/images/sphx_glr_plot_doe_sobieski_mdf_example_003.png :alt: Evolution of the objective value :srcset: /examples/formulations/images/sphx_glr_plot_doe_sobieski_mdf_example_003.png :class: sphx-glr-multi-img * .. image-sg:: /examples/formulations/images/sphx_glr_plot_doe_sobieski_mdf_example_004.png :alt: Evolution of the distance to the optimum :srcset: /examples/formulations/images/sphx_glr_plot_doe_sobieski_mdf_example_004.png :class: sphx-glr-multi-img * .. image-sg:: /examples/formulations/images/sphx_glr_plot_doe_sobieski_mdf_example_005.png :alt: Evolution of the inequality constraints :srcset: /examples/formulations/images/sphx_glr_plot_doe_sobieski_mdf_example_005.png :class: sphx-glr-multi-img .. rst-class:: sphx-glr-script-out .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 170-177 .. tip:: Each post-processing method requires different inputs and offers a variety of customization options. Use the high-level function :func:`.get_post_processing_options_schema` to print a table with the attributes for any post-processing algo. Or refer to our dedicated page: :ref:`gen_post_algos`. .. GENERATED FROM PYTHON SOURCE LINES 179-181 Plot the scatter matrix ^^^^^^^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 181-188 .. code-block:: Python scenario.post_process( post_name="ScatterPlotMatrix", save=False, show=True, variable_names=["y_4", "x_shared"], ) .. image-sg:: /examples/formulations/images/sphx_glr_plot_doe_sobieski_mdf_example_006.png :alt: plot doe sobieski mdf example :srcset: /examples/formulations/images/sphx_glr_plot_doe_sobieski_mdf_example_006.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 189-191 Plot correlations ^^^^^^^^^^^^^^^^^ .. GENERATED FROM PYTHON SOURCE LINES 191-192 .. code-block:: Python scenario.post_process(post_name="Correlations", save=False, show=True) .. image-sg:: /examples/formulations/images/sphx_glr_plot_doe_sobieski_mdf_example_007.png :alt: 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 :srcset: /examples/formulations/images/sphx_glr_plot_doe_sobieski_mdf_example_007.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none INFO - 08:37:33: Detected 10 correlations > 0.95 .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 7.008 seconds) .. _sphx_glr_download_examples_formulations_plot_doe_sobieski_mdf_example.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_doe_sobieski_mdf_example.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_doe_sobieski_mdf_example.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: plot_doe_sobieski_mdf_example.zip ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_