Xpress

Initial setup

from pyoptinterface import xpress
model = xpress.Model()

You need to follow the instructions in Getting Started to set up the optimizer correctly.

If you want to manage the license of Xpress manually, you can create a xpress.Env object and pass it to the constructor of the xpress.Model object, otherwise we will initialize an implicit global xpress.Env object automatically and use it.

env = xpress.Env()
model = xpress.Model(env)

For users who want to release the license immediately after the optimization, you can call the close method of all models created and the xpress.Env object.

env = xpress.Env()
model = xpress.Model(env)
# do something with the model
model.close()
env.close()

The capability of xpress.Model

Supported constraints

Supported model attribute

Attribute

Get

Set

Name

✅

✅

ObjectiveSense

✅

✅

DualStatus

✅

❌

PrimalStatus

✅

❌

RawStatusString

✅

❌

TerminationStatus

✅

❌

BarrierIterations

✅

❌

DualObjectiveValue

✅

❌

NodeCount

✅

❌

NumberOfThreads

✅

✅

ObjectiveBound

✅

❌

ObjectiveValue

✅

❌

RelativeGap

✅

✅

Silent

✅

✅

SimplexIterations

✅

❌

SolverName

✅

❌

SolverVersion

✅

❌

SolveTimeSec

✅

❌

TimeLimitSec

✅

✅

Supported variable attribute

Attribute

Get

Set

Value

✅

❌

LowerBound

✅

✅

UpperBound

✅

✅

Domain

✅

✅

PrimalStart

✅

✅

Name

✅

✅

IISLowerBound

✅

❌

IISUpperBound

✅

❌

ReducedCost

✅

❌

Supported constraint attribute

Attribute

Get

Set

Name

✅

✅

Primal

✅

❌

Dual

✅

❌

IIS

✅

❌

Solver-specific operations

Controls and Attributes

Xpress uses different terminology than PyOptInterface:

  • Controls govern the solution procedure and output format (similar to PyOptInterface parameters)

  • Attributes are read-only properties of the problem and solution

PyOptInterface maps these as follows:

  • PyOptInterface parameters correspond to Xpress controls

  • PyOptInterface attributes may access Xpress controls, attributes, or variable/constraint properties through dedicated methods

Controls (Parameters)

For solver-specific controls, we provide get_raw_control and set_raw_control methods.

model = xpress.Model()
# Get the value of a control
value = model.get_raw_control("XPRS_TIMELIMIT")
# Set the value of a control
model.set_raw_control("XPRS_TIMELIMIT", 10.0)

Attributes

For problem attributes, we provide get_raw_attribute method.

# Get number of columns in the problem
cols = model.get_raw_attribute("XPRS_COLS")

We also provide xpress.XPRS to contain common constants from the Xpress C API.

# Using constants
value = model.get_raw_control_dbl_by_id(xpress.XPRS.TIMELIMIT)

Variable and Constraint Properties

Common variable and constraint properties are provided through PyOptInterface dedicated methods:

Variable methods:

  • Bounds: set_variable_lowerbound, get_variable_lowerbound, set_variable_upperbound, get_variable_upperbound, set_variable_bounds

  • Objective: set_objective_coefficient, get_objective_coefficient

  • Type and name: set_variable_type, get_variable_type, set_variable_name, get_variable_name

  • Solution values: get_variable_value, get_variable_rc, get_variable_primal_ray

  • Basis status: is_variable_basic, is_variable_nonbasic_lb, is_variable_nonbasic_ub, is_variable_superbasic

  • IIS information: is_variable_lowerbound_IIS, is_variable_upperbound_IIS

Constraint methods:

  • Definition: set_constraint_sense, get_constraint_sense, set_constraint_rhs, get_constraint_rhs, set_constraint_name, get_constraint_name

  • Coefficients: set_normalized_coefficient, get_normalized_coefficient, set_normalized_rhs, get_normalized_rhs

  • Solution values: get_constraint_dual, get_constraint_slack, get_constraint_dual_ray

  • Basis status: is_constraint_basic, is_constraint_nonbasic_lb, is_constraint_nonbasic_ub, is_constraint_superbasic

  • IIS information: is_constraint_in_IIS

Usage examples:

Variable properties:

# Bounds
model.set_variable_lowerbound(variable, 0.0)
lb = model.get_variable_lowerbound(variable)
model.set_variable_upperbound(variable, 10.0)
ub = model.get_variable_upperbound(variable)

# Objective coefficient
model.set_objective_coefficient(variable, 2.0)
coef = model.get_objective_coefficient(variable)

# Type and name
model.set_variable_type(variable, VariableDomain.Integer)
vtype = model.get_variable_type(variable)
model.set_variable_name(variable, "x")
name = model.get_variable_name(variable)

# Solution values
value = model.get_variable_value(variable)
rc = model.get_variable_rc(variable)
ray = model.get_variable_primal_ray(variable)

# Basis status
if model.is_variable_basic(variable):
    ...

Constraint properties:

# Sense and RHS
model.set_constraint_sense(constraint, ConstraintSense.LessEqual)
sense = model.get_constraint_sense(constraint)
model.set_constraint_rhs(constraint, 5.0)
rhs = model.get_constraint_rhs(constraint)

# Name
model.set_constraint_name(constraint, "c1")
name = model.get_constraint_name(constraint)

# Solution values
dual = model.get_constraint_dual(constraint)
slack = model.get_constraint_slack(constraint)
ray = model.get_constraint_dual_ray(constraint)

# Basis status
if model.is_constraint_basic(constraint):
    ...