################################################################################################
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
