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)
Execution (blue) and linearization (red) of the disciplines
<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)

Gallery generated by Sphinx-Gallery