=====================
 coopr.opt CHANGELOG
=====================

-------------------------------------------------------------------------------
 2.4.1
-------------------------------------------------------------------------------

- Migrating OS-specific functionality out of coopr.opt.  This functionality is
  now supported by in coopr.os

-------------------------------------------------------------------------------
 2.4
-------------------------------------------------------------------------------

- Adding logic to disable PICO when found in /usr/bin or /bin.  This supports
  the use of coopr.opt on Mac OS.

- Added logic to confirm that a license is available if it has been reserved.

- Update of OS input/results types (using OSiL vs OSpL)

- Added a method to extract a YAML representation of a
  results object.  Print out infinities with YAML-compliant format.

- Misc change to I/O. Conditionally print timing for the results reader
  output.

- Altered solver.py and convert.py to more directly pass solver
  capabilities to the solver writers.

- Added function 'has_capability' to 'OptSolve?', the generic base class
  for all solvers. Accepts a string 'st', and returns true if
  self._capabilities[st] == True, and False otherwise. Derived classes
  are responsible for overriding the contents of self._capabilities.

- Rework of tests to use new plugin factory mechanism
  supported by pyutilib.component.core

-------------------------------------------------------------------------------
 2.3
-------------------------------------------------------------------------------

- Updated descriptions of solver status and associated termination 
  conditions.

- Adding a subpackage for optimization-specific testing tools.
  Currently, this contains a customized PyUnit? testing class that
  contains new testing functions.

- Reworked converter utility to recognize that *.py files have Pyomo
  models.

- Adding a suffixes attribute to the base solver class. This is a list of
  suffixes that the solver will - assuming it can - load into a solution.
  Examples are rc, dual, slack, etc. A derived solver plugin classes
  will throw an exception if provided a suffix that it can't handle.

-------------------------------------------------------------------------------
 2.2
-------------------------------------------------------------------------------

- Update to account for changes in pyutilib.plugin.* names

- Removed the colin stuff from coopr.opt

- Adding a hook for specifying the format for reading/writing IO formats.

- Added a _report_timing attribute to the base solver class.  If true, it will
  print out presolve/solve/postsolve timing statistics.

- Added results_schema utility function.

- Changed the API of the SolutionSet object.  Now, all variables, constraints
  can be indexed with 1-based integer indices (rather than 0-based).  This
  makes this object consistent with the Pyomo API.

- Renamed TerminationStatus to TerminationCondition

-------------------------------------------------------------------------------
 2.1
-------------------------------------------------------------------------------

- Adding "mipgap" attribute to the base solver class, mirroring the
  timelimit option. This option is pervasive, and the solver plugins
  themselves need to know how to write the option.

- Added a "solve_all_instances" utility function to the solver manager
  library. This function takes three arguments:
  - a solver manager
  - a solver
  - a list of instances
  The routine applies the supplied solver (through the supplied solver
  manager) to each of the instances, retreives the results, loads them
  into the corresponding instance, and performs a barrier synchronization,
  returning when all instance solves are complete.

- Adding default options to SolutionSet object's call method. Thus, the
  default it to access the first solution.

- Added "warm_start_capable" query method to OptSolver base class. Default is
  to return False.

- Fixed a major memory leak in the solver manager. When get_results() was
  previously invoked, the action handle was referenced as a key in
  the map, and the corresponding results object was deleted. However,
  it wasn't cleaned up in the solver manager results map. Consequently,
  the solver manager kept a copy of every result object ever created

- Changes to clarify what solver outputs entail. Now, logfiles are
  processed whenever available, and other data is processed with an
  appropriate reader. The exception is 'soln' files, which generically
  refers to solver-specific solution results. These are parsed with a
  solver method.

- Changes to make SolverResults objects pickleable.

- Rework of the SolverResults object, to provide for a more explicit
  definition of solver results, and to support loading of solver results
  from YAML-formated data.

- Standardized the technique used for guessing a file's format from
  its name.

- Standardized plugin interfaces to sort the plugin names when they
  are requested by the user.

-------------------------------------------------------------------------------
 2.0
-------------------------------------------------------------------------------

- Initial release of Coopr to create the coopr.misc package.

- See coopr.dist for previous ChangeLog information related to Coopr.

