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 - 10:53:53:
INFO - 10:53:53: *** Start MDOScenario execution ***
INFO - 10:53:53: MDOScenario
INFO - 10:53:53: Disciplines: MainDiscipline ScalableDiscipline[1] ScalableDiscipline[2]
INFO - 10:53:53: MDO formulation: MDF
INFO - 10:53:53: Optimization problem:
INFO - 10:53:53: minimize f(x_0, x_1, x_2)
INFO - 10:53:53: with respect to x_0, x_1, x_2
INFO - 10:53:53: subject to constraints:
INFO - 10:53:53: c_1(x_0, x_1, x_2) <= 0.0
INFO - 10:53:53: c_2(x_0, x_1, x_2) <= 0.0
INFO - 10:53:53: over the design space:
INFO - 10:53:53: +--------+-------------+-------+-------------+-------+
INFO - 10:53:53: | Name | Lower bound | Value | Upper bound | Type |
INFO - 10:53:53: +--------+-------------+-------+-------------+-------+
INFO - 10:53:53: | x_0 | 0 | 0.5 | 1 | float |
INFO - 10:53:53: | x_1 | 0 | 0.5 | 1 | float |
INFO - 10:53:53: | x_2[0] | 0 | 0.5 | 1 | float |
INFO - 10:53:53: | x_2[1] | 0 | 0.5 | 1 | float |
INFO - 10:53:53: | x_2[2] | 0 | 0.5 | 1 | float |
INFO - 10:53:53: +--------+-------------+-------+-------------+-------+
INFO - 10:53:53: Solving optimization problem with algorithm NLOPT_SLSQP:
INFO - 10:53:53: 1%| | 1/100 [00:00<00:05, 18.62 it/sec, obj=3.07]
WARNING - 10:53:54: MDAJacobi has reached its maximum number of iterations but the normed residual 2.1168696116299354e-06 is still above the tolerance 1e-06.
INFO - 10:53:54: 2%|▏ | 2/100 [00:00<00:12, 7.63 it/sec, obj=1.21]
INFO - 10:53:54: 3%|▎ | 3/100 [00:00<00:11, 8.74 it/sec, obj=0.991]
INFO - 10:53:54: 4%|▍ | 4/100 [00:00<00:10, 9.48 it/sec, obj=0.986]
INFO - 10:53:54: 5%|▌ | 5/100 [00:00<00:09, 9.97 it/sec, obj=0.982]
INFO - 10:53:54: 6%|▌ | 6/100 [00:00<00:09, 10.31 it/sec, obj=0.971]
INFO - 10:53:54: 7%|▋ | 7/100 [00:00<00:08, 10.53 it/sec, obj=0.97]
INFO - 10:53:54: 8%|▊ | 8/100 [00:00<00:08, 10.75 it/sec, obj=0.969]
INFO - 10:53:54: 9%|▉ | 9/100 [00:00<00:08, 10.90 it/sec, obj=0.969]
INFO - 10:53:54: 10%|█ | 10/100 [00:00<00:08, 11.02 it/sec, obj=0.969]
INFO - 10:53:54: 11%|█ | 11/100 [00:00<00:07, 12.11 it/sec, obj=Not evaluated]
INFO - 10:53:54: Optimization result:
INFO - 10:53:54: Optimizer info:
INFO - 10:53:54: Status: None
INFO - 10:53:54: Message: Successive iterates of the design variables are closer than xtol_rel or xtol_abs. GEMSEO Stopped the driver
INFO - 10:53:54: Number of calls to the objective function by the optimizer: 11
INFO - 10:53:54: Solution:
INFO - 10:53:54: The solution is feasible.
INFO - 10:53:54: Objective: 0.9692177673322132
INFO - 10:53:54: Standardized constraints:
INFO - 10:53:54: c_1 = [-0.68664086 -0.21340455]
INFO - 10:53:54: c_2 = [-7.31227816e-01 -1.68967484e-01 -2.32695971e-01 1.19959598e-12]
INFO - 10:53:54: Design space:
INFO - 10:53:54: +--------+-------------+-----------------------+-------------+-------+
INFO - 10:53:54: | Name | Lower bound | Value | Upper bound | Type |
INFO - 10:53:54: +--------+-------------+-----------------------+-------------+-------+
INFO - 10:53:54: | x_0 | 0 | 0.7071349698120486 | 1 | float |
INFO - 10:53:54: | x_1 | 0 | 0.999999999999994 | 1 | float |
INFO - 10:53:54: | x_2[0] | 0 | 1.149355539667889e-15 | 1 | float |
INFO - 10:53:54: | x_2[1] | 0 | 0.5233175560073939 | 1 | float |
INFO - 10:53:54: | x_2[2] | 0 | 7.693613505196677e-16 | 1 | float |
INFO - 10:53:54: +--------+-------------+-----------------------+-------------+-------+
INFO - 10:53:54: *** End MDOScenario execution (time: 0:00:00.925638) ***
{'max_iter': 100, 'algo': 'NLOPT_SLSQP'}
Post-process the results¶
scenario.post_process("OptHistoryView", save=False, show=True)
<gemseo.post.opt_history_view.OptHistoryView object at 0x7efd344dc220>
Solve the associated quadratic programming problem¶
problem = problem.create_quadratic_programming_problem()
execute_algo(problem, algo_name="NLOPT_SLSQP", max_iter=100)
INFO - 10:53:55: Optimization problem:
INFO - 10:53:55: minimize f = 0.5x'Qx + c'x + d
INFO - 10:53:55: with respect to x
INFO - 10:53:55: subject to constraints:
INFO - 10:53:55: g: Ax-b <= 0 <= 0.0
INFO - 10:53:55: over the design space:
INFO - 10:53:55: +------+-------------+-------+-------------+-------+
INFO - 10:53:55: | Name | Lower bound | Value | Upper bound | Type |
INFO - 10:53:55: +------+-------------+-------+-------------+-------+
INFO - 10:53:55: | x[0] | 0 | 0.5 | 1 | float |
INFO - 10:53:55: | x[1] | 0 | 0.5 | 1 | float |
INFO - 10:53:55: | x[2] | 0 | 0.5 | 1 | float |
INFO - 10:53:55: | x[3] | 0 | 0.5 | 1 | float |
INFO - 10:53:55: | x[4] | 0 | 0.5 | 1 | float |
INFO - 10:53:55: +------+-------------+-------+-------------+-------+
INFO - 10:53:55: Solving optimization problem with algorithm NLOPT_SLSQP:
INFO - 10:53:55: 1%| | 1/100 [00:00<00:00, 2098.20 it/sec, obj=3.07]
INFO - 10:53:55: 2%|▏ | 2/100 [00:00<00:00, 530.76 it/sec, obj=1.21]
INFO - 10:53:55: 3%|▎ | 3/100 [00:00<00:00, 534.44 it/sec, obj=0.991]
INFO - 10:53:55: 4%|▍ | 4/100 [00:00<00:00, 547.88 it/sec, obj=0.986]
INFO - 10:53:55: 5%|▌ | 5/100 [00:00<00:00, 553.98 it/sec, obj=0.982]
INFO - 10:53:55: 6%|▌ | 6/100 [00:00<00:00, 555.92 it/sec, obj=0.971]
INFO - 10:53:55: 7%|▋ | 7/100 [00:00<00:00, 552.47 it/sec, obj=0.97]
ERROR - 10:53:55: NLopt run failed: NLopt roundoff-limited, RoundoffLimited
Traceback (most recent call last):
File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/5.2.0/lib/python3.9/site-packages/gemseo/algos/opt/lib_nlopt.py", line 498, in _run
nlopt_problem.optimize(x_0.real)
File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/5.2.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 - 10:53:55: 8%|▊ | 8/100 [00:00<00:00, 533.36 it/sec, obj=0.969]
INFO - 10:53:55: Optimization result:
INFO - 10:53:55: Optimizer info:
INFO - 10:53:55: Status: None
INFO - 10:53:55: Message: GEMSEO Stopped the driver
INFO - 10:53:55: Number of calls to the objective function by the optimizer: 9
INFO - 10:53:55: Solution:
INFO - 10:53:55: The solution is feasible.
INFO - 10:53:55: Objective: 0.9692176254005034
INFO - 10:53:55: Standardized constraints:
INFO - 10:53:55: g = [-6.86640980e-01 -2.13404451e-01 -7.31227677e-01 -1.68967471e-01
INFO - 10:53:55: -2.32695870e-01 -2.22044605e-15]
INFO - 10:53:55: Design space:
INFO - 10:53:55: +------+-------------+--------------------+-------------+-------+
INFO - 10:53:55: | Name | Lower bound | Value | Upper bound | Type |
INFO - 10:53:55: +------+-------------+--------------------+-------------+-------+
INFO - 10:53:55: | x[0] | 0 | 0.7071348743877915 | 1 | float |
INFO - 10:53:55: | x[1] | 0 | 1 | 1 | float |
INFO - 10:53:55: | x[2] | 0 | 0 | 1 | float |
INFO - 10:53:55: | x[3] | 0 | 0.5233180438726639 | 1 | float |
INFO - 10:53:55: | x[4] | 0 | 0 | 1 | float |
INFO - 10:53:55: +------+-------------+--------------------+-------------+-------+
Post-process the results¶
execute_post(problem, "OptHistoryView", save=False, show=True)
<gemseo.post.opt_history_view.OptHistoryView object at 0x7efd341af1f0>
Total running time of the script: (0 minutes 3.857 seconds)









