54 ClassImp(TQpDataDens);
59 TQpDataDens::TQpDataDens(Int_t nx,Int_t my,Int_t mz)
60 : TQpDataBase(nx,my,mz)
71 TQpDataDens::TQpDataDens(TVectorD &c_in, TMatrixDSym &Q_in,
72 TVectorD &xlow_in,TVectorD &ixlow_in,
73 TVectorD &xupp_in,TVectorD &ixupp_in,
74 TMatrixD &A_in, TVectorD &bA_in,
76 TVectorD &clow_in,TVectorD &iclow_in,
77 TVectorD &cupp_in,TVectorD &icupp_in)
79 fG .ResizeTo(c_in) ; fG = c_in;
80 fBa .ResizeTo(bA_in) ; fBa = bA_in;
81 fXloBound.ResizeTo(xlow_in) ; fXloBound = xlow_in;
82 fXloIndex.ResizeTo(ixlow_in); fXloIndex = ixlow_in;
83 fXupBound.ResizeTo(xupp_in) ; fXupBound = xupp_in;
84 fXupIndex.ResizeTo(ixupp_in); fXupIndex = ixupp_in;
85 fCloBound.ResizeTo(clow_in) ; fCloBound = clow_in;
86 fCloIndex.ResizeTo(iclow_in); fCloIndex = iclow_in;
87 fCupBound.ResizeTo(cupp_in) ; fCupBound = cupp_in;
88 fCupIndex.ResizeTo(icupp_in); fCupIndex = icupp_in;
93 if (A_in.GetNrows() > 0) {
99 if (C_in.GetNrows() > 0) {
110 TQpDataDens::TQpDataDens(
const TQpDataDens &another) : TQpDataBase(another)
119 void TQpDataDens::Qmult(Double_t beta,TVectorD &y,Double_t alpha,
const TVectorD &x )
122 if (fQ.GetNoElements() > 0)
130 void TQpDataDens::Amult(Double_t beta,TVectorD &y,Double_t alpha,
const TVectorD &x)
133 if (fA.GetNoElements() > 0)
141 void TQpDataDens::Cmult(Double_t beta,TVectorD &y,Double_t alpha,
const TVectorD &x)
144 if (fC.GetNoElements() > 0)
152 void TQpDataDens::ATransmult(Double_t beta,TVectorD &y,Double_t alpha,
const TVectorD &x)
155 if (fA.GetNoElements() > 0)
156 y += alpha*(TMatrixD(TMatrixD::kTransposed,fA)*x);
163 void TQpDataDens::CTransmult(Double_t beta,TVectorD &y,Double_t alpha,
const TVectorD &x)
166 if (fC.GetNoElements() > 0)
167 y += alpha*(TMatrixD(TMatrixD::kTransposed,fC)*x);
174 Double_t TQpDataDens::DataNorm()
178 Double_t componentNorm = fG.NormInf();
179 if (componentNorm > norm) norm = componentNorm;
181 TMatrixDSym fQ_abs(fQ);
182 componentNorm = (fQ_abs.Abs()).Max();
183 if (componentNorm > norm) norm = componentNorm;
185 componentNorm = fBa.NormInf();
186 if (componentNorm > norm) norm = componentNorm;
189 componentNorm = (fA_abs.Abs()).Max();
190 if (componentNorm > norm) norm = componentNorm;
193 componentNorm = (fC_abs.Abs()).Max();
194 if (componentNorm > norm) norm = componentNorm;
196 R__ASSERT(fXloBound.MatchesNonZeroPattern(fXloIndex));
197 componentNorm = fXloBound.NormInf();
198 if (componentNorm > norm) norm = componentNorm;
200 R__ASSERT(fXupBound.MatchesNonZeroPattern(fXupIndex));
201 componentNorm = fXupBound.NormInf();
202 if (componentNorm > norm) norm = componentNorm;
204 R__ASSERT(fCloBound.MatchesNonZeroPattern(fCloIndex));
205 componentNorm = fCloBound.NormInf();
206 if (componentNorm > norm) norm = componentNorm;
208 R__ASSERT(fCupBound.MatchesNonZeroPattern(fCupIndex));
209 componentNorm = fCupBound.NormInf();
210 if (componentNorm > norm) norm = componentNorm;
219 void TQpDataDens::Print(Option_t * )
const
224 fXloBound.Print(
"xlow");
225 fXloIndex.Print(
"ixlow");
227 fXupBound.Print(
"xupp");
228 fXupIndex.Print(
"ixupp");
234 fCloBound.Print(
"clow");
235 fCloIndex.Print(
"iclow");
237 fCupBound.Print(
"cupp");
238 fCupIndex.Print(
"icupp");
246 void TQpDataDens::PutQIntoAt(TMatrixDBase &m,Int_t row,Int_t col)
248 m.SetSub(row,col,fQ);
256 void TQpDataDens::PutAIntoAt(TMatrixDBase &m,Int_t row,Int_t col)
258 m.SetSub(row,col,fA);
266 void TQpDataDens::PutCIntoAt(TMatrixDBase &m,Int_t row,Int_t col)
268 m.SetSub(row,col,fC);
275 void TQpDataDens::GetDiagonalOfQ(TVectorD &dq)
277 const Int_t n = TMath::Min(fQ.GetNrows(),fQ.GetNcols());
279 dq = TMatrixDDiag(fQ);
286 Double_t TQpDataDens::ObjectiveValue(TQpVar *vars)
289 this->Qmult(1.0,tmp,0.5,vars->fX);
298 void TQpDataDens::DataRandom(TVectorD &x,TVectorD &y,TVectorD &z,TVectorD &s)
300 Double_t ix = 3074.20374;
303 this->RandomlyChooseBoundedVariables(x,xdual,fXloBound,fXloIndex,fXupBound,fXupIndex,ix,.25,.25,.25);
304 TVectorD sprime(fMz);
305 this->RandomlyChooseBoundedVariables(sprime,z,fCloBound,fCloIndex,fCupBound,fCupIndex,ix,.25,.25,.5);
307 fQ.RandomizePD(0.0,1.0,ix);
308 fA.Randomize(-10.0,10.0,ix);
309 fC.Randomize(-10.0,10.0,ix);
310 y .Randomize(-10.0,10.0,ix);
315 fG += TMatrixD(TMatrixD::kTransposed,fA)*y;
316 fG += TMatrixD(TMatrixD::kTransposed,fC)*z;
322 const TVectorD q = s-sprime;
325 Add(fCloBound,1.0,q);
326 Add(fCupBound,1.0,q);
328 fCloBound.SelectNonZeros(fCloIndex);
329 fCupBound.SelectNonZeros(fCupIndex);
336 TQpDataDens &TQpDataDens::operator=(
const TQpDataDens &source)
338 if (
this != &source) {
339 TQpDataBase::operator=(source);
340 fQ.ResizeTo(source.fQ); fQ = source.fQ;
341 fA.ResizeTo(source.fA); fA = source.fA;
342 fC.ResizeTo(source.fC); fC = source.fC;