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

Solve the MDO using an MDF formulation

scenario = problem.create_scenario()
scenario.execute({"algo": "NLOPT_SLSQP", "max_iter": 100})
    INFO - 08:23:54:
    INFO - 08:23:54: *** Start MDOScenario execution ***
    INFO - 08:23:54: MDOScenario
    INFO - 08:23:54:    Disciplines: MainDiscipline ScalableDiscipline[1] ScalableDiscipline[2]
    INFO - 08:23:54:    MDO formulation: MDF
    INFO - 08:23:54: Optimization problem:
    INFO - 08:23:54:    minimize f(x_0, x_1, x_2)
    INFO - 08:23:54:    with respect to x_0, x_1, x_2
    INFO - 08:23:54:    subject to constraints:
    INFO - 08:23:54:       c_1(x_0, x_1, x_2) <= 0.0
    INFO - 08:23:54:       c_2(x_0, x_1, x_2) <= 0.0
    INFO - 08:23:54:    over the design space:
    INFO - 08:23:54:    +--------+-------------+-------+-------------+-------+----------------------+
    INFO - 08:23:54:    | name   | lower_bound | value | upper_bound | type  | Initial distribution |
    INFO - 08:23:54:    +--------+-------------+-------+-------------+-------+----------------------+
    INFO - 08:23:54:    | x_0    |      0      |  0.5  |      1      | float |                      |
    INFO - 08:23:54:    | x_1    |      0      |  0.5  |      1      | float |                      |
    INFO - 08:23:54:    | x_2[0] |      0      |  0.5  |      1      | float |                      |
    INFO - 08:23:54:    | x_2[1] |      0      |  0.5  |      1      | float |                      |
    INFO - 08:23:54:    | x_2[2] |      0      |  0.5  |      1      | float |                      |
    INFO - 08:23:54:    +--------+-------------+-------+-------------+-------+----------------------+
    INFO - 08:23:54: Solving optimization problem with algorithm NLOPT_SLSQP:
    INFO - 08:23:54: ...   0%|          | 0/100 [00:00<?, ?it]
    INFO - 08:23:55: ...   1%|          | 1/100 [00:00<00:04, 24.38 it/sec, obj=1]
    INFO - 08:23:55: ...   2%|▏         | 2/100 [00:00<00:08, 11.70 it/sec, obj=0.921]
    INFO - 08:23:55: ...   3%|▎         | 3/100 [00:00<00:05, 17.51 it/sec, obj=0.513]
    INFO - 08:23:55: ...   4%|▍         | 4/100 [00:00<00:08, 11.90 it/sec, obj=0.438]
    INFO - 08:23:55: ...   5%|▌         | 5/100 [00:00<00:07, 12.53 it/sec, obj=0.418]
    INFO - 08:23:55: ...   6%|▌         | 6/100 [00:00<00:07, 13.00 it/sec, obj=0.416]
    INFO - 08:23:55: ...   7%|▋         | 7/100 [00:00<00:06, 13.31 it/sec, obj=0.415]
    INFO - 08:23:55: ...   8%|▊         | 8/100 [00:00<00:06, 13.57 it/sec, obj=0.415]
    INFO - 08:23:55: ...   9%|▉         | 9/100 [00:00<00:06, 13.77 it/sec, obj=0.415]
    INFO - 08:23:55: ...  10%|█         | 10/100 [00:00<00:06, 13.96 it/sec, obj=0.415]
    INFO - 08:23:55: ...  11%|█         | 11/100 [00:00<00:06, 14.11 it/sec, obj=0.415]
    INFO - 08:23:55: ...  12%|█▏        | 12/100 [00:00<00:05, 14.95 it/sec, obj=0.415]
    INFO - 08:23:55: ...  13%|█▎        | 13/100 [00:00<00:05, 16.19 it/sec, obj=0.415]
    INFO - 08:23:55: Optimization result:
    INFO - 08:23:55:    Optimizer info:
    INFO - 08:23:55:       Status: None
    INFO - 08:23:55:       Message: Successive iterates of the objective function are closer than ftol_rel or ftol_abs. GEMSEO Stopped the driver
    INFO - 08:23:55:       Number of calls to the objective function by the optimizer: 15
    INFO - 08:23:55:    Solution:
    INFO - 08:23:55:       The solution is feasible.
    INFO - 08:23:55:       Objective: 0.4147214093889784
    INFO - 08:23:55:       Standardized constraints:
    INFO - 08:23:55:          c_1 = [-0.32430622 -0.43254409]
    INFO - 08:23:55:          c_2 = [ 2.44645415e-11 -2.51297060e-01 -2.35380107e-01 -4.99968067e-01]
    INFO - 08:23:55:       Scalable design space:
    INFO - 08:23:55:       +--------+-------------+---------------------+-------------+-------+----------------------+
    INFO - 08:23:55:       | name   | lower_bound |        value        | upper_bound | type  | Initial distribution |
    INFO - 08:23:55:       +--------+-------------+---------------------+-------------+-------+----------------------+
    INFO - 08:23:55:       | x_0    |      0      |  0.4836326345734573 |      1      | float |                      |
    INFO - 08:23:55:       | x_1    |      0      |  0.9999999999999998 |      1      | float |                      |
    INFO - 08:23:55:       | x_2[0] |      0      | 0.08671679318925574 |      1      | float |                      |
    INFO - 08:23:55:       | x_2[1] |      0      |  0.9085357497327241 |      1      | float |                      |
    INFO - 08:23:55:       | x_2[2] |      0      |  0.2480176751996585 |      1      | float |                      |
    INFO - 08:23:55:       +--------+-------------+---------------------+-------------+-------+----------------------+
    INFO - 08:23:55: *** End MDOScenario execution (time: 0:00:00.819416) ***

{'max_iter': 100, 'algo': 'NLOPT_SLSQP'}

Post-process the results

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

Solve the associated quadratic programming problem

problem = problem.create_quadratic_programming_problem()
execute_algo(problem, algo_name="NLOPT_SLSQP", max_iter=100)
INFO - 08:23:56: Optimization problem:
INFO - 08:23:56:    minimize f = 0.5x'Qx + c'x + d
INFO - 08:23:56:    with respect to x
INFO - 08:23:56:    subject to constraints:
INFO - 08:23:56:       g: Ax-b <= 0 <= 0.0
INFO - 08:23:56:    over the design space:
INFO - 08:23:56:    +------+-------------+-------+-------------+-------+
INFO - 08:23:56:    | name | lower_bound | value | upper_bound | type  |
INFO - 08:23:56:    +------+-------------+-------+-------------+-------+
INFO - 08:23:56:    | x[0] |      0      |  0.5  |      1      | float |
INFO - 08:23:56:    | x[1] |      0      |  0.5  |      1      | float |
INFO - 08:23:56:    | x[2] |      0      |  0.5  |      1      | float |
INFO - 08:23:56:    | x[3] |      0      |  0.5  |      1      | float |
INFO - 08:23:56:    | x[4] |      0      |  0.5  |      1      | float |
INFO - 08:23:56:    +------+-------------+-------+-------------+-------+
INFO - 08:23:56: Solving optimization problem with algorithm NLOPT_SLSQP:
INFO - 08:23:56: ...   0%|          | 0/100 [00:00<?, ?it]
INFO - 08:23:56: ...   1%|          | 1/100 [00:00<00:00, 2441.39 it/sec, obj=1]
INFO - 08:23:56: ...   2%|▏         | 2/100 [00:00<00:00, 563.86 it/sec, obj=0.921]
INFO - 08:23:56: ...   3%|▎         | 3/100 [00:00<00:00, 791.43 it/sec, obj=0.513]
INFO - 08:23:56: ...   4%|▍         | 4/100 [00:00<00:00, 548.78 it/sec, obj=0.438]
INFO - 08:23:56: ...   5%|▌         | 5/100 [00:00<00:00, 506.53 it/sec, obj=0.418]
INFO - 08:23:56: ...   6%|▌         | 6/100 [00:00<00:00, 498.95 it/sec, obj=0.416]
INFO - 08:23:56: ...   7%|▋         | 7/100 [00:00<00:00, 513.24 it/sec, obj=0.415]
INFO - 08:23:56: ...   8%|▊         | 8/100 [00:00<00:00, 523.37 it/sec, obj=0.415]
INFO - 08:23:56: ...   9%|▉         | 9/100 [00:00<00:00, 532.63 it/sec, obj=0.415]
INFO - 08:23:56: ...  10%|█         | 10/100 [00:00<00:00, 539.93 it/sec, obj=0.415]
INFO - 08:23:56: ...  11%|█         | 11/100 [00:00<00:00, 543.57 it/sec, obj=0.415]
INFO - 08:23:56: ...  12%|█▏        | 12/100 [00:00<00:00, 549.96 it/sec, obj=0.415]
INFO - 08:23:56: ...  13%|█▎        | 13/100 [00:00<00:00, 588.78 it/sec, obj=0.415]
INFO - 08:23:56: Optimization result:
INFO - 08:23:56:    Optimizer info:
INFO - 08:23:56:       Status: None
INFO - 08:23:56:       Message: Successive iterates of the objective function are closer than ftol_rel or ftol_abs. GEMSEO Stopped the driver
INFO - 08:23:56:       Number of calls to the objective function by the optimizer: 15
INFO - 08:23:56:    Solution:
INFO - 08:23:56:       The solution is feasible.
INFO - 08:23:56:       Objective: 0.414721553468123
INFO - 08:23:56:       Standardized constraints:
INFO - 08:23:56:          g = [-3.24306238e-01 -4.32544172e-01 -4.44089210e-16 -2.51297007e-01
INFO - 08:23:56:  -2.35380057e-01 -4.99968031e-01]
INFO - 08:23:56:       Design space:
INFO - 08:23:56:       +------+-------------+---------------------+-------------+-------+
INFO - 08:23:56:       | name | lower_bound |        value        | upper_bound | type  |
INFO - 08:23:56:       +------+-------------+---------------------+-------------+-------+
INFO - 08:23:56:       | x[0] |      0      |  0.4836327595359132 |      1      | float |
INFO - 08:23:56:       | x[1] |      0      |  0.9999999999999998 |      1      | float |
INFO - 08:23:56:       | x[2] |      0      | 0.08671677713547089 |      1      | float |
INFO - 08:23:56:       | x[3] |      0      |  0.9085357909356101 |      1      | float |
INFO - 08:23:56:       | x[4] |      0      |  0.2480176979962943 |      1      | float |
INFO - 08:23:56:       +------+-------------+---------------------+-------------+-------+
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)
  • Evolution of the optimization variables
  • Evolution of the objective value
  • Distance to the optimum
  • Hessian diagonal approximation
  • Evolution of the inequality constraints
<gemseo.post.opt_history_view.OptHistoryView object at 0x7f0cbeafc370>

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

Gallery generated by Sphinx-Gallery