JuMP 0.19 contains significant breaking changes.
We will tag alpha and beta versions of 0.19 as appropriate to make it easier to test JuMP 0.19 before the final release. These are preview releases for early adopters. Additional breaking changes may occur between development tags. The documentation has known gaps. When using a development tag, be prepared to peek into the JuMP source code and tests for examples of how things work.
Latest development tag: v0.19-alpha
(] add JuMP#v0.19-alpha
).
Breaking changes:
-
JuMP's abstraction layer for communicating with solvers changed from MathProgBase (MPB) to MathOptInterface (MOI). MOI addresses many longstanding design issues. (See @mlubin's slides from JuMP-dev 2018.) JuMP 0.19 is compatible only with solvers that have been updated for MOI. See the installation guide for a list of solvers that have and have not yet been updated.
-
JuMP containers (e.g., the objects returned by
@variable
) have been redesigned.Base.Dict
replacesJuMPDict
,JuMPArray
was rewritten (inspired byAxisArrays
), and you can now request a container type with thecontainer=
keyword to the macros. See the corresponding documentation for more details. -
The statuses returned by solvers have changed. See the possible status values here. The MOI statuses are much richer than the MPB statuses and can be used to distinguish between previously indistinguishable cases (e.g. did the solver have a feasible solution when it stopped because of the time limit?).
-
Starting values are separate from result values. Use
value
to query the value of a variable in a solution. Usestart_value
andset_start_value
to get and set an initial starting point provided to the solver. The solutions from previous solves are no longer automatically set as the starting points for the next solve. -
The data structures for affine and quadratic expressions
AffExpr
andQuadExpr
have changed. Internally, terms are stored in dictionaries instead of lists. Duplicate coefficients can no longer exist. Accessors and iteration methods have changed. -
JuMPNLPEvaluator
no longer includes the linear and quadratic parts of the model in the evaluation calls. These are now handled separately to allow NLP solvers that support various types of constraints. -
JuMP solver-independent callbacks have been replaced by solver-specific callbacks. See your favorite solver for more details. (TODO: No solver-specific callbacks are implemented yet.)
-
The
norm()
syntax is no longer recognized inside macros. Use theSecondOrderCone()
set instead. -
JuMP no longer performs automatic transformation between special quadratic forms and second-order cone constraints. Support for these constraint classes depends on the solver.
-
The symbols
:Min
and:Max
are no longer used as optimization senses. Instead, JuMP uses theOptimizationSense
enum from MathOptInterface.@objective(model, Max, ...)
,@objective(model, Min, ...)
,@NLobjective(model, Max, ...)
, and@objective(model, Min, ...)
remain valid, but@objective(m, :Max, ...)
is no longer accepted. -
The sign conventions for duals has changed in some cases for consistency with conic duality (see the documentation). The
shadow_price
helper method returns duals with signs that match conventional LP interpretations of dual values as sensitivities of the objective value to relaxations of constraints.
New features:
-
Splatting (like
f(x...)
) is recognized in restricted settings in nonlinear expressions. -
Support for deleting constraints and variables.
-
The documentation has been completely rewritten using docstrings and Documenter.
-
Support for modeling mixed conic and quadratic models (e.g., conic models with quadratic objectives and bi-linear matrix inequalities).
-
Significantly improved support for modeling new types of constraints and for extending JuMP's macros.
-
Support for providing dual warm starts.
-
Improved support for accessing solver-specific attributes (e.g., the irreducible inconsistent subsystem).
-
Explicit control of whether symmetry-enforcing constraints are added to PSD constraints.
-
Support for modeling exponential cones.
-
Significant improvements in internal code quality and testing.
-
Style and naming guidelines.
-
Direct mode and manual mode provide explicit control over when copies of a model are stored and/or regenerated. See the corresponding documentation.
Known issues:
-
Model printing is not yet implemented. (issue)
-
There are known performance regressions (issue). Fast incremental NLP solves are not yet reimplemented (issue).
-
We do not yet have an implementation of solver-specific callbacks.
-
Example files (under
examples/
) have not yet been updated.
See the 0.19 issue milestone for a complete list of issues blocking the 0.19 release.
- Fix a bug in model printing on Julia 0.7 and 1.0.
- Add support for Julia v1.0 (Thanks @ExpandingMan)
- Fix matrix expressions with quadratic functions (#1508)
- Fix a bug in second-order derivatives when expressions are present (#1319)
- Fix a bug in
@constraintref
(#1330)
- Fix for nested tuple destructuring (#1193)
- Preserve internal model when relaxation=true (#1209)
- Minor bug fixes and updates for example
- Drop support for Julia 0.5.
- Update for ForwardDiff 0.5.
- Minor bug fixes.
- Use of
constructconstraint!
in@SDconstraint
. - Minor bug fixes.
- Breaking change: Mixing quadratic and conic constraints is no longer supported.
- Breaking change: The
getvariable
andgetconstraint
functions are replaced by indexing on the corresponding symbol. For instance, to access the variable with namex
, one should now writem[:x]
instead ofgetvariable(m, :x)
. As a consequence, creating a variable and constraint with the same name now triggers a warning, and accessing one of them afterwards throws an error. This change is breaking only in the latter case. - Addition of the
getobjectivebound
function that mirrors the functionality of the MathProgBasegetobjbound
function except that it takes into account transformations performed by JuMP. - Minor bug fixes.
The following changes are primarily of interest to developers of JuMP extensions:
- The new syntax
@constraint(model, expr in Cone)
creates the constraint ensuring thatexpr
is insideCone
. TheCone
argument is passed toconstructconstraint!
which enables the call to the dispatched to an extension. - The
@variable
macro now callsconstructvariable!
instead of directly calling theVariable
constructor. Extra arguments and keyword arguments passed to@variable
are passed toconstructvariable!
which enables the call to be dispatched to an extension. - Refactor the internal function
conicdata
(used build the MathProgBase conic model) into smaller subfunctions to make these parts reusable by extensions.
- Minor bug fixes and printing tweaks
- Address deprecation warnings for Julia 0.6
- Better support for
AbstractArray
in JuMP (Thanks @tkoolen) - Minor bug fixes
- Breaking change: JuMP no longer has a mechanism for selecting solvers by default (the previous mechanism was flawed and incompatible with Julia 0.6). Not specifying a solver before calling
solve()
will result in an error. - Breaking change: User-defined functions are no longer global. The first argument to
JuMP.register
is now a JuMPModel
object within whose scope the function will be registered. CallingJuMP.register
without aModel
now produces an error. - Breaking change: Use the new
JuMP.fix
method to fix a variable to a value or to update the value to which a variable is fixed. Callingsetvalue
on a fixed variable now results in an error in order to avoid silent behavior changes. (Thanks @joaquimg) - Nonlinear expressions now print out similarly to linear/quadratic expressions (useful for debugging!)
- New
category
keyword to@variable
. Used for specifying categories of anonymous variables. - Compatibility with Julia 0.6-dev.
- Minor fixes and improvements (Thanks @cossio, @ccoffrin, @blegat)
- Bugfix for
@LinearConstraints
and friends
- Julia 0.5.0 is the minimum required version for this release.
- Document support for BARON solver
- Enable info callbacks in more states than before, e.g. for recording solutions.
New
when
argument toaddinfocallback
(#814, thanks @yeesian) - Improved support for anonymous variables. This includes new warnings for potentially confusing use of the traditional non-anonymous syntax:
- When multiple variables in a model are given the same name
- When non-symbols are used as names, e.g.,
@variable(m, x[1][1:N])
- Improvements in iterating over JuMP containers (#836, thanks @IssamT)
- Support for writing variable names in .lp file output (Thanks @leethargo)
- Support for querying duals to SDP problems (Thanks @blegat)
- The comprehension syntax with curly braces
sum{}
,prod{}
, andnorm2{}
has been deprecated in favor of Julia's native comprehension syntaxsum()
,prod()
andnorm()
as previously announced. (For early adopters of the new syntax,norm2()
was renamed tonorm()
without deprecation.) - Unit tests rewritten to use Base.Test instead of FactCheck
- Improved support for operations with matrices of JuMP types (Thanks @ExpandingMan)
- The syntax to halt a solver from inside a callback has changed from
throw(CallbackAbort())
toreturn JuMP.StopTheSolver
- Minor bug fixes
- Allow singeton anonymous variables (includes bugfix)
- More consistent handling of states in informational callbacks,
includes a new
when
parameter toaddinfocallback
for specifying in which state an informational callback should be called.
- Compatibility with Julia 0.5 and ForwardDiff 0.2
- Support for "anonymous" variables, constraints, expressions, and parameters, e.g.,
x = @variable(m, [1:N])
instead of@variable(m, x[1:N])
- Support for retrieving constraints from a model by name via
getconstraint
@NLconstraint
now returns constraint references (as expected).- Support for vectorized expressions within lazy constraints
- On Julia 0.5, parse new comprehension syntax
sum(x[i] for i in 1:N if isodd(i))
instead ofsum{ x[i], i in 1:N; isodd(i) }
. The old syntax with curly braces will be deprecated in JuMP 0.15. - Now possible to provide nonlinear expressions as "raw" Julia
Expr
objects instead of using JuMP's nonlinear macros. This input format is useful for programmatically generated expressions. s/Mathematical Programming/Mathematical Optimization/
- Support for local cuts (Thanks to @madanim, Mehdi Madani)
- Document Xpress interface developed by @joaquimg, Joaquim Dias Garcia
- Minor bug and deprecation fixes (Thanks @odow, @jrevels)
- Compatibility update for MathProgBase
- Fix broken deprecation for
registerNLfunction
.
- Most exported methods and macros have been renamed to avoid camelCase. See the list of changes here. There is a 1-1 mapping from the old names to the new, and it is safe to simply replace the names to update existing models.
- Specify variable lower/upper bounds in
@variable
using thelowerbound
andupperbound
keyword arguments. - Change name printed for variable using the
basename
keyword argument to@variable
. - New
@variables
macro allows multiline declaration of groups of variables. - A number of solver methods previously available only through MathProgBase are now exposed directly in JuMP. The fix was recorded live!
- Compatibility fixes with Julia 0.5.
- The "end" indexing syntax is no longer supported within JuMPArrays which do not use 1-based indexing until upstream issues are resolved, see here.
- Small fixes for nonlinear optimization
- Fix a regression in slicing for JuMPArrays (when not using 1-based indexing)
- The automatic differentiation functionality has been completely rewritten with a number of user-facing changes:
@defExpr
and@defNLExpr
now take the model as the first argument. The previous one-argument version of@defExpr
is deprecated; all expressions should be named. E.g., replace@defExpr(2x+y)
with@defExpr(jump_model, my_expr, 2x+y)
.- JuMP no longer uses Julia's variable binding rules for efficiently re-solving a sequence of nonlinear models. Instead, we have introduced nonlinear parameters. This is a breaking change, so we have added a warning message when we detect models that may depend on the old behavior.
- Support for user-defined functions integrated within nonlinear JuMP expressions.
- Replaced iteration over
AffExpr
withNumber
-like scalar iteration; previous iteration behavior is now available vialinearterms(::AffExpr)
. - Stopping the solver via
throw(CallbackAbort())
from a callback no longer triggers an exception. Instead,solve()
returnsUserLimit
status. getDual()
now works for conic problems (Thanks @emreyamangil.)
- Bug-fix for problems with quadratic objectives and semidefinite constraints
- Compatibility update for Mosek
- Remove usage of
@compat
in tests. - Fix updating quadratic objectives for nonlinear models.
- Julia 0.4.0 is the minimum required version for this release.
- Fix for scoping semantics of index variables in sum{}. Index variables no longer leak into the surrounding scope.
- Addition of the
solve(m::Model, relaxation=true)
keyword argument to solve the standard continuous realaxation of modelm
- The
getConstraintBounds()
method allows access to the lower and upper bounds of all constraints in a (nonlinear) model. - Update for breaking changes in MathProgBase
- Fix a rare error when parsing quadratic expressions
- Fix
Variable()
constructor with default arguments - Detect unrecognized keywords in
solve()
- Fix for deprecation warnings
- Fixes for ambiguity warnings.
- Fix for breaking change in precompilation syntax in Julia 0.4-pre
- Support (on Julia 0.4 and later) for conditions in indexing
@defVar
and@addConstraint
constructs, e.g.@defVar(m, x[i=1:5,j=1:5; i+j >= 3])
- Support for vectorized operations on Variables and expressions. See the documentation for details.
- New
getVar()
method to access variables in a model by name - Support for semidefinite programming.
- Dual solutions are now available for general nonlinear problems. You may call
getDual
on a reference object for a nonlinear constraint, andgetDual
on a variable object for Lagrange multipliers from active bounds. - Introduce warnings for two common performance traps: too many calls to
getValue()
on a collection of variables and use of the+
operator in a loop to sum expressions. - Second-order cone constraints can be written directly with the
norm()
andnorm2{}
syntax. - Implement MathProgBase interface for querying Hessian-vector products.
- Iteration over
JuMPContainer
s is deprecated; instead, use thekeys
andvalues
functions, andzip(keys(d),values(d))
for the old behavior. @defVar
returnsArray{Variable,N}
when each ofN
index sets are of the form1:nᵢ
.- Module precompilation: on Julia 0.4 and later,
using JuMP
is now much faster.
- Fixes for FactCheck testing on julia v0.4.
- Fix bug in @addConstraints.
- Fix for Julia 0.4-dev.
- Small infrastructure improvements for extensions.
- Comparison operators for constructing constraints (e.g.
2x >= 1
) have been deprecated. Instead, construct the constraints explicitly in the@addConstraint
macro to add them to the model, or in the@LinearConstraint
macro to create a stand-alone linear constraint instance. getValue()
method implemented to compute the value of a nonlinear subexpression- JuMP is now released under the Mozilla Public License version 2.0 (was previously LGPL). MPL is a copyleft license which is less restrictive than LGPL, especially for embedding JuMP within other applications.
- A number of performance improvements in ReverseDiffSparse for computing derivatives.
MathProgBase.getsolvetime(m)
now returns the solution time reported by the solver, if available. (Thanks @odow, Oscar Dowson)- Formatting fix for LP format output. (Thanks @sbebo, Leonardo Taccari).
- Nonlinear subexpressions now supported with the
@defNLExpr
macro. - SCS supported for solving second-order conic problems.
setXXXCallback
family deprecated in favor ofaddXXXCallback
.- Multiple callbacks of the same type can be registered.
- Added support for informational callbacks via
addInfoCallback
. - A
CallbackAbort
exception can be thrown from callback to safely exit optimization.
- Reduced costs and linear constraint duals are now accessible when quadratic constraints are present.
- Two-sided nonlinear constraints are supported.
- Methods for accessing the number of variables and constraints in a model are renamed.
- New default procedure for setting initial values in nonlinear optimization: project zero onto the variable bounds.
- Small bug fixes.
- Fix a method ambiguity conflict with Compose.jl (cosmetic fix)
- Fix a bug in
sum(::JuMPDict)
- Added the
setCategory
function to change a variables category (e.g. continuous or binary) after construction, andgetCategory
to retrieve the variable category.
- Fix a bug in parsing linear expressions in macros. Affects only Julia 0.4 and later.
- Breaking change: The syntax for column-wise model generation has been changed to use keyword arguments in
@defVar
. - On Julia 0.4 and later, variables and coefficients may be multiplied in any order within macros. That is, variable*coefficient is now valid syntax.
- ECOS supported for solving second-order conic problems.
- Support for skipping model generation when solving a sequence of nonlinear models with changing data.
- Fix a memory leak when solving a sequence of nonlinear models.
- The
@addNLConstraint
macro now supports the three-argument version to define sets of nonlinear constraints. - KNITRO supported as a nonlinear solver.
- Speed improvements for model generation.
- The
@addNLConstraints
macro supports adding multiple (groups of) constraints at once. Syntax is similar to@addConstraints
. - Discrete variables allowed in nonlinear problems for solvers which support them (currently only KNITRO).
- Starting values for variables may now be specified with
@defVar(m, x, start=value)
. - The
setSolver
function allows users to change the solver subsequent to model creation. - Support for "fixed" variables via the
@defVar(m, x == 1)
syntax. - Unit tests rewritten to use FactCheck.jl, improved testing across solvers.
- Fix a bug in multiplying two AffExpr objects.
- Further improvements and bug fixes for printing.
- Fixed a bug in
@defExpr
. - Support for accessing expression graphs through the MathProgBase NLP interface.
- Improvements and bug fixes for printing.
- Julia 0.3.0 is the minimum required version for this release.
buildInternalModel(m::Model)
added to build solver-level model in memory without optimizing.- Deprecate
load_model_only
keyword argument tosolve
. - Add groups of constraints with
@addConstraints
macro. - Unicode operators now supported, including
∑
forsum
,∏
forprod
, and≤
/≥
- Quadratic constraints supported in
@addConstraint
macro. - Quadratic objectives supported in
@setObjective
macro. - MathProgBase solver-independent interface replaces Ipopt-specific interface for nonlinear problems
- Breaking change:
IpoptOptions
no longer supported to specify solver options, usem = Model(solver=IpoptSolver(options...))
instead.
- Breaking change:
- New solver interfaces: ECOS, NLopt, and nonlinear support for MOSEK
- New option to control whether the lazy constraint callback is executed at each node in the B&B tree or just when feasible solutions are found
- Add support for semicontinuous and semi-integer variables for those solvers that support them.
- Add support for index dependencies (e.g. triangular indexing) in
@defVar
,@addConstraint
, and@defExpr
(e.g.@defVar(m, x[i=1:10,j=i:10])
).- This required some changes to the internal structure of JuMP containers, which may break code that explicitly stored
JuMPDict
objects.
- This required some changes to the internal structure of JuMP containers, which may break code that explicitly stored
- Fix a bug with specifying solvers (affects Julia 0.2 only)
- Fix a bug in printing models
- Add support for semicontinuous and semi-integer variables for those solvers that support them.
- Breaking change: Syntax for
Variable()
constructor has changed (use of this interface remains discouraged)
- Breaking change: Syntax for
- Update for breaking changes in MathProgBase
- Fix bug with problem modification: adding variables that did not appear in existing constraints or objective.
- Update for breaking change in MathProgBase which reduces loading times for
using JuMP
- Fix error when MIPs not solved to optimality
- Update for breaking change in ReverseDiffSparse
- Fix compatibility with Julia 0.3 prerelease
- Fix a bug in coefficient handling inside lazy constraints and user cuts
- Support for nonlinear optimization with exact, sparse second-order derivatives automatically computed. Ipopt is currently the only solver supported.
getValue
forAffExpr
andQuadExpr
- Breaking change:
getSolverModel
replaced bygetInternalModel
, which returns the internal MathProgBase-level model - Groups of constraints can be specified with
@addConstraint
(see documentation for details). This is not a breaking change. dot(::JuMPDict{Variable},::JuMPDict{Variable})
now returns the corresponding quadratic expression.
- Fix bug where change in objective sense was ignored when re-solving a model.
- Fix issue with handling zero coefficients in AffExpr.
- Support for SOS1 and SOS2 constraints.
- Solver-independent callback for user heuristics.
dot
andsum
implemented forJuMPDict
objects. Now you can say@addConstraint(m, dot(a,x) <= b)
.- Developers: support for extensions to JuMP. See definition of Model in
src/JuMP.jl
for more details. - Option to construct the low-level model before optimizing.
- Improved model printing
- Preliminary support for IJulia output
- Documentation updates
- Support for MOSEK
- CPLEXLink renamed to CPLEX
- Unbounded/infeasibility rays: getValue() will return the corresponding components of an unbounded ray when a model is unbounded, if supported by the selected solver. getDual() will return an infeasibility ray (Farkas proof) if a model is infeasible and the selected solver supports this feature.
- Solver-independent callbacks for user generated cuts.
- Use new interface for solver-independent QCQP.
setlazycallback
renamed tosetLazyCallback
for consistency.
- Breaking change: Objective sense is specified in setObjective instead of in the Model constructor.
- Breaking change:
lpsolver
andmipsolver
merged into singlesolver
option. - Problem modification with efficient LP restarts and MIP warm-starts.
- Relatedly, column-wise modeling now supported.
- Solver-independent callbacks supported. Currently we support only a "lazy constraint" callback, which works with Gurobi, CPLEX, and GLPK. More callbacks coming soon.
- Bug fixes for printing, improved error messages.
- Allow
AffExpr
to be used in macros; e.g.,ex = y + z; @addConstraint(m, x + 2*ex <= 3)
- Update for solver specification API changes in MathProgBase.
- Initial public release.