[Lemon-commits] [lemon_svn] marci: r1477 - hugo/trunk/src/work/marci/lp
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 20:45:45 CET 2006
Author: marci
Date: Fri Jan 14 14:17:16 2005
New Revision: 1477
Modified:
hugo/trunk/src/work/marci/lp/lp_solver_wrapper_3.h
hugo/trunk/src/work/marci/lp/min_cost_gen_flow.h
Log:
more precise distinction 'tween low and high level lp interfaces
Modified: hugo/trunk/src/work/marci/lp/lp_solver_wrapper_3.h
==============================================================================
--- hugo/trunk/src/work/marci/lp/lp_solver_wrapper_3.h (original)
+++ hugo/trunk/src/work/marci/lp/lp_solver_wrapper_3.h Fri Jan 14 14:17:16 2005
@@ -36,7 +36,6 @@
using std::endl;
namespace lemon {
-
/// \addtogroup misc
/// @{
@@ -184,15 +183,54 @@
VALID_CLASS(0), INVALID_CLASS(1) { }
/// \e
virtual ~LPSolverBase() { }
+
+ //MATRIX INDEPEDENT MANIPULATING FUNCTIONS
+
+ public:
/// \e
virtual void setMinimize() = 0;
/// \e
virtual void setMaximize() = 0;
+
+ //LOW LEVEL INTERFACE, MATRIX MANIPULATING FUNCTIONS
+
protected:
/// \e
virtual int _addRow() = 0;
/// \e
virtual int _addCol() = 0;
+ /// \e
+ virtual void _setRowCoeffs(int i,
+ std::vector<std::pair<int, double> > coeffs) = 0;
+ /// \e
+ virtual void _setColCoeffs(int i,
+ std::vector<std::pair<int, double> > coeffs) = 0;
+ /// \e
+ virtual void _eraseCol(int i) = 0;
+ /// \e
+ virtual void _eraseRow(int i) = 0;
+ public:
+ /// \e
+ enum Bound { FREE, LOWER, UPPER, DOUBLE, FIXED };
+ protected:
+ /// \e
+ virtual void _setColBounds(int i, Bound bound,
+ _Value lo, _Value up) = 0;
+ /// \e
+ virtual void _setRowBounds(int i, Bound bound,
+ _Value lo, _Value up) = 0;
+ /// \e
+ virtual void _setObjCoef(int i, _Value obj_coef) = 0;
+ /// \e
+ virtual _Value _getObjCoef(int i) = 0;
+
+ //LOW LEVEL, SOLUTION RETRIEVING FUNCTIONS
+
+ protected:
+ virtual _Value _getPrimal(int i) = 0;
+
+ //HIGH LEVEL INTERFACE, MATRIX MANIPULATING FUNTIONS
+
public:
/// \e
RowIt addRow() {
@@ -221,12 +259,6 @@
return col_it;
}
/// \e
- virtual void setRowCoeffs(int i,
- std::vector<std::pair<int, double> > coeffs) = 0;
- /// \e
- virtual void setColCoeffs(int i,
- std::vector<std::pair<int, double> > coeffs) = 0;
- /// \e
template <typename Begin, typename End>
void setRowCoeffs(RowIt row_it, Begin begin, End end) {
std::vector<std::pair<int, double> > coeffs;
@@ -234,7 +266,7 @@
coeffs.push_back(std::
make_pair(col_iter_map[begin->first], begin->second));
}
- setRowCoeffs(row_iter_map[row_it], coeffs);
+ _setRowCoeffs(row_iter_map[row_it], coeffs);
}
/// \e
template <typename Begin, typename End>
@@ -244,57 +276,8 @@
coeffs.push_back(std::
make_pair(row_iter_map[begin->first], begin->second));
}
- setColCoeffs(col_iter_map[col_it], coeffs);
+ _setColCoeffs(col_iter_map[col_it], coeffs);
}
- /// temporally, glpk style indexing
- //virtual void setRowCoeffs(RowIt row_it, int num,
- // int* indices, _Value* doubles) = 0;
- //pair<RowIt, _Value>-bol kell megadni egy std range-et
- /// \e
- // virtual void seColCoeffs(int i,
- // std::vector<std::pair<int, double> > coeffs) = 0;
- /// \e
-// template <typename Begin, typename End>
-// void setRowCoeffs(RowIt row_it, Begin begin, End end) {
-// int mem_length=1+colNum();
-// int* indices = new int[mem_length];
-// _Value* doubles = new _Value[mem_length];
-// int length=0;
-// for ( ; begin!=end; ++begin) {
-// ++length;
-// indices[length]=col_iter_map[begin->first];
-// doubles[length]=begin->second;
-// }
-// setRowCoeffs(row_it, length, indices, doubles);
-// delete [] indices;
-// delete [] doubles;
-// }
- /// temporally, glpk style indexing
- //virtual void setColCoeffs(ColIt col_it, int num,
- // int* indices, _Value* doubles) = 0;
- //pair<ColIt, _Value>-bol kell megadni egy std range-et
- /// \e
-// template <typename Begin, typename End>
-// void setColCoeffs(ColIt col_it, Begin begin, End end) {
-// int mem_length=1+rowNum();
-// int* indices = new int[mem_length];
-// _Value* doubles = new _Value[mem_length];
-// int length=0;
-// for ( ; begin!=end; ++begin) {
-// ++length;
-// indices[length]=row_iter_map[begin->first];
-// doubles[length]=begin->second;
-// }
-// setColCoeffs(col_it, length, indices, doubles);
-// delete [] indices;
-// delete [] doubles;
-// }
- protected:
- /// \e
- virtual void _eraseCol(int i) = 0;
- /// \e
- virtual void _eraseRow(int i) = 0;
- public:
/// \e
void eraseCol(const ColIt& col_it) {
col_iter_map.set(col_it, VALID_CLASS, INVALID_CLASS);
@@ -322,15 +305,26 @@
}
}
/// \e
- virtual void setColBounds(const ColIt& col_it, int bound_type,
- _Value lo, _Value up) =0;
+ void setColBounds(const ColIt& col_it, Bound bound,
+ _Value lo, _Value up) {
+ _setColBounds(col_iter_map[col_it], bound, lo, up);
+ }
/// \e
- virtual _Value getObjCoef(const ColIt& col_it) = 0;
+ void setRowBounds(const RowIt& row_it, Bound bound,
+ _Value lo, _Value up) {
+ _setRowBounds(row_iter_map[row_it], bound, lo, up);
+ }
/// \e
- virtual void setRowBounds(const RowIt& row_it, int bound_type,
- _Value lo, _Value up) = 0;
+ void setObjCoef(const ColIt& col_it, _Value obj_coef) {
+ _setObjCoef(col_iter_map[col_it], obj_coef);
+ }
/// \e
- virtual void setObjCoef(const ColIt& col_it, _Value obj_coef) = 0;
+ _Value getObjCoef(const ColIt& col_it) {
+ return _getObjCoef(col_iter_map[col_it]);
+ }
+
+ //SOLVER FUNCTIONS
+
/// \e
virtual void solveSimplex() = 0;
/// \e
@@ -338,9 +332,18 @@
/// \e
virtual void solveDualSimplex() = 0;
/// \e
- virtual _Value getPrimal(const ColIt& col_it) = 0;
+
+ //HIGH LEVEL, SOLUTION RETRIEVING FUNCTIONS
+
+ public:
+ _Value getPrimal(const ColIt& col_it) {
+ return _getPrimal(col_iter_map[col_it]);
+ }
/// \e
virtual _Value getObjVal() = 0;
+
+ //OTHER FUNCTIONS
+
/// \e
virtual int rowNum() const = 0;
/// \e
@@ -375,7 +378,7 @@
/// The aim of this class is to give a general surface to different
/// solvers, i.e. it makes possible to write algorithms using LP's,
/// in which the solver can be changed to an other one easily.
- class LPSolverWrapper : public LPSolverBase<double> {
+ class LPGLPK : public LPSolverBase<double> {
public:
typedef LPSolverBase<double> Parent;
@@ -385,14 +388,17 @@
public:
/// \e
- LPSolverWrapper() : Parent(),
+ LPGLPK() : Parent(),
lp(lpx_create_prob()) {
lpx_set_int_parm(lp, LPX_K_DUAL, 1);
}
/// \e
- ~LPSolverWrapper() {
+ ~LPGLPK() {
lpx_delete_prob(lp);
}
+
+ //MATRIX INDEPEDENT MANIPULATING FUNCTIONS
+
/// \e
void setMinimize() {
lpx_set_obj_dir(lp, LPX_MIN);
@@ -401,6 +407,9 @@
void setMaximize() {
lpx_set_obj_dir(lp, LPX_MAX);
}
+
+ //LOW LEVEL INTERFACE, MATRIX MANIPULATING FUNCTIONS
+
protected:
/// \e
int _addCol() {
@@ -410,11 +419,9 @@
int _addRow() {
return lpx_add_rows(lp, 1);
}
- public:
- using Parent::setRowCoeffs;
/// \e
- virtual void setRowCoeffs(int i,
- std::vector<std::pair<int, double> > coeffs) {
+ virtual void _setRowCoeffs(int i,
+ std::vector<std::pair<int, double> > coeffs) {
int mem_length=1+colNum();
int* indices = new int[mem_length];
double* doubles = new double[mem_length];
@@ -424,17 +431,17 @@
++length;
indices[length]=it->first;
doubles[length]=it->second;
- std::cout << " " << indices[length] << " "
- << doubles[length] << std::endl;
+// std::cout << " " << indices[length] << " "
+// << doubles[length] << std::endl;
}
- std::cout << i << " " << length << std::endl;
+// std::cout << i << " " << length << std::endl;
lpx_set_mat_row(lp, i, length, indices, doubles);
delete [] indices;
delete [] doubles;
}
/// \e
- virtual void setColCoeffs(int i,
- std::vector<std::pair<int, double> > coeffs) {
+ virtual void _setColCoeffs(int i,
+ std::vector<std::pair<int, double> > coeffs) {
int mem_length=1+rowNum();
int* indices = new int[mem_length];
double* doubles = new double[mem_length];
@@ -449,74 +456,7 @@
delete [] indices;
delete [] doubles;
}
-// /// \e
-// /// temporally, glpk style indexing
-// virtual void setRowCoeffs(RowIt row_it, int num,
-// int* indices, _Value* doubles) = 0;
-// //pair<RowIt, _Value>-bol kell megadni egy std range-et
-// /// \e
-// template <typename Begin, typename End>
-// void setRowCoeffs(RowIt row_it, Begin begin, End end) {
-// int mem_length=1+colNum();
-// int* indices = new int[mem_length];
-// _Value* doubles = new _Value[mem_length];
-// int length=0;
-// for ( ; begin!=end; ++begin) {
-// ++length;
-// indices[length]=col_iter_map[begin->first];
-// doubles[length]=begin->second;
-// }
-// setRowCoeffs(row_it, length, indices, doubles);
-// delete [] indices;
-// delete [] doubles;
-// }
-// void setRowCoeffs(RowIt row_it, int length,
-// int* indices, double* doubles) {
-// lpx_set_mat_row(lp, row_iter_map[row_it], length, indices, doubles);
-// }
-// using Parent::setColCoeffs;
-// void setColCoeffs(ColIt col_it, int length,
-// int* indices, double* doubles) {
-// lpx_set_mat_col(lp, col_iter_map[col_it], length, indices, doubles);
-// }
- // //pair<RowIt, double>-bol kell megadni egy std range-et
- // /// \e
- // template <typename Begin, typename End>
- // void setColCoeffs(const ColIt& col_it,
- // Begin begin, End end) {
- // int mem_length=1+lpx_get_num_rows(lp);
- // int* indices = new int[mem_length];
- // double* doubles = new double[mem_length];
- // int length=0;
- // for ( ; begin!=end; ++begin) {
- // ++length;
- // indices[length]=row_iter_map[begin->first];
- // doubles[length]=begin->second;
- // }
- // lpx_set_mat_col(lp, col_iter_map[col_it], length, indices, doubles);
- // delete [] indices;
- // delete [] doubles;
- // }
- // //pair<ColIt, double>-bol kell megadni egy std range-et
- // /// \e
- // template <typename Begin, typename End>
- // void setRowCoeffs(const RowIt& row_it,
- // Begin begin, End end) {
- // int mem_length=1+lpx_get_num_cols(lp);
- // int* indices = new int[mem_length];
- // double* doubles = new double[mem_length];
- // int length=0;
- // for ( ; begin!=end; ++begin) {
- // ++length;
- // indices[length]=col_iter_map[begin->first];
- // doubles[length]=begin->second;
- // }
- // lpx_set_mat_row(lp, row_iter_map[row_it], length, indices, doubles);
- // delete [] indices;
- // delete [] doubles;
- // }
/// \e
- protected:
virtual void _eraseCol(int i) {
int cols[2];
cols[1]=i;
@@ -527,25 +467,56 @@
rows[1]=i;
lpx_del_rows(lp, 1, rows);
}
- public:
- /// \e
- void setColBounds(const ColIt& col_it, int bound_type,
- double lo, double up) {
- lpx_set_col_bnds(lp, col_iter_map[col_it], bound_type, lo, up);
- }
- /// \e
- double getObjCoef(const ColIt& col_it) {
- return lpx_get_obj_coef(lp, col_iter_map[col_it]);
- }
+ virtual void _setColBounds(int i, Bound bound,
+ double lo, double up) {
+ switch (bound) {
+ case FREE:
+ lpx_set_col_bnds(lp, i, LPX_FR, lo, up);
+ break;
+ case LOWER:
+ lpx_set_col_bnds(lp, i, LPX_LO, lo, up);
+ break;
+ case UPPER:
+ lpx_set_col_bnds(lp, i, LPX_UP, lo, up);
+ break;
+ case DOUBLE:
+ lpx_set_col_bnds(lp, i, LPX_DB, lo, up);
+ break;
+ case FIXED:
+ lpx_set_col_bnds(lp, i, LPX_FX, lo, up);
+ break;
+ }
+ }
+ virtual void _setRowBounds(int i, Bound bound,
+ double lo, double up) {
+ switch (bound) {
+ case FREE:
+ lpx_set_row_bnds(lp, i, LPX_FR, lo, up);
+ break;
+ case LOWER:
+ lpx_set_row_bnds(lp, i, LPX_LO, lo, up);
+ break;
+ case UPPER:
+ lpx_set_row_bnds(lp, i, LPX_UP, lo, up);
+ break;
+ case DOUBLE:
+ lpx_set_row_bnds(lp, i, LPX_DB, lo, up);
+ break;
+ case FIXED:
+ lpx_set_row_bnds(lp, i, LPX_FX, lo, up);
+ break;
+ }
+ }
+ protected:
/// \e
- void setRowBounds(const RowIt& row_it, int bound_type,
- double lo, double up) {
- lpx_set_row_bnds(lp, row_iter_map[row_it], bound_type, lo, up);
+ virtual double _getObjCoef(int i) {
+ return lpx_get_obj_coef(lp, i);
}
/// \e
- void setObjCoef(const ColIt& col_it, double obj_coef) {
- lpx_set_obj_coef(lp, col_iter_map[col_it], obj_coef);
+ virtual void _setObjCoef(int i, double obj_coef) {
+ lpx_set_obj_coef(lp, i, obj_coef);
}
+ public:
/// \e
void solveSimplex() { lpx_simplex(lp); }
/// \e
@@ -553,9 +524,11 @@
/// \e
void solveDualSimplex() { lpx_simplex(lp); }
/// \e
- double getPrimal(const ColIt& col_it) {
- return lpx_get_col_prim(lp, col_iter_map[col_it]);
+ protected:
+ virtual double _getPrimal(int i) {
+ return lpx_get_col_prim(lp, i);
}
+ public:
/// \e
double getObjVal() { return lpx_get_obj_val(lp); }
/// \e
Modified: hugo/trunk/src/work/marci/lp/min_cost_gen_flow.h
==============================================================================
--- hugo/trunk/src/work/marci/lp/min_cost_gen_flow.h (original)
+++ hugo/trunk/src/work/marci/lp/min_cost_gen_flow.h Fri Jan 14 14:17:16 2005
@@ -21,10 +21,10 @@
template<typename Edge, typename EdgeIndexMap>
class PrimalMap {
protected:
- LPSolverWrapper* lp;
+ LPGLPK* lp;
EdgeIndexMap* edge_index_map;
public:
- PrimalMap(LPSolverWrapper& _lp, EdgeIndexMap& _edge_index_map) :
+ PrimalMap(LPGLPK& _lp, EdgeIndexMap& _edge_index_map) :
lp(&_lp), edge_index_map(&_edge_index_map) { }
double operator[](Edge e) const {
return lp->getPrimal((*edge_index_map)[e]);
@@ -211,7 +211,7 @@
return (min_cost_flow.flowValue()>=expected);
}
void runByLP() {
- typedef LPSolverWrapper LPSolver;
+ typedef LPGLPK LPSolver;
LPSolver lp;
lp.setMinimize();
typedef LPSolver::ColIt ColIt;
@@ -223,16 +223,16 @@
ColIt col_it=lp.addCol();
edge_index_map.set(e, col_it);
if (lcapacity[e]==capacity[e])
- lp.setColBounds(col_it, LPX_FX, lcapacity[e], capacity[e]);
+ lp.setColBounds(col_it, LPSolver::FIXED, lcapacity[e], capacity[e]);
else
- lp.setColBounds(col_it, LPX_DB, lcapacity[e], capacity[e]);
+ lp.setColBounds(col_it, LPSolver::DOUBLE, lcapacity[e], capacity[e]);
lp.setObjCoef(col_it, cost[e]);
}
LPSolver::ColIt col_it;
for (lp.col_iter_map.first(col_it, lp.VALID_CLASS);
lp.col_iter_map.valid(col_it);
lp.col_iter_map.next(col_it)) {
- std::cout << "ize " << lp.col_iter_map[col_it] << std::endl;
+// std::cout << "ize " << lp.col_iter_map[col_it] << std::endl;
}
for (typename Graph::NodeIt n(g); n!=INVALID; ++n) {
typename Graph::template EdgeMap<Num> coeffs(g, 0);
@@ -250,9 +250,9 @@
}
}
//std::cout << std::endl;
- std::cout << " " << g.id(n) << " " << row.size() << std::endl;
+ //std::cout << " " << g.id(n) << " " << row.size() << std::endl;
lp.setRowCoeffs(row_it, row.begin(), row.end());
- lp.setRowBounds(row_it, LPX_FX, 0.0, 0.0);
+ lp.setRowBounds(row_it, LPSolver::FIXED, 0.0, 0.0);
}
lp.solveSimplex();
//std::cout << lp.colNum() << std::endl;
More information about the Lemon-commits
mailing list