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 execute_algo
from gemseo import execute_post
from gemseo import generate_n2_plot
from gemseo.problems.mdo.scalable.parametric.core.scalable_discipline_settings import (
ScalableDisciplineSettings,
)
from gemseo.problems.mdo.scalable.parametric.scalable_problem import ScalableProblem
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_name="NLOPT_SLSQP", max_iter=100)
INFO - 16:21:35: *** Start MDOScenario execution ***
INFO - 16:21:35: MDOScenario
INFO - 16:21:35: Disciplines: MainDiscipline ScalableDiscipline[1] ScalableDiscipline[2]
INFO - 16:21:35: MDO formulation: MDF
INFO - 16:21:35: Optimization problem:
INFO - 16:21:35: minimize f(x_0, x_1, x_2)
INFO - 16:21:35: with respect to x_0, x_1, x_2
INFO - 16:21:35: under the inequality constraints
INFO - 16:21:35: c_1(x_0, x_1, x_2) <= 0
INFO - 16:21:35: c_2(x_0, x_1, x_2) <= 0
INFO - 16:21:35: over the design space:
INFO - 16:21:35: +--------+-------------+-------+-------------+-------+
INFO - 16:21:35: | Name | Lower bound | Value | Upper bound | Type |
INFO - 16:21:35: +--------+-------------+-------+-------------+-------+
INFO - 16:21:35: | x_0 | 0 | 0.5 | 1 | float |
INFO - 16:21:35: | x_1 | 0 | 0.5 | 1 | float |
INFO - 16:21:35: | x_2[0] | 0 | 0.5 | 1 | float |
INFO - 16:21:35: | x_2[1] | 0 | 0.5 | 1 | float |
INFO - 16:21:35: | x_2[2] | 0 | 0.5 | 1 | float |
INFO - 16:21:35: +--------+-------------+-------+-------------+-------+
INFO - 16:21:35: Solving optimization problem with algorithm NLOPT_SLSQP:
INFO - 16:21:35: 1%| | 1/100 [00:00<00:02, 37.33 it/sec, feas=True, obj=3.07]
INFO - 16:21:35: 2%|▏ | 2/100 [00:00<00:02, 47.01 it/sec, feas=True, obj=1.21]
WARNING - 16:21:35: MDAJacobi has reached its maximum number of iterations, but the normalized residual norm 2.7151398445206794e-06 is still above the tolerance 1e-06.
INFO - 16:21:35: 3%|▎ | 3/100 [00:00<00:01, 49.61 it/sec, feas=True, obj=0.991]
INFO - 16:21:35: 4%|▍ | 4/100 [00:00<00:01, 51.63 it/sec, feas=True, obj=0.986]
INFO - 16:21:35: 5%|▌ | 5/100 [00:00<00:01, 53.28 it/sec, feas=True, obj=0.982]
INFO - 16:21:35: 6%|▌ | 6/100 [00:00<00:01, 53.30 it/sec, feas=True, obj=0.971]
INFO - 16:21:35: 7%|▋ | 7/100 [00:00<00:01, 54.21 it/sec, feas=True, obj=0.97]
WARNING - 16:21:35: MDAJacobi has reached its maximum number of iterations, but the normalized residual norm 1.1427901203368072e-06 is still above the tolerance 1e-06.
INFO - 16:21:35: 8%|▊ | 8/100 [00:00<00:01, 54.59 it/sec, feas=True, obj=0.969]
WARNING - 16:21:35: MDAJacobi has reached its maximum number of iterations, but the normalized residual norm 1.1427840078240745e-06 is still above the tolerance 1e-06.
INFO - 16:21:35: 9%|▉ | 9/100 [00:00<00:01, 54.79 it/sec, feas=True, obj=0.969]
WARNING - 16:21:35: MDAJacobi has reached its maximum number of iterations, but the normalized residual norm 1.1427840073629847e-06 is still above the tolerance 1e-06.
INFO - 16:21:35: 10%|█ | 10/100 [00:00<00:01, 55.14 it/sec, feas=True, obj=0.969]
WARNING - 16:21:35: MDAJacobi has reached its maximum number of iterations, but the normalized residual norm 1.1427840071115847e-06 is still above the tolerance 1e-06.
INFO - 16:21:35: 11%|█ | 11/100 [00:00<00:01, 55.37 it/sec, feas=True, obj=0.969]
INFO - 16:21:35: Optimization result:
INFO - 16:21:35: Optimizer info:
INFO - 16:21:35: Status: None
INFO - 16:21:35: Message: Successive iterates of the objective function are closer than ftol_rel or ftol_abs. GEMSEO stopped the driver.
INFO - 16:21:35: Solution:
INFO - 16:21:35: The solution is feasible.
INFO - 16:21:35: Objective: 0.9692147822181947
INFO - 16:21:35: Standardized constraints:
INFO - 16:21:35: c_1 = [-0.68663938 -0.21340355]
INFO - 16:21:35: c_2 = [-7.31227901e-01 -1.68967318e-01 -2.32696422e-01 7.82707232e-15]
INFO - 16:21:35: Design space:
INFO - 16:21:35: +--------+-------------+--------------------+-------------+-------+
INFO - 16:21:35: | Name | Lower bound | Value | Upper bound | Type |
INFO - 16:21:35: +--------+-------------+--------------------+-------------+-------+
INFO - 16:21:35: | x_0 | 0 | 0.7071335797308679 | 1 | float |
INFO - 16:21:35: | x_1 | 0 | 1 | 1 | float |
INFO - 16:21:35: | x_2[0] | 0 | 0 | 1 | float |
INFO - 16:21:35: | x_2[1] | 0 | 0.5233182522437052 | 1 | float |
INFO - 16:21:35: | x_2[2] | 0 | 0 | 1 | float |
INFO - 16:21:35: +--------+-------------+--------------------+-------------+-------+
INFO - 16:21:35: *** End MDOScenario execution ***
Post-process the results#
scenario.post_process(post_name="OptHistoryView", save=False, show=True)
<gemseo.post.opt_history_view.OptHistoryView object at 0x72a4f3316c30>
Solve the associated quadratic programming problem#
problem = problem.create_quadratic_programming_problem()
execute_algo(problem, algo_name="NLOPT_SLSQP", max_iter=100)
INFO - 16:21:36: Optimization problem:
INFO - 16:21:36: minimize f = 0.5x'Qx + c'x + d
INFO - 16:21:36: with respect to x
INFO - 16:21:36: under the inequality constraints
INFO - 16:21:36: g: Ax-b <= 0 <= 0.0
INFO - 16:21:36: over the design space:
INFO - 16:21:36: +------+-------------+-------+-------------+-------+
INFO - 16:21:36: | Name | Lower bound | Value | Upper bound | Type |
INFO - 16:21:36: +------+-------------+-------+-------------+-------+
INFO - 16:21:36: | x[0] | 0 | 0.5 | 1 | float |
INFO - 16:21:36: | x[1] | 0 | 0.5 | 1 | float |
INFO - 16:21:36: | x[2] | 0 | 0.5 | 1 | float |
INFO - 16:21:36: | x[3] | 0 | 0.5 | 1 | float |
INFO - 16:21:36: | x[4] | 0 | 0.5 | 1 | float |
INFO - 16:21:36: +------+-------------+-------+-------------+-------+
INFO - 16:21:36: Solving optimization problem with algorithm NLOPT_SLSQP:
INFO - 16:21:36: 1%| | 1/100 [00:00<00:00, 1001.74 it/sec, feas=True, obj=3.07]
INFO - 16:21:36: 2%|▏ | 2/100 [00:00<00:00, 1165.41 it/sec, feas=True, obj=1.21]
INFO - 16:21:36: 3%|▎ | 3/100 [00:00<00:00, 1250.79 it/sec, feas=True, obj=0.991]
INFO - 16:21:36: 4%|▍ | 4/100 [00:00<00:00, 1204.83 it/sec, feas=True, obj=0.986]
INFO - 16:21:36: 5%|▌ | 5/100 [00:00<00:00, 1199.47 it/sec, feas=True, obj=0.982]
INFO - 16:21:36: 6%|▌ | 6/100 [00:00<00:00, 1195.24 it/sec, feas=True, obj=0.971]
INFO - 16:21:36: 7%|▋ | 7/100 [00:00<00:00, 1192.24 it/sec, feas=True, obj=0.97]
ERROR - 16:21:36: NLopt run failed: NLopt roundoff-limited, RoundoffLimited
Traceback (most recent call last):
File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.3.0/lib/python3.12/site-packages/gemseo/algos/opt/nlopt/nlopt.py", line 399, in _run
nlopt_problem.optimize(x_0.real)
File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/6.3.0/lib/python3.12/site-packages/nlopt/nlopt.py", line 454, in optimize
return _nlopt.opt_optimize(self, *args)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
nlopt.RoundoffLimited: NLopt roundoff-limited
INFO - 16:21:36: Optimization result:
INFO - 16:21:36: Optimizer info:
INFO - 16:21:36: Status: None
INFO - 16:21:36: Message: GEMSEO stopped the driver.
INFO - 16:21:36: Solution:
INFO - 16:21:36: The solution is feasible.
INFO - 16:21:36: Objective: 0.9692176254005034
INFO - 16:21:36: Standardized constraints:
INFO - 16:21:36: g = [-6.86640980e-01 -2.13404451e-01 -7.31227677e-01 -1.68967471e-01
INFO - 16:21:36: -2.32695870e-01 -2.22044605e-15]
INFO - 16:21:36: Design space:
INFO - 16:21:36: +------+-------------+--------------------+-------------+-------+
INFO - 16:21:36: | Name | Lower bound | Value | Upper bound | Type |
INFO - 16:21:36: +------+-------------+--------------------+-------------+-------+
INFO - 16:21:36: | x[0] | 0 | 0.7071348743877915 | 1 | float |
INFO - 16:21:36: | x[1] | 0 | 1 | 1 | float |
INFO - 16:21:36: | x[2] | 0 | 0 | 1 | float |
INFO - 16:21:36: | x[3] | 0 | 0.5233180438726639 | 1 | float |
INFO - 16:21:36: | x[4] | 0 | 0 | 1 | float |
INFO - 16:21:36: +------+-------------+--------------------+-------------+-------+
Post-process the results#
execute_post(problem, post_name="OptHistoryView", save=False, show=True)
<gemseo.post.opt_history_view.OptHistoryView object at 0x72a4f35bf2f0>
Total running time of the script: (0 minutes 1.562 seconds)







