# HG changeset patch
# User Alpar Juttner <alpar@cs.elte.hu>
# 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<int> indices;
-    std::vector<int> rowlist;
     std::vector<Value> 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;
   }