DOE from an array#

from __future__ import annotations

import numpy as np

from gemseo import create_design_space
from gemseo import create_discipline
from gemseo import create_scenario

Let us consider a discipline implementing the function \(y=a*b\)

discipline = create_discipline("AnalyticDiscipline", expressions={"y": "a*b"})

where \(a,b\in\{1,2,\ldots,10\}\):

design_space = create_design_space()
design_space.add_variable("a", 1, design_space.DesignVariableType.INTEGER, 1, 10)
design_space.add_variable("b", 1, design_space.DesignVariableType.INTEGER, 1, 10)

We want to evaluate this discipline over this design space by using the following input samples:

sample_1 = [1.0, 2.0]
sample_2 = [2.0, 3.0]
samples = np.array([sample_1, sample_2])

For that, we can create a scenario and execute it with a CustomDOE with the setting "samples":

scenario = create_scenario(
    [discipline],
    "y",
    design_space,
    scenario_type="DOE",
    formulation_name="DisciplinaryOpt",
)
scenario.execute(algo_name="CustomDOE", samples=samples)
INFO - 16:25:36: *** Start DOEScenario execution ***
INFO - 16:25:36: DOEScenario
INFO - 16:25:36:    Disciplines: AnalyticDiscipline
INFO - 16:25:36:    MDO formulation: DisciplinaryOpt
INFO - 16:25:36: Optimization problem:
INFO - 16:25:36:    minimize y(a, b)
INFO - 16:25:36:    with respect to a, b
INFO - 16:25:36:    over the design space:
INFO - 16:25:36:       +------+-------------+-------+-------------+---------+
INFO - 16:25:36:       | Name | Lower bound | Value | Upper bound | Type    |
INFO - 16:25:36:       +------+-------------+-------+-------------+---------+
INFO - 16:25:36:       | a    |      1      |  None |      10     | integer |
INFO - 16:25:36:       | b    |      1      |  None |      10     | integer |
INFO - 16:25:36:       +------+-------------+-------+-------------+---------+
INFO - 16:25:36: Solving optimization problem with algorithm CustomDOE:
INFO - 16:25:36:     50%|█████     | 1/2 [00:00<00:00, 514.32 it/sec, feas=True, obj=2]
INFO - 16:25:36:    100%|██████████| 2/2 [00:00<00:00, 842.23 it/sec, feas=True, obj=6]
INFO - 16:25:36: Optimization result:
INFO - 16:25:36:    Optimizer info:
INFO - 16:25:36:       Status: None
INFO - 16:25:36:       Message: None
INFO - 16:25:36:    Solution:
INFO - 16:25:36:       Objective: 2.0
INFO - 16:25:36:       Design space:
INFO - 16:25:36:          +------+-------------+-------+-------------+---------+
INFO - 16:25:36:          | Name | Lower bound | Value | Upper bound | Type    |
INFO - 16:25:36:          +------+-------------+-------+-------------+---------+
INFO - 16:25:36:          | a    |      1      |   1   |      10     | integer |
INFO - 16:25:36:          | b    |      1      |   2   |      10     | integer |
INFO - 16:25:36:          +------+-------------+-------+-------------+---------+
INFO - 16:25:36: *** End DOEScenario execution (time: 0:00:00.004881) ***

Note that both the formulation settings passed to create_scenario() and the algorithm settings passed to execute() can be provided via a Pydantic model. For more information, see Formulation Settings and Algorithm Settings.

Then, we can display the content of the database as a Dataset and check the values of the output, which should be the product of \(a\) and \(b\):

opt_problem = scenario.formulation.optimization_problem
dataset = opt_problem.to_dataset(name="custom_sampling", opt_naming=False)
dataset
GROUP inputs outputs
VARIABLE a b y
COMPONENT 0 0 0
0 1 2 2.0
1 2 3 6.0


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

Gallery generated by Sphinx-Gallery