Xpress release notes - October 2025
Release notes for Xpress 9.8
New in Release 9.8 - October 2025
This will be the last Xpress release to include Xpress IVE, which has been deprecated since Xpress 8.3.
Please consider alternative integrated development environments, such as Xpress Workbench.
Xpress Supported Platforms
- Dropped support for Windows 10.
Xpress Optimizer 46.01.01
-
The GPU port of the Primal-Dual Hybrid Gradient (PDHG) algorithm is now
available as a beta to all users with licenses for Xpress 9.8. This port is
under active development with ongoing algorithmic and performance enhancements
to the code. It is provided primarily for testing and evaluation. Although it
has been tested extensively on multiple platforms and NVIDIA® GPUs, we do not
recommend using it for production code. If you are interested in submitting
instances, please write to XpressPerformance@fico.com.
Please refer to the Xpress Installation Guide for platform requirements and
installation instructions.
A new control, BARHGGPU, has been introduced to switch between CPU and GPU
support for the PDHG algorithm.
- The default solver for linear optimization problems has been changed to the
concurrent solver. The default behavior is to always run the barrier and
dual simplex algorithms, with the primal simplex algorithm run only if the
problem looks suitable. If only a single thread is available or a starting
basis is present, it will instead default to dual simplex.
- Performance improvements:
- The default number of background threads at the root node was reduced in
order to reduce the memory consumption on machines with large core counts.
To force a specific number of background threads, use the
BACKGROUNDMAXTHREADS control.
- Improved management of duplicated and dominated cutting planes.
- Improved strategies to measure the progress of cutting planes at the root
node.
- Background tasks running in parallel at the root node are now also used to
improve the dual bound of the overall solution process.
- Improved performance of several default heuristics on instances with
indicator constraints.
- Introduced a new infeasibility reduction strategy in preroot parallel
heuristics.
- Introduced an adaptive learning of infeasibility reduction strategies in
preroot parallel heuristics.
- Minor changes:
- The hybrid gradient LP solver can now work in single precision mode, both in
CPU and GPU mode. This is governed by the new BARHGPRECISION control.
- It is now possible to specify a relative feasibility and optimality tolerance
for the Primal-Dual Hybrid Gradient algorithm, using the new control
BARHGRELTOL
- Added new function XPRSpresolvesol() to map a primal solution from the
original space to the presolved space.
- Deprecated function XPRSrefinemipsol() was removed in all APIs, including
the console. Use the REFINEOPS control instead.
- Attempting to change controls in callbacks set by XPRSaddcbmessage,
XPRSaddcbchecktime or XPRSaddcbdestroymt will now raise an error.
- XPRSiisfirst now properly returns a value different from zero if statuscode
is 2.
- XPRSdelobj now also deletes all quadratic objective coefficients.
- For multi-objective solves, a new stop status XPRS_STOP_NEXTOBJECTIVE
provides a way to tell the Optimizer to accept the best solution found
so far and move onto solving the next objective. This can be used from
the checktime callback to implement per-objective time limits.
- Added user control DETERMINISTICLOG to enable a deterministic, reproducible
log output for MIP searches (independent of time and memory usage).
- LP format: Section names are no longer accepted as variable or constraint
names.
- LP format: Variable and constraint names cannot start with parentheses or
braces.
- MPS format: Missing ENDATA line now triggers an error instead of being
silently ignored.
- Improved the documentation of bit vector controls.
Xpress Nonlinear 46.01.01
- Knitro has been upgraded to the latest version, 15.0.1. Please note that this
will be the last Knitro version to support Intel-based MacOS platforms.
- Xpress Global is now the default nonlinear solver when using the community
license. Set XPRS_NLPSOLVER to XPRS_NLPSOLVER_LOCAL to use XSLP instead.
- Performance improvements:
- Continuous nonlinear problems solved to local optimality now go through
the full linear presolve.
- x^k for binary x and k > 0 is now simplified to x.
- Minor changes:
- XPRSpresolverow() is now supported for global and MISLP solves. Note that
nonlinear eliminations and converting a convex quadratic objective transfer
row could make a row nonlinear, in which case a status of -5 will be returned
instead.
- The XPRS_bo_*() functions are now supported for global solves (except for
the preintsol callback) and MISLP solves.
- XPRS_NODES can now be queried after SLP-in-MIP and SLP-MIP-SLP solves
(in contrast to XSLP_MIPNODES, this counts all nodes and not just those
where an SLP relaxation was solved and therefore matches the node numbers
reported in the log).
- XSLP_SCALE, XSLP_SCALECOUNT and XSLP_SLPLOG are now also available as
XPRS_SLPSCALE, XPRS_SLPSCALECOUNT and XPRS_SLPLOG.
- Using an undefined preset for XPRSmsaddpreset will now stop the solver with
an error instead of only printing a message and ignoring that multistart job.
- Setting XPRS_HEUREMPHASIS will now also affect XSLP_HEURSTRATEGY by default.
XSLP_HEURSTRATEGY can still be set independently to override this.
- MISLP will no longer drop the XSLP_FILTER_KEEPBEST option from XSLP_FILTER
for the node SLP solves.
- The deprecated functions XSLPgetccoef() and XSLPgetformulastring() return 20
(instead of 32) when the formula is too long for the buffer.
- The gaps in the MISLP log are now computed by dividing the absolute gap by
the maximum of the primal and dual bound (consistent with the mixed-integer
linear, convex quadratic, and global solvers), rather than always dividing
by the primal bound as in earlier versions.
- XPRSslpgetcolinfo now also allows querying XPRS_SLPCOLINFO_DETROW and
XPRS_SLPCOLINFO_CONVERGENCESTATUS.
- Added support for XKTR_PARAM_SOLTYPE to be able to query earlier solutions
found by Knitro before the final iterate.
- Nondeterministic multistart will no longer prefer runs with a smaller primal
integral over runs that found a better solution.
Xpress Global 46.01.01
- Added a special branching rule in case a denominator becomes zero.
In this case, the denominator will be branched more than the feasibility
tolerance away from zero to ensure validity of calculations. In case
solutions with a denominator within the default feasibility tolerance are
sought, the feasibility tolerance needs to be adjusted accordingly.
- Performance improvements:
- Added SDP-cuts. These can be influenced by the new SDPCUTSTRATEGY
control.
- Added Optimization-Based Bound Tightening (OBBT), a bound
reduction technique based on the initial linear relaxation of a
mixed-integer nonlinear optimization problem; it can be used with
the new control GLOBALPRESOLVEOBBT (default value -1: automatic),
with values from 0 (off) to 3 (aggressive). Currently, due to its
computational cost, the user must explicitly set values 1 to 3 to
enable it.
- Reduced memory consumption by restricting the total number of cuts
to be added to branching candidates in extreme cases.
- Improved RLT cuts for squared columns.
- Minor changes:
- XPRSaddmipsol is now also supported from global solver callbacks.
Xpress Interfaces 46.01.01 (Python, R, Matlab, .NET, Java, C++)
- Deprecated callbacks cutmgr, chgnode, chgbranch removed from all APIs
(including the C API).
- New solution enumeration example in C (solenum.c) and Python (solenum.py),
demonstrating how to collect the n-best solutions when solving a MIP.
- Java, .NET, C++
- New function XpressProblem::addManagedCuts() to add multiple managed cuts
in one shot.
- Some improvements to speed up building of problems. This skips expression
compression when not needed. As a consequence, the default value
for LinTermList::autoCompress and QuadTermList::autoCompress changed from
false to true. This guarantees backward compatibility because in previous
versions, the code behaved as if this field was set to true.
- Some tunable parameters for controlling buffer sizes in problem building
were made available in C++ as well. See the reference documentation for
more details.
- The type of expression (term list or term map) for LinExpression::create()
and QuadExpression::create() can now be configured. See the reference
documentation for more details.
- The finalize() method was deprecated in the Xpress and BCL Java APIs.
Use close() (and try-with-resources) instead.
- All functions were removed from xpress::objects::Index. These functions
are now non-virtual functions in the respective implementing classes.
- Java
- Classes XPRSmipsolpool, XPRSmipsolenum, XPRSnamelist, XPRSglobalenv,
XpressProblem are now marked "final".
- C++
- The xprscxx (libxprscxx.so, libxprscxx.dylib, xprscxx.dll) library was
removed, and functionality was moved into the Optimizer library
(libxprs.so, libxprs.dylib, xprs.dll). For applications using the C++
interface it is sufficient to link against the Optimizer library.
- Python
- New data type xpress.ndarray is a subclass of numpy.ndarray, which
overrides the ==, <= and >= operators to produce an array of constraint
objects instead of Booleans.
- New function xpress.array, which has the same signature as numpy.array()
but returns instances of xpress.ndarray.
- All functions which return NumPy arrays, such as xpress.Dot() and
problem.addVariables() now return instances of xpress.ndarray.
- The xpress.npvar, xpress.npexpr and xpress.npconstraint custom NumPy
dtypes are deprecated. Use xpress.ndarray instead.
- New Pandas data type 'xpressobj', which improves the behaviour of Pandas
series containing variable or expression objects, and overrides the ==, <=
and >= operators to produce a series of constraint objects instead of
Booleans.
- Functions xpress.eq, xpress.leq and xpress.geq now accept arrays of
expressions and return an array of constraints in this case.
- problem.addConstraint() now accepts True/False values. True values are
treated as feasible constraints of the form 0 == 0, and False values are
treated as infeasible constraints of the form 0 == 1. This ensures that
statements like problem.addConstraint(a == b), where a and b are numeric
values, give the expected behavior. Adding True/False constraints produces
a warning: it is recommended to identify potential infeasibilities while
building the model instead.
- New implementation of Solver API, which aims at consistency with other
Xpress APIs.
- Using problem.getIndex() to find the index of a variable/constraint/SOS
object is deprecated: Use the var.index properties, etc., instead.
- problem.restore() now recreates all variable/constraint/SOS objects to
match the dimensions of the restored problem, except for unlinked problems,
which preserve the legacy behaviour of leaving the existing objects unchanged.
- xpress.manual() is deprecated and now returns None. Refer to the online
documentation at
https://www.fico.com/fico-xpress-optimization/docs/latest/solver/optimizer/python/HTML/ instead.
- Model properties on variable, constraint, and SOS objects, such as var.lb,
are no longer accessible from callbacks or while the problem is presolved.
Properties of the presolved problem can be queried using functions such as
problem.getLB() instead.
- R
- Several subroutine arguments have become optional and moved to the end of
the signature. The following subroutines are affected: loadmiqp, loaddirs,
getpwlcons, getgencons, addrows, strongbranch, estimaterowdualranges,
loadmiqcqp, strongbranchcb, delcuts, delcpcuts, calcsolinfo, nlpgetformula,
slpchgrowstatus, bo_addcuts.
Xpress Kalis 13.4.2
Xpress Mosel 6.10.2
Compiler Library
- XPRMexecmod no longer replaces an already loaded model if it is called several times with the same model source file.
makeutil 1.0.0
- This new package defines a set of routines to ease the implementation of build
programs (make.mos).
mmsystem 2.18.0
- 'sysinfo' now also reports the endianness of the CPU running the instance (tag SYS_ENDIAN).
Licensing 3.5.0
- Added support for web-static licenses
- New standalone command-line tool 'xplicsync' to manage online, offline and air-gapped static licenses
Xpress Workbench 3.17
- Support for native Workbench Docker images on macOS with Apple Silicon.
- DMP: New components will use the new volume storage class for workspace files on DMP 3.36 onwards.
Fixed in Release 9.8
Xpress Optimizer 46.01.01
- Fixed treatment of implied integrality in preroot parallel heuristics.
- Fixed an issue in postsolve of the basic solution of the initial LP
relaxation basis for problems with multiple independent components.
- Fixed several issues related to the mapping of bases when solving the dual
of an LP.
- Fixed a problem in which a failed function call in a callback could
unexpectedly stop the solution process.
- Consider delayed rows during preroot parallel heuristics.
- Improved performance of lifting procedures in probing for some corner cases
- Fixed an issue with solution handling in preroot parallel heuristics.
- Fixed incorrect keyword escaping when exporting LP format models.
- Fixed parser ambiguities in LP format.
- Improved error handling in LP/MPS readers for malformed input.
- Fixed an issue with disconnected component solves for MIPs that could
result in delayed rows being violated.
- Fixed an error condition when loading an almost empty problem.
- Fixed an issue with mixed integer Gomory cuts for problems with semi-
continuous variables, which could result in invalid cuts being created.
- Fixed an issue in the quadratic primal simplex algorithm which could result
in incorrect solutions.
- Fixed an issue with general constraints where the same column appears
multiple times as an input.
- Fixed an issue with user solutions for second-order-cone-convertible
quadratics.
- Fixed an issue in the Lifted clique cover cuts separator, which could
result in a crash in some rare cases.
- Fixed an issue in the Strong Chvatal-Gomory cuts separator, which in rare
cases could result in the separation of non-valid cuttig planes on some
numerically challenging models.
- All fixes from Xpress 9.7.0 (Optimizer 45.01.02).
Xpress Nonlinear 46.01.01
- In cases where the relative violation is smaller than the absolute violation
during validation, the absolute violation will still be updated.
- Fixed an issue with querying solutions when nonlinear presolve is off and
the original problem did not have an equalscolumn.
- Fixed an issue with the transformation of non-convex quadratic objectives.
- Time limits are now handled correctly during convexity checks when solving
from the Optimizer console.
- Fixed a potential crash with the reformulation of convex quadratic formulas
involving square roots.
- All fixes from Xpress 9.7.0 (Optimizer 45.01.02).
Xpress Global 46.01.01
Xpress Interfaces 46.01.01 (Python, R, Matlab, .NET, Java, C++)
- Python
- Removed internal controls and attributes that should not have been exposed in the
Python interface.
- Added missing class attributes xpress.linterm, xpress.quadterm and xpress.nonlin.
- Fixed an issue with xpress.is_equal where comparing a NumPy array with a scalar object
would give a scalar Boolean result instead of an array of Booleans.
- Fixed a problem where problem.addVariable did not fully revert the new variables if
an error occurred while adding them to the problem.
- Fixed a problem where problem.addSOS did not set the names of the sets.
- Fixed a memory corruption issue in problem.addVariables.
- When restoring into an empty or linked problem, problem.restore() now recreates all
variable/constraint/sos objects to match the dimensions of the restored problem.
For unlinked problems, the legacy behaviour of keeping the existing model objects is
preserved.
- Fixed a crash when calling extractLinear() on an empty expression.
- problem.getnamelist() now supports all object types.
- Model properties on variable, constraint and sos objects, such as var.lb, are no longer
accessible from callbacks or while the problem is presolved. Properties of the presolved
problem can be queried using functions such as problem.getLB() instead.
- Fixed a crash when accessing Xpress NonLinear controls and attributes from callbacks.
- C++
- Minor fixes for compatibility with the Visual Studio 2022 C++ compiler.
- All fixes from Xpress 9.7.0 (Optimizer 45.01.02).
Xpress Mosel 6.10.2
Compiler Library
- An issue has been fixed in the compilation of index references when a loop enumerates elements of a list of a non-basic type.
mmsystem 2.18.0
- An issue has been fixed in 'splittext' when it is used with a maximum number of items.
- On Windows, 'setftime' now preserves the fractional part of the time.
mmetc 2.6.2
- 'diskdata' used with 'dataframe' now raises an IO error if duplicate columns are detected.
Xpress Workbench 3.17
- Xpress Insight Python: version-aware model schema generation prevents API version mismatch
errors between Workbench and the Insight installation.
|