411 REFERENCE · Wikibooks
GLPK/API usage
Reference material by Wikibooks contributors. This retains its source identity and is not 411 news reporting.
This page provides examples of API usage for commonly
encountered tasks.
__FORCETOC__
Prescribed starts
A solution can be read from file using the following API routines:
glp_read_sol - read basic solution
glp_read_ipt - read interior point solution
glp_read_mip - read MIP solution
The solution read with glp_read_sol can serve as initial basis for solving a LP using the
simplex algorithm (this is what glpsol command line parameter --ini does).
For mixed integer problems an integer feasible (but possibly suboptimal) starting solution
can be specified using the GLPK API (a feature not available through GLPSOL).
the following callback instructions need checking and/or refining
some better resolved example code could also be useful
The callback hook from the integer solver is used for
this purpose. First write a custom callback routine
and register this with the MIP solver using the MIP
control parameter structure glp_iocp and field
cb_func.
Then call glp_ios_reason from your callback
routine and if GLP_IHEUR is returned, set and
solve your desired starting solution as follows:
preset the integer variables in tree->mip
default initialize the parameter struct parm by calling: glp_init_smcp(&parm)
reset the parameter struct field thus: parm.meth = GLP_DUALP
solve the LP: int ret = glp_simplex(tree->mip, &parm)
pass all variables by calling function glp_ios_heur_sol
This early-2013 [Help-glpk] thread here and here contains relevant information and the following code snippet (while noting that the use of void* is not good style):
// caution: this code is buggy and will be
// updated as soon as a solution is found
void callback(glp_tree* tree, void* info)
{
if (glp_ios_reason(tree) == GLP_IHEUR && glp_ios_curr_node(tree) == 1)
{
glp_ios_heur_sol(tree, solution);
}
}
where solution is a const double array which contains the primal values of all the variables in locations x[1],...,x[n] where n is the number of columns in the original problem object.
Karush-Kuhn-Tucker optimality conditions (obsolete)
Please note the call lpx_check_ktt was upgraded to glp_check_ktt with version 4.49. The struct LPXKKT is no longer used.
GLPK provides the lpx_check_ktt routine to check the KKT optimality conditions for a basic solution.
The function signature is:
void lpx_check_kkt(glp_prob *lp, // GLPK problem object pointer
int scaled, // 0 = use unscaled, non-zero = use internally scaled
LPXKKT *kkt) // LPXKKT C struct pointer (meaning address)
The parameter scaled can be set to 0 to check the original unscaled problem or non-zero to check the internally scaled problem.
A typical call might be:
LPXKKT kkt; // declaration of a suitable C struct
lpx_check_kkt(lp, 1, &kkt); // fill call, note the address-of operator
This call fills the struct kkt, which can then be interrogated.