54 ClassImp(TQpDataSparse);
59 TQpDataSparse::TQpDataSparse(Int_t nx,Int_t my,Int_t mz)
60 : TQpDataBase(nx,my,mz)
71 TQpDataSparse::TQpDataSparse(TVectorD &c_in, TMatrixDSparse &Q_in,
72 TVectorD &xlow_in,TVectorD &ixlow_in,
73 TVectorD &xupp_in,TVectorD &ixupp_in,
74 TMatrixDSparse &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()) {
116 TQpDataSparse::TQpDataSparse(
const TQpDataSparse &another) : TQpDataBase(another)
125 void TQpDataSparse::SetNonZeros(Int_t nnzQ,Int_t nnzA,Int_t nnzC)
127 fQ.SetSparseIndex(nnzQ);
128 fA.SetSparseIndex(nnzA);
129 fC.SetSparseIndex(nnzC);
136 void TQpDataSparse::Qmult(Double_t beta,TVectorD &y,Double_t alpha,
const TVectorD &x )
139 if (fQ.GetNoElements() > 0)
147 void TQpDataSparse::Amult(Double_t beta,TVectorD &y,Double_t alpha,
const TVectorD &x)
150 if (fA.GetNoElements() > 0)
158 void TQpDataSparse::Cmult(Double_t beta,TVectorD &y,Double_t alpha,
const TVectorD &x)
161 if (fC.GetNoElements() > 0)
169 void TQpDataSparse::ATransmult(Double_t beta,TVectorD &y,Double_t alpha,
const TVectorD &x)
172 if (fA.GetNoElements() > 0)
173 y += alpha*(TMatrixDSparse(TMatrixDSparse::kTransposed,fA)*x);
180 void TQpDataSparse::CTransmult(Double_t beta,TVectorD &y,Double_t alpha,
const TVectorD &x)
183 if (fC.GetNoElements() > 0)
184 y += alpha*(TMatrixDSparse(TMatrixDSparse::kTransposed,fC)*x);
191 Double_t TQpDataSparse::DataNorm()
195 Double_t componentNorm = fG.NormInf();
196 if (componentNorm > norm) norm = componentNorm;
198 TMatrixDSparse fQ_abs(fQ);
199 componentNorm = (fQ_abs.Abs()).Max();
200 if (componentNorm > norm) norm = componentNorm;
202 componentNorm = fBa.NormInf();
203 if (componentNorm > norm) norm = componentNorm;
205 TMatrixDSparse fA_abs(fA);
206 componentNorm = (fA_abs.Abs()).Max();
207 if (componentNorm > norm) norm = componentNorm;
209 TMatrixDSparse fC_abs(fC);
210 componentNorm = (fC_abs.Abs()).Max();
211 if (componentNorm > norm) norm = componentNorm;
213 R__ASSERT(fXloBound.MatchesNonZeroPattern(fXloIndex));
214 componentNorm = fXloBound.NormInf();
215 if (componentNorm > norm) norm = componentNorm;
217 R__ASSERT(fXupBound.MatchesNonZeroPattern(fXupIndex));
218 componentNorm = fXupBound.NormInf();
219 if (componentNorm > norm) norm = componentNorm;
221 R__ASSERT(fCloBound.MatchesNonZeroPattern(fCloIndex));
222 componentNorm = fCloBound.NormInf();
223 if (componentNorm > norm) norm = componentNorm;
225 R__ASSERT(fCupBound.MatchesNonZeroPattern(fCupIndex));
226 componentNorm = fCupBound.NormInf();
227 if (componentNorm > norm) norm = componentNorm;
236 void TQpDataSparse::Print(Option_t * )
const
241 fXloBound.Print(
"xlow");
242 fXloIndex.Print(
"ixlow");
244 fXupBound.Print(
"xupp");
245 fXupIndex.Print(
"ixupp");
251 fCloBound.Print(
"clow");
252 fCloIndex.Print(
"iclow");
254 fCupBound.Print(
"cupp");
255 fCupIndex.Print(
"icupp");
263 void TQpDataSparse::PutQIntoAt(TMatrixDBase &m,Int_t row,Int_t col)
265 m.SetSub(row,col,fQ);
273 void TQpDataSparse::PutAIntoAt(TMatrixDBase &m,Int_t row,Int_t col)
275 m.SetSub(row,col,fA);
283 void TQpDataSparse::PutCIntoAt(TMatrixDBase &m,Int_t row,Int_t col)
285 m.SetSub(row,col,fC);
292 void TQpDataSparse::GetDiagonalOfQ(TVectorD &dq)
294 const Int_t n = TMath::Min(fQ.GetNrows(),fQ.GetNcols());
296 dq = TMatrixDSparseDiag(fQ);
303 Double_t TQpDataSparse::ObjectiveValue(TQpVar *vars)
306 this->Qmult(1.0,tmp,0.5,vars->fX);
315 void TQpDataSparse::DataRandom(TVectorD &x,TVectorD &y,TVectorD &z,TVectorD &s)
317 Double_t ix = 3074.20374;
320 this->RandomlyChooseBoundedVariables(x,xdual,fXloBound,fXloIndex,fXupBound,fXupIndex,ix,.25,.25,.25);
322 TVectorD sprime(fMz);
323 this->RandomlyChooseBoundedVariables(sprime,z,fCloBound,fCloIndex,fCupBound,fCupIndex,ix,.25,.25,.5);
325 fQ.RandomizePD(0.0,1.0,ix);
326 fA.Randomize(-10.0,10.0,ix);
327 fC.Randomize(-10.0,10.0,ix);
328 y .Randomize(-10.0,10.0,ix);
335 fG += TMatrixDSparse(TMatrixDSparse::kTransposed,fA)*y;
336 fG += TMatrixDSparse(TMatrixDSparse::kTransposed,fC)*z;
342 const TVectorD q = s-sprime;
345 Add(fCloBound,1.0,q);
346 Add(fCupBound,1.0,q);
348 fCloBound.SelectNonZeros(fCloIndex);
349 fCupBound.SelectNonZeros(fCupIndex);
356 TQpDataSparse &TQpDataSparse::operator=(
const TQpDataSparse &source)
358 if (
this != &source) {
359 TQpDataBase::operator=(source);
360 fQ.ResizeTo(source.fQ); fQ = source.fQ;
361 fA.ResizeTo(source.fA); fA = source.fA;
362 fC.ResizeTo(source.fC); fC = source.fC;