Post-processing#

In this example, we will discover the different functions of the API related to graphical post-processing of scenarios.

from __future__ import annotations

from gemseo import configure_logger
from gemseo import create_discipline
from gemseo import create_scenario
from gemseo import execute_post
from gemseo import get_available_post_processings
from gemseo.problems.mdo.sellar.sellar_design_space import SellarDesignSpace

configure_logger()
<RootLogger root (INFO)>

Get available post-processors#

The get_available_post_processings() function returns the list of post-processing algorithms available in GEMSEO or in external modules

get_available_post_processings()
['Animation', 'BasicHistory', 'ConstraintsHistory', 'Correlations', 'GradientSensitivity', 'HessianHistory', 'ObjConstrHist', 'OptHistoryView', 'ParallelCoordinates', 'ParetoFront', 'QuadApprox', 'RadarChart', 'Robustness', 'SOM', 'ScatterPlotMatrix', 'TopologyView', 'VariableInfluence']

Post-process a scenario#

The API function execute_post() can generate visualizations of the optimization or DOE results. For that, it considers the object to post-process to_post_proc, the post-processor post_name with its **settings. E.g.

disciplines = create_discipline(["Sellar1", "Sellar2", "SellarSystem"])
design_space = SellarDesignSpace()
scenario = create_scenario(
    disciplines, "obj", design_space, name="SellarMDFScenario", formulation_name="MDF"
)
scenario.add_constraint("c_1", constraint_type="ineq")
scenario.add_constraint("c_2", constraint_type="ineq")
scenario.execute(algo_name="NLOPT_SLSQP", max_iter=100)
execute_post(scenario, post_name="OptHistoryView", save=False, show=False)
  • Evolution of the optimization variables
  • Evolution of the objective value
  • Evolution of the distance to the optimum
  • Evolution of the inequality constraints
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/stable/lib/python3.9/site-packages/gemseo/algos/design_space.py:424: ComplexWarning: Casting complex values to real discards the imaginary part
  self.__current_value[name] = array_value.astype(
    INFO - 08:36:37:
    INFO - 08:36:37: *** Start SellarMDFScenario execution ***
    INFO - 08:36:37: SellarMDFScenario
    INFO - 08:36:37:    Disciplines: Sellar1 Sellar2 SellarSystem
    INFO - 08:36:37:    MDO formulation: MDF
    INFO - 08:36:37: Optimization problem:
    INFO - 08:36:37:    minimize obj(x_1, x_2, x_shared)
    INFO - 08:36:37:    with respect to x_1, x_2, x_shared
    INFO - 08:36:37:    subject to constraints:
    INFO - 08:36:37:       c_1(x_1, x_2, x_shared) <= 0
    INFO - 08:36:37:       c_2(x_1, x_2, x_shared) <= 0
    INFO - 08:36:37:    over the design space:
    INFO - 08:36:37:       +-------------+-------------+-------+-------------+-------+
    INFO - 08:36:37:       | Name        | Lower bound | Value | Upper bound | Type  |
    INFO - 08:36:37:       +-------------+-------------+-------+-------------+-------+
    INFO - 08:36:37:       | x_1         |      0      |   1   |      10     | float |
    INFO - 08:36:37:       | x_2         |      0      |   1   |      10     | float |
    INFO - 08:36:37:       | x_shared[0] |     -10     |   4   |      10     | float |
    INFO - 08:36:37:       | x_shared[1] |      0      |   3   |      10     | float |
    INFO - 08:36:37:       +-------------+-------------+-------+-------------+-------+
    INFO - 08:36:37: Solving optimization problem with algorithm NLOPT_SLSQP:
    INFO - 08:36:37:      1%|          | 1/100 [00:00<00:01, 61.88 it/sec, obj=23]
    INFO - 08:36:37:      2%|▏         | 2/100 [00:00<00:03, 26.77 it/sec, obj=5.39]
    INFO - 08:36:37:      3%|▎         | 3/100 [00:00<00:03, 31.17 it/sec, obj=3.41]
    INFO - 08:36:37:      4%|▍         | 4/100 [00:00<00:02, 34.00 it/sec, obj=3.19]
    INFO - 08:36:37:      5%|▌         | 5/100 [00:00<00:02, 35.96 it/sec, obj=3.18]
    INFO - 08:36:37:      6%|▌         | 6/100 [00:00<00:02, 37.39 it/sec, obj=3.18]
   ERROR - 08:36:37: NLopt run failed: NLopt roundoff-limited, RoundoffLimited
Traceback (most recent call last):
  File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/stable/lib/python3.9/site-packages/gemseo/algos/opt/nlopt/nlopt.py", line 384, in _run
    nlopt_problem.optimize(x_0.real)
  File "/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/stable/lib/python3.9/site-packages/nlopt/nlopt.py", line 335, in optimize
    return _nlopt.opt_optimize(self, *args)
nlopt.RoundoffLimited: NLopt roundoff-limited
    INFO - 08:36:37:      7%|▋         | 7/100 [00:00<00:02, 42.86 it/sec, obj=3.18]
    INFO - 08:36:37: Optimization result:
    INFO - 08:36:37:    Optimizer info:
    INFO - 08:36:37:       Status: None
    INFO - 08:36:37:       Message: GEMSEO stopped the driver.
    INFO - 08:36:37:       Number of calls to the objective function by the optimizer: 8
    INFO - 08:36:37:    Solution:
    INFO - 08:36:37:       The solution is feasible.
    INFO - 08:36:37:       Objective: 3.1833939621753298
    INFO - 08:36:37:       Standardized constraints:
    INFO - 08:36:37:          c_1 = 1.6424639426304566e-11
    INFO - 08:36:37:          c_2 = -20.244722684036216
    INFO - 08:36:37:       Design space:
    INFO - 08:36:37:          +-------------+-------------+-----------------------+-------------+-------+
    INFO - 08:36:37:          | Name        | Lower bound |         Value         | Upper bound | Type  |
    INFO - 08:36:37:          +-------------+-------------+-----------------------+-------------+-------+
    INFO - 08:36:37:          | x_1         |      0      | 5.024971568646571e-12 |      10     | float |
    INFO - 08:36:37:          | x_2         |      0      |           0           |      10     | float |
    INFO - 08:36:37:          | x_shared[0] |     -10     |   1.977638860654281   |      10     | float |
    INFO - 08:36:37:          | x_shared[1] |      0      | 1.344468165645798e-12 |      10     | float |
    INFO - 08:36:37:          +-------------+-------------+-----------------------+-------------+-------+
    INFO - 08:36:37: *** End SellarMDFScenario execution (time: 0:00:00.169279) ***

<gemseo.post.opt_history_view.OptHistoryView object at 0x7f2522792550>

It is also possible to pass a settings model to execute_post() with the keyword settings_model, as shown below. See Post-processor Settings for more information.

from gemseo.settings.post import ConstraintsHistory_Settings  # noqa: E402

execute_post(
    scenario,
    settings_model=ConstraintsHistory_Settings(
        constraint_names=["c_1", "c_2"],
        save=False,
        show=True,
    ),
)
Evolution of the constraints w.r.t. iterations, c_1 (inequality), c_2 (inequality)
<gemseo.post.constraints_history.ConstraintsHistory object at 0x7f2522661580>

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

Gallery generated by Sphinx-Gallery