44 #ifndef ROL_ABSOLUTEVALUE_HPP
45 #define ROL_ABSOLUTEVALUE_HPP
78 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
79 ">>> ERROR (ROL::AbsoluteValue): Absolute value approximation not defined!");
86 Real output = 0.0, e = 0.0;
90 if ( input < -e ) { region = -1; }
91 else if ( input > e ) { region = 1; }
93 if ( deriv == 0 ) { output = std::abs(input); }
94 else if ( deriv == 1 ) { output = (input < 0.0 ? -1.0 : 1.0); }
95 else if ( deriv == 2 ) {
96 if ( region == -1 ) { output = 0.0; }
97 else if ( region == 0 ) { output = e*std::exp( -1.0/(1.0 - std::pow(std::abs(input/e),2.0)) ); }
98 else if ( region == 1 ) { output = 0.0; }
105 if ( deriv == 0 ) { output = std::sqrt(input*input + 1.0/this->
param_); }
106 else if ( deriv == 1 ) { output = input/std::sqrt(input*input+1.0/this->
param_); }
107 else if ( deriv == 2 ) { output = (1.0/this->
param_)/std::pow(input*input+1.0/this->
param_,1.5); }
113 if ( deriv == 0 ) { output = input*input/std::sqrt(input*input + 1.0/this->
param_); }
114 else if ( deriv == 1 ) { output = (2.0/this->
param_*input+std::pow(input,3.0)) /
115 std::pow(input*input+1.0/this->
param_,1.5); }
116 else if ( deriv == 2 ) { output = ((2.0/this->
param_-input*input)/this->
param_) /
117 std::pow(input*input+1.0/this->
param_,2.5); }
122 Real output = 0.0, e = 1.0;
126 if ( input < -e ) { region = -1; }
127 else if ( input > e ) { region = 1; }
130 if ( std::abs(region) == 1 ) { output = std::abs(input); }
131 else if ( region == 0 ) { output = 1.875*std::pow(input*e,2.0) -
132 1.25 *std::pow(input*e,4.0) +
133 0.375*std::pow(input*e,6.0); }
135 else if ( deriv == 1 ) {
136 if ( std::abs(region) == 1 ) { output = (input < 0.0 ? -1.0 : 1.0); }
137 else if ( region == 0 ) { output = e*2.0*1.875*input*e -
138 e*4.0*1.25 *std::pow(input*e,3.0) +
139 e*6.0*0.375*std::pow(input*e,5.0); }
141 else if ( deriv == 2 ) {
142 if ( std::abs(region) == 1 ) { output = 0.0; }
143 else if ( region == 0 ) { output = e* 2.0*1.875 -
144 e*e*12.0*1.25 *std::pow(input*e,2.0) +
145 e*e*30.0*0.375*std::pow(input*e,4.0); }
Real sqrtd_absolute_value(Real input, int deriv)
Contains definitions of custom data types in ROL.
Real c2_absolute_value(Real input, int deriv)
Real sqrt_absolute_value(Real input, int deriv)
Real evaluate(Real input, int deriv)
Real true_absolute_value(Real input, int deriv)
AbsoluteValue(Real param=1.e2, EAbsoluteValue eav=ABSOLUTEVALUE_TRUE)
static const double ROL_EPSILON
Platform-dependent machine epsilon.