[Lemon-commits] Alpar Juttner: Faster CPLEX problem build-up #422

Lemon HG hg at lemon.cs.elte.hu
Thu Apr 2 14:10:18 CEST 2015


details:   http://lemon.cs.elte.hu/hg/lemon/rev/1ad592289f93
changeset: 1330:1ad592289f93
user:      Alpar Juttner <alpar [at] cs.elte.hu>
date:      Wed Nov 12 14:11:20 2014 +0100
description:
	Faster CPLEX problem build-up #422

diffstat:

 lemon/cplex.cc |  41 ++++++++++++++++++++++-------------------
 1 files changed, 22 insertions(+), 19 deletions(-)

diffs (60 lines):

diff --git a/lemon/cplex.cc b/lemon/cplex.cc
--- a/lemon/cplex.cc
+++ b/lemon/cplex.cc
@@ -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;
   }
 


More information about the Lemon-commits mailing list