75 x = (*thePvec)[i] -
lhs(i);
82 return rhs(i) - (*thePvec)[i];
89 return maxObj(i) - (*thePvec)[i];
94 x =
maxObj(i) - (*thePvec)[i];
95 return (x < 0) ? x : -x;
108 int ninfeasibilities = 0;
111 for(
int i = 0; i <
coDim(); ++i)
137 if( ninfeasibilities > sparsitythreshold)
143 ninfeasibilities = 0;
155 (*spxout) <<
" --- using hypersparse pricing, ";
157 (*
spxout) <<
" --- using sparse pricing, ";
158 (*spxout) <<
"sparsity: "
159 << std::setw(6) << std::fixed << std::setprecision(4)
161 << std::scientific << std::setprecision(
int(prec))
228 int ninfeasibilities = 0;
232 for (i =
dim() - 1; i >= 0; --i)
255 if( ninfeasibilities > sparsitythreshold )
261 ninfeasibilities = 0;
273 (*spxout) <<
" --- using hypersparse pricing, ";
275 (*
spxout) <<
" --- using sparse pricing, ";
276 (*spxout) <<
"sparsity: "
277 << std::setw(6) << std::fixed << std::setprecision(4)
278 << (
Real) ninfeasibilities/
dim()
279 << std::scientific << std::setprecision(
int(prec))
301 for (i = idx.
size() - 1; i >= 0; --i)
303 int j = idx.
index(i);
346 for (i = idx.
size() - 1; i >= 0; --i)
348 int j = idx.
index(i);
408 enterIdx = number(
SPxColId(enterId));
410 assert(!isBasic(enterStat));
416 computePvec(enterIdx);
417 enterTest = computeTest(enterIdx);
418 theTest[enterIdx] = 0;
422 enterTest = coTest()[enterIdx];
423 theCoTest[enterIdx] = 0;
430 assert( rep() == COLUMN );
431 enterUB = theUCbound[enterIdx];
432 enterLB = theLCbound[enterIdx];
434 enterMax = enterLB - enterUB;
435 enterPric = (*thePvec)[enterIdx];
436 enterRO = maxObj(enterIdx);
437 objChange -= enterVal * enterRO;
440 else if(
EQ( enterLB, enterUB ) )
446 assert( rep() == COLUMN );
447 enterUB = theUCbound[enterIdx];
448 enterLB = theLCbound[enterIdx];
450 enterMax = enterUB - enterLB;
451 enterPric = (*thePvec)[enterIdx];
452 enterRO = maxObj(enterIdx);
453 objChange -= enterVal * enterRO;
456 else if(
EQ( enterLB, enterUB ) )
462 assert( rep() == COLUMN );
463 enterUB = theUCbound[enterIdx];
464 enterLB = theLCbound[enterIdx];
466 enterPric = (*thePvec)[enterIdx];
467 enterRO = maxObj(enterIdx);
474 assert( rep() == ROW );
475 assert(theUCbound[enterIdx] <
infinity);
476 enterUB = theUCbound[enterIdx];
480 enterPric = (*theCoPvec)[enterIdx];
482 objChange -= enterRO * enterVal;
486 assert( rep() == ROW );
487 assert(theLCbound[enterIdx] > -
infinity);
488 enterLB = theLCbound[enterIdx];
492 enterPric = (*theCoPvec)[enterIdx];
494 objChange -= enterRO * enterVal;
498 assert( rep() == ROW );
504 enterPric = (*theCoPvec)[enterIdx];
505 if (enterPric > enterRO)
512 assert( rep() == ROW );
513 enterPric = (*theCoPvec)[enterIdx];
516 enterLB = theLCbound[enterIdx];
525 enterUB = theUCbound[enterIdx];
532 objChange -= theLCbound[enterIdx] *
SPxLP::upper(enterIdx);
533 objChange -= theUCbound[enterIdx] *
SPxLP::lower(enterIdx);
538 MSG_DEBUG( std::cout <<
"DENTER03 SPxSolver::getEnterVals() : col " << enterIdx
541 <<
" objChange: " << objChange
548 enterIdx = number(
SPxRowId(enterId));
550 assert(!isBasic(enterStat));
556 computePvec(enterIdx);
557 enterTest = computeTest(enterIdx);
558 theTest[enterIdx] = 0;
562 enterTest = coTest()[enterIdx];
563 theCoTest[enterIdx] = 0;
570 assert( rep() == COLUMN );
571 enterUB = theURbound[enterIdx];
572 enterLB = theLRbound[enterIdx];
574 enterMax = enterUB - enterLB;
575 enterPric = (*theCoPvec)[enterIdx];
576 enterRO = maxRowObj(enterIdx);
577 objChange -= enterRO * enterVal;
580 else if(
EQ( enterLB, enterUB ) )
586 assert( rep() == COLUMN );
587 enterUB = theURbound[enterIdx];
588 enterLB = theLRbound[enterIdx];
590 enterMax = enterLB - enterUB;
591 enterPric = (*theCoPvec)[enterIdx];
592 enterRO = maxRowObj(enterIdx);
593 objChange -= enterRO * enterVal;
596 else if(
EQ( enterLB, enterUB ) )
602 assert( rep() == COLUMN );
606 MSG_ERROR( std::cerr <<
"EENTER99 ERROR: not yet debugged!" << std::endl; )
607 enterPric = (*theCoPvec)[enterIdx];
608 enterRO = maxRowObj(enterIdx);
615 assert( rep() == ROW );
616 assert(theURbound[enterIdx] <
infinity);
617 enterUB = theURbound[enterIdx];
621 enterPric = (*thePvec)[enterIdx];
622 enterRO = lhs(enterIdx);
623 objChange -= enterRO * enterVal;
627 assert( rep() == ROW );
628 assert(theLRbound[enterIdx] > -
infinity);
629 enterLB = theLRbound[enterIdx];
633 enterPric = (*thePvec)[enterIdx];
634 enterRO = rhs(enterIdx);
635 objChange -= enterRO * enterVal;
639 assert( rep() == ROW );
640 assert(rhs(enterIdx) == lhs(enterIdx));
644 enterPric = (*thePvec)[enterIdx];
645 enterRO = rhs(enterIdx);
650 assert( rep() == ROW );
651 enterPric = (*thePvec)[enterIdx];
652 if (enterPric > rhs(enterIdx))
654 enterLB = theLRbound[enterIdx];
658 enterRO = rhs(enterIdx);
663 enterUB = theURbound[enterIdx];
667 enterRO = lhs(enterIdx);
670 objChange -= theLRbound[enterIdx] * rhs(enterIdx);
671 objChange -= theURbound[enterIdx] * lhs(enterIdx);
677 MSG_DEBUG( std::cout <<
"DENTER05 SPxSolver::getEnterVals() : row "
678 << enterIdx <<
": " << enterStat
680 <<
" objChange: " << objChange
697 SPxId leftId = baseId(leaveIdx);
707 assert(rep() == ROW);
711 assert(rep() == ROW);
712 leavebound = theLBbound[leaveIdx];
713 theLRbound[idx] = leavebound;
718 objChange += theURbound[idx] * lhs(idx);
721 objChange += theLRbound[idx] * rhs(idx);
724 objChange += theURbound[idx] * lhs(idx);
725 objChange += theLRbound[idx] * rhs(idx);
732 assert(rep() == ROW);
733 leavebound = theUBbound[leaveIdx];
734 theURbound[idx] = leavebound;
739 objChange += theURbound[idx] * lhs(idx);
742 objChange += theLRbound[idx] * rhs(idx);
745 objChange += theURbound[idx] * lhs(idx);
746 objChange += theLRbound[idx] * rhs(idx);
753 assert(rep() == ROW);
757 MSG_ERROR( std::cerr <<
"EENTER98 ERROR: not yet debugged!" << std::endl; )
758 if ((*theCoPvec)[leaveIdx] - theLBbound[leaveIdx] <
759 theUBbound[leaveIdx] - (*theCoPvec)[leaveIdx])
761 leavebound = theLBbound[leaveIdx];
762 theLRbound[idx] = leavebound;
766 leavebound = theUBbound[leaveIdx];
767 theURbound[idx] = leavebound;
774 assert(rep() == COLUMN);
778 assert(rep() == COLUMN);
779 if (theFvec->delta()[leaveIdx] * enterMax < 0)
780 leavebound = theUBbound[leaveIdx];
782 leavebound = theLBbound[leaveIdx];
783 theLRbound[idx] = leavebound;
784 theURbound[idx] = leavebound;
785 objChange += leavebound * maxRowObj(leaveIdx);
789 assert(rep() == COLUMN);
790 leavebound = theUBbound[leaveIdx];
791 theURbound[idx] = leavebound;
792 objChange += leavebound * maxRowObj(leaveIdx);
796 assert(rep() == COLUMN);
797 leavebound = theLBbound[leaveIdx];
798 theLRbound[idx] = leavebound;
799 objChange += leavebound * maxRowObj(leaveIdx);
803 assert(rep() == COLUMN);
804 if (enterMax * theFvec->delta()[leaveIdx] < 0)
806 leavebound = theUBbound[leaveIdx];
807 theURbound[idx] = leavebound;
808 objChange += leavebound * maxRowObj(leaveIdx);
813 leavebound = theLBbound[leaveIdx];
814 theLRbound[idx] = leavebound;
815 objChange += leavebound * maxRowObj(leaveIdx);
823 MSG_DEBUG( std::cout <<
"DENTER06 SPxSolver::getEnterVals2(): row "
824 << idx <<
": " << leaveStat
826 <<
" objChange: " << objChange
839 assert(rep() == ROW);
840 leavebound = theLBbound[leaveIdx];
841 theLCbound[idx] = leavebound;
846 objChange += theUCbound[idx] * lower(idx);
849 objChange += theLCbound[idx] * upper(idx);
852 objChange += theLCbound[idx] * upper(idx);
853 objChange += theUCbound[idx] * lower(idx);
860 assert(rep() == ROW);
861 leavebound = theUBbound[leaveIdx];
862 theUCbound[idx] = leavebound;
867 objChange += theUCbound[idx] * lower(idx);
870 objChange += theLCbound[idx] * upper(idx);
873 objChange += theLCbound[idx] * upper(idx);
874 objChange += theUCbound[idx] * lower(idx);
881 assert(rep() == ROW);
882 if (theFvec->delta()[leaveIdx] * enterMax > 0)
884 leavebound = theLBbound[leaveIdx];
885 theLCbound[idx] = leavebound;
889 leavebound = theUBbound[leaveIdx];
890 theUCbound[idx] = leavebound;
895 assert(rep() == ROW);
900 assert(rep() == COLUMN);
901 if (theFvec->delta()[leaveIdx] * enterMax > 0)
902 leavebound = theLBbound[leaveIdx];
904 leavebound = theUBbound[leaveIdx];
906 theLCbound[idx] = leavebound;
907 objChange += maxObj(idx) * leavebound;
911 assert(rep() == COLUMN);
912 leavebound = theLBbound[leaveIdx];
913 theLCbound[idx] = leavebound;
914 objChange += maxObj(idx) * leavebound;
918 assert(rep() == COLUMN);
919 leavebound = theUBbound[leaveIdx];
920 theUCbound[idx] = leavebound;
921 objChange += maxObj(idx) * leavebound;
926 assert(rep() == COLUMN);
927 if (enterMax * theFvec->delta()[leaveIdx] < 0)
929 leavebound = theUBbound[leaveIdx];
930 theUCbound[idx] = leavebound;
931 objChange += maxObj(idx) * leavebound;
936 leavebound = theLBbound[leaveIdx];
937 theLCbound[idx] = leavebound;
938 objChange += maxObj(idx) * leavebound;
946 MSG_DEBUG( std::cout <<
"DENTER07 SPxSolver::getEnterVals2(): col "
947 << idx <<
": " << leaveStat
949 <<
" objChange: " << objChange
964 assert(rep() == COLUMN);
970 enterIdx = number(
SPxColId(enterId));
974 objChange += theLCbound[enterIdx] * maxObj(enterIdx);
979 objChange += theUCbound[enterIdx] * maxObj(enterIdx);
981 theFrhs->multAdd(leaveVal, vec);
985 enterIdx = number(
SPxRowId(enterId));
990 objChange += (theURbound[enterIdx]) * maxRowObj(enterIdx);
995 objChange += (theLRbound[enterIdx]) * maxRowObj(enterIdx);
997 (*theFrhs)[enterIdx] += leaveVal;
1001 theTest[enterIdx] = 0;
1006 theCoTest[enterIdx] = 0;
1017 int enterIdx =
number(enterId);
1020 theTest[enterIdx] = enterTest;
1045 Real objChange = 0.0;
1052 enterVal, enterMax, enterPric, enterStat, enterRO, objChange);
1060 MSG_DEBUG( std::cout <<
"DENTER08 rejecting false enter pivot" << std::endl; )
1075 #ifdef ENABLE_ADDITIONAL_CHECKS
1089 << tmp.
length() << std::endl; )
1102 Real leaveVal = -enterMax;
1140 (*theCoPvec) -= (*coSolveVector3);
1148 (*theCoPvec) -= (*coSolveVector3);
1168 <<
"breakpoints passed / bounds flipped = " <<
boundflips
1173 (*theCoPrhs)[leaveIdx] = enterRO;
1215 (*theFvec)[leaveIdx] = enterVal - leaveVal;
1231 else if (leaveVal != -enterMax)
1272 else if (leaveVal < infinity && leaveVal > -
infinity)
1275 assert(leaveVal == -enterMax);
1277 change(-1, enterId, enterVec);
1282 ungetEnterVal(enterId, enterStat, leaveVal, *enterVec, objChange);
1304 <<
"enter() for feasibility test" << std::endl; )
1318 MSG_INFO3( (*
spxout), (*
spxout) <<
"IENTER11 clean up step to reduce numerical errors" << std::endl; )
1329 <<
"enter()" << std::endl; )
1337 sign = (leaveVal > 0 ? -1.0 : 1.0);
1359 sign = leaveVal > 0 ? 1.0 : -1.0;