@@ -1600,21 +1600,22 @@ def solve_problem_from_file(
16001600 except Exception as err :
16011601 logger .info ("Unable to save solution file. Raised error: %s" , err )
16021602
1603- condition = m .getProbStatusString ()
1603+ condition : str = m .getAttrib ( "solstatus" ). name . lower ()
16041604 termination_condition = CONDITION_MAP .get (condition , condition )
16051605 status = Status .from_termination_condition (termination_condition )
16061606 status .legacy_status = condition
16071607
1608- def get_solver_solution () -> Solution :
1609- objective = m .getObjVal ()
1608+ def get_solver_solution_new () -> Solution :
1609+ # For xpress >= 9.6
1610+ objective : float = m .getAttrib ("objval" )
16101611
1611- var = m .getnamelist (xpress_Namespaces .COLUMN , 0 , m .attributes .cols - 1 )
1612+ var = m .getnamelist (xpress . Namespaces .COLUMN , 0 , m .attributes .cols - 1 )
16121613 sol = pd .Series (m .getSolution (), index = var , dtype = float )
16131614
16141615 try :
1615- _dual = m .getDual ()
1616+ _dual = m .getDuals ()
16161617 constraints = m .getnamelist (
1617- xpress_Namespaces .ROW , 0 , m .attributes .rows - 1
1618+ xpress . Namespaces .ROW , 0 , m .attributes .rows - 1
16181619 )
16191620 dual = pd .Series (_dual , index = constraints , dtype = float )
16201621 except (xpress .SolverError , xpress .ModelError , SystemError ):
@@ -1623,6 +1624,29 @@ def get_solver_solution() -> Solution:
16231624
16241625 return Solution (sol , dual , objective )
16251626
1627+ def get_solver_solution_legacy () -> Solution :
1628+ # For xpress < 9.6
1629+ objective : float = m .getAttrib ("objval" )
1630+
1631+ var = [str (v ) for v in m .getVariable ()]
1632+
1633+ sol = pd .Series (m .getSolution (var ), index = var , dtype = float )
1634+
1635+ try :
1636+ dual_ = [str (d ) for d in m .getConstraint ()]
1637+ dual = pd .Series (m .getDuals (dual_ ), index = dual_ , dtype = float )
1638+ except (xpress .SolverError , xpress .ModelError , SystemError ):
1639+ logger .warning ("Dual values of MILP couldn't be parsed" )
1640+ dual = pd .Series (dtype = float )
1641+
1642+ return Solution (sol , dual , objective )
1643+
1644+ def get_solver_solution () -> Solution :
1645+ if parse_version (xpress .__version__ ) >= parse_version ("9.6" ):
1646+ return get_solver_solution_new ()
1647+ else :
1648+ return get_solver_solution_legacy ()
1649+
16261650 solution = self .safe_get_solution (status = status , func = get_solver_solution )
16271651 solution = maybe_adjust_objective_sign (solution , io_api , sense )
16281652
0 commit comments