# HG changeset patch # User Alpar Juttner # Date 1415797880 -3600 # Node ID 1ad592289f93c9e66b6a838360cdd43260c29096 # Parent 5de6a70446f6ed13d456d1df8d0bfd4085bcf2af Faster CPLEX problem build-up #422 diff -r 5de6a70446f6 -r 1ad592289f93 lemon/cplex.cc --- a/lemon/cplex.cc Wed Jul 09 14:41:36 2014 +0200 +++ b/lemon/cplex.cc Wed Nov 12 14:11:20 2014 +0100 @@ -115,34 +115,37 @@ int CplexBase::_addRow(Value lb, ExprIterator b, ExprIterator e, Value ub) { int i = CPXgetnumrows(cplexEnv(), _prob); - if (lb == -INF) { - const char s = 'L'; - CPXnewrows(cplexEnv(), _prob, 1, &ub, &s, 0, 0); - } else if (ub == INF) { - const char s = 'G'; - CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0); - } else if (lb == ub){ - const char s = 'E'; - CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0); - } else { - const char s = 'R'; - double len = ub - lb; - CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, &len, 0); - } + int rmatbeg = 0; + std::vector indices; - std::vector rowlist; std::vector values; for(ExprIterator it=b; it!=e; ++it) { indices.push_back(it->first); values.push_back(it->second); - rowlist.push_back(i); } - CPXchgcoeflist(cplexEnv(), _prob, values.size(), - &rowlist.front(), &indices.front(), &values.front()); - + if (lb == -INF) { + const char s = 'L'; + CPXaddrows(cplexEnv(), _prob, 0, 1, values.size(), &ub, &s, + &rmatbeg, &indices.front(), &values.front(), 0, 0); + } else if (ub == INF) { + const char s = 'G'; + CPXaddrows(cplexEnv(), _prob, 0, 1, values.size(), &lb, &s, + &rmatbeg, &indices.front(), &values.front(), 0, 0); + } else if (lb == ub){ + const char s = 'E'; + CPXaddrows(cplexEnv(), _prob, 0, 1, values.size(), &lb, &s, + &rmatbeg, &indices.front(), &values.front(), 0, 0); + } else { + const char s = 'R'; + double len = ub - lb; + CPXaddrows(cplexEnv(), _prob, 0, 1, values.size(), &ub, &s, + &rmatbeg, &indices.front(), &values.front(), 0, 0); + CPXchgrngval(cplexEnv(), _prob, 1, &i, &len); + } + return i; }