| 2204 | } |
| 2205 | |
| 2206 | void HighsCliqueTable::buildFrom(const HighsLp* origModel, |
| 2207 | const HighsCliqueTable& init) { |
| 2208 | assert(init.colsubstituted.size() == colsubstituted.size()); |
| 2209 | HighsInt ncols = init.colsubstituted.size(); |
| 2210 | HighsCliqueTable newCliqueTable(ncols); |
| 2211 | newCliqueTable.setPresolveFlag(inPresolve); |
| 2212 | newCliqueTable.setMinEntriesForParallelism(minEntriesForParallelism); |
| 2213 | HighsInt ncliques = init.cliques.size(); |
| 2214 | std::vector<CliqueVar> clqBuffer; |
| 2215 | clqBuffer.reserve(2 * static_cast<size_t>(origModel->num_col_)); |
| 2216 | for (HighsInt i = 0; i != ncliques; ++i) { |
| 2217 | if (init.cliques[i].start == -1) continue; |
| 2218 | if (init.cliques[i].numActive() <= 1) continue; |
| 2219 | |
| 2220 | clqBuffer.assign(init.cliqueentries.begin() + init.cliques[i].start, |
| 2221 | init.cliqueentries.begin() + init.cliques[i].end); |
| 2222 | clqBuffer.erase(std::remove_if(clqBuffer.begin(), clqBuffer.end(), |
| 2223 | [origModel](CliqueVar v) { |
| 2224 | return origModel->col_lower_[v.col] != |
| 2225 | 0.0 || |
| 2226 | origModel->col_upper_[v.col] != 1.0; |
| 2227 | }), |
| 2228 | clqBuffer.end()); |
| 2229 | if (clqBuffer.size() <= 1) continue; |
| 2230 | |
| 2231 | HighsInt origin = init.cliques[i].origin != kHighsIInf ? -1 : kHighsIInf; |
| 2232 | newCliqueTable.doAddClique(clqBuffer.data(), |
| 2233 | static_cast<HighsInt>(clqBuffer.size()), false, |
| 2234 | origin); |
| 2235 | } |
| 2236 | |
| 2237 | newCliqueTable.colsubstituted = init.colsubstituted; |
| 2238 | newCliqueTable.substitutions = init.substitutions; |
| 2239 | // Currently assume buildFrom is always used for sub-mips |
| 2240 | newCliqueTable.setAllowParallel(false); |
| 2241 | *this = std::move(newCliqueTable); |
| 2242 | } |
no test coverage detected