[Lemon-commits] [lemon_svn] athos: r1938 - hugo/trunk/lemon
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 20:48:55 CET 2006
Author: athos
Date: Thu Jun 9 11:49:48 2005
New Revision: 1938
Modified:
hugo/trunk/lemon/lp_base.h
hugo/trunk/lemon/lp_cplex.cc
hugo/trunk/lemon/lp_glpk.cc
Log:
Not ready, but I commit it for simplicity.
Modified: hugo/trunk/lemon/lp_base.h
==============================================================================
--- hugo/trunk/lemon/lp_base.h (original)
+++ hugo/trunk/lemon/lp_base.h Thu Jun 9 11:49:48 2005
@@ -108,11 +108,13 @@
public:
- ///\e
+ ///Possible outcomes of an LP solving procedure
enum SolveExitStatus {
- ///\e
+ ///This means that the problem has been successfully solved: either
+ ///an optimal solution has been found or infeasibility/unboundedness
+ ///has been proved.
SOLVED = 0,
- ///\e
+ ///Any other case (including the case when some user specified limit has been exceeded)
UNSOLVED = 1
};
@@ -915,7 +917,11 @@
///@{
- ///\e
+ ///\e Solve the LP problem at hand
+ ///
+ ///\return The result of the optimization procedure. Possible values and their meanings can be found in the documentation of \ref SolveExitStatus.
+ ///
+ ///\todo Which method is used to solve the problem
SolveExitStatus solve() { return _solve(); }
///@}
@@ -924,7 +930,7 @@
///@{
- ///\e
+ ///\e
SolutionStatus primalStatus() {
return _getPrimalStatus();
}
Modified: hugo/trunk/lemon/lp_cplex.cc
==============================================================================
--- hugo/trunk/lemon/lp_cplex.cc (original)
+++ hugo/trunk/lemon/lp_cplex.cc Thu Jun 9 11:49:48 2005
@@ -25,7 +25,6 @@
// env = CPXopenCPLEXdevelop(&status);
env = CPXopenCPLEX(&status);
lp = CPXcreateprob(env, &status, "LP problem");
- //CPXmsg (cpxresults, "Hello-bello\n");
}
LpCplex::~LpCplex() {
@@ -230,93 +229,123 @@
}
}
-
+ // The routine returns zero unless an error occurred during the
+ // optimization. Examples of errors include exhausting available
+ // memory (CPXERR_NO_MEMORY) or encountering invalid data in the
+ // CPLEX problem object (CPXERR_NO_PROBLEM). Exceeding a
+ // user-specified CPLEX limit, or proving the model infeasible or
+ // unbounded, are not considered errors. Note that a zero return
+ // value does not necessarily mean that a solution exists. Use query
+ // routines CPXsolninfo, CPXgetstat, and CPXsolution to obtain
+ // further information about the status of the optimization.
LpCplex::SolveExitStatus LpCplex::_solve()
{
-
+ //CPX_PARAM_LPMETHOD
status = CPXlpopt (env, lp);
if (status == 0){
- return SOLVED;
+ //We want to exclude some cases
+ switch (CPXgetstat (env, lp)){
+ case CPX_OBJ_LIM:
+ case CPX_IT_LIM_FEAS:
+ case CPX_IT_LIM_INFEAS:
+ case CPX_TIME_LIM_FEAS:
+ case CPX_TIME_LIM_INFEAS:
+ return UNSOLVED;
+ default:
+ return SOLVED;
+ }
}
else{
return UNSOLVED;
}
-// int i= lpx_simplex(lp);
-// switch (i) {
-// case LPX_E_OK:
-// return SOLVED;
-// break;
-// default:
-// return UNSOLVED;
-// }
}
- LpCplex::SolutionStatus LpCplex::_getPrimalStatus()
- {
-//7.5-os cplex statusai
-// #define CPX_OPTIMAL 1
-// #define CPX_INFEASIBLE 2
-// #define CPX_UNBOUNDED 3
-// #define CPX_OBJ_LIM 4
-// #define CPX_IT_LIM_FEAS 5
-// #define CPX_IT_LIM_INFEAS 6
-// #define CPX_TIME_LIM_FEAS 7
-// #define CPX_TIME_LIM_INFEAS 8
-// #define CPX_NUM_BEST_FEAS 9
-// #define CPX_NUM_BEST_INFEAS 10
-// #define CPX_OPTIMAL_INFEAS 11
-// #define CPX_ABORT_FEAS 12
-// #define CPX_ABORT_INFEAS 13
-// #define CPX_ABORT_DUAL_INFEAS 14
-// #define CPX_ABORT_PRIM_INFEAS 15
-// #define CPX_ABORT_PRIM_DUAL_INFEAS 16
-// #define CPX_ABORT_PRIM_DUAL_FEAS 17
-// #define CPX_ABORT_CROSSOVER 18
-// #define CPX_INForUNBD 19
-// #define CPX_PIVOT 20
+//7.5-os cplex statusai (Vigyazat: a 9.0-asei masok!)
+// This table lists the statuses, returned by the CPXgetstat() routine, for solutions to LP problems or mixed integer problems. If no solution exists, the return value is zero.
+
+// For Simplex, Barrier
+// 1 CPX_OPTIMAL
+// Optimal solution found
+// 2 CPX_INFEASIBLE
+// Problem infeasible
+// 3 CPX_UNBOUNDED
+// Problem unbounded
+// 4 CPX_OBJ_LIM
+// Objective limit exceeded in Phase II
+// 5 CPX_IT_LIM_FEAS
+// Iteration limit exceeded in Phase II
+// 6 CPX_IT_LIM_INFEAS
+// Iteration limit exceeded in Phase I
+// 7 CPX_TIME_LIM_FEAS
+// Time limit exceeded in Phase II
+// 8 CPX_TIME_LIM_INFEAS
+// Time limit exceeded in Phase I
+// 9 CPX_NUM_BEST_FEAS
+// Problem non-optimal, singularities in Phase II
+// 10 CPX_NUM_BEST_INFEAS
+// Problem non-optimal, singularities in Phase I
+// 11 CPX_OPTIMAL_INFEAS
+// Optimal solution found, unscaled infeasibilities
+// 12 CPX_ABORT_FEAS
+// Aborted in Phase II
+// 13 CPX_ABORT_INFEAS
+// Aborted in Phase I
+// 14 CPX_ABORT_DUAL_INFEAS
+// Aborted in barrier, dual infeasible
+// 15 CPX_ABORT_PRIM_INFEAS
+// Aborted in barrier, primal infeasible
+// 16 CPX_ABORT_PRIM_DUAL_INFEAS
+// Aborted in barrier, primal and dual infeasible
+// 17 CPX_ABORT_PRIM_DUAL_FEAS
+// Aborted in barrier, primal and dual feasible
+// 18 CPX_ABORT_CROSSOVER
+// Aborted in crossover
+// 19 CPX_INForUNBD
+// Infeasible or unbounded
+// 20 CPX_PIVOT
+// User pivot used
+//
// Ezeket hova tegyem:
// ??case CPX_ABORT_DUAL_INFEAS
// ??case CPX_ABORT_CROSSOVER
// ??case CPX_INForUNBD
// ??case CPX_PIVOT
+ LpCplex::SolutionStatus LpCplex::_getPrimalStatus()
+ {
int stat = CPXgetstat (env, lp);
switch (stat) {
case 0:
return UNDEFINED; //Undefined
- break;
case CPX_OPTIMAL://Optimal
return OPTIMAL;
- break;
case CPX_UNBOUNDED://Unbounded
return INFINITE;
- break;
case CPX_INFEASIBLE://Infeasible
- case CPX_IT_LIM_INFEAS:
- case CPX_TIME_LIM_INFEAS:
- case CPX_NUM_BEST_INFEAS:
- case CPX_OPTIMAL_INFEAS:
- case CPX_ABORT_INFEAS:
- case CPX_ABORT_PRIM_INFEAS:
- case CPX_ABORT_PRIM_DUAL_INFEAS:
+ // case CPX_IT_LIM_INFEAS:
+// case CPX_TIME_LIM_INFEAS:
+// case CPX_NUM_BEST_INFEAS:
+// case CPX_OPTIMAL_INFEAS:
+// case CPX_ABORT_INFEAS:
+// case CPX_ABORT_PRIM_INFEAS:
+// case CPX_ABORT_PRIM_DUAL_INFEAS:
return INFEASIBLE;
- break;
- case CPX_OBJ_LIM:
- case CPX_IT_LIM_FEAS:
- case CPX_TIME_LIM_FEAS:
- case CPX_NUM_BEST_FEAS:
- case CPX_ABORT_FEAS:
- case CPX_ABORT_PRIM_DUAL_FEAS:
- return FEASIBLE;
- break;
+// case CPX_OBJ_LIM:
+// case CPX_IT_LIM_FEAS:
+// case CPX_TIME_LIM_FEAS:
+// case CPX_NUM_BEST_FEAS:
+// case CPX_ABORT_FEAS:
+// case CPX_ABORT_PRIM_DUAL_FEAS:
+// return FEASIBLE;
default:
return UNDEFINED; //Everything else comes here
//FIXME error
}
+ }
- //Nem tudom, hanyas cplex verzio statusai
+//9.0-as cplex verzio statusai
// CPX_STAT_ABORT_DUAL_OBJ_LIM
// CPX_STAT_ABORT_IT_LIM
// CPX_STAT_ABORT_OBJ_LIM
@@ -333,26 +362,20 @@
// CPX_STAT_OPTIMAL_RELAXED
// CPX_STAT_UNBOUNDED
-// int stat = CPXgetstat (env, lp);
-// switch (stat) {
-// case CPX_STAT_OPTIMAL://Optimal
-// return OPTIMAL;
-// break;
-// case CPX_STAT_INFEASIBLE://Infeasible
-// return INFEASIBLE;
-// break;
-// case CPX_STAT_UNBOUNDED://Unbounded
-// return INFINITE;
-// break;
-// case CPX_STAT_NUM_BEST://Feasible
-// return FEASIBLE;
-// break;
-// default:
-// return UNDEFINED; //Everything else comes here
-// //FIXME error
-// }
-
- }
+ LpCplex::SolutionStatus LpCplex::_getDualStatus()
+ {
+ int stat = CPXgetstat (env, lp);
+ switch (stat) {
+ case 0:
+ return UNDEFINED; //Undefined
+ case CPX_OPTIMAL://Optimal
+ return OPTIMAL;
+ case CPX_UNBOUNDED:
+ return INFEASIBLE;
+ default:
+ return UNDEFINED; //Everything else comes here
+ //FIXME error
+ }
LpCplex::Value LpCplex::_getPrimal(int i)
{
Modified: hugo/trunk/lemon/lp_glpk.cc
==============================================================================
--- hugo/trunk/lemon/lp_glpk.cc (original)
+++ hugo/trunk/lemon/lp_glpk.cc Thu Jun 9 11:49:48 2005
@@ -396,11 +396,10 @@
LpGlpk::SolveExitStatus LpGlpk::_solve()
{
- int i= lpx_simplex(lp);
+ int i = lpx_simplex(lp);
switch (i) {
case LPX_E_OK:
return SOLVED;
- break;
default:
return UNSOLVED;
}
@@ -423,6 +422,54 @@
switch (stat) {
case LPX_UNDEF://Undefined (no solve has been run yet)
return UNDEFINED;
+ case LPX_NOFEAS://There is no feasible solution (primal, I guess)
+ case LPX_INFEAS://Infeasible
+ return INFEASIBLE;
+ case LPX_UNBND://Unbounded
+ return INFINITE;
+ case LPX_FEAS://Feasible
+ return FEASIBLE;
+ case LPX_OPT://Feasible
+ return OPTIMAL;
+ default:
+ return UNDEFINED; //to avoid gcc warning
+ //FIXME error
+ }
+ }
+
+ LpGlpk::SolutionStatus LpGlpk::_getDualStatus()
+ {
+ int stat= lpx_get_dual_stat(lp);
+ switch (stat) {
+ case LPX_D_UNDEF://Undefined (no solve has been run yet)
+ return UNDEFINED;
+ case LPX_D_NOFEAS://There is no feasible solution (primal, I guess)
+ case LPX_D_INFEAS://Infeasible
+ return INFEASIBLE;
+ case LPX_FEAS://Feasible
+ int stat2= lpx_get_prim_stat(lp);
+ switch (stat2){
+ case LPX_P_NOFEAS:
+ return INFINITE;
+ case LPX_OPT:
+ return OPTIMAL;
+ default:
+ return FEASIBLE;
+ }
+ default:
+ return UNDEFINED; //to avoid gcc warning
+ //FIXME error
+ }
+ }
+
+ LpGlpk::ProblemTypes LpGlpk::_problemType()
+ {
+ int stat= lpx_get_status(lp);
+ int statp= lpx_get_prim_stat(lp);
+ int statd= lpx_get_dual_stat(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
@@ -443,7 +490,6 @@
}
}
-
void LpGlpk::_setMax()
{
lpx_set_obj_dir(lp, LPX_MAX);
More information about the Lemon-commits
mailing list