The following table is a brief overview of the functionality of PyGLPK. The intention was to present functionality in roughly the same order and groupings that they do in the GLPK reference manual, at least where appropriate. This table contains a brief description of some functionality, some simple Python code illustrating the general principles of usage, the related C API function (for the benefit of those familiar with GLPK; this information can be safely ignored if you are not), and a link to more detailed documentation on this subject with the ? links.
Python Module | C API | ? |
---|---|---|
Problem attributes | ||
Create or delete problem object | ? | |
lp = glpk.LPX() |
glp_create_prob | |
del lp or just let garbage collector handle it |
glp_delete_prob | |
Reinitialize problem object | ? | |
lp.erase() |
glp_erase_prob | |
Set or get problem name | ? | |
lp.name = "pname" or del lp.name |
glp_set_prob_name | |
lp.name (either a string or None ) |
glp_get_prob_name | |
Set or get objective function name | ? | |
lp.obj.name = "oname" or del lp.obj.name |
glp_set_obj_name | |
lp.obj.name (either a string or None ) |
glp_get_obj_name | |
Set or get optimization direction | ? | |
lp.obj.maximize = True or = False |
glp_set_obj_dir | |
lp.obj.maximize (either True or False ) |
glp_get_obj_dir | |
Add new rows or columns to a problem | ? | |
lp.rows.add(num_to_add) |
glp_add_rows | |
lp.cols.add(num_to_add) |
glp_add_cols | |
Set or get row or column name | ? | |
lp.rows[ri].name = "rname" or del lp.rows[rnum].name |
glp_set_row_name | |
lp.cols[ci].name = "cname" or del lp.cols[cnum].name |
glp_set_col_name | |
lp.rows[ri].name (either a string or None ) |
glp_get_row_name | |
lp.cols[ci].name (either a string or None ) |
glp_get_col_name | |
Set or get row or column bounds | ? | |
lp.rows[ri].bounds = lower, upper or = equals |
glp_set_row_bnds | |
lp.cols[ci].bounds = lower, upper or = equals |
glp_set_col_bnds | |
lp.rows[ri].bounds (two values, each either a float or None ) |
glp_get_row_type | |
glp_get_row_lb | ||
glp_get_row_ub | ||
lp.cols[ci].bounds (two values, each either a float or None ) |
glp_get_col_type | |
glp_get_col_lb | ||
glp_get_col_ub | ||
Set or get objective coefficient or shift term | ? | |
lp.obj[ci] = coef (use index None to get shift term) |
glp_set_obj_coef | |
lp.obj[ci] (a float) |
glp_get_obj_coef | |
Set or get row or column of the constraint matrix | ? | |
lp.rows[ri].matrix = [(ci1,val1), (ci2,val2), ...] |
glp_set_mat_row | |
lp.cols[ci].matrix = [(ri1,val1), (ri2,val2), ...] |
glp_set_mat_col | |
lp.rows[ri].matrix (a list of int-col-index, float-value tuples) |
glp_get_mat_row | |
lp.cols[ci].matrix (a list of int-row-index, float-value tuples) |
glp_get_mat_col | |
Set or get the whole constraint matrix | ? | |
lp.matrix = [(ri1,ci1,val1), (ri2,ci2,val2), ...] |
glp_load_matrix | |
lp.matrix (a list of row, column, value tuples) |
(no analogy) | |
Delete rows or columns from problem object | ? | |
del lp.rows[ri1, ri2, ...] or del lp.rows[r_lo:r_hi+1] |
glp_del_rows | |
del lp.cols[ci1, ci2, ...] or del lp.cols[c_lo:c_hi+1] |
glp_del_cols | |
Delete problem object | ? | |
del lp or just let garbage collector handle it |
glp_delete_prob | |
Indexing rows and columns by name | ||
Index row or column by its name | ||
lp.rows['rowname'] , or 'rowname' in lp.rows to check for membership |
glp_find_row | |
lp.cols['colname'] , or 'colname' in lp.cols to check for membership |
glp_find_col | |
The index is created when required. | glp_create_index | |
glp_delete_index | ||
Problem scaling | ||
Automatically scale or unscale problem data | ? | |
lp.scale() |
glp_scale_prob | |
lp.unscale() |
glp_unscale_prob | |
Set or get scaling of row and column data | ? | |
lp.rows[i].scale = factor |
glp_set_rii | |
lp.cols[i].scale = factor |
glp_set_sjj | |
lp.rows[i].scale (a float) |
glp_get_rii | |
lp.cols[i].scale (a float) |
glp_get_sjj | |
Basis operations | ||
Construct trivial initial LP basis | ? | |
lp.std_basis() |
glp_std_basis | |
Construct advanced initial LP basis | ||
lp.adv_basis() |
glp_adv_basis | |
Construct advanced initial LP basis with Bixby's algorithm | ||
lp.cpx_basis() |
glp_cpx_basis | |
Read initial LP basis from a file | ||
lp.read_basis(filename) |
lpx_read_bas | |
Set row or column status | ? | |
lp.rows[ri].status = newstatus |
glp_set_row_stat | |
lp.cols[ci].status = newstatus |
glp_set_col_stat | |
Basic simplex solvers | ||
Solve problem with the simplex method | ? | |
lp.simplex() |
glp_simplex | |
Solve problem with an exact arithmetic using simplex method | ||
lp.exact() |
lpx_exact | |
Get generic, primal, or dual status of basic solution | ? | |
lp.status (or lp.status_s to force simplex status) |
glp_get_status | |
lp.status_primal (a string) |
glp_get_prim_stat | |
lp.status_dual (a string) |
glp_get_dual_stat | |
Get objective value | ? | |
lp.obj.value (or lp.obj.value_s to force simplex value) |
glp_get_obj_val | |
Get row or column status | ? | |
lp.rows[ri].status (a string, one of 'bs' , 'nl' ,'nu' ,'nf' ,'ns' ) |
glp_get_row_stat | |
lp.cols[ci].status (a string, one of 'bs' , 'nl' ,'nu' ,'nf' ,'ns' ) |
glp_get_col_stat | |
Get row or column primal or dual value | ? | |
lp.rows[ri].primal (or lp.rows[ri].primal_s to force simplex value) |
glp_get_row_prim | |
lp.rows[ri].dual (or lp.rows[ri].dual_s to force simplex value) |
glp_get_row_dual | |
lp.cols[ci].primal (or lp.cols[ci].primal_s to force simplex value) |
glp_get_col_prim | |
lp.cols[ci].dual (or lp.cols[ci].dual_s to force simplex value) |
glp_get_col_dual | |
Get non-basic variable causing unboundness | ? | |
lp.ray (a row or column, or None if none has been identified) |
lpx_get_ray_info | |
Check solution's Karush-Kuhn-Tucker conditions | ? | |
lp.kkt() |
lpx_check_kkt | |
Manual simplex tableau operations | ||
I may be wrong, but I do not anticipate much desire for people to roll their own simplex solvers within the Python module. Please write me if my guess is incorrect. It might be nice to have though in the future, for the sake of completeness. | lpx_warm_up | |
lpx_eval_tab_row |
||
lpx_eval_tab_col |
||
lpx_transform_row |
||
lpx_transform_col |
||
lpx_prim_ratio_test |
||
lpx_dual_ratio_test |
||
Interior-point solver | ||
Solve problem with the interior-point method | ? | |
lp.interior() |
lpx_interior | |
Get status of interior-point solution | ? | |
lp.status (or lp.status_i to force interior point status) |
glp_ipt_status | |
Get objective value | ? | |
lp.obj.value (or lp.obj.value_i to force interior point value) |
glp_ipt_obj_val | |
Get row or column primal or dual value | ? | |
lp.rows[ri].primal (or lp.rows[ri].primal_i to force interior point value) |
glp_ipt_row_prim | |
lp.rows[ri].dual (or lp.rows[ri].dual_i to force interior point value) |
glp_ipt_row_dual | |
lp.cols[ci].primal (or lp.cols[ci].primal_i to force interior point value) |
glp_ipt_col_prim | |
lp.cols[ci].dual (or lp.cols[ci].dual_i to force interior point value) |
glp_ipt_col_dual | |
Mixed-integer programming solvers | ||
Set or get problem class | ? | |
lp.kind (either int or float ) |
lpx_get_class | |
Set or get column kind | ? | |
lp.cols[ci].kind = int or = bool or = float |
glp_set_col_kind | |
lp.cols[ci].kind (either int , bool , or float ) |
glp_get_col_kind | |
Get number of integer columns | ? | |
lp.nint (an integer) |
glp_get_num_int | |
Get number of binary columns | ||
lp.nbin (an integer) |
glp_get_num_bin | |
Solve MIP problem with the B&B method | ? | |
lp.integer() |
glp_intopt | |
Solve MIP problem with the advanced B&B solver | ||
lp.intopt() |
lpx_intopt | |
Get status of MIP solution | ? | |
lp.status (or lp.status_m to force MIP status) |
glp_mip_status | |
Get objective value | ? | |
lp.obj.value (or lp.obj.value_m to force MIP value) |
glp_mip_obj_val | |
Get row or column value | ? | |
lp.rows[ri].value (or lp.rows[ri].value_m to force MIP value) |
glp_mip_row_val | |
lp.cols[ci].value (or lp.cols[ci].value_m to force MIP value) |
glp_mip_col_val | |
Check solution's integer feasibility conditions | ? | |
lp.kktint() |
lpx_check_int | |
MIP Branch-&-Cut Advanced Interface | ||
Access the problem object | ? | |
tree.lp |
glp_ios_get_prob | |
Determine the size of the branch and bound tree | ? | |
tree.num_active (all ints) |
glp_ios_tree_size | |
tree.num_all | ||
tree.num_total | ||
Determine current active subproblem | ? | |
tree.curr_node |
glp_ios_curr_node | |
Determine first active subproblem | ? | |
tree.first_node |
glp_ios_next_node | |
Determine last active subproblem | ? | |
tree.last_node |
glp_ios_prev_node | |
Determine next active subproblem | ? | |
node.next |
glp_ios_next_node | |
Determine previous active subproblem | ? | |
node.prev |
glp_ios_prev_node | |
Determine parent subproblem | ? | |
node.up |
glp_ios_up_node | |
Determine subproblem level | ? | |
node.level (an int) |
glp_ios_node_level | |
Determine subproblem local bound | ? | |
node.bound (a float) |
glp_ios_node_bound | |
Find active subproblem with best local bound | ? | |
tree.best_node |
glp_ios_best_node | |
Compute relative MIP gap | ? | |
tree.gap (a float) |
glp_ios_mip_gap | |
Select subproblem to continue the search | ? | |
tree.select(node) |
glp_ios_select_node | |
Provide solution found by heuristic | ? | |
tree.heuristic(values) |
glp_ios_heur_sol | |
Check if can branch upon specified variable | ? | |
tree.can_branch(colnum) |
glp_ios_can_branch | |
Choose variable to branch upon | ? | |
tree.branch_upon(colnum, 'D') |
glp_ios_branch_upon | |
Terminate the solution process | ? | |
tree.terminate() |
glp_ios_terminate | |
Environment | ||
Get GLPK version | ? | |
glpk.env.version |
glp_version | |
Monitor memory usage | ? | |
glpk.env.blocks (all integers) |
glp_mem_usage | |
glpk.env.blocks_peak | ||
glpk.env.bytes | ||
glpk.env.bytes_peak | ||
Limit memory usage | ? | |
glpk.env.mem_limit = max_megabytes (an integer) |
glp_mem_limit | |
Control terminal output | ? | |
glpk.env.term_on = True or False |
glp_term_out | |
glpk.env.term_hook = output_func |
glp_term_hook | |
Problem readers | ||
Read fixed MPS format file | ? | |
lp = glpk.LPX(mps=filename) |
lpx_read_mps | |
Read free MPS format file | ||
lp = glpk.LPX(freemps=filename) |
lpx_read_freemps | |
Read GNU LP format file | ||
lp = glpk.LPX(glp=filename) |
lpx_read_prob | |
Read CPLEX LP format file | ||
lp = glpk.LPX(cpxlp=filename) |
lpx_read_cpxlp | |
Read GNU MathProg model file | ||
lp = glpk.LPX(gmp=filename) or lp = glpk.LPX(gmp=(model_file, data_file, output_file)) |
lpx_read_model | |
Problem and data writers | ||
Write problem to fixed MPS format file | ? | |
lp.write(mps=filename) |
lpx_write_mps | |
Write problem to free MPS format file | ||
lp.write(freemps=filename) |
lpx_write_freemps | |
Write problem to GNU LP format file | ||
lp.write(glp=filename) |
lpx_write_prob | |
Write problem to CPLEX LP format file | ||
lp.write(cpxlp=filename) |
lpx_write_cpxlp | |
Write LP basis to fixed MPS format file | ||
lp.write(bas=filename) |
lpx_write_bas | |
Write problem to plain text file | ||
lp.write(prob=filename) |
lpx_print_prob | |
Write basic solution to plain text file | ||
lp.write(sol=filename) |
lpx_print_sol | |
Write bounds sensitivity information to plain text file | ||
lp.write(sens_bnds=filename) |
lpx_print_sens_bnds | |
Write interior point solution to plain text file | ||
lp.write(ips=filename) |
lpx_print_ips | |
Write MIP solution to plain text file | ||
lp.write(mip=filename) |
lpx_print_mip |