ROOT logo
using namespace std;
#include "hmdcminimize.h"
#include "hdebug.h"
#include <iostream>
#include <iomanip> 
#include <cmath>
#include "TRandom.h"

//*-- Author : V.Pechenov
//*-- Modified: 15.04.04 A.Ierusalimov

ClassImp(HMdcMinimize)

HMdcMinimize::HMdcMinimize(void) {
  fObjectFit=0;
  nPar=0;
  fFCN=0;
}


HMdcMinimize::~HMdcMinimize(void) {
  fObjectFit=0;
  fFCN=0;
}

void HMdcMinimize::setFCN(TObject *obj,Double_t (*fcn)(TObject *, Int_t &, Double_t *)) {
  fObjectFit=obj;
  fFCN=fcn;
}

//-----------------------------------------------------
Int_t HMdcMinimize::minimize(Int_t maxIter, Int_t nParIn,
     Double_t* par0, Double_t* stepPar, Double_t* parOut) {

  if(fFCN==0) return -1;
  if(nParIn<=0) return -1;
  
  nPar=nParIn;
  
//   Double_t stepFit=.50;
  Double_t stepFit=10.;
    
  Double_t functi,pari[200];
  Double_t cosgrad[200];
  //Double_t limGrad = 0.001;
  Int_t istepinc = 0;
  Int_t istepdec = 0;
  Int_t nStepCh = 0;
  Double_t  stepCh[6] = {2.0, 1.5, 1.5, 2.0, 1.2, 1.1};
  Double_t  dFdRi;
  Double_t  dfunctmax = 1.5;
  Double_t  dfunctmin = 0.7;
  Int_t iprint = 1;
  Double_t funTmp;

  funct0=(*fFCN)(fObjectFit,nPar,par0);
    
  cout<< " *** Entry mimimize  :" << endl << "   *funct0=" << funct0 
      << "  nPar=" << nPar << endl << endl;;

  for(Int_t k = 0; k < nPar; k++) parIn[k] = par0[k];

  for(Int_t iter=0; iter < maxIter; iter++) {              //iter

     istepdec = 0;
     istepinc = 0;

    cout<< endl << "  *  iter=" << iter << endl << "  * Input parIn:" << endl;
//     printf("  * %f %f %f %f %f %f %f %f %f %f %f %f \n",parIn[0],parIn[1],parIn[2],parIn[3],parIn[4],parIn[5],parIn[6],parIn[7],parIn[8],parIn[9],parIn[10],parIn[11]);
    printf("  * %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f \n"
	   ,parIn[0],parIn[1],parIn[2],parIn[3],parIn[4],parIn[5],
	   parIn[6],parIn[7],parIn[8],parIn[9],parIn[10],parIn[11]
	   ,parIn[12],parIn[13],parIn[14],parIn[15],parIn[16],parIn[17]
	   ,parIn[18],parIn[19],parIn[20],parIn[21],parIn[22],parIn[23]);

    functIn = (iter == 0) ? (*fFCN)(fObjectFit,nPar,parIn) : functOut;
    
    functBest = functIn;
    for(Int_t b = 0; b < nPar; b++) parBest[b] = parIn[b];
    
    cout<< "  * FunctIn=" << functIn << endl;

    Double_t agrad;
    calculationOfGradient(functIn,parIn,stepPar, nPar,agrad,cosgrad,1);    

//     if(agrad < limGrad) {
//     cout << endl << "  *normal exit after " << iter << "iteration" << endl;
//     cout<< "   * agrad=" << agrad << endl;    
   
//     return 0;
//     }


    for(Int_t k = 0; k < nPar; k++) {
      pari[k] = parIn[k] - cosgrad[k]*.01*scalePar[k];
      cout << " my3 " << cosgrad[k] << " " << scalePar[k] << " " << parIn[k] << " " << pari[k] << endl;
    }
    funTmp = (*fFCN)(fObjectFit,nPar,pari);
    
    if(funTmp < functBest) {
       functBest = funTmp;
       for(Int_t b = 0; b < nPar; b++) parBest[b] = pari[b];
    }
    
    Double_t dFdR0 = (funTmp/functIn - 1.0)/(.01);
//       pari[k] = parIn[k] - cosgrad[k]*0.001*scalePar[k];
//       Double_t dFdR0 = ((*fFCN)(fObjectFit,nPar,pari)/functIn - 1.0)/(0.001);
    if(dFdR0 == 0) {
       if(functIn <= functBest) {
	  cout << endl << "  *abnormal(same functional) exit after " << iter << "iteration" << endl;
	  cout<< "   * agrad=" << agrad << endl;       
	  return 0;
       }
       for(Int_t b = 0; b < nPar; b++)  parOut[b] = parBest[b];   
       functOut = functBest;
    
       for(Int_t k = 0; k < nPar; k++) parIn[k] = parOut[k];
    
       cout<< "   * functOut=" << functOut << endl;    
       cout<< "   * agrad=" << agrad << endl;    
       cout<< "   * Output parOut:" << endl;
       printf("  * %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f \n"
	      ,parOut[0],parOut[1],parOut[2],parOut[3],parOut[4],parOut[5]
	      ,parOut[6],parOut[7],parOut[8],parOut[9],parOut[10],parOut[11]
	      ,parOut[12],parOut[13],parOut[14],parOut[15],parOut[16],parOut[17]
	      ,parOut[18],parOut[19],parOut[20],parOut[21],parOut[22],parOut[23]);
    
       continue;
    }
      

    while(kTRUE) {        //while

      for(Int_t k = 0; k < nPar; k++)      
        pari[k] = parIn[k] - cosgrad[k]*stepFit*scalePar[k];
      
      funTmp = (*fFCN)(fObjectFit,nPar,pari);
    
      if(funTmp < functBest) {
	 functBest = funTmp;
	 for(Int_t b = 0; b < nPar; b++) parBest[b] = pari[b];
      }
    
      functi = funTmp/functIn;
      
      for(Int_t k = 0; k < nPar; k++)      
        pari[k] = parIn[k] - cosgrad[k]*stepFit*1.01*scalePar[k];
      
      funTmp = (*fFCN)(fObjectFit,nPar,pari);
    
      if(funTmp < functBest) {
	 functBest = funTmp;
	 for(Int_t b = 0; b < nPar; b++) parBest[b] = pari[b];
      }
      dFdRi = (funTmp/functIn-functi)/(stepFit*0.01);

      cout << " my " << dFdRi << " " << functi  << " " << istepdec << " " << istepinc << endl; 

      if(dFdRi < 0) {
        if(functi > 1.0 && istepdec < 2) {
          stepFit = stepFit/5;
          istepdec++;
          if(iprint == 1) cout << "  *functi(dFdRi<0)=" << functi <<
                  " *! step is decreased, now stepFit=" << stepFit << endl;
          continue;
        }
        else {
          if(istepinc ==2) break;
          nStepCh = 3*istepinc + istepdec;
          stepFit *= stepCh[nStepCh];
          istepinc++;
          if(iprint == 1) cout << "  *functi(dFdRi<0)=" << functi <<
                  " *!  step is increased, now stepFit=" << stepFit << endl;
          continue;
        }
      }
      else {   //dFdRi > 0
        if(functi < dfunctmin) {
        if(istepinc == 2) break;
          nStepCh = 3*istepinc + istepdec;
          stepFit *= stepCh[nStepCh];
          istepinc++;
          if(iprint == 1) cout << "  *functi(dFdRi>0)=" << functi <<
                  " *!  step is increased, now stepFit=" << stepFit << endl;
          continue;
        } else {
          if(functi > dfunctmax) {
            if(istepdec ==2) break;
            nStepCh = 3*istepdec + istepinc;
            stepFit /= stepCh[nStepCh];
            istepdec++;
            if(iprint == 1) cout << "  *functi(dFdRi>0)=" << functi <<
                    " *!  step is decreased, now stepFit=" << stepFit << endl;
            continue;
          }
        }
      }
      break;
    }

    Double_t coeffC = 1.0;
    Double_t coeffB = dFdR0;
    Double_t coeffA = (functi - coeffC - coeffB*stepFit)/(stepFit*stepFit);
    Double_t stepFit1 = -coeffB/(2*coeffA);
    if(coeffA < 0.000001 || (stepFit1/stepFit) > 1.2)
        stepFit1 = (dFdRi > 0) ? stepFit/2.0 : stepFit/1.5;

    cout << " my2 " << coeffA << " " << coeffB << " " << stepFit1 << " " << endl;

    for(Int_t k = 0; k < nPar; k++)    
      parOut[k] = parIn[k] -cosgrad[k]*stepFit1*scalePar[k];
    functOut = (*fFCN)(fObjectFit,nPar,parOut);
    
//     Double_t dec = .03;
//     while(kTRUE) {
//       if(functOut < functIn) break;
//       for(Int_t k = 0; k < nPar; k++)     
//         parOut[k] = parIn[k] -cosgrad[k]*dec*stepFit1*scalePar[k];
//       functOut = (*fFCN)(fObjectFit,nPar,parOut);
//       dec /= 10.;
//     }
    if(functOut > functIn) {
      for(Int_t k = 0; k < nPar; k++)     
        parOut[k] = parIn[k] -cosgrad[k]*0.03*stepFit1*scalePar[k];
//         parOut[k] = parIn[k] -cosgrad[k]*0.3*stepFit1*scalePar[k];
      functOut = (*fFCN)(fObjectFit,nPar,parOut);
    }

    if(functOut > functBest) {
      for(Int_t b = 0; b < nPar; b++)  parOut[b] = parBest[b];   
      functOut = functBest;
    }
    

    for(Int_t k = 0; k < nPar; k++) parIn[k] = parOut[k];
    
    cout<< "   * functOut=" << functOut << endl;    
    cout<< "   * agrad=" << agrad << endl;    
    cout<< "   * Output parOut:" << endl;
       printf("  * %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f \n"
	      ,parOut[0],parOut[1],parOut[2],parOut[3],parOut[4],parOut[5]
	      ,parOut[6],parOut[7],parOut[8],parOut[9],parOut[10],parOut[11]
	      ,parOut[12],parOut[13],parOut[14],parOut[15],parOut[16],parOut[17]
	      ,parOut[18],parOut[19],parOut[20],parOut[21],parOut[22],parOut[23]);
    
    if(functIn - functOut < .00001) return 1;
    
  }
    cout << "  *!!! number of iteration exceeded !!!" << endl;
    cout<< "  * Output parOut:" << endl;
       printf("  * %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f %f \n"
	      ,parOut[0],parOut[1],parOut[2],parOut[3],parOut[4],parOut[5]
	      ,parOut[6],parOut[7],parOut[8],parOut[9],parOut[10],parOut[11]
	      ,parOut[12],parOut[13],parOut[14],parOut[15],parOut[16],parOut[17]
	      ,parOut[18],parOut[19],parOut[20],parOut[21],parOut[22],parOut[23]);
	
  return 1;
}

//-----------------------------------------------------
void HMdcMinimize::calculationOfGradient(
    Double_t fun0, Double_t* par, Double_t* stepPar, Int_t nPar,
    Double_t& agrad, Double_t* cosgrad, Int_t iflag) {
    
//   Double_t grad[200];
//   Double_t grad2[200][200];
  
  for(Int_t k = 0; k < nPar; k++) scalePar[k] = 1.0;  
    
  for(Int_t k = 0; k < nPar; k++) {

    Double_t park = par[k];
    par[k] = park + stepPar[k];
    Double_t funk = (*fFCN)(fObjectFit,nPar,par);

//     if(funk < functBest) {
//        functBest = funk;
//        for(Int_t b = 0; b < nPar; b++) parBest[b] = par[b];
//     }
    
    par[k] = park - stepPar[k];
    Double_t funk1 = (*fFCN)(fObjectFit,nPar,par);

//     if(funk1 < functBest) {
//        functBest = funk1;
//        for(Int_t b = 0; b < nPar; b++) parBest[b] = par[b];
//     }
    
    grad[k] = (funk - funk1)/(2.0*stepPar[k]);
    grad2[k][k] = (funk + funk1 - 2.0*fun0)/(stepPar[k]*stepPar[k]);
    if(iflag > 0 && grad2[k][k]>0.001) {
      scalePar[k] = 1./sqrt(grad2[k][k]);
      grad[k] *=scalePar[k];
    } else scalePar[k] = 1.0; 
    par[k] = park;

    for(Int_t l = k+1; l < nPar; l++) {
      if(iflag < 2) grad2[k][l] = grad2[l][k] = 0;
      else {
      par[k] = park + stepPar[k];
      Double_t parl = par[l];
      par[l] = parl + stepPar[k];
      Double_t funkl = (*fFCN)(fObjectFit,nPar,par);

//     if(funkl < functBest) {
//        functBest = funkl;
//        for(Int_t b = 0; b < nPar; b++) parBest[b] = par[b];
//     }
    
      par[k] = park;
      Double_t funl = (*fFCN)(fObjectFit,nPar,par);

//     if(funl < functBest) {
//        functBest = funl;
//        for(Int_t b = 0; b < nPar; b++) parBest[b] = par[b];
//     }
    
      par[l] = parl;
      grad2[k][l] = grad2[l][k] = (funkl + fun0 - funk - funl)/(stepPar[k]*stepPar[k]);
      }
    }
  }
  agrad = 0.0;
  for(Int_t k = 0; k < nPar; k++) agrad += grad[k]*grad[k];
  agrad = sqrt(agrad);
  for(Int_t k = 0; k < nPar; k++) cosgrad[k] = grad[k]/agrad;

  return;
}

//-----------------------------------------------------
Int_t HMdcMinimize::minimize2(Int_t maxIter2, Int_t numOfParam,
     Double_t* par0, Double_t* stepPar, Double_t* parOut) {
//*** 2-nd method
  Double_t pari[200];
  Double_t functIn;
  Double_t cosgrad[200];
  Double_t agrad;  
        
  for(Int_t k = 0; k < numOfParam; k++) pari[k] = par0[k];
  
  funct0=(*fFCN)(fObjectFit,numOfParam,pari);
  cout<< endl << endl << " *** Entry mimimize2  :" << endl 
      << "   *funct0=" << funct0 << "  nPar=" << numOfParam << endl;  
  cout<< "   * Input param:" << endl;
  for(Int_t l=0; l < numOfParam; l++) printf("  %f",pari[l]);
  cout<< endl;
  
  for(Int_t iter2 = 0; iter2 < maxIter2; iter2++) {   
  
    functIn = funct0;

    calculationOfGradient(functIn,pari,stepPar,numOfParam,agrad,cosgrad,2);
      
    solutionOfLinearEquationsSystem(pari,numOfParam);

    funct0=(*fFCN)(fObjectFit,numOfParam,pari);    

  }

    for(Int_t k = 0; k < nPar; k++) parOut[k] = pari[k];

    functOut = (*fFCN)(fObjectFit,numOfParam,parOut);

    cout<< "   * functOut2=" << functOut << endl;    
    cout<< "   * agrad=" << agrad << endl;    
    cout<< "   * Output parOut2:" << endl;
    for(Int_t l=0; l < nPar; l++) printf("  %f",parOut[l]);
        
  return 1;
}
//-----------------------------------------------------
void HMdcMinimize::solutionOfLinearEquationsSystem(Double_t* par,
     Int_t nmOfPar) {
  //  input:  matrix grad2[i][j] (i-string, j-column),  vector grad[i]
  // output:  new param. in vector par[i]
  Double_t a[10][11];
  Int_t ieq[10];

  
  for(Int_t i = 0; i < nmOfPar; i++) {
    for(Int_t j = 0; j < nmOfPar; j++) a[i][j] = grad2[i][j];
    a[i][nmOfPar] = -grad[i];
    ieq[i] = -1;
  }
  Int_t iMax = 0;
  Int_t jMax = 0;
  for(Int_t l = 0; l < nmOfPar; l++) {
    Double_t maxA = 0.0 ;
    for(Int_t i = 0; i < nmOfPar; i++) {
      if(ieq[i] != -1) continue;
      for(Int_t j = 0; j < nmOfPar; j++) {
	if(fabs(a[i][j]) <= maxA) continue;
	maxA = fabs(a[i][j]);
	iMax = i;
	jMax = j;
      }
    }
    ieq[iMax] = jMax;
    Double_t corr = a[iMax][jMax];
    for(Int_t j = 0; j <= nmOfPar; j++) a[iMax][j] /= corr;
    for(Int_t i = 0; i < nmOfPar; i++) {
      if(i == iMax) continue;
      corr = a[i][jMax];
      for(Int_t j = 0; j <= nmOfPar; j++) a[i][j] -= a[iMax][j]*corr;
    }
  }

  for(Int_t i = 0; i < nmOfPar; i++) {
    Int_t iout = ieq[i];
    if(iout>=0) par[iout] += a[i][nmOfPar]; //!!!
  }

  return;
}
//-----------------------------------------------------
Int_t HMdcMinimize::minpar2(Int_t maxIter, Int_t nParIn,
     Double_t* par0, Double_t* dpar, Double_t* parOut) {
  if(fFCN==0) return -1;
  if(nParIn<=0) return -1;
  
  nPar=nParIn;
  
  Double_t pari[25], parbest[25], b[25];
//   Double_t dpar[25] = {10.0, 10.0, 20.0, 10.0, 10.0, 20.0,10.0,10.0,20.0,10.0,10.0,20.0};
//   Double_t dpar[25] = {10.0, 10.0, 10.0, 10.0, 10.0, 10.0,10.0,10.0,10.0,10.0,10.0,10.0};
//   Double_t dpar[25] = {5.0, 5.0, 5.0, 5.0, 5.0, 5.0,5.0,5.0,5.0,5.0,5.0,5.0};

  for(Int_t i = 0; i < nPar; i++) pari[i] = par0[i];
  
  Double_t f0 = (*fFCN)(fObjectFit,nPar,pari);
  Double_t fbest = 1000000000.;

  for(Double_t iter = 10; iter < maxIter; iter++) {
    Double_t fip[25], fim[25];
//     for(Int_t i = 0; i < nPar; i++) pari[i] = par0[i];
  
    for(Int_t i = 0; i < nPar; i++) { 
      Double_t pard = pari[i];
      pari[i] = pard + iter;
      fip[i] = (*fFCN)(fObjectFit,nPar,pari);
      pari[i] = pard - iter;
      fim[i] = (*fFCN)(fObjectFit,nPar,pari);
      pari[i] = pard;
      b[i] = pari[i] - 
             (fip[i] - fim[i])*dpar[i]/(2.0*(fip[i] - 2.0*f0 + fim[i]));
      parOut[i] = b[i];      
    }
    
    for(Int_t i = 0; i < nPar; i++) pari[i] = parOut[i];
//     f0 = (*fFCN)(fObjectFit,nPar,pari);
    f0 = (*fFCN)(fObjectFit,nPar,parOut);
    cout << " ========================================================== " << endl;
    if(f0 < fbest) {
       fbest = f0;
       for(Int_t i = 0; i < nPar; i++) parbest[i] = parOut[i];
    }
//     else break;
       
  }
  for(Int_t i = 0; i < nPar; i++) parOut[i] = parbest[i];
  
  for(Int_t i = 0; i < nPar; i++) cout << parbest[i] << " , ";
  cout << fbest << endl;

  return 1;
}  
//-----------------------------------------------------
Int_t HMdcMinimize::minbar(Int_t maxIter, Int_t nParIn,
     Double_t* par0, Double_t* step, Double_t* parOut) {
  if(fFCN==0) return -1;
  if(nParIn<=0) return -1;
  
  Double_t stepNormW = 10;
  Double_t maxDelta, delta[24], parameter[24];
  Double_t newFunctional = 0;
  
  Int_t numOfParam = nParIn;
  
  for(Int_t i = 0; i < numOfParam; i++) parameter[i] = par0[i];
  
//   Double_t step[24] = {.10, .10, .20, .10, .10, .20,.10,.10,.20,.10,.10,.20};
//   Double_t step[24] = {1.0, 1.0, 2.0, 1.0, 1.0, 2.0,1.0,1.0,2.0,1.0,1.0,2.0};
  Double_t weightPar[24] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
  
  Double_t functional = (*fFCN)(fObjectFit,nPar,parameter);

  for (Int_t iteration = 0; iteration < maxIter; iteration++ ) {

    maxDelta = 0;
    for(Int_t i = 0; i < numOfParam; i++) {
      parameter[i] += stepNormW*step[i];
      delta[i] = ((*fFCN)(fObjectFit,nPar,parameter) - functional)/(stepNormW*step[i]);
      parameter[i] -= stepNormW*step[i];
    }

    for(Int_t i = 0; i < numOfParam; i++)
      if (maxDelta < fabs(delta[i])) maxDelta = fabs(delta[i]);

    for(Int_t i = 0; i < numOfParam; i++) {
      parameter[i] -= stepNormW*step[i]*delta[i]*weightPar[i]/maxDelta;
    }
    newFunctional = (*fFCN)(fObjectFit,nPar,parameter);

    if(newFunctional < functional) functional = newFunctional;
    else {
      for(Int_t i = 0; i < numOfParam; i++)
	parameter[i] += 0.5*stepNormW*step[i]*delta[i]*weightPar[i]/maxDelta;

      newFunctional = (*fFCN)(fObjectFit,nPar,parameter);
      if( newFunctional < functional ) functional = newFunctional;
      else {
	for(Int_t i = 0; i < numOfParam; i++)
	  parameter[i] += 0.5*stepNormW*step[i]*delta[i]*weightPar[i]/maxDelta;
	
	stepNormW /= 2;
      }
    }
    if(stepNormW >= 0.05) continue;
  }
  
  for(Int_t i = 0; i < numOfParam; i++) parOut[i] = parameter[i];
  
  return 1;
}  
//-----------------------------------------------------
Int_t HMdcMinimize::scanXYZ(Int_t maxIter, Int_t nParIn,
     Double_t* par0, Double_t* parOut) {

  if(fFCN==0) return -1;
  if(nParIn<=0) return -1;
  
  nPar=nParIn;
 
  Double_t functi, pari[200];
  //Double_t funmin = 1000000000.;
  //Double_t  parmin[200];

  for(Int_t k = 0; k < nPar; k++) pari[k] = par0[k];

//   for(Int_t iter=0; iter < 3; iter++) {              //iter

     Int_t i = 0;
     Double_t stepx = 0;
//      for (Double_t stepx = -10; stepx < 10.1; stepx += 1.) {        // stepx loop
	for (Double_t stepy = -10; stepy < 10.1; stepy += 1.) {        // stepy loop
	   for (Double_t stepz = -10; stepz < 10.1; stepz += 1.) {        // stepz loop

	pari[0] = par0[0] + stepx;
	pari[1] = par0[1] + stepy;
	pari[2] = par0[2] + stepz;
	
	functi = (*fFCN)(fObjectFit,nPar,pari);
// 	if (functi < funmin) {
// 	   funmin = functi;
// 	   for(Int_t k = 0; k < nPar; k++) parmin[k] = pari[k];
// 	}
	   
	cout << "parx[" << i << "]=" << pari[0] << ";" 
	     << "pary[" << i << "]=" << pari[1] << ";" 
	     << "parz[" << i << "]=" << pari[2] << ";" 
	     << "sumFunctional[" << i << "]="
	     << setprecision(9) << functi << ";" << endl;
	i++;
	   }
	}
//      }
     
//      for(Int_t k = 0; k < nPar; k++) cout << "parmin[" << k << "]=" << parmin[k];
//      cout << "  minFunctional = " << funmin << ";" << endl;
  return 1;
}

Int_t HMdcMinimize::random(Int_t maxIter, Int_t nParIn,
     Double_t* par0, Double_t* parOut) {

  if(fFCN==0) return -1;
  if(nParIn<=0) return -1;
  
  nPar=nParIn;
 
  Double_t functi, pari[200], par[200], alpha[200], alphamin[200], funmin = 1000000000., funstart, parmin[200];
  Double_t sigma = 40.;

  funstart = (*fFCN)(fObjectFit,nPar,par0);
//   funmin = funstart;
  
  for(Int_t k = 0; k < nPar; k++) pari[k] = par0[k];

  for(Int_t iter=0; iter < maxIter; iter++) {              //iter
     if(funmin >= funstart && iter) {
	sigma /= 2. ;
	if(sigma < 1.) {
	   for(Int_t k = 0; k < nPar; k++) parOut[k] = pari[k];
	   for(Int_t k = 0; k < nPar; k++) cout << "parOut[" << k << "] = " << parOut[k] << " ";
	   cout << "  minFunctional = " << funstart << ";" << endl;
	   break;
	}
     }
     else {
	funstart = funmin;
	for(Int_t k = 0; k < nPar; k++) pari[k] = parmin[k];
     }

     funmin = 1000000000.;
     for( Int_t itry = 0 ; itry < 10; itry++ ) {              //try
	
	Double_t sumAlpha2 = 0;
	for(Int_t k = 0; k < nPar; k++) {
	   alpha[k] = gRandom->Uniform(-1.,1.);
	   sumAlpha2 += alpha[k]*alpha[k];
	}
	
	for(Int_t k = 0; k < nPar; k++) {
	   alpha[k] /= sqrt(sumAlpha2);
	   par[k] = pari[k] + alpha[k]*sigma;
	}
	
	functi = (*fFCN)(fObjectFit,nPar,par);
     
	if (functi < funmin) {
	   funmin = functi;
	   for(Int_t k = 0; k < nPar; k++) alphamin[k] = alpha[k];
	   for(Int_t k = 0; k < nPar; k++) parmin[k] = par[k];
	}
     }

     for(Int_t k = 0; k < nPar; k++) par[k] = pari[k] + alphamin[k]*sigma/2.;
     functi = (*fFCN)(fObjectFit,nPar,par);
     if (functi < funmin) {
	funmin = functi;
	for(Int_t k = 0; k < nPar; k++) parmin[k] = par[k];
     }
     
     for(Int_t k = 0; k < nPar; k++) par[k] = pari[k] + alphamin[k]*sigma*2.;
     functi = (*fFCN)(fObjectFit,nPar,par);
     if (functi < funmin) {
	funmin = functi;
	for(Int_t k = 0; k < nPar; k++) parmin[k] = par[k];
     }
     
     for(Int_t k = 0; k < nPar; k++) cout << "parmin[" << k << "] = " << parmin[k] << "; " ;
     cout << "  minFunctional = " << funmin << ";" << "  globalMinFunctional = " << funstart << ";" <<  "  sigma = " << sigma << endl;
     
  }
	   
// 	cout << "parx[" << i << "]=" << pari[0] << ";" 
// 	     << "pary[" << i << "]=" << pari[1] << ";" 
// 	     << "parz[" << i << "]=" << pari[2] << ";" 
// 	     << "sumFunctional[" << i << "]="
// 	     << setprecision(9) << functi << ";" << endl;
    
  for(Int_t k = 0; k < nPar; k++) cout << "parmin[" << k << "]=" << parmin[k];
  cout << "  minFunctional = " << funstart << ";" << endl;
  return 1;
}

Int_t HMdcMinimize::cog(Int_t maxIter, Int_t nParIn,
     Double_t* par0, Double_t* parOut) {

  if(fFCN==0) return -1;
  if(nParIn<=0) return -1;
  
  nPar=nParIn;
 
  Double_t functi, pari[200], par[200], alpha[200],  funmin = 1000000000., parsum[200];
  Double_t sigma = 32.;//8.;//4.;

  for(Int_t k = 0; k < nPar; k++) pari[k] = par0[k];

  Float_t itry = 0.;
  Float_t alltry = 0.;
     
//   for(Int_t iter=0; iter < maxIter; iter++) {              //iter
     
//      if(funmin >= funstart) {
// 	sigma /= 2.;
// 	if(sigma < 1.) {
// 	   for(Int_t k = 0; k < nPar; k++) parOut[k] = pari[k];
// 	   for(Int_t k = 0; k < nPar; k++) cout << "parOut[" << k << "] = " << parOut[k] << " ";
// 	   cout << "  minFunctional = " << funstart << ";" << endl;
// 	   break;
// 	}
//      }
//      else {
// 	funstart = funmin;
// 	for(Int_t k = 0; k < nPar; k++) pari[k] = parmin[k];
//      }

//      cout << itry << " " << alltry << endl;
//      if(itry/alltry > .5) sigma *= 2;
  funmin = 200.;//140.;//139.;
     itry = 0.;
     alltry = 0.;
     for(Int_t k = 0; k < nPar; k++) parsum[k] = 0.;

     while(itry < maxIter) {              //try
	
	Double_t sumAlpha2 = 0;
	for(Int_t k = 0; k < nPar; k++) {
	   alpha[k] = gRandom->Uniform(-1.,1.);
	   sumAlpha2 += alpha[k]*alpha[k];
	}
	
	for(Int_t k = 0; k < nPar; k++) {
	   alpha[k] /= sqrt(sumAlpha2);
	   par[k] = pari[k] + alpha[k]*sigma;
	}
	
	functi = (*fFCN)(fObjectFit,nPar,par);
     
	if (functi < funmin) {
    
	   for(Int_t k = 0; k < nPar; k++) parsum[k] += par[k];
	   itry++;
	   cout << " itry = " << itry << endl;  
	}
	
	alltry++;
     }

     for(Int_t k = 0; k < nPar; k++) pari[k] = parsum[k]/maxIter;
     functi = (*fFCN)(fObjectFit,nPar,pari);
     
     for(Int_t k = 0; k < nPar; k++) cout << "parmin[" << k << "] = " << pari[k] << "; " ;
     cout << "  minFunctional = " << funmin << ";" << "  globalMinFunctional = " << functi << ";" <<  "  sigma = " << sigma <<  "  Ntry = " << alltry << endl;
     
//   }
  
  for(Int_t k = 0; k < nPar; k++) parOut[k] = pari[k];
  
  return 1;
}

Int_t HMdcMinimize::scan(Int_t maxIter, Int_t nParIn,
     Double_t* par0, Double_t* parOut) {

  if(fFCN==0) return -1;
  if(nParIn<=0) return -1;
  
  nPar=nParIn;
  
  Double_t functi,pari[200];

  for(Int_t k = 0; k < nPar; k++) pari[k] = par0[k];

  for(Int_t iter=0; iter < 3; iter++) {              //iter

     Int_t i = 0;
     for (Double_t step = -20; step < 20.1; step += 1.) {        // step loop

	pari[iter+maxIter] += step;      	
	functi = (*fFCN)(fObjectFit,nPar,pari);
	cout << "par[" << i << "]=" << pari[iter+maxIter]
	     << " ; sumFunctional[" << i << "]="
	     << functi << ";" << endl;
	pari[iter+maxIter] -= step;      	
	i++;
     }
  }
  return 1;
}
  
 hmdcminimize.cc:1
 hmdcminimize.cc:2
 hmdcminimize.cc:3
 hmdcminimize.cc:4
 hmdcminimize.cc:5
 hmdcminimize.cc:6
 hmdcminimize.cc:7
 hmdcminimize.cc:8
 hmdcminimize.cc:9
 hmdcminimize.cc:10
 hmdcminimize.cc:11
 hmdcminimize.cc:12
 hmdcminimize.cc:13
 hmdcminimize.cc:14
 hmdcminimize.cc:15
 hmdcminimize.cc:16
 hmdcminimize.cc:17
 hmdcminimize.cc:18
 hmdcminimize.cc:19
 hmdcminimize.cc:20
 hmdcminimize.cc:21
 hmdcminimize.cc:22
 hmdcminimize.cc:23
 hmdcminimize.cc:24
 hmdcminimize.cc:25
 hmdcminimize.cc:26
 hmdcminimize.cc:27
 hmdcminimize.cc:28
 hmdcminimize.cc:29
 hmdcminimize.cc:30
 hmdcminimize.cc:31
 hmdcminimize.cc:32
 hmdcminimize.cc:33
 hmdcminimize.cc:34
 hmdcminimize.cc:35
 hmdcminimize.cc:36
 hmdcminimize.cc:37
 hmdcminimize.cc:38
 hmdcminimize.cc:39
 hmdcminimize.cc:40
 hmdcminimize.cc:41
 hmdcminimize.cc:42
 hmdcminimize.cc:43
 hmdcminimize.cc:44
 hmdcminimize.cc:45
 hmdcminimize.cc:46
 hmdcminimize.cc:47
 hmdcminimize.cc:48
 hmdcminimize.cc:49
 hmdcminimize.cc:50
 hmdcminimize.cc:51
 hmdcminimize.cc:52
 hmdcminimize.cc:53
 hmdcminimize.cc:54
 hmdcminimize.cc:55
 hmdcminimize.cc:56
 hmdcminimize.cc:57
 hmdcminimize.cc:58
 hmdcminimize.cc:59
 hmdcminimize.cc:60
 hmdcminimize.cc:61
 hmdcminimize.cc:62
 hmdcminimize.cc:63
 hmdcminimize.cc:64
 hmdcminimize.cc:65
 hmdcminimize.cc:66
 hmdcminimize.cc:67
 hmdcminimize.cc:68
 hmdcminimize.cc:69
 hmdcminimize.cc:70
 hmdcminimize.cc:71
 hmdcminimize.cc:72
 hmdcminimize.cc:73
 hmdcminimize.cc:74
 hmdcminimize.cc:75
 hmdcminimize.cc:76
 hmdcminimize.cc:77
 hmdcminimize.cc:78
 hmdcminimize.cc:79
 hmdcminimize.cc:80
 hmdcminimize.cc:81
 hmdcminimize.cc:82
 hmdcminimize.cc:83
 hmdcminimize.cc:84
 hmdcminimize.cc:85
 hmdcminimize.cc:86
 hmdcminimize.cc:87
 hmdcminimize.cc:88
 hmdcminimize.cc:89
 hmdcminimize.cc:90
 hmdcminimize.cc:91
 hmdcminimize.cc:92
 hmdcminimize.cc:93
 hmdcminimize.cc:94
 hmdcminimize.cc:95
 hmdcminimize.cc:96
 hmdcminimize.cc:97
 hmdcminimize.cc:98
 hmdcminimize.cc:99
 hmdcminimize.cc:100
 hmdcminimize.cc:101
 hmdcminimize.cc:102
 hmdcminimize.cc:103
 hmdcminimize.cc:104
 hmdcminimize.cc:105
 hmdcminimize.cc:106
 hmdcminimize.cc:107
 hmdcminimize.cc:108
 hmdcminimize.cc:109
 hmdcminimize.cc:110
 hmdcminimize.cc:111
 hmdcminimize.cc:112
 hmdcminimize.cc:113
 hmdcminimize.cc:114
 hmdcminimize.cc:115
 hmdcminimize.cc:116
 hmdcminimize.cc:117
 hmdcminimize.cc:118
 hmdcminimize.cc:119
 hmdcminimize.cc:120
 hmdcminimize.cc:121
 hmdcminimize.cc:122
 hmdcminimize.cc:123
 hmdcminimize.cc:124
 hmdcminimize.cc:125
 hmdcminimize.cc:126
 hmdcminimize.cc:127
 hmdcminimize.cc:128
 hmdcminimize.cc:129
 hmdcminimize.cc:130
 hmdcminimize.cc:131
 hmdcminimize.cc:132
 hmdcminimize.cc:133
 hmdcminimize.cc:134
 hmdcminimize.cc:135
 hmdcminimize.cc:136
 hmdcminimize.cc:137
 hmdcminimize.cc:138
 hmdcminimize.cc:139
 hmdcminimize.cc:140
 hmdcminimize.cc:141
 hmdcminimize.cc:142
 hmdcminimize.cc:143
 hmdcminimize.cc:144
 hmdcminimize.cc:145
 hmdcminimize.cc:146
 hmdcminimize.cc:147
 hmdcminimize.cc:148
 hmdcminimize.cc:149
 hmdcminimize.cc:150
 hmdcminimize.cc:151
 hmdcminimize.cc:152
 hmdcminimize.cc:153
 hmdcminimize.cc:154
 hmdcminimize.cc:155
 hmdcminimize.cc:156
 hmdcminimize.cc:157
 hmdcminimize.cc:158
 hmdcminimize.cc:159
 hmdcminimize.cc:160
 hmdcminimize.cc:161
 hmdcminimize.cc:162
 hmdcminimize.cc:163
 hmdcminimize.cc:164
 hmdcminimize.cc:165
 hmdcminimize.cc:166
 hmdcminimize.cc:167
 hmdcminimize.cc:168
 hmdcminimize.cc:169
 hmdcminimize.cc:170
 hmdcminimize.cc:171
 hmdcminimize.cc:172
 hmdcminimize.cc:173
 hmdcminimize.cc:174
 hmdcminimize.cc:175
 hmdcminimize.cc:176
 hmdcminimize.cc:177
 hmdcminimize.cc:178
 hmdcminimize.cc:179
 hmdcminimize.cc:180
 hmdcminimize.cc:181
 hmdcminimize.cc:182
 hmdcminimize.cc:183
 hmdcminimize.cc:184
 hmdcminimize.cc:185
 hmdcminimize.cc:186
 hmdcminimize.cc:187
 hmdcminimize.cc:188
 hmdcminimize.cc:189
 hmdcminimize.cc:190
 hmdcminimize.cc:191
 hmdcminimize.cc:192
 hmdcminimize.cc:193
 hmdcminimize.cc:194
 hmdcminimize.cc:195
 hmdcminimize.cc:196
 hmdcminimize.cc:197
 hmdcminimize.cc:198
 hmdcminimize.cc:199
 hmdcminimize.cc:200
 hmdcminimize.cc:201
 hmdcminimize.cc:202
 hmdcminimize.cc:203
 hmdcminimize.cc:204
 hmdcminimize.cc:205
 hmdcminimize.cc:206
 hmdcminimize.cc:207
 hmdcminimize.cc:208
 hmdcminimize.cc:209
 hmdcminimize.cc:210
 hmdcminimize.cc:211
 hmdcminimize.cc:212
 hmdcminimize.cc:213
 hmdcminimize.cc:214
 hmdcminimize.cc:215
 hmdcminimize.cc:216
 hmdcminimize.cc:217
 hmdcminimize.cc:218
 hmdcminimize.cc:219
 hmdcminimize.cc:220
 hmdcminimize.cc:221
 hmdcminimize.cc:222
 hmdcminimize.cc:223
 hmdcminimize.cc:224
 hmdcminimize.cc:225
 hmdcminimize.cc:226
 hmdcminimize.cc:227
 hmdcminimize.cc:228
 hmdcminimize.cc:229
 hmdcminimize.cc:230
 hmdcminimize.cc:231
 hmdcminimize.cc:232
 hmdcminimize.cc:233
 hmdcminimize.cc:234
 hmdcminimize.cc:235
 hmdcminimize.cc:236
 hmdcminimize.cc:237
 hmdcminimize.cc:238
 hmdcminimize.cc:239
 hmdcminimize.cc:240
 hmdcminimize.cc:241
 hmdcminimize.cc:242
 hmdcminimize.cc:243
 hmdcminimize.cc:244
 hmdcminimize.cc:245
 hmdcminimize.cc:246
 hmdcminimize.cc:247
 hmdcminimize.cc:248
 hmdcminimize.cc:249
 hmdcminimize.cc:250
 hmdcminimize.cc:251
 hmdcminimize.cc:252
 hmdcminimize.cc:253
 hmdcminimize.cc:254
 hmdcminimize.cc:255
 hmdcminimize.cc:256
 hmdcminimize.cc:257
 hmdcminimize.cc:258
 hmdcminimize.cc:259
 hmdcminimize.cc:260
 hmdcminimize.cc:261
 hmdcminimize.cc:262
 hmdcminimize.cc:263
 hmdcminimize.cc:264
 hmdcminimize.cc:265
 hmdcminimize.cc:266
 hmdcminimize.cc:267
 hmdcminimize.cc:268
 hmdcminimize.cc:269
 hmdcminimize.cc:270
 hmdcminimize.cc:271
 hmdcminimize.cc:272
 hmdcminimize.cc:273
 hmdcminimize.cc:274
 hmdcminimize.cc:275
 hmdcminimize.cc:276
 hmdcminimize.cc:277
 hmdcminimize.cc:278
 hmdcminimize.cc:279
 hmdcminimize.cc:280
 hmdcminimize.cc:281
 hmdcminimize.cc:282
 hmdcminimize.cc:283
 hmdcminimize.cc:284
 hmdcminimize.cc:285
 hmdcminimize.cc:286
 hmdcminimize.cc:287
 hmdcminimize.cc:288
 hmdcminimize.cc:289
 hmdcminimize.cc:290
 hmdcminimize.cc:291
 hmdcminimize.cc:292
 hmdcminimize.cc:293
 hmdcminimize.cc:294
 hmdcminimize.cc:295
 hmdcminimize.cc:296
 hmdcminimize.cc:297
 hmdcminimize.cc:298
 hmdcminimize.cc:299
 hmdcminimize.cc:300
 hmdcminimize.cc:301
 hmdcminimize.cc:302
 hmdcminimize.cc:303
 hmdcminimize.cc:304
 hmdcminimize.cc:305
 hmdcminimize.cc:306
 hmdcminimize.cc:307
 hmdcminimize.cc:308
 hmdcminimize.cc:309
 hmdcminimize.cc:310
 hmdcminimize.cc:311
 hmdcminimize.cc:312
 hmdcminimize.cc:313
 hmdcminimize.cc:314
 hmdcminimize.cc:315
 hmdcminimize.cc:316
 hmdcminimize.cc:317
 hmdcminimize.cc:318
 hmdcminimize.cc:319
 hmdcminimize.cc:320
 hmdcminimize.cc:321
 hmdcminimize.cc:322
 hmdcminimize.cc:323
 hmdcminimize.cc:324
 hmdcminimize.cc:325
 hmdcminimize.cc:326
 hmdcminimize.cc:327
 hmdcminimize.cc:328
 hmdcminimize.cc:329
 hmdcminimize.cc:330
 hmdcminimize.cc:331
 hmdcminimize.cc:332
 hmdcminimize.cc:333
 hmdcminimize.cc:334
 hmdcminimize.cc:335
 hmdcminimize.cc:336
 hmdcminimize.cc:337
 hmdcminimize.cc:338
 hmdcminimize.cc:339
 hmdcminimize.cc:340
 hmdcminimize.cc:341
 hmdcminimize.cc:342
 hmdcminimize.cc:343
 hmdcminimize.cc:344
 hmdcminimize.cc:345
 hmdcminimize.cc:346
 hmdcminimize.cc:347
 hmdcminimize.cc:348
 hmdcminimize.cc:349
 hmdcminimize.cc:350
 hmdcminimize.cc:351
 hmdcminimize.cc:352
 hmdcminimize.cc:353
 hmdcminimize.cc:354
 hmdcminimize.cc:355
 hmdcminimize.cc:356
 hmdcminimize.cc:357
 hmdcminimize.cc:358
 hmdcminimize.cc:359
 hmdcminimize.cc:360
 hmdcminimize.cc:361
 hmdcminimize.cc:362
 hmdcminimize.cc:363
 hmdcminimize.cc:364
 hmdcminimize.cc:365
 hmdcminimize.cc:366
 hmdcminimize.cc:367
 hmdcminimize.cc:368
 hmdcminimize.cc:369
 hmdcminimize.cc:370
 hmdcminimize.cc:371
 hmdcminimize.cc:372
 hmdcminimize.cc:373
 hmdcminimize.cc:374
 hmdcminimize.cc:375
 hmdcminimize.cc:376
 hmdcminimize.cc:377
 hmdcminimize.cc:378
 hmdcminimize.cc:379
 hmdcminimize.cc:380
 hmdcminimize.cc:381
 hmdcminimize.cc:382
 hmdcminimize.cc:383
 hmdcminimize.cc:384
 hmdcminimize.cc:385
 hmdcminimize.cc:386
 hmdcminimize.cc:387
 hmdcminimize.cc:388
 hmdcminimize.cc:389
 hmdcminimize.cc:390
 hmdcminimize.cc:391
 hmdcminimize.cc:392
 hmdcminimize.cc:393
 hmdcminimize.cc:394
 hmdcminimize.cc:395
 hmdcminimize.cc:396
 hmdcminimize.cc:397
 hmdcminimize.cc:398
 hmdcminimize.cc:399
 hmdcminimize.cc:400
 hmdcminimize.cc:401
 hmdcminimize.cc:402
 hmdcminimize.cc:403
 hmdcminimize.cc:404
 hmdcminimize.cc:405
 hmdcminimize.cc:406
 hmdcminimize.cc:407
 hmdcminimize.cc:408
 hmdcminimize.cc:409
 hmdcminimize.cc:410
 hmdcminimize.cc:411
 hmdcminimize.cc:412
 hmdcminimize.cc:413
 hmdcminimize.cc:414
 hmdcminimize.cc:415
 hmdcminimize.cc:416
 hmdcminimize.cc:417
 hmdcminimize.cc:418
 hmdcminimize.cc:419
 hmdcminimize.cc:420
 hmdcminimize.cc:421
 hmdcminimize.cc:422
 hmdcminimize.cc:423
 hmdcminimize.cc:424
 hmdcminimize.cc:425
 hmdcminimize.cc:426
 hmdcminimize.cc:427
 hmdcminimize.cc:428
 hmdcminimize.cc:429
 hmdcminimize.cc:430
 hmdcminimize.cc:431
 hmdcminimize.cc:432
 hmdcminimize.cc:433
 hmdcminimize.cc:434
 hmdcminimize.cc:435
 hmdcminimize.cc:436
 hmdcminimize.cc:437
 hmdcminimize.cc:438
 hmdcminimize.cc:439
 hmdcminimize.cc:440
 hmdcminimize.cc:441
 hmdcminimize.cc:442
 hmdcminimize.cc:443
 hmdcminimize.cc:444
 hmdcminimize.cc:445
 hmdcminimize.cc:446
 hmdcminimize.cc:447
 hmdcminimize.cc:448
 hmdcminimize.cc:449
 hmdcminimize.cc:450
 hmdcminimize.cc:451
 hmdcminimize.cc:452
 hmdcminimize.cc:453
 hmdcminimize.cc:454
 hmdcminimize.cc:455
 hmdcminimize.cc:456
 hmdcminimize.cc:457
 hmdcminimize.cc:458
 hmdcminimize.cc:459
 hmdcminimize.cc:460
 hmdcminimize.cc:461
 hmdcminimize.cc:462
 hmdcminimize.cc:463
 hmdcminimize.cc:464
 hmdcminimize.cc:465
 hmdcminimize.cc:466
 hmdcminimize.cc:467
 hmdcminimize.cc:468
 hmdcminimize.cc:469
 hmdcminimize.cc:470
 hmdcminimize.cc:471
 hmdcminimize.cc:472
 hmdcminimize.cc:473
 hmdcminimize.cc:474
 hmdcminimize.cc:475
 hmdcminimize.cc:476
 hmdcminimize.cc:477
 hmdcminimize.cc:478
 hmdcminimize.cc:479
 hmdcminimize.cc:480
 hmdcminimize.cc:481
 hmdcminimize.cc:482
 hmdcminimize.cc:483
 hmdcminimize.cc:484
 hmdcminimize.cc:485
 hmdcminimize.cc:486
 hmdcminimize.cc:487
 hmdcminimize.cc:488
 hmdcminimize.cc:489
 hmdcminimize.cc:490
 hmdcminimize.cc:491
 hmdcminimize.cc:492
 hmdcminimize.cc:493
 hmdcminimize.cc:494
 hmdcminimize.cc:495
 hmdcminimize.cc:496
 hmdcminimize.cc:497
 hmdcminimize.cc:498
 hmdcminimize.cc:499
 hmdcminimize.cc:500
 hmdcminimize.cc:501
 hmdcminimize.cc:502
 hmdcminimize.cc:503
 hmdcminimize.cc:504
 hmdcminimize.cc:505
 hmdcminimize.cc:506
 hmdcminimize.cc:507
 hmdcminimize.cc:508
 hmdcminimize.cc:509
 hmdcminimize.cc:510
 hmdcminimize.cc:511
 hmdcminimize.cc:512
 hmdcminimize.cc:513
 hmdcminimize.cc:514
 hmdcminimize.cc:515
 hmdcminimize.cc:516
 hmdcminimize.cc:517
 hmdcminimize.cc:518
 hmdcminimize.cc:519
 hmdcminimize.cc:520
 hmdcminimize.cc:521
 hmdcminimize.cc:522
 hmdcminimize.cc:523
 hmdcminimize.cc:524
 hmdcminimize.cc:525
 hmdcminimize.cc:526
 hmdcminimize.cc:527
 hmdcminimize.cc:528
 hmdcminimize.cc:529
 hmdcminimize.cc:530
 hmdcminimize.cc:531
 hmdcminimize.cc:532
 hmdcminimize.cc:533
 hmdcminimize.cc:534
 hmdcminimize.cc:535
 hmdcminimize.cc:536
 hmdcminimize.cc:537
 hmdcminimize.cc:538
 hmdcminimize.cc:539
 hmdcminimize.cc:540
 hmdcminimize.cc:541
 hmdcminimize.cc:542
 hmdcminimize.cc:543
 hmdcminimize.cc:544
 hmdcminimize.cc:545
 hmdcminimize.cc:546
 hmdcminimize.cc:547
 hmdcminimize.cc:548
 hmdcminimize.cc:549
 hmdcminimize.cc:550
 hmdcminimize.cc:551
 hmdcminimize.cc:552
 hmdcminimize.cc:553
 hmdcminimize.cc:554
 hmdcminimize.cc:555
 hmdcminimize.cc:556
 hmdcminimize.cc:557
 hmdcminimize.cc:558
 hmdcminimize.cc:559
 hmdcminimize.cc:560
 hmdcminimize.cc:561
 hmdcminimize.cc:562
 hmdcminimize.cc:563
 hmdcminimize.cc:564
 hmdcminimize.cc:565
 hmdcminimize.cc:566
 hmdcminimize.cc:567
 hmdcminimize.cc:568
 hmdcminimize.cc:569
 hmdcminimize.cc:570
 hmdcminimize.cc:571
 hmdcminimize.cc:572
 hmdcminimize.cc:573
 hmdcminimize.cc:574
 hmdcminimize.cc:575
 hmdcminimize.cc:576
 hmdcminimize.cc:577
 hmdcminimize.cc:578
 hmdcminimize.cc:579
 hmdcminimize.cc:580
 hmdcminimize.cc:581
 hmdcminimize.cc:582
 hmdcminimize.cc:583
 hmdcminimize.cc:584
 hmdcminimize.cc:585
 hmdcminimize.cc:586
 hmdcminimize.cc:587
 hmdcminimize.cc:588
 hmdcminimize.cc:589
 hmdcminimize.cc:590
 hmdcminimize.cc:591
 hmdcminimize.cc:592
 hmdcminimize.cc:593
 hmdcminimize.cc:594
 hmdcminimize.cc:595
 hmdcminimize.cc:596
 hmdcminimize.cc:597
 hmdcminimize.cc:598
 hmdcminimize.cc:599
 hmdcminimize.cc:600
 hmdcminimize.cc:601
 hmdcminimize.cc:602
 hmdcminimize.cc:603
 hmdcminimize.cc:604
 hmdcminimize.cc:605
 hmdcminimize.cc:606
 hmdcminimize.cc:607
 hmdcminimize.cc:608
 hmdcminimize.cc:609
 hmdcminimize.cc:610
 hmdcminimize.cc:611
 hmdcminimize.cc:612
 hmdcminimize.cc:613
 hmdcminimize.cc:614
 hmdcminimize.cc:615
 hmdcminimize.cc:616
 hmdcminimize.cc:617
 hmdcminimize.cc:618
 hmdcminimize.cc:619
 hmdcminimize.cc:620
 hmdcminimize.cc:621
 hmdcminimize.cc:622
 hmdcminimize.cc:623
 hmdcminimize.cc:624
 hmdcminimize.cc:625
 hmdcminimize.cc:626
 hmdcminimize.cc:627
 hmdcminimize.cc:628
 hmdcminimize.cc:629
 hmdcminimize.cc:630
 hmdcminimize.cc:631
 hmdcminimize.cc:632
 hmdcminimize.cc:633
 hmdcminimize.cc:634
 hmdcminimize.cc:635
 hmdcminimize.cc:636
 hmdcminimize.cc:637
 hmdcminimize.cc:638
 hmdcminimize.cc:639
 hmdcminimize.cc:640
 hmdcminimize.cc:641
 hmdcminimize.cc:642
 hmdcminimize.cc:643
 hmdcminimize.cc:644
 hmdcminimize.cc:645
 hmdcminimize.cc:646
 hmdcminimize.cc:647
 hmdcminimize.cc:648
 hmdcminimize.cc:649
 hmdcminimize.cc:650
 hmdcminimize.cc:651
 hmdcminimize.cc:652
 hmdcminimize.cc:653
 hmdcminimize.cc:654
 hmdcminimize.cc:655
 hmdcminimize.cc:656
 hmdcminimize.cc:657
 hmdcminimize.cc:658
 hmdcminimize.cc:659
 hmdcminimize.cc:660
 hmdcminimize.cc:661
 hmdcminimize.cc:662
 hmdcminimize.cc:663
 hmdcminimize.cc:664
 hmdcminimize.cc:665
 hmdcminimize.cc:666
 hmdcminimize.cc:667
 hmdcminimize.cc:668
 hmdcminimize.cc:669
 hmdcminimize.cc:670
 hmdcminimize.cc:671
 hmdcminimize.cc:672
 hmdcminimize.cc:673
 hmdcminimize.cc:674
 hmdcminimize.cc:675
 hmdcminimize.cc:676
 hmdcminimize.cc:677
 hmdcminimize.cc:678
 hmdcminimize.cc:679
 hmdcminimize.cc:680
 hmdcminimize.cc:681
 hmdcminimize.cc:682
 hmdcminimize.cc:683
 hmdcminimize.cc:684
 hmdcminimize.cc:685
 hmdcminimize.cc:686
 hmdcminimize.cc:687
 hmdcminimize.cc:688
 hmdcminimize.cc:689
 hmdcminimize.cc:690
 hmdcminimize.cc:691
 hmdcminimize.cc:692
 hmdcminimize.cc:693
 hmdcminimize.cc:694
 hmdcminimize.cc:695
 hmdcminimize.cc:696
 hmdcminimize.cc:697
 hmdcminimize.cc:698
 hmdcminimize.cc:699
 hmdcminimize.cc:700
 hmdcminimize.cc:701
 hmdcminimize.cc:702
 hmdcminimize.cc:703
 hmdcminimize.cc:704
 hmdcminimize.cc:705
 hmdcminimize.cc:706
 hmdcminimize.cc:707
 hmdcminimize.cc:708
 hmdcminimize.cc:709
 hmdcminimize.cc:710
 hmdcminimize.cc:711
 hmdcminimize.cc:712
 hmdcminimize.cc:713
 hmdcminimize.cc:714
 hmdcminimize.cc:715
 hmdcminimize.cc:716
 hmdcminimize.cc:717
 hmdcminimize.cc:718
 hmdcminimize.cc:719
 hmdcminimize.cc:720
 hmdcminimize.cc:721
 hmdcminimize.cc:722
 hmdcminimize.cc:723
 hmdcminimize.cc:724
 hmdcminimize.cc:725
 hmdcminimize.cc:726
 hmdcminimize.cc:727
 hmdcminimize.cc:728
 hmdcminimize.cc:729
 hmdcminimize.cc:730
 hmdcminimize.cc:731
 hmdcminimize.cc:732
 hmdcminimize.cc:733
 hmdcminimize.cc:734
 hmdcminimize.cc:735
 hmdcminimize.cc:736
 hmdcminimize.cc:737
 hmdcminimize.cc:738
 hmdcminimize.cc:739
 hmdcminimize.cc:740
 hmdcminimize.cc:741
 hmdcminimize.cc:742
 hmdcminimize.cc:743
 hmdcminimize.cc:744
 hmdcminimize.cc:745
 hmdcminimize.cc:746
 hmdcminimize.cc:747
 hmdcminimize.cc:748
 hmdcminimize.cc:749
 hmdcminimize.cc:750
 hmdcminimize.cc:751
 hmdcminimize.cc:752
 hmdcminimize.cc:753
 hmdcminimize.cc:754
 hmdcminimize.cc:755
 hmdcminimize.cc:756
 hmdcminimize.cc:757
 hmdcminimize.cc:758
 hmdcminimize.cc:759
 hmdcminimize.cc:760
 hmdcminimize.cc:761
 hmdcminimize.cc:762
 hmdcminimize.cc:763