ROOT logo
// @(#)root/quadp:$Id: TQpSolverBase.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.                                        *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TSolverBase                                                          //
//                                                                      //
// The Solver class contains methods for monitoring and checking the    //
// convergence status of the algorithm, methods to determine the step   //
// length along a given direction, methods to define the starting point,//
// and the solve method that implements the interior-point algorithm    //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TMath.h"
#include "TQpSolverBase.h"

ClassImp(TQpSolverBase)

//______________________________________________________________________________
TQpSolverBase::TQpSolverBase()
{
// Default constructor

   fSys = 0;

   fDnorm = 0.;

   // define parameters associated with the step length heuristic
   fMutol   = 1.0e-8;
   fArtol   = 1.0e-8;
   fGamma_f = 0.99;
   fGamma_a = 1.0/(1.0-fGamma_f);

   fPhi   = 0.0;

   fMaxit = 100;

   // allocate space to track the sequence of complementarity gaps,
   // residual norms, and merit functions.
   fMu_history      = new Double_t[fMaxit];
   fRnorm_history   = new Double_t[fMaxit];
   fPhi_history     = new Double_t[fMaxit];
   fPhi_min_history = new Double_t[fMaxit];
}


//______________________________________________________________________________
TQpSolverBase::TQpSolverBase(const TQpSolverBase &another) : TObject(another)
{
// Copy constructor

   *this = another;
}


//______________________________________________________________________________
TQpSolverBase::~TQpSolverBase()
{
// Deconstructor

   if (fSys) { delete fSys; fSys = 0; }

   if (fMu_history) { delete [] fMu_history;      fMu_history      = 0; }
   if (fMu_history) { delete [] fRnorm_history;   fRnorm_history   = 0; }
   if (fMu_history) { delete [] fPhi_history;     fPhi_history     = 0; }
   if (fMu_history) { delete [] fPhi_min_history; fPhi_min_history = 0; }
}


//______________________________________________________________________________
void TQpSolverBase::Start(TQpProbBase *formulation,TQpVar *iterate,TQpDataBase *prob,
                          TQpResidual *resid,TQpVar *step)
{
// Implements a default starting-point heuristic. While interior-point theory
//  places fairly loose restrictions on the choice of starting point, the choice 
// of heuristic can significantly affect the robustness and efficiency of the
//  algorithm.

   this->DefStart(formulation,iterate,prob,resid,step);
}


//______________________________________________________________________________
void TQpSolverBase::DefStart(TQpProbBase * /* formulation */,TQpVar *iterate,
                             TQpDataBase *prob,TQpResidual *resid,TQpVar *step)
{
// Default starting point

   Double_t sdatanorm = TMath::Sqrt(fDnorm);
   Double_t a         = sdatanorm;
   Double_t b         = sdatanorm;

   iterate->InteriorPoint(a,b);
   resid->CalcResids(prob,iterate);
   resid->Set_r3_xz_alpha(iterate,0.0);

   fSys->Factor(prob,iterate);
   fSys->Solve(prob,iterate,resid,step);
   step->Negate();

   // Take the full affine scaling step
   iterate->Saxpy(step,1.0);
   // resid.CalcResids(prob,iterate); // Calc the resids if debugging.
   Double_t shift = 1.e3+2*iterate->Violation();
   iterate->ShiftBoundVariables(shift,shift);
}


//______________________________________________________________________________
void TQpSolverBase::SteveStart(TQpProbBase * /* formulation */,
                               TQpVar *iterate,TQpDataBase *prob,
                               TQpResidual *resid,TQpVar *step)
{
// Starting point algoritm according to Stephen Wright

   Double_t sdatanorm = TMath::Sqrt(fDnorm);
   Double_t a = 0.0;
   Double_t b = 0.0;

   iterate->InteriorPoint(a,b);

   // set the r3 component of the rhs to -(norm of data), and calculate
   // the residuals that are obtained when all values are zero.

   resid->Set_r3_xz_alpha(iterate,-sdatanorm);
   resid->CalcResids(prob,iterate);

   // next, assign 1 to all the complementary variables, so that there
   // are identities in the coefficient matrix when we do the solve.

   a = 1.0; b = 1.0;
   iterate->InteriorPoint(a,b);
   fSys->Factor(prob,iterate);
   fSys->Solve (prob,iterate,resid,step);
   step->Negate();

   // copy the "step" into the current vector

   iterate = step;

   // calculate the maximum violation of the complementarity
   // conditions, and shift these variables to restore positivity.
   Double_t shift = 1.5*iterate->Violation();
   iterate->ShiftBoundVariables(shift,shift);

   // do Mehrotra-type adjustment

   const Double_t mutemp = iterate->GetMu();
   const Double_t xsnorm = iterate->Norm1();
   const Double_t delta = 0.5*iterate->fNComplementaryVariables*mutemp/xsnorm;
   iterate->ShiftBoundVariables(delta,delta);
}


//______________________________________________________________________________
void TQpSolverBase::DumbStart(TQpProbBase * /* formulation */,
                              TQpVar *iterate,TQpDataBase * /* prob */,
                              TQpResidual * /* resid */,TQpVar * /* step */)
{
// Alternative starting point heuristic: sets the "complementary" variables to a large
// positive value (based on the norm of the problem data) and the remaining variables
// to zero .

   const Double_t sdatanorm = fDnorm;
   const Double_t a = 1.e3;
   const Double_t b = 1.e5;
   const Double_t bigstart = a*sdatanorm+b;
   iterate->InteriorPoint(bigstart,bigstart);
}


//______________________________________________________________________________
Double_t TQpSolverBase::FinalStepLength(TQpVar *iterate,TQpVar *step)
{
// Implements a version of Mehrotra starting point heuristic,
//  modified to ensure identical steps in the primal and dual variables.

   Int_t firstOrSecond;
   Double_t primalValue; Double_t primalStep; Double_t dualValue; Double_t dualStep;
   const Double_t maxAlpha = iterate->FindBlocking(step,primalValue,primalStep,
      dualValue,dualStep,firstOrSecond);
   Double_t mufull = iterate->MuStep(step,maxAlpha);

   mufull /= fGamma_a;

   Double_t alpha = 1.0;
   switch (firstOrSecond) {
      case 0:
         alpha = 1;              // No constraints were blocking
         break;
      case 1:
         alpha = (-primalValue+mufull/(dualValue+maxAlpha*dualStep))/primalStep;
         break;
      case 2:
         alpha = (-dualValue+mufull/(primalValue+maxAlpha*primalStep))/dualStep;
         break;
      default:
         R__ASSERT(0 && "Can't get here");
         break;
   }
   // make it at least fGamma_f * maxStep
   if (alpha < fGamma_f*maxAlpha) alpha = fGamma_f*maxAlpha;
   // back off just a touch
   alpha *= .99999999;

   return alpha;
}


//______________________________________________________________________________
void TQpSolverBase::DoMonitor(TQpDataBase *data,TQpVar *vars,TQpResidual *resids,
                              Double_t alpha,Double_t sigma,Int_t i,Double_t mu,
                              Int_t stop_code,Int_t level)
{
// Monitor progress / convergence aat each interior-point iteration

   this->DefMonitor(data,vars,resids,alpha,sigma,i,mu,stop_code,level);
}


//______________________________________________________________________________
Int_t TQpSolverBase::DoStatus(TQpDataBase *data,TQpVar *vars,TQpResidual *resids,
                              Int_t i,Double_t mu,Int_t level)
{
// Tests for termination. Unless the user supplies a specific termination 
// routine, this method calls another method defaultStatus, which returns 
// a code indicating the current convergence status.

   return this->DefStatus(data,vars,resids,i,mu,level);
}


//______________________________________________________________________________
Int_t TQpSolverBase::DefStatus(TQpDataBase * /* data */,TQpVar * /* vars */,
                               TQpResidual *resids,Int_t iterate,Double_t mu,Int_t /* level */)
{
// Default status method

   Int_t stop_code = kNOT_FINISHED;

   const Double_t gap   = TMath::Abs(resids->GetDualityGap());
   const Double_t rnorm = resids->GetResidualNorm();

   Int_t idx = iterate-1;
   if (idx <  0     ) idx = 0;
   if (idx >= fMaxit) idx = fMaxit-1;

   // store the historical record
   fMu_history[idx] = mu;
   fRnorm_history[idx] = rnorm;
   fPhi = (rnorm+gap)/fDnorm;
   fPhi_history[idx] = fPhi;

   if (idx > 0) {
      fPhi_min_history[idx] = fPhi_min_history[idx-1];
      if (fPhi < fPhi_min_history[idx]) fPhi_min_history[idx] = fPhi;
   } else
   fPhi_min_history[idx] = fPhi;

   if (iterate >= fMaxit) {
      stop_code = kMAX_ITS_EXCEEDED;
   }
   else if (mu <= fMutol && rnorm <= fArtol*fDnorm) {
      stop_code = kSUCCESSFUL_TERMINATION;
   }
   if (stop_code != kNOT_FINISHED)  return stop_code;

   // check infeasibility condition
   if (idx >= 10 && fPhi >= 1.e-8 && fPhi >= 1.e4*fPhi_min_history[idx])
      stop_code = kINFEASIBLE;
   if (stop_code != kNOT_FINISHED)  return stop_code;

   // check for unknown status: slow convergence first
   if (idx >= 30 && fPhi_min_history[idx] >= .5*fPhi_min_history[idx-30])
      stop_code = kUNKNOWN;

   if (rnorm/fDnorm > fArtol &&
      (fRnorm_history[idx]/fMu_history[idx])/(fRnorm_history[0]/fMu_history[0]) >= 1.e8)
      stop_code = kUNKNOWN;

   return stop_code;
}


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

   if (this != &source) {
      TObject::operator=(source);

      fSys     = source.fSys;
      fDnorm   = source.fDnorm;
      fMutol   = source.fMutol;
      fArtol   = source.fArtol;
      fGamma_f = source.fGamma_f;
      fGamma_a = source.fGamma_a;
      fPhi     = source.fPhi;
      fIter    = source.fIter;

      if (fMaxit != source.fMaxit) {
         if (fMu_history) delete [] fMu_history;
         fMu_history = new Double_t[fMaxit];
         if (fRnorm_history) delete [] fRnorm_history;
         fRnorm_history = new Double_t[fMaxit];
         if (fPhi_history) delete [] fPhi_history;
         fPhi_history = new Double_t[fMaxit];
         if (fPhi_min_history) delete [] fPhi_min_history;
         fPhi_min_history = new Double_t[fMaxit];
      }

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