56 ClassImp(TMehrotraSolver);
61 TMehrotraSolver::TMehrotraSolver()
73 TMehrotraSolver::TMehrotraSolver(TQpProbBase *of,TQpDataBase *prob,Int_t verbose)
76 fStep = fFactory->MakeVariables(prob);
78 fPrintlevel = verbose;
86 TMehrotraSolver::TMehrotraSolver(
const TMehrotraSolver &another) : TQpSolverBase(another)
97 Int_t TMehrotraSolver::Solve(TQpDataBase *prob,TQpVar *iterate,TQpResidual *resid)
103 fDnorm = prob->DataNorm();
106 fSys = fFactory->MakeLinSys(prob);
107 this->Start(fFactory,iterate,prob,resid,fStep);
110 Double_t mu = iterate->GetMu();
117 resid->CalcResids(prob,iterate);
120 status_code = this->DoStatus(prob,iterate,resid,fIter,mu,0);
121 if (status_code != kNOT_FINISHED )
break;
122 if (fPrintlevel >= 10)
123 this->DoMonitor(prob,iterate,resid,alpha,sigma,fIter,mu,status_code,0);
127 resid->Set_r3_xz_alpha(iterate,0.0);
129 fSys->Factor(prob,iterate);
130 fSys->Solve(prob,iterate,resid,fStep);
133 alpha = iterate->StepBound(fStep);
136 Double_t muaff = iterate->MuStep(fStep,alpha);
137 sigma = TMath::Power(muaff/mu,fTsig);
142 resid->Add_r3_xz_alpha(fStep,-sigma*mu );
144 fSys->Solve(prob,iterate,resid,fStep);
149 alpha = this->FinalStepLength(iterate,fStep);
155 iterate->Saxpy(fStep,alpha);
156 mu = iterate->GetMu();
159 resid->CalcResids(prob,iterate);
160 if (fPrintlevel >= 10)
161 this->DoMonitor(prob,iterate,resid,alpha,sigma,fIter,mu,status_code,1);
171 void TMehrotraSolver::DefMonitor(TQpDataBase * ,TQpVar * ,
173 Double_t alpha,Double_t ,Int_t i,Double_t mu,
174 Int_t status_code,Int_t level)
179 std::cout << std::endl <<
"Duality Gap: " << resids->GetDualityGap() << std::endl;
181 std::cout <<
" alpha = " << alpha << std::endl;
183 std::cout <<
" *** Iteration " << i <<
" *** " << std::endl;
184 std::cout <<
" mu = " << mu <<
" relative residual norm = "
185 << resids->GetResidualNorm()/fDnorm << std::endl;
190 switch (status_code) {
191 case kSUCCESSFUL_TERMINATION:
192 std::cout << std::endl <<
" *** SUCCESSFUL TERMINATION ***" << std::endl;
194 case kMAX_ITS_EXCEEDED:
195 std::cout << std::endl <<
" *** MAXIMUM ITERATIONS REACHED *** " << std::endl;
198 std::cout << std::endl <<
" *** TERMINATION: PROBABLY INFEASIBLE *** " << std::endl;
201 std::cout << std::endl <<
" *** TERMINATION: STATUS UNKNOWN *** " << std::endl;
213 TMehrotraSolver::~TMehrotraSolver()
222 TMehrotraSolver &TMehrotraSolver::operator=(
const TMehrotraSolver &source)
224 if (
this != &source) {
225 TQpSolverBase::operator=(source);
227 fPrintlevel = source.fPrintlevel;
228 fTsig = source.fTsig;
230 if (fStep)
delete fStep;
232 fStep =
new TQpVar(*source.fStep);
233 fFactory = source.fFactory;