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 import get_post_processing_options_schema
from gemseo.problems.sellar.sellar_design_space import SellarDesignSpace

configure_logger()
<RootLogger root (INFO)>

Get available DOE algorithms

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

print(get_available_post_processings())
['Animation', 'BasicHistory', 'Compromise', 'ConstraintsHistory', 'Correlations', 'GradientSensitivity', 'HighTradeOff', 'MultiObjectiveDiagram', 'ObjConstrHist', 'OptHistoryView', 'ParallelCoordinates', 'ParetoFront', 'Petal', 'QuadApprox', 'Radar', 'RadarChart', 'Robustness', 'SOM', 'ScatterPareto', 'ScatterPlotMatrix', 'TopologyView', 'VariableInfluence']

Get options schema

For a given post-processing algorithm, e.g. "RadarChart", we can get the options; e.g.

print(get_post_processing_options_schema("RadarChart"))
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/5.0.0/lib/python3.9/site-packages/genson/schema/strategies/base.py:42: UserWarning: Schema incompatible. Keyword 'description' has conflicting values ('The width and height of the figure in inches, e.g. ``(w, h)``.\nIf ``None``, use the :attr:`.OptPostProcessor.DEFAULT_FIG_SIZE`\nof the post-processor.' vs. 'The width and height of the figure in inches, e.g. `(w, h)`.\nIf ``None``, use the :attr:`.OptPostProcessor.DEFAULT_FIG_SIZE`\nof the post-processor.'). Using 'The width and height of the figure in inches, e.g. ``(w, h)``.\nIf ``None``, use the :attr:`.OptPostProcessor.DEFAULT_FIG_SIZE`\nof the post-processor.'
  warn(('Schema incompatible. Keyword {0!r} has conflicting '
{'$schema': 'http://json-schema.org/draft-04/schema', 'additionalProperties': False, 'type': 'object', 'properties': {'save': {'description': 'If True, save the figure.', 'type': 'boolean'}, 'show': {'description': 'If True, display the figure.', 'type': 'boolean'}, 'file_path': {'anyOf': [{'description': 'The path of the file to save the figures.\nIf the extension is missing, use ``file_extension``.\nIf ``None``,\ncreate a file path\nfrom ``directory_path``, ``file_name`` and ``file_extension``.', 'type': 'string'}, {'description': 'The path of the file to save the figures.\nIf the extension is missing, use ``file_extension``.\nIf ``None``,\ncreate a file path\nfrom ``directory_path``, ``file_name`` and ``file_extension``.', 'type': 'null'}]}, 'file_extension': {'anyOf': [{'description': "A file extension, e.g. 'png', 'pdf', 'svg', ...\nIf ``None``, use a default file extension.", 'type': 'string'}, {'description': "A file extension, e.g. 'png', 'pdf', 'svg', ...\nIf ``None``, use a default file extension.", 'type': 'null'}]}, 'file_name': {'anyOf': [{'description': 'The name of the file to save the figures.\nIf ``None``, use a default one generated by the post-processing.', 'type': 'string'}, {'description': 'The name of the file to save the figures.\nIf ``None``, use a default one generated by the post-processing.', 'type': 'null'}]}, 'directory_path': {'anyOf': [{'description': 'The path of the directory to save the figures.\nIf ``None``, use the current working directory.', 'type': 'string'}, {'description': 'The path of the directory to save the figures.\nIf ``None``, use the current working directory.', 'type': 'null'}]}, 'fig_size': {'anyOf': [{'description': 'The width and height of the figure in inches, e.g. ``(w, h)``.\nIf ``None``, use the :attr:`.OptPostProcessor.DEFAULT_FIG_SIZE`\nof the post-processor.', 'type': 'null'}, {'minItems': 2, 'maxItems': 2, 'description': 'The width and height of the figure in inches, e.g. ``(w, h)``.\nIf ``None``, use the :attr:`.OptPostProcessor.DEFAULT_FIG_SIZE`\nof the post-processor.', 'type': 'array', 'items': {'type': 'number'}}]}, 'iteration': {'anyOf': [{'description': 'Either an iteration in :math:`-N,\\ldots,-1,1,`ldots,N`\nor the tag :attr:`.OPTIMUM` for the iteration\nat which the optimum is located,\nwhere :math:`N` is the length of the database.', 'type': 'integer'}, {'enum': ['opt'], 'description': 'Either an iteration in :math:`-N,\\ldots,-1,1,`ldots,N`\nor the tag :attr:`.OPTIMUM` for the iteration\nat which the optimum is located,\nwhere :math:`N` is the length of the database.', 'type': 'string'}]}, 'constraint_names': {'anyOf': [{'description': 'The names of the constraints.\nIf None, use all the constraints.', 'type': 'null'}, {'description': 'The names of the constraints.\nIf None, use all the constraints.', 'type': 'array', 'items': {'minItems': 1, 'type': 'string'}}]}, 'show_names_radially': {'description': 'Whether to write the names of the constraints\nin the radial direction.\nOtherwise, write them horizontally.\nThe radial direction can be useful for a high number of constraints.', 'type': 'boolean'}}, 'required': []}

Post-process a scenario

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

disciplines = create_discipline(["Sellar1", "Sellar2", "SellarSystem"])
design_space = SellarDesignSpace()
scenario = create_scenario(disciplines, "MDF", "obj", design_space, "SellarMDFScenario")
scenario.execute({"algo": "NLOPT_SLSQP", "max_iter": 100})
execute_post(scenario, "OptHistoryView", save=False, show=True)
  • Evolution of the optimization variables
  • Evolution of the objective value
  • Distance to the optimum
  • Hessian diagonal approximation
/home/docs/checkouts/readthedocs.org/user_builds/gemseo/envs/5.0.0/lib/python3.9/site-packages/gemseo/algos/design_space.py:426: ComplexWarning: Casting complex values to real discards the imaginary part
  self.__current_value[name] = array_value.astype(
    INFO - 16:29:26:
    INFO - 16:29:26: *** Start SellarMDFScenario execution ***
    INFO - 16:29:26: SellarMDFScenario
    INFO - 16:29:26:    Disciplines: Sellar1 Sellar2 SellarSystem
    INFO - 16:29:26:    MDO formulation: MDF
    INFO - 16:29:26: Optimization problem:
    INFO - 16:29:26:    minimize obj(x_local, x_shared)
    INFO - 16:29:26:    with respect to x_local, x_shared
    INFO - 16:29:26:    over the design space:
    INFO - 16:29:26:    +-------------+-------------+-------+-------------+-------+
    INFO - 16:29:26:    | name        | lower_bound | value | upper_bound | type  |
    INFO - 16:29:26:    +-------------+-------------+-------+-------------+-------+
    INFO - 16:29:26:    | x_local     |      0      |   1   |      10     | float |
    INFO - 16:29:26:    | x_shared[0] |     -10     |   4   |      10     | float |
    INFO - 16:29:26:    | x_shared[1] |      0      |   3   |      10     | float |
    INFO - 16:29:26:    +-------------+-------------+-------+-------------+-------+
    INFO - 16:29:26: Solving optimization problem with algorithm NLOPT_SLSQP:
    INFO - 16:29:26: ...   0%|          | 0/100 [00:00<?, ?it]
    INFO - 16:29:26: ...   1%|          | 1/100 [00:00<00:03, 31.17 it/sec, obj=21.8+j]
    INFO - 16:29:26: ...   2%|▏         | 2/100 [00:00<00:03, 24.51 it/sec, obj=101+j]
    INFO - 16:29:26: ...   3%|▎         | 3/100 [00:00<00:02, 36.62 it/sec, obj=4.79+j]
 WARNING - 16:29:26: MDAJacobi has reached its maximum number of iterations but the normed residual 0.0217151501538871 is still above the tolerance 1e-06.
    INFO - 16:29:26: ...   4%|▍         | 4/100 [00:00<00:03, 24.07 it/sec, obj=0.825-.141j]
    INFO - 16:29:26: ...   5%|▌         | 5/100 [00:00<00:03, 28.10 it/sec, obj=3.18+j]
    INFO - 16:29:26: ...   6%|▌         | 6/100 [00:00<00:02, 33.66 it/sec, obj=0.571+j]
    INFO - 16:29:26: ...   7%|▋         | 7/100 [00:00<00:03, 28.46 it/sec, obj=0.535+j]
    INFO - 16:29:26: ...   8%|▊         | 8/100 [00:00<00:03, 29.40 it/sec, obj=0.528+j]
    INFO - 16:29:26: ...   9%|▉         | 9/100 [00:00<00:03, 30.25 it/sec, obj=0.527+j]
    INFO - 16:29:26: ...  10%|█         | 10/100 [00:00<00:02, 32.38 it/sec, obj=0.527+j]
    INFO - 16:29:26: ...  11%|█         | 11/100 [00:00<00:02, 35.58 it/sec, obj=0.527+j]
    INFO - 16:29:26: ...  12%|█▏        | 12/100 [00:00<00:02, 31.92 it/sec, obj=0.527+j]
    INFO - 16:29:26: ...  13%|█▎        | 13/100 [00:00<00:02, 33.49 it/sec, obj=0.527+j]
    INFO - 16:29:26: ...  14%|█▍        | 14/100 [00:00<00:02, 36.02 it/sec, obj=0.527+j]
    INFO - 16:29:26: ...  15%|█▌        | 15/100 [00:00<00:02, 37.51 it/sec, obj=0.527+j]
    INFO - 16:29:26: ...  16%|█▌        | 16/100 [00:00<00:02, 38.92 it/sec, obj=0.527+j]
    INFO - 16:29:26: ...  17%|█▋        | 17/100 [00:00<00:02, 40.29 it/sec, obj=0.527+j]
    INFO - 16:29:26: ...  18%|█▊        | 18/100 [00:00<00:01, 41.58 it/sec, obj=0.527+j]
    INFO - 16:29:26: ...  19%|█▉        | 19/100 [00:00<00:01, 42.80 it/sec, obj=0.527+j]
    INFO - 16:29:26: ...  20%|██        | 20/100 [00:00<00:01, 43.93 it/sec, obj=0.527+j]
    INFO - 16:29:26: Optimization result:
    INFO - 16:29:26:    Optimizer info:
    INFO - 16:29:26:       Status: None
    INFO - 16:29:26:       Message: Successive iterates of the design variables are closer than xtol_rel or xtol_abs. GEMSEO Stopped the driver
    INFO - 16:29:26:       Number of calls to the objective function by the optimizer: 24
    INFO - 16:29:26:    Solution:
    INFO - 16:29:26:       Objective: (0.5272881447376523+0j)
    INFO - 16:29:26:       Design space:
    INFO - 16:29:26:       +-------------+-------------+-----------------------+-------------+-------+
    INFO - 16:29:26:       | name        | lower_bound |         value         | upper_bound | type  |
    INFO - 16:29:26:       +-------------+-------------+-----------------------+-------------+-------+
    INFO - 16:29:26:       | x_local     |      0      | 3.544728527328585e-13 |      10     | float |
    INFO - 16:29:26:       | x_shared[0] |     -10     |   0.5816393541920579  |      10     | float |
    INFO - 16:29:26:       | x_shared[1] |      0      |           0           |      10     | float |
    INFO - 16:29:26:       +-------------+-------------+-----------------------+-------------+-------+
    INFO - 16:29:26: *** End SellarMDFScenario execution (time: 0:00:00.470705) ***

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

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

Gallery generated by Sphinx-Gallery