1/* BEGIN LICENSE BLOCK 2 * Version: CMPL 1.1 3 * 4 * The contents of this file are subject to the Cisco-style Mozilla Public 5 * License Version 1.1 (the "License"); you may not use this file except 6 * in compliance with the License. You may obtain a copy of the License 7 * at www.eclipse-clp.org/license. 8 * 9 * Software distributed under the License is distributed on an "AS IS" 10 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See 11 * the License for the specific language governing rights and limitations 12 * under the License. 13 * 14 * The Original Code is The ECLiPSe Constraint Logic Programming System. 15 * The Initial Developer of the Original Code is Cisco Systems, Inc. 16 * Portions created by the Initial Developer are 17 * Copyright (C) 1995-2012 Cisco Systems, Inc. All Rights Reserved. 18 * 19 * Contributor(s): Joachim Schimpf, Kish Shen and Andrew Eremin, IC-Parc 20 * 21 * END LICENSE BLOCK */ 22 23/* 24 * ECLiPSe/COIN interface (for inclusion in eplex.c) 25 */ 26 27/* C_TO_COIN is defined when compiling for COIN, mapping the C calls in 28 eplex.c to the procedures in C++ coinplex.cpp. Also defined if 29 compiling the logged calls 30*/ 31 32#ifdef C_TO_COIN 33/* these void are for void pointers, as the type is COIN solver specific 34 and defined in coinplex.cpp only 35*/ 36# define OsiXxxSolverInterface void 37# define COINprob void 38#endif 39 40# define CPXENVptr COINprob* 41# define CPXLPptr COINprob* 42 43typedef int param_id_t; 44typedef char sostype_t; 45 46#include "eplex.h" /* needs declarations above! */ 47 48 49# define SOLVER_SHORT_NAME OSI 50# define SOLVER_ATOMIC_NAME "osi" 51 52# define CPXgetrhs(E,A1,A2,A3,A4) coin_getrhs(A1,A2,A3,A4) 53# define CPXgetsense(E,A1,A2,A3,A4) coin_getrowsense(A1,A2,A3,A4) 54# define CPXgetlb(E,A1,A2,A3,A4) coin_getlb(A1,A2,A3,A4) 55# define CPXgetub(E,A1,A2,A3,A4) coin_getub(A1,A2,A3,A4) 56# define CPXgetctype(E,A1,A2,A3,A4) coin_getcoltype(A1,A2,A3,A4) 57# define CPXchgctype(E,A1,A2,A3,A4) coin_chgcoltype(A1,A2,A3,A4) 58# define CPXchgbds(E,A1,A2,A3,A4,A5) coin_chgbds(A1,A2,A3,A4,A5) 59# define CPXcopybase(E,A1,A2,A3) coin_loadbasis(A1,A2,A3) 60# define CPXgetbase(E,A1,A2,A3) coin_getbasis(A1,A2,A3) 61# define Get_LP_Objval(A1,A2) coin_get_lpobjval(A1,A2) 62# define Get_Best_Objbound(A1, A2) coin_get_bestmipbound(A1,A2) 63# define CPXgetmipobjval(E,A1,A2) coin_get_mipobjval(A1,A2) 64# define CPXgetobj(E,A1,A2,A3,A4) coin_get_objcoeffs(A1,A2,A3,A4) 65# define CPXchgobj(E,A1,A2,A3,A4) coin_chg_objcoeffs(A1,A2,A3,A4) 66# define CPXcopyorder(E,A1,A2,A3,A4,A5) coin_get_order(A1,A2,A3,A4,A5,NULL,NULL) 67# define CPXchgqpcoef(E,A1,A2,A3,A4) coin_chgqobj(A1,A2,A3,A4) 68# define CPXchgrhs(E,A1,A2,A3,A4) coin_chgrhs(A1,A2,A3,A4) 69# define CPXcopylp(E,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14) \ 70 coin_loadprob(A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13) 71# define CPXcopyctype(E,A1,A2) coin_setcoltype(A1,A2) 72# define CPXaddcols(E,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10) \ 73 coin_addcols(A1,A2,A3,A4,A5,A6,A7,A8,A9) /* diff args! */ 74# define CPXaddrows(E,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11) \ 75 coin_addrows(A1,A3,A4,A5,A6,A7,A8,A9) /* diff args! */ 76# define CPXchgobjsen(E,A1,A2) coin_chgobjsen(A1,A2) 77# define CPXgetprobtype(E,A1) coin_get_probtype(A1) 78# define CPXchgprobtype(A1, A2, A3) 0 /* 0 for success return code */ 79# define CPXaddsos(E,LP,NS,NE,ST,SB,SI,SW,SN) coin_add_sos(LP,NS,NE,ST,SB,SI,SW) 80# define CPXgetrows(E,A1,A2,A3,A4,A5,A6,A7,A8,A9) \ 81 coin_get_row(A1,A2,A4,A5,A8) /* gets one row only! */ 82# define CPXgetnumnz(E,A1) coin_getnumnz(A1) 83# define CPXgetnumint(E,A1) coin_getnumint(A1) /* include binaries */ 84# define CPXchgname(E,A1,A2,A3,A4) coin_set_name(A1,A2,A3,A4) 85# define CPXgetnumbin(E,A1) 0 86# define CPXgetnumqpnz(E,A1) 0 /* for now */ 87# define XPRSdelrows(A1,A2,A3) coin_delrows(A1,A2,A3) 88# define XPRSdelcols(A1,A2,A3) coin_delcols(A1,A2,A3) 89# define CPXupdatemodel(LP) 90# define CPXcloseCPLEX(E) coin_free_prob(*(E)) 91 92# define UsingBarrierNoCrossOver(d) 0 93# define Get_Bar_Primal_Obj(d, obj) coin_get_bar_primal_objval(d, obj) 94# define Get_Bar_Dual_Obj(d, obj) coin_get_bar_dual_objval(d, obj) 95# define Bar_Is_Primal_Feasible(lpd) coin_bar_is_primal_feas(lpd->lp) 96# define Bar_Is_Dual_Feasible(d) coin_bar_is_dual_feas(lpd->lp) 97 98/* use only where solve_state is defined and set by call to 99 coin_get_result_state() 100*/ 101# define SuccessState(d) (solve_state == state_success) 102# define FailState(d) (solve_state == state_fail) 103# define MIPSemiSuccessState(d) (solve_state == state_mipsemisucc) 104# define MIPSemiFailState(d) (solve_state == state_mipsemifail) 105# define LPAbortedState(d) (solve_state == state_lpaborted) 106# define UnboundedState(d) (solve_state == state_unbounded) 107# define MaybeFailState(d) (solve_state == state_unknown) 108 109# define Get_MIPCutOff(d, v) coin_get_mipcutoff(d, v) 110# define DualMethod(lpd,m,am) 0 111 112# define Get_Dual_Infeas(lp, v) coin_get_dual_infeas(lp, v) 113# define Get_Primal_Infeas(lp, v) coin_get_primal_infeas(lp, v) 114 115# define SetPreSolve(state) 116 117# define Get_Feasibility_Tolerance(E,L,T) coin_getdblparam((L)->lp, OsiPrimalTolerance, T) 118 119# define Get_Int_Param(E,L,A1,A2) \ 120 coin_getintparam(((L) == NULL ? E : (L)->lp),A1,A2) 121# define Get_Dbl_Param(E,L,A1,A2) \ 122 coin_getdblparam(((L) == NULL ? E : (L)->lp),A1,A2) 123# define Get_Str_Param(E,L,A1,A2) \ 124 coin_getstrparam(((L) == NULL ? E : (L)->lp),A1,A2) 125# define Set_Int_Param(E,L,A1,A2) \ 126 coin_setintparam(((L) == NULL ? E : (L)->lp),A1,A2) 127# define Set_Dbl_Param(E,L,A1,A2) \ 128 coin_setdblparam(((L) == NULL ? E : (L)->lp),A1,A2) 129# define Set_Str_Param(E,L,A1,A2) \ 130 coin_setstrparam(((L) == NULL ? E : (L)->lp),A1,A2) 131 132/* 133# define Set_Str_Param(E,L,A1,A2) \ 134 ((L) == NULL ? XPRSsetstrcontrol(E,A1,A2) : XPRSsetstrcontrol((L)->lp,A1,A2)) 135*/ 136 137# define SOLVER_MAT_BASE 0 138# define SOLVER_MAT_OFFSET 1 139 140#define SOLVER_SENSE_LE 'L' 141#define SOLVER_SENSE_GE 'G' 142#define SOLVER_SENSE_EQ 'E' 143 144#define SOLVER_SOS_TYPE1 '1' 145#define SOLVER_SOS_TYPE2 '2' 146 147# define CPX_COL_AT_LOWER 3 148# define CPX_COL_BASIC 1 149# define CPX_COL_AT_UPPER 2 150# define CPX_COL_FREE_SUPER 0 151# define CPX_COL_NONBASIC_ZERO_BOUNDED CPX_COL_AT_LOWER 152# define CPX_COL_NONBASIC_ZERO_UNBOUNDED CPX_COL_FREE_SUPER 153 154# define CPX_INFBOUND coin_infinity(cpx_env) /* use the default cpx_env */ 155 156# define CPXPROB_MILP PROBLEM_MIP 157# define CPXPROB_QP PROBLEM_QP 158# define CPXPROB_MIQP PROBLEM_MIQP 159# define CPXPROB_LP PROBLEM_LP 160 161# define CPX_MIN SENSE_MIN 162# define CPX_MAX SENSE_MAX 163 164# define SOLVER_HAS_STR_PARAMS /* has string parameters */ 165# define SOLVER_HAS_LOCAL_PARAMETERS 166# define STRBUFFERSIZE 256 /* actual string param uses C++ string */ 167 168# ifdef COIN_USE_CLP 169 170# define HAS_QUADRATIC /* CLP has quadratic */ 171 172# endif 173 174 175/* solution states used in code to extract information from solver */ 176typedef enum 177{ 178 state_success, 179 state_fail, 180 state_mipsemisucc, 181 state_mipsemifail, 182 state_lpaborted, 183 state_unbounded, 184 state_unknown 185} state_t; 186 187/* these are used to return useful information to the user (mainly reason for 188 abort in the solve 189*/ 190#define S_UNKNOWN 0 191#define S_SUCCESS 1 192#define S_FAIL 2 193#define S_UNBOUND 3 194#define S_UNBOUND_OR_FAIL 4 195#define S_ABORT_UNKNOWN 5 196#define S_ABORT_NUM 6 197#define S_ABORT_TIMELIM 7 198#define S_ABORT_NODELIM 8 199#define S_ABORT_SOLLIM 9 200#define S_ABORT_LIM 10 201#define S_ABORT_PRIMOBJLIM 11 202#define S_ABORT_DUALOBJLIM 12 203 204 205#ifdef C_TO_COIN 206# define EXTERN_C extern 207#else 208#define EXTERN_C extern "C" 209#endif 210 211EXTERN_C int coin_get_objsen(COINprob * lp); 212EXTERN_C int coin_get_numcols(COINprob* lp); 213EXTERN_C int coin_get_numrows(COINprob* lp); 214EXTERN_C int coin_get_probtype(COINprob* lp); 215EXTERN_C int coin_getrhs(COINprob * lp, double *rhs, int start, int end); 216EXTERN_C int coin_getrowsense(COINprob * lp, char *rsense, int start, int end); 217EXTERN_C int coin_getlb(COINprob * lp, double *lb, int start, int end); 218EXTERN_C int coin_getub(COINprob * lp, double *ub, int start, int end); 219EXTERN_C int coin_getcoltype(COINprob * lp, char *ctype, int start, int end); 220EXTERN_C int coin_chgcoltype(COINprob * lp, int cnt, int *idxs, char *ctype); 221EXTERN_C int coin_chgbds(COINprob * lp, int cnt, int * idxs, char * lu, double *bd); 222EXTERN_C int coin_loadbasis(COINprob * lp, const int *cbase, const int *rbase); 223EXTERN_C int coin_getbasis(COINprob * lp, int *cbase, int *rbase); 224EXTERN_C int coin_get_lpobjval(lp_desc* lp, double * objvalp); 225EXTERN_C int coin_get_mipobjval(COINprob * lp, double * objvalp); 226EXTERN_C int coin_get_bestmipbound(COINprob * lp, double * bound); 227EXTERN_C int coin_get_objcoeffs(COINprob * lp, double *objc, int start, int end); 228EXTERN_C int coin_chg_objcoeffs(COINprob * lp, int cnt, int * idxs, double * values); 229EXTERN_C int coin_get_order(COINprob * lp, int cnt, int * idxs, int * prio, int * direction); 230EXTERN_C int coin_chgqobj(COINprob * lp, int i, int j, double value); 231EXTERN_C int coin_chgrhs(COINprob * lp, int cnt, int * idxs, double * values); 232EXTERN_C int coin_loadprob(COINprob* lp, int mac, int mar, int objsen, double* objx, 233 double* rhsx, char* senx, 234 int * matbeg, int* matcnt, int* matind, double* matval, 235 double* lb, double* ub); 236EXTERN_C int coin_setcoltype(COINprob* lp, char *ctype); 237EXTERN_C int coin_addcols(COINprob* lp, int coladded, int matnz, const double* objx, 238 int* matbeg, const int* matind, const double* matval, 239 const double* bdl, const double* bdu); 240EXTERN_C int coin_addrows(COINprob* lp, const int rowadded, int nzadded, 241 const double* rhsx, const char* senx, 242 int* rmatbeg, int* rmatind, double* rmatval); 243EXTERN_C int coin_chgobjsen(COINprob* lp, int objsen); 244EXTERN_C int coin_get_row(COINprob* lp, int* nnz, int* rmatind, double* rmatval, int idx); 245EXTERN_C int coin_delrows(COINprob* lp, int ndr, int* idx); 246EXTERN_C int coin_delcols(COINprob* lp, int ndr, int* idx); 247EXTERN_C int coin_get_bar_primal_objval(COINprob* lp, double* objval); 248EXTERN_C int coin_get_bar_dual_objval(COINprob* lp, double* objval); 249EXTERN_C state_t coin_get_result_state(lp_desc* lpd); 250EXTERN_C int coin_get_mipcutoff(COINprob* lp, double* bestbound); 251EXTERN_C double coin_infinity(COINprob* lp); 252EXTERN_C int coin_getdblparam(COINprob* lp, int key, double* value); 253EXTERN_C int coin_getintparam(COINprob* lp, int key, int* value); 254EXTERN_C int coin_getstrparam(COINprob* lp, int key, char* value); 255EXTERN_C int coin_setdblparam(COINprob* lp, int key, double value); 256EXTERN_C int coin_setintparam(COINprob* lp, int key, int value); 257EXTERN_C int coin_setstrparam(COINprob* lp, int key, const char* value); 258EXTERN_C int coin_set_qobj(COINprob* lp, int mac, int cb_cnt, int* cb_index, int* 259 cb_index2, double* cb_value); 260EXTERN_C int coin_get_solver_dblparam(COINprob* lp, int key, double* value); 261EXTERN_C int coin_get_solver_intparam(COINprob* lp, int key, int* value); 262EXTERN_C int coin_set_solver_dblparam(COINprob* lp, int key, double value); 263EXTERN_C int coin_set_solver_intparam(COINprob* lp, int key, int value); 264EXTERN_C int coin_get_eplex_strparam(COINprob* lp, int key, char* value); 265EXTERN_C int coin_get_eplex_intparam(COINprob* lp, int key, int* value); 266EXTERN_C int coin_set_eplex_strparam(COINprob* lp, int key, const char* value); 267EXTERN_C int coin_set_eplex_intparam(COINprob* lp, int key, int value); 268EXTERN_C int coin_solve_problem(lp_desc* lpd, 269 int meth, int auxmeth, int node_meth, int node_auxmeth); 270EXTERN_C int cpx_get_soln_state(lp_desc* lpd, struct lp_sol *sol); 271EXTERN_C int coin_set_timeout(COINprob* lp, double timeout); 272EXTERN_C int coin_create_prob(COINprob** lp, COINprob* def); 273EXTERN_C int coin_reset_prob(lp_desc* lpd); 274EXTERN_C int coin_writeprob(COINprob* lp, const char* file, char* otype); 275EXTERN_C int coin_readprob(COINprob* lp, const char* file, char* otype); 276EXTERN_C int coin_getnumnz(COINprob* lp); 277EXTERN_C int coin_getnumint(COINprob* lp); 278EXTERN_C int coin_set_name(COINprob* lp, char ntype, int idx, const char* name); 279EXTERN_C int coin_get_dual_infeas(COINprob* lp, int* infeas); 280EXTERN_C int coin_get_primal_infeas(COINprob* lp, int* infeas); 281EXTERN_C int coin_bar_is_primal_feas(COINprob* lp); 282EXTERN_C int coin_bar_is_dual_feas(COINprob* lp); 283EXTERN_C void coin_get_solver_info(char* info); 284 285