Ticket #14566: trac_14566.patch

File trac_14566.patch, 9.1 KB (added by ncohen, 7 years ago)
  • sage/numerical/backends/gurobi_backend.pxd

    # HG changeset patch
    # User Nathann Cohen <nathann.cohen@gmail.com>
    # Date 1368279132 -7200
    # Node ID d88b467db1b0b957c6adc1e8df8939976ff33dbe
    # Parent  a4d7806a322637c6f0a988c17562b4426323d760
    Optional parameters for Gubori
    
    diff --git a/sage/numerical/backends/gurobi_backend.pxd b/sage/numerical/backends/gurobi_backend.pxd
    a b  
    6060
    6161     int GRBwrite (GRBmodel*model, char* filename)
    6262
     63     int GRBgetdblparam(GRBenv *env, char * attrname, double * value)
     64     int GRBgetintparam(GRBenv *env, char * attrname, int * value)
     65     int GRBgetstrparam(GRBenv *env, char * attrname, char * value)
     66     int GRBsetdblparam(GRBenv *env, char * attrname, double value)
    6367     int GRBsetintparam(GRBenv *env, char * attrname, int value)
     68     int GRBsetstrparam(GRBenv *env, char * attrname, char * value)
    6469
    6570     GRBenv * GRBgetenv (GRBmodel * model )
    6671
    67 
    6872     int GRBgetconstrs (GRBmodel * model, int * numnzP, int * cbeg, int * cind, double * cval, int start, int len )
    6973
    7074     int GRB_BINARY
  • sage/numerical/backends/gurobi_backend.pyx

    diff --git a/sage/numerical/backends/gurobi_backend.pyx b/sage/numerical/backends/gurobi_backend.pyx
    a b  
    511511            sage: p.solve()                                    # optional - Gurobi
    512512            10.0
    513513            sage: p.get_values([x,y])                          # optional - Gurobi
    514             [-0.0, 3.0]
     514            [0.0, 3.0]
    515515        """
    516516        cdef int ind[1]
    517517        ind[0] = i
     
    11251125        """
    11261126        check(self.env, GRBwrite(self.model[0], filename))
    11271127
     1128    cpdef solver_parameter(self, name, value = None):
     1129        """
     1130        Returns or defines a solver parameter.
     1131
     1132        For a list of parameters and associated values, please refer to Gurobi's
     1133        reference manual
     1134        `<http://www.gurobi.com/documentation/5.5/reference-manual/node798>`_.
     1135
     1136        INPUT:
     1137
     1138        - ``name`` (string) -- the parameter
     1139
     1140        - ``value`` -- the parameter's value if it is to be defined,
     1141          or ``None`` (default) to obtain its current value.
     1142
     1143        EXAMPLES::
     1144
     1145            sage: p = MixedIntegerLinearProgram(solver="Gurobi")      # optional - Gurobi
     1146
     1147        An integer parameter::
     1148
     1149            sage: p.solver_parameter("VarBranch")                     # optional - Gurobi
     1150            -1
     1151            sage: p.solver_parameter("VarBranch", 1)                  # optional - Gurobi
     1152            sage: p.solver_parameter("VarBranch")                     # optional - Gurobi
     1153            1
     1154
     1155        A double parameter::
     1156
     1157            sage: p.solver_parameter("TimeLimit")                     # optional - Gurobi
     1158            1e+100
     1159            sage: p.solver_parameter("TimeLimit", 10)                 # optional - Gurobi
     1160            sage: p.solver_parameter("TimeLimit")                     # optional - Gurobi
     1161            10.0
     1162
     1163        A string parameter::
     1164
     1165            sage: p.solver_parameter("LogFile")                # optional - Gurobi
     1166            ''
     1167            sage: p.solver_parameter("LogFile", "/dev/null")   # optional - Gurobi
     1168            sage: p.solver_parameter("LogFile")                # optional - Gurobi
     1169            '/dev/null'
     1170
     1171        """
     1172        cdef int    tmp_int[1]
     1173        cdef double tmp_dbl[1]
     1174        cdef char   tmp_str[25500]
     1175        cdef char * c_name
     1176        c_name = tmp_str
     1177
     1178        if name == "timelimit":
     1179            name = "TimeLimit"
     1180
     1181        try:
     1182            t = parameters_type[name]
     1183        except KeyError:
     1184            raise ValueError("This parameter is not available. "+
     1185                             "Enabling it may not be so hard, though.")
     1186
     1187        if t == "int":
     1188            if value is None:
     1189                check(self.env, GRBgetintparam(self.env, name, tmp_int))
     1190                return tmp_int[0]
     1191            else:
     1192                check(self.env, GRBsetintparam(self.env, name, value))
     1193        elif t == "double":
     1194            if value is None:
     1195                check(self.env, GRBgetdblparam(self.env, name, tmp_dbl))
     1196                return tmp_dbl[0]
     1197            else:
     1198                check(self.env, GRBsetdblparam(self.env, name, value))
     1199        elif t == "string":
     1200            if value is None:
     1201                check(self.env, GRBgetstrparam(self.env, name, c_name))
     1202                return str(c_name)
     1203            else:
     1204                check(self.env, GRBsetstrparam(self.env, name, value))
     1205        else:
     1206            raise RuntimeError("This should not happen.")
     1207
    11281208    def __dealloc__(self):
    11291209        """
    11301210        Destructor
     
    11321212        if self.model != NULL:
    11331213            GRBfreemodel(self.model[0])
    11341214
    1135 
    11361215cdef dict errors = {
    11371216    10001 : "GRB_ERROR_OUT_OF_MEMORY",
    11381217    10002 : "GRB_ERROR_NULL_ARGUMENT",
     
    11661245    GRB_SOLUTION_LIMIT: "The solution limit has been reached",
    11671246}
    11681247
     1248cdef dict parameters_type = {
     1249    "AggFill"           : "int",
     1250    "Aggregate"         : "int",
     1251    "BarConvTol"        : "double",
     1252    "BarCorrectors"     : "int",
     1253    "BarHomogeneous"    : "int",
     1254    "BarOrder"          : "int",
     1255    "BarQCPConvTol"     : "double",
     1256    "BarIterLimit"      : "int",
     1257    "BranchDir"         : "int",
     1258    "CliqueCuts"        : "int",
     1259    "CoverCuts"         : "int",
     1260    "Crossover"         : "int",
     1261    "CrossoverBasis"    : "int",
     1262    "Cutoff"            : "double",
     1263    "CutAggPasses"      : "int",
     1264    "CutPasses"         : "int",
     1265    "Cuts"              : "int",
     1266    "DisplayInterval"   : "int",
     1267    "DualReductions"    : "int",
     1268    "FeasibilityTol"    : "double",
     1269    "FeasRelaxBigM"     : "double",
     1270    "FlowCoverCuts"     : "int",
     1271    "FlowPathCuts"      : "int",
     1272    "GomoryPasses"      : "int",
     1273    "GUBCoverCuts"      : "int",
     1274    "Heuristics"        : "double",
     1275    "IISMethod"         : "int",
     1276    "ImpliedCuts"       : "int",
     1277    "ImproveStartGap"   : "double",
     1278    "ImproveStartNodes" : "double",
     1279    "ImproveStartTime"  : "double",
     1280    "InfUnbdInfo"       : "int",
     1281    "InputFile"         : "string",
     1282    "IntFeasTol"        : "double",
     1283    "IterationLimit"    : "double",
     1284    "LogFile"           : "string",
     1285    "LogToConsole"      : "int",
     1286    "MarkowitzTol"      : "double",
     1287    "Method"            : "int",
     1288    "MinRelNodes"       : "int",
     1289    "MIPFocus"          : "int",
     1290    "MIPGap"            : "double",
     1291    "MIPGapAbs"         : "double",
     1292    "MIPSepCuts"        : "int",
     1293    "MIQCPMethod"       : "int",
     1294    "MIRCuts"           : "int",
     1295    "ModKCuts"          : "int",
     1296    "NetworkCuts"       : "int",
     1297    "NodefileDir"       : "string",
     1298    "NodefileStart"     : "double",
     1299    "NodeLimit"         : "double",
     1300    "NodeMethod"        : "int",
     1301    "NormAdjust"        : "int",
     1302    "ObjScale"          : "double",
     1303    "OptimalityTol"     : "double",
     1304    "OutputFlag"        : "int",
     1305    "PerturbValue"      : "double",
     1306    "PreCrush"          : "int",
     1307    "PreDepRow"         : "int",
     1308    "PreDual"           : "int",
     1309    "PrePasses"         : "int",
     1310    "PreQLinearize"     : "int",
     1311    "Presolve"          : "int",
     1312    "PreSparsify"       : "int",
     1313    "PSDTol"            : "double",
     1314    "PumpPasses"        : "int",
     1315    "QCPDual"           : "int",
     1316    "Quad"              : "int",
     1317    "ResultFile"        : "string",
     1318    "RINS"              : "int",
     1319    "ScaleFlag"         : "int",
     1320    "Seed"              : "int",
     1321    "Sifting"           : "int",
     1322    "SiftMethod"        : "int",
     1323    "SimplexPricing"    : "int",
     1324    "SolutionLimit"     : "int",
     1325    "SolutionNumber"    : "int",
     1326    "SubMIPCuts"        : "int",
     1327    "SubMIPNodes"       : "int",
     1328    "Symmetry"          : "int",
     1329    "Threads"           : "int",
     1330    "TimeLimit"         : "double",
     1331    "VarBranch"         : "int",
     1332    "ZeroHalfCuts"      : "int",
     1333    "ZeroObjNodes"      : "int"
     1334    }
     1335
    11691336cdef check(GRBenv * env, int error):
    11701337    if error:
    11711338        raise MIPSolverException("Gurobi: "+str(GRBgeterrormsg(env))+" ("+errors[error]+")")
    1172 
  • sage/numerical/mip.pyx

    diff --git a/sage/numerical/mip.pyx b/sage/numerical/mip.pyx
    a b  
    19321932        The solver parameters are by essence solver-specific, which
    19331933        means their meaning heavily depends on the solver used.
    19341934
    1935         (If you do not know which solver you are using, then you are using GLPK)
     1935        (If you do not know which solver you are using, then you use
     1936        use GLPK).
    19361937
    19371938        Aliases:
    19381939
     
    19431944            sage: p.solver_parameter("timelimit", 60)
    19441945
    19451946        Sets the solver to stop its computations after 60 seconds, and
    1946         works both with GLPK and CPLEX.
     1947        works with GLPK, CPLEX and Gurobi.
    19471948
    19481949            - ``"timelimit"`` -- defines the maximum time spent on a
    19491950              computation. Measured in seconds.
     
    19671968
    19681969              works as intended.
    19691970
     1971            - Gurobi's parameters should all be available through this
     1972              method. Their list is available on Gurobi's website
     1973              `<http://www.gurobi.com/documentation/5.5/reference-manual/node798>`_.
     1974
    19701975        INPUT:
    19711976
    19721977        - ``name`` (string) -- the parameter