Xpress Optimization
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
  • Support for Xpress 9.8.
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.