2 * src/lemon/lp_cplex.cc
3 * - Part of LEMON, a generic C++ optimization library
5 * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
6 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 * Permission to use, modify and distribute this software is granted
9 * provided that this copyright notice appears in all copies. For
10 * precise terms see the accompanying LICENSE file.
12 * This software is provided "AS IS" with no warranty of any kind,
13 * express or implied, and with no claim as to its suitability for any
18 #include<lemon/lp_cplex.h>
21 ///\brief Implementation of the LEMON-CPLEX lp solver interface.
24 LpCplex::LpCplex() : LpSolverBase() {
27 env = CPXopenCPLEXdevelop(&status);
30 // fprintf(stderr,"A CPLEX környezet megnyitása sikertelen.\n");
31 // CPXgeterrorstring(Env, Status, ErrorMsg);
32 // fprintf(stderr,"%s",ErrorMsg);
36 // *** A problema létrehozása ***
37 lp = CPXcreateprob(env, &status, "LP problem");
39 // if (Problem == NULL)
41 // fprintf(stderr,"Az LP létrehozása sikertelen");
48 status = CPXfreeprob(env,&lp);
51 // fprintf(stderr,"A CPLEX feladat törlése sikertelen.\n");
52 // CPXgeterrorstring(Env, Status, ErrorMsg);
53 // fprintf(stderr,"%s",ErrorMsg);
57 status = CPXcloseCPLEX(&env);
60 // fprintf(stderr,"A CPLEX környezet bezárása sikertelen.\n");
61 // CPXgeterrorstring(Env, Status, ErrorMsg);
62 // fprintf(stderr,"%s",ErrorMsg);
68 LpSolverBase &LpCplex::_newLp()
70 return *(LpSolverBase*)0;
72 LpSolverBase &LpCplex::_copyLp() {
73 return *(LpSolverBase*)0;
74 //Ez lesz majd CPXcloneprob (env, lp, &status);
77 int LpCplex::_addCol()
79 int i = CPXgetnumcols (env, lp);
81 lb[0]=-INF;//-CPX_INFBOUND;
82 ub[0]=INF;//CPX_INFBOUND;
83 status = CPXnewcols (env, lp, 1, NULL, lb, ub, NULL, NULL);
87 int LpCplex::_addRow()
89 //We want a row that is not constrained
91 sense[0]='L';//<= constraint
94 int i = CPXgetnumrows (env, lp);
95 status = CPXnewrows (env, lp, 1, rhs, sense, NULL, NULL);
100 void LpCplex::_eraseCol(int i) {
101 ///\todo Not implemented yet
104 void LpCplex::_eraseRow(int i) {
105 ///\todo Not implemented yet
109 ///\warning Data at index 0 is ignored in the arrays.
110 void LpCplex::_setRowCoeffs(int i,
113 Value const * values )
115 int rowlist[length+1];
117 for (int k=1;k<=length;++k){
120 status = CPXchgcoeflist(env, lp,
123 const_cast<int * >(indices+1),
124 const_cast<Value * >(values+1));
127 void LpCplex::_setColCoeffs(int i,
130 Value const * values)
132 int collist[length+1];
134 for (int k=1;k<=length;++k){
137 status = CPXchgcoeflist(env, lp,
139 const_cast<int * >(indices+1),
141 const_cast<Value * >(values+1));
144 void LpCplex::_setCoeff(int row, int col, Value value)
146 CPXchgcoef (env, lp, row, col, value);
149 void LpCplex::_setColLowerBound(int i, Value value)
157 status = CPXchgbds (env, lp, 1, indices, lu, bd);
161 void LpCplex::_setColUpperBound(int i, Value value)
169 status = CPXchgbds (env, lp, 1, indices, lu, bd);
172 //This will be easier to implement
173 void LpCplex::_setRowBounds(int i, Value lb, Value ub)
176 if (lb==INF || ub==-INF) {
187 CPXchgsense (env, lp, cnt, indices, sense);
188 CPXchgcoef (env, lp, i, -1, ub);
194 CPXchgsense (env, lp, cnt, indices, sense);
195 CPXchgcoef (env, lp, i, -1, lb);
200 CPXchgsense (env, lp, cnt, indices, sense);
201 CPXchgcoef (env, lp, i, -1, lb);
205 CPXchgsense (env, lp, cnt, indices, sense);
206 CPXchgcoef (env, lp, i, -1, lb);
207 CPXchgcoef (env, lp, i, -2, ub-lb);
213 // void LpCplex::_setRowLowerBound(int i, Value value)
215 // //Not implemented, obsolete
218 // void LpCplex::_setRowUpperBound(int i, Value value)
220 // //Not implemented, obsolete
221 // // //TODO Ezt kell meg megirni
222 // // //type of the problem
224 // // status = CPXgetsense (env, lp, sense, i, i);
226 // // status = CPXgetrhs (env, lp, rhs, i, i);
228 // // switch (sense[0]) {
229 // // case 'L'://<= constraint
231 // // case 'E'://= constraint
233 // // case 'G'://>= constraint
235 // // case 'R'://ranged constraint
241 // // status = CPXchgcoef (env, lp, i, -2, value_rng);
244 void LpCplex::_setObjCoeff(int i, Value obj_coef)
246 CPXchgcoef (env, lp, -1, i, obj_coef);
249 void LpCplex::_clearObj()
251 for (int i=0;i< CPXgetnumcols (env, lp);++i){
252 CPXchgcoef (env, lp, -1, i, 0);
257 LpCplex::SolveExitStatus LpCplex::_solve()
260 status = CPXlpopt (env, lp);
267 // int i= lpx_simplex(lp);
277 LpCplex::SolutionStatus LpCplex::_getPrimalStatus()
279 //7.5-os cplex statusai
280 // #define CPX_OPTIMAL 1
281 // #define CPX_INFEASIBLE 2
282 // #define CPX_UNBOUNDED 3
283 // #define CPX_OBJ_LIM 4
284 // #define CPX_IT_LIM_FEAS 5
285 // #define CPX_IT_LIM_INFEAS 6
286 // #define CPX_TIME_LIM_FEAS 7
287 // #define CPX_TIME_LIM_INFEAS 8
288 // #define CPX_NUM_BEST_FEAS 9
289 // #define CPX_NUM_BEST_INFEAS 10
290 // #define CPX_OPTIMAL_INFEAS 11
291 // #define CPX_ABORT_FEAS 12
292 // #define CPX_ABORT_INFEAS 13
293 // #define CPX_ABORT_DUAL_INFEAS 14
294 // #define CPX_ABORT_PRIM_INFEAS 15
295 // #define CPX_ABORT_PRIM_DUAL_INFEAS 16
296 // #define CPX_ABORT_PRIM_DUAL_FEAS 17
297 // #define CPX_ABORT_CROSSOVER 18
298 // #define CPX_INForUNBD 19
299 // #define CPX_PIVOT 20
301 // Ezeket hova tegyem:
302 // ??case CPX_ABORT_DUAL_INFEAS
303 // ??case CPX_ABORT_CROSSOVER
304 // ??case CPX_INForUNBD
307 int stat = CPXgetstat (env, lp);
310 return UNDEFINED; //Undefined
312 case CPX_OPTIMAL://Optimal
315 case CPX_UNBOUNDED://Unbounded
318 case CPX_INFEASIBLE://Infeasible
319 case CPX_IT_LIM_INFEAS:
320 case CPX_TIME_LIM_INFEAS:
321 case CPX_NUM_BEST_INFEAS:
322 case CPX_OPTIMAL_INFEAS:
323 case CPX_ABORT_INFEAS:
324 case CPX_ABORT_PRIM_INFEAS:
325 case CPX_ABORT_PRIM_DUAL_INFEAS:
329 case CPX_IT_LIM_FEAS:
330 case CPX_TIME_LIM_FEAS:
331 case CPX_NUM_BEST_FEAS:
333 case CPX_ABORT_PRIM_DUAL_FEAS:
337 return UNDEFINED; //Everything else comes here
342 //Nem tudom, hanyas cplex verzio statusai
343 // CPX_STAT_ABORT_DUAL_OBJ_LIM
344 // CPX_STAT_ABORT_IT_LIM
345 // CPX_STAT_ABORT_OBJ_LIM
346 // CPX_STAT_ABORT_PRIM_OBJ_LIM
347 // CPX_STAT_ABORT_TIME_LIM
348 // CPX_STAT_ABORT_USER
349 // CPX_STAT_FEASIBLE_RELAXED
350 // CPX_STAT_INFEASIBLE
351 // CPX_STAT_INForUNBD
354 // CPX_STAT_OPTIMAL_FACE_UNBOUNDED
355 // CPX_STAT_OPTIMAL_INFEAS
356 // CPX_STAT_OPTIMAL_RELAXED
357 // CPX_STAT_UNBOUNDED
359 // int stat = CPXgetstat (env, lp);
361 // case CPX_STAT_OPTIMAL://Optimal
364 // case CPX_STAT_INFEASIBLE://Infeasible
365 // return INFEASIBLE;
367 // case CPX_STAT_UNBOUNDED://Unbounded
370 // case CPX_STAT_NUM_BEST://Feasible
374 // return UNDEFINED; //Everything else comes here
380 LpCplex::Value LpCplex::_getPrimal(int i)
383 CPXgetx (env, lp, &x, i, i);
387 LpCplex::Value LpCplex::_getPrimalValue()
390 //method = CPXgetmethod (env, lp);
391 status = CPXgetobjval (env, lp, &objval);
398 void LpCplex::_setMax()
400 CPXchgobjsen (env, lp, CPX_MAX);
402 void LpCplex::_setMin()
404 CPXchgobjsen (env, lp, CPX_MIN);