lemon/cplex.cc
changeset 1125 1ad592289f93
parent 1092 dceba191c00d
child 1130 0759d974de81
equal deleted inserted replaced
12:7c4a874ab9e1 13:690d0289331f
   113   }
   113   }
   114 
   114 
   115   int CplexBase::_addRow(Value lb, ExprIterator b,
   115   int CplexBase::_addRow(Value lb, ExprIterator b,
   116                          ExprIterator e, Value ub) {
   116                          ExprIterator e, Value ub) {
   117     int i = CPXgetnumrows(cplexEnv(), _prob);
   117     int i = CPXgetnumrows(cplexEnv(), _prob);
       
   118 
       
   119     int rmatbeg = 0;
       
   120     
       
   121     std::vector<int> indices;
       
   122     std::vector<Value> values;
       
   123 
       
   124     for(ExprIterator it=b; it!=e; ++it) {
       
   125       indices.push_back(it->first);
       
   126       values.push_back(it->second);
       
   127     }
       
   128 
   118     if (lb == -INF) {
   129     if (lb == -INF) {
   119       const char s = 'L';
   130       const char s = 'L';
   120       CPXnewrows(cplexEnv(), _prob, 1, &ub, &s, 0, 0);
   131       CPXaddrows(cplexEnv(), _prob, 0, 1, values.size(), &ub, &s,
       
   132                  &rmatbeg, &indices.front(), &values.front(), 0, 0);
   121     } else if (ub == INF) {
   133     } else if (ub == INF) {
   122       const char s = 'G';
   134       const char s = 'G';
   123       CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0);
   135       CPXaddrows(cplexEnv(), _prob, 0, 1, values.size(), &lb, &s,
       
   136                  &rmatbeg, &indices.front(), &values.front(), 0, 0);
   124     } else if (lb == ub){
   137     } else if (lb == ub){
   125       const char s = 'E';
   138       const char s = 'E';
   126       CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0);
   139       CPXaddrows(cplexEnv(), _prob, 0, 1, values.size(), &lb, &s,
       
   140                  &rmatbeg, &indices.front(), &values.front(), 0, 0);
   127     } else {
   141     } else {
   128       const char s = 'R';
   142       const char s = 'R';
   129       double len = ub - lb;
   143       double len = ub - lb;
   130       CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, &len, 0);
   144       CPXaddrows(cplexEnv(), _prob, 0, 1, values.size(), &ub, &s,
   131     }
   145                  &rmatbeg, &indices.front(), &values.front(), 0, 0);
   132 
   146       CPXchgrngval(cplexEnv(), _prob, 1, &i, &len);
   133     std::vector<int> indices;
   147     }
   134     std::vector<int> rowlist;
   148     
   135     std::vector<Value> values;
       
   136 
       
   137     for(ExprIterator it=b; it!=e; ++it) {
       
   138       indices.push_back(it->first);
       
   139       values.push_back(it->second);
       
   140       rowlist.push_back(i);
       
   141     }
       
   142 
       
   143     CPXchgcoeflist(cplexEnv(), _prob, values.size(),
       
   144                    &rowlist.front(), &indices.front(), &values.front());
       
   145 
       
   146     return i;
   149     return i;
   147   }
   150   }
   148 
   151 
   149   void CplexBase::_eraseCol(int i) {
   152   void CplexBase::_eraseCol(int i) {
   150     CPXdelcols(cplexEnv(), _prob, i, i);
   153     CPXdelcols(cplexEnv(), _prob, i, i);