- Fixed a bug in the multi-objective emulator (see option obj:multi) when nonlinear terms were not reset for consecutive objectives.
- Option cvt:pre:continuous_fixed_vars to declare fixed variables continuous. Default 1.
- Option cvt:pre:boundsbest defaults to making auxiliary subexpression result variables free, unless the result is constant. This allows stronger nonlinear presolve.
- Additional case where the signpow function is recognized: abs(C*x)*x (C constant, x variable).
- Auxiliary variables and constraints receive names describing the redefinition path. Such names are only given if AMPL option (solver_)auxfiles rc is set, or solver option cvt:names=2,3 provided.
- Added option tech:stats to return solution statistics via problem suffixes.
- Remove excessive '_' symbols in output model constraint and variable names.
- Recognize the logistic function 1/(1+e^(-x)), option cvt:pre:logistic.
- Recognize the signpow function sign(x)*x^k from several kinds of algebra, such as abs(x)*x^k. Option cvt:pre:signpow.
- iis:find now the main name for option alg:iisfind (which is now a synonym).
- Option obj:multi:options: fix integer-valued options.
- Meta-driver MP2NL, see https://mp.ampl.com/modeling-tools.html#mp2nl.
- New option obj:multi:options to control whether multi-objective option suffixes are used.
- Catch duplicate solver options.
- Option cvt:expr:nlassign adjusting expression inlining. Improves problem building performance for some nonlinear solvers on large models.
- Option cvt:pre:ctx2count is deprecated, with a new default value 7. Its former behavior is specialized and generalized by the new option cvt:pre:ctx2bndeq.
- Option cvt:pre:ctx2bndeq controls whether conditional comparisons with upper/lower bounds are reformulated in exact context, vs. always mixed. Default yes, value 1.
- Workaround for #270 (redefinition of an expression as an existing expression can lose connection to the original).
- Fixed multiobj=2 for a single objective.
Running multiobjective for a single-objective
model makes sense with a negative
.objweightsuffix. - Options cvt:pre:ineq2bndeq, cvt:pre:ineq2related control unification of conditional equlaities and inequalities.
- cvt:compl:eps=1e-9 new default.
- alg:start=3 default (new value), which passes both the initial guesses and basis for LP (previously basis only).
- Option cvt:uenc:negctx:max disregards lb(x), ub(x).
- Options cvt:pre:ctx:abs etc. control propagation of expression context.
- Fixed reformulation of numberof and alldiff. Previously could produce an inefficient reformulation.
- Option cvt:pre:sort:
- Sorting and eliminating duplicates in arguments of AND, OR, MIN, MAX. This is necessary for some solvers.
- Sorting arguments of COUNT, ATLEAST, EXACTLY, ATMOST, NUMBEROF, ALLDIFF.
- Option cvt:pre:unnest extended for MIN, MAX (bit 8).
- The legacy fmt::MemoryWriter has double output precision of 17 significant digits (previously 6).
- Option cvt:pre:boundlogarg (default 0) to bound arguments of logarithms nonnegative. Previously always done, sometimes deteriorating performance of nonlinear solvers.
- Tolerances set by options cvt:pre:feastol, cvt:pre:feastolrel both need to be violated to produce a warning on contradicting variable/constraint bounds. Previously the preprocessor failed on any violation, without letting the solver try.
- Options cvt:compl, cvt:compl:eps control complementarity reformulations.
- Option cvt:unnest: bits 2 and 4 switch on inlining of linear and quadratic subexpressions produced during reformulations (by default on).
- Options cvt:pre:ctx2ineq, cvt:pre:ctx2count to control context propagation into conditional comparisons #267.
- Multi-objective emulator: added support for objective-specific options via objective suffixes beginning with option_.
- Fixed a bug in parsing of quadratic expressions, which could wrongly parse products of unequal linear expressions, such as (x-3)*(x-z-5).
- Option alg:sens returns synonym suffixes
.down/.up/.currentfor objective coefficients and.down/.upfor right-hand sides. - Improved parsing speed of large sums of quadratic
and polynomial expressions.
- Setting option cvt:qp2passes=0 switches to a simpler method, usually slightly slower.
- Option cvt:multoutcard to limit the size of out-multiplied QP expressions. Can improve speed on large models, but prone to numerical issues.
- Fixed a bug in monotonicity presolve which could have led to wrong models using a^x with a<1.
- Reduced memory fragmentation for linear and quadratic expressions.
- Option tech:outlev_mp=1 (implied by tech:outlev=1) prints initial and transformed model statistics.
- Improved presolve for disequality: more cases when no logical disjunction is needed.
- Fixed a bug in model reformulations which could cause some constraints to be lost, see issue 248.
- Option alg:sens=1 now returns suffix
.sensobjwith current objective coefficients in the solver model (this is the model corresponding to AMPL commandsolexpand.) - Option acc:_all is overridden by individual acceptance options, e.g., acc:or.
- Substitute AMPL defined variables into linear, quadratic, and polynomial expressions (option cvt:dvelim). This can simplify quadratic and polynomial models (linear substitutions are already performed by AMPL, see AMPL options linelim and *substout.)
- cvt:prod=7 default for LP and convex solvers, logicalizing also products of just 2 binary variables.
- More presolve for logical expressions (Not, And, Or, Indicator), and new options to control some of them: cvt:pre:ineqresult, cvt:pre:ineqrhs.
- Fix lower bound calculation of the division result.
- [BREAKING] Option acc:pow now affects only expressions x^y with both x, y variable; previous meaning of acc:pow is now with acc:powconstexp.
- Option tech:writemodel:index to choose the iteration when solver model is exported in the multi-objective emulator.
- SCIP (and any solver with linear objective and non-linear constraints): improve reformulation of QP objectives.
- Fix reformulation of non-linear objective expressions for the multi-objective case (option obj:multi) when negative objective weights are used (obj:multi:weight).
- Option acc:_all
- Useful to disable all reformulations (acc:_all=2), or force linearization (acc:_all=0).
- Faster input of quadratic expressions.
- Multi-objective emulator
- obj:multi=2 forces emulation, even if MO natively supported.
- Fixed a bug in the objective degradation suffixes
.objabstol,.objreltol.
- Fixed a bug in the objective degradation suffixes
- obj:multi=2 forces emulation, even if MO natively supported.
- Presolve division by constant, resulting in fewer constraints
- Fix no-solution case in multi-objective emulator
- Multi-objective emulator
- All flat MP solvers support multi-objective mode (obj:multi=1), either natively, or via emulation.
- Suffixes
.objpriority,.objweight,.objabstol,.objreltol. - [BREAKING] Default intuitive handling of
.objweight, see optionobj:multi:weight, even when natively supported.
- Options
report_timesandtiming.- Options
timingandreport_timesnow have the same effect: setting their value to 1 returns basic timing information, setting it to 2 returns more granular info.
- Options
- SOS constraints.
- Fixed handling of SOS2 constraints created by AMPL
as reformulations of PL expressions (
option pl_linearize 1, default; set to 0 to use the solver's native PL functions if supported, or MP linearization.) - Disallow repeated weights for SOS constraints
(suffixes
.sosno/.ref).
- Fixed handling of SOS2 constraints created by AMPL
as reformulations of PL expressions (
- Reformulation explorer.
- Upgraded option writegraph exports the reformulation graph which can be explored with the script in support/modelexplore (WIP).
- Native handling of POW(x, INT).
- Power expressions with positive integer exponent are passed natively to the solvers accepting them, vs previously quadratic or linear reformulation.
- For best performance, global solving capability
might be needed (e.g., Gurobi:
global=1.)
- Option
report_times. - Unused
acc:options.- The constraint acceptance options
acc:...for non-handled constraints are ignored (previously triggered error.)
- The constraint acceptance options
- NLWPY.
- Python NL Writer API for MIQP models.
- Available on PyPI.
- Solve result codes.
- List codes by running (solver) -!
- [BREAKING] Standardized codes. Major changes:
- 100-199 (solved?) means solution candidate provided, but can be suboptimal/infeasible
- 300-349 means unbounded problem but feasible solution returned
- 400-449 means limit/interrupt but feasible
- [BREAKING] sol:chk:fail returns code 150 (solved?)
- Improved translation of SOCP constraints.
- Options cvt:socp, cvt:socp2qc.
- Compact solution check warnings
- Fixed presolve of the power function #226.
- Fixed graceful exit on Ctrl-C from AMPL in Linux.
- Improved translation of logical constraints: inlining of nested disjunctions and conjunctions; fewer auxiliary binary variables.
- Fixed a bug in NL reader on Windows.
- mp_options.
Receive mp_options from AMPL (for all MP solvers).
They are parsed before
(solvername)_options. - Solution checking: relative tolerance sol:chk:feastolrel; options sol:chk:round, sol:chk:prec.
- Solution checking, options sol:chk:... (experimental).
- Preprocess And/Or constraints.
- Alternative solutions: solve status equal to that of the final solution.
- Fixed a bug causing repeated names for auxiliary variables and constraints.
- Option values can be assigned without '='.
- Fixed a bug where equivalent conditional comparisons were not unified.
- Option 'tech:writesolution' #218.
- Option 'writeprob' ('tech:writemodel') ASL-compatible.
- Hint when 'writeprob' fails: use 'writesol'.
- Fixed inequalities of integer expressions with non-integer constants, see test_int_non_int.mod.
- Backend std feature WRITE_SOLUTION.
- Fixed parsing quoted string options.
- Option [solver_]auxfiles rc; transfers names of variables and constraints into the model; (solver)_options 'cvt:names=0-3' controls names.
- Print warnings in non-verbose mode too.
- 'barrier' equivalent to 'barrier=1' for integer options.
- Fix quadratic objective with repeated subexpressions.
- Smaller reformulations for conditional comparisons.
- Option cvt:names sets whether to read AMPL variable names or to provide generic names.
- Cones: recognize (affine_expr) >= y * exp(z/y) as exponential cone.
- Cones: recognize xy >= 1 as rotated SOC.
- Wrong solver options are gracefully reported via solve_message.
- Recognize exponential conic constraints. Exponential cones are recognized and passed to the solver, if supported.
- Pass variable names if read from a
colfile with the same name of thenlfile being read. - Fixed #203: starting solution is now not passed to the solver if empty.
- Recognize second-order cones Recognize SOCP constraints from algebra and pass them natively, or transform to quadratics.
- Handle boolean constants in ProblemFlattener.
- More to #163: ignore SOS with zero weights.
-
Fixed #195: case-insensitive option synonyms.
-
Fixed #194 Report correct objno for feasibility problems in .sol file, so that AMPL can print "Objective = find feasible solution".
-
==> else Implemented implication with 'else': constr1 ==> constr2 [else constr3]
-
PLApproxRelTol, PLApproxDomain Parameters to control piecewise-linear approximation. cvt:plapprox:reltol default value changed from 1e-5 to 0.01.
- Piecewise-linear approximation of quadratics Automatic for linear solvers. For convex QP solvers, set the following options: cvt:quadobj=0 cvt:quadcon=0 to linearize nonconvex objective(s) and/or constraints. Recognizing x^2 for stronger univariate approximation.
-
Piecewise-linear approximation of univariate nonlinear functions Approximation of exp, a^x, x^a, log, log10, trigonometric and hyperbolic functions.
-
Default value of big-M For linearization of logical constraints on variables without finite bounds, option cvt:mip:bigM can provide a default big-M bound.
-
Solution file export On Windows now creates files with LF only to avoid issues when exporting suffixes to AMPL.
Multiple solutions export file format amended.
-
Propagating suffixes via expression trees into flat constraints Partially implemented #184. x-gurobi accepts options 'funcpieces...' and corresponding suffixes which are passed into GRBaddgenconstrExp etc.
Subexpressions: note that if a subexpression is contained in several constraints, for contradicting suffix values the maximum is taken.
-
Option 'cvt:writegraph' Exporting the flattening / conversion graph in JSON Lines format (WIP).
-
PowConstraint is reduced to quadratics in some cases For constant non-negative integer exponent and base variables with negative lower bound, PowConstraint is reduced to quadratics (possibly with auxiliary variables). Reason: Gurobi's GRBaddgenconstrPow not accepting negative bases.
-
Context for algebraic constraints Context is now propagated for algebraic constraints. For example, 3x + max(y, z) <= 6 will result in 3 linear constraints. (Earlier this was done for logical constraints and objectives).
- Special ordered sets Fixed: SOS are now recognized even if the suffix '.ref' value is integer
-
Complementarity constraints: also quadratics Complementarity constraints now handle quadratics.
-
Branch develop is used for new code The active development branch is now develop.
-
Convert quadratic range constraints to QuadCon(LE/EQ/GE) Gurobi and COPT do not support quadratic range constraints. (Gurobi's linear ranges are not feature-complete). Conversion of linear range constraints into one-side rhs constraints has been generalized for any algebraic ones.
-
Complementarity constraints: 1st go Conversion to MIP of complementarity constraints (no quadratics but functional subexpressions ok).
-
DivConstraint and DivConverter_MIP ModelFlattener now receives the Div expression and MIPFlatConverter handles it via quadratics.
-
Fix NL input variable order
-
Reduce default strict comparison tolerance Change cvt:mip:eps default value to 1e-4.
-
Build on MacOS 12.3, in particular on Apple M1 Fixed linking on MacOS 12.3 and FindCPLEX.cmake. For Apple M1, manually set -DCMAKE_OSX_ARCHITECTURES="x86_64" in CMake when building with CPLEX 22.1 because it contains only Intel libraries.
-
Expression maps FlatConverter eliminates subexpressions of all types. A subexpression means here a duplicate expression, such as abs(x+2) occurring several times in the model (here x+2 is a nested subexpression).
-
AMPLS C API C API allowing access to underlying solver API. Replaces the previous Solver C API (solver-c.cc). Toy driver
gurobi_amplsexemplifies API usage.
-
Improved warnings (#161, #163): In verbose mode, FlatConverter / Backend print warning summary before and after solving
-
Fixed solver option parsing in Windows (#160)
-
Reworked Backend / ModelAPI class hierarchy (#162): In particular, also generalized old MP hierarchy (Solver / ProblemBuilder / AppSolutionHandler / SolverNLHandler)
-
Allowing SOS constraints with repeated weights (#163): Although Gurobi states SOS weights should be unique, it accepts them repeated. This happens when AMPL linearizes a PL function with redundant (repeated) slopes. It seems better to use PL functions natively (option pl_linearize 0;).