Suppose we have an optimization problem with one DV group xvars, one constraint con, and the objective is called obj.
In this case, the history file would have the following layout:
├── metadata │ ├── optName │ ├── optOptions │ ├── nprocs │ ├── startTime │ ├── endTime │ ├── optTime │ ├── optimizer │ ├── version │ └── optVersion ├── optProb ├── varInfo │ └── xvars │ ├── lower │ ├── upper │ └── scale ├── conInfo │ └── con │ ├── lower │ ├── upper │ └── scale ├── objInfo │ └── obj │ └── scale ├── 0 │ ├── xuser │ │ └── xvars │ ├── funcs │ │ ├── obj │ │ └── con │ ├── iter │ ├── fail │ ├── isMajor | └── time ├── 1 │ ├── xuser │ │ └── xvars │ ├── funcsSens │ │ ├── obj │ │ │ └── xvars │ │ └── con │ │ └── xvars │ ├── iter │ ├── fail │ ├── isMajor | └── time └── last
The main optimization history is indexed via call counters, in this example 0 and 1.
Note that they do not match the major/minor iterations of a given optimizer, since gradient evaluations are stored separate from the function evaluation.
For SNOPT and IPOPT, a number of other values can be requested and stored in each major iteration, such as the feasibility and optimality. See SNOPT and IPOPT documentation pages for more details.
.. currentmodule:: pyoptsparse.pyOpt_history
.. autoclass:: History :members: