ROL
ROL_ChebyshevSpectral.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// Rapid Optimization Library (ROL) Package
4//
5// Copyright 2014 NTESS and the ROL contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef ROL_CHEBYSHEVKUSUOKA_HPP
11#define ROL_CHEBYSHEVKUSUOKA_HPP
12
13#include "ROL_SpectralRisk.hpp"
14#include "ROL_GaussChebyshev1Quadrature.hpp"
15#include "ROL_GaussChebyshev2Quadrature.hpp"
16#include "ROL_GaussChebyshev3Quadrature.hpp"
17
60namespace ROL {
61
62template<class Real>
63class ChebyshevSpectral : public SpectralRisk<Real> {
64private:
65 ROL::Ptr<PlusFunction<Real> > plusFunction_;
66
68 int nQuad_;
69 int wType_;
70
71 std::vector<Real> wts_;
72 std::vector<Real> pts_;
73
74 void checkInputs(void) const {
75 ROL_TEST_FOR_EXCEPTION(lower_ > upper_, std::invalid_argument,
76 ">>> ERROR (ROL::ChebyshevSpectral): Lower bound exceeds upper!");
77 ROL_TEST_FOR_EXCEPTION(lower_ < static_cast<Real>(0), std::invalid_argument,
78 ">>> ERROR (ROL::ChebyshevSpectral): Lower bound is less than zero!");
79 ROL_TEST_FOR_EXCEPTION(static_cast<Real>(1) < upper_, std::invalid_argument,
80 ">>> ERROR (ROL::ChebyshevSpectral): Upper bound is greater than one!");
81 ROL_TEST_FOR_EXCEPTION((wType_ < 1 || wType_ > 3), std::invalid_argument,
82 ">>> ERROR (ROL::ChebyshevSpectral): Weight must be 1, 2 or 3!");
83 ROL_TEST_FOR_EXCEPTION(plusFunction_ == ROL::nullPtr, std::invalid_argument,
84 ">>> ERROR (ROL::ChebyshevSpectral): PlusFunction pointer is null!");
85 }
86
87 void initializeQuad(void) {
88 ROL::Ptr<Quadrature1D<Real> > quad;
89 if ( wType_ == 1 ) {
90 quad = ROL::makePtr<GaussChebyshev1Quadrature<Real>>(nQuad_);
91 }
92 else if ( wType_ == 2 ) {
93 quad = ROL::makePtr<GaussChebyshev2Quadrature<Real>>(nQuad_);
94 }
95 else if ( wType_ == 3 ) {
96 quad = ROL::makePtr<GaussChebyshev3Quadrature<Real>>(nQuad_);
97 }
98 // quad->test();
99 quad->get(pts_,wts_);
100 Real sum(0), half(0.5), one(1);
101 for (int i = 0; i < nQuad_; ++i) {
102 sum += wts_[i];
103 }
104 for (int i = 0; i < nQuad_; ++i) {
105 wts_[i] /= sum;
106 pts_[i] = lower_ + (upper_-lower_)*half*(pts_[i] + one);
107 }
109 }
110
111public:
124 ChebyshevSpectral( ROL::ParameterList &parlist )
125 : SpectralRisk<Real>() {
126 ROL::ParameterList &list
127 = parlist.sublist("SOL").sublist("Risk Measure").sublist("Chebyshev Spectral Risk");
128 // Grab confidence level and quadrature order
129 lower_ = list.get("Lower Bound",0.0);
130 upper_ = list.get("Upper Bound",1.0);
131 nQuad_ = list.get("Number of Quadrature Points",5);
132 wType_ = list.get("Weight Type",1);
133 plusFunction_ = ROL::makePtr<PlusFunction<Real>>(list);
134 // Check inputs
135 checkInputs();
137 }
138
147 ChebyshevSpectral(const Real lower, const Real upper,
148 const int nQuad, const int wType,
149 const ROL::Ptr<PlusFunction<Real> > &pf)
150 : SpectralRisk<Real>(), plusFunction_(pf),
151 lower_(lower), upper_(upper), nQuad_(nQuad), wType_(wType) {
152 // Check inputs
153 checkInputs();
155 }
156};
157
158}
159
160#endif
Provides an interface for the Chebyshev-Spectral risk measure.
ROL::Ptr< PlusFunction< Real > > plusFunction_
ChebyshevSpectral(const Real lower, const Real upper, const int nQuad, const int wType, const ROL::Ptr< PlusFunction< Real > > &pf)
Constructor.
ChebyshevSpectral(ROL::ParameterList &parlist)
Constructor.
Provides an interface for spectral risk measures.
void buildMixedQuantile(const std::vector< Real > &pts, const std::vector< Real > &wts, const ROL::Ptr< PlusFunction< Real > > &pf)