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()


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)

    INFO - 15:57:35:
INFO - 15:57:35: *** Start DOEScenario execution ***
INFO - 15:57:35: DOEScenario
INFO - 15:57:35:    Disciplines: AnalyticDiscipline
INFO - 15:57:35:    MDO formulation: DisciplinaryOpt
INFO - 15:57:35: Optimization problem:
INFO - 15:57:35:    minimize z(x, y)
INFO - 15:57:35:    with respect to x, y
INFO - 15:57:35:    over the design space:
INFO - 15:57:35:    +------+-------------+-------+-------------+-------+
INFO - 15:57:35:    | name | lower_bound | value | upper_bound | type  |
INFO - 15:57:35:    +------+-------------+-------+-------------+-------+
INFO - 15:57:35:    | x    |      0      |  None |      1      | float |
INFO - 15:57:35:    | y    |      0      |  None |      1      | float |
INFO - 15:57:35:    +------+-------------+-------+-------------+-------+
INFO - 15:57:35: Solving optimization problem with algorithm DiagonalDOE:
INFO - 15:57:35: ...   0%|          | 0/10 [00:00<?, ?it]
INFO - 15:57:35: ...  10%|█         | 1/10 [00:00<00:00, 369.80 it/sec, obj=0]
INFO - 15:57:35: ...  20%|██        | 2/10 [00:00<00:00, 552.35 it/sec, obj=-1.71]
INFO - 15:57:35: ...  30%|███       | 3/10 [00:00<00:00, 706.63 it/sec, obj=-2.51]
INFO - 15:57:35: ...  40%|████      | 4/10 [00:00<00:00, 801.17 it/sec, obj=-1.93]
INFO - 15:57:35: ...  50%|█████     | 5/10 [00:00<00:00, 881.56 it/sec, obj=-.137]
INFO - 15:57:35: ...  60%|██████    | 6/10 [00:00<00:00, 954.77 it/sec, obj=2.14]
INFO - 15:57:35: ...  70%|███████   | 7/10 [00:00<00:00, 1018.60 it/sec, obj=3.93]
INFO - 15:57:35: ...  80%|████████  | 8/10 [00:00<00:00, 1066.30 it/sec, obj=4.51]
INFO - 15:57:35: ...  90%|█████████ | 9/10 [00:00<00:00, 1112.88 it/sec, obj=3.71]
INFO - 15:57:35: ... 100%|██████████| 10/10 [00:00<00:00, 1153.58 it/sec, obj=2]
INFO - 15:57:35: Optimization result:
INFO - 15:57:35:    Optimizer info:
INFO - 15:57:35:       Status: None
INFO - 15:57:35:       Message: None
INFO - 15:57:35:       Number of calls to the objective function by the optimizer: 10
INFO - 15:57:35:    Solution:
INFO - 15:57:35:       Objective: -2.5099788145921798
INFO - 15:57:35:       Design space:
INFO - 15:57:35:       +------+-------------+--------------------+-------------+-------+
INFO - 15:57:35:       | name | lower_bound |       value        | upper_bound | type  |
INFO - 15:57:35:       +------+-------------+--------------------+-------------+-------+
INFO - 15:57:35:       | x    |      0      | 0.2222222222222222 |      1      | float |
INFO - 15:57:35:       | y    |      0      | 0.2222222222222222 |      1      | float |
INFO - 15:57:35:       +------+-------------+--------------------+-------------+-------+
INFO - 15:57:35: *** End DOEScenario execution (time: 0:00:00.017016) ***
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/stable/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 0x7ff1ae9492b0>


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)

    INFO - 15:57:36:
INFO - 15:57:36: *** Start DOEScenario execution ***
INFO - 15:57:36: DOEScenario
INFO - 15:57:36:    Disciplines: AnalyticDiscipline
INFO - 15:57:36:    MDO formulation: DisciplinaryOpt
INFO - 15:57:36: Optimization problem:
INFO - 15:57:36:    minimize z(x, y)
INFO - 15:57:36:    with respect to x, y
INFO - 15:57:36:    over the design space:
INFO - 15:57:36:    +------+-------------+--------------------+-------------+-------+
INFO - 15:57:36:    | name | lower_bound |       value        | upper_bound | type  |
INFO - 15:57:36:    +------+-------------+--------------------+-------------+-------+
INFO - 15:57:36:    | x    |      0      | 0.2222222222222222 |      1      | float |
INFO - 15:57:36:    | y    |      0      | 0.2222222222222222 |      1      | float |
INFO - 15:57:36:    +------+-------------+--------------------+-------------+-------+
INFO - 15:57:36: Solving optimization problem with algorithm DiagonalDOE:
INFO - 15:57:36: ...   0%|          | 0/10 [00:00<?, ?it]
INFO - 15:57:36: ...  10%|█         | 1/10 [00:00<00:00, 1424.70 it/sec, obj=7.35e-16]
INFO - 15:57:36: ...  20%|██        | 2/10 [00:00<00:00, 1472.46 it/sec, obj=2.15]
INFO - 15:57:36: ...  30%|███       | 3/10 [00:00<00:00, 1538.07 it/sec, obj=3.4]
INFO - 15:57:36: ...  40%|████      | 4/10 [00:00<00:00, 1575.92 it/sec, obj=3.26]
INFO - 15:57:36: ...  50%|█████     | 5/10 [00:00<00:00, 1601.00 it/sec, obj=1.91]
INFO - 15:57:36: ...  60%|██████    | 6/10 [00:00<00:00, 1612.37 it/sec, obj=0.0851]
INFO - 15:57:36: ...  70%|███████   | 7/10 [00:00<00:00, 1610.98 it/sec, obj=-1.26]
INFO - 15:57:36: ...  80%|████████  | 8/10 [00:00<00:00, 1618.72 it/sec, obj=-1.4]
INFO - 15:57:36: ...  90%|█████████ | 9/10 [00:00<00:00, 1626.89 it/sec, obj=-.151]
INFO - 15:57:36: ... 100%|██████████| 10/10 [00:00<00:00, 1635.08 it/sec, obj=2]
INFO - 15:57:36: Optimization result:
INFO - 15:57:36:    Optimizer info:
INFO - 15:57:36:       Status: None
INFO - 15:57:36:       Message: None
INFO - 15:57:36:       Number of calls to the objective function by the optimizer: 10
INFO - 15:57:36:    Solution:
INFO - 15:57:36:       Objective: -1.3988677034810695
INFO - 15:57:36:       Design space:
INFO - 15:57:36:       +------+-------------+--------------------+-------------+-------+
INFO - 15:57:36:       | name | lower_bound |       value        | upper_bound | type  |
INFO - 15:57:36:       +------+-------------+--------------------+-------------+-------+
INFO - 15:57:36:       | x    |      0      | 0.7777777777777777 |      1      | float |
INFO - 15:57:36:       | y    |      0      | 0.2222222222222223 |      1      | float |
INFO - 15:57:36:       +------+-------------+--------------------+-------------+-------+
INFO - 15:57:36: *** End DOEScenario execution (time: 0:00:00.014351) ***
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/stable/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 0x7ff1afc36610>


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

Gallery generated by Sphinx-Gallery