# HG changeset patch # User athos # Date 1112887323 0 # Node ID 6e277ba3fc766f70356c4679ad9a655bb23586c5 # Parent 88edb143a87a2416cd8fb1149448e553b405a7b3 Cplex interface has improved a lot. diff -r 88edb143a87a -r 6e277ba3fc76 src/work/athos/lp/Makefile --- a/src/work/athos/lp/Makefile Thu Apr 07 12:54:35 2005 +0000 +++ b/src/work/athos/lp/Makefile Thu Apr 07 15:22:03 2005 +0000 @@ -1,6 +1,6 @@ CXXFLAGS = -Wall -ggdb --no-inline -I../../.. -I.. -all: lp_sample +all: lp_sample_cplex clean: rm lp_test *.o @@ -9,16 +9,19 @@ $(CXX) $(CXXFLAGS) -o $@ -c $< -lp_solver_skeleton.o: lp_solver_skeleton.cc lp_solver_skeleton.h lp_base.h \ - lin_expr.h +lp_solver_skeleton.o: lp_solver_skeleton.cc lp_solver_skeleton.h lp_base.h $(CXX) $(CXXFLAGS) -o $@ -c $< -lp_glpk.o: ../../../lemon/lp_glpk.cc ../../../lemon/lp_glpk.h ../../../lemon/lp_base.h lin_expr.h +lp_glpk.o: ../../../lemon/lp_glpk.cc ../../../lemon/lp_glpk.h ../../../lemon/lp_base.h $(CXX) $(CXXFLAGS) -o $@ -c $< +lp_cplex.o: lp_cplex.cc lp_cplex.h ../../../lemon/lp_base.h + $(CXX) $(CXXFLAGS) -I/usr/local/cplex/cplex75/include -o $@ -c $< -lp_sample.o: lp_sample.cc +lp_sample.o: lp_sample.cc lp_sample: lp_sample.o lp_base.o lp_glpk.o $(CXX) -o $@ $^ -lglpk +lp_sample_cplex: lp_sample_cplex.o lp_base.o lp_glpk.o + $(CXX) $(CXXFLAGS) -I/usr/local/cplex/cplex75/include -o $@ $^ -L/usr/local/cplex/cplex75/lib/i86_linux2_glibc2.2_gcc3.0/static_pic_mt -lcplex -lm -lpthread diff -r 88edb143a87a -r 6e277ba3fc76 src/work/athos/lp/lp_cplex.cc --- a/src/work/athos/lp/lp_cplex.cc Thu Apr 07 12:54:35 2005 +0000 +++ b/src/work/athos/lp/lp_cplex.cc Thu Apr 07 15:22:03 2005 +0000 @@ -24,7 +24,7 @@ int LpCplex::_addCol() { int i = CPXgetnumcols (env, lp); - int lb[1],ub[1]; + Value lb[1],ub[1]; lb[0]=-INF;//-CPX_INFBOUND; ub[0]=INF;//CPX_INFBOUND; status = CPXnewcols (env, lp, 1, NULL, lb, ub, NULL, NULL); @@ -33,8 +33,12 @@ int LpCplex::_addRow() { + //We want a ranged row + char sense[1]; + sense[0]='R'; + int i = CPXgetnumrows (env, lp); - status = CPXnewrows (env, lp, 1, NULL, NULL, NULL, NULL, NULL); + status = CPXnewrows (env, lp, 1, NULL, sense, NULL, NULL); return i; } @@ -45,14 +49,15 @@ Value const * values ) { int rowlist[length+1]; + int* p=rowlist; for (int k=1;k<=length;++k){ rowlist[k]=i; } status = CPXchgcoeflist(env, lp, length, - rowlist++, - inices++, - values++); + p++, + const_cast(indices++), + const_cast(values++)); } void LpCplex::_setColCoeffs(int i, @@ -61,45 +66,117 @@ Value const * values) { int collist[length+1]; + int* p=collist; for (int k=1;k<=length;++k){ collist[k]=i; } status = CPXchgcoeflist(env, lp, length, - inices++, - collist++, - values++); + const_cast(indices++), + p++, + const_cast(values++)); } void LpCplex::_setColLowerBound(int i, Value value) { + int indices[1]; + indices[0]=i; + char lu[1]; + lu[0]='L'; + Value bd[1]; + bd[0]=value; + status = CPXchgbds (env, lp, 1, indices, lu, bd); + } void LpCplex::_setColUpperBound(int i, Value value) { + int indices[1]; + indices[0]=i; + char lu[1]; + lu[0]='U'; + Value bd[1]; + bd[0]=value; + status = CPXchgbds (env, lp, 1, indices, lu, bd); } void LpCplex::_setRowLowerBound(int i, Value value) { + status = CPXchgcoef (env, lp, i, -1, value); + } void LpCplex::_setRowUpperBound(int i, Value value) { + //TODO Ezt kell meg megirni + // Value lo=CPX } void LpCplex::_setObjCoeff(int i, Value obj_coef) { + status = CPXchgcoef (env, lp, -1, i, obj_coef); + } + + LpCplex::SolveExitStatus LpCplex::_solve() + { + return SOLVED; +// int i= lpx_simplex(lp); +// switch (i) { +// case LPX_E_OK: +// return SOLVED; +// break; +// default: +// return UNSOLVED; +// } } - LpCplex::SolutionStatus LpCplex::_solve() - { - return OPTIMAL; - } - - LpCplex::Value LpCplex::_getSolution(int i) + LpCplex::Value LpCplex::_getPrimal(int i) { return 0; } + LpCplex::Value LpCplex::_getPrimalValue() + { + return 0; + } + + + LpCplex::SolutionStatus LpCplex::_getPrimalStatus() + { + return OPTIMAL; +// int stat= lpx_get_status(lp); +// switch (stat) { +// case LPX_UNDEF://Undefined (no solve has been run yet) +// return UNDEFINED; +// break; +// case LPX_NOFEAS://There is no feasible solution (primal, I guess) +// case LPX_INFEAS://Infeasible +// return INFEASIBLE; +// break; +// case LPX_UNBND://Unbounded +// return INFINITE; +// break; +// case LPX_FEAS://Feasible +// return FEASIBLE; +// break; +// case LPX_OPT://Feasible +// return OPTIMAL; +// break; +// default: +// return UNDEFINED; //to avoid gcc warning +// //FIXME error +// } + } + + + void LpCplex::_setMax() + { + CPXchgobjsen (env, lp, CPX_MAX); + } + void LpCplex::_setMin() + { + CPXchgobjsen (env, lp, CPX_MIN); + } + } //namespace lemon diff -r 88edb143a87a -r 6e277ba3fc76 src/work/athos/lp/lp_cplex.h --- a/src/work/athos/lp/lp_cplex.h Thu Apr 07 12:54:35 2005 +0000 +++ b/src/work/athos/lp/lp_cplex.h Thu Apr 07 15:22:03 2005 +0000 @@ -20,7 +20,7 @@ ///\file ///\brief Header of the LEMON-CPLEX lp solver interface. -#include "lp_base.h" +#include extern "C" { #include "ilcplex/cplex.h" } @@ -108,12 +108,33 @@ ///\bug Unimplemented /// - virtual SolutionStatus _solve(); + virtual SolveExitStatus _solve(); + ///\e + + ///\bug Unimplemented + /// + virtual Value _getPrimal(int i); ///\e ///\bug Unimplemented /// - virtual Value _getSolution(int i); + virtual Value _getPrimalValue(); + ///\e + + ///\bug Unimplemented + /// + virtual SolutionStatus _getPrimalStatus(); + + ///\e + + ///\bug Unimplemented + /// + virtual void _setMax(); + ///\e + + ///\bug Unimplemented + /// + virtual void _setMin(); }; } //END OF NAMESPACE LEMON