ROOT logo
// @(#)root/quadp:$Id: TQpDataSparse.cxx 20882 2007-11-19 11:31:26Z rdm $
// Author: Eddy Offermann   May 2004

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

/*************************************************************************
 * Parts of this file are copied from the OOQP distribution and          *
 * are subject to the following license:                                 *
 *                                                                       *
 * COPYRIGHT 2001 UNIVERSITY OF CHICAGO                                  *
 *                                                                       *
 * The copyright holder hereby grants you royalty-free rights to use,    *
 * reproduce, prepare derivative works, and to redistribute this software*
 * to others, provided that any changes are clearly documented. This     *
 * software was authored by:                                             *
 *                                                                       *
 *   E. MICHAEL GERTZ      gertz@mcs.anl.gov                             *
 *   Mathematics and Computer Science Division                           *
 *   Argonne National Laboratory                                         *
 *   9700 S. Cass Avenue                                                 *
 *   Argonne, IL 60439-4844                                              *
 *                                                                       *
 *   STEPHEN J. WRIGHT     swright@cs.wisc.edu                           *
 *   Computer Sciences Department                                        *
 *   University of Wisconsin                                             *
 *   1210 West Dayton Street                                             *
 *   Madison, WI 53706   FAX: (608)262-9777                              *
 *                                                                       *
 * Any questions or comments may be directed to one of the authors.      *
 *                                                                       *
 * ARGONNE NATIONAL LABORATORY (ANL), WITH FACILITIES IN THE STATES OF   *
 * ILLINOIS AND IDAHO, IS OWNED BY THE UNITED STATES GOVERNMENT, AND     *
 * OPERATED BY THE UNIVERSITY OF CHICAGO UNDER PROVISION OF A CONTRACT   *
 * WITH THE DEPARTMENT OF ENERGY.                                        *
 *************************************************************************/

#include "Riostream.h"
#include "TQpDataSparse.h"

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TQpDataSparse                                                        //
//                                                                      //
// Data for the sparse QP formulation                                   //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

ClassImp(TQpDataSparse)

//______________________________________________________________________________
TQpDataSparse::TQpDataSparse(Int_t nx,Int_t my,Int_t mz)
: TQpDataBase(nx,my,mz)
{
// Constructor

   fQ.ResizeTo(fNx,fNx);
   fA.ResizeTo(fMy,fNx);
   fC.ResizeTo(fMz,fNx);
}


//______________________________________________________________________________
TQpDataSparse::TQpDataSparse(TVectorD       &c_in,   TMatrixDSparse &Q_in,
                             TVectorD       &xlow_in,TVectorD       &ixlow_in,
                             TVectorD       &xupp_in,TVectorD       &ixupp_in,
                             TMatrixDSparse &A_in,   TVectorD       &bA_in,
                             TMatrixDSparse &C_in,
                             TVectorD       &clow_in,TVectorD       &iclow_in,
                             TVectorD       &cupp_in,TVectorD       &icupp_in)
{
// Constructor

   fG       .ResizeTo(c_in)    ; fG        = c_in;
   fBa      .ResizeTo(bA_in)   ; fBa       = bA_in;
   fXloBound.ResizeTo(xlow_in) ; fXloBound = xlow_in;
   fXloIndex.ResizeTo(ixlow_in); fXloIndex = ixlow_in;
   fXupBound.ResizeTo(xupp_in) ; fXupBound = xupp_in;
   fXupIndex.ResizeTo(ixupp_in); fXupIndex = ixupp_in;
   fCloBound.ResizeTo(clow_in) ; fCloBound = clow_in;
   fCloIndex.ResizeTo(iclow_in); fCloIndex = iclow_in;
   fCupBound.ResizeTo(cupp_in) ; fCupBound = cupp_in;
   fCupIndex.ResizeTo(icupp_in); fCupIndex = icupp_in;

   fNx = fG.GetNrows();
   fQ.Use(Q_in);

   if (A_in.GetNrows() > 0) {
      fA.Use(A_in);
      fMy = fA.GetNrows();
   } else
   fMy = 0;

   if (C_in.GetNrows()) {
      fC.Use(C_in);
      fMz = fC.GetNrows();
   } else
   fMz = 0;
   fQ.Print();
   fA.Print();
   fC.Print();
   printf("fNx: %d\n",fNx);
   printf("fMy: %d\n",fMy);
   printf("fMz: %d\n",fMz);
}


//______________________________________________________________________________
TQpDataSparse::TQpDataSparse(const TQpDataSparse &another) : TQpDataBase(another)
{
// Copy constructor

   *this = another;
}


//______________________________________________________________________________
void TQpDataSparse::SetNonZeros(Int_t nnzQ,Int_t nnzA,Int_t nnzC)
{
// Allocate space for the appropriate number of non-zeros in the matrices
 
   fQ.SetSparseIndex(nnzQ);
   fA.SetSparseIndex(nnzA);
   fC.SetSparseIndex(nnzC);
}


//______________________________________________________________________________
void TQpDataSparse::Qmult(Double_t beta,TVectorD &y,Double_t alpha,const TVectorD &x )
{
// calculate y = beta*y + alpha*(fQ*x)

   y *= beta;
   if (fQ.GetNoElements() > 0)
      y += alpha*(fQ*x);
}


//______________________________________________________________________________
void TQpDataSparse::Amult(Double_t beta,TVectorD &y,Double_t alpha,const TVectorD &x)
{
// calculate y = beta*y + alpha*(fA*x)

   y *= beta;
   if (fA.GetNoElements() > 0)
      y += alpha*(fA*x);
}


//______________________________________________________________________________
void TQpDataSparse::Cmult(Double_t beta,TVectorD &y,Double_t alpha,const TVectorD &x)
{
// calculate y = beta*y + alpha*(fC*x)

   y *= beta;
   if (fC.GetNoElements() > 0)
      y += alpha*(fC*x);
}


//______________________________________________________________________________
void TQpDataSparse::ATransmult(Double_t beta,TVectorD &y,Double_t alpha,const TVectorD &x)
{
// calculate y = beta*y + alpha*(fA^T*x)

   y *= beta;
   if (fA.GetNoElements() > 0)
      y += alpha*(TMatrixDSparse(TMatrixDSparse::kTransposed,fA)*x);
}


//______________________________________________________________________________
void TQpDataSparse::CTransmult(Double_t beta,TVectorD &y,Double_t alpha,const TVectorD &x)
{
// calculate y = beta*y + alpha*(fC^T*x)

   y *= beta;
   if (fC.GetNoElements() > 0)
      y += alpha*(TMatrixDSparse(TMatrixDSparse::kTransposed,fC)*x);
}


//______________________________________________________________________________
Double_t TQpDataSparse::DataNorm()
{
// Return the largest component of several vectors in the data class

   Double_t norm = 0.0;

   Double_t componentNorm = fG.NormInf();
   if (componentNorm > norm) norm = componentNorm;

   TMatrixDSparse fQ_abs(fQ);
   componentNorm = (fQ_abs.Abs()).Max();
   if (componentNorm > norm) norm = componentNorm;

   componentNorm = fBa.NormInf();
   if (componentNorm > norm) norm = componentNorm;

   TMatrixDSparse fA_abs(fQ);
   componentNorm = (fA_abs.Abs()).Max();
   if (componentNorm > norm) norm = componentNorm;

   TMatrixDSparse fC_abs(fQ);
   componentNorm = (fC_abs.Abs()).Max();
   if (componentNorm > norm) norm = componentNorm;

   R__ASSERT(fXloBound.MatchesNonZeroPattern(fXloIndex));
   componentNorm = fXloBound.NormInf();
   if (componentNorm > norm) norm = componentNorm;

   R__ASSERT(fXupBound.MatchesNonZeroPattern(fXupIndex));
   componentNorm = fXupBound.NormInf();
   if (componentNorm > norm) norm = componentNorm;

   R__ASSERT(fCloBound.MatchesNonZeroPattern(fCloIndex));
   componentNorm = fCloBound.NormInf();
   if (componentNorm > norm) norm = componentNorm;

   R__ASSERT(fCupBound.MatchesNonZeroPattern(fCupIndex));
   componentNorm = fCupBound.NormInf();
   if (componentNorm > norm) norm = componentNorm;

   return norm;
}


//______________________________________________________________________________
void TQpDataSparse::Print(Option_t * /*opt*/) const
{
// Print class members

   fQ.Print("Q");
   fG.Print("c");

   fXloBound.Print("xlow");
   fXloIndex.Print("ixlow");

   fXupBound.Print("xupp");
   fXupIndex.Print("ixupp");

   fA.Print("A");
   fBa.Print("b");
   fC.Print("C");

   fCloBound.Print("clow");
   fCloIndex.Print("iclow");

   fCupBound.Print("cupp");
   fCupIndex.Print("icupp");
}


//______________________________________________________________________________
void TQpDataSparse::PutQIntoAt(TMatrixDBase &m,Int_t row,Int_t col)
{
// Insert the Hessian Q into the matrix M at index (row,col) for the fundamental
// linear system

   m.SetSub(row,col,fQ);
}


//______________________________________________________________________________
void TQpDataSparse::PutAIntoAt(TMatrixDBase &m,Int_t row,Int_t col)
{
// Insert the constraint matrix A into the matrix M at index (row,col) for the fundamental
// linear system

   m.SetSub(row,col,fA);
}


//______________________________________________________________________________
void TQpDataSparse::PutCIntoAt(TMatrixDBase &m,Int_t row,Int_t col)
{
// Insert the constraint matrix C into the matrix M at index (row,col) for the fundamental
// linear system

   m.SetSub(row,col,fC);
}


//______________________________________________________________________________
void TQpDataSparse::GetDiagonalOfQ(TVectorD &dq)
{
// Return in vector dq the diagonal of matrix fQ

   const Int_t n = TMath::Min(fQ.GetNrows(),fQ.GetNcols());
   dq.ResizeTo(n);
   dq = TMatrixDSparseDiag(fQ);
}


//______________________________________________________________________________
Double_t TQpDataSparse::ObjectiveValue(TQpVar *vars)
{
// Return value of the objective function

   TVectorD tmp(fG);
   this->Qmult(1.0,tmp,0.5,vars->fX);

   return tmp*vars->fX;
}


//______________________________________________________________________________
void TQpDataSparse::DataRandom(TVectorD &x,TVectorD &y,TVectorD &z,TVectorD &s)
{
// Choose randomly a QP problem

   Double_t ix = 3074.20374;

   TVectorD xdual(fNx);
   this->RandomlyChooseBoundedVariables(x,xdual,fXloBound,fXloIndex,fXupBound,fXupIndex,ix,.25,.25,.25);

   TVectorD sprime(fMz);
   this->RandomlyChooseBoundedVariables(sprime,z,fCloBound,fCloIndex,fCupBound,fCupIndex,ix,.25,.25,.5);

   fQ.RandomizePD(0.0,1.0,ix);
   fA.Randomize(-10.0,10.0,ix);
   fC.Randomize(-10.0,10.0,ix);
   y .Randomize(-10.0,10.0,ix);

   // fG = - fQ x + A^T y + C^T z + xdual

   fG = xdual;
   fG -= fQ*x;

   fG += TMatrixDSparse(TMatrixDSparse::kTransposed,fA)*y;
   fG += TMatrixDSparse(TMatrixDSparse::kTransposed,fC)*z;

   fBa = fA*x;
   s   = fC*x;

   // Now compute the real q = s-sprime
   const TVectorD q = s-sprime;

   // Adjust fCloBound and fCupBound appropriately
   Add(fCloBound,1.0,q);
   Add(fCupBound,1.0,q);

   fCloBound.SelectNonZeros(fCloIndex);
   fCupBound.SelectNonZeros(fCupIndex);
}


//______________________________________________________________________________
TQpDataSparse &TQpDataSparse::operator=(const TQpDataSparse &source)
{
// Assignment operator

   if (this != &source) {
      TQpDataBase::operator=(source);
      fQ.ResizeTo(source.fQ); fQ = source.fQ;
      fA.ResizeTo(source.fA); fA = source.fA;
      fC.ResizeTo(source.fC); fC = source.fC;
   }
   return *this;
}
 TQpDataSparse.cxx:1
 TQpDataSparse.cxx:2
 TQpDataSparse.cxx:3
 TQpDataSparse.cxx:4
 TQpDataSparse.cxx:5
 TQpDataSparse.cxx:6
 TQpDataSparse.cxx:7
 TQpDataSparse.cxx:8
 TQpDataSparse.cxx:9
 TQpDataSparse.cxx:10
 TQpDataSparse.cxx:11
 TQpDataSparse.cxx:12
 TQpDataSparse.cxx:13
 TQpDataSparse.cxx:14
 TQpDataSparse.cxx:15
 TQpDataSparse.cxx:16
 TQpDataSparse.cxx:17
 TQpDataSparse.cxx:18
 TQpDataSparse.cxx:19
 TQpDataSparse.cxx:20
 TQpDataSparse.cxx:21
 TQpDataSparse.cxx:22
 TQpDataSparse.cxx:23
 TQpDataSparse.cxx:24
 TQpDataSparse.cxx:25
 TQpDataSparse.cxx:26
 TQpDataSparse.cxx:27
 TQpDataSparse.cxx:28
 TQpDataSparse.cxx:29
 TQpDataSparse.cxx:30
 TQpDataSparse.cxx:31
 TQpDataSparse.cxx:32
 TQpDataSparse.cxx:33
 TQpDataSparse.cxx:34
 TQpDataSparse.cxx:35
 TQpDataSparse.cxx:36
 TQpDataSparse.cxx:37
 TQpDataSparse.cxx:38
 TQpDataSparse.cxx:39
 TQpDataSparse.cxx:40
 TQpDataSparse.cxx:41
 TQpDataSparse.cxx:42
 TQpDataSparse.cxx:43
 TQpDataSparse.cxx:44
 TQpDataSparse.cxx:45
 TQpDataSparse.cxx:46
 TQpDataSparse.cxx:47
 TQpDataSparse.cxx:48
 TQpDataSparse.cxx:49
 TQpDataSparse.cxx:50
 TQpDataSparse.cxx:51
 TQpDataSparse.cxx:52
 TQpDataSparse.cxx:53
 TQpDataSparse.cxx:54
 TQpDataSparse.cxx:55
 TQpDataSparse.cxx:56
 TQpDataSparse.cxx:57
 TQpDataSparse.cxx:58
 TQpDataSparse.cxx:59
 TQpDataSparse.cxx:60
 TQpDataSparse.cxx:61
 TQpDataSparse.cxx:62
 TQpDataSparse.cxx:63
 TQpDataSparse.cxx:64
 TQpDataSparse.cxx:65
 TQpDataSparse.cxx:66
 TQpDataSparse.cxx:67
 TQpDataSparse.cxx:68
 TQpDataSparse.cxx:69
 TQpDataSparse.cxx:70
 TQpDataSparse.cxx:71
 TQpDataSparse.cxx:72
 TQpDataSparse.cxx:73
 TQpDataSparse.cxx:74
 TQpDataSparse.cxx:75
 TQpDataSparse.cxx:76
 TQpDataSparse.cxx:77
 TQpDataSparse.cxx:78
 TQpDataSparse.cxx:79
 TQpDataSparse.cxx:80
 TQpDataSparse.cxx:81
 TQpDataSparse.cxx:82
 TQpDataSparse.cxx:83
 TQpDataSparse.cxx:84
 TQpDataSparse.cxx:85
 TQpDataSparse.cxx:86
 TQpDataSparse.cxx:87
 TQpDataSparse.cxx:88
 TQpDataSparse.cxx:89
 TQpDataSparse.cxx:90
 TQpDataSparse.cxx:91
 TQpDataSparse.cxx:92
 TQpDataSparse.cxx:93
 TQpDataSparse.cxx:94
 TQpDataSparse.cxx:95
 TQpDataSparse.cxx:96
 TQpDataSparse.cxx:97
 TQpDataSparse.cxx:98
 TQpDataSparse.cxx:99
 TQpDataSparse.cxx:100
 TQpDataSparse.cxx:101
 TQpDataSparse.cxx:102
 TQpDataSparse.cxx:103
 TQpDataSparse.cxx:104
 TQpDataSparse.cxx:105
 TQpDataSparse.cxx:106
 TQpDataSparse.cxx:107
 TQpDataSparse.cxx:108
 TQpDataSparse.cxx:109
 TQpDataSparse.cxx:110
 TQpDataSparse.cxx:111
 TQpDataSparse.cxx:112
 TQpDataSparse.cxx:113
 TQpDataSparse.cxx:114
 TQpDataSparse.cxx:115
 TQpDataSparse.cxx:116
 TQpDataSparse.cxx:117
 TQpDataSparse.cxx:118
 TQpDataSparse.cxx:119
 TQpDataSparse.cxx:120
 TQpDataSparse.cxx:121
 TQpDataSparse.cxx:122
 TQpDataSparse.cxx:123
 TQpDataSparse.cxx:124
 TQpDataSparse.cxx:125
 TQpDataSparse.cxx:126
 TQpDataSparse.cxx:127
 TQpDataSparse.cxx:128
 TQpDataSparse.cxx:129
 TQpDataSparse.cxx:130
 TQpDataSparse.cxx:131
 TQpDataSparse.cxx:132
 TQpDataSparse.cxx:133
 TQpDataSparse.cxx:134
 TQpDataSparse.cxx:135
 TQpDataSparse.cxx:136
 TQpDataSparse.cxx:137
 TQpDataSparse.cxx:138
 TQpDataSparse.cxx:139
 TQpDataSparse.cxx:140
 TQpDataSparse.cxx:141
 TQpDataSparse.cxx:142
 TQpDataSparse.cxx:143
 TQpDataSparse.cxx:144
 TQpDataSparse.cxx:145
 TQpDataSparse.cxx:146
 TQpDataSparse.cxx:147
 TQpDataSparse.cxx:148
 TQpDataSparse.cxx:149
 TQpDataSparse.cxx:150
 TQpDataSparse.cxx:151
 TQpDataSparse.cxx:152
 TQpDataSparse.cxx:153
 TQpDataSparse.cxx:154
 TQpDataSparse.cxx:155
 TQpDataSparse.cxx:156
 TQpDataSparse.cxx:157
 TQpDataSparse.cxx:158
 TQpDataSparse.cxx:159
 TQpDataSparse.cxx:160
 TQpDataSparse.cxx:161
 TQpDataSparse.cxx:162
 TQpDataSparse.cxx:163
 TQpDataSparse.cxx:164
 TQpDataSparse.cxx:165
 TQpDataSparse.cxx:166
 TQpDataSparse.cxx:167
 TQpDataSparse.cxx:168
 TQpDataSparse.cxx:169
 TQpDataSparse.cxx:170
 TQpDataSparse.cxx:171
 TQpDataSparse.cxx:172
 TQpDataSparse.cxx:173
 TQpDataSparse.cxx:174
 TQpDataSparse.cxx:175
 TQpDataSparse.cxx:176
 TQpDataSparse.cxx:177
 TQpDataSparse.cxx:178
 TQpDataSparse.cxx:179
 TQpDataSparse.cxx:180
 TQpDataSparse.cxx:181
 TQpDataSparse.cxx:182
 TQpDataSparse.cxx:183
 TQpDataSparse.cxx:184
 TQpDataSparse.cxx:185
 TQpDataSparse.cxx:186
 TQpDataSparse.cxx:187
 TQpDataSparse.cxx:188
 TQpDataSparse.cxx:189
 TQpDataSparse.cxx:190
 TQpDataSparse.cxx:191
 TQpDataSparse.cxx:192
 TQpDataSparse.cxx:193
 TQpDataSparse.cxx:194
 TQpDataSparse.cxx:195
 TQpDataSparse.cxx:196
 TQpDataSparse.cxx:197
 TQpDataSparse.cxx:198
 TQpDataSparse.cxx:199
 TQpDataSparse.cxx:200
 TQpDataSparse.cxx:201
 TQpDataSparse.cxx:202
 TQpDataSparse.cxx:203
 TQpDataSparse.cxx:204
 TQpDataSparse.cxx:205
 TQpDataSparse.cxx:206
 TQpDataSparse.cxx:207
 TQpDataSparse.cxx:208
 TQpDataSparse.cxx:209
 TQpDataSparse.cxx:210
 TQpDataSparse.cxx:211
 TQpDataSparse.cxx:212
 TQpDataSparse.cxx:213
 TQpDataSparse.cxx:214
 TQpDataSparse.cxx:215
 TQpDataSparse.cxx:216
 TQpDataSparse.cxx:217
 TQpDataSparse.cxx:218
 TQpDataSparse.cxx:219
 TQpDataSparse.cxx:220
 TQpDataSparse.cxx:221
 TQpDataSparse.cxx:222
 TQpDataSparse.cxx:223
 TQpDataSparse.cxx:224
 TQpDataSparse.cxx:225
 TQpDataSparse.cxx:226
 TQpDataSparse.cxx:227
 TQpDataSparse.cxx:228
 TQpDataSparse.cxx:229
 TQpDataSparse.cxx:230
 TQpDataSparse.cxx:231
 TQpDataSparse.cxx:232
 TQpDataSparse.cxx:233
 TQpDataSparse.cxx:234
 TQpDataSparse.cxx:235
 TQpDataSparse.cxx:236
 TQpDataSparse.cxx:237
 TQpDataSparse.cxx:238
 TQpDataSparse.cxx:239
 TQpDataSparse.cxx:240
 TQpDataSparse.cxx:241
 TQpDataSparse.cxx:242
 TQpDataSparse.cxx:243
 TQpDataSparse.cxx:244
 TQpDataSparse.cxx:245
 TQpDataSparse.cxx:246
 TQpDataSparse.cxx:247
 TQpDataSparse.cxx:248
 TQpDataSparse.cxx:249
 TQpDataSparse.cxx:250
 TQpDataSparse.cxx:251
 TQpDataSparse.cxx:252
 TQpDataSparse.cxx:253
 TQpDataSparse.cxx:254
 TQpDataSparse.cxx:255
 TQpDataSparse.cxx:256
 TQpDataSparse.cxx:257
 TQpDataSparse.cxx:258
 TQpDataSparse.cxx:259
 TQpDataSparse.cxx:260
 TQpDataSparse.cxx:261
 TQpDataSparse.cxx:262
 TQpDataSparse.cxx:263
 TQpDataSparse.cxx:264
 TQpDataSparse.cxx:265
 TQpDataSparse.cxx:266
 TQpDataSparse.cxx:267
 TQpDataSparse.cxx:268
 TQpDataSparse.cxx:269
 TQpDataSparse.cxx:270
 TQpDataSparse.cxx:271
 TQpDataSparse.cxx:272
 TQpDataSparse.cxx:273
 TQpDataSparse.cxx:274
 TQpDataSparse.cxx:275
 TQpDataSparse.cxx:276
 TQpDataSparse.cxx:277
 TQpDataSparse.cxx:278
 TQpDataSparse.cxx:279
 TQpDataSparse.cxx:280
 TQpDataSparse.cxx:281
 TQpDataSparse.cxx:282
 TQpDataSparse.cxx:283
 TQpDataSparse.cxx:284
 TQpDataSparse.cxx:285
 TQpDataSparse.cxx:286
 TQpDataSparse.cxx:287
 TQpDataSparse.cxx:288
 TQpDataSparse.cxx:289
 TQpDataSparse.cxx:290
 TQpDataSparse.cxx:291
 TQpDataSparse.cxx:292
 TQpDataSparse.cxx:293
 TQpDataSparse.cxx:294
 TQpDataSparse.cxx:295
 TQpDataSparse.cxx:296
 TQpDataSparse.cxx:297
 TQpDataSparse.cxx:298
 TQpDataSparse.cxx:299
 TQpDataSparse.cxx:300
 TQpDataSparse.cxx:301
 TQpDataSparse.cxx:302
 TQpDataSparse.cxx:303
 TQpDataSparse.cxx:304
 TQpDataSparse.cxx:305
 TQpDataSparse.cxx:306
 TQpDataSparse.cxx:307
 TQpDataSparse.cxx:308
 TQpDataSparse.cxx:309
 TQpDataSparse.cxx:310
 TQpDataSparse.cxx:311
 TQpDataSparse.cxx:312
 TQpDataSparse.cxx:313
 TQpDataSparse.cxx:314
 TQpDataSparse.cxx:315
 TQpDataSparse.cxx:316
 TQpDataSparse.cxx:317
 TQpDataSparse.cxx:318
 TQpDataSparse.cxx:319
 TQpDataSparse.cxx:320
 TQpDataSparse.cxx:321
 TQpDataSparse.cxx:322
 TQpDataSparse.cxx:323
 TQpDataSparse.cxx:324
 TQpDataSparse.cxx:325
 TQpDataSparse.cxx:326
 TQpDataSparse.cxx:327
 TQpDataSparse.cxx:328
 TQpDataSparse.cxx:329
 TQpDataSparse.cxx:330
 TQpDataSparse.cxx:331
 TQpDataSparse.cxx:332
 TQpDataSparse.cxx:333
 TQpDataSparse.cxx:334
 TQpDataSparse.cxx:335
 TQpDataSparse.cxx:336
 TQpDataSparse.cxx:337
 TQpDataSparse.cxx:338
 TQpDataSparse.cxx:339
 TQpDataSparse.cxx:340
 TQpDataSparse.cxx:341
 TQpDataSparse.cxx:342
 TQpDataSparse.cxx:343
 TQpDataSparse.cxx:344
 TQpDataSparse.cxx:345
 TQpDataSparse.cxx:346
 TQpDataSparse.cxx:347
 TQpDataSparse.cxx:348
 TQpDataSparse.cxx:349
 TQpDataSparse.cxx:350
 TQpDataSparse.cxx:351
 TQpDataSparse.cxx:352
 TQpDataSparse.cxx:353
 TQpDataSparse.cxx:354
 TQpDataSparse.cxx:355
 TQpDataSparse.cxx:356
 TQpDataSparse.cxx:357
 TQpDataSparse.cxx:358
 TQpDataSparse.cxx:359
 TQpDataSparse.cxx:360
 TQpDataSparse.cxx:361
 TQpDataSparse.cxx:362
 TQpDataSparse.cxx:363
 TQpDataSparse.cxx:364
 TQpDataSparse.cxx:365