.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "examples/multi_objective/plot_pareto_front_binhkorn_bilevel.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_multi_objective_plot_pareto_front_binhkorn_bilevel.py: Pareto front on the Binh and Korn problem using a BiLevel formulation ===================================================================== In this example, we illustrate the computation of a Pareto front plot for the Binh and Korn problem. We use a BiLevel formulation in order to only compute the Pareto-optimal points. .. GENERATED FROM PYTHON SOURCE LINES 31-35 Import ------ The first step is to import some high-level functions and to configure the logger. .. GENERATED FROM PYTHON SOURCE LINES 35-49 .. code-block:: Python from __future__ import annotations from logging import WARNING from numpy import array from gemseo import configure_logger from gemseo import create_design_space from gemseo import create_discipline from gemseo import create_scenario configure_logger() .. rst-class:: sphx-glr-script-out .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 50-56 Definition of the disciplines ----------------------------- In this example, we create the Binh and Korn disciplines from scratch by declaring their expressions and using the :class:`.AnalyticDiscipline`. .. GENERATED FROM PYTHON SOURCE LINES 56-64 .. code-block:: Python expr_binh_korn = { "obj1": "4*x1**2 + 4*x2**2", "obj2": "(x1-5.)**2 + (x2-5.)**2", "cstr1": "(x1-5.)**2 + x2**2 - 25.", "cstr2": "-(x1-8.)**2 - (x2+3)**2 + 7.7", } .. GENERATED FROM PYTHON SOURCE LINES 65-67 This constraint will be used to set `obj1` to a target value for the lower-level scenario. .. GENERATED FROM PYTHON SOURCE LINES 67-70 .. code-block:: Python expr_cstr_obj1_target = {"cstr3": "obj1 - obj1_target"} .. GENERATED FROM PYTHON SOURCE LINES 71-75 Instantiation of the disciplines -------------------------------- Here, we create the disciplines from their expressions. .. GENERATED FROM PYTHON SOURCE LINES 75-83 .. code-block:: Python discipline_binh_korn = create_discipline( "AnalyticDiscipline", expressions=expr_binh_korn ) discipline_cstr_obj1 = create_discipline( "AnalyticDiscipline", expressions=expr_cstr_obj1_target ) .. GENERATED FROM PYTHON SOURCE LINES 84-86 Definition of the lower-level design space ------------------------------------------ .. GENERATED FROM PYTHON SOURCE LINES 86-100 .. code-block:: Python design_space = create_design_space() design_space.add_variable( "x1", lower_bound=array([0.0]), upper_bound=array([5.0]), value=array([2.0]) ) design_space.add_variable( "x2", lower_bound=array([-5.0]), upper_bound=array([3.0]), value=array([2.0]) ) disciplines = [ discipline_binh_korn, discipline_cstr_obj1, ] .. GENERATED FROM PYTHON SOURCE LINES 101-104 Creation of the lower-level scenario ------------------------------------ This scenario aims at finding the `obj2` optimal value for a specific value of `obj1`. .. GENERATED FROM PYTHON SOURCE LINES 104-114 .. code-block:: Python sub_scenario = create_scenario( disciplines, "obj2", design_space, formulation_name="DisciplinaryOpt", ) sub_scenario.set_algorithm(algo_name="NLOPT_SLSQP", max_iter=100) .. GENERATED FROM PYTHON SOURCE LINES 115-116 We add the Binh and Korn problem constraints. .. GENERATED FROM PYTHON SOURCE LINES 116-119 .. code-block:: Python sub_scenario.add_constraint("cstr1", constraint_type="ineq") sub_scenario.add_constraint("cstr2", constraint_type="ineq") .. GENERATED FROM PYTHON SOURCE LINES 120-124 Creation of the design space for the system-level scenario ---------------------------------------------------------- At the system level, we will fix a target for the `obj1` value of the lower-level scenario. .. GENERATED FROM PYTHON SOURCE LINES 124-132 .. code-block:: Python system_design_space = create_design_space() system_design_space.add_variable( "obj1_target", lower_bound=array([0.1]), upper_bound=array([100.0]), value=array([1.0]), ) .. GENERATED FROM PYTHON SOURCE LINES 133-140 Creation of the system-level DOE Scenario ----------------------------------------- The system-level scenario will perform a DOE over the `obj1_target` variable. We will use the `BiLevel` formulation to nest the lower-level scenario into the DOE. The log level for the sub scenarios is set to `WARNING` to avoid getting the complete log of each sub scenario, which would be too verbose. Set it to `INFO` if you wish to keep the logs of each sub scenario as well. .. GENERATED FROM PYTHON SOURCE LINES 140-150 .. code-block:: Python system_scenario = create_scenario( sub_scenario, "obj1", system_design_space, scenario_type="DOE", formulation_name="BiLevel", sub_scenarios_log_level=WARNING, ) .. rst-class:: sphx-glr-script-out .. code-block:: none WARNING - 08:35:51: No strongly coupled disciplines detected, MDA1 is disabled in the BiLevel formulation .. GENERATED FROM PYTHON SOURCE LINES 151-160 Add the system-level constraint and observables ----------------------------------------------- Here, we add the constraint on the `obj1_target`, this way we make sure that the lower-level scenario will respect the target imposed by the system. The BiLevel formulation will automatically add the constraints from the system-level to the lower-level, if you wish to handle the constraints manually, pass `apply_cstr_tosub_scenarios=False` as an argument to `create_scenario`. Note that `obj2` shall be added as an observable of `scenario_doe`, otherwise it cannot be used by the ParetoFront post-processing. .. GENERATED FROM PYTHON SOURCE LINES 160-163 .. code-block:: Python system_scenario.add_constraint("cstr3") system_scenario.add_observable("obj2") system_scenario.xdsmize(save_html=False, pdf_build=False) .. raw:: html


.. GENERATED FROM PYTHON SOURCE LINES 164-167 Run the scenario ---------------- Finally, we run a full-factorial DOE using 100 samples and run the post-processing. .. GENERATED FROM PYTHON SOURCE LINES 167-171 .. code-block:: Python system_scenario.execute(algo_name="PYDOE_FULLFACT", n_samples=50) system_scenario.post_process( post_name="ParetoFront", objectives=["obj1", "obj2"], save=False, show=True ) .. image-sg:: /examples/multi_objective/images/sphx_glr_plot_pareto_front_binhkorn_bilevel_001.png :alt: Pareto front :srcset: /examples/multi_objective/images/sphx_glr_plot_pareto_front_binhkorn_bilevel_001.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none INFO - 08:35:51: INFO - 08:35:51: *** Start DOEScenario execution *** INFO - 08:35:51: DOEScenario INFO - 08:35:51: Disciplines: MDOScenario INFO - 08:35:51: MDO formulation: BiLevel INFO - 08:35:51: Optimization problem: INFO - 08:35:51: minimize obj1(obj1_target) INFO - 08:35:51: with respect to obj1_target INFO - 08:35:51: subject to constraints: INFO - 08:35:51: cstr3(obj1_target) == 0 INFO - 08:35:51: over the design space: INFO - 08:35:51: +-------------+-------------+-------+-------------+-------+ INFO - 08:35:51: | Name | Lower bound | Value | Upper bound | Type | INFO - 08:35:51: +-------------+-------------+-------+-------------+-------+ INFO - 08:35:51: | obj1_target | 0.1 | 1 | 100 | float | INFO - 08:35:51: +-------------+-------------+-------+-------------+-------+ INFO - 08:35:51: Solving optimization problem with algorithm PYDOE_FULLFACT: INFO - 08:35:51: 2%|▏ | 1/50 [00:00<00:03, 13.73 it/sec, obj=0.108] INFO - 08:35:51: 4%|▍ | 2/50 [00:00<00:02, 17.76 it/sec, obj=2.14] INFO - 08:35:51: 6%|▌ | 3/50 [00:00<00:02, 21.02 it/sec, obj=4.18] INFO - 08:35:51: 8%|▊ | 4/50 [00:00<00:01, 23.45 it/sec, obj=6.22] INFO - 08:35:51: 10%|█ | 5/50 [00:00<00:01, 25.09 it/sec, obj=8.26] INFO - 08:35:51: 12%|█▏ | 6/50 [00:00<00:01, 25.85 it/sec, obj=10.3] INFO - 08:35:51: 14%|█▍ | 7/50 [00:00<00:01, 26.19 it/sec, obj=12.3] INFO - 08:35:52: 16%|█▌ | 8/50 [00:00<00:01, 26.48 it/sec, obj=14.4] INFO - 08:35:52: 18%|█▊ | 9/50 [00:00<00:01, 26.81 it/sec, obj=16.4] INFO - 08:35:52: 20%|██ | 10/50 [00:00<00:01, 27.06 it/sec, obj=18.5] INFO - 08:35:52: 22%|██▏ | 11/50 [00:00<00:01, 27.78 it/sec, obj=20.5] INFO - 08:35:52: 24%|██▍ | 12/50 [00:00<00:01, 28.39 it/sec, obj=22.5] INFO - 08:35:52: 26%|██▌ | 13/50 [00:00<00:01, 28.94 it/sec, obj=24.6] INFO - 08:35:52: 28%|██▊ | 14/50 [00:00<00:01, 29.43 it/sec, obj=26.6] INFO - 08:35:52: 30%|███ | 15/50 [00:00<00:01, 29.86 it/sec, obj=28.6] INFO - 08:35:52: 32%|███▏ | 16/50 [00:00<00:01, 30.25 it/sec, obj=30.7] INFO - 08:35:52: 34%|███▍ | 17/50 [00:00<00:01, 30.54 it/sec, obj=32.7] INFO - 08:35:52: 36%|███▌ | 18/50 [00:00<00:01, 30.74 it/sec, obj=34.8] INFO - 08:35:52: 38%|███▊ | 19/50 [00:00<00:00, 31.03 it/sec, obj=36.8] INFO - 08:35:52: 40%|████ | 20/50 [00:00<00:00, 30.08 it/sec, obj=38.8] INFO - 08:35:52: 42%|████▏ | 21/50 [00:00<00:00, 30.34 it/sec, obj=40.9] INFO - 08:35:52: 44%|████▍ | 22/50 [00:00<00:00, 30.59 it/sec, obj=42.9] INFO - 08:35:52: 46%|████▌ | 23/50 [00:00<00:00, 30.40 it/sec, obj=45] INFO - 08:35:52: 48%|████▊ | 24/50 [00:00<00:00, 30.59 it/sec, obj=47] INFO - 08:35:52: 50%|█████ | 25/50 [00:00<00:00, 30.78 it/sec, obj=49] INFO - 08:35:52: 52%|█████▏ | 26/50 [00:00<00:00, 30.62 it/sec, obj=51.1] INFO - 08:35:52: 54%|█████▍ | 27/50 [00:00<00:00, 30.77 it/sec, obj=53.1] INFO - 08:35:52: 56%|█████▌ | 28/50 [00:00<00:00, 30.92 it/sec, obj=55.1] INFO - 08:35:52: 58%|█████▊ | 29/50 [00:00<00:00, 31.07 it/sec, obj=57.2] INFO - 08:35:52: 60%|██████ | 30/50 [00:00<00:00, 31.21 it/sec, obj=59.2] INFO - 08:35:52: 62%|██████▏ | 31/50 [00:00<00:00, 31.33 it/sec, obj=61.3] INFO - 08:35:52: 64%|██████▍ | 32/50 [00:01<00:00, 31.37 it/sec, obj=63.3] ERROR - 08:35:52: NLopt run failed: NLopt roundoff-limited, RoundoffLimited Traceback (most recent call last): File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/gemseo/algos/opt/nlopt/nlopt.py", line 384, in _run nlopt_problem.optimize(x_0.real) File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/nlopt/nlopt.py", line 335, in optimize return _nlopt.opt_optimize(self, *args) nlopt.RoundoffLimited: NLopt roundoff-limited INFO - 08:35:52: 66%|██████▌ | 33/50 [00:01<00:00, 31.51 it/sec, obj=65.3] INFO - 08:35:52: 68%|██████▊ | 34/50 [00:01<00:00, 31.62 it/sec, obj=67.4] INFO - 08:35:52: 70%|███████ | 35/50 [00:01<00:00, 31.73 it/sec, obj=69.4] INFO - 08:35:52: 72%|███████▏ | 36/50 [00:01<00:00, 31.90 it/sec, obj=71.5] INFO - 08:35:52: 74%|███████▍ | 37/50 [00:01<00:00, 32.19 it/sec, obj=73.5] ERROR - 08:35:52: NLopt run failed: NLopt roundoff-limited, RoundoffLimited Traceback (most recent call last): File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/gemseo/algos/opt/nlopt/nlopt.py", line 384, in _run nlopt_problem.optimize(x_0.real) File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/nlopt/nlopt.py", line 335, in optimize return _nlopt.opt_optimize(self, *args) nlopt.RoundoffLimited: NLopt roundoff-limited INFO - 08:35:52: 76%|███████▌ | 38/50 [00:01<00:00, 32.49 it/sec, obj=75.5] INFO - 08:35:52: 78%|███████▊ | 39/50 [00:01<00:00, 32.76 it/sec, obj=77.6] ERROR - 08:35:52: NLopt run failed: NLopt roundoff-limited, RoundoffLimited Traceback (most recent call last): File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/gemseo/algos/opt/nlopt/nlopt.py", line 384, in _run nlopt_problem.optimize(x_0.real) File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/nlopt/nlopt.py", line 335, in optimize return _nlopt.opt_optimize(self, *args) nlopt.RoundoffLimited: NLopt roundoff-limited INFO - 08:35:52: 80%|████████ | 40/50 [00:01<00:00, 33.10 it/sec, obj=79.6] ERROR - 08:35:52: NLopt run failed: NLopt roundoff-limited, RoundoffLimited Traceback (most recent call last): File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/gemseo/algos/opt/nlopt/nlopt.py", line 384, in _run nlopt_problem.optimize(x_0.real) File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/nlopt/nlopt.py", line 335, in optimize return _nlopt.opt_optimize(self, *args) nlopt.RoundoffLimited: NLopt roundoff-limited INFO - 08:35:52: 82%|████████▏ | 41/50 [00:01<00:00, 33.42 it/sec, obj=81.7] ERROR - 08:35:52: NLopt run failed: NLopt roundoff-limited, RoundoffLimited Traceback (most recent call last): File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/gemseo/algos/opt/nlopt/nlopt.py", line 384, in _run nlopt_problem.optimize(x_0.real) File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/nlopt/nlopt.py", line 335, in optimize return _nlopt.opt_optimize(self, *args) nlopt.RoundoffLimited: NLopt roundoff-limited INFO - 08:35:52: 84%|████████▍ | 42/50 [00:01<00:00, 33.74 it/sec, obj=83.7] ERROR - 08:35:52: NLopt run failed: NLopt roundoff-limited, RoundoffLimited Traceback (most recent call last): File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/gemseo/algos/opt/nlopt/nlopt.py", line 384, in _run nlopt_problem.optimize(x_0.real) File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/nlopt/nlopt.py", line 335, in optimize return _nlopt.opt_optimize(self, *args) nlopt.RoundoffLimited: NLopt roundoff-limited INFO - 08:35:52: 86%|████████▌ | 43/50 [00:01<00:00, 33.98 it/sec, obj=85.7] ERROR - 08:35:52: NLopt run failed: NLopt roundoff-limited, RoundoffLimited Traceback (most recent call last): File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/gemseo/algos/opt/nlopt/nlopt.py", line 384, in _run nlopt_problem.optimize(x_0.real) File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/nlopt/nlopt.py", line 335, in optimize return _nlopt.opt_optimize(self, *args) nlopt.RoundoffLimited: NLopt roundoff-limited INFO - 08:35:52: 88%|████████▊ | 44/50 [00:01<00:00, 34.29 it/sec, obj=87.8] ERROR - 08:35:53: NLopt run failed: NLopt roundoff-limited, RoundoffLimited Traceback (most recent call last): File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/gemseo/algos/opt/nlopt/nlopt.py", line 384, in _run nlopt_problem.optimize(x_0.real) File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/nlopt/nlopt.py", line 335, in optimize return _nlopt.opt_optimize(self, *args) nlopt.RoundoffLimited: NLopt roundoff-limited INFO - 08:35:53: 90%|█████████ | 45/50 [00:01<00:00, 34.58 it/sec, obj=89.8] ERROR - 08:35:53: NLopt run failed: NLopt roundoff-limited, RoundoffLimited Traceback (most recent call last): File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/gemseo/algos/opt/nlopt/nlopt.py", line 384, in _run nlopt_problem.optimize(x_0.real) File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/nlopt/nlopt.py", line 335, in optimize return _nlopt.opt_optimize(self, *args) nlopt.RoundoffLimited: NLopt roundoff-limited INFO - 08:35:53: 92%|█████████▏| 46/50 [00:01<00:00, 34.87 it/sec, obj=91.8] INFO - 08:35:53: 94%|█████████▍| 47/50 [00:01<00:00, 35.12 it/sec, obj=93.9] ERROR - 08:35:53: NLopt run failed: NLopt roundoff-limited, RoundoffLimited Traceback (most recent call last): File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/gemseo/algos/opt/nlopt/nlopt.py", line 384, in _run nlopt_problem.optimize(x_0.real) File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/nlopt/nlopt.py", line 335, in optimize return _nlopt.opt_optimize(self, *args) nlopt.RoundoffLimited: NLopt roundoff-limited INFO - 08:35:53: 96%|█████████▌| 48/50 [00:01<00:00, 35.39 it/sec, obj=95.9] ERROR - 08:35:53: NLopt run failed: NLopt roundoff-limited, RoundoffLimited Traceback (most recent call last): File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/gemseo/algos/opt/nlopt/nlopt.py", line 384, in _run nlopt_problem.optimize(x_0.real) File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/nlopt/nlopt.py", line 335, in optimize return _nlopt.opt_optimize(self, *args) nlopt.RoundoffLimited: NLopt roundoff-limited INFO - 08:35:53: 98%|█████████▊| 49/50 [00:01<00:00, 35.66 it/sec, obj=98] ERROR - 08:35:53: NLopt run failed: NLopt roundoff-limited, RoundoffLimited Traceback (most recent call last): File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/gemseo/algos/opt/nlopt/nlopt.py", line 384, in _run nlopt_problem.optimize(x_0.real) File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.0.0/lib/python3.9/site-packages/nlopt/nlopt.py", line 335, in optimize return _nlopt.opt_optimize(self, *args) nlopt.RoundoffLimited: NLopt roundoff-limited INFO - 08:35:53: 100%|██████████| 50/50 [00:01<00:00, 35.91 it/sec, obj=100] INFO - 08:35:53: Optimization result: INFO - 08:35:53: Optimizer info: INFO - 08:35:53: Status: None INFO - 08:35:53: Message: None INFO - 08:35:53: Number of calls to the objective function by the optimizer: 50 INFO - 08:35:53: Solution: INFO - 08:35:53: The solution is feasible. INFO - 08:35:53: Objective: 0.10832777706440924 INFO - 08:35:53: Standardized constraints: INFO - 08:35:53: cstr3 = 0.008327777064409236 INFO - 08:35:53: Design space: INFO - 08:35:53: +-------------+-------------+-------+-------------+-------+ INFO - 08:35:53: | Name | Lower bound | Value | Upper bound | Type | INFO - 08:35:53: +-------------+-------------+-------+-------------+-------+ INFO - 08:35:53: | obj1_target | 0.1 | 0.1 | 100 | float | INFO - 08:35:53: +-------------+-------------+-------+-------------+-------+ INFO - 08:35:53: *** End DOEScenario execution (time: 0:00:01.397267) *** .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 1.692 seconds) .. _sphx_glr_download_examples_multi_objective_plot_pareto_front_binhkorn_bilevel.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_pareto_front_binhkorn_bilevel.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_pareto_front_binhkorn_bilevel.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: plot_pareto_front_binhkorn_bilevel.zip ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_