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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGondzioSolver                                                       //
//                                                                      //
// Derived class of TQpSolverBase implementing Gondzio-correction       //
// version of Mehrotra's original predictor-corrector algorithm.        //
//                                                                      //
//////////////////////////////////////////////////////////////////////////


#include "Riostream.h"
#include "TMath.h"
#include "TGondzioSolver.h"
#include "TQpLinSolverDens.h"

ClassImp(TGondzioSolver)

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

   fPrintlevel               = 0;
   fTsig                     = 0.0;
   fMaximum_correctors       = 0;
   fNumberGondzioCorrections = 0;

   fStepFactor0 = 0.0;
   fStepFactor1 = 0.0;
   fAcceptTol   = 0.0;
   fBeta_min    = 0.0;
   fBeta_max    = 0.0;

   fCorrector_step  = 0;
   fStep            = 0;
   fCorrector_resid = 0;
   fFactory         = 0;
}


//______________________________________________________________________________
TGondzioSolver::TGondzioSolver(TQpProbBase *of,TQpDataBase *prob,Int_t verbose)
{
// Constructor

   fFactory = of;
   fStep            = fFactory->MakeVariables(prob);
   fCorrector_step  = fFactory->MakeVariables(prob);
   fCorrector_resid = fFactory->MakeResiduals(prob);

   fPrintlevel = verbose;
   fTsig       = 3.0;            // the usual value for the centering exponent (tau)

   fMaximum_correctors = 3;      // maximum number of Gondzio correctors

   fNumberGondzioCorrections = 0;

   // the two StepFactor constants set targets for increase in step
   // length for each corrector
   fStepFactor0 = 0.08;
   fStepFactor1 = 1.08;

   // accept the enhanced step if it produces a small improvement in
   // the step length
   fAcceptTol = 0.005;

   //define the Gondzio correction box
   fBeta_min = 0.1;
   fBeta_max = 10.0;
}


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

   *this = another;
}


//______________________________________________________________________________
Int_t TGondzioSolver::Solve(TQpDataBase *prob,TQpVar *iterate,TQpResidual *resid)
{
// Solve the quadratic programming problem as formulated through prob, store
// the final solution in iterate->fX . Monitor the residuals during the iterations
// through resid . The status is returned as defined in TQpSolverBase::ETerminationCode .

   Int_t status_code;
   Double_t alpha = 1;
   Double_t sigma = 1;

   fDnorm = prob->DataNorm();

   // initialization of (x,y,z) and factorization routine.
   fSys = fFactory->MakeLinSys(prob);
   this->Start(fFactory,iterate,prob,resid,fStep);

   fIter = 0;
   fNumberGondzioCorrections = 0;
   Double_t mu = iterate->GetMu();

   Int_t done = 0;
   do {
      fIter++;
      // evaluate residuals and update algorithm status:
      resid->CalcResids(prob,iterate);

      //  termination test:
      status_code = this->DoStatus(prob,iterate,resid,fIter,mu,0);
      if (status_code != kNOT_FINISHED ) break;
      if (fPrintlevel >= 10)
         this->DoMonitor(prob,iterate,resid,alpha,sigma,fIter,mu,status_code,0);

      // *** Predictor step ***

      resid->Set_r3_xz_alpha(iterate,0.0);

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

      alpha = iterate->StepBound(fStep);

      // calculate centering parameter
      Double_t muaff = iterate->MuStep(fStep,alpha);
      sigma = TMath::Power(muaff/mu,fTsig);

      if (fPrintlevel >= 10)
         this->DoMonitor(prob,iterate,resid,alpha,sigma,fIter,mu,status_code,2);

      // *** Corrector step ***

      // form right hand side of linear system:
      resid->Add_r3_xz_alpha(fStep,-sigma*mu);

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

      // calculate distance to boundary along the Mehrotra
      // predictor-corrector step:
      alpha = iterate->StepBound(fStep);

      // prepare for Gondzio corrector loop: zero out the
      // corrector_resid structure:
      fCorrector_resid->Clear_r1r2();

      // calculate the target box:
      Double_t rmin = sigma*mu*fBeta_min;
      Double_t rmax = sigma*mu*fBeta_max;

      Int_t stopCorrections     = 0;
      fNumberGondzioCorrections = 0;

      // enter the Gondzio correction loop:
      if (fPrintlevel >= 10)
         cout << "**** Entering the correction loop ****" << endl;

      while (fNumberGondzioCorrections < fMaximum_correctors  &&
      alpha < 1.0 && !stopCorrections) {

         // copy current variables into fcorrector_step
         *fCorrector_step = *iterate;

         // calculate target steplength
         Double_t alpha_target = fStepFactor1*alpha+fStepFactor0;
         if (alpha_target > 1.0) alpha_target = 1.0;

         // add a step of this length to corrector_step
         fCorrector_step->Saxpy(fStep,alpha_target);

         // place XZ into the r3 component of corrector_resids
         fCorrector_resid->Set_r3_xz_alpha(fCorrector_step,0.0);

         // do the projection operation
         fCorrector_resid->Project_r3(rmin,rmax);

         // solve for corrector direction
         fSys->Solve(prob,iterate,fCorrector_resid,fCorrector_step);

         // add the current step to corrector_step, and calculate the
         // step to boundary along the resulting direction
         fCorrector_step->Saxpy(fStep,1.0);
         Double_t alpha_enhanced = iterate->StepBound(fCorrector_step);

         // if the enhanced step length is actually 1, make it official
         // and stop correcting
         if (alpha_enhanced == 1.0) {
            *fStep = *fCorrector_step;
            alpha = alpha_enhanced;
            fNumberGondzioCorrections++;
            stopCorrections = 1;
         }
         else if(alpha_enhanced >= (1.0+fAcceptTol)*alpha) {
            // if enhanced step length is significantly better than the
            // current alpha, make the enhanced step official, but maybe
            // keep correcting
            *fStep = *fCorrector_step;
            alpha = alpha_enhanced;
            fNumberGondzioCorrections++;
            stopCorrections = 0;
         }
         else {
            // otherwise quit the correction loop
            stopCorrections = 1;
         }
      }

      // We've finally decided on a step direction, now calculate the
      // length using Mehrotra's heuristic.x
      alpha = this->FinalStepLength(iterate,fStep);

      // alternatively, just use a crude step scaling factor.
      // alpha = 0.995 * iterate->StepBound(fStep);

      // actually take the step (at last!) and calculate the new mu

      iterate->Saxpy(fStep,alpha);
      mu = iterate->GetMu();
   } while (!done);

   resid->CalcResids(prob,iterate);
   if (fPrintlevel >= 10)
      this->DoMonitor(prob,iterate,resid,alpha,sigma,fIter,mu,status_code,1);

   return status_code;
}


//______________________________________________________________________________
void TGondzioSolver::DefMonitor(TQpDataBase* /* data */,TQpVar* /* vars */,
                                TQpResidual *resid,
                                Double_t alpha,Double_t sigma,Int_t i,Double_t mu,
                                Int_t status_code,Int_t level)
{
// Print information about the optimization process and monitor the convergence
// status of thye algorithm

   switch (level) {
      case 0 : case 1:
      {
         cout << endl << "Duality Gap: " << resid->GetDualityGap() << endl;
         if (i > 1) {
            cout << " Number of Corrections = " << fNumberGondzioCorrections
               << " alpha = " << alpha << endl;
         }
         cout << " *** Iteration " << i << " *** " << endl;
         cout << " mu = " << mu << " relative residual norm = "
            << resid->GetResidualNorm()/fDnorm << endl;

         if (level == 1) {
            // Termination has been detected by the status check; print
            // appropriate message
            if (status_code == kSUCCESSFUL_TERMINATION) {
               cout << endl
                  << " *** SUCCESSFUL TERMINATION ***"
                  << endl;
            }
            else if (status_code == kMAX_ITS_EXCEEDED) {
               cout << endl
                  << " *** MAXIMUM ITERATIONS REACHED *** " << endl;
            }
            else if (status_code == kINFEASIBLE) {
               cout << endl
                  << " *** TERMINATION: PROBABLY INFEASIBLE *** "
                  << endl;
            }
            else if (status_code == kUNKNOWN) {
               cout << endl
                  << " *** TERMINATION: STATUS UNKNOWN *** " << endl;
            }
         }
      } break;
      case 2:
         cout << " *** sigma = " << sigma << endl;
         break;
   }
}


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

   if (fCorrector_step)  { delete fCorrector_step;  fCorrector_step  = 0; }
   if (fStep)            { delete fStep;            fStep            = 0; }
   if (fCorrector_resid) { delete fCorrector_resid; fCorrector_resid = 0; }
}


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

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

      fPrintlevel               = source.fPrintlevel;
      fTsig                     = source.fTsig ;
      fMaximum_correctors       = source.fMaximum_correctors;
      fNumberGondzioCorrections = source.fNumberGondzioCorrections;

      fStepFactor0 = source.fStepFactor0;
      fStepFactor1 = source.fStepFactor1;
      fAcceptTol   = source.fAcceptTol;
      fBeta_min    = source.fBeta_min;
      fBeta_max    = source.fBeta_max;

      if (fCorrector_step)  delete fCorrector_step;
      if (fStep)            delete fStep;
      if (fCorrector_resid) delete fCorrector_resid;

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