// @(#)root/tmva $Id$   
// Author: Andreas Hoecker, Joerg Stelzer, Fredrik Tegenfeldt, Helge Voss

/**********************************************************************************
 * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
 * Package: TMVA                                                                  *
 * Class  : Config                                                                *
 * Web    : http://tmva.sourceforge.net                                           *
 *                                                                                *
 * Description:                                                                   *
 *      Implementation                                                            *
 *                                                                                *
 * Authors (alphabetical):                                                        *
 *      Andreas Hoecker    <Andreas.Hocker@cern.ch>     - CERN, Switzerland       *
 *      Joerg Stelzer      <Joerg.Stelzer@cern.ch>      - CERN, Switzerland       *
 *      Fredrik Tegenfeldt <Fredrik.Tegenfeldt@cern.ch> - Iowa State U., USA      *
 *      Helge Voss         <Helge.Voss@cern.ch>         - MPI-K Heidelberg, GER   *
 *                                                                                *
 * Copyright (c) 2006:                                                            *
 *      CERN, Switzerland                                                         *
 *      Iowa State U., USA                                                        *
 *      MPI-K Heidelberg, Germany                                                 *
 *                                                                                *
 * Redistribution and use in source and binary forms, with or without             *
 * modification, are permitted according to the terms listed in LICENSE           *
 * (http://mva.sourceforge.net/license.txt)                                       *
 **********************************************************************************/

#include "TMVA/Config.h"
#include "TMVA/MsgLogger.h"

ClassImp(TMVA::Config)

#if __cplusplus > 199711L
std::atomic<TMVA::Config*> TMVA::Config::fgConfigPtr{ 0 };
#else
TMVA::Config* TMVA::Config::fgConfigPtr = 0;
#endif

TMVA::Config& TMVA::gConfig() { return TMVA::Config::Instance(); }

//_______________________________________________________________________
TMVA::Config::Config() :
   fUseColoredConsole    ( kTRUE  ),
   fSilent               ( kFALSE ),
   fWriteOptionsReference( kFALSE ),
   fDrawProgressBar      ( kTRUE ),
   fLogger               ( new MsgLogger("Config") )
{
   // constructor - set defaults
   
   // plotting
   fVariablePlotting.fTimesRMS = 8.0;
   fVariablePlotting.fNbins1D  = 40;
   fVariablePlotting.fNbins2D  = 300;
   fVariablePlotting.fMaxNumOfAllowedVariablesForScatterPlots = 20;
   
   fVariablePlotting.fNbinsMVAoutput   = 40;
   fVariablePlotting.fNbinsXOfROCCurve = 100;

   // IO names
   fIONames.fWeightFileDir           = "weights";
   fIONames.fWeightFileExtension     = "weights";
   fIONames.fOptionsReferenceFileDir = "optionInfo";
}

//_______________________________________________________________________
TMVA::Config::~Config()
{
   // destructor
   delete fLogger;
}

//_______________________________________________________________________
void TMVA::Config::DestroyInstance()
{
   // static function: destroy TMVA instance
#if __cplusplus > 199711L
  delete fgConfigPtr.exchange(0);
#else
   if (fgConfigPtr != 0) { delete fgConfigPtr; fgConfigPtr = 0;}
#endif
}

//_______________________________________________________________________
TMVA::Config& TMVA::Config::Instance()
{
   // static function: returns  TMVA instance
#if __cplusplus > 199711L
  if(!fgConfigPtr) {
    TMVA::Config* tmp = new Config();
    TMVA::Config* expected = 0;
    if(! fgConfigPtr.compare_exchange_strong(expected,tmp) ) {
      //another thread beat us to the switch
      delete tmp;
    }
  }
  return *fgConfigPtr;
#else
   return fgConfigPtr ? *fgConfigPtr :*(fgConfigPtr = new Config());
#endif
}

 Config.cxx:1
 Config.cxx:2
 Config.cxx:3
 Config.cxx:4
 Config.cxx:5
 Config.cxx:6
 Config.cxx:7
 Config.cxx:8
 Config.cxx:9
 Config.cxx:10
 Config.cxx:11
 Config.cxx:12
 Config.cxx:13
 Config.cxx:14
 Config.cxx:15
 Config.cxx:16
 Config.cxx:17
 Config.cxx:18
 Config.cxx:19
 Config.cxx:20
 Config.cxx:21
 Config.cxx:22
 Config.cxx:23
 Config.cxx:24
 Config.cxx:25
 Config.cxx:26
 Config.cxx:27
 Config.cxx:28
 Config.cxx:29
 Config.cxx:30
 Config.cxx:31
 Config.cxx:32
 Config.cxx:33
 Config.cxx:34
 Config.cxx:35
 Config.cxx:36
 Config.cxx:37
 Config.cxx:38
 Config.cxx:39
 Config.cxx:40
 Config.cxx:41
 Config.cxx:42
 Config.cxx:43
 Config.cxx:44
 Config.cxx:45
 Config.cxx:46
 Config.cxx:47
 Config.cxx:48
 Config.cxx:49
 Config.cxx:50
 Config.cxx:51
 Config.cxx:52
 Config.cxx:53
 Config.cxx:54
 Config.cxx:55
 Config.cxx:56
 Config.cxx:57
 Config.cxx:58
 Config.cxx:59
 Config.cxx:60
 Config.cxx:61
 Config.cxx:62
 Config.cxx:63
 Config.cxx:64
 Config.cxx:65
 Config.cxx:66
 Config.cxx:67
 Config.cxx:68
 Config.cxx:69
 Config.cxx:70
 Config.cxx:71
 Config.cxx:72
 Config.cxx:73
 Config.cxx:74
 Config.cxx:75
 Config.cxx:76
 Config.cxx:77
 Config.cxx:78
 Config.cxx:79
 Config.cxx:80
 Config.cxx:81
 Config.cxx:82
 Config.cxx:83
 Config.cxx:84
 Config.cxx:85
 Config.cxx:86
 Config.cxx:87
 Config.cxx:88
 Config.cxx:89
 Config.cxx:90
 Config.cxx:91
 Config.cxx:92
 Config.cxx:93
 Config.cxx:94
 Config.cxx:95
 Config.cxx:96
 Config.cxx:97
 Config.cxx:98
 Config.cxx:99
 Config.cxx:100
 Config.cxx:101
 Config.cxx:102
 Config.cxx:103