################################################################################################
Release Notes for OpenMDAO 2.5.0

October 31, 2018

New Features:
--------------
- list_outputs() method now includes a `prom_name` argument to include the promoted name in the printed output (Thanks John Jasa!).
- N2 viewer now includes tool tip (hover over) showing the promoted name of any variable.
- Improved error msg when building sparse partials with duplicate col/row entries.
- You can now build the docs without MPI/PETSc installed (you will get warnings, but no longer errors).
- Major internal refactor to reduce overhead on compute_totals calls (very noticeable on large design spaces but still cheap problems).
- Components now have a `under_complex_step` attribute you can check to see if complex-step is currently active.
- Components `distributed` attribute has been moved to an option (old attribute has been deprecated).
- MetaModelUnstructured will now use FD for partial derivatives of surrogates that don't provide analytic derivatives (user can override the default settings if they wish to use CS or different FD config).
- Improvements to SimpleGA to make it more stable, and added support constraints via penalty functions (Thanks madsmpedersen and onodip).
- Parallel FD and CS at the component and group level is now supported.
- Can turn off the analytic derivative sub-system if it is not needed via an argument to setup().
- Derivative coloring now works for problems that run under MPI.

- New Components in the standard library:
    - Mux and Demux components.

- New CaseRecording/CaseReading Features:
    - DesVar AND output variable bounds are both reordered now.
    - Improved error msg if you try to load a non-existent file with CaseReader.

- **Experimental Feature**: Discrete data passing is now supported as an experimental feature... we're still testing it, and may change the API!

Backwards Incompatible API Changes:
------------------------------------
- `get_objectives` method on CaseReader now returns a dict-like object.
- Output vector is now locked (read-only) when inside the `apply_nonlinear` method (you shouldn't have been changing it then anyway!).
- default step size for complex-step has been changed to 1e-40.
- Moderate refactor of the CaseReader API. It is now self-consistent.

################################################################################################
Release Notes for OpenMDAO 2.4.0

August 1, 2018

New Features:
--------------
- Better error message when upper and lower have the wrong shape for add_design_var and add_constraint methods.
- pyOptSparseDriver now runs the initial condition for ALPSO and NSGA-II optimizers.
- Normalization in EQConstraintComp and BalanceComp is now optional.

- New Components in the standard library:
    - VectorMagnitudeComp

- New Solvers in the standard library:
    - BroydenSolver

- New CaseRecording/CaseReading Features:
    - <Problem>.load_case() method lets you pull values from a case back into the problem.
    - Updated the Case recording format for better performance.
    - User can call <Problem>.record_iteration() to save specific cases.
      Recording options for this method are separate from driver/solver options.
      This is so you can record one (or more) cases manually with *ALL* the variables in it if you want to.

Backwards Incompatible API Changes:
------------------------------------
- The input and output vectors are now put into read-only modes within certain component methods.
  NOTE: This REALLY REALLY should not break anyone's models, but it is technically a backwards-incompatible change...
        If you were changing values in these arrays when you shouldn't have been, you're going to get an error now.
        Fix it... the new error is enforcing correct behavior.
        If it was working before, you got lucky.

Bug Fixes:
------------
- Various small bug fixes to check_partials and check_totals.
- ArmijoGoldstein linesearch iteration counter works correctly now.
- the record_derivatives recorder_option now actually does something!

################################################################################################
Release Notes for OpenMDAO 2.3.1

June 20, 2018


2.3.1 is a quick patch release to correct/update a few release-supporting documents such as the 2.3.0 release notes.
However, a few new features did manage to sneak in:


New Features:
-------------
- Support for simultaneous derivatives in reverse mode.
- Added a '-m' option (possible values 'fwd' and 'rev') to the 'openmdao simul_coloring' command to allow coloring in either direction.
- Users are now warned during 'check_config' if no recorders are defined.

################################################################################################
Release Notes for OpenMDAO 2.3.0

June 12, 2018

New Features:
--------------
- Drivers have new `debug_print` option that writes design vars, objective, and constraints to stdout for each iteration.

- Added a DOEDriver for serial and parallel cases to the standard library.
    (For people who had adopted DOEDriver early, via github, the following things have changed since initial implementation:)
    - The option that controls the parallel behavior for DOEDriver was changed to `procs_per_model` from `parallel`.
    - User can provide a CSV file to the DOEDriver to run an arbitrary set of cases.

- Solvers have new `debug_print` option that will report the initial condition of the solver if it fails to converge.

- SimpleGADriver changes:
    - Will now compute a population size based on 4*sum(bits) + 1 if pop_size=0.
    - Can support models that need more than one processor.

- Problem changes:
    - New Problem methods `<problem>.get_val()` and `<problem>.set_val()` allow the user to specify a unit, and we'll convert to the correct unit (or throw an error if the unit is not compatible).
    - `list_problem_vars()` method will report all design vars, objectives, and constraints.

- OpenMDAO command line utility now works under MPI.
- ExternalCodeComp has new option, `allowed_return_codes` to specify valid return codes.
- Components that request complex-step for partial derivative checks will now fall back to finite-difference if `force_alloc_complex=False`.
- You can now pass a case_prefix argument to run_model or run_driver to name the cases for case recording.
- Beam example problem now runs 20x faster.

- New Analytic Derivatives Features
    - Major re-write of the Feature documentation on the Core Feature, "Working with Analytic Derivatives."
    - User can now set AssembledJacobians for linear solvers. (Big speedup for a lot of lower-order or serial problems).
    - Automatic calculation of total Jacobian sparsity for fwd derivatives for optimizers that support it (lower compute cost when using SNOPT).
    - Automatic simultaneous coloring algorithm for separable problems to speed up derivatives calculations.
    - Option for caching of linear solution vectors to speed up linear solves when using iterative solvers.
    - check_partials now allows you to use `includes` and `excludes` to limit which components get checked.

- New Components in the standard library:
    - CrossProductComp
    - DotProductComp
    - MatrixVectorProductComp
    - ExternalCodeImplicitComp
    - EQConstraintComp

- Updates to existing Components in standard library:
    - LinearSystemComp has been vectorized.
    - KSComp has been vectorized.
    - BsplineComp has been vectorized.

- New CaseRecording/CaseReading Features:
    - CaseRecorder now saves metadata/options from all groups and components.
    - CaseReader now supports `list_inputs` and `list_outputs` methods.
    - User can iterate over cases from a CaseReader in either flat or hierarchical modes.
    - User can re-load a case back into a model via the `load_case()` method.


Backwards-Compatible API Changes:
---------------------------------
- Changed all instances of `metadata` to `options`. `<system>.metadata` has now been deprecated.

- Class name changes to Components, so all end in "Comp" (old class names have been deprecated):
    - MetaModelStructured -> MetaModelStructuredComp
    - MetaModelUnStructured -> MetaModelUnStructuredComp
    - MultiFiMetaModelUnStructured -> MultiFiMetaModelUnStructuredComp
    - ExternalCode -> ExternalCodeComp

- Driver metadata/options can now be set via init args (can still be set as options as well).
- User no longer needs to specify PETSCvector for parallel cases (the framework figures it out now).

- check_totals and check_partials no longer support the `supress_output` argument. Use `out_stream=None` instead.


Backwards-Incompatible API Changes:
-----------------------------------
- `comps` argument in check_partials was replaced with `includes` and `excludes` arguments.
- Re-design of the CaseReader API. Unification of all cases, and simpler iteration over case hierarchies.
- `partial_type` argument for LinearSystemComponent has been removed
- `maxiter` option from BoundsEnforceLS has been removed

Bug Fixes:
-----------
- Fixed bug in component-level FD that caused it to call the model too many times.
- Added proper error check for situation when user creates a variable name containing illegal characters.
- Better error msg when adding objectives or constraints with variables that don't exist under MPI execution.
- Vectorization for MetaModelUnStructuredComp was super-duper broken. It's fixed now.



################################################################################################
Release Notes for OpenMDAO 2.2.1

April 2, 2018

New Features:
--------------
- check_partials() improvements to formatting and clarity. Report of potentially-bad derivatives summarized at bottom of output.
- check_partials() only compares fwd analytic to FD for any components that provide derivatives directly through the Jacobian
    argument to compute_partials or linearize. (significantly less output to view now).
- Docs for UnstructuredMetaModel improved.
- pyoptsparse wrapper only calls run_model before optimization if LinearConstraints are included.
- ScipyOptimizerDriver is now smarter about how it handles linear constraints. It caches the derivatives and doesn't recompute them anymore.
- Docs for ExternalCode improved to show how to handle derivatives.
- cache_linear_solution argument to add_design_var, add_constraint, add_objective, allows iterative linear solves to use previous solution as initial guess.
- New solver debugging tool via the `debug_print` option: writes out initial state values, so failed cases can be more easily replicated.
- Added generic KS component.
- Added generic Bspline component.
- Improved error msg when class is passed into add_subsystem.
- Automated Jacobian coloring algorithm now works across all variables (previously, it was just local within a variable).
- Major refactor of the `compute_totals` method to clean up and simplify.

Backwards-Compatible API Changes:
-----------------------------------
N/A

Backwards-Incompatible API changes:
-----------------------------------
N/A

Bug Fixes:
-----------
- compute_totals works without any arguments now (just uses the default set of des_vars, objectives, and constraints)
- UnstructuredMetaModel can now be sub-classed
- Deprecated ScipyOptimizer class wasn't working correctly, but can now actually be used.

################################################################################################
Release Notes for OpenMDAO 2.2.0

February 9, 2018

New Features:
--------------
- `DirectSolver` now tells you which row or column is singular when it gets a singluar matrix error.
- `ScipyOptimizeDriver` now handles linear constraints more efficiently by only computing them one time.
- Added the `openmdao` command line script to allow for model checking, visualization, and profiling without making modifications to the run script.
- Added a `SimpleGADriver` with a basic genetic algorithm implementation.
- Added a `MetaModelStructured` component with a interpolative method.
- New option for derivative calculations: Simultaneous derivatives, useful when you have totally disjoint Jacobians (e.g. diagonal Jacobians).
- Automatic coloring algorithm added to compute the valid coloring scheme for simultaneous derivatives.
- `list_outputs` method updated with new display options, ability to filter variables by residual value, ability to change sorting scheme, and ability to display unit details.
- openmdao citation helper added to the `openmdao` command line script, making it easy to generate the correct bibtex citations based on which classes are being used.
- `NewtonSolver` modified so that maxiter=0 case now will compute residuals, but not do a linear solve (useful for debugging nonlinear errors).

Backwards-Compatible API Changes:
-----------------------------------
- Changed `ScipyOptimizer` to `ScipyOptimizeDriver` for consistency (deprecated older class).
- Renamed `MetaModel` to `MetaModelUnstructured` to allow for new structured interpolant (deprecated old class).
- Renamed `PetscKSP` to `PETScKrylov` for consistency. (deprecated old class).
- Renamed `ScipyIterativeSolver` to `ScipyKrylov` for consistency. (deprecated old class).


Backwards-Incompatible API changes:
-----------------------------------
- CaseRecorder now uses variables' promoted names for storing and accessing data.
- Removed `DeprecatedComp` from codebase.
- `list_residuals` method on Groups and Components removed.

Bug Fixes:
-----------
- Fixed error check for duplicate connections to a single input from multiple levels of the hierarchy

################################################################################################
Release Notes for OpenMDAO 2.1.0

December 7, 2017

New Features:
-------------
- Configure setup hook allowing changing of solver settings after hierarchy tree is instantiated
- Component metadata system for specifying init_args with error checking
- Parallel Groups
- Units Reference added to the Docs
- Case recording now records all variables by default
- `openmdao` console script that can activate useful debugging features
  (e.g. view_model) without editing the run script
- Scipy COBYLA optimizer converts des var bounds to constraints (the algorithm doesn't natively handle bounds)
- StructuredMetaModel component offers a simple spline interpolation routine for structured data

Backwards Compatible API Changes:
-----------------------------------
- `NonlinearRunOnce` changed `NonLinearRunOnce` for consistency (old class deprecated)
- `types_` argument to `self.metadata.declare` changed to `types`. (old argument deprecated)
- `types` and `values` arguments to `self.metadata.declare`
-  `BalanceComp` has a `use_mult` argument to control if it has a `mult` input, defaulting to false
   (the mult input isn't used most of the time)
- Renamed `MetaModel` to `UnstructuredMetaModel` and `MultiFiMetaModel` to `UnStructuredMultiFiMetaModel`


Backwards Incompatible API changes:
-----------------------------------
- Case Recording options API updated with `.recording_options` attribute on Driver, Solver, and System classes
- `get_subsystem` changed to a private method, removed from public API of System
- `check_partials` now has a `method` argument that controls which type of check

Bug Fixes:
-----------
- Improved error msg on a corner case for when user doesn't declare a partial derivative
- Fixed docs embedding bug when `<>` included in the output text


################################################################################################
Release Notes for OpenMDAO 2.0.2
October 19, 2017

- Fixing further packaging errors by updating packaging information.
- Added tutorials for derivatives of explicit and implicit components.


################################################################################################
Release Notes for OpenMDAO 2.0.1
October 19, 2017

- Attempting to fix test errors that were happening by updating the packaging information.


################################################################################################
Release Notes for OpenMDAO 2.0.0
October 19, 2017

First public release of 2.0.0.


New Features:
--------------
(first release... so EVERYTHING!)
- Drivers:
    - ScipyOptimizer
    - PyoptSparseOptimizer
- Solvers:
    - Nonlinear:
        - NonlinearBlockGS
        - NonlinearBlockJac
        - NonlinearRunOnce
        - NewtonSolver
    - Linear:
        - LinearBlockGS
        - LinearBlockJac
        - LinearRunOnce
        - DirectSolver
        - PetscKSP
        - ScipyIterativeSolver
        - LinearUserDefined
    - LineSearch
        - AmijoGoldsetinLS
        - BoundsEnforceLS
- Components:
    - MetaModel
    - ExecComp
    - BalanceComp
    - LinearSystemComp

- General Capability:
    - Implicit and Explicit Components
    - Serial and Parallel Groups
    - Parallel distributed components (components that need an MPI comm)
    - Unit conversions
    - Variable scaling
    - Specifying component metadata
    - Analytic derivatives


Currently Missing Features that existed in 1.7.3:
-------------------------------------------------
- Pass-by-object variables (anything that is not a float)
- File Variables
- automatic ordering of groups/components based on connections
- Design of Experiments Driver (DOE)
- Parallel Finite Difference
- File-Wrapping utility library & External Code Component
- Approximate active set constraint calculation skipping
- Brent Solver
- CaseRecorders for CSV, HDF5, and Dump formats

Bug Fixes
----------
N/A
