Post-processing

There are three post-processing utilities that are provided with pyOptSparse.

  • OptView is a GUI designed to quickly and interactively visualize optimization histories

  • OptView-Dash is a Dash implementation of OptView

  • History is a Python class that can be used to read in the history file, and provide API for programmatically extracting data.

OptView

Requirements

OptView has the following dependency tree:

matplotlib (OptView)
  \-backends
  | \-backend_tkagg
  |   \-FigureCanvasTkAgg (OptView)
  |   \-NavigationToolbar2TkAgg (OptView)
  \-pyplot (OptView)
mpl_toolkits
  \-axes_grid1
  | \-host_subplot (OptView)
  \-axisartist (OptView)
numpy (OptView)

For installation instructions, see Installing OptView. Although not necessary for most usage, the dill package is needed if you wish to save an editable version of the graph produced in OptView. dill can be installed via pip in a terminal using:

pip install dill

view_saved_figure.py can be used to reformat and view the saved figure.

Usage

OptView can be run via terminal from any directory as:

optview histFile

Here, histFile is the name of the history file to be examined (default is opt_hist.hst).

Additionally, you can open multiple history files in the same OptView instance by calling them via the command line:

optview histFile1 histFile2 histFile3

Each file’s contents will be loaded into OptView with a flag appended to the end of each variable or function name corresponding to the history file. The first one listed will have ‘_A’ added to the name, the second will have ‘_B’ added, etc. There is currently no limit to the number of history files than can be loaded.

Optionally, if you want to save the generated figures, there is an optional argument:

optview histFile --output ~/my_figures

outputDirectory is the name of the desired output directory for saved images. By default, the figure is saved to the directory where you invokved optview.

Features

OptView has many options and features, including:

  • plotting multiple variables on a single plot

  • producing stacked plots

  • live searchable variable names

  • hovering plot labels

  • saving the figure to an image or pickling it for later formatting

  • refreshing the optimization history on the fly

Although some of these are self-explanatory, the layout and usage of OptView will be explained below.

GUI Layout

The window is divided into two sections. The top is the canvas where the figure and graphs will be produced, while the bottom grayed section contains user-selectable options. Here, we will focus on the user options.

The selectable variables are contained on the left hand side of the options panel in scrollable listboxes. You can select multiple items from the listboxes using the normal selection operators such as control and shift. If a selected variable is an array, a third listbox should appear on the right hand side of the options panel, allowing you to select specific sub-variables within the single array variable.

There are three main options when selecting how to produce the graph(s):

  • Shared axes - all selected variables are plotted on a single pair of axes

  • Multiple axes - each selected variable gets its own y-axis while all selected data shares an x-axis

  • Stacked plots - each variable gets its own individual plot and the set is stacked vertically

Most checkbox options should play well with any of these three main options, though there are known issues with using the ‘multiple axes’ option and delta values or for displaying arrays.

There are seven checkbox options:

  • Absolute delta values - displays the absolute difference between one iteration’s value and the previous

  • Log scale - sets the y-axis as a log scale

  • Min/max for arrays - only shows the minimum and maximum value of a variable for each iteration

  • Show all for arrays - plots all variables within an array

  • Show legend - reveals the legend for the plotted data

  • Show bounds - shows the variable bounds as dashed lines

  • Show ‘major’ iterations - a filter to remove the line search iterations from the plotting results; especially useful for SNOPT output

Additionally, four buttons allow control of the plot:

  • Refresh history - reloads the history file; used if checking on an optimization run on the fly

  • Save all figures - saves .png versions of a basic plot for each variable in the history file

  • Save figure - saves a .png and .pickle version of the current plot (the .pickle version can be reformatted afterwards)

  • Quit - exits the program

Lastly, there are some miscellaneous features:

  • A search box to cull the selectable variables

  • A font size slider to control the text size on the plot

  • Hoverable tooltips when the cursor is on a plot line

  • A variable called actual_iteration_number that gives a translation between history file iteration number and run file iteration number. This is especially useful for debugging specific steps of an optimization or comparing values across different histories.

OptView-Dash

This is a Dash implementation of OptView, and has many of the same features offered by OptView. For installation instructions, see Installing OptView. To run, use this command:

optview_dash <filename>

Similar to OptView, you can invoke it with multiple history files. To view the dash app, you will have to manually open the server in your browser that is listed in the terminal after running the above command.

Auto-refresh: This follows the same functionality as OptView, allowing you to see the changes of an optimization as it is running.

  • If you toggle this checklist button, it will cause the program to default update every 10 seconds, however you may modify this refresh rate using the input box underneath

  • Make sure to toggle off this button when you are done or the optimization is complete so it does not add lag.

  • This feature also works with multiple history files/optimizations running!

Directly Accessing the History Object

The history file generated by pyOptSparse is just a SqliteDict object. To extract the stored information in Python, first initialize a History object:

>>> hist = History('path/to/opt_hist.hst', flag='r')

From here, various information can be extracted, using the various get_ methods. To extract iteration history, use the function getValues(). See the page History for a full description of the history file structure and the API.