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); |