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)
plot scalable param mdf

Solve the MDO using an MDF formulation#

scenario = problem.create_scenario()
scenario.execute(algo_name="NLOPT_SLSQP", max_iter=100)
   INFO - 16:13:52: *** Start MDOScenario execution ***
   INFO - 16:13:52: MDOScenario
   INFO - 16:13:52:    Disciplines: MainDiscipline ScalableDiscipline[1] ScalableDiscipline[2]
   INFO - 16:13:52:    MDO formulation: MDF
   INFO - 16:13:52: Optimization problem:
   INFO - 16:13:52:    minimize f(x_0, x_1, x_2)
   INFO - 16:13:52:    with respect to x_0, x_1, x_2
   INFO - 16:13:52:    under the inequality constraints
   INFO - 16:13:52:       c_1(x_0, x_1, x_2) <= 0
   INFO - 16:13:52:       c_2(x_0, x_1, x_2) <= 0
   INFO - 16:13:52:    over the design space:
   INFO - 16:13:52:       +--------+-------------+-------+-------------+-------+
   INFO - 16:13:52:       | Name   | Lower bound | Value | Upper bound | Type  |
   INFO - 16:13:52:       +--------+-------------+-------+-------------+-------+
   INFO - 16:13:52:       | x_0    |      0      |  0.5  |      1      | float |
   INFO - 16:13:52:       | x_1    |      0      |  0.5  |      1      | float |
   INFO - 16:13:52:       | x_2[0] |      0      |  0.5  |      1      | float |
   INFO - 16:13:52:       | x_2[1] |      0      |  0.5  |      1      | float |
   INFO - 16:13:52:       | x_2[2] |      0      |  0.5  |      1      | float |
   INFO - 16:13:52:       +--------+-------------+-------+-------------+-------+
   INFO - 16:13:52: Solving optimization problem with algorithm NLOPT_SLSQP:
   INFO - 16:13:52:      1%|          | 1/100 [00:00<00:03, 28.68 it/sec, feas=True, obj=3.07]
   INFO - 16:13:52:      2%|▏         | 2/100 [00:00<00:02, 33.47 it/sec, feas=True, obj=1.21]
WARNING - 16:13:52: MDAJacobi has reached its maximum number of iterations, but the normalized residual norm 2.715139844193851e-06 is still above the tolerance 1e-06.
   INFO - 16:13:52:      3%|▎         | 3/100 [00:00<00:02, 34.45 it/sec, feas=True, obj=0.991]
   INFO - 16:13:52:      4%|▍         | 4/100 [00:00<00:02, 35.17 it/sec, feas=True, obj=0.986]
   INFO - 16:13:52:      5%|▌         | 5/100 [00:00<00:02, 35.49 it/sec, feas=True, obj=0.982]
   INFO - 16:13:52:      6%|▌         | 6/100 [00:00<00:02, 35.91 it/sec, feas=True, obj=0.971]
   INFO - 16:13:52:      7%|▋         | 7/100 [00:00<00:02, 36.11 it/sec, feas=True, obj=0.97]
WARNING - 16:13:52: MDAJacobi has reached its maximum number of iterations, but the normalized residual norm 1.1427901207750206e-06 is still above the tolerance 1e-06.
   INFO - 16:13:52:      8%|▊         | 8/100 [00:00<00:02, 35.72 it/sec, feas=True, obj=0.969]
WARNING - 16:13:52: MDAJacobi has reached its maximum number of iterations, but the normalized residual norm 1.1427840077519516e-06 is still above the tolerance 1e-06.
   INFO - 16:13:52:      9%|▉         | 9/100 [00:00<00:02, 35.65 it/sec, feas=True, obj=0.969]
WARNING - 16:13:52: MDAJacobi has reached its maximum number of iterations, but the normalized residual norm 1.142784007344151e-06 is still above the tolerance 1e-06.
   INFO - 16:13:52:     10%|█         | 10/100 [00:00<00:02, 35.56 it/sec, feas=True, obj=0.969]
WARNING - 16:13:52: MDAJacobi has reached its maximum number of iterations, but the normalized residual norm 1.142784007205571e-06 is still above the tolerance 1e-06.
   INFO - 16:13:52:     11%|█         | 11/100 [00:00<00:02, 35.63 it/sec, feas=True, obj=0.969]
   INFO - 16:13:52: Optimization result:
   INFO - 16:13:52:    Optimizer info:
   INFO - 16:13:52:       Status: None
   INFO - 16:13:52:       Message: Successive iterates of the objective function are closer than ftol_rel or ftol_abs. GEMSEO stopped the driver.
   INFO - 16:13:52:    Solution:
   INFO - 16:13:52:       The solution is feasible.
   INFO - 16:13:52:       Objective: 0.9692147822181952
   INFO - 16:13:52:       Standardized constraints:
   INFO - 16:13:52:          c_1 = [-0.68663938 -0.21340355]
   INFO - 16:13:52:          c_2 = [-7.31227901e-01 -1.68967318e-01 -2.32696422e-01  7.43849426e-15]
   INFO - 16:13:52:       Design space:
   INFO - 16:13:52:          +--------+-------------+--------------------+-------------+-------+
   INFO - 16:13:52:          | Name   | Lower bound |       Value        | Upper bound | Type  |
   INFO - 16:13:52:          +--------+-------------+--------------------+-------------+-------+
   INFO - 16:13:52:          | x_0    |      0      | 0.707133579730868  |      1      | float |
   INFO - 16:13:52:          | x_1    |      0      |         1          |      1      | float |
   INFO - 16:13:52:          | x_2[0] |      0      |         0          |      1      | float |
   INFO - 16:13:52:          | x_2[1] |      0      | 0.5233182522437052 |      1      | float |
   INFO - 16:13:52:          | x_2[2] |      0      |         0          |      1      | float |
   INFO - 16:13:52:          +--------+-------------+--------------------+-------------+-------+
   INFO - 16:13:52: *** End MDOScenario execution ***

Post-process the results#

scenario.post_process(post_name="OptHistoryView", save=False, show=True)
  • Evolution of the optimization variables
  • Evolution of the objective value
  • Evolution of the distance to the optimum
  • Evolution of the inequality constraints
<gemseo.post.opt_history_view.OptHistoryView object at 0x7b1d50a04800>

Solve the associated quadratic programming problem#

problem = problem.create_quadratic_programming_problem()
execute_algo(problem, algo_name="NLOPT_SLSQP", max_iter=100)
INFO - 16:13:53: Optimization problem:
INFO - 16:13:53:    minimize f = 0.5x'Qx + c'x + d
INFO - 16:13:53:    with respect to x
INFO - 16:13:53:    under the inequality constraints
INFO - 16:13:53:       g: Ax-b <= 0 <= 0.0
INFO - 16:13:53:    over the design space:
INFO - 16:13:53:       +------+-------------+-------+-------------+-------+
INFO - 16:13:53:       | Name | Lower bound | Value | Upper bound | Type  |
INFO - 16:13:53:       +------+-------------+-------+-------------+-------+
INFO - 16:13:53:       | x[0] |      0      |  0.5  |      1      | float |
INFO - 16:13:53:       | x[1] |      0      |  0.5  |      1      | float |
INFO - 16:13:53:       | x[2] |      0      |  0.5  |      1      | float |
INFO - 16:13:53:       | x[3] |      0      |  0.5  |      1      | float |
INFO - 16:13:53:       | x[4] |      0      |  0.5  |      1      | float |
INFO - 16:13:53:       +------+-------------+-------+-------------+-------+
INFO - 16:13:53: Solving optimization problem with algorithm NLOPT_SLSQP:
INFO - 16:13:53:      1%|          | 1/100 [00:00<00:00, 730.46 it/sec, feas=True, obj=3.07]
INFO - 16:13:53:      2%|▏         | 2/100 [00:00<00:00, 776.79 it/sec, feas=True, obj=1.21]
INFO - 16:13:53:      3%|▎         | 3/100 [00:00<00:00, 818.13 it/sec, feas=True, obj=0.991]
INFO - 16:13:53:      4%|▍         | 4/100 [00:00<00:00, 775.97 it/sec, feas=True, obj=0.986]
INFO - 16:13:53:      5%|▌         | 5/100 [00:00<00:00, 760.22 it/sec, feas=True, obj=0.982]
INFO - 16:13:53:      6%|▌         | 6/100 [00:00<00:00, 749.81 it/sec, feas=True, obj=0.971]
INFO - 16:13:53:      7%|▋         | 7/100 [00:00<00:00, 741.10 it/sec, feas=True, obj=0.97]
INFO - 16:13:53:      8%|▊         | 8/100 [00:00<00:00, 740.80 it/sec, feas=True, obj=0.969]
INFO - 16:13:53:      9%|▉         | 9/100 [00:00<00:00, 734.11 it/sec, feas=True, obj=0.969]
INFO - 16:13:53:     10%|█         | 10/100 [00:00<00:00, 732.50 it/sec, feas=True, obj=0.969]
INFO - 16:13:53: Optimization result:
INFO - 16:13:53:    Optimizer info:
INFO - 16:13:53:       Status: None
INFO - 16:13:53:       Message: Successive iterates of the objective function are closer than ftol_rel or ftol_abs. GEMSEO stopped the driver.
INFO - 16:13:53:    Solution:
INFO - 16:13:53:       The solution is feasible.
INFO - 16:13:53:       Objective: 0.9692176254004927
INFO - 16:13:53:       Standardized constraints:
INFO - 16:13:53:          g = [-6.86640980e-01 -2.13404451e-01 -7.31227677e-01 -1.68967471e-01
INFO - 16:13:53:  -2.32695870e-01  3.99680289e-15]
INFO - 16:13:53:       Design space:
INFO - 16:13:53:          +------+-------------+-----------------------+-------------+-------+
INFO - 16:13:53:          | Name | Lower bound |         Value         | Upper bound | Type  |
INFO - 16:13:53:          +------+-------------+-----------------------+-------------+-------+
INFO - 16:13:53:          | x[0] |      0      |   0.7071348743877868  |      1      | float |
INFO - 16:13:53:          | x[1] |      0      |   0.9999999999999947  |      1      | float |
INFO - 16:13:53:          | x[2] |      0      | 1.977635923099697e-15 |      1      | float |
INFO - 16:13:53:          | x[3] |      0      |   0.5233180438726605  |      1      | float |
INFO - 16:13:53:          | x[4] |      0      | 6.731912661281726e-16 |      1      | float |
INFO - 16:13:53:          +------+-------------+-----------------------+-------------+-------+
Optimization result:
  • Design variables: [7.07134874e-01 1.00000000e+00 1.97763592e-15 5.23318044e-01 6.73191266e-16]
  • Objective function: 0.9692176254004927
  • Feasible solution: True


Post-process the results#

execute_post(problem, post_name="OptHistoryView", save=False, show=True)
  • Evolution of the optimization variables
  • Evolution of the objective value
  • Evolution of the distance to the optimum
  • Evolution of the inequality constraints
<gemseo.post.opt_history_view.OptHistoryView object at 0x7b1d50f86d80>

Total running time of the script: (0 minutes 1.957 seconds)

Gallery generated by Sphinx-Gallery