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

-------------------------------------------------------------------------------
2.12.2
-------------------------------------------------------------------------------

- Raise exception inside the solve method when a solver is not
  available to avoid a cryptic error message when executable()
  returns None

- Adding a conditional. Problem conversions are not done unless the
  problem format is defined.

-------------------------------------------------------------------------------
2.12.1
-------------------------------------------------------------------------------

- Adding error checks when pyro is not installed.

-------------------------------------------------------------------------------
2.12
-------------------------------------------------------------------------------

- Moved plugins into coopr.opt.plugins

- Add documentation with the coopr_command decorator.

- Added a function to load solvers from a list

- Changing semantics for available(). By default it now
  returns a flag, rather than throw an exception.

- Disablied the del() function in a results object.

- Py3k fixes

- Setting the logger to coopr.solver, so we can suppress solver warnings.

- Print list of NEOS solvers with the 'coopr solvers' command.

- Fixing Tempfile management so developer repositories no longer
  get polluted with tempfiles after this modules tests are run

- Modified the logic for handling exceptions in the Pyro MIP server,
  to better isolate and output the specific sources.

- Adding PersistentSolver class to Solver hierarchy.

- Changing the SolverFactory so that when the Factory fails to
  create a solver it returns an "UnknownSolver" object with debugging
  information instead of None.

- Before returning an UnknownSolver object, check to see if
  coopr.environ has been imported. If it has not, then toss a
  deprecation warning and go ahead and import coopr.environ. This
  will present a graceful fallback for old scripts (<= Coopr 3.4)
  that are not explicitly importing coopr.environ.

- Adding more diagnostics from a *.sol file when 
  the Option line is not found.

-------------------------------------------------------------------------------
2.11
-------------------------------------------------------------------------------

- Added attribute "output_fixed_variable_bounds" to base solver
  class. The attribute is analogous (and is as universal) to
  symbolic_solver_labels, in that it controls features of writers.
  If output_fixed_variable_bounds is True, then writers should not
  ignore fixed variables (assuming that preprocess() has eliminated
  them from compiled representations such as canonical), but rather
  should instantiate them and force their bounds to be equal to the
  current value.

- Updating solution printing so that Constraint information is still
  printed in multi-line YAML format (instead of inline).

- Adding a hook for call-back functions.

- Changing representation of constraint information in a solution
  from MapContainer objects to native dictionaries. The memory for
  the former is exceptionally large, relative to the latter.

- Updating the sol file reader to continue parsing with an infeasible
  termination condition. This makes it possible to collect the iis
  table for infeasible models through suffixes defined in the sol
  file.

-------------------------------------------------------------------------------
2.10
-------------------------------------------------------------------------------

- Making the sol reader general to multi-objective case.

- py3k fixes

- Adding OptSolver methods to update/query the problem/results formats.

- Removed SymbolMap

- Adding code to the .sol file reader to extract suffix data and
  store in the results object.

-------------------------------------------------------------------------------
2.9.1
-------------------------------------------------------------------------------

- Do not remove temporary files if the keepfiles option has been specified. 

-------------------------------------------------------------------------------
 2.9
-------------------------------------------------------------------------------

- Adding an AmplModel class, which serves as a wrapper for models.

- Changes related to infrastructure for passing keyword arguments
  through to the solver writers.

- Using the push/pop semantics for the TempfileManager

- Cleaning up some inefficient code in the Symbol Map.

-------------------------------------------------------------------------------
 2.8
-------------------------------------------------------------------------------

- Updated results processing to comply with changes in coopr.pyomo

- Adding "createSymbol" method to the SymbolMap? class, to deal
  with situations where the caller knows a particular entry will not
  be in the map. In such situations, it is not necessary to pay the
  various checking overhead. Also added methods to extract the by-object
  dictionary.

- Bug fix: subsolver name is passed with the subsolver option.

- Fixed a memory leak issue with symbol maps and solvers. The symbol
  map is an attribute of the base solver class, because it is generated
  during presolve and needed to take results objects following a
  solve. However, once a results object is tagged with a symbol map,
  the solver reference to it should be eliminated. Otherwise, we end
  up with a memory leak - because the symbol map necessarily owns a
  reference to the instance.

- Allowing derivatives of the shell command interface to specify an
  interactive script as a parameter (to avoid shell redirection).

-------------------------------------------------------------------------------
 2.7.1
-------------------------------------------------------------------------------

- Made the imports of coopr.opt services more robust to the failure of
  individual services.

- Minor performance improvement

-------------------------------------------------------------------------------
 2.7
-------------------------------------------------------------------------------

- Implemented weak reference support in coopr.opt/Pyomo crossover components.

- Added suffix keyword to results readers, to prevent unnecessary loading of
  attributes.

- Added the 'coopr solvers' subcommand.

- Added the 'coopr test-solvers' subcommand.

- Various changes to support picklying of results objects.

- Changes to the SOL reader to capture solver termination information.

- Extended formats to FuncDesigner and OS types

- Added coopr.opt.blackbox, which contains the logic from coopr.colin for
  defining interfaces to black-box applications.

- Added reader for JSON files.

- Fixed the resolution of timing statistics to hundreth of a second precision.

-------------------------------------------------------------------------------
 2.6.1
-------------------------------------------------------------------------------

- Updates to add_coopr_results_test()
  - the working directory for tests defaults to the directory where the
  test is defined (instead of the directory where nose is invoked from).
  - more robust restoration of the original working directory in the
  presence of test failures
  - improved autogenerated docstring

-------------------------------------------------------------------------------
 2.6
-------------------------------------------------------------------------------

- Changed representation of variables in solutions - previous encoding
  was via SolutionMap, now a raw Python dictionary.  Results in major
  speed improvements on large models, which could run into minutes for
  populating solutions from solvers.

- Update of test baselines given the solution variable representation changes.

- Re-work of the SolverFactory to default to the _asl and _ossolver
  interfaces when the solver name is not well-known (lacking a better
  default).

- Moved coopr.colin core sub-directory into coopr.opt.blackbox.

- Reindent for reformatting.

- Various bug fixes. 

-------------------------------------------------------------------------------
 2.5
-------------------------------------------------------------------------------

- Migrating to entry points instead of explicit script installation.
  This allows for installation and localization of scripts on MS Windows.

- Changes to expose the SolutionMap from coopr.opt.results. This
  object is used by the Pyomo Model object to update results data.

- Deprecating the use of the ManagedPlugin? base class for coopr.opt
  solvers. This caused a problem where the solver options were being
  shared across all solver instances.

- Changed the semantics for processing solutions. When there is
  already a solution added, then we assume that that is passed into the
  reader.

- Adding solver options keyword to solve_all_instances utility function.

- Removed explicit support for the mipgap option.

- Move dinitialization of logging classes into a module. This avoids
  polluting the coopr.opt namespace with various symbols used for this
  initialization.

- Adding skeleton of code for checking inside a solve() call, whether the
  input model is actually constructed. The code is added, but commented
  out - in certain circumstances, this yields a circular dependency on
  imports that I can't figure out easily.

- Fixing issue with ILM solver base class on Windows - if the "-batch"
  option isn't specified, the command window waits (unbeknowst to the user)
  for them to press a key - or Control-C.

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

