ROOT logo
// @(#)root/tmva $Id$
// Author: Andreas Hoecker, Joerg Stelzer, Helge Voss, Eckhard von Toerne

/**********************************************************************************
 * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
 * Package: TMVA                                                                  *
 * Class  : VariableDecorrTransform                                               *
 * Web    : http://tmva.sourceforge.net                                           *
 *                                                                                *
 * Description:                                                                   *
 *      Implementation (see header for description)                               *
 *                                                                                *
 * Authors (alphabetical):                                                        *
 *      Andreas Hoecker <Andreas.Hocker@cern.ch> - CERN, Switzerland              *
 *      Peter Speckmayer <Peter.Speckmayer@cern.ch> - CERN, Switzerland           *
 *      Joerg Stelzer   <Joerg.Stelzer@cern.ch>  - CERN, Switzerland              *
 *      Helge Voss      <Helge.Voss@cern.ch>     - MPI-K Heidelberg, Germany      *
 *                                                                                *
 * Copyright (c) 2005-2011:                                                       *
 *      CERN, Switzerland                                                         *
 *      MPI-K Heidelberg, Germany                                                 *
 *      U. of Bonn, Germany                                                       *
 *                                                                                *
 * Redistribution and use in source and binary forms, with or without             *
 * modification, are permitted according to the terms listed in LICENSE           *
 * (http://tmva.sourceforge.net/LICENSE)                                          *
 **********************************************************************************/

#include <iostream>
#include <iomanip>
#include <algorithm>

#include "TVectorF.h"
#include "TVectorD.h"
#include "TMatrixD.h"
#include "TMatrixDBase.h"

#ifndef ROOT_TMVA_MsgLogger
#include "TMVA/MsgLogger.h"
#endif
#ifndef ROOT_TMVA_VariableDecorrTransform
#include "TMVA/VariableDecorrTransform.h"
#endif
#ifndef ROOT_TMVA_Tools
#include "TMVA/Tools.h"
#endif
#ifndef ROOT_TMVA_DataSet
#include "TMVA/DataSet.h"
#endif

ClassImp(TMVA::VariableDecorrTransform)

//_______________________________________________________________________
TMVA::VariableDecorrTransform::VariableDecorrTransform( DataSetInfo& dsi )
: VariableTransformBase( dsi, Types::kDecorrelated, "Deco" )
{ 
   // constructor
}

//_______________________________________________________________________
TMVA::VariableDecorrTransform::~VariableDecorrTransform()
{
   // destructor
   for (std::vector<TMatrixD*>::iterator it = fDecorrMatrices.begin(); it != fDecorrMatrices.end(); it++) {
      if ((*it) != 0) delete (*it);
   }
}

//_______________________________________________________________________
void TMVA::VariableDecorrTransform::Initialize()
{
   // initialisation
}

//_______________________________________________________________________
Bool_t TMVA::VariableDecorrTransform::PrepareTransformation (const std::vector<Event*>& events)
{
   // calculate the decorrelation matrix and the normalization
   Initialize();

   if (!IsEnabled() || IsCreated()) return kTRUE;

   Log() << kINFO << "Preparing the Decorrelation transformation..." << Endl;

   Int_t inputSize = fGet.size();
   SetNVariables(inputSize);

   if (inputSize > 200) { 
      Log() << kINFO << "----------------------------------------------------------------------------" 
            << Endl;
      Log() << kINFO 
            << ": More than 200 variables, will not calculate decorrelation matrix "
            << "!" << Endl;
      Log() << kINFO << "----------------------------------------------------------------------------" 
            << Endl;
      return kFALSE;
   }   

   CalcSQRMats( events, GetNClasses() );

   SetCreated( kTRUE );

   return kTRUE;
}

//_______________________________________________________________________
std::vector<TString>* TMVA::VariableDecorrTransform::GetTransformationStrings( Int_t cls ) const
{
   // creates string with variable transformations applied

   Int_t whichMatrix = cls;
   // if cls (the class chosen by the user) not existing, assume that user wants to 
   // have the matrix for all classes together. 
   
   if (cls < 0 || cls > GetNClasses()) whichMatrix = GetNClasses();
   
   TMatrixD* m = fDecorrMatrices.at(whichMatrix);
   if (m == 0) {
      if (whichMatrix == GetNClasses() )
         Log() << kFATAL << "Transformation matrix all classes is not defined" 
               << Endl;
      else
         Log() << kFATAL << "Transformation matrix for class " << whichMatrix << " is not defined" 
               << Endl;
   }

   const Int_t nvar = fGet.size();
   std::vector<TString>* strVec = new std::vector<TString>;

   // fill vector
   for (Int_t ivar=0; ivar<nvar; ivar++) {
      TString str( "" );
      for (Int_t jvar=0; jvar<nvar; jvar++) {
         str += ((*m)(ivar,jvar) > 0) ? " + " : " - ";

         Char_t type = fGet.at(jvar).first;
         Int_t  idx  = fGet.at(jvar).second;

         switch( type ) {
         case 'v':
            str += Form( "%10.5g*[%s]", TMath::Abs((*m)(ivar,jvar)), Variables()[idx].GetLabel().Data() );
            break;
         case 't':
            str += Form( "%10.5g*[%s]", TMath::Abs((*m)(ivar,jvar)), Targets()[idx].GetLabel().Data() );
            break;
         case 's':
            str += Form( "%10.5g*[%s]", TMath::Abs((*m)(ivar,jvar)), Spectators()[idx].GetLabel().Data() );
            break;
         default:
            Log() << kFATAL << "VariableDecorrTransform::GetTransformationStrings : unknown type '" << type << "'." << Endl;
         }
      }
      strVec->push_back( str );
   }      

   return strVec;
}

//_______________________________________________________________________
const TMVA::Event* TMVA::VariableDecorrTransform::Transform( const TMVA::Event* const ev, Int_t cls ) const
{
   // apply the decorrelation transformation
   if (!IsCreated())
      Log() << kFATAL << "Transformation matrix not yet created" 
            << Endl;

   Int_t whichMatrix = cls;
   // if cls (the class chosen by the user) not existing, assume that he wants to have the matrix for all classes together. 
   // EVT this is a workaround to address the reader problem with transforma and EvaluateMVA(std::vector<float/double> ,...) 
   if (cls < 0 || cls >= (int) fDecorrMatrices.size()) whichMatrix = fDecorrMatrices.size()-1;
   //EVT workaround end
   //if (cls < 0 || cls > GetNClasses()) {
   //   whichMatrix = GetNClasses();
   //   if (GetNClasses() == 1 ) whichMatrix = (fDecorrMatrices.size()==1?0:2);
   //}

   TMatrixD* m = fDecorrMatrices.at(whichMatrix);
   if (m == 0) {
      if (whichMatrix == GetNClasses() )
         Log() << kFATAL << "Transformation matrix all classes is not defined" 
               << Endl;
      else
         Log() << kFATAL << "Transformation matrix for class " << whichMatrix << " is not defined" 
               << Endl;
   }

   if (fTransformedEvent==0 || fTransformedEvent->GetNVariables()!=ev->GetNVariables()) {
      if (fTransformedEvent!=0) { delete fTransformedEvent; fTransformedEvent = 0; }
      fTransformedEvent = new Event();
   }

   // transformation to decorrelate the variables
   const Int_t nvar = fGet.size();

   std::vector<Float_t> input;
   std::vector<Char_t> mask; // entries with kTRUE must not be transformed
   Bool_t hasMaskedEntries = GetInput( ev, input, mask );

   if( hasMaskedEntries ){ // targets might be masked (for events where the targets have not been computed yet)
      UInt_t numMasked = std::count(mask.begin(), mask.end(), (Char_t)kTRUE);
      UInt_t numOK     = std::count(mask.begin(), mask.end(), (Char_t)kFALSE);
      if( numMasked>0 && numOK>0 ){
         Log() << kFATAL << "You mixed variables and targets in the decorrelation transformation. This is not possible." << Endl;
      }
      SetOutput( fTransformedEvent, input, mask, ev );
      return fTransformedEvent;
   }

   TVectorD vec( nvar );
   for (Int_t ivar=0; ivar<nvar; ivar++) vec(ivar) = input.at(ivar);

   // diagonalise variable vectors
   vec *= *m;

   input.clear();
   for (Int_t ivar=0; ivar<nvar; ivar++) input.push_back( vec(ivar) );

   SetOutput( fTransformedEvent, input, mask, ev );

   return fTransformedEvent;
}

//_______________________________________________________________________
const TMVA::Event* TMVA::VariableDecorrTransform::InverseTransform( const TMVA::Event* const /*ev*/, Int_t /*cls*/ ) const
{
   // apply the inverse decorrelation transformation ... 
   // TODO : ... build the inverse transformation
   Log() << kFATAL << "Inverse transformation for decorrelation transformation not yet implemented. Hence, this transformation cannot be applied together with regression if targets should be transformed. Please contact the authors if necessary." << Endl;


   return fBackTransformedEvent;
}


//_______________________________________________________________________
void TMVA::VariableDecorrTransform::CalcSQRMats( const std::vector< Event*>& events, Int_t maxCls )
{
   // compute square-root matrices for signal and background

   // delete old matrices if any
   for (std::vector<TMatrixD*>::iterator it = fDecorrMatrices.begin(); 
        it != fDecorrMatrices.end(); it++)
      if (0 != (*it) ) { delete (*it); *it=0; }


   // if more than one classes, then produce one matrix for all events as well (beside the matrices for each class)
   const UInt_t matNum = (maxCls<=1)?maxCls:maxCls+1;
   fDecorrMatrices.resize( matNum, (TMatrixD*) 0 );
      
   std::vector<TMatrixDSym*>* covMat = gTools().CalcCovarianceMatrices( events, maxCls, this );
   
   
   for (UInt_t cls=0; cls<matNum; cls++) {
      TMatrixD* sqrMat = gTools().GetSQRootMatrix( covMat->at(cls) );
      if ( sqrMat==0 ) 
         Log() << kFATAL << "<GetSQRMats> Zero pointer returned for SQR matrix" << Endl;
      fDecorrMatrices[cls] = sqrMat;
      delete (*covMat)[cls];
   }
   delete covMat;
}

//_______________________________________________________________________
void TMVA::VariableDecorrTransform::WriteTransformationToStream( std::ostream& o ) const
{
   // write the decorrelation matrix to the stream
   Int_t cls = 0;
   Int_t dp = o.precision();
   for (std::vector<TMatrixD*>::const_iterator itm = fDecorrMatrices.begin(); itm != fDecorrMatrices.end(); itm++) {
      o << "# correlation matrix " << std::endl;
      TMatrixD* mat = (*itm);
      o << cls << " " << mat->GetNrows() << " x " << mat->GetNcols() << std::endl;
      for (Int_t row = 0; row<mat->GetNrows(); row++) {
         for (Int_t col = 0; col<mat->GetNcols(); col++) {
            o << std::setprecision(12) << std::setw(20) << (*mat)[row][col] << " ";
         }
         o << std::endl;
      }
      cls++;
   }
   o << "##" << std::endl;
   o << std::setprecision(dp);
}

//_______________________________________________________________________
void TMVA::VariableDecorrTransform::AttachXMLTo(void* parent) 
{
   // node attachment to parent
   void* trf = gTools().AddChild(parent, "Transform");
   gTools().AddAttr(trf,"Name", "Decorrelation");

   VariableTransformBase::AttachXMLTo( trf );

   for (std::vector<TMatrixD*>::const_iterator itm = fDecorrMatrices.begin(); itm != fDecorrMatrices.end(); itm++) {
      TMatrixD* mat = (*itm);
      /*void* decmat = gTools().xmlengine().NewChild(trf, 0, "Matrix");
        gTools().xmlengine().NewAttr(decmat,0,"Rows", gTools().StringFromInt(mat->GetNrows()) );
        gTools().xmlengine().NewAttr(decmat,0,"Columns", gTools().StringFromInt(mat->GetNcols()) );

        std::stringstream s;
        for (Int_t row = 0; row<mat->GetNrows(); row++) {
        for (Int_t col = 0; col<mat->GetNcols(); col++) {
        s << (*mat)[row][col] << " ";
        }
        }
        gTools().xmlengine().AddRawLine( decmat, s.str().c_str() );*/
      gTools().WriteTMatrixDToXML(trf,"Matrix",mat);
   }
}

//_______________________________________________________________________
void TMVA::VariableDecorrTransform::ReadFromXML( void* trfnode ) 
{
   // Read the transformation matrices from the xml node

   // first delete the old matrices
   for( std::vector<TMatrixD*>::iterator it = fDecorrMatrices.begin(); it != fDecorrMatrices.end(); it++ )
      if( (*it) != 0 ) delete (*it);
   fDecorrMatrices.clear();

   Bool_t newFormat = kFALSE;

   void* inpnode = NULL;
   
   inpnode = gTools().GetChild(trfnode, "Selection"); // new xml format
   if( inpnode!=NULL )
      newFormat = kTRUE; // new xml format

   void* ch = NULL;
   if( newFormat ){
      // ------------- new format --------------------
      // read input
      VariableTransformBase::ReadFromXML( inpnode );

      ch = gTools().GetNextChild(inpnode);
   }else
      ch = gTools().GetChild(trfnode);

   // Read the transformation matrices from the xml node
   while(ch!=0) {
      Int_t nrows, ncols;
      gTools().ReadAttr(ch, "Rows", nrows);
      gTools().ReadAttr(ch, "Columns", ncols);
      TMatrixD* mat = new TMatrixD(nrows,ncols);
      const char* content = gTools().GetContent(ch);
      std::stringstream s(content);
      for (Int_t row = 0; row<nrows; row++) {
         for (Int_t col = 0; col<ncols; col++) {
            s >> (*mat)[row][col];
         }
      }
      fDecorrMatrices.push_back(mat);
      ch = gTools().GetNextChild(ch);
   }
   SetCreated();
}


//_______________________________________________________________________
void TMVA::VariableDecorrTransform::ReadTransformationFromStream( std::istream& istr, const TString& classname )
{
   // Read the decorellation matrix from an input stream

   char buf[512];
   istr.getline(buf,512);
   TString strvar, dummy;
   Int_t nrows(0), ncols(0);
   UInt_t classIdx=0;
   while (!(buf[0]=='#'&& buf[1]=='#')) { // if line starts with ## return
      char* p = buf;
      while (*p==' ' || *p=='\t') p++; // 'remove' leading whitespace
      if (*p=='#' || *p=='\0') {
         istr.getline(buf,512);
         continue; // if comment or empty line, read the next line
      }
      std::stringstream sstr(buf);

      sstr >> strvar;
      if (strvar=="signal" || strvar=="background") {
         UInt_t cls=0;
         if(strvar=="background") cls=1;
         if(strvar==classname) classIdx = cls;
         // coverity[tainted_data_argument]
         sstr >> nrows >> dummy >> ncols;
         if (fDecorrMatrices.size() <= cls ) fDecorrMatrices.resize(cls+1);
         if (fDecorrMatrices.at(cls) != 0) delete fDecorrMatrices.at(cls);
         TMatrixD* mat = fDecorrMatrices.at(cls) = new TMatrixD(nrows,ncols);
         // now read all matrix parameters
         for (Int_t row = 0; row<mat->GetNrows(); row++) {
            for (Int_t col = 0; col<mat->GetNcols(); col++) {
               istr >> (*mat)[row][col];
            }
         }
      } // done reading a matrix
      istr.getline(buf,512); // reading the next line
   }

   fDecorrMatrices.push_back( new TMatrixD(*fDecorrMatrices[classIdx]) );

   SetCreated();
}

//_______________________________________________________________________
void TMVA::VariableDecorrTransform::PrintTransformation( std::ostream& ) 
{
   // prints the transformation matrix
   Int_t cls = 0;
   for (std::vector<TMatrixD*>::iterator itm = fDecorrMatrices.begin(); itm != fDecorrMatrices.end(); itm++) {
      Log() << kINFO << "Transformation matrix "<< cls <<":" << Endl;
      (*itm)->Print();
   }
}

//_______________________________________________________________________
void TMVA::VariableDecorrTransform::MakeFunction( std::ostream& fout, const TString& fcncName, Int_t part, UInt_t trCounter, Int_t )
{
   // creates C++ code fragment of the decorrelation transform for inclusion in standalone C++ class

   Int_t dp = fout.precision();

   UInt_t numC = fDecorrMatrices.size();
   // creates a decorrelation function
   if (part==1) {
      TMatrixD* mat = fDecorrMatrices.at(0); // ToDo check if all Decorr matrices have identical dimensions
      fout << std::endl;
      fout << "   double fDecTF_"<<trCounter<<"["<<numC<<"]["<<mat->GetNrows()<<"]["<<mat->GetNcols()<<"];" << std::endl;
   }

   if (part==2) {
      fout << std::endl;
      fout << "//_______________________________________________________________________" << std::endl;
      fout << "inline void " << fcncName << "::InitTransform_"<<trCounter<<"()" << std::endl;
      fout << "{" << std::endl;
      fout << "   // Decorrelation transformation, initialisation" << std::endl;
      for (UInt_t icls = 0; icls < numC; icls++){
         TMatrixD* matx = fDecorrMatrices.at(icls); 
         for (int i=0; i<matx->GetNrows(); i++) {
            for (int j=0; j<matx->GetNcols(); j++) {
               fout << "   fDecTF_"<<trCounter<<"["<<icls<<"]["<<i<<"]["<<j<<"] = " << std::setprecision(12) << (*matx)[i][j] << ";" << std::endl;
            }
         }
      }
      fout << "}" << std::endl;
      fout << std::endl;
      TMatrixD* matx = fDecorrMatrices.at(0); // ToDo check if all Decorr matrices have identicla dimensions
      fout << "//_______________________________________________________________________" << std::endl;
      fout << "inline void " << fcncName << "::Transform_"<<trCounter<<"( std::vector<double>& iv, int cls) const" << std::endl;
      fout << "{" << std::endl;
      fout << "   // Decorrelation transformation" << std::endl;
      fout << "   if (cls < 0 || cls > "<<GetNClasses()<<") {"<< std::endl;
      fout << "       if ("<<GetNClasses()<<" > 1 ) cls = "<<GetNClasses()<<";"<< std::endl;
      fout << "       else cls = "<<(fDecorrMatrices.size()==1?0:2)<<";"<< std::endl;
      fout << "   }"<< std::endl;

      VariableTransformBase::MakeFunction(fout, fcncName, 0, trCounter, 0 );

      fout << "   std::vector<double> tv;" << std::endl;
      fout << "   for (int i=0; i<"<<matx->GetNrows()<<";i++) {" << std::endl;
      fout << "      double v = 0;" << std::endl;
      fout << "      for (int j=0; j<"<<matx->GetNcols()<<"; j++)" << std::endl;
      fout << "         v += iv[indicesGet.at(j)] * fDecTF_"<<trCounter<<"[cls][i][j];" << std::endl;
      fout << "      tv.push_back(v);" << std::endl;
      fout << "   }" << std::endl;
      fout << "   for (int i=0; i<"<<matx->GetNrows()<<";i++) iv[indicesPut.at(i)] = tv[i];" << std::endl;
      fout << "}" << std::endl;
   }

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