# Construct a problem from scratch with variables of various
# types. Adds indicator constraints and shows how to retrieve
# such data once it has been added to the problem using the
# API functions.
#
# (C) Fair Isaac Corp., 1983-2025
import xpress as xp
m = xp.problem()
m.controls.miprelstop = 0
# All variables used in this example
v1 = m.addVariable(lb=0, ub=10, vartype=xp.continuous)
v2 = m.addVariable(lb=1, ub=7, vartype=xp.continuous)
v3 = m.addVariable(lb=5, ub=10, threshold=7, vartype=xp.semicontinuous)
vb = m.addVariable(vartype=xp.binary)
# Indicator constraints consist of a tuple with a condition on a
# binary variable and a constraint
ind1 = (vb == 0, v1 + v2 >= 6)
ind2 = (vb == 1, v1 + v3 >= 4)
# Adds the first indicator constraint
m.addIndicator(ind1)
# Adds another indicator constraint and the second one defined above
m.addIndicator((vb == 1, v2 + v3 >= 5), ind2)
ind_inds = []
ind_flags = []
# Returns the indicator constraint condition (indicator variable and complement flag) associated to the rows in a given range
m.getindicators(ind_inds, ind_flags, 0, 2)
print("Indicator variables and flags: ", ind_inds, ind_flags)
m.setObjective(xp.Sum(v1,v2,v3))
m.optimize()
print("v1: ", m.getSolution(v1),
", v2: ", m.getSolution(v2),
"; sol vector: ", m.getSolution(),
"; obj: ", m.attributes.objval,
sep="") # default separator between strings is " " |