| 578 | } |
| 579 | |
| 580 | void HEkkDualRow::createFreemove(HVector* row_ep) { |
| 581 | // TODO: Check with Qi what this is doing and why it's expensive |
| 582 | if (!freeList.empty()) { |
| 583 | double Ta = ekk_instance_.info_.update_count < 10 ? 1e-9 |
| 584 | : ekk_instance_.info_.update_count < 20 ? 3e-8 |
| 585 | : 1e-6; |
| 586 | HighsInt move_out = workDelta < 0 ? -1 : 1; |
| 587 | for (const HighsInt& iVar : freeList) { |
| 588 | assert(iVar < ekk_instance_.lp_.num_col_ + ekk_instance_.lp_.num_row_); |
| 589 | double alpha = ekk_instance_.lp_.a_matrix_.computeDot(*row_ep, iVar); |
| 590 | if (fabs(alpha) > Ta) { |
| 591 | if (alpha * move_out > 0) |
| 592 | ekk_instance_.basis_.nonbasicMove_[iVar] = 1; |
| 593 | else |
| 594 | ekk_instance_.basis_.nonbasicMove_[iVar] = -1; |
| 595 | } |
| 596 | } |
| 597 | } |
| 598 | } |
| 599 | void HEkkDualRow::deleteFreemove() { |
| 600 | if (!freeList.empty()) { |
| 601 | for (const HighsInt& iVar : freeList) { |
no test coverage detected