=========================
 coopr.solvers CHANGELOG
=========================

-------------------------------------------------------------------------------
 3.2.1
-------------------------------------------------------------------------------

- Added guard against failed solver object creation

- Cleanup inside CBCplugin related to checking for ASL support

-------------------------------------------------------------------------------
 3.2
-------------------------------------------------------------------------------

- More py3k fixes

- Fixes to CPLEXDirect and gurobi_direct plugins to handle
  unpreprocessed fixed variables in constraint expressions, but
  only if the output_fixed_variable_bounds is set, otherwise throw
  an error if any are encountered

- Modifying the CBC plugin to only warn about pre 2.7 disabled ASL
  support when that functionality is requested

- Removing check for sosn capability in the CPLEXDirect plugin as
  this is not supported by the cplex python API

- Fixing gurobi_direct plugin to handle objectives on sublocks

- Fixing CPLEXDirect plugin to handle nested block objectives

- Updating writer tests to handle SolverFactory returning UnknownSolver
  instances

- Updating the CBC solver plugin to support SOS constraints when
  the NL file format is used

- Adding "persistent" prototype of CPLEX plugin

- Disabling the direct GLPK interface, even if
  python-glpk is installed. This solver interface is not actively
  supported right now, and we don't have solver tests running on
  Debian machines that can validate this capability.

- Fixes to CPLEX and GUROBI plugins so that the warmstart filename
  from a previous use of a plugin instance does not get used in a
  subsequent use of the plugin where warmstart=False

- Added a generic wrapper for direct Python interfaces.

- Updates to the NL and LP writer:
   - More rigorous checking of SOSConstraints
   - Cleanup up symbol_maps to only contain variables referenced in 
     constraints/objective 

- Renaming of coopr.plugins to coopr.solvers!

-------------------------------------------------------------------------------
 3.1
-------------------------------------------------------------------------------

- Changes to track transition of symbolic_solver_labels to io_options
  in solver→problem writer logic chain.

- Fixing issue with gurobi_direct plugin import, in which an
  unexpected exception is thrown in situations where a single-token
  license is installed, and that single token is in use.

- Modifying GUROBI direct python plugin to extract correct and
  complete termination conditions.

- Added warm-start capability for gurobi direct Python solver plugin.

- Added hooks to initialize CPLEX call-backs.  This is still a beta capability.

- Fixed suffix collection in the gurobi and cplex plugins. Constraint-name
  dictionaries were being overwritten rather than updated when more
  than one suffix existed. Also leaving out Id for now since I don't
  know where this is used.

- Various updates to track changes in Pyomo components and data representations.

- Modified PHPyro solver manager to get all results from all queues,
  in batch, to avoid unnecessary RPC invocations. The results are
  cached within the solver manager, and are in turn handed out by
  calls to _perform_wait_any.

-------------------------------------------------------------------------------
 3.0
-------------------------------------------------------------------------------

- py3k fixes

- Adding the currently found version number of the CBC ASL warning

- Adding a version method to solver plugins that queries the current
  solver version.

- Changes to get CBC plugin working with the CBC trunk.

- Disabling AMPL support for CBC < 2.7, because there is no reliable method
  for testing for AMPL support

- Updating plugins to be initialized with a default problem/results format

- Adding support for AMPL external functions to the ASL solver.

- Adding a SCIP solver plugin.

- Fixed the cplex and gurobi python direct writers to report slacks in a
  consistent fashion for range constraints.

- Updated the PICO plugin to handle the NL writer.

- Updating CPLEX and XPRESS to extract lrc and urc duals only when requested.

- Changed plugins to distinguish between quadratic objective and quadratic
  constraints.

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

- Fixing issue with CPLEX plugin where only non-zero slacks and
  duals were being added to the results object, resulting in "None"
  values on the instance when solutions were loaded.

- Fixing a bug in the GLPK solver plugin where specifying solver
  options that do not require a value resulted in an error.

- Changes to the GLPK converter class to use temporary files.

- Enforce precidence for conversion of *.mod -> *.mps.  AMPL is now used
  instead of glpsol when AMPL is available.

- Fixing the gurobi_direct writer so that it handles all forms of
  quadratic objectives and constraints.

- Re-working the CBC plugin to correctly parse CBC 2.7 output.

- Moving CPLEX plugin to use raw file writes for warm-start.

- Modifying the CPLEX file-based solver plugin to correctly populate
  lower/upper bound and gap information when solver is terminated by
  time limits.

- Use push/pop semantics for the TempfileManager.

- Updated CPLEXDirect solver interface to be able to extract duals
  from an LP and to better handle return codes from CPLEX.  Added
  some tests for this new functionality in CPLEXDirect.

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

- Mocking the behavior of the CPLEX plugin in the plugins for
  CPLEXDirect, GUROBI, and gurobi_direct for the case where
  'relax_integrality' is passed as a solver option.

- Adding code to handle handle solver options
  in the nl writer for solvers like cplex, gurobi, and ipopt. 

- Removing the -AMPL flag from the ASL command line arguments so
  that the —stream-solver pyomo option will work with the nl writer.

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

- Various minor bug fixes. 

- Added a preliminary version of an Xpress solver plugin. Presently
  only supports linear programs.

- Fixing bug in CBC due to "infeasibilities" tagged (via * characters)
  in the solution files.

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

- Reorganized directory structure to emphasize the fact that new solver
  interfaces are not MIP solvers.

- More robust handling of checks for external solvers.

- Many solver changes to resolve issues that were highlighted by solver
  checks.

- Updated GLPK solver interface to use a new file output format.  Gracefully
  deprecated support for the older GLPK solver interface.

- Improved support for SOS1 and SOS2 constraints (cplex, gurobi).

- Improved support for quadratic constraints (cplex).

- Added pickling tests for Pyomo models, since these tests rely on solver
  results for different solvers.

- Improved support for solver warmstarts (cplex, gurobi)

- Added solver interface for OS and OpenOpt solvers.

- Added a Python native pattern search solver.

- Added the phpyro solver manager.

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

- Extending GUROBI plugin to determine the upper bound (when minimizing) 

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

- Added parsing of INTEGER EMPTY status from GLPK.

- Cleaned up code organization of GUROBI plugin.

- Fixed issue with incorrect objective function labels in direct Python
  GUROBI plugin.

- Added tests for Ipopt.

- Reformatting with reindentation.

- Added "verbose" keyword to Pyro solver, so callers can optionally and
  by default suppress the output associated with queuing and task ids.

- Added aggressive skipping of CPLEX tests. When cplexamp is available,
  there may still be issues with ILM license.

- Added "subsolver" options, e.g., in cases where ASL is the primary
  solver; the sub-solver specifies the specific solver executable invoked.

- Bug fixes to the PICO solver interface.

- Major re-work of the sovler interfaces. A meta-class is now used for
  all predefined solvers. The ASL and OS solvers are now hidden, as
  these are only used internally within Coopr.

- Minor speed improvements in the GUROBI plugin.

- Added bug (missing string module import) in CBC plugin, causing a
  stack trace when CBC was presented with an infeasible problem.

- Various changes to all plugins in response to changes in the
  representation of variable values in solutions (SolutionMap replaced
  with native Python dictionaries).

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

- Fixed a bug where symbol_map was not passed on from the NL writer.

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

- Many update to solver baselines given changes in LP file generation.

- MIP solver interface updates to use appropriate objective names, 
  and set solver termination status.

- Adding support for suffixes to GUROBI.

- Removed coopr.pyomo imports that created a circular dependency.

- Added an experimental new GLPK solver interface that generates a
  more parsable output.

- Depricating the use of Model as the base model class.

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

- CPLEX
  - Fixing issue with CPLEX direct interface - logic for deregistration
    was not valid if the import of the cplex python module failed.

- GUROBI
  - Correcting condition under which constraint duals are extracted by the
    GUROBI plugin. We previously used binary and integer variable counts,
    which is insufficient if SOS constraints are in the model. Fortunately,
    you can avoid all of this mess by checking the Gurobi "IsMIP" attribute.

  - Suppression of dual value reporting for constant constraint.

  - Bug fix: was loading constraint duals into the "value" attribute of
    a ConstraintData? class (as opposed to the "dual" attribute).

  - Skipping ONE_VAR_CONSTANT variable from GUROBI plugin solution load.

  - Flushing out MIP warm-start capability.

- Changes to account for migration of OS services into coopr.os

- Changes to propagate the symbol map across the pyro solver manager interface.

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

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

- Added support for SOS constraints in solvers.

- Added logic to support the has_capability() method, which reports whether 
  a solver can analyze problems in a specified manner.

- Update to the API of various converters, to ensure
  a consistent API across converters.

- Added test_mip.py and the test_mip.yml configuration
  file that drives it.  Misc reorganization to ignore old test suites
  for solvers. The new tests are in test_mip.py and test_mip_api.py

- Update of solvers to evaluate numerical values.

- Added logic in the 'pyomo' converter to recognize OSiL problems.

- CBC
  - Fixed issue with CBC plugin generating voluminous (to put it nicely)
    output by default. If debug is enabled, we now set the log level to 5
    (high). Otherwise, it stays at its default level of 1.
  - Fixed the processing of the objective value when CBC is solving
    a maximization problem.
  - Disabling the ASL interface for CBC.

- GLPK
  - Recognize and correctly process instances in which the problem
    is infeasible.
  - General refactor of GLPK executable line creation. Specifically,
    this should fix r4083 (for Al Holder).
  - Throw an exception when unexpected line parse
    issues are encountered, so we (and the user) can quickly identify
    the line at fault. And figure out that GLPK is the issue.
  - Fixes bug in Pyomo reading unbounded/infeasible solution files from
    GLPK.

- CPLEX
  - Adding solution infeasible status - Pyomo will now indicate status correctly. 

- CPLEXDIRECT
  - Adding CPLEX solver that solves pyomo instances via the cplex python
    interface - cplex 12.2 now supports Python 2.5. The current version
    supports LPs and MIPs.
  - Adding logic to disable cplexdirect plugins if cplex cannot be imported.

- GUROBI
  - Improvements to GUROBI plug-in to allow execution on windows and linux.
  - Fix for Windows quoting and playing nice with backslashes in paths.

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

- Updated tests to recognize when various resources are not available
  (e.g. pico_convert)

- Setup recognition of suffixes for GLPK and CPLEX.

- Added hack to detect whether CBC has compiled support for NL files.

- Added draft GUROBI solver interface.

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

- Created ASL solver, which can execute any solver built with the AMPL
  Solver Library.

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

- Improvements in CPLEX plugin, mainly to include other solver statistics.

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

- Speed improvement to CPLEX solution reader - accessing solution attributes
  multiple times is expensive.

- Reworking MIP plugins to more selectively print branch-and-bound
  information. Don't print this info unless solving a MIP.

- Update of Pyro solver manager to propagate warm-start files to
  pyro_mip_servers. This currently only works for CPLEX, because CPLEX
  is currently the only solver plug-in that supports warm-starts.

- Adding transmission of solver mipgap across the Pyro distributed solver
  interface.

- Added ability to write the mipgap attribute (if not None) to the
  solver script file for CPLEX and GLPK. This needs to be added to 
  other solvers as well.

- Added fully-tested urc and lrc reduced-cost solution loading to the
  CPLEX plugin.

- CPLEX has warm-start capabilities - over-riding base OptSolver query method
  to indicate so.

- Added MIP solution read capability to GLPK plugin. Now able to read MIP
  solutions in via Pyomo and display attributes!

- Major re-work to GLPK interface, which was failing to read pretty much
  all solutions correctly. In particular, if identifiers are longer than
  the "usual" GLPK field width, the index/name and various values/status
  elements are split across multiple lines. This wrecks unit tests, but
  those will have to be revisited anyway - we still don't handle MIPs
  correctly, as the formats between MIP and LP are radically different.

- Added extraction of reduced-costs for variables in CBC plugin solution
  reader. Additionally, all values need to be pushed into the solution,
  whether non-zero or not. If this isn't done, then when the instance
  is loaded, only a subset of the variable values (and reduced-costs)
  are over-ridden.  Supression of 0 values does happen in the solution
  output routine.

- Extracting solver runtime for CPLEX solver plugin.

- Update to solvers to use the new structure for managing the parsing of
  solution results.

- Fixed bug in CBC when in NL/SOL mode that was setting each primal and dual
  variable twice when reading the solver output.

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

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

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

