| 572 | } |
| 573 | |
| 574 | void HEkkDual::majorUpdateFtranPrepare() { |
| 575 | // Prepare FTRAN BFRT buffer |
| 576 | col_BFRT.clear(); |
| 577 | for (HighsInt iFn = 0; iFn < multi_nFinish; iFn++) { |
| 578 | MFinish* finish = &multi_finish[iFn]; |
| 579 | HVector* Vec = finish->col_BFRT; |
| 580 | a_matrix->collectAj(*Vec, finish->variable_in, finish->theta_primal); |
| 581 | |
| 582 | // Update this buffer by previous Row_ep |
| 583 | for (HighsInt jFn = iFn - 1; jFn >= 0; jFn--) { |
| 584 | MFinish* jFinish = &multi_finish[jFn]; |
| 585 | double* jRow_epArray = jFinish->row_ep->array.data(); |
| 586 | double pivotX = 0; |
| 587 | for (HighsInt k = 0; k < Vec->count; k++) { |
| 588 | HighsInt iRow = Vec->index[k]; |
| 589 | pivotX += Vec->array[iRow] * jRow_epArray[iRow]; |
| 590 | } |
| 591 | if (fabs(pivotX) > kHighsTiny) { |
| 592 | pivotX /= jFinish->alpha_row; |
| 593 | a_matrix->collectAj(*Vec, jFinish->variable_in, -pivotX); |
| 594 | a_matrix->collectAj(*Vec, jFinish->variable_out, pivotX); |
| 595 | } |
| 596 | } |
| 597 | col_BFRT.saxpy(1.0, Vec); |
| 598 | } |
| 599 | |
| 600 | // Prepare regular FTRAN buffer |
| 601 | for (HighsInt iFn = 0; iFn < multi_nFinish; iFn++) { |
| 602 | MFinish* iFinish = &multi_finish[iFn]; |
| 603 | HVector* iColumn = iFinish->col_aq; |
| 604 | iColumn->clear(); |
| 605 | iColumn->packFlag = true; |
| 606 | a_matrix->collectAj(*iColumn, iFinish->variable_in, 1); |
| 607 | } |
| 608 | } |
| 609 | |
| 610 | void HEkkDual::majorUpdateFtranParallel() { |
| 611 | analysis->simplexTimerStart(FtranMixParClock); |