Ticket #203: e4554cd6b2bf.patch
File e4554cd6b2bf.patch, 8.9 KB (added by , 15 years ago) |
---|
-
lemon/cbc.cc
# HG changeset patch # User Balazs Dezso <deba@inf.elte.hu> # Date 1254608922 -7200 # Node ID e4554cd6b2bf7d7efc98c123fcf39d6f0de74354 # Parent 68792fb2870f54f66104b3cc20eba1e6e6ca5255 Faster add row operation (#203) One virtual function call instead of more diff -r 68792fb2870f -r e4554cd6b2bf lemon/cbc.cc
a b 94 94 return _prob->numberRows() - 1; 95 95 } 96 96 97 int CbcMip::_addRow(Value l, ExprIterator b, ExprIterator e, Value u) { 98 std::vector<int> indexes; 99 std::vector<Value> values; 100 101 for(ExprIterator it = b; it != e; ++it) { 102 indexes.push_back(it->first); 103 values.push_back(it->second); 104 } 105 106 _prob->addRow(values.size(), &indexes.front(), &values.front(), l, u); 107 return _prob->numberRows() - 1; 108 } 97 109 98 110 void CbcMip::_eraseCol(int i) { 99 111 _prob->deleteColumn(i); -
lemon/cbc.h
diff -r 68792fb2870f -r e4554cd6b2bf lemon/cbc.h
a b 62 62 63 63 virtual int _addCol(); 64 64 virtual int _addRow(); 65 virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u); 65 66 66 67 virtual void _eraseCol(int i); 67 68 virtual void _eraseRow(int i); -
lemon/clp.cc
diff -r 68792fb2870f -r e4554cd6b2bf lemon/clp.cc
a b 78 78 return _prob->numberRows() - 1; 79 79 } 80 80 81 int ClpLp::_addRow(Value l, ExprIterator b, ExprIterator e, Value u) { 82 std::vector<int> indexes; 83 std::vector<Value> values; 84 85 for(ExprIterator it = b; it != e; ++it) { 86 indexes.push_back(it->first); 87 values.push_back(it->second); 88 } 89 90 _prob->addRow(values.size(), &indexes.front(), &values.front(), l, u); 91 return _prob->numberRows() - 1; 92 } 93 81 94 82 95 void ClpLp::_eraseCol(int c) { 83 96 _col_names_ref.erase(_prob->getColumnName(c)); -
lemon/clp.h
diff -r 68792fb2870f -r e4554cd6b2bf lemon/clp.h
a b 75 75 76 76 virtual int _addCol(); 77 77 virtual int _addRow(); 78 virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u); 78 79 79 80 virtual void _eraseCol(int i); 80 81 virtual void _eraseRow(int i); -
lemon/cplex.cc
diff -r 68792fb2870f -r e4554cd6b2bf lemon/cplex.cc
a b 111 111 return i; 112 112 } 113 113 114 int CplexBase::_addRow(Value lb, ExprIterator b, 115 ExprIterator e, Value ub) { 116 int i = CPXgetnumrows(cplexEnv(), _prob); 117 if (lb == -INF) { 118 const char s = 'L'; 119 CPXnewrows(cplexEnv(), _prob, 1, &ub, &s, 0, 0); 120 } else if (ub == INF) { 121 const char s = 'G'; 122 CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0); 123 } else if (lb == ub){ 124 const char s = 'E'; 125 CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0); 126 } else { 127 const char s = 'R'; 128 double len = ub - lb; 129 CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, &len, 0); 130 } 131 132 std::vector<int> indices; 133 std::vector<int> rowlist; 134 std::vector<Value> values; 135 136 for(ExprIterator it=b; it!=e; ++it) { 137 indices.push_back(it->first); 138 values.push_back(it->second); 139 rowlist.push_back(i); 140 } 141 142 CPXchgcoeflist(cplexEnv(), _prob, values.size(), 143 &rowlist.front(), &indices.front(), &values.front()); 144 145 return i; 146 } 114 147 115 148 void CplexBase::_eraseCol(int i) { 116 149 CPXdelcols(cplexEnv(), _prob, i, i); -
lemon/cplex.h
diff -r 68792fb2870f -r e4554cd6b2bf lemon/cplex.h
a b 93 93 94 94 virtual int _addCol(); 95 95 virtual int _addRow(); 96 virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u); 96 97 97 98 virtual void _eraseCol(int i); 98 99 virtual void _eraseRow(int i); -
lemon/glpk.cc
diff -r 68792fb2870f -r e4554cd6b2bf lemon/glpk.cc
a b 59 59 return i; 60 60 } 61 61 62 int GlpkBase::_addRow(Value lo, ExprIterator b, 63 ExprIterator e, Value up) { 64 int i = glp_add_rows(lp, 1); 65 66 if (lo == -INF) { 67 if (up == INF) { 68 glp_set_row_bnds(lp, i, GLP_FR, lo, up); 69 } else { 70 glp_set_row_bnds(lp, i, GLP_UP, lo, up); 71 } 72 } else { 73 if (up == INF) { 74 glp_set_row_bnds(lp, i, GLP_LO, lo, up); 75 } else if (lo != up) { 76 glp_set_row_bnds(lp, i, GLP_DB, lo, up); 77 } else { 78 glp_set_row_bnds(lp, i, GLP_FX, lo, up); 79 } 80 } 81 82 std::vector<int> indexes; 83 std::vector<Value> values; 84 85 indexes.push_back(0); 86 values.push_back(0); 87 88 for(ExprIterator it = b; it != e; ++it) { 89 indexes.push_back(it->first); 90 values.push_back(it->second); 91 } 92 93 glp_set_mat_row(lp, i, values.size() - 1, 94 &indexes.front(), &values.front()); 95 return i; 96 } 97 62 98 void GlpkBase::_eraseCol(int i) { 63 99 int ca[2]; 64 100 ca[1] = i; -
lemon/glpk.h
diff -r 68792fb2870f -r e4554cd6b2bf lemon/glpk.h
a b 54 54 55 55 virtual int _addCol(); 56 56 virtual int _addRow(); 57 virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u); 57 58 58 59 virtual void _eraseCol(int i); 59 60 virtual void _eraseRow(int i); -
lemon/lp_base.h
diff -r 68792fb2870f -r e4554cd6b2bf lemon/lp_base.h
a b 943 943 virtual int _addCol() = 0; 944 944 virtual int _addRow() = 0; 945 945 946 virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u) { 947 int row = _addRow(); 948 _setRowCoeffs(row, b, e); 949 _setRowLowerBound(row, l); 950 _setRowUpperBound(row, u); 951 return row; 952 } 953 946 954 virtual void _eraseCol(int col) = 0; 947 955 virtual void _eraseRow(int row) = 0; 948 956 … … 1207 1215 ///\param u is the upper bound (\ref INF means no bound) 1208 1216 ///\return The created row. 1209 1217 Row addRow(Value l,const Expr &e, Value u) { 1210 Row r=addRow(); 1211 row(r,l,e,u); 1218 Row r; 1219 e.simplify(); 1220 r._id = _addRowId(_addRow(l - *e, ExprIterator(e.comps.begin(), cols), 1221 ExprIterator(e.comps.end(), cols), u - *e)); 1212 1222 return r; 1213 1223 } 1214 1224 … … 1217 1227 ///\param c is a linear expression (see \ref Constr) 1218 1228 ///\return The created row. 1219 1229 Row addRow(const Constr &c) { 1220 Row r=addRow(); 1221 row(r,c); 1230 Row r; 1231 c.expr().simplify(); 1232 r._id = _addRowId(_addRow(c.lowerBounded()?c.lowerBound():-INF, 1233 ExprIterator(c.expr().comps.begin(), cols), 1234 ExprIterator(c.expr().comps.end(), cols), 1235 c.upperBounded()?c.upperBound():INF)); 1222 1236 return r; 1223 1237 } 1224 1238 ///Erase a column (i.e a variable) from the LP -
lemon/lp_skeleton.cc
diff -r 68792fb2870f -r e4554cd6b2bf lemon/lp_skeleton.cc
a b 32 32 return ++row_num; 33 33 } 34 34 35 int SkeletonSolverBase::_addRow(Value, ExprIterator, ExprIterator, Value) 36 { 37 return ++row_num; 38 } 39 35 40 void SkeletonSolverBase::_eraseCol(int) {} 36 41 void SkeletonSolverBase::_eraseRow(int) {} 37 42 -
lemon/lp_skeleton.h
diff -r 68792fb2870f -r e4554cd6b2bf lemon/lp_skeleton.h
a b 45 45 /// \e 46 46 virtual int _addRow(); 47 47 /// \e 48 virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u); 49 /// \e 48 50 virtual void _eraseCol(int i); 49 51 /// \e 50 52 virtual void _eraseRow(int i); -
lemon/soplex.cc
diff -r 68792fb2870f -r e4554cd6b2bf lemon/soplex.cc
a b 91 91 return soplex->nRows() - 1; 92 92 } 93 93 94 int SoplexLp::_addRow(Value l, ExprIterator b, ExprIterator e, Value u) { 95 soplex::DSVector v; 96 for (ExprIterator it = b; it != e; ++it) { 97 v.add(it->first, it->second); 98 } 99 soplex::LPRow r(l, v, u); 100 soplex->addRow(r); 101 102 _row_names.push_back(std::string()); 103 104 return soplex->nRows() - 1; 105 } 106 94 107 95 108 void SoplexLp::_eraseCol(int i) { 96 109 soplex->removeCol(i); -
lemon/soplex.h
diff -r 68792fb2870f -r e4554cd6b2bf lemon/soplex.h
a b 84 84 85 85 virtual int _addCol(); 86 86 virtual int _addRow(); 87 virtual int _addRow(Value l, ExprIterator b, ExprIterator e, Value u); 87 88 88 89 virtual void _eraseCol(int i); 89 90 virtual void _eraseRow(int i);