Tue Nov 17 12:45:15 EST 1992
Adjust message printed for "Unknown keyword" so it
echoes just the keyword, not the remaining $cplex_options.

Tue Nov 24 13:04:58 EST 1992
Fix glitches with -DNO_CPLEX_MIP .

Sun Jan  3 15:41:31 EST 1993
In .sol file, report network simplex iterations before rather
than after simplex iterations (since the network solver runs first).

Fri Jan  8 13:49:53 EST 1993
Tweak to invoke edagread rather than edag_read.

Wed Mar  3 15:12:28 EST 1993
Code around cplex bug in handling problems with no general constraints.

Mon Mar 22 15:51:08 EST 1993
Tweaks to cplex.c:
1. Omit decl. of xectim_() (now in ../nlp1.h).
2. Change solution msg (in .sol file) for MIP problems from, e.g.,
	0 simplex iterations
	609 integer iterations
to
	609 simplex iterations
	127 branch-and-bound nodes

Thu May  6 19:46:56 EDT 1993
Add "varselect" as a synonym for "varsel" (as the Student Booklet
erroneously says "varselect").

Sat Jun  5 08:02:43 EDT 1993
  Paragraph about $mip_priorities added to README.cplex (giving details
omitted from the first printings of the Student Booklet):

  When using $mip_priorities, you must arrange for AMPL to write a .col
  file.  See the discussion of auxiliary files on p. 333 of the AMPL book:
  unless $cplex_auxfiles already contains 'c', issue the AMPL command
  	option cplex_auxfiles c;
  before saying "solve;".  Similarly, if you use AMPL's write command,
  first make sure $auxfiles contains 'c'; if not, issue the AMPL command
  	option auxfiles c;
  The keywords '!quit' and '!echo' may appear at the beginning of
  $mip_priorities.  If cplex finds an error in $mip_priorities, it bails
  out unless '!quit' appears in $mip_priorities before the error.
  Normally cplex reports the priorities it acquires from $mip_priorities,
  but '!echo' suppresses this reporting.  For example, if Buy is an
  integer variable, you might try the AMPL commands
  	option mip_priorities 'Buy 3', cplex_auxfiles ''; solve;
  	option mip_priorities '!quit Buy 3'; solve;
  	option cplex_auxfiles c; solve;
  	option mip_priorities '!echo Buy 3'; solve;
  	option mip_priorities '!quit !echo Buy 3'; solve;

Wed Jun 16 14:50:34 EDT 1993
  cplex.c: change long to fint (in accord with changes to solvers/*.h).

Fri Jun 18 14:07:47 EDT 1993
  Tweak comments in makefile and $S/makefile.

Wed Aug 25 12:30:11 EDT 1993
  Adjust cplex.c, README.cplex, version.c, makefile for CPLEX 2.1.

Wed Sep 22 02:34:31 EDT 1993
  Do not try to return solutions for "node limit with no integer
solution" or "time limit with no integer solution".

Mon May  9 19:43:58 EDT 1994
  Fix glitches in cplex.c: "agglim" was misplaced, rendering it
unfindable by binary search; two new return codes (for treememory
limit) weren't recognized.
  Adjust README.cplex to correct the defaults for aggregate,
presolve, and sosscan.

Sun May 15 20:22:13 EDT 1994
  Make "aggregate 1" and "presolve 1" the defaults; add new
phrase "verbose 1" to print messages written on CPLEX's "results"
channel (e.g., results of and time for CPLEX's "aggregate" and
"presolve" algorithms).
  Allow optional spaces around '=' in keyword phrases (in single
command-line arguments or $cplex_options).  This relies on a new
function, pr_unknown, just added to amplsolver.a.

Thu Jun  9 09:36:28 EDT 1994
  Change "verbose" to "prestats".
  Introduce "mipalgorithm" as a synonym for "algorithm" (which may
eventually be withdrawn).
  Fix glitch introduced 15 May in handling positive mipdisplay values.

Fri Jun 10 19:32:12 EDT 1994
  Don't zero need_nl when $cplex_options == "".
  Omit calls on setlogfile (which were unnecessary and somehow made
log lines extra long with mipdisplay=2).
  With the default prestats=0 and (nondefault) netopt=2, suppress
extraction statistics.

Sat Jun 11 19:18:30 EDT 1994
  Recognize CPLEX's (undocumented) return -5 from netopt(), and report
"netopt found an infeasible or unbounded problem" in response to it.
  Supply a "problem name" based on problem statistics rather than
the stub (so starttree=filename will work across AMPL sessions).
  Under netopt=2, don't suppress netopt=2 when dual is specified.

Fri Aug 12 02:20:11 EDT 1994
  Fix bugs in handling nonconvex piecewise-linear terms when there
is a constant term in the (presolved) objective.
Example:
	var x{1..2} >= 0;
	convex: sum{i in 1..2} x[i] = 1;
	var y >= 0 <= 10;
	minimize zot: sum{i in 1..2}i*x[i]
		+ <<1,2,4,7,8;-1,1, -1,1, -1,1>>y + 4;
	option solver cplex;
	# works right without +4
  Adjust handling of nonconvex piecewise-linear terms so CPLEX sees
a smaller problem.
  Adjust cplex.c to work with CPLEX version 3.0 without special -D
settings in the makefile's CFLAGS.  For CPLEX version 2.1, -DV2_1
is now necessary.  (Further enhancements for CPLEX 3.0, such as
support of the barrier solver, will appear when time permits.)

Sat Sep 24 01:26:28 EDT 1994
  Allow command-line options that do not involve a value to appear
without a trailing =, so the invocations
	cplex foo relax=
and
	cplex foo relax
behave the same.  Previously "relax" in the latter invocation was
quietly ignored.
  Report usage with invocation
	cplex -?
  Adjust version.c to say Version 2.1 under -DV2_1, Version 3.0
otherwise, and to make "grep Version osl" work nicely.
  Fix glitches (involving nodecnt and treeio) with -DNO_CPLEX_MIP.

Fri Sep 30 16:48:28 EDT 1994
  cplex.c: fix bug in "option cplex_options dual;" on problems with
nontrivial range constraints: a <= A*x <= b with a < b both finite.

Tue Oct 18 17:56:50 EDT 1994
  cplex.c: round "integer" variables to integral values when returning
an "optimal" solution.

Fri Oct 28 11:36:19 EDT 1994
  Fix bug in handling problems with integer variables and
convex (resp. concave) piecewise-linear terms that are
linearized without the addition of new integer variables.
Example (that caused a bus error in "cplex"):
	var x;
	minimize zot: <<1,2; -1, -.5, 1>> x;
	var y integer >= 0;
	c: x + y <= 5;
  Add freeprob invocation (needed for rapid multiple solves
with CPLEX 3.0).
  Fix bugs in handling problems with both general integer variables
and general piecewise-linear terms, and with general piecewise-linear
terms when "relax" is specified.

Tue Nov  1 23:09:56 EST 1994
  Fix another glitch in the handling of nonconvex piecewise-linear
terms: the array ctype was not fully initialized.
  Avoid allocating ctype when no integer variables (or general
piecewise-linear terms) are present.
  Under -DNO_CPLEX_MIP, complain and abort execution if any general
piecewise-linear terms are present.

Mon Dec 12 16:52:16 EST 1994
  Fix bug in handling nonconvex (resp. nonconcave) piecewise-linear
terms (those that require integer programming): an incorrect weight
was supplied for the first breakpoint if the term appeared in a
constraint and its value at the breakpoint was nonzero.

Wed Feb  8 01:15:31 EST 1995
  Adjust solution message logic to reflect return codes that are
new with CPLEX version 3.0.

Mon Mar 20 18:50:03 EST 1995
  Under -DKR_headers, declare extern double strtod();

Thu May  4 11:34:18 EDT 1995
  Fix glitch (invisible on Unix systems) in the startbasis and
endbasis directives.  It caused a fault on PCs.

Fri Oct  6 17:35:03 EDT 1995
  Adjust some keywords to keep synch with CPLEX Corp.

Mon Jan 15 13:52:20 EST 1996
  Fix bug that prevented returning integer solutions for return
messages other than "optimal integer solution" and "optimal
integer solution within mipgap or absmipgap".

Thu May  2 13:42:00 EDT 1996
  README.cplex, cplex.c, makefile and version.c updated for CPLEX 4.0.
The old versions are temporarily still available in subdirectory 3.0.

Wed Jun 19 15:00:01 EDT 1996
  Fix a few glitches in cplex.c: failure to echo some keywords;
failure to accept netopt=2 or reducecostfix=; better handling of
prestats=1 (when display=0 or mipdisplay=0).

Thu Jul 11 17:59:10 EDT 1996
  More tweaks to cplex.c, to improve the solution message it reports
and fix some printing glitches.

Mon Aug 19 11:59:43 EDT 1996
  Add keywords "barthreads", "mipthreads", "simthreads" to control the
number of threads for the barrier, MIP, and dual simplex algorithms.

Tue Oct  1 15:49:04 EDT 1996
  README.cplex: correct (expand) details of bardisplay, crossover,
varsel, and mip_priorities.

Fri Dec 13 16:31:39 EST 1996
  When the barrier solver is used, transmit initial primal and dual
values to it.  New keyword "advance=0" suppresses use of this
information.

Mon Apr 21 22:43:06 EDT 1997
  Update for revised amplsolver.a and "Hooking Your Solver to AMPL".

Mon Jun 23 11:04:37 EDT 1997
  New keyword "nodefile" controls whether a temporary node file is
written by the MIP solver: 0 (default) = no, 1 = yes.
This corresponds to "SET MIP STRATEGY FILE".

Tue Jul 22 09:23:14 EDT 1997
  Fix fault with the "version" keyword.

Tue Jul 22 16:13:01 EDT 1997
  Recognize error return for "infeasible or unbounded in presolve".

Wed Jul 23 10:59:27 EDT 1997
  Add recognition of ? as a keyword value in more cases (to show the
keyword's current setting).
  For problems with integer (or binary) variables, if endbasis is
specified, change the problem type to permit writing a final basis.

Fri Oct 10 19:59:12 EDT 1997
  Tweak to illustrate use of setjmp/longjmp and mainexit to make sure
CPXfreeprob and CPXcloseCPLEX are always called (when necessary); add
call on ASL_free (gratuitous unless you turn cplex.c into a DLL that
solves multiple problems for one process).

Mon Nov  3 23:48:57 EST 1997
  cplex.c: complain about "nonlinear integer variables" in QPs that
have binary or integer variables.

Fri Nov  7 09:28:41 EST 1997
  cplex.c: where appropriate, change Malloc to M1alloc (to free memory
in the ASL_free call at the end).

Tue Nov 11 00:17:23 EST 1997
  cplex.c: free LUv array when exiting "prematurely" (before it is
recorded for freeing by ASL_free).

Tue Nov 11 16:27:51 EST 1997
 cplex.c: another tweak to LUv, invisible for all practical purposes,
except that it requires today's update to amplsolver.a .

Thu Mar 26 17:42:00 EST 1998
  cplex.c, version.c: updated for CPLEX 5.0, and to support AMPL's new
facilities for constraint and variable statuses, user-defined
suffixes, and solver return codes.  For infeasible problems, you
can request that an IIS (irreducible infeasible set of constraints
and variables) be computed and returned by setting iisfind = 1
or iisfind = 2 in $cplex_options.  Other new keywords for $cplex_options
are mipstartstatus, mipstartvalue, sensitivity, and writeprob.  See
the updated README.cplex for details.
  cplex.c: when "primal" or "dual" is not explicitly specified (in
$cplex_options or on the command line), assume "primal" if either
netopt == 1 (the default) and the problem involves explicitly
declared nodes and arcs, or netopt == 2.
  New scheme for getting SOS2 information (for nonconvex piecewise-
linear terms), using .sos and .sosref suffixes.  The old scheme is
still available (for use with older AMPL processors), and the present
changes fix a bug in the old scheme, which didn't adjust variable and
constraint bounds correctly.

Tue Mar 31 16:50:43 EST 1998
  cplex.c: minor tweak to reflect an addition to asl.h: change
solve_code to solve_result_num (a more suggestive name and the name
of this value in the AMPL session).

Fri May 22 17:58:13 EDT 1998
  cplex.c: fix botch in handling "baropt" -- something freed too soon.

Thu Jun  4 18:05:24 EDT 1998
  cplex.c: Code around a bug in CPXgetbase ('L' rows may be given
status 0 rather than 2).  Adjust returned variable and constraint
statuses to indicate "btw" rather than "sup" and, where appropriate,
to indicate "equ" rather than "low" or "upp".  Fix bugs in handling
incoming and outgoing statuses when "dual" is specified.  Adjust
cplex.c so in theory it will work with both CPLEX 5 and 6.

Tue Jun  9 13:40:05 EDT 1998 and Wed Jun 10 12:31:53 EDT 1998
  cplex.c: more tweaks for CPLEX 6 (that should be invisible with
CPLEX 5).

Tue Jul 14 18:46:46 EDT 1998
  cplex.c: fix glitch in handling nonconvex piecewise-linear terms;
when supplying integer starting guesses, project them onto the interval
of their bounds (since CPLEX surprisingly neglects this detail and
leaves integer variables fixed if given starting values outside their
bounds).

Tue Jul 28 22:21:00 EDT 1998
  README.cplex: add table of possible solve_result_num values.

Sat Aug  1 00:10:14 EDT 1998
  cplex.c: add sos_kludge() to cope with CPLEX's undocumented
requirement that SOS reference-row values differ by at least 1e-10.

Sun Sep 13 12:52:55 EDT 1998
  cplex.c, README.cplex: adjust some solve_result_num values -- see the
table near the end of README.cplex.  Provide more error returns this
way, e.g., for bad QPs and CPLEX licensing problems.

Tue Oct  6 15:48:41 EDT 1998
  cplex.c: after return 1101 ("infeasible or unbounded in presolve"),
turn CPLEX's presolver and aggregator off and try again -- to get a
more precise error return and perhaps return IIS information (for an
infeasible problem) or a ray of unboundedness (.unbdd suffix).

Wed Oct 28 18:39:52 EST 1998
  cplex.c: restore default values for plconpri and plobjpri to their
advertised values.  They somehow got interchanged earlier this year.
This only matters if your problem has nonconvex (resp. nonconcave)
piecewise-linear terms.

Tue Nov 24 15:04:20 EST 1998
  cplex.c: "invisible" changes to help ensure freeing resources when,
e.g., SIGINT interrupts reading of the .nl file.

Wed Jan  6 09:19:13 EST 1999
  cplex.c, README.cplex: add "predual" keyword: predual=1 causes CPLEX's
presolver to present the CPLEX solution algorithm with the dual problem.
Often this works better than the "dual" keyword, but there exist problems
on which "dual predual=1" is the best way to go.

Fri Jan 15 17:40:51 EST 1999
  cplex.c: fix bug in handling incoming statuses when nonconvex
piecewise-linear terms are present.

Sat Jan 16 16:50:09 EST 1999
  cplex.c: correct botch in yesterday's changes (potential trouble if
AMPL's presolve is off).

Wed Jan 20 23:09:44 EST 1999
  cplex.c: various revisions to use new facilities in amplsolver.a
(the AMPL/solver interface library); requires amplsolver.a version
>= 19990118.
  README.1st, README.cplex: minor edits.

Sat Feb  6 18:04:17 EST 1999
  cplex.c: minor adjustments to reflect changes in suf_sos() in the
AMPL/solver interface library, which must be recompiled due to changes
in asl.h.  New keyword in $cplex_options: sos = 0 or 1 (default 1):
whether to honor declared suffixes .sosno and .ref; see the updated
README.cplex.

Mon Mar  8 12:49:05 EST 1999
  cplex.c: "invisible" changes that should have no affect on the usual
stand-alone use of "cplex", but that shorten the source a bit and use
M1record() to automate freeing of some arrays.

Thu Apr 15 12:52:08 EDT 1999
  cplex.c: fix possible fault with unbounded problems.

Tue Apr 20 17:42:05 EDT 1999
  cplex.c: fix glitch with incoming statuses when a constant must be
added to the objective (for CPLEX to print correct objective values):
the variable introduced to adjust the objective should be basic.
Without this, CPLEX may take many more iterations than necessary.

Wed Apr 21 09:35:00 EDT 1999
  cplex.c: fix botch in the change of 19990415.

Tue May  4 16:57:44 EDT 1999
  cplex.c, README.cplex: updated for CPLEX 6.5.
The previous cplex.c (for CPLEX 5 and 6.0) is now cplex60.c,
with version60.c the corresponding variant of version.c.

Mon May 17 18:32:41 EDT 1999
  cplex.c: try to duplicate the functionality of CPLEX 6.0's CPXnetopt.
Oddly, the "optimal" basis found by CPLEX 6.5's new CPXNETprimopt is
sometimes not seen as optimal by CPXprimopt and CPXdualopt, but
sometimes it still pays to specify netopt=2 (to find an embedded
network and solve it first).

Sat May 22 14:37:09 EDT 1999
  cplex.c: explicitly report 0 iterations when the problem is solved
by the primal or dual simplex algorithm in 0 iterations.

Tue May 25 16:25:08 EDT 1999
  cplex.c: fix glitch in processing incoming basis statuses when
"dual" is specified.

Tue Jun  1 23:47:49 EDT 1999
  When there is no basis, do not return .sstatus.
  Fix more glitches in processing basis statuses when "dual" is
specified.
  Fix glitch (possible fault or worse) with "relax".

Fri Jul 23 18:02:15 EDT 1999
  cplex.c: Add an error message for "Expired CPLEX license".
  makefile: add comments for linking under Solaris.

Mon Aug 30 22:08:40 EDT 1999
  cplex.c: recognize some new CPLEX return codes.

Thu Sep  9 16:41:37 EDT 1999
  README.cplex: add new solve_result_num values to README.cplex.

Wed Oct 27 10:20:46 EDT 1999
  cplex.c: fix glitch (fault in the bowels of CPLEX) in handling QPs
with constant terms in the objective.

Thu Oct 28 16:05:58 EDT 1999
  cplex.c: fix a botch in yesterday's change.

Tue Nov  2 18:29:48 EST 1999
  cplex.c: minor tweak to solution message 542.

Wed Mar  1 23:22:08 EST 2000
  cplex.c: fix undersize allocation (possibly leading to a fault)
connected with "sensitivity".  New keywords "fraccuts" and synonym
"fractionalcuts" for CPLEX 6.6.  For earlier versions of CPLEX,
compile with -DNO_CPLEX66.
  README.cplex: minor tweak for CPLEX 6.5.

Wed Jul 26 22:38:13 EDT 2000
  cplex.c: fix glitches with compilation under -DNO_BARRIER; version.c
not changed.

Tue Aug  1 16:03:27 EDT 2000
  cplex.c: add recognition of keyword "bestnode" (in $cplex_options
or on the command line), which causes suffix .bestnode on the objective
and problem to be returned: for MIP problems, this is the "best node"
value found by CPLEX; for problems without integer or binary variables,
it is +-Infinity.

Wed Sep 13 23:10:01 EDT 2000
  cplex.c: add keyword "round" (in $cplex_options or on the command
line) telling whether to round integer variables to integers (as has
hitherto been the practice):  0 ==> no, 1 (default) ==> yes.
Finer control is also possible:  see the updated README.cplex.

Mon Dec 11 15:47:56 EST 2000
  Updates for CPLEX 7.0:  the former cplex.c and version.c are
renamed cplex66.c and version66.c, respectively; cplex.c is now
for CPLEX 7.0 and version.c is gone (folded into cplex.c);
makefile is updated and renamed makefile.u (for Unix systems)
and there is a new makefile.vc for use with Microsoft's Visual C/C++.

Tue Dec 19 11:26:57 EST 2000
  cplex.c, README.cplex:  withdraw solve_result_num values 571, 572,
and 573; all license failures now get solve_result_num = 570, with
text in solve_message providing details (provided by a CPLEX routine,
CPXgeterrorstring(), that knows them).
  New file courtesy of ILOG/CPLEX:  ampl70.pdf, a PDF file for the
booklet "ILOG AMPL CPLEX System Version 7.0 User's Guide" that ILOG
provides to customers.  (Though not as nicely formatted, README.cplex
is more complete in some respects.)  Only available by ftp or http.

Fri Jan  5 16:53:58 EST 2001
  cplex.c, README.cplex:  have mipcuts=n set disjcuts, flowpathcuts,
fraccuts and mircuts (as well as cliques, covers, flowcuts, gubcuts,
and impliedcuts) to n.

Thu Feb 15 14:10:18 EST 2001
  cplex.c, README.cplex:  use .row and .col files if present (via
con_name() and var_name(), which are to be documented when "Hooking
Your Solver to AMPL" gets updated).  Associated new keyword for
$cplex_options:  nameround, now described in README.cplex.
  cplex.c, README.cplex:  new solve_result_num value: 4 ==> optimal
with 0 (primal or dual) simplex iterations.  In a nested decomposition
algorithm, solve_result_num == 4 means that a new cut is not needed.

Thu Mar 22 14:08:15 EST 2001
  cplex.c:  when logfile=... is specified, circumvent spurious Error
1217 messages and close the logfile after solving the problem.

Thu May 31 18:14:15 EDT 2001
  cplex.c, README.cplex: updated for CPLEX 7.1; cplex.c still works
with CPLEX 7.0.

Mon Jun 18 23:21:46 EDT 2001
  cplex.c: correct timestamp in cplex_version[].
  Update /netlib/ampl/student/*/cplex* to CPLEX 7.1.

Thu Jul 18 17:56:42 EDT 2002
  cplex.c, README.cplex:  update for CPLEX 8.0.  The updated
cplex.c should work with both CPLEX 7.* and CPLEX 8.*.
  Changes include coding around a CPLEX 7 bug in return codes for dual
simplex (i.e., "dualopt" in $cplex_options):  interchange "infeasible"
and "unbounded".  New suffix .dunbdd on constraints returned when
"dualopt" is specified, the (primal) problem is infeasible, and the
dual problem is feasible; the .dunbdd values are components of a ray
of dual unboundedness.  When .unbdd (for a ray of primal
unboundedness) is returned, solve_result_num is now 310, and when
.dunbdd is returned, solve_result_num is now 210.

Wed Sep  4 18:13:19 EDT 2002
  Fix glitch (missing initialization of baralgname) with "baropt".
  Add some "undocumented" directives (for rare use when recommended by
CPLEX technical support).

Fri Sep 27 14:54:53 EDT 2002
  cplex.c: make solve_message for some error returns (such as for
problems containing nonlinearities) consistent with the solve_message
for solved problems:  start with "CPLEX ...: ".  With recent versions
of AMPL, this gets rid of backspaces in $log_file.
  README.cplex: add summary list of keywords new for CPLEX 8.0.
  makefile.u, makefile.vc: update comments for CPLEX 8.
  makefile.u: add comments about using a shared CPLEX library.

Fri Nov  1 22:34:13 EST 2002
  cplex.c: when the simplex algorithm finds a QP infeasible,
do not attempt to return constraint.dunbdd, as CPLEX cannot 
compute it.  (CPLEX 8.0 would fault in the effort.)  Also, add
a "QP " qualifier to the solve_message when the primal or dual
simplex algorithm is applied to a QP.

Mon Jan  6 12:40:00 EST 2003
  cplex.c: have student binaries say
	netopt found the adjusted problem too large.
rather than "netopt found a bug" when the constraints and variables
added to extract a network result in too large a problem (more than
300 constraints or variables).

Fri Feb 28 19:01:04 EST 2003
  cplex.c: on problems with integer variables and "integrality"
greater than "feasibility", when determining dual variables for
the optimal solution (by fixing integer variables at their
current value), increase "feasibility" to "integrality".  Example:
with foo containing

	set I := 1..3;
	var x{I} integer >= 0;
	minimize foo: sum{i in I} i*x[i];
	s.t. vex: sum{i in I} x[i] >= 4.01;

the script

	model foo;
	option solver cplex, cplex_options 'integrality = .02';
	solve; display _varname, _var, _conname, _con;

previously gave

	CPLEX 8.0.0: integrality = .02
	CPLEX solution status 3 with fixed integers:
	        infeasible problem
	CPLEX 8.0.0: optimal integer solution; objective 0.01
	0 MIP simplex iterations
	0 branch-and-bound nodes
	Status recovering solution: infeasible problem
	: _varname _var _conname _con    :=
	1   'x[1]'   4    vex      1
	2   'x[2]'   0       .      .
	3   'x[3]'   0       .      .
	;

Now it gives

	CPLEX 8.0.0: integrality = .02
	CPLEX 8.0.0: optimal integer solution; objective 4
	0 MIP simplex iterations
	0 branch-and-bound nodes
	: _varname _var _conname _con    :=
	1   'x[1]'   4    vex      0
	2   'x[2]'   0       .      .
	3   'x[3]'   0       .      .
	;

Note that the line about "solution status 3 with fixed integers"
is gone and the dual value for constraint "vex" is now 0.

Thu May 15 15:30:47 EDT 2003
  cplex.c, README.cplex:  recognize single-word phrase "bestbound" as
a request to return in suffix .bestbound (on the objective and current
problem) the best-known value of the objective.  For MIP problems with
a finite bestnode value (see README.cplex), bestbound = bestnode.

Tue Jun  3 14:59:36 EDT 2003
  cplex.c: fix a fault that happened when CPXopenCPLEX failed (e.g.,
due to a licensing problem).

Mon Apr  5 00:12:41 MDT 2004
  cplex.c, README.cplex:  updated for CPLEX 9.01; cplex.c should still
work with some older versions of CPLEX (8.x, 7.x).

Wed Apr 14 23:26:35 MDT 2004
  cplex.c:  tweak to call CPXqpopt rather than CPXlpopt on QPs with
linear constraints when no algorithm is specified in $cplex_options;
with current CPLEX defaults, this results in the barrier method being
used, rather than a simplex variant.

Sat Apr 17 00:59:13 MDT 2004
  cplex.c:  tweak to bypass a bug in MSVC++ 6.
  makefile.u and makefile.vc updated for CPLEX 9.

Fri Jul 16 01:04:33 MDT 2004
  cplex.c: on MIP problems whose solution is interrupted by Ctrl-C,
avoid "Status recovering solution: aborted in phase II; no basis"
caused by a bug ("breaking" status not being cleared).
  cplex.c and README.cplex:  new keyword mipbasis with possible
values 0 or 1 (default) indicating whether to attempt computing
a basis after solving a MIP problem.  Specifying endbasis is
specified, mipbasis=1 is assumed.  Otherwise, when mipbasis=0 is
specified, some time may be saved but no solver-status values for
variables are returned to AMPL.

Wed May 11 23:08:02 MDT 2005
  cplex.c, README.1st, README.cplex: update for CPLEX 9.1.

Tue Jan 10 07:27:39 MST 2006
  cplex.c, README.cplex:  update for CPLEX 10.0; cplex.c still works
with CPLEX 9.1.  New keywords intwarntol and symmetry work with both
9.1 and 10.0.  New keywords for 10.0: conflictdisplay, feasopt,
feasoptobj, lazy, memoryemphasis, numericalemphasis, polishtime,
polishtime, polishtime, repeatpresolve.  Keywords withdrawn from 10.0:
baroutofcore, finalfactor, precompress.

Fri Jan 20 09:34:25 MST 2006
 cplex.c, README.cplex: withdraw endtree, starttree for CPLEX 10.

Fri Feb 24 08:21:09 MST 2006
 cplex.c: adjust calling sequence to CPXaddindconstr, which
surprisingly and without announcement changed between version 9.2B
(the final beta for 10) and 10.  Insidiously, the change was not
detectable by the normal C type-checking rules.  Also, fix a glitch
in parsing indicator constraints involving just one variable and
adjust things to catch more errors.

Wed Apr  5 22:37:37 MDT 2006
  cplex.c: fix a glitch in the changes of 24 Feb. 2006, which caused
an error message for equality quadratic constraints (which cannot be
convex) to be lost.  Also, for stand-alone invocations without -AMPL
or wantsol=1 (i.e., without a .sol being written), return nonzero
exit codes in the presence of such failure messages.
  README.cplex: add some missing solve_result_num values.

Tue Apr 18 21:16:17 MDT 2006
  cplex.c: CPXERR_PROMOTION_VERSION --> CPXERR_RESTRICTED_VERSION
in student version.  Change a C++ "//" comment to "/* ... */".

Wed Aug 30 18:32:50 MDT 2006
  cplex.c: allow defined variables in indicator constraints;
increase some error-message buffer lengths (as CPLEX can now overflow
the old lengths).

Tue Sep 12 00:57:02 MDT 2006
  cplex.c: change a difference of void* values to one of char* values
(to make some compilers happy).

Sat Oct  7 05:38:02 MDT 2006
  cplex.c:
1. New keyword dualratio and change to dualthresh:
Previously, if neither primal nor dual nor netopt was specified
and no integer variables appeared in the problem, an automatic
choice of "primal" or "dual" (i.e., whether to present CPLEX with
the primal or dual problem) was based on dualthresh:  if the numbers
m of constraints and n of variables satisfied m - n > dualthresh,
"dual" was selected, else "primal".  Now dualthresh has default
value 0, dualratio has default 3, and the rule for choosing between
"primal" and "dual" is:  if (dualthresh > 0 and m - n > dualthresh)
or m > dualratio*n, select "dual"; else "primal".

2. New keywords dparam and iparam for assigning or querying CPLEX
double and integer parameter values that have not been assigned
a name in cplex.c.  The syntax for assignments is
	dparam=n=d
	iparam=n=i
where n is an integer, d is a floating-point value and i is an
integer.  For queries (to see the current value of the parameter),
d and i are replaced by ?, i.e.,
	dparam=n=?
	iparam=n=?

3. When "dual" is in effect and CPLEX finds the problem infeasible
or unbounded, report the problem to be unbounded or infeasible,
respectively, rather than vice versa.

Sun Oct 29 23:44:18 MST 2006
  cplex.c:  Fix a bug in handling indicator constraints of the form
	binary_var == 0 ==> general_var = 0;

Fri Nov 24 17:47:27 MST 2006
  cplex.c:  Fix bug in handling initial primal variable values for
problems with integer variables and quadratic constraints or
objectives.
  New files configure and configurehere.  Invoke ./configure to create
$OBJDIR (with OBJDIR = sys.`uname -m`.`uname -s` unless otherwise
specified) in which to make "cplex".  Variants of "cplex" for several
systems can thus be created in system-specific $OBJDIR directories.
Invoking ./configurehere creates "makefile" as per former practice.

20070106
 cplex.c: make #define logic for Sig_ret_type, etc., consistent
with asl.h (thus eliminating a compiler warning in some cases).

20070424
 cplex.c:  adjust to account for the possibility of CPXmipopt giving
status CPXERR_Q_NOT_POS_DEF when there are quadratic constraints.
Also, recognize CPXERR_NO_MEMORY and give solve_result_num = 522
with message "ran out of memory" for this return from a CPLEX optimizer.
README.cplex updated accordingly.

20070628
  makefile.vc:  minor tweaks for CPLEX 10.2.

20070807
  Adding makefile.mingw, for use with gcc under MSys/Mingw.
See http://www.mingw.org.

20080110
  cplex.c, README*, makefile.*: update for CPLEX 11.

20080514
  cplex.c, README.cplex:  add "pooldual" for requesting dual variable
values from the solution pool.

20080906
  cplex.c:  recognize CPLEX return statuses CPXMIP_OPTIMAL_POPULATED and
CPXMIP_OPTIMAL_POPULATED_TOL as successful.

20081015
  cplex.c, README.cplex: update for CPLEX 11.2.

20081111
  cplex.c:  fix a glitch introduced 20080514 in handling problems with
no constraints and integer variables:  the solution was not returned.

20081202
  cplex.c:  change the default value of mipbasis to zero when a quadratic
objective or quadratic constraints are present.

20090721
  cplex.c, README.cplex: update for CPLEX 12.1.

20090922
  cplex.c:  move an #endif down two lines so tunewrite is not referenced
when using the CPLEX 9.x and 10.x headers and library.  The driver is
still reported to be at Version 20090330.

20091105
  README.1st:  tweak to reflect IBM's acquisition of ILOG.

20100317
  cplex.c, README.cplex:  add keyword "resolve" to indicate whether to
re-solve the problem with CPLEX's presolve turned off after CPLEX's
presolve reports the problem to be infeasible or unbounded.
Re-solving will take extra time but should determine whether the
problem is infeasible or unbounded.  The default ("resolve = 1") is to
re-solve; specifying resolve = 0 suppresses the re-solve and causes a
return under the circumstances in question with solve_result_num =
209, indicating an infeasible problem, which may or may not be right.

20100425
  README.cplex:  correct a typo: the suffix returned for the relative
mipgap (on mip problems when $cplex_options has a suitable assignment
to return_mipgap) is "relmipgap" (not "relmapgap").

20100511
  cplex.c: fix a bug (possible invalid subscript) with "lazy=1" when
a constraint must be added to account for a constant term.

20100912
  cplex.c: updated for CPLEX 12.2.

20100913
  README.cplex updated for CPLEX 12.2.

20101109
  cplex.c: adjust to quietly ignore baropt on quadratically-constrained
problems (as we get a surprising failure otherwise).

20101206
  cplex.c, README.cplex: set solve_result_num = 567 if the problem has
complementarity constraints.

20101211
  cplex.c:  fix bugs in handling nonlinear integer variables.  When
indicator constraints were present, an erroenous message about a
logical constraint not being an integer constraint was possible.  In
some other cases, wrong initial values might have been provided.

20110113
  cplex.c, README.cplex:  for CPLEX versions >= 11.0, fix operation of
"prestats=1", and add "cutstats" keyword (0 or 1, default 0) to control
whether the kinds and numbers of cuts are reported in the solve_message.

20110421
  cplex.c:  adjust basis manipulations so netopt=1 or netopt=2 may
provide a better starting basis for finishing the solution of a
problem after CPLEX has dealt with an embedded network.
  cplex.c, README.cplex:  adjust prestats to work independently of
mipdisplay and display.  Now prestats=1 causes summary statistics (if
nonzero) for CPLEX's "aggregate" and "presolve" algorithms to be
reported in the solve_message.  Unfortunately, setting prestats=1 may
disable use of multiple threads.

20110607
  cplex.c, README.cplex:  update for CPLEX 12.3, and arrange for
prestats=1 not to disable use of multiple threads.

20110611
  cplex.c:  correct the signs of .dunbdd values when the primal
objective is to be maximized.  (CPLEX's CPXdualfarkas() routine seems
to ignore the sense of the primal objective.)  Unless resolve=0 is
specified and the problem is infeasible, re-solve the problem with
CPLEX's presolve disabled to make .dunbdd available.

20110809
  cplex.c: tweaks to banish warnings caused by today's changes to
the AMPL/solver interface library.

20110913
  cplex.c: adjust to use new indicator_constrs_ASL() function rather
than having logic for sorting out indicator constraints in cplex.c
Increase some array sizes that may have been too small for indicator
constraints with an "else" clause, such as

	s.t. bletch: y == 0 ==> z >= zlb else z <= -zub;

20120405
  cplex.c: for MIP problems, when basis = 1 is in effect and the
attempt to return a basis fails, correctly report the objective
value of the solution returned.

20120423
  cplex.c: call CPXwriteparam instead of CPXEwriteparam.  The change
should be invisible for now but may be required with future versions
of CPLEX.

20121022
  cplex.c, README.cplex:  add keyword "incompat" with description
	How to treat parameter settings that CPLEX finds
	incompatible:
		0 = quietly ignore incompatibilities
		1 = report and ignore them (default)
		2 = reject them, refusing to solve.
	For example, CPLEX regards the polishafter_* parameters
	introduced in CPLEX 11.2 as incompatible with the older
	polishtime parameter.
  cplex.c:  modify adjustment to SOS reference-row values by
arranging to look at them in sorted order when modifying them if
necessary to make them distinct.  (CPLEX requires them to be
distinct.)

20121117
  cplex.c: add zerohalfcuts to the cuts simultaneously controlled
by mipcuts.  Update to CPLEX 12.5:  add keywords dettimelim,
polishafter_timedet, probetimedet, seed, and tunetimedet, and extend
timing keyword to allow requesting times in platform-specific "ticks",
which CPLEX computes in an unspecified way.

20130522
  cplex.c:  fix bugs with suffix .lazy:  problems with quadratic
constraints were not handled properly, and a rare case requiring
allocation of longer arrays was botched.  Now nonzero .lazy values
on quadratic constraints give a warning message that such .lazy
values are ignored.

20130531
  cplex.c:  fix a compilation glitch with NO_DEPRECATED that only
matters to some compilers.

20130606
  cplex.c:  do not complain about a diagonal objective Hessian element
of the "wrong" sign if the associated variable is an integer variable,
in which case CPLEX seems to not to care about signs, or if
reqconvex=2 is specified.

20130622
  cplex.c, README.cplex:  for CPLEX 12.5.1, add keyword "splitcuts"
to control use of lift-and-project cuts on MIP problems.
Also add keyword "objrep" controlling whether to replace
	minimize obj: v;
with
	minimize obj: f(x)
when variable v appears linearly in exactly one constraint of the form
	s.t. c: v >= f(x);
or
	s.t. c: v == f(x);
Default is no for the former, yes for the latter.  See README.cplex.
This requires use of version >= 20130622 of the AMPL/solver interface
library.

20130801
  cplex.c: add a least-squares computation of dual variables for
quadratically-constrained problems.  Previously on such problems,
the dual variables for linear constraints may have been wrong.
Three new tolerances are involved (all with default 1e-6 and each
quietly replaced by zero if a negative value is specified):  for a
quadratic constraint to be considered active, its slack must be at
most qctol1 and the maxnorm of the constraint's gradient (i.e., the
largest gradient component in absolute value) must be more than
qctol2.  An "active" quadratic constraint is considered dependent on
other such constraints if during QR factorization its gradient's
maxnorm is reduced to no more than qctol3 of its original maxnorm.

20130916
  cplex.c:  fix a glitch in computing duals for quadratically-
constrained problems with no objective (i.e., feasibility problems).

20130919
  cplex.c:  fix a fault that was possible with quadratic constraints
under complicated conditions.  Change defaults for qctol1, qctol2,
and qctol3 to 1e-5, which might be more appropriate than 1e-6 when
the barrier algorithm is involved.

20131210
  cplex.c, README.cplex:  updates for CPLEX 12.6.  New keyword
droptol (see README.cplex).  Better error message for a failed solve
of a MIP subproblem and new solve_result_num value 513 for "failed to
solve a MIP subproblem".  When compiled with -DWant_Distmipopt, new
keywords rampup_duration, rampup_timelim, rampup_walltimelim, and
vmconf for use with a remote CPLEX server, with new solve_result_num
value 580 for "bad vmconfig specification".

20140131
  cplex.c: fix a glitch with a nonconvex diagonal QP when solved
with reqconvex=3.  Thanks to Pierre Bonami for reporting this issue.
Also, when reqconvex=2 is specified for a quadratic MIP, complain and
change reqconvex to 3 to bypass an apparent CPLEX bug.
  README.cplex: add description  of reqconvex=3.

20140204
  README.cplex: correct the description of objno.  objno=0 means
"no objective"; the default objno = 1 means the first objective, etc.
  cplex.c: omit "or licensing problem" from the message for
solve_result_num = 500.

20140313
  Fix a glitch (possible fault) with objrep.

20140618
  Fix a glitch in the solve_message: the strings for
"netopt found an infeasible network" and
"netopt found an unbounded network" were interchanged.
  Change most Snprintf calls to simpler, safer calls on Bpf.  Should
be invisible.

20141121
  Fix a bug (possible fault) in 64-bit cplex binaries with their
handling of lazy constraints.

20141209
  New keyword qcdual plus update for CPLEX 12.6.1.0:  new keywords
conflictalg, localimpliedcuts, qpmethod, qtolin; removed keywords
basisinterval, heurfreq, oldpricing, pdswitch, xxxstart; new possible
value 3 for netopt.  See the updated README.cplex for details, which
now also appear in the "cplex -=" output.  New internal routine
fixints() used in computing dual variables for problems with quadratic
constraints, which leads to omission of the error message "CPLEX
solution status 101 with fixed integers" on relevant problems.

20141223
  cplex.c: minor tweak for efficiency:  do not check for a quadratic
objective if there are no nonlinear objectives.

20150304
  cplex.c:  fix a possible fault with some error messages; fix a glitch
when compiled with -DWant_Distmipopt; when returning suffix .npool on
the problem, also return it on the objective.

20150327
  cplex.c:  fix a bug with quadratic objectives that do not involve all
variables.

20150409
  cplex.c: change CPXPARAM_LPMethod to CPX_PARAM_LPMETHOD for use with
older versions of CPLEX.  "cplex -v" still shows 20150327.

20150421
  cplex.c: update the descriptions of mipalg and mipstartalg.

20150425
  cplex.c: fix a bug with dettimelim, which was handled incorrectly.
Omit undocumented keywords (those that that start with _) since they
can be manipulated with dparam and iparam.  Improve error messages
involving iparam and dparam.

20150524
  cplex.c, README.cplex:  restore keyword "heurfreq", which was
mistakenly removed in version 20141209.

20150529
  cplex.c, README.cplex:  provide missing detail in descriptions of
bestbound and bestnode in "cplex -=" output.

20150623
  cplex.c, README.cplex: update for CPLEX 12.6.2.  New keywords bqpcuts,
cpumask, solutiontype, sparam; change to the meaning of cutsfactor. See
the "cplex -=" output or the updated README.cplex for details.

20150825
  cplex.c, README.cplex: update description of mipinterval.

20151005
  cplex.c:  fix a bug (possible fault) with handling quadratic
constraints when objrep causes adjustments.  Also fix a glitch in a
test determining which error message to print when something goes
wrong with finding an IIS (iisfind=1).
  README.cplex: add installation section.

20151026
  cplex.c: move "#if CPX_VERSION < 12060200" below include of cplex.h,
so OBJ_ADJ is only defined for earlier versions of CPLEX.

20151125
  cplex.c:  fix a possible glitch in setting solve_result_num for
infeasible or unbounded problems.

20160118
  cplex.c:  when dettimelim=... in $cplex_options causes the "solve"
to stop, give solve_result_num = 440 if a feasible solution is returned
and solve_result_nun = 441 otherwise.  Previously an "unrecoverable
failure" was reported.  Also:  new keywords nosolve and writemipstart,
and new possible solve_result_num values 581 for writeprob=... failure,
582 for writemipstart=... failure, and 600 for "not solved because of
nosolve".  See the updated README.cplex or "cplex -=" output.

20160409
  cplex.c:  fix some bugs with computing dual values for quadratic
constraints.  (It is unfortunate that CPLEX does not return the dual
values it uses.)  Also fix a typo, changing "configureation" to
"configuration" in one of the strings involved with "cplex -=" output.

20160411
  cplex.c:  fix more trouble with computing dual values for quadratic
constraints.

20160502
  cplex.c:  take optimization sense (minimize or maximize) into account
when computing dual values for quadratic constraints.  The versions of
20160409 and 20160411 implicitly assumed "minimize".

20160804
  cplex.c:  fix a bug (out-of-bounds subscript, possibly leading, e.g.,
to a fault) with "iisfind=1".

20160818
  Fix bugs with "iisfind=1":  sometimes constraints had .iis = "bug"
and sometimes the solve_message reported the wrong number of variables
in the IIS.

20161121
  cplex.c: update for CPLEX 12.7.  New keywords: benders_feascut_tol,
benders_optcut_tol, benders_strategy, bendersopt, datacheck, rltcuts.
Withdrawn keywords: endvector, writevector.  (Use endsol instead.)

20161219
  cplex.c: undo a one-line "efficiency" change that caused a BUG
message when computing duals for quadratic problems.

20161221
  cplex.c: fix a bug in computing dual variable values for problems
with quadratic constraints.

20161222
  cplex.c: improve yesterday's bug fix to avoid unlikely trouble.

20170221
  cplex.c: add keyword qcdmax for the maximum value of k*n*n for
computing dual values for quadratic constraints, where
k = number of quadratic constraints and n = number of variables.
Default = 1e9.  New solve_result_num value 5 indicates an optimal
solution without dual values for quadratic constraints.

20170222
  cplex.c: fix some typos in "cplex -=" output.

20170513
  cplex.c: update to CPLEX 12.7.1.  New keyword "simplexsifting".
See the "cplex -=" output for details.

20170806
  cplex.c: adjust treatment of mipbasis to accord with "cplex -=".
Since 20141209 mipbasis=0 was incorrectly assumed for linear MIP
problems.  Minor updates (for 12.7.1) to README.cplex.

20171222
  cplex.c, README.cplex: update to CPLEX 12.8.0.  New keywords
record, submipalg, submipscale, submipstart.  See the "cplex -="
output or updated README.cplex for details.

20180418
  cplex.c:  fix a bug (fault with logfile=...) that has only been
seen in a Windows cplex.exe prior to CPLEX 12.8.

20190215
  cplex.c, README.cplex:  add solve_result_num values and descriptions
for various returns associated with feasopt and feasoptobj.

20190216
  cplex.c:  add another case affecting feasopt with CPLEX 12.6.3.

20190312
  cplex.c:  update to CPLEX 12.9.  New keywords modisplay, multiobj,
warninglimit.  See the "cplex -=" output or updated README.cplex
for more details.

20190501
  cplex.c:  adjust "cplex -=" output (and README.cplex) to reflect
changes to defaults and, in some cases, new possible values for
various keywords that have arisen since the keywords were introduced.
Note that you can see the current default for, say, "keywd" by
specifying "keywd=?" in $cplex_options or on the cplex command line.

20200205
  cplex.c:  update to CPLEX 12.10.  New keyword heureffort.  See the
"cplex -=" output or updated README.cplex for more details.
  CPLEX 12.10 now produces undesirable output of the form
	Version identifier: 12.10.0.0 | 2019-11-26 | 843d4de
If IBM tells us how to suppress this output, we will update cplex.c
to do so.

20200412
  cplex.c:  fix a bug (possible fault) with SOS sets; suppress some
new, unwanted output (described in the entry for 20200205 above).

20200914
  cplex.c:  add possible values 3-7 for (mipstart =) mipstartvalue.
These values are probably rarely helpful, but a user reported having
an instance where mipstart=4 was much faster than the default.

20210206
  cplex.c:  Update to CPLEX 20.1, which includes algorithmic
improvements, a new possible value for mipemphasis and new keywords
benders_worker and nodecuts.  See the -= output for details.

20210215
  cplex.c:  Tweak that saves trivial storage with older versions of
CPLEX.

20210726
  cplex.c: Added options presos1reformulations, presos2reformulations 
and prereformulations that control various aspects of reformulations.
Renamed submipstart to submipstartalg.
Added parameter finalmipalg to control the algorithm used in the solution
of the final LP after solving a MIP problem