# Tune a problem from MIPLIB using the built-in Xpress Tuner.
#
# Creates a file 'default-MIP.xtm' with the tuner options that are tested
# by default by the tuner. The file has the following format: a
# section with controls that are applied to each tuner run
# ("FIXED-CONTROLS") and a set of controls that are tested
# independently by the tuner ("TUNABLE-CONTROLS"). Tunable controls
# have each one or more value that the tuner will test, first
# independently and then in combination with others.
#
# (C) 1983-2025 Fair Isaac Corporation

import xpress as xp

# Creates a problem and read a MIPLIB2010 instance.
p = xp.problem()
p.readProb('Data/miplib-rndinst.mps.gz')

# FIXED-CONTROLS
#   OUTPUTLOG            = 1
#   XSLP_POSTSOLVE       = 1
# TUNABLE-CONTROLS
#   BRANCHDISJ           = 0
#   COVERCUTS            = 0, 2, 20
#   CUTFACTOR            = 0.5, 1, 5
#   CUTFREQ              = 2
#
# ... and others. The file is written AFTER reading in the problem in order
# for the optimizer to recognize that it is a MIP.

p.tunerWriteMethod('default-MIP.xtm')

# Set the total amount of time the tuner can spend in tuning
# (tunermaxtime) and the time limit for each run.
p.controls.tunermaxtime = 100
p.controls.timelimit = 10

# Tune the optimizer on the problem.
p.tune('g')

# Now try tuning on a different tuner method: the file mymethod.xtm
# contains slightly different combination of controls and values, and
# the tuner will test different combinations this way. Note that the
# output will show that the Optimizer finds old tuner runs and will
# use the relative information.
p.tunerReadMethod('Data/mymethod.xtm')
p.tune()

# Finally, before solving the problem, increase the time limit.
p.controls.timelimit = 1000

p.optimize()
