44 #ifndef ROL_LOGQUANTILEQUAD_HPP 45 #define ROL_LOGQUANTILEQUAD_HPP 56 Teuchos::RCP<PlusFunction<Real> >
pf_;
66 prob_ = ((prob >= 0.0) ? ((prob <= 1.0) ? prob : 0.5) : 0.5);
67 scale_ = ((scale >= 1.0) ? scale : 1.0);
68 eps_ = ((eps > 0.0) ? eps : 1.0);
72 Teuchos::ParameterList& list
73 = parlist.sublist(
"SOL").sublist(
"Risk Measure").sublist(
"Log-Quantile Quadrangle");
75 Real prob = list.get(
"Confidence Level",0.5);
76 prob_ = ((prob >= 0.0) ? ((prob <= 1.0) ? prob : 0.5) : 0.5);
77 Real scale = list.get(
"Growth Constant",1.0);
78 scale_ = ((scale >= 1.0) ? scale : 1.0);
81 Real eps = list.get(
"Smoothing Parameter",1.);
82 eps_ = ((eps > 0.) ? eps : 1.);
85 Real
error(Real x,
int deriv = 0) {
86 TEUCHOS_TEST_FOR_EXCEPTION( (deriv > 2), std::invalid_argument,
87 ">>> ERROR (ROL::LogQuantileQuadrangle::error): deriv greater than 2!");
88 TEUCHOS_TEST_FOR_EXCEPTION( (deriv < 0), std::invalid_argument,
89 ">>> ERROR (ROL::LogQuantileQuadrangle::error): deriv less than 0!");
91 Real X = ((deriv == 0) ? x : ((deriv == 1) ? 1.0 : 0.0));
92 return regret(x,deriv) - X;
96 TEUCHOS_TEST_FOR_EXCEPTION( (deriv > 2), std::invalid_argument,
97 ">>> ERROR (ROL::LogQuantileQuadrangle::regret): deriv greater than 2!");
98 TEUCHOS_TEST_FOR_EXCEPTION( (deriv < 0), std::invalid_argument,
99 ">>> ERROR (ROL::LogQuantileQuadrangle::regret): deriv less than 0!");
101 Real arg = std::exp(scale_*x);
102 Real sarg = scale_*arg;
103 Real reg = 1.0/(1.0-
prob_) * (pf_->evaluate(arg-1.0,deriv) *
104 ((deriv == 0) ? 1.0 : ((deriv == 1) ? sarg : sarg*sarg))
105 + ((deriv == 2) ? pf_->evaluate(arg-1.0,deriv-1)*scale_*sarg : 0.0));
113 Real vx = 0.0, vy = 0.0;
118 std::cout << std::right << std::setw(20) <<
"CHECK REGRET: v'(eps) is correct? \n";
119 std::cout << std::right << std::setw(20) <<
"t" 120 << std::setw(20) <<
"v'(x)" 121 << std::setw(20) <<
"(v(x+t)-v(x-t))/2t" 122 << std::setw(20) <<
"Error" 124 for (
int i = 0; i < 13; i++) {
127 diff = (vy-vx)/(2.0*t);
128 err = std::abs(diff-dv);
129 std::cout << std::scientific << std::setprecision(11) << std::right
130 << std::setw(20) << t
131 << std::setw(20) << dv
132 << std::setw(20) << diff
133 << std::setw(20) << err
145 std::cout << std::right << std::setw(20) <<
"CHECK REGRET: v''(eps) is correct? \n";
146 std::cout << std::right << std::setw(20) <<
"t" 147 << std::setw(20) <<
"v''(x)" 148 << std::setw(20) <<
"(v'(x+t)-v'(x-t))/2t" 149 << std::setw(20) <<
"Error" 151 for (
int i = 0; i < 13; i++) {
154 diff = (vy-vx)/(2.0*t);
155 err = std::abs(diff-dv);
156 std::cout << std::scientific << std::setprecision(11) << std::right
157 << std::setw(20) << t
158 << std::setw(20) << dv
159 << std::setw(20) << diff
160 << std::setw(20) << err
173 std::cout << std::right << std::setw(20) <<
"CHECK REGRET: v'(0) is correct? \n";
174 std::cout << std::right << std::setw(20) <<
"t" 175 << std::setw(20) <<
"v'(x)" 176 << std::setw(20) <<
"(v(x+t)-v(x-t))/2t" 177 << std::setw(20) <<
"Error" 179 for (
int i = 0; i < 13; i++) {
182 diff = (vy-vx)/(2.0*t);
183 err = std::abs(diff-dv);
184 std::cout << std::scientific << std::setprecision(11) << std::right
185 << std::setw(20) << t
186 << std::setw(20) << dv
187 << std::setw(20) << diff
188 << std::setw(20) << err
200 std::cout << std::right << std::setw(20) <<
"CHECK REGRET: v''(0) is correct? \n";
201 std::cout << std::right << std::setw(20) <<
"t" 202 << std::setw(20) <<
"v''(x)" 203 << std::setw(20) <<
"(v'(x+t)-v'(x-t))/2t" 204 << std::setw(20) <<
"Error" 206 for (
int i = 0; i < 13; i++) {
209 diff = (vy-vx)/(2.0*t);
210 err = std::abs(diff-dv);
211 std::cout << std::scientific << std::setprecision(11) << std::right
212 << std::setw(20) << t
213 << std::setw(20) << dv
214 << std::setw(20) << diff
215 << std::setw(20) << err
228 std::cout << std::right << std::setw(20) <<
"CHECK REGRET: v'(-eps) is correct? \n";
229 std::cout << std::right << std::setw(20) <<
"t" 230 << std::setw(20) <<
"v'(x)" 231 << std::setw(20) <<
"(v(x+t)-v(x-t))/2t" 232 << std::setw(20) <<
"Error" 234 for (
int i = 0; i < 13; i++) {
237 diff = (vy-vx)/(2.0*t);
238 err = std::abs(diff-dv);
239 std::cout << std::scientific << std::setprecision(11) << std::right
240 << std::setw(20) << t
241 << std::setw(20) << dv
242 << std::setw(20) << diff
243 << std::setw(20) << err
255 std::cout << std::right << std::setw(20) <<
"CHECK REGRET: v''(-eps) is correct? \n";
256 std::cout << std::right << std::setw(20) <<
"t" 257 << std::setw(20) <<
"v''(x)" 258 << std::setw(20) <<
"(v'(x+t)-v'(x-t))/2t" 259 << std::setw(20) <<
"Error" 261 for (
int i = 0; i < 13; i++) {
264 diff = (vy-vx)/(2.0*t);
265 err = std::abs(diff-dv);
266 std::cout << std::scientific << std::setprecision(11) << std::right
267 << std::setw(20) << t
268 << std::setw(20) << dv
269 << std::setw(20) << diff
270 << std::setw(20) << err
Real error(Real x, int deriv=0)
virtual void checkRegret(void)
Teuchos::RCP< PlusFunction< Real > > pf_
LogQuantileQuadrangle(Teuchos::ParameterList &parlist)
LogQuantileQuadrangle(Real prob, Real scale, Real eps, Teuchos::RCP< PlusFunction< Real > > &pf)
Real regret(Real x, int deriv=0)