# Example of the barstart functionality.
#
# (C) 2020-2025 Fair Isaac Corporation

import xpress as xp

# Read and solve the first problem.

ifdisk = True

p = xp.problem()

p.readProb('Data/d2q06c.mps.gz')

p.controls.baralg = 2
p.controls.barstart = 1024
p.controls.crossover = 0

p.lpOptimize('b')

print ('First problem solved with status:', p.attributes.solstatus.name)

if ifdisk:
    p.writeSlxSol('mysol.slx', 'd')
else:
    x = p.getSolution()
    s = p.getSlacks()
    d = p.getDuals()
    r = p.getRedCosts()

# Read a slightly modified problem and solve it using the solution of
# p as a warm start.

p2 = xp.problem()

p2.readProb('Data/d2q06c_mod.mps.gz')

p2.controls.baralg = 2

# This instructs barrier to use the available solution as warm-start.
p2.controls.barstart = -1

p2.controls.crossover = 0

if ifdisk:
    p2.readSlxSol('mysol.slx')
else:
    p2.loadLPSol(x, s, d, r)

# Assign an emphasis to the warm-start (0.85 is the default). With a
# higher value, the number of barrier iteration is even smaller.
p2.controls.barstartweight = 0.9

p2.lpOptimize('b')

print ('Warm-started problem solved with status:', p2.attributes.solstatus.name)
