LP
Simple C/C++ interface to COIN-OR CBC, CPLEX, GLPK and GUROBI, with some interesting features
lp.h
Go to the documentation of this file.
1 
13 #ifndef LP_HEADER
14 #define LP_HEADER
15 
16 #define LP_ME_DEFAULT 0
17 #define LP_ME_OPTIMALITY 1
18 #define LP_ME_FEASIBILITY 2
19 
20 /* Optimization direction */
21 #define LP_MIN 0
22 #define LP_MAX 1
23 
24 /* Optimization result: */
25 #define LP_OPTIMAL 0
26 #define LP_INFEASIBLE 1
27 #define LP_UNBOUNDED 2
28 #define LP_FEASIBLE 3
29 #define LP_INTINFEASIBLE 4
30 #define LP_NO_SOL_FOUND 5
31 #define LP_ERROR 6
32 
33 /* types of cut generators */
34 #define LP_CUT_TYPES 8
35 #define LPC_GOMORY 0
36 #define LPC_REDUCE 1
37 #define LPC_MIR 2
38 #define LPC_TWO_MIR 3
39 #define LPC_L_AND_P 4
40 #define LPC_ZERO_HALF 5
41 #define LPC_KNAPSACK 6
42 #define LPC_FLOW 7
43 
44 /* constraint types, used when querying model */
45 #define CONS_PARTITIONING 0
46 #define CONS_PACKING 1
47 #define CONS_COVERING 2
48 #define CONS_CARDINALITY 3
49 #define CONS_KNAPSACK 4
50 #define CONS_INV_KNAPSACK 5
51 #define CONS_FLOW_BIN 6
52 #define CONS_FLOW_INT 7
53 #define CONS_FLOW_MX 8
54 #define CONS_VBOUND 9
55 #define CONS_OTHER 10
56 #define CONS_NUMBER 11 /* number of types */
57 
58 /* LP Callback step */
59 #define LPCB_CUTS 0
60 #define LPCB_HEUR 1
61 
62 typedef struct _LinearProgram LinearProgram;
64 
77 
78 
82 
83 
86 void lp_read( LinearProgram *lp, const char *fileName );
87 
88 
91 void lp_write_lp( LinearProgram *lp, const char *fileName );
92 
105 void lp_add_col( LinearProgram *lp, double obj, double lb, double ub, char integer, char *name, int nz, int *rowIdx, double *rowCoef );
106 
107 
121 void lp_add_cols( LinearProgram *lp, const int count, double *obj, double *lb, double *ub, char *integer, char **name );
122 
123 
133 void lp_add_cols_same_bound( LinearProgram *lp, const int count, double *obj, double lb, double ub, char *integer, char **name );
134 
135 
143 void lp_add_bin_cols( LinearProgram *lp, const int count, double *obj, char **name );
144 
145 
156 void lp_add_row( LinearProgram *lp, const int nz, int *indexes, double *coefs, const char *name, char sense, const double rhs );
157 
158 
170 void lp_add_rows( LinearProgram *lp, int nRows, int *starts, int *idx, double *coef, char *sense, double *rhs, const char **names );
171 
172 
178 void lp_remove_row( LinearProgram *lp, int idxRow );
179 
180 
189 void lp_remove_rows( LinearProgram *lp, int nRows, int *rows );
190 
191 
197 void lp_set_direction( LinearProgram *lp, const char direction );
198 
199 
206 
207 
213 void lp_set_obj( LinearProgram *lp, double obj[] );
214 
215 
223 void lp_chg_obj(LinearProgram *lp, int count, int idx[], double obj[] );
224 
225 
232 void lp_set_rhs( LinearProgram *lp, int row, double rhs );
233 
234 
242 void lp_set_col_bounds( LinearProgram *lp, int col, const double lb, const double ub );
243 
244 
251 void lp_fix_col( LinearProgram *lp, int col, double val );
252 
253 
260 void lp_set_integer( LinearProgram *lp, int nCols, int cols[] );
261 
262 
267 void lp_write_sol( LinearProgram *lp, const char *fileName );
268 
269 
276 void lp_load_mip_start(LinearProgram *lp, int count, const char **colNames, const double *colValues);
277 
284 void lp_load_mip_starti( LinearProgram *lp, int count, const int *colIndexes, const double *colValues );
285 
286 
304 int lp_read_mip_start( LinearProgram *lp, const char *fileName );
305 
306 
311 void lp_save_mip_start( LinearProgram *lp, const char *fileName );
312 
316 void lp_mipstart_debug( LinearProgram *lp );
317 
321 void lp_fix_mipstart( LinearProgram *lp );
322 
323 
328 void lp_free( LinearProgramPtr *lp );
329 
334 void lp_close_env();
335 
336  // end of group1
338 
361 int lp_optimize( LinearProgram *lp );
362 
363 
379 
380 
386 double lp_obj_value(LinearProgram *lp);
387 
388 
398 double lp_best_bound( LinearProgram *lp );
399 
400 
406 double *lp_x( LinearProgram *lp );
407 
408 
409 /*@ returns the slack vector for rows. Active (tight) rows have slack==0.0
410  *
411  * @param lp the (integer) linear program
412  * @return row slack vector
413  * */
414 double *lp_row_slack( LinearProgram *lp );
415 
416 
417 /*@brief returns a vector with the dual values, only available when solving continuous models
418  * @param lp the (integer) linear program
419  * @return vector with row prices
420  * */
421 double *lp_row_price( LinearProgram *lp );
422 
423 
428 double *lp_reduced_cost( LinearProgram *lp );
429 
430 
436 
437 
443 double lp_saved_sol_obj( LinearProgram *lp, int isol );
444 
445 
451 double *lp_saved_sol_x( LinearProgram *lp, int isol );
452 
453  // end of group1
455 
456 
457 LinearProgram *lp_pre_process( LinearProgram *lp );
458 // sets cutoff for MIP optimization, optionally also adds constraint */
459 void lp_add_cutoff( LinearProgram *lp, double cutoff, char addConstraint );
460 // higher values indicate that these fractional variables will be branched first
461 void lp_set_branching_priorities( LinearProgram *lp, int *priorities );
462 // 1: always chose up first, -1: always chose down first 0: automatic
463 void lp_set_branching_direction( LinearProgram *lp, int direction );
464 
465 /* Model optimization, results query
466  and solution methods parameters */
467 void lp_set_mip_emphasis( LinearProgram *lp, const int mipEmphasis );
468 int lp_get_mip_emphasis( LinearProgram *lp );
469 char *lp_status_str( int status, char *statusStr );
470 double lp_solution_time( LinearProgram *lp );
471 
472 /* add cuts over LP relaxation
473  * maxRoundsCuts[] is a vector of integers
474  * 0...LP_CUT_TYPES-1 where for each cut one
475  * must indicate the maximum number of rounds
476  * where this cut is separated */
477 int lp_strengthen_with_cuts( LinearProgram *lp, const int maxRoundsCuts[] );
478 
479 /* add some cut manually
480  * or when using the callback */
481 void lp_add_cut( LinearProgram *lp, int nz, int *cutIdx, double *cutCoef, const char *name, char sense, double rhs );
482 
483 /* command line options */
484 void lp_parse_options( LinearProgram *lp, int argc, const char **argv );
485 void lp_help_options( );
486 
487 /* parameters - input/output */
488 void lp_set_sol_out_file_name( LinearProgram *lp, const char *sfn );
489 void lp_set_sol_in_file_name( LinearProgram *lp, const char *sfn );
490 /* parameters - heuristics */
491 void lp_set_heur_proximity( LinearProgram *lp, char onOff );
492 void lp_set_heur_fp_passes( LinearProgram *lp, int passes );
493 /* parameters - cuts */
494 void lp_set_cuts( LinearProgram *lp, char onOff );
495 /* parameters - input/output */
496 void lp_set_print_messages( LinearProgram *lp, char onOff );
497 /* parameters - limits */
498 void lp_set_max_seconds( LinearProgram *lp, int _max );
499 void lp_set_max_solutions( LinearProgram *lp, int _max );
500 void lp_set_max_nodes( LinearProgram *lp, int _max );
501 void lp_set_max_saved_sols( LinearProgram *lp, int _max );
502 void lp_set_abs_mip_gap( LinearProgram *lp, const double _value );
503 void lp_set_rel_mip_gap( LinearProgram *lp, const double _value );
504 /* parameters - parallel */
505 void lp_set_parallel( LinearProgram *lp, char onOff );
506 
518 char lp_is_mip( LinearProgram *lp );
519 
520 
526 char lp_is_integer( LinearProgram *lp, const int j );
527 
528 
534 char lp_is_binary( LinearProgram *lp, const int j );
535 
536 
537 
544 void lp_cols_by_type( LinearProgram *lp, int *binaries, int *integers, int *continuous );
545 
546 
547 
552 int lp_cols( LinearProgram *lp );
553 
554 
559 int lp_rows( LinearProgram *lp );
560 
561 
566 int lp_nz( LinearProgram *lp );
567 
568 
576 int lp_row( LinearProgram *lp, int row, int *idx, double *coef );
577 
578 
586 int lp_col( LinearProgram *lp, int col, int *idx, double *coef );
587 
588 
593 double lp_rhs( LinearProgram *lp, int row );
594 
595 
607 char lp_sense( LinearProgram *lp, int row );
608 
609 
616 char *lp_row_name( LinearProgram *lp, int row, char *dest );
617 
618 
625 char *lp_col_name( LinearProgram *lp, int col, char *dest );
626 
627 
633 double lp_col_lb( LinearProgram *lp, int col );
634 
635 
641 double lp_col_ub( LinearProgram *lp, int col );
642 
643 
649 int lp_col_index( LinearProgram *lp, const char *name );
650 
651 
657 int lp_row_index( LinearProgram *lp, const char *name );
658 
659 
664 const double *lp_obj_coef( LinearProgram *lp );
665 
666 
686 int lp_row_type( LinearProgram *lp, const int row );
687 
688 
707 void lp_rows_by_type( LinearProgram *lp, int rtype[] );
708 
709 
715 
716  // end of group1
718 
719 /* callback function prototype */
720 typedef int (*lp_cb)( LinearProgram *lp, int whereFrom, const int *origCols, LinearProgram *origLP, void *data );
721 /* enter callback info */
722 void lp_set_callback( LinearProgram *lp, lp_cb callback, void *data );
723 
724 // global flag indicating if variable/row names will be stored, can save some memory when off
725 void lp_set_store_names( bool store );
726 
727 #endif
void lp_close_env()
frees environment static memory at the end of the program
Definition: lp.cpp:4732
double lp_col_ub(LinearProgram *lp, int col)
queries a column upper bound
Definition: lp.cpp:2989
char lp_is_integer(LinearProgram *lp, const int j)
checks if a given variable is integer or continuous
Definition: lp.cpp:1412
int lp_row_type(LinearProgram *lp, const int row)
returns the constraint type of a given row
Definition: lp.cpp:4467
void lp_free(LinearProgramPtr *lp)
releases from memory the problem stored in lp
Definition: lp.cpp:2646
double lp_col_lb(LinearProgram *lp, int col)
queries a column lower bound
Definition: lp.cpp:2959
void lp_set_obj(LinearProgram *lp, double obj[])
sets objective function coefficients
int lp_cols(LinearProgram *lp)
returns the numbef of columns (variables) in a given problem
Definition: lp.cpp:1367
void lp_add_rows(LinearProgram *lp, int nRows, int *starts, int *idx, double *coef, char *sense, double *rhs, const char **names)
Definition: lp.cpp:968
int lp_row(LinearProgram *lp, int row, int *idx, double *coef)
gets the contents of a given row (linear constraint)
Definition: lp.cpp:2755
int lp_num_saved_sols(LinearProgram *lp)
number of solutions stored in the solution pool
Definition: lp.cpp:3252
int lp_col(LinearProgram *lp, int col, int *idx, double *coef)
gets the contents of a given column (variable)
Definition: lp.cpp:2711
char * lp_row_name(LinearProgram *lp, int row, char *dest)
queries a row name
Definition: lp.cpp:2891
char * lp_col_name(LinearProgram *lp, int col, char *dest)
queries a column name
Definition: lp.cpp:2927
void lp_save_mip_start(LinearProgram *lp, const char *fileName)
saves the solution entered as MIPStart
Definition: lp.cpp:4770
void lp_mipstart_debug(LinearProgram *lp)
tries to discover the source of infeasibility in MIPStart
Definition: lp.cpp:4672
int lp_read_mip_start(LinearProgram *lp, const char *fileName)
Loads from fileName an initial feasible solution.
Definition: lp.cpp:4365
int lp_rows(LinearProgram *lp)
returns the numbef of rows (linear constraints) in a given problem
Definition: lp.cpp:1389
void lp_set_col_bounds(LinearProgram *lp, int col, const double lb, const double ub)
changes lower and upper bound of a column
Definition: lp.cpp:3448
int * lp_original_colummns(LinearProgram *lp)
if this is a pre-processed problem, returns indexes of respective original columns ...
Definition: lp.cpp:4663
char lp_sense(LinearProgram *lp, int row)
returns the sense of a given constraints
Definition: lp.cpp:2838
int lp_optimize(LinearProgram *lp)
Optimizes your Mixed Integer Program.
Definition: lp.cpp:1482
double * lp_reduced_cost(LinearProgram *lp)
reduced cost for columns - only available when solving continous models
Definition: lp.cpp:4748
void lp_fix_mipstart(LinearProgram *lp)
For debugging purposes: fixes mipstart variables one by one and optimizes (if initial solution is inv...
Definition: lp.cpp:4882
int lp_row_index(LinearProgram *lp, const char *name)
returns the row (linear constraint) index of a given row name
Definition: lp.cpp:3786
const double * lp_obj_coef(LinearProgram *lp)
return the vector with objective coefficients
Definition: lp.cpp:1328
void lp_remove_row(LinearProgram *lp, int idxRow)
Removes a row from lp.
Definition: lp.cpp:4676
void lp_rows_by_type(LinearProgram *lp, int rtype[])
fills the constraint types vector
Definition: lp.cpp:4596
void lp_add_cols(LinearProgram *lp, const int count, double *obj, double *lb, double *ub, char *integer, char **name)
adds new columns (variables)
Definition: lp.cpp:1089
void lp_set_rhs(LinearProgram *lp, int row, double rhs)
modifies the right-hand-side of a constraint
Definition: lp.cpp:3145
void lp_add_col(LinearProgram *lp, double obj, double lb, double ub, char integer, char *name, int nz, int *rowIdx, double *rowCoef)
adds a new column (variable)
Definition: lp.cpp:3046
void lp_cols_by_type(LinearProgram *lp, int *binaries, int *integers, int *continuous)
counts the number of binary, general integer and continuous variables in this problem ...
Definition: lp.cpp:4330
double lp_obj_value(LinearProgram *lp)
objective value of your optimization
Definition: lp.cpp:2382
double * lp_saved_sol_x(LinearProgram *lp, int isol)
objective value for the isol-th solution of the solution pool
Definition: lp.cpp:3521
double lp_saved_sol_obj(LinearProgram *lp, int isol)
objective value for the isol-th solution of the solution pool
Definition: lp.cpp:3512
int lp_nz(LinearProgram *lp)
returns the numbef of non-zero coefficients in the linear program rows
Definition: lp.cpp:4308
char lp_is_binary(LinearProgram *lp, const int j)
checks if a given variable is binary or not
Definition: lp.cpp:4460
double lp_rhs(LinearProgram *lp, int row)
return the right hand side of a given row
Definition: lp.cpp:2798
void lp_remove_rows(LinearProgram *lp, int nRows, int *rows)
Removes a set of rows from lp Removes a set of rows from lp, calling this function is usually faster ...
Definition: lp.cpp:4787
void lp_write_sol(LinearProgram *lp, const char *fileName)
Saves the incumbent solution in for lp in fileName.
Definition: lp.cpp:4050
void lp_add_bin_cols(LinearProgram *lp, const int count, double *obj, char **name)
adds a set of binary variables
Definition: lp.cpp:1320
void lp_load_mip_start(LinearProgram *lp, int count, const char **colNames, const double *colValues)
Enters a initial feasible solution for the problem. Variables are referenced by their names...
Definition: lp.cpp:4264
int lp_optimize_as_continuous(LinearProgram *lp)
optimizes only the linear programming relaxation of your MIP
Definition: lp.cpp:1471
LinearProgram * lp_create()
Creates an empty problem.
Definition: lp.cpp:415
void lp_add_cols_same_bound(LinearProgram *lp, const int count, double *obj, double lb, double ub, char *integer, char **name)
adds set of columns with the same bounds
Definition: lp.cpp:1311
int lp_get_direction(LinearProgram *lp)
returns optimization direction, minimization (LP_MIN) or maximization (LP_MAX)
Definition: lp.cpp:725
void lp_read(LinearProgram *lp, const char *fileName)
Reads a .lp or .mps file in fileName to object lp.
Definition: lp.cpp:564
LinearProgram * lp_clone(LinearProgram *lp)
Clones the problem in lp.
Definition: lp.cpp:3530
void lp_fix_col(LinearProgram *lp, int col, double val)
fixed a column to a value
Definition: lp.cpp:3631
int lp_col_index(LinearProgram *lp, const char *name)
returns the column (variable) index of a given column name
Definition: lp.cpp:3747
double lp_best_bound(LinearProgram *lp)
returns the best dual bound found during the search
Definition: lp.cpp:4591
void lp_add_row(LinearProgram *lp, const int nz, int *indexes, double *coefs, const char *name, char sense, const double rhs)
Definition: lp.cpp:845
Definition: lp.cpp:119
void lp_write_lp(LinearProgram *lp, const char *fileName)
saves the problem in lp to file fileName. Use extension .lp or .mps to define file format...
Definition: lp.cpp:603
void lp_set_integer(LinearProgram *lp, int nCols, int cols[])
sets the type of some variables to integer
Definition: lp.cpp:4604
void lp_set_direction(LinearProgram *lp, const char direction)
sets optimization direction, maximization or minimization
Definition: lp.cpp:674
char lp_is_mip(LinearProgram *lp)
checks if there are integer variables in this program
void lp_load_mip_starti(LinearProgram *lp, int count, const int *colIndexes, const double *colValues)
Enters a initial feasible solution for the problem using column indexes. Only the main decision varia...
Definition: lp.cpp:4234
void lp_chg_obj(LinearProgram *lp, int count, int idx[], double obj[])
changes a set of objective function coefficients
Definition: lp.cpp:4292
double * lp_x(LinearProgram *lp)
returns the vector of solution values
Definition: lp.cpp:2427