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