Added function _setCoeff().
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);
99 ///\warning Data at index 0 is ignored in the arrays.
100 void LpCplex::_setRowCoeffs(int i,
103 Value const * values )
105 int rowlist[length+1];
107 for (int k=1;k<=length;++k){
110 status = CPXchgcoeflist(env, lp,
113 const_cast<int * >(indices+1),
114 const_cast<Value * >(values+1));
117 void LpCplex::_setColCoeffs(int i,
120 Value const * values)
122 int collist[length+1];
124 for (int k=1;k<=length;++k){
127 status = CPXchgcoeflist(env, lp,
129 const_cast<int * >(indices+1),
131 const_cast<Value * >(values+1));
134 void LpCplex::_setCoeff(int row, int col, Value value)
136 CPXchgcoef (env, lp, row, col, value);
139 void LpCplex::_setColLowerBound(int i, Value value)
147 status = CPXchgbds (env, lp, 1, indices, lu, bd);
151 void LpCplex::_setColUpperBound(int i, Value value)
159 status = CPXchgbds (env, lp, 1, indices, lu, bd);
162 //This will be easier to implement
163 void LpCplex::_setRowBounds(int i, Value lb, Value ub)
166 if (lb==INF || ub==-INF) {
177 CPXchgsense (env, lp, cnt, indices, sense);
178 CPXchgcoef (env, lp, i, -1, ub);
184 CPXchgsense (env, lp, cnt, indices, sense);
185 CPXchgcoef (env, lp, i, -1, lb);
190 CPXchgsense (env, lp, cnt, indices, sense);
191 CPXchgcoef (env, lp, i, -1, lb);
195 CPXchgsense (env, lp, cnt, indices, sense);
196 CPXchgcoef (env, lp, i, -1, lb);
197 CPXchgcoef (env, lp, i, -2, ub-lb);
203 // void LpCplex::_setRowLowerBound(int i, Value value)
205 // //Not implemented, obsolete
208 // void LpCplex::_setRowUpperBound(int i, Value value)
210 // //Not implemented, obsolete
211 // // //TODO Ezt kell meg megirni
212 // // //type of the problem
214 // // status = CPXgetsense (env, lp, sense, i, i);
216 // // status = CPXgetrhs (env, lp, rhs, i, i);
218 // // switch (sense[0]) {
219 // // case 'L'://<= constraint
221 // // case 'E'://= constraint
223 // // case 'G'://>= constraint
225 // // case 'R'://ranged constraint
231 // // status = CPXchgcoef (env, lp, i, -2, value_rng);
234 void LpCplex::_setObjCoeff(int i, Value obj_coef)
236 CPXchgcoef (env, lp, -1, i, obj_coef);
239 void LpCplex::_clearObj()
241 for (int i=0;i< CPXgetnumcols (env, lp);++i){
242 CPXchgcoef (env, lp, -1, i, 0);
247 LpCplex::SolveExitStatus LpCplex::_solve()
250 status = CPXlpopt (env, lp);
257 // int i= lpx_simplex(lp);
267 LpCplex::SolutionStatus LpCplex::_getPrimalStatus()
269 //7.5-os cplex statusai
270 // #define CPX_OPTIMAL 1
271 // #define CPX_INFEASIBLE 2
272 // #define CPX_UNBOUNDED 3
273 // #define CPX_OBJ_LIM 4
274 // #define CPX_IT_LIM_FEAS 5
275 // #define CPX_IT_LIM_INFEAS 6
276 // #define CPX_TIME_LIM_FEAS 7
277 // #define CPX_TIME_LIM_INFEAS 8
278 // #define CPX_NUM_BEST_FEAS 9
279 // #define CPX_NUM_BEST_INFEAS 10
280 // #define CPX_OPTIMAL_INFEAS 11
281 // #define CPX_ABORT_FEAS 12
282 // #define CPX_ABORT_INFEAS 13
283 // #define CPX_ABORT_DUAL_INFEAS 14
284 // #define CPX_ABORT_PRIM_INFEAS 15
285 // #define CPX_ABORT_PRIM_DUAL_INFEAS 16
286 // #define CPX_ABORT_PRIM_DUAL_FEAS 17
287 // #define CPX_ABORT_CROSSOVER 18
288 // #define CPX_INForUNBD 19
289 // #define CPX_PIVOT 20
291 // Ezeket hova tegyem:
292 // ??case CPX_ABORT_DUAL_INFEAS
293 // ??case CPX_ABORT_CROSSOVER
294 // ??case CPX_INForUNBD
297 int stat = CPXgetstat (env, lp);
300 return UNDEFINED; //Undefined
302 case CPX_OPTIMAL://Optimal
305 case CPX_UNBOUNDED://Unbounded
308 case CPX_INFEASIBLE://Infeasible
309 case CPX_IT_LIM_INFEAS:
310 case CPX_TIME_LIM_INFEAS:
311 case CPX_NUM_BEST_INFEAS:
312 case CPX_OPTIMAL_INFEAS:
313 case CPX_ABORT_INFEAS:
314 case CPX_ABORT_PRIM_INFEAS:
315 case CPX_ABORT_PRIM_DUAL_INFEAS:
319 case CPX_IT_LIM_FEAS:
320 case CPX_TIME_LIM_FEAS:
321 case CPX_NUM_BEST_FEAS:
323 case CPX_ABORT_PRIM_DUAL_FEAS:
327 return UNDEFINED; //Everything else comes here
332 //Nem tudom, hanyas cplex verzio statusai
333 // CPX_STAT_ABORT_DUAL_OBJ_LIM
334 // CPX_STAT_ABORT_IT_LIM
335 // CPX_STAT_ABORT_OBJ_LIM
336 // CPX_STAT_ABORT_PRIM_OBJ_LIM
337 // CPX_STAT_ABORT_TIME_LIM
338 // CPX_STAT_ABORT_USER
339 // CPX_STAT_FEASIBLE_RELAXED
340 // CPX_STAT_INFEASIBLE
341 // CPX_STAT_INForUNBD
344 // CPX_STAT_OPTIMAL_FACE_UNBOUNDED
345 // CPX_STAT_OPTIMAL_INFEAS
346 // CPX_STAT_OPTIMAL_RELAXED
347 // CPX_STAT_UNBOUNDED
349 // int stat = CPXgetstat (env, lp);
351 // case CPX_STAT_OPTIMAL://Optimal
354 // case CPX_STAT_INFEASIBLE://Infeasible
355 // return INFEASIBLE;
357 // case CPX_STAT_UNBOUNDED://Unbounded
360 // case CPX_STAT_NUM_BEST://Feasible
364 // return UNDEFINED; //Everything else comes here
370 LpCplex::Value LpCplex::_getPrimal(int i)
373 CPXgetx (env, lp, &x, i, i);
377 LpCplex::Value LpCplex::_getPrimalValue()
380 //method = CPXgetmethod (env, lp);
381 status = CPXgetobjval (env, lp, &objval);
388 void LpCplex::_setMax()
390 CPXchgobjsen (env, lp, CPX_MAX);
392 void LpCplex::_setMin()
394 CPXchgobjsen (env, lp, CPX_MIN);