Note
Go to the end to download the full example code
Parametric scalable MDO problem - MDF¶
We define
a ScalableProblem
with a shared design variable of size 1
and 2 strongly coupled disciplines.
The first one has a local design variable of size 1
and a coupling variable of size 2
while the second one has a local design variable of size 3
and a coupling variable of size 4.
We would like to solve this MDO problem by means of an MDF formulation.
from __future__ import annotations
from gemseo import configure_logger
from gemseo import execute_algo
from gemseo import execute_post
from gemseo import generate_n2_plot
from gemseo.problems.scalable.parametric.core.scalable_discipline_settings import (
ScalableDisciplineSettings,
)
from gemseo.problems.scalable.parametric.scalable_problem import ScalableProblem
configure_logger()
<RootLogger root (INFO)>
Instantiation of the scalable problem¶
problem = ScalableProblem(
[ScalableDisciplineSettings(1, 2), ScalableDisciplineSettings(3, 4)], 1
)
Display the coupling structure¶
generate_n2_plot(problem.disciplines, save=False, show=True)

Solve the MDO using an MDF formulation¶
scenario = problem.create_scenario()
scenario.execute({"algo": "NLOPT_SLSQP", "max_iter": 100})
INFO - 16:25:10:
INFO - 16:25:10: *** Start MDOScenario execution ***
INFO - 16:25:10: MDOScenario
INFO - 16:25:10: Disciplines: MainDiscipline ScalableDiscipline[1] ScalableDiscipline[2]
INFO - 16:25:10: MDO formulation: MDF
INFO - 16:25:10: Optimization problem:
INFO - 16:25:10: minimize f(x_0, x_1, x_2)
INFO - 16:25:10: with respect to x_0, x_1, x_2
INFO - 16:25:10: subject to constraints:
INFO - 16:25:10: c_1(x_0, x_1, x_2) <= 0.0
INFO - 16:25:10: c_2(x_0, x_1, x_2) <= 0.0
INFO - 16:25:10: over the design space:
INFO - 16:25:10: | Parameter space |
INFO - 16:25:10: +------+-------------+-------+-------------+-------+----------------------+
INFO - 16:25:10: | name | lower_bound | value | upper_bound | type | Initial distribution |
INFO - 16:25:10: +------+-------------+-------+-------------+-------+----------------------+
INFO - 16:25:10: | x_0 | 0 | 0.5 | 1 | float | |
INFO - 16:25:10: | x_1 | 0 | 0.5 | 1 | float | |
INFO - 16:25:10: | x_2 | 0 | 0.5 | 1 | float | |
INFO - 16:25:10: | x_2 | 0 | 0.5 | 1 | float | |
INFO - 16:25:10: | x_2 | 0 | 0.5 | 1 | float | |
INFO - 16:25:10: +------+-------------+-------+-------------+-------+----------------------+
INFO - 16:25:10: Solving optimization problem with algorithm NLOPT_SLSQP:
INFO - 16:25:10: ... 0%| | 0/100 [00:00<?, ?it]
INFO - 16:25:10: ... 1%| | 1/100 [00:00<00:04, 20.67 it/sec, obj=1]
INFO - 16:25:10: ... 2%|▏ | 2/100 [00:00<00:09, 10.33 it/sec, obj=0.921]
INFO - 16:25:10: ... 3%|▎ | 3/100 [00:00<00:06, 15.46 it/sec, obj=0.513]
INFO - 16:25:10: ... 4%|▍ | 4/100 [00:00<00:09, 10.62 it/sec, obj=0.438]
INFO - 16:25:10: ... 5%|▌ | 5/100 [00:00<00:08, 11.26 it/sec, obj=0.418]
INFO - 16:25:10: ... 6%|▌ | 6/100 [00:00<00:08, 11.68 it/sec, obj=0.416]
INFO - 16:25:10: ... 7%|▋ | 7/100 [00:00<00:07, 11.96 it/sec, obj=0.415]
INFO - 16:25:10: ... 8%|▊ | 8/100 [00:00<00:07, 12.19 it/sec, obj=0.415]
INFO - 16:25:10: ... 9%|▉ | 9/100 [00:00<00:07, 12.38 it/sec, obj=0.415]
INFO - 16:25:11: ... 10%|█ | 10/100 [00:00<00:07, 12.54 it/sec, obj=0.415]
INFO - 16:25:11: ... 11%|█ | 11/100 [00:00<00:07, 12.66 it/sec, obj=0.415]
INFO - 16:25:11: ... 12%|█▏ | 12/100 [00:00<00:06, 12.76 it/sec, obj=0.415]
INFO - 16:25:11: ... 13%|█▎ | 13/100 [00:01<00:06, 12.85 it/sec, obj=0.415]
INFO - 16:25:11: ... 14%|█▍ | 14/100 [00:01<00:06, 13.81 it/sec, obj=Not evaluated]
INFO - 16:25:11: Optimization result:
INFO - 16:25:11: Optimizer info:
INFO - 16:25:11: Status: None
INFO - 16:25:11: Message: Successive iterates of the design variables are closer than xtol_rel or xtol_abs. GEMSEO Stopped the driver
INFO - 16:25:11: Number of calls to the objective function by the optimizer: 15
INFO - 16:25:11: Solution:
INFO - 16:25:11: The solution is feasible.
INFO - 16:25:11: Objective: 0.4147214934939103
INFO - 16:25:11: Standardized constraints:
INFO - 16:25:11: c_1 = [-0.32430624 -0.43254418]
INFO - 16:25:11: c_2 = [-5.55111512e-17 -2.51297019e-01 -2.35380057e-01 -4.99967998e-01]
INFO - 16:25:11: +---------------------------------------------------------------------------------------+
INFO - 16:25:11: | Parameter space |
INFO - 16:25:11: +------+-------------+---------------------+-------------+-------+----------------------+
INFO - 16:25:11: | name | lower_bound | value | upper_bound | type | Initial distribution |
INFO - 16:25:11: +------+-------------+---------------------+-------------+-------+----------------------+
INFO - 16:25:11: | x_0 | 0 | 0.4836327085400904 | 1 | float | |
INFO - 16:25:11: | x_1 | 0 | 0.9999999999999999 | 1 | float | |
INFO - 16:25:11: | x_2 | 0 | 0.08671672721432468 | 1 | float | |
INFO - 16:25:11: | x_2 | 0 | 0.9085358010297666 | 1 | float | |
INFO - 16:25:11: | x_2 | 0 | 0.2480176715968745 | 1 | float | |
INFO - 16:25:11: +------+-------------+---------------------+-------------+-------+----------------------+
INFO - 16:25:11: *** End MDOScenario execution (time: 0:00:01.029974) ***
{'max_iter': 100, 'algo': 'NLOPT_SLSQP'}
Post-process the results¶
scenario.post_process("OptHistoryView", save=False, show=True)
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/stable/lib/python3.9/site-packages/genson/schema/strategies/base.py:42: UserWarning: Schema incompatible. Keyword 'description' has conflicting values ('The width and height of the figure in inches, e.g. ``(w, h)``.\nIf ``None``, use the :attr:`.OptPostProcessor.DEFAULT_FIG_SIZE`\nof the post-processor.' vs. 'The width and height of the figure in inches, e.g. `(w, h)`.\nIf ``None``, use the :attr:`.OptPostProcessor.DEFAULT_FIG_SIZE`\nof the post-processor.'). Using 'The width and height of the figure in inches, e.g. ``(w, h)``.\nIf ``None``, use the :attr:`.OptPostProcessor.DEFAULT_FIG_SIZE`\nof the post-processor.'
warn(('Schema incompatible. Keyword {0!r} has conflicting '
<gemseo.post.opt_history_view.OptHistoryView object at 0x7ffaef9765b0>
Solve the associated quadratic programming problem¶
problem = problem.create_quadratic_programming_problem()
execute_algo(problem, algo_name="NLOPT_SLSQP", max_iter=100)
INFO - 16:25:12: Optimization problem:
INFO - 16:25:12: minimize f = 0.5x'Qx + c'x + d
INFO - 16:25:12: with respect to x
INFO - 16:25:12: subject to constraints:
INFO - 16:25:12: g: Ax-b <= 0 <= 0.0
INFO - 16:25:12: over the design space:
INFO - 16:25:12: +------+-------------+-------+-------------+-------+
INFO - 16:25:12: | name | lower_bound | value | upper_bound | type |
INFO - 16:25:12: +------+-------------+-------+-------------+-------+
INFO - 16:25:12: | x[0] | 0 | 0.5 | 1 | float |
INFO - 16:25:12: | x[1] | 0 | 0.5 | 1 | float |
INFO - 16:25:12: | x[2] | 0 | 0.5 | 1 | float |
INFO - 16:25:12: | x[3] | 0 | 0.5 | 1 | float |
INFO - 16:25:12: | x[4] | 0 | 0.5 | 1 | float |
INFO - 16:25:12: +------+-------------+-------+-------------+-------+
INFO - 16:25:12: Solving optimization problem with algorithm NLOPT_SLSQP:
INFO - 16:25:12: ... 0%| | 0/100 [00:00<?, ?it]
INFO - 16:25:12: ... 1%| | 1/100 [00:00<00:00, 1985.94 it/sec, obj=1]
INFO - 16:25:12: ... 2%|▏ | 2/100 [00:00<00:00, 555.87 it/sec, obj=0.921]
INFO - 16:25:12: ... 3%|▎ | 3/100 [00:00<00:00, 775.43 it/sec, obj=0.513]
INFO - 16:25:12: ... 4%|▍ | 4/100 [00:00<00:00, 496.93 it/sec, obj=0.438]
INFO - 16:25:12: ... 5%|▌ | 5/100 [00:00<00:00, 506.88 it/sec, obj=0.418]
INFO - 16:25:12: ... 6%|▌ | 6/100 [00:00<00:00, 516.54 it/sec, obj=0.416]
INFO - 16:25:12: ... 7%|▋ | 7/100 [00:00<00:00, 522.63 it/sec, obj=0.415]
INFO - 16:25:12: ... 8%|▊ | 8/100 [00:00<00:00, 528.77 it/sec, obj=0.415]
INFO - 16:25:12: ... 9%|▉ | 9/100 [00:00<00:00, 532.15 it/sec, obj=0.415]
INFO - 16:25:12: ... 10%|█ | 10/100 [00:00<00:00, 536.61 it/sec, obj=0.415]
INFO - 16:25:12: ... 11%|█ | 11/100 [00:00<00:00, 539.31 it/sec, obj=0.415]
INFO - 16:25:12: ... 12%|█▏ | 12/100 [00:00<00:00, 542.48 it/sec, obj=0.415]
INFO - 16:25:12: ... 13%|█▎ | 13/100 [00:00<00:00, 581.07 it/sec, obj=0.415]
INFO - 16:25:12: Optimization result:
INFO - 16:25:12: Optimizer info:
INFO - 16:25:12: Status: None
INFO - 16:25:12: Message: Successive iterates of the objective function are closer than ftol_rel or ftol_abs. GEMSEO Stopped the driver
INFO - 16:25:12: Number of calls to the objective function by the optimizer: 15
INFO - 16:25:12: Solution:
INFO - 16:25:12: The solution is feasible.
INFO - 16:25:12: Objective: 0.414721553468123
INFO - 16:25:12: Standardized constraints:
INFO - 16:25:12: g = [-3.24306238e-01 -4.32544172e-01 -4.44089210e-16 -2.51297007e-01
INFO - 16:25:12: -2.35380057e-01 -4.99968031e-01]
INFO - 16:25:12: Design space:
INFO - 16:25:12: +------+-------------+---------------------+-------------+-------+
INFO - 16:25:12: | name | lower_bound | value | upper_bound | type |
INFO - 16:25:12: +------+-------------+---------------------+-------------+-------+
INFO - 16:25:12: | x[0] | 0 | 0.4836327595359132 | 1 | float |
INFO - 16:25:12: | x[1] | 0 | 0.9999999999999998 | 1 | float |
INFO - 16:25:12: | x[2] | 0 | 0.08671677713547089 | 1 | float |
INFO - 16:25:12: | x[3] | 0 | 0.9085357909356101 | 1 | float |
INFO - 16:25:12: | x[4] | 0 | 0.2480176979962943 | 1 | float |
INFO - 16:25:12: +------+-------------+---------------------+-------------+-------+
Optimization result:
Design variables: [0.48363276 1. 0.08671678 0.90853579 0.2480177 ]
Objective function: 0.414721553468123
Feasible solution: True
Post-process the results¶
execute_post(problem, "OptHistoryView", save=False, show=True)
<gemseo.post.opt_history_view.OptHistoryView object at 0x7ffaef2bb1c0>
Total running time of the script: ( 0 minutes 4.115 seconds)