// @(#)root/roostats:$Id:  cranmer $
// Author: Kyle Cranmer, Akira Shibata
// Author: Giovanni Petrucciani (UCSD) (log-interpolation)
/*************************************************************************
 * Copyright (C) 1995-2008, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//_________________________________________________
/*
BEGIN_HTML
<p>
</p>
END_HTML
*/
//

#include "RooFit.h"

#include "Riostream.h"
#include <math.h>
#include "TMath.h"

#include "RooAbsReal.h"
#include "RooRealVar.h"
#include "RooArgList.h"
#include "RooMsgService.h"
#include "RooTrace.h"

#include "TMath.h"

#include "RooStats/HistFactory/FlexibleInterpVar.h"

using namespace std;

ClassImp(RooStats::HistFactory::FlexibleInterpVar)

using namespace RooStats;
using namespace HistFactory;

//_____________________________________________________________________________
FlexibleInterpVar::FlexibleInterpVar()
{
  // Default constructor
  _paramIter = _paramList.createIterator() ;
  _nominal = 0;
  _interpBoundary=1.;
  _logInit = kFALSE ;
  TRACE_CREATE
}


//_____________________________________________________________________________
FlexibleInterpVar::FlexibleInterpVar(const char* name, const char* title, 
		       const RooArgList& paramList, 
		       Double_t nominal, vector<double> low, vector<double> high) :
  RooAbsReal(name, title),
  _paramList("paramList","List of paramficients",this),
  _nominal(nominal), _low(low), _high(high), _interpBoundary(1.)
{

  _logInit = kFALSE ;
  _paramIter = _paramList.createIterator() ;


  TIterator* paramIter = paramList.createIterator() ;
  RooAbsArg* param ;
  while((param = (RooAbsArg*)paramIter->Next())) {
    if (!dynamic_cast<RooAbsReal*>(param)) {
      coutE(InputArguments) << "FlexibleInterpVar::ctor(" << GetName() << ") ERROR: paramficient " << param->GetName() 
			    << " is not of type RooAbsReal" << endl ;
      R__ASSERT(0) ;
    }
    _paramList.add(*param) ;
    _interpCode.push_back(0); // default code
  }
  if (int(_low.size() ) != _paramList.getSize() || _low.size() != _high.size()) {
     coutE(InputArguments) << "FlexibleInterpVar::ctor(" << GetName() << ") invalid input low/high vectors " << endl;
     R__ASSERT(int(_low.size() ) == _paramList.getSize());
     R__ASSERT(_low.size() == _high.size());
  }

  delete paramIter ;
  TRACE_CREATE

}

//_____________________________________________________________________________
FlexibleInterpVar::FlexibleInterpVar(const char* name, const char* title, 
		       const RooArgList& paramList, 
		       double nominal, const RooArgList& low, const RooArgList& high) :
  RooAbsReal(name, title),
  _paramList("paramList","List of paramficients",this),
  _nominal(nominal), _interpBoundary(1.)
{

  RooFIter lowIter = low.fwdIterator() ;
  RooAbsReal* val ; 
  while ((val = (RooAbsReal*) lowIter.next())) {
    _low.push_back(val->getVal()) ;
  }

  RooFIter highIter = high.fwdIterator() ;
  while ((val = (RooAbsReal*) highIter.next())) {
    _high.push_back(val->getVal()) ;
  }
  
  
  _logInit = kFALSE ;
  _paramIter = _paramList.createIterator() ;


  TIterator* paramIter = paramList.createIterator() ;
  RooAbsArg* param ;
  while((param = (RooAbsArg*)paramIter->Next())) {
    if (!dynamic_cast<RooAbsReal*>(param)) {
      coutE(InputArguments) << "FlexibleInterpVar::ctor(" << GetName() << ") ERROR: paramficient " << param->GetName() 
			    << " is not of type RooAbsReal" << endl ;
      R__ASSERT(0) ;
    }
    _paramList.add(*param) ;
    _interpCode.push_back(0); // default code
  }
  if (int(_low.size() ) != _paramList.getSize() || _low.size() != _high.size()) {
     coutE(InputArguments) << "FlexibleInterpVar::ctor(" << GetName() << ") invalid input low/high lists " << endl;
     R__ASSERT(int(_low.size() ) == _paramList.getSize());
     R__ASSERT(_low.size() == _high.size());
  }

  delete paramIter ;
  TRACE_CREATE

}




//_____________________________________________________________________________
FlexibleInterpVar::FlexibleInterpVar(const char* name, const char* title, 
				     const RooArgList& paramList, 
				     double nominal, vector<double> low, vector<double> high,
				     vector<int> code) :
  RooAbsReal(name, title),
  _paramList("paramList","List of paramficients",this),
  _nominal(nominal), _low(low), _high(high), _interpCode(code), _interpBoundary(1.)
{

  _logInit = kFALSE ;
  _paramIter = _paramList.createIterator() ;


  TIterator* paramIter = paramList.createIterator() ;
  RooAbsArg* param ;
  while((param = (RooAbsArg*)paramIter->Next())) {
    if (!dynamic_cast<RooAbsReal*>(param)) {
      coutE(InputArguments) << "FlexibleInterpVar::ctor(" << GetName() << ") ERROR: paramficient " << param->GetName() 
			    << " is not of type RooAbsReal" << endl ;
      // use R__ASSERT which remains also in release mode 
      R__ASSERT(0) ;
    }
    _paramList.add(*param) ;
  } 
  if (int(_low.size() ) != _paramList.getSize() || _low.size() != _high.size() || _low.size() != _interpCode.size()) {
     coutE(InputArguments) << "FlexibleInterpVar::ctor(" << GetName() << ") invalid input vectors " << endl;
     R__ASSERT(int(_low.size() ) == _paramList.getSize());
     R__ASSERT(_low.size() == _high.size());
     R__ASSERT(_low.size() == _interpCode.size());
  }
  delete paramIter ;
  TRACE_CREATE

}

//_____________________________________________________________________________
FlexibleInterpVar::FlexibleInterpVar(const char* name, const char* title) :
  RooAbsReal(name, title),
  _paramList("paramList","List of coefficients",this), 
  _nominal(0), _interpBoundary(1.)
{
  // Constructor of flat polynomial function
  _logInit = kFALSE ;
  _paramIter = _paramList.createIterator() ;
  TRACE_CREATE
}

//_____________________________________________________________________________
FlexibleInterpVar::FlexibleInterpVar(const FlexibleInterpVar& other, const char* name) :
  RooAbsReal(other, name), 
  _paramList("paramList",this,other._paramList),
  _nominal(other._nominal), _low(other._low), _high(other._high), _interpCode(other._interpCode), _interpBoundary(other._interpBoundary)
  
{
  // Copy constructor
  _logInit = kFALSE ;
  _paramIter = _paramList.createIterator() ;
  TRACE_CREATE
  
}


//_____________________________________________________________________________
FlexibleInterpVar::~FlexibleInterpVar() 
{
  // Destructor
  delete _paramIter ;
  TRACE_DESTROY
}


//_____________________________________________________________________________
void FlexibleInterpVar::setInterpCode(RooAbsReal& param, int code){

  int index = _paramList.index(&param);
  if(index<0){
      coutE(InputArguments) << "FlexibleInterpVar::setInterpCode ERROR:  " << param.GetName() 
			    << " is not in list" << endl ;
  } else {
      coutW(InputArguments) << "FlexibleInterpVar::setInterpCode :  " << param.GetName() 
			    << " is now " << code << endl ;
    _interpCode.at(index) = code;
  }
  // GHL: Adding suggestion by Swagato:
  _logInit = kFALSE ;
  setValueDirty();
}

//_____________________________________________________________________________
void FlexibleInterpVar::setAllInterpCodes(int code){

  for(unsigned int i=0; i<_interpCode.size(); ++i){
    _interpCode.at(i) = code;
  }
  // GHL: Adding suggestion by Swagato:
  _logInit = kFALSE ;
  setValueDirty();

}

//_____________________________________________________________________________
void FlexibleInterpVar::setNominal(Double_t newNominal){

  coutW(InputArguments) << "FlexibleInterpVar::setNominal : nominal is now " << newNominal << endl ;
  _nominal = newNominal;

  _logInit = kFALSE ;

  setValueDirty();
}

//_____________________________________________________________________________
void FlexibleInterpVar::setLow(RooAbsReal& param, Double_t newLow){

  int index = _paramList.index(&param);
  if(index<0){
      coutE(InputArguments) << "FlexibleInterpVar::setLow ERROR:  " << param.GetName() 
			    << " is not in list" << endl ;
  } else {
      coutW(InputArguments) << "FlexibleInterpVar::setLow :  " << param.GetName() 
			    << " is now " << newLow << endl ;
    _low.at(index) = newLow;
  }

  _logInit = kFALSE ;

  setValueDirty();
}

//_____________________________________________________________________________
void FlexibleInterpVar::setHigh(RooAbsReal& param, Double_t newHigh){

  int index = _paramList.index(&param);
  if(index<0){
      coutE(InputArguments) << "FlexibleInterpVar::setHigh ERROR:  " << param.GetName() 
			    << " is not in list" << endl ;
  } else {
      coutW(InputArguments) << "FlexibleInterpVar::setHigh :  " << param.GetName() 
			    << " is now " << newHigh << endl ;
    _high.at(index) = newHigh;
  }

  _logInit = kFALSE ;
  setValueDirty();
}

//_____________________________________________________________________________
void FlexibleInterpVar::printAllInterpCodes(){

  for(unsigned int i=0; i<_interpCode.size(); ++i){
    coutI(InputArguments) <<"interp code for " << _paramList.at(i)->GetName() << " = " << _interpCode.at(i) <<endl;
    // GHL: Adding suggestion by Swagato:
    if( _low.at(i) <= 0.001 ) coutE(InputArguments) << GetName() << ", " << _paramList.at(i)->GetName() << ": low value = " << _low.at(i) << endl;
    if( _high.at(i) <= 0.001 ) coutE(InputArguments) << GetName() << ", " << _paramList.at(i)->GetName() << ": high value = " << _high.at(i) << endl;
  }

}

//_____________________________________________________________________________
double FlexibleInterpVar::PolyInterpValue(int i, double x) const { 
   
   // code for polynomial interpolation used when interpCode=4

   double boundary = _interpBoundary;

   double x0 = boundary;


   // cache the polynomial coefficient values
   // which do not depend on x but on the boundaries values
   if (!_logInit) {
      
      _logInit=kTRUE ;

      unsigned int n = _low.size(); 
      assert(n == _high.size() );
      
      _polCoeff.resize(n*6) ;
      
      for (unsigned int j = 0; j < n ; j++) {
         
         // location of the 6 coefficient for the j-th variable
         double * coeff = &_polCoeff[j * 6]; 
         
         // GHL: Swagato's suggestions
         double pow_up       =  std::pow(_high[j]/_nominal, x0);
         double pow_down     =  std::pow(_low[j]/_nominal,  x0);
         double logHi        =  std::log(_high[j]) ; 
         double logLo        =  std::log(_low[j] );
         double pow_up_log   = _high[j] <= 0.0 ? 0.0 : pow_up      * logHi;
         double pow_down_log = _low[j] <= 0.0 ? 0.0 : -pow_down    * logLo;
         double pow_up_log2  = _high[j] <= 0.0 ? 0.0 : pow_up_log  * logHi;
         double pow_down_log2= _low[j] <= 0.0 ? 0.0 : -pow_down_log* logLo;

         double S0 = (pow_up+pow_down)/2;
         double A0 = (pow_up-pow_down)/2;
         double S1 = (pow_up_log+pow_down_log)/2;
         double A1 = (pow_up_log-pow_down_log)/2;
         double S2 = (pow_up_log2+pow_down_log2)/2;
         double A2 = (pow_up_log2-pow_down_log2)/2;
         
         //fcns+der+2nd_der are eq at bd
         
         // cache  coefficient of the polynomial 
         coeff[0] = 1./(8*x0)        *(      15*A0 -  7*x0*S1 + x0*x0*A2);
         coeff[1] = 1./(8*x0*x0)     *(-24 + 24*S0 -  9*x0*A1 + x0*x0*S2);
         coeff[2] = 1./(4*pow(x0, 3))*(    -  5*A0 +  5*x0*S1 - x0*x0*A2);
         coeff[3] = 1./(4*pow(x0, 4))*( 12 - 12*S0 +  7*x0*A1 - x0*x0*S2);
         coeff[4] = 1./(8*pow(x0, 5))*(    +  3*A0 -  3*x0*S1 + x0*x0*A2);
         coeff[5] = 1./(8*pow(x0, 6))*( -8 +  8*S0 -  5*x0*A1 + x0*x0*S2);
         
      }
      
   }
   
   // GHL: Swagato's suggestions
   // if( _low[i] == 0 ) _low[i] = 0.0001;
   // if( _high[i] == 0 ) _high[i] = 0.0001;
   
   // get pointer to location of coefficients in the vector

   assert(int(_polCoeff.size()) > i ); 
   const double * coefficients = &_polCoeff.front() + 6*i;  
   
   double a = coefficients[0];
   double b = coefficients[1];
   double c = coefficients[2];
   double d = coefficients[3];
   double e = coefficients[4];
   double f = coefficients[5];
   

   // evaluate the 6-th degree polynomial using Horner's method
   double value = 1. + x * (a + x * ( b + x * ( c + x * ( d + x * ( e + x * f ) ) ) ) );
   return value; 
}

//_____________________________________________________________________________
Double_t FlexibleInterpVar::evaluate() const 
{
  // Calculate and return value of polynomial

  Double_t total(_nominal) ;
  _paramIter->Reset() ;

  RooAbsReal* param ;
  //const RooArgSet* nset = _paramList.nset() ;
  int i=0;

  // TString name = GetName();
  // if (name == TString("ZHWW_ll12_vzll_epsilon") )
  //    //    std::cout << "evaluate flexible interp var - init flag is " << _logInit << std::endl;

  while((param=(RooAbsReal*)_paramIter->Next())) {
    //    param->Print("v");


    Int_t icode = _interpCode[i] ;

    switch(icode) {

    case 0: {
      // piece-wise linear
      if(param->getVal()>0)
	total +=  param->getVal()*(_high[i] - _nominal );
      else
	total += param->getVal()*(_nominal - _low[i]);
      break ;
    }
    case 1: {
      // pice-wise log
      if(param->getVal()>=0)
	total *= pow(_high[i]/_nominal, +param->getVal());
      else
	total *= pow(_low[i]/_nominal,  -param->getVal());
      break ;
    }
    case 2: {
      // parabolic with linear
      double a = 0.5*(_high[i]+_low[i])-_nominal;
      double b = 0.5*(_high[i]-_low[i]);
      double c = 0;
      if(param->getVal()>1 ){
	total += (2*a+b)*(param->getVal()-1)+_high[i]-_nominal;
      } else if(param->getVal()<-1 ) {
	total += -1*(2*a-b)*(param->getVal()+1)+_low[i]-_nominal;
      } else {
	total +=  a*pow(param->getVal(),2) + b*param->getVal()+c;
      }
      break ;
    }
    case 3: {
      //parabolic version of log-normal
      double a = 0.5*(_high[i]+_low[i])-_nominal;
      double b = 0.5*(_high[i]-_low[i]);
      double c = 0;
      if(param->getVal()>1 ){
	total += (2*a+b)*(param->getVal()-1)+_high[i]-_nominal;
      } else if(param->getVal()<-1 ) {
	total += -1*(2*a-b)*(param->getVal()+1)+_low[i]-_nominal;
      } else {
	total +=  a*pow(param->getVal(),2) + b*param->getVal()+c;
      }
      break ;
    }

    case 4: {
      double boundary = _interpBoundary;
      double x = param->getVal(); 
      //std::cout << icode << " param " << param->GetName() << "  " << param->getVal() << " boundary " << boundary << std::endl;

      if(x >= boundary)
      {
         total *= std::pow(_high[i]/_nominal, +param->getVal());
      }
      else if (x <= -boundary)
      {
         total *= std::pow(_low[i]/_nominal, -param->getVal());
      }
      else if (x != 0)
      {
         total *= PolyInterpValue(i, x);
      }
      break ;
    }
    default: {
      coutE(InputArguments) << "FlexibleInterpVar::evaluate ERROR:  " << param->GetName() 
			    << " with unknown interpolation code" << endl ;
    }
    }
    ++i;
  }

  if(total<=0) {
     total= TMath::Limits<double>::Min();
  }    

  return total;
}

void FlexibleInterpVar::printMultiline(ostream& os, Int_t contents, 
				       Bool_t verbose, TString indent) const
{
  RooAbsReal::printMultiline(os,contents,verbose,indent);
  os << indent << "--- FlexibleInterpVar ---" << endl;
  printFlexibleInterpVars(os);
}

void FlexibleInterpVar::printFlexibleInterpVars(ostream& os) const
{
  _paramIter->Reset();
  for (int i=0;i<(int)_low.size();i++) {
    RooAbsReal* param=(RooAbsReal*)_paramIter->Next();
    os << setw(36) << param->GetName()<<": "<<setw(7) << _low[i]<<"  "<<setw(7) << _high[i]
       <<endl;
  }
}


 FlexibleInterpVar.cxx:1
 FlexibleInterpVar.cxx:2
 FlexibleInterpVar.cxx:3
 FlexibleInterpVar.cxx:4
 FlexibleInterpVar.cxx:5
 FlexibleInterpVar.cxx:6
 FlexibleInterpVar.cxx:7
 FlexibleInterpVar.cxx:8
 FlexibleInterpVar.cxx:9
 FlexibleInterpVar.cxx:10
 FlexibleInterpVar.cxx:11
 FlexibleInterpVar.cxx:12
 FlexibleInterpVar.cxx:13
 FlexibleInterpVar.cxx:14
 FlexibleInterpVar.cxx:15
 FlexibleInterpVar.cxx:16
 FlexibleInterpVar.cxx:17
 FlexibleInterpVar.cxx:18
 FlexibleInterpVar.cxx:19
 FlexibleInterpVar.cxx:20
 FlexibleInterpVar.cxx:21
 FlexibleInterpVar.cxx:22
 FlexibleInterpVar.cxx:23
 FlexibleInterpVar.cxx:24
 FlexibleInterpVar.cxx:25
 FlexibleInterpVar.cxx:26
 FlexibleInterpVar.cxx:27
 FlexibleInterpVar.cxx:28
 FlexibleInterpVar.cxx:29
 FlexibleInterpVar.cxx:30
 FlexibleInterpVar.cxx:31
 FlexibleInterpVar.cxx:32
 FlexibleInterpVar.cxx:33
 FlexibleInterpVar.cxx:34
 FlexibleInterpVar.cxx:35
 FlexibleInterpVar.cxx:36
 FlexibleInterpVar.cxx:37
 FlexibleInterpVar.cxx:38
 FlexibleInterpVar.cxx:39
 FlexibleInterpVar.cxx:40
 FlexibleInterpVar.cxx:41
 FlexibleInterpVar.cxx:42
 FlexibleInterpVar.cxx:43
 FlexibleInterpVar.cxx:44
 FlexibleInterpVar.cxx:45
 FlexibleInterpVar.cxx:46
 FlexibleInterpVar.cxx:47
 FlexibleInterpVar.cxx:48
 FlexibleInterpVar.cxx:49
 FlexibleInterpVar.cxx:50
 FlexibleInterpVar.cxx:51
 FlexibleInterpVar.cxx:52
 FlexibleInterpVar.cxx:53
 FlexibleInterpVar.cxx:54
 FlexibleInterpVar.cxx:55
 FlexibleInterpVar.cxx:56
 FlexibleInterpVar.cxx:57
 FlexibleInterpVar.cxx:58
 FlexibleInterpVar.cxx:59
 FlexibleInterpVar.cxx:60
 FlexibleInterpVar.cxx:61
 FlexibleInterpVar.cxx:62
 FlexibleInterpVar.cxx:63
 FlexibleInterpVar.cxx:64
 FlexibleInterpVar.cxx:65
 FlexibleInterpVar.cxx:66
 FlexibleInterpVar.cxx:67
 FlexibleInterpVar.cxx:68
 FlexibleInterpVar.cxx:69
 FlexibleInterpVar.cxx:70
 FlexibleInterpVar.cxx:71
 FlexibleInterpVar.cxx:72
 FlexibleInterpVar.cxx:73
 FlexibleInterpVar.cxx:74
 FlexibleInterpVar.cxx:75
 FlexibleInterpVar.cxx:76
 FlexibleInterpVar.cxx:77
 FlexibleInterpVar.cxx:78
 FlexibleInterpVar.cxx:79
 FlexibleInterpVar.cxx:80
 FlexibleInterpVar.cxx:81
 FlexibleInterpVar.cxx:82
 FlexibleInterpVar.cxx:83
 FlexibleInterpVar.cxx:84
 FlexibleInterpVar.cxx:85
 FlexibleInterpVar.cxx:86
 FlexibleInterpVar.cxx:87
 FlexibleInterpVar.cxx:88
 FlexibleInterpVar.cxx:89
 FlexibleInterpVar.cxx:90
 FlexibleInterpVar.cxx:91
 FlexibleInterpVar.cxx:92
 FlexibleInterpVar.cxx:93
 FlexibleInterpVar.cxx:94
 FlexibleInterpVar.cxx:95
 FlexibleInterpVar.cxx:96
 FlexibleInterpVar.cxx:97
 FlexibleInterpVar.cxx:98
 FlexibleInterpVar.cxx:99
 FlexibleInterpVar.cxx:100
 FlexibleInterpVar.cxx:101
 FlexibleInterpVar.cxx:102
 FlexibleInterpVar.cxx:103
 FlexibleInterpVar.cxx:104
 FlexibleInterpVar.cxx:105
 FlexibleInterpVar.cxx:106
 FlexibleInterpVar.cxx:107
 FlexibleInterpVar.cxx:108
 FlexibleInterpVar.cxx:109
 FlexibleInterpVar.cxx:110
 FlexibleInterpVar.cxx:111
 FlexibleInterpVar.cxx:112
 FlexibleInterpVar.cxx:113
 FlexibleInterpVar.cxx:114
 FlexibleInterpVar.cxx:115
 FlexibleInterpVar.cxx:116
 FlexibleInterpVar.cxx:117
 FlexibleInterpVar.cxx:118
 FlexibleInterpVar.cxx:119
 FlexibleInterpVar.cxx:120
 FlexibleInterpVar.cxx:121
 FlexibleInterpVar.cxx:122
 FlexibleInterpVar.cxx:123
 FlexibleInterpVar.cxx:124
 FlexibleInterpVar.cxx:125
 FlexibleInterpVar.cxx:126
 FlexibleInterpVar.cxx:127
 FlexibleInterpVar.cxx:128
 FlexibleInterpVar.cxx:129
 FlexibleInterpVar.cxx:130
 FlexibleInterpVar.cxx:131
 FlexibleInterpVar.cxx:132
 FlexibleInterpVar.cxx:133
 FlexibleInterpVar.cxx:134
 FlexibleInterpVar.cxx:135
 FlexibleInterpVar.cxx:136
 FlexibleInterpVar.cxx:137
 FlexibleInterpVar.cxx:138
 FlexibleInterpVar.cxx:139
 FlexibleInterpVar.cxx:140
 FlexibleInterpVar.cxx:141
 FlexibleInterpVar.cxx:142
 FlexibleInterpVar.cxx:143
 FlexibleInterpVar.cxx:144
 FlexibleInterpVar.cxx:145
 FlexibleInterpVar.cxx:146
 FlexibleInterpVar.cxx:147
 FlexibleInterpVar.cxx:148
 FlexibleInterpVar.cxx:149
 FlexibleInterpVar.cxx:150
 FlexibleInterpVar.cxx:151
 FlexibleInterpVar.cxx:152
 FlexibleInterpVar.cxx:153
 FlexibleInterpVar.cxx:154
 FlexibleInterpVar.cxx:155
 FlexibleInterpVar.cxx:156
 FlexibleInterpVar.cxx:157
 FlexibleInterpVar.cxx:158
 FlexibleInterpVar.cxx:159
 FlexibleInterpVar.cxx:160
 FlexibleInterpVar.cxx:161
 FlexibleInterpVar.cxx:162
 FlexibleInterpVar.cxx:163
 FlexibleInterpVar.cxx:164
 FlexibleInterpVar.cxx:165
 FlexibleInterpVar.cxx:166
 FlexibleInterpVar.cxx:167
 FlexibleInterpVar.cxx:168
 FlexibleInterpVar.cxx:169
 FlexibleInterpVar.cxx:170
 FlexibleInterpVar.cxx:171
 FlexibleInterpVar.cxx:172
 FlexibleInterpVar.cxx:173
 FlexibleInterpVar.cxx:174
 FlexibleInterpVar.cxx:175
 FlexibleInterpVar.cxx:176
 FlexibleInterpVar.cxx:177
 FlexibleInterpVar.cxx:178
 FlexibleInterpVar.cxx:179
 FlexibleInterpVar.cxx:180
 FlexibleInterpVar.cxx:181
 FlexibleInterpVar.cxx:182
 FlexibleInterpVar.cxx:183
 FlexibleInterpVar.cxx:184
 FlexibleInterpVar.cxx:185
 FlexibleInterpVar.cxx:186
 FlexibleInterpVar.cxx:187
 FlexibleInterpVar.cxx:188
 FlexibleInterpVar.cxx:189
 FlexibleInterpVar.cxx:190
 FlexibleInterpVar.cxx:191
 FlexibleInterpVar.cxx:192
 FlexibleInterpVar.cxx:193
 FlexibleInterpVar.cxx:194
 FlexibleInterpVar.cxx:195
 FlexibleInterpVar.cxx:196
 FlexibleInterpVar.cxx:197
 FlexibleInterpVar.cxx:198
 FlexibleInterpVar.cxx:199
 FlexibleInterpVar.cxx:200
 FlexibleInterpVar.cxx:201
 FlexibleInterpVar.cxx:202
 FlexibleInterpVar.cxx:203
 FlexibleInterpVar.cxx:204
 FlexibleInterpVar.cxx:205
 FlexibleInterpVar.cxx:206
 FlexibleInterpVar.cxx:207
 FlexibleInterpVar.cxx:208
 FlexibleInterpVar.cxx:209
 FlexibleInterpVar.cxx:210
 FlexibleInterpVar.cxx:211
 FlexibleInterpVar.cxx:212
 FlexibleInterpVar.cxx:213
 FlexibleInterpVar.cxx:214
 FlexibleInterpVar.cxx:215
 FlexibleInterpVar.cxx:216
 FlexibleInterpVar.cxx:217
 FlexibleInterpVar.cxx:218
 FlexibleInterpVar.cxx:219
 FlexibleInterpVar.cxx:220
 FlexibleInterpVar.cxx:221
 FlexibleInterpVar.cxx:222
 FlexibleInterpVar.cxx:223
 FlexibleInterpVar.cxx:224
 FlexibleInterpVar.cxx:225
 FlexibleInterpVar.cxx:226
 FlexibleInterpVar.cxx:227
 FlexibleInterpVar.cxx:228
 FlexibleInterpVar.cxx:229
 FlexibleInterpVar.cxx:230
 FlexibleInterpVar.cxx:231
 FlexibleInterpVar.cxx:232
 FlexibleInterpVar.cxx:233
 FlexibleInterpVar.cxx:234
 FlexibleInterpVar.cxx:235
 FlexibleInterpVar.cxx:236
 FlexibleInterpVar.cxx:237
 FlexibleInterpVar.cxx:238
 FlexibleInterpVar.cxx:239
 FlexibleInterpVar.cxx:240
 FlexibleInterpVar.cxx:241
 FlexibleInterpVar.cxx:242
 FlexibleInterpVar.cxx:243
 FlexibleInterpVar.cxx:244
 FlexibleInterpVar.cxx:245
 FlexibleInterpVar.cxx:246
 FlexibleInterpVar.cxx:247
 FlexibleInterpVar.cxx:248
 FlexibleInterpVar.cxx:249
 FlexibleInterpVar.cxx:250
 FlexibleInterpVar.cxx:251
 FlexibleInterpVar.cxx:252
 FlexibleInterpVar.cxx:253
 FlexibleInterpVar.cxx:254
 FlexibleInterpVar.cxx:255
 FlexibleInterpVar.cxx:256
 FlexibleInterpVar.cxx:257
 FlexibleInterpVar.cxx:258
 FlexibleInterpVar.cxx:259
 FlexibleInterpVar.cxx:260
 FlexibleInterpVar.cxx:261
 FlexibleInterpVar.cxx:262
 FlexibleInterpVar.cxx:263
 FlexibleInterpVar.cxx:264
 FlexibleInterpVar.cxx:265
 FlexibleInterpVar.cxx:266
 FlexibleInterpVar.cxx:267
 FlexibleInterpVar.cxx:268
 FlexibleInterpVar.cxx:269
 FlexibleInterpVar.cxx:270
 FlexibleInterpVar.cxx:271
 FlexibleInterpVar.cxx:272
 FlexibleInterpVar.cxx:273
 FlexibleInterpVar.cxx:274
 FlexibleInterpVar.cxx:275
 FlexibleInterpVar.cxx:276
 FlexibleInterpVar.cxx:277
 FlexibleInterpVar.cxx:278
 FlexibleInterpVar.cxx:279
 FlexibleInterpVar.cxx:280
 FlexibleInterpVar.cxx:281
 FlexibleInterpVar.cxx:282
 FlexibleInterpVar.cxx:283
 FlexibleInterpVar.cxx:284
 FlexibleInterpVar.cxx:285
 FlexibleInterpVar.cxx:286
 FlexibleInterpVar.cxx:287
 FlexibleInterpVar.cxx:288
 FlexibleInterpVar.cxx:289
 FlexibleInterpVar.cxx:290
 FlexibleInterpVar.cxx:291
 FlexibleInterpVar.cxx:292
 FlexibleInterpVar.cxx:293
 FlexibleInterpVar.cxx:294
 FlexibleInterpVar.cxx:295
 FlexibleInterpVar.cxx:296
 FlexibleInterpVar.cxx:297
 FlexibleInterpVar.cxx:298
 FlexibleInterpVar.cxx:299
 FlexibleInterpVar.cxx:300
 FlexibleInterpVar.cxx:301
 FlexibleInterpVar.cxx:302
 FlexibleInterpVar.cxx:303
 FlexibleInterpVar.cxx:304
 FlexibleInterpVar.cxx:305
 FlexibleInterpVar.cxx:306
 FlexibleInterpVar.cxx:307
 FlexibleInterpVar.cxx:308
 FlexibleInterpVar.cxx:309
 FlexibleInterpVar.cxx:310
 FlexibleInterpVar.cxx:311
 FlexibleInterpVar.cxx:312
 FlexibleInterpVar.cxx:313
 FlexibleInterpVar.cxx:314
 FlexibleInterpVar.cxx:315
 FlexibleInterpVar.cxx:316
 FlexibleInterpVar.cxx:317
 FlexibleInterpVar.cxx:318
 FlexibleInterpVar.cxx:319
 FlexibleInterpVar.cxx:320
 FlexibleInterpVar.cxx:321
 FlexibleInterpVar.cxx:322
 FlexibleInterpVar.cxx:323
 FlexibleInterpVar.cxx:324
 FlexibleInterpVar.cxx:325
 FlexibleInterpVar.cxx:326
 FlexibleInterpVar.cxx:327
 FlexibleInterpVar.cxx:328
 FlexibleInterpVar.cxx:329
 FlexibleInterpVar.cxx:330
 FlexibleInterpVar.cxx:331
 FlexibleInterpVar.cxx:332
 FlexibleInterpVar.cxx:333
 FlexibleInterpVar.cxx:334
 FlexibleInterpVar.cxx:335
 FlexibleInterpVar.cxx:336
 FlexibleInterpVar.cxx:337
 FlexibleInterpVar.cxx:338
 FlexibleInterpVar.cxx:339
 FlexibleInterpVar.cxx:340
 FlexibleInterpVar.cxx:341
 FlexibleInterpVar.cxx:342
 FlexibleInterpVar.cxx:343
 FlexibleInterpVar.cxx:344
 FlexibleInterpVar.cxx:345
 FlexibleInterpVar.cxx:346
 FlexibleInterpVar.cxx:347
 FlexibleInterpVar.cxx:348
 FlexibleInterpVar.cxx:349
 FlexibleInterpVar.cxx:350
 FlexibleInterpVar.cxx:351
 FlexibleInterpVar.cxx:352
 FlexibleInterpVar.cxx:353
 FlexibleInterpVar.cxx:354
 FlexibleInterpVar.cxx:355
 FlexibleInterpVar.cxx:356
 FlexibleInterpVar.cxx:357
 FlexibleInterpVar.cxx:358
 FlexibleInterpVar.cxx:359
 FlexibleInterpVar.cxx:360
 FlexibleInterpVar.cxx:361
 FlexibleInterpVar.cxx:362
 FlexibleInterpVar.cxx:363
 FlexibleInterpVar.cxx:364
 FlexibleInterpVar.cxx:365
 FlexibleInterpVar.cxx:366
 FlexibleInterpVar.cxx:367
 FlexibleInterpVar.cxx:368
 FlexibleInterpVar.cxx:369
 FlexibleInterpVar.cxx:370
 FlexibleInterpVar.cxx:371
 FlexibleInterpVar.cxx:372
 FlexibleInterpVar.cxx:373
 FlexibleInterpVar.cxx:374
 FlexibleInterpVar.cxx:375
 FlexibleInterpVar.cxx:376
 FlexibleInterpVar.cxx:377
 FlexibleInterpVar.cxx:378
 FlexibleInterpVar.cxx:379
 FlexibleInterpVar.cxx:380
 FlexibleInterpVar.cxx:381
 FlexibleInterpVar.cxx:382
 FlexibleInterpVar.cxx:383
 FlexibleInterpVar.cxx:384
 FlexibleInterpVar.cxx:385
 FlexibleInterpVar.cxx:386
 FlexibleInterpVar.cxx:387
 FlexibleInterpVar.cxx:388
 FlexibleInterpVar.cxx:389
 FlexibleInterpVar.cxx:390
 FlexibleInterpVar.cxx:391
 FlexibleInterpVar.cxx:392
 FlexibleInterpVar.cxx:393
 FlexibleInterpVar.cxx:394
 FlexibleInterpVar.cxx:395
 FlexibleInterpVar.cxx:396
 FlexibleInterpVar.cxx:397
 FlexibleInterpVar.cxx:398
 FlexibleInterpVar.cxx:399
 FlexibleInterpVar.cxx:400
 FlexibleInterpVar.cxx:401
 FlexibleInterpVar.cxx:402
 FlexibleInterpVar.cxx:403
 FlexibleInterpVar.cxx:404
 FlexibleInterpVar.cxx:405
 FlexibleInterpVar.cxx:406
 FlexibleInterpVar.cxx:407
 FlexibleInterpVar.cxx:408
 FlexibleInterpVar.cxx:409
 FlexibleInterpVar.cxx:410
 FlexibleInterpVar.cxx:411
 FlexibleInterpVar.cxx:412
 FlexibleInterpVar.cxx:413
 FlexibleInterpVar.cxx:414
 FlexibleInterpVar.cxx:415
 FlexibleInterpVar.cxx:416
 FlexibleInterpVar.cxx:417
 FlexibleInterpVar.cxx:418
 FlexibleInterpVar.cxx:419
 FlexibleInterpVar.cxx:420
 FlexibleInterpVar.cxx:421
 FlexibleInterpVar.cxx:422
 FlexibleInterpVar.cxx:423
 FlexibleInterpVar.cxx:424
 FlexibleInterpVar.cxx:425
 FlexibleInterpVar.cxx:426
 FlexibleInterpVar.cxx:427
 FlexibleInterpVar.cxx:428
 FlexibleInterpVar.cxx:429
 FlexibleInterpVar.cxx:430
 FlexibleInterpVar.cxx:431
 FlexibleInterpVar.cxx:432
 FlexibleInterpVar.cxx:433
 FlexibleInterpVar.cxx:434
 FlexibleInterpVar.cxx:435
 FlexibleInterpVar.cxx:436
 FlexibleInterpVar.cxx:437
 FlexibleInterpVar.cxx:438
 FlexibleInterpVar.cxx:439
 FlexibleInterpVar.cxx:440
 FlexibleInterpVar.cxx:441
 FlexibleInterpVar.cxx:442
 FlexibleInterpVar.cxx:443
 FlexibleInterpVar.cxx:444
 FlexibleInterpVar.cxx:445
 FlexibleInterpVar.cxx:446
 FlexibleInterpVar.cxx:447
 FlexibleInterpVar.cxx:448
 FlexibleInterpVar.cxx:449
 FlexibleInterpVar.cxx:450
 FlexibleInterpVar.cxx:451
 FlexibleInterpVar.cxx:452
 FlexibleInterpVar.cxx:453
 FlexibleInterpVar.cxx:454
 FlexibleInterpVar.cxx:455
 FlexibleInterpVar.cxx:456
 FlexibleInterpVar.cxx:457
 FlexibleInterpVar.cxx:458
 FlexibleInterpVar.cxx:459
 FlexibleInterpVar.cxx:460
 FlexibleInterpVar.cxx:461
 FlexibleInterpVar.cxx:462
 FlexibleInterpVar.cxx:463
 FlexibleInterpVar.cxx:464
 FlexibleInterpVar.cxx:465
 FlexibleInterpVar.cxx:466
 FlexibleInterpVar.cxx:467
 FlexibleInterpVar.cxx:468
 FlexibleInterpVar.cxx:469
 FlexibleInterpVar.cxx:470
 FlexibleInterpVar.cxx:471
 FlexibleInterpVar.cxx:472
 FlexibleInterpVar.cxx:473
 FlexibleInterpVar.cxx:474
 FlexibleInterpVar.cxx:475
 FlexibleInterpVar.cxx:476
 FlexibleInterpVar.cxx:477
 FlexibleInterpVar.cxx:478
 FlexibleInterpVar.cxx:479
 FlexibleInterpVar.cxx:480
 FlexibleInterpVar.cxx:481
 FlexibleInterpVar.cxx:482
 FlexibleInterpVar.cxx:483
 FlexibleInterpVar.cxx:484
 FlexibleInterpVar.cxx:485
 FlexibleInterpVar.cxx:486
 FlexibleInterpVar.cxx:487
 FlexibleInterpVar.cxx:488
 FlexibleInterpVar.cxx:489
 FlexibleInterpVar.cxx:490
 FlexibleInterpVar.cxx:491
 FlexibleInterpVar.cxx:492
 FlexibleInterpVar.cxx:493
 FlexibleInterpVar.cxx:494
 FlexibleInterpVar.cxx:495
 FlexibleInterpVar.cxx:496
 FlexibleInterpVar.cxx:497
 FlexibleInterpVar.cxx:498
 FlexibleInterpVar.cxx:499
 FlexibleInterpVar.cxx:500