Diagonal design of experiments

Here is an illustration of the diagonal design of experiments (DOE) implemented by the DiagonalDOE class and used by the ScalableDiagonalModel. The idea is to sample the discipline by varying its inputs proportionally on one of the diagonals of its input space.

from __future__ import annotations

from gemseo.api import configure_logger
from gemseo.api import create_design_space
from gemseo.api import create_discipline
from gemseo.api import create_scenario

configure_logger()
<RootLogger root (INFO)>

Create the discipline

First, we create an AnalyticDiscipline implementing the function: \(f(x)=2x-3\sin(2\pi y)\) and set its cache policy to "MemoryFullCache".

discipline = create_discipline(
    "AnalyticDiscipline", expressions={"z": "2*x-3*sin(2*pi*y)"}
)

Create the design space

Then, we create a DesignSpace where \(x\) and \(y\) vary between 0 and 1.

design_space = create_design_space()
design_space.add_variable("x", l_b=0.0, u_b=1.0)
design_space.add_variable("y", l_b=0.0, u_b=1.0)

Sample with the default mode

Lastly, we create a DOEScenario and execute it with the DiagonalDOE algorithm to get 10 evaluations of \(f\). Note that we use the default configuration: all the disciplinary inputs vary proportionally from their lower bounds to their upper bounds.

scenario = create_scenario(
    discipline, "DisciplinaryOpt", "z", design_space, scenario_type="DOE"
)
scenario.execute({"algo": "DiagonalDOE", "n_samples": 10})

dataset = scenario.export_to_dataset(opt_naming=False)
dataset.plot("ScatterMatrix", save=False, show=True)
plot diagonal doe
    INFO - 16:56:32:
    INFO - 16:56:32: *** Start DOEScenario execution ***
    INFO - 16:56:32: DOEScenario
    INFO - 16:56:32:    Disciplines: AnalyticDiscipline
    INFO - 16:56:32:    MDO formulation: DisciplinaryOpt
    INFO - 16:56:32: Optimization problem:
    INFO - 16:56:32:    minimize z(x, y)
    INFO - 16:56:32:    with respect to x, y
    INFO - 16:56:32:    over the design space:
    INFO - 16:56:32:    +------+-------------+-------+-------------+-------+
    INFO - 16:56:32:    | name | lower_bound | value | upper_bound | type  |
    INFO - 16:56:32:    +------+-------------+-------+-------------+-------+
    INFO - 16:56:32:    | x    |      0      |  None |      1      | float |
    INFO - 16:56:32:    | y    |      0      |  None |      1      | float |
    INFO - 16:56:32:    +------+-------------+-------+-------------+-------+
    INFO - 16:56:32: Solving optimization problem with algorithm DiagonalDOE:
    INFO - 16:56:32: ...   0%|          | 0/10 [00:00<?, ?it]
    INFO - 16:56:32: ...  10%|█         | 1/10 [00:00<00:00, 404.23 it/sec, obj=0]
    INFO - 16:56:32: ...  20%|██        | 2/10 [00:00<00:00, 639.91 it/sec, obj=-1.71]
    INFO - 16:56:32: ...  30%|███       | 3/10 [00:00<00:00, 808.15 it/sec, obj=-2.51]
    INFO - 16:56:32: ...  40%|████      | 4/10 [00:00<00:00, 930.83 it/sec, obj=-1.93]
    INFO - 16:56:32: ...  50%|█████     | 5/10 [00:00<00:00, 1039.22 it/sec, obj=-.137]
    INFO - 16:56:32: ...  60%|██████    | 6/10 [00:00<00:00, 1128.87 it/sec, obj=2.14]
    INFO - 16:56:32: ...  70%|███████   | 7/10 [00:00<00:00, 1204.32 it/sec, obj=3.93]
    INFO - 16:56:32: ...  80%|████████  | 8/10 [00:00<00:00, 1268.07 it/sec, obj=4.51]
    INFO - 16:56:32: ...  90%|█████████ | 9/10 [00:00<00:00, 1313.59 it/sec, obj=3.71]
    INFO - 16:56:32: ... 100%|██████████| 10/10 [00:00<00:00, 1345.97 it/sec, obj=2]
    INFO - 16:56:32: Optimization result:
    INFO - 16:56:32:    Optimizer info:
    INFO - 16:56:32:       Status: None
    INFO - 16:56:32:       Message: None
    INFO - 16:56:32:       Number of calls to the objective function by the optimizer: 10
    INFO - 16:56:32:    Solution:
    INFO - 16:56:32:       Objective: -2.5099788145921798
    INFO - 16:56:32:       Design space:
    INFO - 16:56:32:       +------+-------------+--------------------+-------------+-------+
    INFO - 16:56:32:       | name | lower_bound |       value        | upper_bound | type  |
    INFO - 16:56:32:       +------+-------------+--------------------+-------------+-------+
    INFO - 16:56:32:       | x    |      0      | 0.2222222222222222 |      1      | float |
    INFO - 16:56:32:       | y    |      0      | 0.2222222222222222 |      1      | float |
    INFO - 16:56:32:       +------+-------------+--------------------+-------------+-------+
    INFO - 16:56:32: *** End DOEScenario execution (time: 0:00:00.015547) ***
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/4.3.0.post0/lib/python3.9/site-packages/gemseo/post/dataset/scatter_plot_matrix.py:135: UserWarning: To output multiple subplots, the figure containing the passed axes is being cleared.
  sub_axes = scatter_matrix(

<gemseo.post.dataset.scatter_plot_matrix.ScatterMatrix object at 0x7fbc55706ac0>

Sample with reverse mode for \(y\)

We can also change the configuration in order to select another diagonal of the input space, e.g. increasing \(x\) and decreasing \(y\). This configuration is illustrated in the new ScatterMatrix plot where the \((x,y)\) points follow the \(t\mapsto -t\) line while the \((x,y)\) points follow the \(t\mapsto t\) line with the default configuration.

scenario = create_scenario(
    discipline, "DisciplinaryOpt", "z", design_space, scenario_type="DOE"
)
scenario.execute(
    {"algo": "DiagonalDOE", "n_samples": 10, "algo_options": {"reverse": ["y"]}}
)

dataset = scenario.export_to_dataset(opt_naming=False)
dataset.plot("ScatterMatrix", save=False, show=True)
plot diagonal doe
    INFO - 16:56:33:
    INFO - 16:56:33: *** Start DOEScenario execution ***
    INFO - 16:56:33: DOEScenario
    INFO - 16:56:33:    Disciplines: AnalyticDiscipline
    INFO - 16:56:33:    MDO formulation: DisciplinaryOpt
    INFO - 16:56:33: Optimization problem:
    INFO - 16:56:33:    minimize z(x, y)
    INFO - 16:56:33:    with respect to x, y
    INFO - 16:56:33:    over the design space:
    INFO - 16:56:33:    +------+-------------+--------------------+-------------+-------+
    INFO - 16:56:33:    | name | lower_bound |       value        | upper_bound | type  |
    INFO - 16:56:33:    +------+-------------+--------------------+-------------+-------+
    INFO - 16:56:33:    | x    |      0      | 0.2222222222222222 |      1      | float |
    INFO - 16:56:33:    | y    |      0      | 0.2222222222222222 |      1      | float |
    INFO - 16:56:33:    +------+-------------+--------------------+-------------+-------+
    INFO - 16:56:33: Solving optimization problem with algorithm DiagonalDOE:
    INFO - 16:56:33: ...   0%|          | 0/10 [00:00<?, ?it]
    INFO - 16:56:33: ...  10%|█         | 1/10 [00:00<00:00, 1989.71 it/sec, obj=7.35e-16]
    INFO - 16:56:33: ...  20%|██        | 2/10 [00:00<00:00, 1812.58 it/sec, obj=2.15]
    INFO - 16:56:33: ...  30%|███       | 3/10 [00:00<00:00, 1751.52 it/sec, obj=3.4]
    INFO - 16:56:33: ...  40%|████      | 4/10 [00:00<00:00, 1800.71 it/sec, obj=3.26]
    INFO - 16:56:33: ...  50%|█████     | 5/10 [00:00<00:00, 1838.48 it/sec, obj=1.91]
    INFO - 16:56:33: ...  60%|██████    | 6/10 [00:00<00:00, 1866.35 it/sec, obj=0.0851]
    INFO - 16:56:33: ...  70%|███████   | 7/10 [00:00<00:00, 1887.50 it/sec, obj=-1.26]
    INFO - 16:56:33: ...  80%|████████  | 8/10 [00:00<00:00, 1903.26 it/sec, obj=-1.4]
    INFO - 16:56:33: ...  90%|█████████ | 9/10 [00:00<00:00, 1871.16 it/sec, obj=-.151]
    INFO - 16:56:33: ... 100%|██████████| 10/10 [00:00<00:00, 1856.79 it/sec, obj=2]
    INFO - 16:56:33: Optimization result:
    INFO - 16:56:33:    Optimizer info:
    INFO - 16:56:33:       Status: None
    INFO - 16:56:33:       Message: None
    INFO - 16:56:33:       Number of calls to the objective function by the optimizer: 10
    INFO - 16:56:33:    Solution:
    INFO - 16:56:33:       Objective: -1.3988677034810695
    INFO - 16:56:33:       Design space:
    INFO - 16:56:33:       +------+-------------+--------------------+-------------+-------+
    INFO - 16:56:33:       | name | lower_bound |       value        | upper_bound | type  |
    INFO - 16:56:33:       +------+-------------+--------------------+-------------+-------+
    INFO - 16:56:33:       | x    |      0      | 0.7777777777777777 |      1      | float |
    INFO - 16:56:33:       | y    |      0      | 0.2222222222222223 |      1      | float |
    INFO - 16:56:33:       +------+-------------+--------------------+-------------+-------+
    INFO - 16:56:33: *** End DOEScenario execution (time: 0:00:00.013091) ***
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/4.3.0.post0/lib/python3.9/site-packages/gemseo/post/dataset/scatter_plot_matrix.py:135: UserWarning: To output multiple subplots, the figure containing the passed axes is being cleared.
  sub_axes = scatter_matrix(

<gemseo.post.dataset.scatter_plot_matrix.ScatterMatrix object at 0x7fbc56079df0>

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

Gallery generated by Sphinx-Gallery