Note
Go to the end to download the full example code
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 import configure_logger
from gemseo import create_design_space
from gemseo import create_discipline
from gemseo import create_scenario
from gemseo.post.dataset.scatter_plot_matrix import ScatterMatrix
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.to_dataset(opt_naming=False)
ScatterMatrix(dataset).execute(save=False, show=True)
INFO - 08:59:36:
INFO - 08:59:36: *** Start DOEScenario execution ***
INFO - 08:59:36: DOEScenario
INFO - 08:59:36: Disciplines: AnalyticDiscipline
INFO - 08:59:36: MDO formulation: DisciplinaryOpt
INFO - 08:59:36: Optimization problem:
INFO - 08:59:36: minimize z(x, y)
INFO - 08:59:36: with respect to x, y
INFO - 08:59:36: over the design space:
INFO - 08:59:36: +------+-------------+-------+-------------+-------+
INFO - 08:59:36: | Name | Lower bound | Value | Upper bound | Type |
INFO - 08:59:36: +------+-------------+-------+-------------+-------+
INFO - 08:59:36: | x | 0 | None | 1 | float |
INFO - 08:59:36: | y | 0 | None | 1 | float |
INFO - 08:59:36: +------+-------------+-------+-------------+-------+
INFO - 08:59:36: Solving optimization problem with algorithm DiagonalDOE:
INFO - 08:59:36: 10%|█ | 1/10 [00:00<00:00, 363.27 it/sec, obj=0]
INFO - 08:59:36: 20%|██ | 2/10 [00:00<00:00, 568.18 it/sec, obj=-1.71]
INFO - 08:59:36: 30%|███ | 3/10 [00:00<00:00, 724.32 it/sec, obj=-2.51]
INFO - 08:59:36: 40%|████ | 4/10 [00:00<00:00, 842.86 it/sec, obj=-1.93]
INFO - 08:59:36: 50%|█████ | 5/10 [00:00<00:00, 931.28 it/sec, obj=-0.137]
INFO - 08:59:36: 60%|██████ | 6/10 [00:00<00:00, 1004.90 it/sec, obj=2.14]
INFO - 08:59:36: 70%|███████ | 7/10 [00:00<00:00, 1056.77 it/sec, obj=3.93]
INFO - 08:59:36: 80%|████████ | 8/10 [00:00<00:00, 1105.91 it/sec, obj=4.51]
INFO - 08:59:36: 90%|█████████ | 9/10 [00:00<00:00, 1149.30 it/sec, obj=3.71]
INFO - 08:59:36: 100%|██████████| 10/10 [00:00<00:00, 1186.44 it/sec, obj=2]
INFO - 08:59:36: Optimization result:
INFO - 08:59:36: Optimizer info:
INFO - 08:59:36: Status: None
INFO - 08:59:36: Message: None
INFO - 08:59:36: Number of calls to the objective function by the optimizer: 10
INFO - 08:59:36: Solution:
INFO - 08:59:36: Objective: -2.5099788145921798
INFO - 08:59:36: Design space:
INFO - 08:59:36: +------+-------------+--------------------+-------------+-------+
INFO - 08:59:36: | Name | Lower bound | Value | Upper bound | Type |
INFO - 08:59:36: +------+-------------+--------------------+-------------+-------+
INFO - 08:59:36: | x | 0 | 0.2222222222222222 | 1 | float |
INFO - 08:59:36: | y | 0 | 0.2222222222222222 | 1 | float |
INFO - 08:59:36: +------+-------------+--------------------+-------------+-------+
INFO - 08:59:36: *** End DOEScenario execution (time: 0:00:00.019272) ***
[<Figure size 640x480 with 9 Axes>]
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.to_dataset(opt_naming=False)
ScatterMatrix(dataset).execute(save=False, show=True)
INFO - 08:59:37:
INFO - 08:59:37: *** Start DOEScenario execution ***
INFO - 08:59:37: DOEScenario
INFO - 08:59:37: Disciplines: AnalyticDiscipline
INFO - 08:59:37: MDO formulation: DisciplinaryOpt
INFO - 08:59:37: Optimization problem:
INFO - 08:59:37: minimize z(x, y)
INFO - 08:59:37: with respect to x, y
INFO - 08:59:37: over the design space:
INFO - 08:59:37: +------+-------------+--------------------+-------------+-------+
INFO - 08:59:37: | Name | Lower bound | Value | Upper bound | Type |
INFO - 08:59:37: +------+-------------+--------------------+-------------+-------+
INFO - 08:59:37: | x | 0 | 0.2222222222222222 | 1 | float |
INFO - 08:59:37: | y | 0 | 0.2222222222222222 | 1 | float |
INFO - 08:59:37: +------+-------------+--------------------+-------------+-------+
INFO - 08:59:37: Solving optimization problem with algorithm DiagonalDOE:
INFO - 08:59:37: 10%|█ | 1/10 [00:00<00:00, 1357.82 it/sec, obj=7.35e-16]
INFO - 08:59:37: 20%|██ | 2/10 [00:00<00:00, 1385.40 it/sec, obj=2.15]
INFO - 08:59:37: 30%|███ | 3/10 [00:00<00:00, 1447.81 it/sec, obj=3.4]
INFO - 08:59:37: 40%|████ | 4/10 [00:00<00:00, 1488.40 it/sec, obj=3.26]
INFO - 08:59:37: 50%|█████ | 5/10 [00:00<00:00, 1501.83 it/sec, obj=1.91]
INFO - 08:59:37: 60%|██████ | 6/10 [00:00<00:00, 1520.32 it/sec, obj=0.0851]
INFO - 08:59:37: 70%|███████ | 7/10 [00:00<00:00, 1538.23 it/sec, obj=-1.26]
INFO - 08:59:37: 80%|████████ | 8/10 [00:00<00:00, 1554.09 it/sec, obj=-1.4]
INFO - 08:59:37: 90%|█████████ | 9/10 [00:00<00:00, 1567.31 it/sec, obj=-0.151]
INFO - 08:59:37: 100%|██████████| 10/10 [00:00<00:00, 1571.90 it/sec, obj=2]
INFO - 08:59:37: Optimization result:
INFO - 08:59:37: Optimizer info:
INFO - 08:59:37: Status: None
INFO - 08:59:37: Message: None
INFO - 08:59:37: Number of calls to the objective function by the optimizer: 10
INFO - 08:59:37: Solution:
INFO - 08:59:37: Objective: -1.398867703481069
INFO - 08:59:37: Design space:
INFO - 08:59:37: +------+-------------+--------------------+-------------+-------+
INFO - 08:59:37: | Name | Lower bound | Value | Upper bound | Type |
INFO - 08:59:37: +------+-------------+--------------------+-------------+-------+
INFO - 08:59:37: | x | 0 | 0.7777777777777777 | 1 | float |
INFO - 08:59:37: | y | 0 | 0.2222222222222223 | 1 | float |
INFO - 08:59:37: +------+-------------+--------------------+-------------+-------+
INFO - 08:59:37: *** End DOEScenario execution (time: 0:00:00.017920) ***
[<Figure size 640x480 with 9 Axes>]
Total running time of the script: (0 minutes 0.877 seconds)