COIN-OR::LEMON - Graph Library

Ticket #422: 1ad592289f93.patch

File 1ad592289f93.patch, 2.2 KB (added by Alpar Juttner, 9 years ago)
  • lemon/cplex.cc

    # HG changeset patch
    # User Alpar Juttner <alpar@cs.elte.hu>
    # Date 1415797880 -3600
    #      Wed Nov 12 14:11:20 2014 +0100
    # Node ID 1ad592289f93c9e66b6a838360cdd43260c29096
    # Parent  5de6a70446f6ed13d456d1df8d0bfd4085bcf2af
    Faster CPLEX problem build-up #422
    
    diff --git a/lemon/cplex.cc b/lemon/cplex.cc
    a b  
    115115  int CplexBase::_addRow(Value lb, ExprIterator b,
    116116                         ExprIterator e, Value ub) {
    117117    int i = CPXgetnumrows(cplexEnv(), _prob);
    118     if (lb == -INF) {
    119       const char s = 'L';
    120       CPXnewrows(cplexEnv(), _prob, 1, &ub, &s, 0, 0);
    121     } else if (ub == INF) {
    122       const char s = 'G';
    123       CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0);
    124     } else if (lb == ub){
    125       const char s = 'E';
    126       CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, 0, 0);
    127     } else {
    128       const char s = 'R';
    129       double len = ub - lb;
    130       CPXnewrows(cplexEnv(), _prob, 1, &lb, &s, &len, 0);
    131     }
    132118
     119    int rmatbeg = 0;
     120   
    133121    std::vector<int> indices;
    134     std::vector<int> rowlist;
    135122    std::vector<Value> values;
    136123
    137124    for(ExprIterator it=b; it!=e; ++it) {
    138125      indices.push_back(it->first);
    139126      values.push_back(it->second);
    140       rowlist.push_back(i);
    141127    }
    142128
    143     CPXchgcoeflist(cplexEnv(), _prob, values.size(),
    144                    &rowlist.front(), &indices.front(), &values.front());
    145 
     129    if (lb == -INF) {
     130      const char s = 'L';
     131      CPXaddrows(cplexEnv(), _prob, 0, 1, values.size(), &ub, &s,
     132                 &rmatbeg, &indices.front(), &values.front(), 0, 0);
     133    } else if (ub == INF) {
     134      const char s = 'G';
     135      CPXaddrows(cplexEnv(), _prob, 0, 1, values.size(), &lb, &s,
     136                 &rmatbeg, &indices.front(), &values.front(), 0, 0);
     137    } else if (lb == ub){
     138      const char s = 'E';
     139      CPXaddrows(cplexEnv(), _prob, 0, 1, values.size(), &lb, &s,
     140                 &rmatbeg, &indices.front(), &values.front(), 0, 0);
     141    } else {
     142      const char s = 'R';
     143      double len = ub - lb;
     144      CPXaddrows(cplexEnv(), _prob, 0, 1, values.size(), &ub, &s,
     145                 &rmatbeg, &indices.front(), &values.front(), 0, 0);
     146      CPXchgrngval(cplexEnv(), _prob, 1, &i, &len);
     147    }
     148   
    146149    return i;
    147150  }
    148151