60 ClassImp(TQpResidual);
65 TQpResidual::TQpResidual()
83 TQpResidual::TQpResidual(Int_t nx,Int_t my,Int_t mz,TVectorD &ixlo,TVectorD &ixup,
84 TVectorD &iclo,TVectorD &icup)
90 if (ixlo.GetNrows() > 0) fXloIndex.Use(ixlo.GetNrows(),ixlo.GetMatrixArray());
91 if (ixup.GetNrows() > 0) fXupIndex.Use(ixup.GetNrows(),ixup.GetMatrixArray());
92 if (iclo.GetNrows() > 0) fCloIndex.Use(iclo.GetNrows(),iclo.GetMatrixArray());
93 if (icup.GetNrows() > 0) fCupIndex.Use(icup.GetNrows(),icup.GetMatrixArray());
94 fNxlo = ixlo.NonZeros();
95 fNxup = ixup.NonZeros();
96 fMclo = iclo.NonZeros();
97 fMcup = icup.NonZeros();
106 fRlambda.ResizeTo(fMz);
114 fRgamma.ResizeTo(fNx);
129 TQpResidual::TQpResidual(
const TQpResidual &another) : TObject(another)
139 void TQpResidual::CalcResids(TQpDataBase *prob_in,TQpVar *vars)
141 TQpDataDens *prob = (TQpDataDens *) prob_in;
143 fRQ.ResizeTo(prob->fG); fRQ = prob->fG;
144 prob->Qmult(1.0,fRQ,1.0,vars->fX);
147 Double_t gap = fRQ*vars->fX;
149 prob->ATransmult(1.0,fRQ,-1.0,vars->fY);
150 prob->CTransmult(1.0,fRQ,-1.0,vars->fZ);
151 if (fNxlo > 0) Add(fRQ,-1.0,vars->fGamma);
152 if (fNxup > 0) Add(fRQ, 1.0,vars->fPhi);
155 Double_t componentNorm = fRQ.NormInf();
156 if (componentNorm > norm) norm = componentNorm;
158 fRA.ResizeTo(prob->fBa); fRA = prob->fBa;
159 prob->Amult(-1.0,fRA,1.0,vars->fX);
162 gap -= prob->fBa*vars->fY;
164 componentNorm = fRA.NormInf();
165 if( componentNorm > norm ) norm = componentNorm;
167 fRC.ResizeTo(vars->fS); fRC = vars->fS;
168 prob->Cmult(-1.0,fRC,1.0,vars->fX);
170 componentNorm = fRC.NormInf();
171 if( componentNorm > norm ) norm = componentNorm;
173 fRz.ResizeTo(vars->fZ); fRz = vars->fZ;
176 Add(fRz,-1.0,vars->fLambda);
178 fRt.ResizeTo(vars->fS); fRt = vars->fS;
179 Add(fRt,-1.0,prob->GetSlowerBound());
180 fRt.SelectNonZeros(fCloIndex);
181 Add(fRt,-1.0,vars->fT);
183 gap -= prob->fCloBound*vars->fLambda;
185 componentNorm = fRt.NormInf();
186 if( componentNorm > norm ) norm = componentNorm;
190 Add(fRz,1.0,vars->fPi);
192 fRu.ResizeTo(vars->fS); fRu = vars->fS;
193 Add(fRu,-1.0,prob->GetSupperBound() );
194 fRu.SelectNonZeros(fCupIndex);
195 Add(fRu,1.0,vars->fU);
197 gap += prob->fCupBound*vars->fPi;
199 componentNorm = fRu.NormInf();
200 if( componentNorm > norm ) norm = componentNorm;
203 componentNorm = fRz.NormInf();
204 if( componentNorm > norm ) norm = componentNorm;
207 fRv.ResizeTo(vars->fX); fRv = vars->fX;
208 Add(fRv,-1.0,prob->GetXlowerBound());
209 fRv.SelectNonZeros(fXloIndex);
210 Add(fRv,-1.0,vars->fV);
212 gap -= prob->fXloBound*vars->fGamma;
214 componentNorm = fRv.NormInf();
215 if( componentNorm > norm ) norm = componentNorm;
219 fRw.ResizeTo(vars->fX); fRw = vars->fX;
220 Add(fRw,-1.0,prob->GetXupperBound());
221 fRw.SelectNonZeros(fXupIndex);
222 Add(fRw,1.0,vars->fW);
224 gap += prob->fXupBound*vars->fPhi;
226 componentNorm = fRw.NormInf();
227 if (componentNorm > norm) norm = componentNorm;
231 fResidualNorm = norm;
239 void TQpResidual::Add_r3_xz_alpha(TQpVar *vars,Double_t alpha)
241 if (fMclo > 0) AddElemMult(fRlambda,1.0,vars->fT,vars->fLambda);
242 if (fMcup > 0) AddElemMult(fRpi ,1.0,vars->fU,vars->fPi);
243 if (fNxlo > 0) AddElemMult(fRgamma ,1.0,vars->fV,vars->fGamma);
244 if (fNxup > 0) AddElemMult(fRphi ,1.0,vars->fW,vars->fPhi);
247 if (fMclo > 0) fRlambda.AddSomeConstant(alpha,fCloIndex);
248 if (fMcup > 0) fRpi .AddSomeConstant(alpha,fCupIndex);
249 if (fNxlo > 0) fRgamma .AddSomeConstant(alpha,fXloIndex);
250 if (fNxup > 0) fRphi .AddSomeConstant(alpha,fXupIndex);
259 void TQpResidual::Set_r3_xz_alpha(TQpVar *vars,Double_t alpha)
262 this->Add_r3_xz_alpha(vars,alpha);
269 void TQpResidual::Clear_r3()
271 if (fMclo > 0) fRlambda.Zero();
272 if (fMcup > 0) fRpi .Zero();
273 if (fNxlo > 0) fRgamma .Zero();
274 if (fNxup > 0) fRphi .Zero();
282 void TQpResidual::Clear_r1r2()
288 if (fNxlo > 0) fRv.Zero();
289 if (fNxup > 0) fRw.Zero();
290 if (fMclo > 0) fRt.Zero();
291 if (fMcup > 0) fRu.Zero();
301 void TQpResidual::Project_r3(Double_t rmin,Double_t rmax)
304 GondzioProjection(fRlambda,rmin,rmax);
305 fRlambda.SelectNonZeros(fCloIndex);
308 GondzioProjection(fRpi,rmin,rmax);
309 fRpi.SelectNonZeros(fCupIndex);
312 GondzioProjection(fRgamma,rmin,rmax);
313 fRgamma.SelectNonZeros(fXloIndex);
316 GondzioProjection(fRphi,rmin,rmax);
317 fRphi.SelectNonZeros(fXupIndex);
325 Bool_t TQpResidual::ValidNonZeroPattern()
328 (!fRv .MatchesNonZeroPattern(fXloIndex) ||
329 !fRgamma.MatchesNonZeroPattern(fXloIndex)) ) {
334 (!fRw .MatchesNonZeroPattern(fXupIndex) ||
335 !fRphi.MatchesNonZeroPattern(fXupIndex)) ) {
339 (!fRt .MatchesNonZeroPattern(fCloIndex) ||
340 !fRlambda.MatchesNonZeroPattern(fCloIndex)) ) {
345 (!fRu .MatchesNonZeroPattern(fCupIndex) ||
346 !fRpi.MatchesNonZeroPattern(fCupIndex)) ) {
359 void TQpResidual::GondzioProjection(TVectorD &v,Double_t rmin,Double_t rmax)
361 Double_t * ep = v.GetMatrixArray();
362 const Double_t *
const fep = ep+v.GetNrows();
371 if (*ep < -rmax) *ep = -rmax;
380 TQpResidual &TQpResidual::operator=(
const TQpResidual &source)
382 if (
this != &source) {
383 TObject::operator=(source);
389 fNxup = source.fNxup;
390 fNxlo = source.fNxlo;
391 fMcup = source.fMcup;
392 fMclo = source.fMclo;
394 fXupIndex.ResizeTo(source.fXupIndex); fXupIndex = source.fXupIndex;
395 fXloIndex.ResizeTo(source.fXloIndex); fXloIndex = source.fXloIndex;
396 fCupIndex.ResizeTo(source.fCupIndex); fCupIndex = source.fCupIndex;
397 fCloIndex.ResizeTo(source.fCloIndex); fCupIndex = source.fCupIndex;
399 fRQ .ResizeTo(source.fRQ); fRQ = source.fRQ;
400 fRA .ResizeTo(source.fRA); fRA = source.fRA;
401 fRC .ResizeTo(source.fRC); fRC = source.fRC;
402 fRz .ResizeTo(source.fRz); fRz = source.fRz;
403 fRv .ResizeTo(source.fRv); fRv = source.fRv;
404 fRw .ResizeTo(source.fRw); fRw = source.fRw;
405 fRt .ResizeTo(source.fRt); fRt = source.fRt;
406 fRu .ResizeTo(source.fRu); fRu = source.fRu;
407 fRgamma .ResizeTo(source.fRgamma); fRgamma = source.fRgamma;
408 fRphi .ResizeTo(source.fRphi); fRphi = source.fRphi;
409 fRlambda.ResizeTo(source.fRlambda); fRlambda = source.fRlambda;
410 fRpi .ResizeTo(source.fRpi); fRpi = source.fRpi;
413 fResidualNorm = source.fResidualNorm;
414 fDualityGap = source.fDualityGap;