Note
Go to the end to download the full example code.
Execution statistics as a Gantt chart#
When
the global attribute ExecutionStatistics.is_time_stamps_enabled
is True
(default: False
),
the global attribute ExecutionStatistics.time_stamps
is
a dictionary of the form {name: (initial_time, final_time, is_linearization)}
to store
the initial and final times of each execution and linearization of each discipline.
The create_gantt_chart()
function can display this dictionary
in the form of a Gantt chart.
In this example, we illustrate the use of this function on the Sobieski's SSBJ problem.
from __future__ import annotations
from gemseo import configure_logger
from gemseo import create_discipline
from gemseo import create_scenario
from gemseo.core.execution_statistics import ExecutionStatistics
from gemseo.post.core.gantt_chart import create_gantt_chart
from gemseo.problems.mdo.sobieski.core.design_space import SobieskiDesignSpace
configure_logger()
<RootLogger root (INFO)>
Create the scenario#
First, we define the Sobieski's SSBJ problem as a scenario.
For this, we instantiate the disciplines:
disciplines = create_discipline([
"SobieskiPropulsion",
"SobieskiAerodynamics",
"SobieskiStructure",
"SobieskiMission",
])
as well as the design space:
design_space = SobieskiDesignSpace()
Then,
given these disciplines and design space,
we build an MDO scenario using the MDF formulation
in order to maximize the range "y_4"
with respect to the design variables:
scenario = create_scenario(
disciplines,
"y_4",
design_space,
formulation_name="MDF",
maximize_objective=True,
)
WARNING - 00:50:35: Unsupported feature 'minItems' in JSONGrammar 'SobieskiMission_discipline_output' for property 'y_4' in conversion to SimpleGrammar.
WARNING - 00:50:35: Unsupported feature 'maxItems' in JSONGrammar 'SobieskiMission_discipline_output' for property 'y_4' in conversion to SimpleGrammar.
and satisfy the inequality constraints
associated with the outputs "g_1"
, "g_2"
and "g_3"
:
for constraint in ["g_1", "g_2", "g_3"]:
scenario.add_constraint(constraint, constraint_type="ineq")
Execute the scenario#
By default, a scenario does not produce execution statistics. We need to enable this global mechanism before executing the scenario:
ExecutionStatistics.is_time_stamps_enabled = True
Warning
This mechanism is global
and shall be modified from the ExecutionStatistics
class
(not from an ExecutionStatistics
instance).
The scenario can now be executed using the SLSQP optimization algorithm and a maximum of 10 iterations:
scenario.execute(algo_name="SLSQP", max_iter=10)
INFO - 00:50:35:
INFO - 00:50:35: *** Start MDOScenario execution ***
INFO - 00:50:35: MDOScenario
INFO - 00:50:35: Disciplines: SobieskiAerodynamics SobieskiMission SobieskiPropulsion SobieskiStructure
INFO - 00:50:35: MDO formulation: MDF
INFO - 00:50:35: Optimization problem:
INFO - 00:50:35: minimize -y_4(x_shared, x_1, x_2, x_3)
INFO - 00:50:35: with respect to x_1, x_2, x_3, x_shared
INFO - 00:50:35: subject to constraints:
INFO - 00:50:35: g_1(x_shared, x_1, x_2, x_3) <= 0
INFO - 00:50:35: g_2(x_shared, x_1, x_2, x_3) <= 0
INFO - 00:50:35: g_3(x_shared, x_1, x_2, x_3) <= 0
INFO - 00:50:35: over the design space:
INFO - 00:50:35: +-------------+-------------+-------+-------------+-------+
INFO - 00:50:35: | Name | Lower bound | Value | Upper bound | Type |
INFO - 00:50:35: +-------------+-------------+-------+-------------+-------+
INFO - 00:50:35: | x_shared[0] | 0.01 | 0.05 | 0.09 | float |
INFO - 00:50:35: | x_shared[1] | 30000 | 45000 | 60000 | float |
INFO - 00:50:35: | x_shared[2] | 1.4 | 1.6 | 1.8 | float |
INFO - 00:50:35: | x_shared[3] | 2.5 | 5.5 | 8.5 | float |
INFO - 00:50:35: | x_shared[4] | 40 | 55 | 70 | float |
INFO - 00:50:35: | x_shared[5] | 500 | 1000 | 1500 | float |
INFO - 00:50:35: | x_1[0] | 0.1 | 0.25 | 0.4 | float |
INFO - 00:50:35: | x_1[1] | 0.75 | 1 | 1.25 | float |
INFO - 00:50:35: | x_2 | 0.75 | 1 | 1.25 | float |
INFO - 00:50:35: | x_3 | 0.1 | 0.5 | 1 | float |
INFO - 00:50:35: +-------------+-------------+-------+-------------+-------+
INFO - 00:50:35: Solving optimization problem with algorithm SLSQP:
INFO - 00:50:36: 10%|█ | 1/10 [00:00<00:01, 8.58 it/sec, obj=-536]
INFO - 00:50:36: 20%|██ | 2/10 [00:00<00:01, 6.79 it/sec, obj=-2.12e+3]
WARNING - 00:50:36: MDAJacobi has reached its maximum number of iterations, but the normalized residual norm 5.741449586530469e-06 is still above the tolerance 1e-06.
INFO - 00:50:36: 30%|███ | 3/10 [00:00<00:01, 5.40 it/sec, obj=-3.46e+3]
INFO - 00:50:36: 40%|████ | 4/10 [00:00<00:01, 5.17 it/sec, obj=-3.96e+3]
INFO - 00:50:36: 50%|█████ | 5/10 [00:00<00:00, 5.33 it/sec, obj=-4.61e+3]
INFO - 00:50:36: 60%|██████ | 6/10 [00:01<00:00, 5.53 it/sec, obj=-4.5e+3]
INFO - 00:50:37: 70%|███████ | 7/10 [00:01<00:00, 5.60 it/sec, obj=-4.26e+3]
INFO - 00:50:37: 80%|████████ | 8/10 [00:01<00:00, 5.65 it/sec, obj=-4.11e+3]
INFO - 00:50:37: 90%|█████████ | 9/10 [00:01<00:00, 5.70 it/sec, obj=-4.02e+3]
INFO - 00:50:37: 100%|██████████| 10/10 [00:01<00:00, 5.73 it/sec, obj=-3.99e+3]
INFO - 00:50:37: Optimization result:
INFO - 00:50:37: Optimizer info:
INFO - 00:50:37: Status: None
INFO - 00:50:37: Message: Maximum number of iterations reached. GEMSEO stopped the driver.
INFO - 00:50:37: Number of calls to the objective function by the optimizer: 12
INFO - 00:50:37: Solution:
INFO - 00:50:37: The solution is feasible.
INFO - 00:50:37: Objective: -3463.120411437138
INFO - 00:50:37: Standardized constraints:
INFO - 00:50:37: g_1 = [-0.01112145 -0.02847064 -0.04049911 -0.04878943 -0.05476349 -0.14014207
INFO - 00:50:37: -0.09985793]
INFO - 00:50:37: g_2 = -0.0020925663903177405
INFO - 00:50:37: g_3 = [-0.71359843 -0.28640157 -0.05926796 -0.183255 ]
INFO - 00:50:37: Design space:
INFO - 00:50:37: +-------------+-------------+---------------------+-------------+-------+
INFO - 00:50:37: | Name | Lower bound | Value | Upper bound | Type |
INFO - 00:50:37: +-------------+-------------+---------------------+-------------+-------+
INFO - 00:50:37: | x_shared[0] | 0.01 | 0.05947685840242058 | 0.09 | float |
INFO - 00:50:37: | x_shared[1] | 30000 | 59246.692998739 | 60000 | float |
INFO - 00:50:37: | x_shared[2] | 1.4 | 1.4 | 1.8 | float |
INFO - 00:50:37: | x_shared[3] | 2.5 | 2.64097355362077 | 8.5 | float |
INFO - 00:50:37: | x_shared[4] | 40 | 69.32144380869019 | 70 | float |
INFO - 00:50:37: | x_shared[5] | 500 | 1478.031626737187 | 1500 | float |
INFO - 00:50:37: | x_1[0] | 0.1 | 0.4 | 0.4 | float |
INFO - 00:50:37: | x_1[1] | 0.75 | 0.7608797907508461 | 1.25 | float |
INFO - 00:50:37: | x_2 | 0.75 | 0.7607584987262048 | 1.25 | float |
INFO - 00:50:37: | x_3 | 0.1 | 0.1514057659459843 | 1 | float |
INFO - 00:50:37: +-------------+-------------+---------------------+-------------+-------+
INFO - 00:50:37: *** End MDOScenario execution (time: 0:00:01.753403) ***
See also
The formulation settings passed to create_scenario()
and the algorithm settings passed to BaseScenario.execute()
can be provided via Pydantic models.
For more information,
see Algorithm Settings and Formulation Settings.
Plot the Gantt chart#
Lastly,
we plot the Gantt chart from the global ExecutionStatistics.time_stamps
:
create_gantt_chart(save=False, show=True)

<Figure size 1500x1000 with 1 Axes>
This graph shows the evolution over time:
the execution and linearizations of the different user disciplines, e.g.
SobieskiAerodynamics
,the execution and linearizations of the different process disciplines, e.g.
MDAJacobi
,the execution of the scenario.
Disable recording#
Finally, we disable the recording of time stamps for other executions:
ExecutionStatistics.is_time_stamps_enabled = False
Note
As this reset ExecutionStatistics.time_stamps
to None
,
the create_gantt_chart()
function can no longer be used.
Set ExecutionStatistics.is_time_stamps_enabled
to True
and execute or linearize some disciplines
so that you can use it again.
Total running time of the script: (0 minutes 1.986 seconds)