Ticket #12736: ticket_12736_add_glpk_solver_options.patch

File ticket_12736_add_glpk_solver_options.patch, 20.5 KB (added by r.gaia.cs, 9 years ago)
  • sage/numerical/backends/glpk_backend.pxd

    # HG changeset patch
    # User Raniere Gaia C. da Silva <r.gaia.cs@gmail.com>
    # Date 1332701573 10800
    # Node ID 0787532931528b2e81e7d9f988057e7efb366a74
    # Parent  9ab205c1dff3de6c2b45d552b4efb9fa811fb03a
    Ticket #12736: Add almost all options.
    
    diff --git a/sage/numerical/backends/glpk_backend.pxd b/sage/numerical/backends/glpk_backend.pxd
    a b  
    2020     ctypedef struct c_glp_prob "glp_prob":
    2121         pass
    2222     ctypedef struct c_glp_iocp "glp_iocp":
     23         int msg_lev
     24         int br_tech
     25         int bt_tech
     26         int pp_tech
     27         int fp_heur
     28         int gmi_cuts
     29         int mir_cuts
     30         int cov_cuts
     31         int clq_cuts
     32         double tol_int
     33         double tol_obj
     34         double mip_gap
     35         int tm_lim
     36         int out_frq
     37         int out_dly
    2338         int presolve
    24          int msg_lev
    25          int gmi_cuts
    26          int fp_heur
    27          int mir_cuts
    28          int tm_lim
     39         int binarize
    2940     ctypedef struct c_glp_smcp "glp_smcp":
    3041         int msg_lev
    3142         int meth
     
    108119
    109120
    110121     int GLP_ON
     122     int GLP_OFF
    111123     int GLP_MAX
    112124     int GLP_MIN
    113125     int GLP_UP
     
    118130     int GLP_CV
    119131     int GLP_IV
    120132     int GLP_BV
     133
    121134     int GLP_MSG_OFF
    122135     int GLP_MSG_ERR
    123136     int GLP_MSG_ON
    124137     int GLP_MSG_ALL
     138
    125139     int GLP_MPS_DECK
    126140     int GLP_MPS_FILE
    127141
     
    139153     int GLP_RT_STD
    140154     int GLP_RT_HAR
    141155
     156     int GLP_BR_FFV
     157     int GLP_BR_LFV
     158     int GLP_BR_MFV
     159     int GLP_BR_DTH
     160     int GLP_BR_PCH
     161     int GLP_BR_DFS
     162     int GLP_BT_DFS
     163     int GLP_BT_BFS
     164     int GLP_BT_BLB
     165     int GLP_BT_BPH
     166     int GLP_PP_NONE
     167     int GLP_PP_ROOT
     168     int GLP_PP_ALL
     169
    142170cdef class GLPKBackend(GenericBackend):
    143171    cdef c_glp_prob * lp
    144172    cdef c_glp_iocp * iocp
  • sage/numerical/backends/glpk_backend.pyx

    diff --git a/sage/numerical/backends/glpk_backend.pyx b/sage/numerical/backends/glpk_backend.pyx
    a b  
    55
    66- Nathann Cohen (2010-10): initial implementation
    77- John Perry (2012-01): glp_simplex preprocessing
     8- Raniere Silva(2012-03): improved solver_parameter
    89"""
    910
    1011##############################################################################
    1112#       Copyright (C) 2010 Nathann Cohen <nathann.cohen@gmail.com>
     13#       Copyright (C) 2012 John Perry <john.perry@usm.edu>
     14#       Copyright (C) 2012 Raniere Silva <r.gaia.cs@gmail.com>
    1215#  Distributed under the terms of the GNU General Public License (GPL)
    1316#  The full text of the GPL is available at:
    1417#                  http://www.gnu.org/licenses/
     
    11211124        return p
    11221125
    11231126
    1124     cpdef solver_parameter(self, name, value = None):
     1127    cpdef solver_parameter(self, name, value=None):
    11251128        """
    11261129        Return or define a solver parameter
    11271130
     
    11341137
    11351138        .. NOTE::
    11361139
    1137            The list of available parameters is available at
    1138            :meth:`sage.numerical.mip.MixedIntegerlinearProgram.solver_parameter`
     1140           Only the GLPK control parameters for user-defined callback routine aren't avaliable.
     1141           
     1142           For parameters avaliable for the structure glp_smcp e glp_iocp the name start with smcp_ and iocp_, respctively, for disambiguation.
     1143
     1144           Below are a full list of the parameters avaliable.
     1145
     1146           - Parameters for the structure glp_smcp:
     1147
     1148               - "smcp_msg_lev" (default: "GLP_ MSG_ALL") -- Message level for terminal output:
     1149           
     1150                    - "GLP_MSG_OFF" -- no output;
     1151
     1152                    - "GLP_MSG_ERR" -- error and warning messages only;
     1153
     1154                    - "GLP_MSG_ON" -- normal output;
     1155                   
     1156                    - "GLP_MSG_ALL" -- full output (including informational messages).
     1157
     1158               - "meth" (default: "GLP_PRIMAL") -- Simplex method option:
     1159
     1160                    - "GLP_PRIMAL" -- use two-phase primal simplex;
     1161                   
     1162                    - "GLP_DUAL" -- use two-phase dual simplex;
     1163                   
     1164                    - "GLP_DUALP" -- —use two-phase dual simplex, and if it fails, switch to the primal simplex.
     1165
     1166               - "pricing" (default: "GLP_PT_PSE") -- Pricing technique:
     1167               
     1168                    - "GLP_PT_STD" -- standard (textbook);
     1169                   
     1170                    - "GLP_PT_PSE" -- projected steepest edge.
     1171
     1172               - "r_test" (default: "GLP_RT_HAR") -- Ratio test technique:
     1173               
     1174                    - "GLP_RT_STD" -- standard (textbook);
     1175                   
     1176                    - "GLP_RT_HAR" -- Harris’ two-pass ratio test.
     1177
     1178               - "tol_bnd" (default: 1e-7) -- Tolerance used to check if the basic solution is primal feasible. (Do not change this parameter without detailed understanding its purpose.)
     1179
     1180               - "tol_dj" (default: 1e-7) -- Tolerance used to check if the basic solution is dual feasible. (Do not change this parameter without detailed understanding its purpose.)
     1181
     1182               - "tol_piv" (default: 1e-10) -- Tolerance used to choose eligble pivotal elements of the simplex table. (Do not change this parameter without detailed understanding its purpose.)
     1183
     1184               - "obj_ll" (default: -DBL MAX) -- Lower limit of the objective function. If the objective function reaches this limit and continues decreasing, the solver terminates the search. (Used in the dual simplex only.)
     1185
     1186               - "obj_ul" (default: +DBL MAX) -- Upper limit of the objective function. If the objective function reaches this limit and continues increasing, the solver terminates the search. (Used in the dual simplex only.)
     1187
     1188               - "it_lim" (default: INT MAX) -- Simplex iteration limit.
     1189               
     1190               - "smcp_tm_lim" (default: INT MAX) -- Searching time limit, in milliseconds.
     1191
     1192               - "smcp_out_frq" (default: 500) -- Output frequency, in iterations. This parameter specifies how frequently the solver sends information about the solution process to the terminal.
     1193               
     1194               - "smcp_out_dly" (default: 0) -- Output delay, in milliseconds. This parameter specifies how long the solver should delay sending information about the solution process to the terminal.
     1195
     1196               - "smcp_presolve" (default: GLP OFF) -- LP presolver option:
     1197                   
     1198                    - "GLP_ON" or True -- enable using the LP presolver;
     1199
     1200                    - "GLP_OFF" or False -- disable using the LP presolver.
     1201
     1202           - Parameters for the structure glp_iocp:
     1203
     1204               - "iocp_msg_lev" (default: "GLP_MSG_ALL") -- Message level for terminal output:
     1205
     1206                    - "GLP_MSG_OFF" -- no output;
     1207
     1208                    - "GLP_MSG_ERR" -- error and warning messages only;
     1209
     1210                    - "GLP_MSG_ON" -- normal output;
     1211
     1212                    - "GLP_MSG_ALL" -- full output (including informational messages).
     1213
     1214               - "br_tech" (default: "GLP_BR_DTH") -- Branching technique option:
     1215               
     1216                    - "GLP_BR_FFV" -- first fractional variable;
     1217                   
     1218                    - "GLP_BR_LFV" -- last fractional variable;
     1219
     1220                    - "GLP_BR_MFV" -- most fractional variable;
     1221                   
     1222                    - "GLP_BR_DTH" -- heuristic by Driebeck and Tomlin;
     1223
     1224                    - "GLP_BR_PCH" -- hybrid pseudocost heuristic.
     1225                   
     1226               - "bt_tech" (default: "GLP_BT_BLB") -- Backtracking technique option:
     1227               
     1228                    - "GLP_BT_DFS" -- depth first search;
     1229                   
     1230                    - "GLP_BT_BFS" -- breadth first search;
     1231                   
     1232                    - "GLP_BT_BLB" -- best local bound;
     1233                   
     1234                    - "GLP_BT_BPH" -- best projection heuristic.
     1235               
     1236               - "pp_tech" (default: "GLP_PP_ALL") -- Preprocessing technique option:
     1237               
     1238                    - "GLP_PP_NONE" -- disable preprocessing;
     1239                   
     1240                    - "GLP_PP_ROOT" -- perform preprocessing only on the root level;
     1241                   
     1242                    - "GLP_PP_ALL" -- perform preprocessing on all levels.
     1243               
     1244               - "fp_heur" (default: "GLP_OFF") -- Feasibility pump heuristic option:
     1245               
     1246                    - "GLP_ON" or True -- enable applying the feasibility pump heuristic;
     1247                   
     1248                    - "GLP_OFF" or False -- disable applying the feasibility pump heuristic.
     1249
     1250               - "gmi_cuts" (default: "GLP_OFF") -- Gomory’s mixed integer cut option:
     1251               
     1252                    - "GLP_ON" or True -- enable generating Gomory’s cuts;
     1253                   
     1254                    - "GLP_OFF" or False -- disable generating Gomory’s cuts.
     1255               - "mir_cuts" (default: "GLP_OFF") -- Mixed integer rounding (MIR) cut option:
     1256               
     1257                    - "GLP_ON" or True -- enable generating MIR cuts;
     1258                   
     1259                    - "GLP_OFF" or False -- disable generating MIR cuts.
     1260               
     1261               - "cov_cuts" (default: "GLP_OFF") -- Mixed cover cut option:
     1262               
     1263                    - "GLP_ON" or True -- enable generating mixed cover cuts;
     1264                   
     1265                    - "GLP_OFF" or False -- disable generating mixed cover cuts.
     1266                   
     1267               - "clq_cuts" (default: "GLP_OFF") -- Clique cut option:
     1268               
     1269                    - "GLP_ON" or True -- enable generating clique cuts;
     1270                   
     1271                    - "GLP_OFF" or False -- —disable generating clique cuts.
     1272                   
     1273               - "tol_int" (default: 1e-5) -- Absolute tolerance used to check if optimal solution to the current LP relaxation is integer feasible. (Do not change this parameter without detailed understanding its purpose.)
     1274               - "tol_obj" (default: 1e-7) -- Relative tolerance used to check if the objective value in optimal solution to the current LP relaxation is not better than in the best known integer feasible solution. (Do not change this parameter without detailed understanding its purpose.)
     1275               
     1276               - "mip_gap" (default: 0.0) -- The relative mip gap tolerance. If the relative mip gap for currently known best integer feasible solution falls below this tolerance, the solver terminates the search. This allows obtainig suboptimal integer feasible solutions if solving the problem to optimality takes too long time.
     1277               
     1278               - "iocp_tm_lim" (default: "INT_MAX") -- Searching time limit, in milliseconds.
     1279               
     1280               - "iocp_out_frq" (default: 5000) -- Output frequency, in milliseconds. This parameter specifies how frequently the solver sends information about the solution process to the terminal.
     1281               
     1282               - "iocp_out_dly" (default: 10000) -- Output delay, in milliseconds. This parameter specifies how long the solver should delay sending information about solution of the current LP relaxation with the simplex method to the terminal.
     1283               
     1284               - "iocp_presolve" (default: "GLP_OFF") -- MIP presolver option:
     1285               
     1286                    - "GLP_ON" or True -- enable using the MIP presolver;
     1287                   
     1288                    - "GLP_OFF" or False -- disable using the MIP presolver.
     1289                   
     1290               - "binarize" (default: "GLP_OFF") -- Binarization option (used only if the presolver is enabled):
     1291               
     1292                    - "GLP_ON" or True -- replace general integer variables by binary ones;
     1293                   
     1294                    - "GLP_OFF" or False -- do not use binarization.
    11391295
    11401296        EXAMPLE::
    11411297
     
    11441300            sage: p.solver_parameter("timelimit", 60)             
    11451301            sage: p.solver_parameter("timelimit")                 
    11461302            60.0
     1303            sage: p = get_solver(solver = "GLPK")         
     1304            sage: p.solver_parameter("gmi_cuts")         
     1305            0
     1306            sage: p.solver_parameter("gmi_cuts", "GLP_ON")
     1307            sage: p.solver_parameter("gmi_cuts")         
     1308            1
     1309            sage: p.solver_parameter("gmi_cuts", False)       
     1310            sage: p.solver_parameter("gmi_cuts")         
     1311            0
    11471312        """
    1148         if name == "timelimit":
     1313        # parameters for the structure glp_smcp
     1314        if name == "smcp_msg_lev":
     1315            if value == None:
     1316                return self.smcp.msg_lev
     1317            elif name == "GLP_MSG_OFF":
     1318                self.smcp.msg_lev = GLP_MSG_OFF
     1319            elif value== "GLP_MSG_ERR":
     1320                self.smcp.msg_lev = GLP_MSG_ERR
     1321            elif name == "GLP_MSG_ON":
     1322                self.smcp.msg_lev = GLP_MSG_ON
     1323            elif name == "GLP_MSG_ALL":
     1324                    self.smcp.msg_lev = GLP_MSG_ALL
     1325
     1326        elif name == "meth":
     1327            if value == None:
     1328                return self.smcp.meth
     1329            elif value == "GLP_PRIMAL":
     1330                self.smcp.meth = GLP_PRIMAL
     1331            elif value == "GLP_DUAL":
     1332                self.smcp.meth = GLP_DUAL
     1333            elif value == "GLP_DUALP":
     1334                self.smcp.meth = GLP_DUALP
     1335
     1336        elif name == "pricing":
     1337            if value == None:
     1338                return self.smcp.pricing
     1339            elif value == "GLP_PT_STD":
     1340                self.smcp.pricing = GLP_PT_STD
     1341            elif value == "GLP_PT_PSE":
     1342                self.smcp.pricing = GLP_PT_PSE
     1343
     1344        elif name == "r_test":
     1345            if value == None:
     1346                return self.smcp.r_test
     1347            elif value == "GLP_RT_STD":
     1348                self.smcp.r_test = GLP_RT_STD
     1349            elif value == "GLP_RT_HAR":
     1350                self.scmp.r_test = GLP_RT_HAR
     1351
     1352        elif name == "tol_bnd":
     1353            if value == None:
     1354                return self.smcp.tol_bnd
     1355            else:
     1356                self.smcp.tol_bnd = value
     1357
     1358        elif name == "tol_dj":
     1359            if value == None:
     1360                return self.smcp.tol_dj
     1361            else:
     1362                self.smcp.tol_dj = value
     1363
     1364        elif name == "tol_piv":
     1365            if value == None:
     1366                return self.smcp.tol_piv
     1367            else:
     1368                self.smcp.tol_piv = value
     1369
     1370        elif name == "obj_ll":
     1371            if value == None:
     1372                return self.smcp.obj_ll
     1373            else:
     1374                self.smcp.obj_ll = value
     1375
     1376        elif name == "obj_ul":
     1377            if value == None:
     1378                return self.smcp.obj_ul
     1379            else:
     1380                self.smcp.obj_ul = value
     1381
     1382        elif name == "it_lim":
     1383            if value == None:
     1384                return self.smcp.it_lim
     1385            else:
     1386                self.smcp.it_lim = value
     1387
     1388        elif name == "smcp_tm_lim":
     1389            if value == None:
     1390                return self.smcp.tm_lim
     1391            else:
     1392                self.smcp.tm_lim = value
     1393
     1394        elif name == "smcp_out_frq":
     1395            if value == None:
     1396                return self.smcp.out_frq
     1397            else:
     1398                self.smcp.out_frq = value
     1399
     1400        elif name == "smcp_out_dly":
     1401            if value == None:
     1402                return self.smcp.out_dly
     1403            else:
     1404                self.smcp.out_dly = value
     1405
     1406        elif name == "smcp_presolve":
     1407            if value == None:
     1408                return self.smcp.presolve
     1409            elif value in (True, "GLP_ON"):
     1410                self.smcp.presolve = GLP_ON
     1411            elif value in (False, "GLP_OFF"):
     1412                self.smcp.presolve = GLP_OFF
     1413
     1414        # parameters for the structure glp_iocp
     1415        elif name == "iocp_msg_lev":
     1416            if value == None:
     1417                return self.iocp.msg_lev
     1418            elif name == "GLP_MSG_OFF":
     1419                self.iocp.msg_lev = GLP_MSG_OFF
     1420            elif value== "GLP_MSG_ERR":
     1421                self.iocp.msg_lev = GLP_MSG_ERR
     1422            elif name == "GLP_MSG_ON":
     1423                self.iocp.msg_lev = GLP_MSG_ON
     1424            elif name == "GLP_MSG_ALL":
     1425                    self.iocp.msg_lev = GLP_MSG_ALL
     1426
     1427        elif name == "br_tech":
     1428            if value == None:
     1429                return self.iocp.br_tech
     1430            elif value == "GLP_BR_FFV":
     1431                self.iocp.br_tech = GLP_BR_FFV
     1432            elif value == "GLP_BR_LFV":
     1433                self.iocp.br_tech = GLP_BR_LFV
     1434            elif value == "GLP_BR_MFV":
     1435                self.iocp.br_tech = GLP_BR_MFV
     1436            elif value == "GLP_BR_DHT":
     1437                self.iocp.br_tech = GLP_BR_DTH
     1438            elif value == "GLP_BR_PCH":
     1439                self.iocp.br_tech = GLP_BR_PCH
     1440
     1441        elif name == "bt_tech":
     1442            if value == None:
     1443                return self.iocp.bt_tech
     1444            elif value == "GLP_BT_DFS":
     1445                self.iocp.bt_tech = GLP_BT_DFS
     1446            elif value == "GLP_BT_BFS":
     1447                self.iocp.bt_tech = GLP_BT_BFS
     1448            elif value == "GLP_BT_BLB":
     1449                self.iocp.bt_tech = GLP_BT_BLB
     1450            elif value == "GLP_BT_BPH":
     1451                self.iocp.bt_tech = GLP_BT_BPH
     1452
     1453        elif name == "pp_tech":
     1454            if value == None:
     1455                return self.iocp.pp_tech
     1456            elif value == "GLP_PP_NONE":
     1457                self.iocp.pp_tech = GLP_PP_NONE
     1458            elif value == "GLP_PP_ROOT":
     1459                self.iocp.pp_tech = GLP_PP_ROOT
     1460            elif value == "GLP_PP_ALL":
     1461                self.iocp.pp_tech = GLP_PP_ALL
     1462
     1463        elif name == "fp_heur":
     1464            if value == None:
     1465                return self.iocp.fp_heur
     1466            elif value in (True, "GLP_ON"):
     1467                self.iocp.fp_heur = GLP_ON
     1468            elif value in (False, "GLP_OFF"):
     1469                self.iocp.fp_heur = GLP_OFF
     1470
     1471        elif name == "gmi_cuts":
     1472            if value == None:
     1473                return self.iocp.gmi_cuts
     1474            elif value in (True, "GLP_ON"):
     1475                self.iocp.gmi_cuts = GLP_ON
     1476            elif value in (False, "GLP_OFF"):
     1477                self.iocp.gmi_cuts = GLP_OFF
     1478
     1479        elif name == "mir_cuts":
     1480            if value == None:
     1481                return self.iocp.mir_cuts
     1482            elif value in (True, "GLP_ON"):
     1483                self.iocp.mir_cuts = GLP_ON
     1484            elif value in (False, "GLP_OFF"):
     1485                self.iocp.mir_cuts = GLP_OFF
     1486
     1487        elif name == "cov_cuts":
     1488            if value == None:
     1489                return self.iocp.cov_cuts
     1490            elif value in (True, "GLP_ON"):
     1491                self.iocp.cov_cuts = GLP_ON
     1492            elif value in (False, "GLP_OFF"):
     1493                self.iocp.cov_cuts = GLP_OFF
     1494
     1495        elif name == "clq_cuts":
     1496            if value == None:
     1497                return self.iocp.clq_cuts
     1498            elif value in (True, "GLP_ON"):
     1499                self.iocp.clq_cuts = GLP_ON
     1500            elif value in (False, "GLP_OFF"):
     1501                self.iocp.clq_cuts = GLP_OFF
     1502
     1503        elif name == "tol_int":
     1504            if value == None:
     1505                return self.iocp.tol_int
     1506            else:
     1507                self.iocp.tol_int = value
     1508
     1509        elif name == "tol_obj":
     1510            if value == None:
     1511                return self.iocp.tol_obj
     1512            else:
     1513                self.iocp.tol_obj = value
     1514
     1515        elif name == "mip_gap":
     1516            if value == None:
     1517                return self.iocp.mip_gap
     1518            else:
     1519                self.iocp.mip_gap = value
     1520
     1521        elif name == "iocp_tm_lim":
     1522            if value == None:
     1523                return self.iocp.tm_lim
     1524            else:
     1525                self.iocp.tm_lim = value
     1526
     1527        elif name == "iocp_out_frq":
     1528            if value == None:
     1529                return self.iocp.out_frq
     1530            else:
     1531                self.iocp.out_frq = value
     1532
     1533        elif name == "iocp_out_dly":
     1534            if value == None:
     1535                return self.iocp.out_dly
     1536            else:
     1537                self.iocp.out_dly = value
     1538
     1539        elif name == "iocp_presolve":
     1540            if value == None:
     1541                return self.iocp.presolve
     1542            elif value in (True, "GLP_ON"):
     1543                self.iocp.presolve = GLP_ON
     1544            elif value in (False, "GLP_OFF"):
     1545                self.iocp.presolve = GLP_OFF
     1546
     1547        elif name == "binarize":
     1548            if value == None:
     1549                return self.iocp.binarize
     1550            elif value in (True, "GLP_ON"):
     1551                self.iocp.binarize = GLP_ON
     1552            elif value in (False, "GLP_OFF"):
     1553                self.iocp.binarize = GLP_OFF
     1554
     1555        elif name == "timelimit":
    11491556            if value == None:
    11501557                return self.iocp.tm_lim/1000.0
    11511558            else: