38 ClassImp(TMVA::TActivationTanh);
43 Double_t TMVA::TActivationTanh::fast_tanh(Double_t arg){
44 if (arg > 4.97)
return 1;
45 if (arg < -4.97)
return -1;
46 float arg2 = arg * arg;
47 float a = arg * (135135.0f + arg2 * (17325.0f + arg2 * (378.0f + arg2)));
48 float b = 135135.0f + arg2 * (62370.0f + arg2 * (3150.0f + arg2 * 28.0f));
55 Double_t TMVA::TActivationTanh::Eval(Double_t arg)
57 return fFAST ? fast_tanh(arg) : TMath::TanH(arg);
63 Double_t TMVA::TActivationTanh::EvalDerivative(Double_t arg)
65 Double_t tmp=Eval(arg);
73 TString TMVA::TActivationTanh::GetExpression()
75 TString expr =
"tanh(x)\t\t (1-tanh()^2)";
82 void TMVA::TActivationTanh::MakeFunction( std::ostream& fout,
const TString& fncName )
85 fout <<
"double " << fncName <<
"(double x) const {" << std::endl;
86 fout <<
" // fast hyperbolic tan approximation" << std::endl;
87 fout <<
" if (x > 4.97) return 1;" << std::endl;
88 fout <<
" if (x < -4.97) return -1;" << std::endl;
89 fout <<
" float x2 = x * x;" << std::endl;
90 fout <<
" float a = x * (135135.0f + x2 * (17325.0f + x2 * (378.0f + x2)));" << std::endl;
91 fout <<
" float b = 135135.0f + x2 * (62370.0f + x2 * (3150.0f + x2 * 28.0f));" << std::endl;
92 fout <<
" return a / b;" << std::endl;
93 fout <<
"}" << std::endl;
95 fout <<
"double " << fncName <<
"(double x) const {" << std::endl;
96 fout <<
" // hyperbolic tan" << std::endl;
97 fout <<
" return tanh(x);" << std::endl;
98 fout <<
"}" << std::endl;