ROL
ROL_Laplace.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_LAPLACE_HPP
11#define ROL_LAPLACE_HPP
12
13#include "ROL_Distribution.hpp"
14#include "ROL_ParameterList.hpp"
15
16namespace ROL {
17
18template<class Real>
19class Laplace : public Distribution<Real> {
20private:
21 Real mean_;
22 Real scale_;
23
24 size_t compute_coeff(const size_t m, const size_t k) const {
25 if ( k == 0 || m == 0 || m == 1 ) {
26 return 1;
27 }
28 size_t val = 1;
29 for (size_t i = m-k; i < m; i++) {
30 val *= (i+1);
31 }
32 return val;
33 }
34
35public:
36 Laplace(const Real mean = 0., const Real scale = 1.)
37 : mean_(mean), scale_(scale) {}
38
39 Laplace(ROL::ParameterList &parlist) {
40 mean_ = parlist.sublist("SOL").sublist("Distribution").sublist("Laplace").get("Mean",0.);
41 scale_ = parlist.sublist("SOL").sublist("Distribution").sublist("Laplace").get("Scale",1.);
42 scale_ = (scale_ > 0.) ? scale_ : 1.;
43 }
44
45 Real evaluatePDF(const Real input) const {
46 return 0.5*std::exp(-std::abs(input-mean_)/scale_)/scale_;
47 }
48
49 Real evaluateCDF(const Real input) const {
50 return ((input < mean_) ? 0.5*std::exp((input-mean_)/scale_) :
51 1.-0.5*std::exp(-(input-mean_)/scale_));
52 }
53
54 Real integrateCDF(const Real input) const {
55 return ((input < mean_) ? 0.5*scale_*std::exp((input-mean_)/scale_) :
56 (input-mean_)+0.5*scale_*std::exp(-(input-mean_)/scale_));
57 }
58
59 Real invertCDF(const Real input) const {
60 Real sgn = ((input < 0.5) ? -1. : ((input > 0.5) ? 1. : 0.0));
61 return mean_ - scale_*sgn*std::log(1.-2.*std::abs(input-0.5));
62 }
63
64 Real moment(const size_t m) const {
65 if ( m == 1 ) {
66 return mean_;
67 }
68 if ( m == 2 ) {
69 return std::pow(mean_,2) + 2.*std::pow(scale_,2);
70 }
71 Real coeff = 0., val = 0.;
72 for (size_t k = 0; k < m+1; k++) {
73 if ( k%2 == 0 ) {
74 coeff = compute_coeff(m,k);
75 val += coeff*std::pow(scale_,k)*std::pow(mean_,m-k);
76 }
77 }
78 return val;
79 }
80
81 Real lowerBound(void) const {
82 return ROL_NINF<Real>();
83 }
84
85 Real upperBound(void) const {
86 return ROL_INF<Real>();
87 }
88
89 void test(std::ostream &outStream = std::cout ) const {
90 size_t size = 1;
91 std::vector<Real> X(size,4.*(Real)rand()/(Real)RAND_MAX - 2.);
92 std::vector<int> T(size,0);
93 Distribution<Real>::test(X,T,outStream);
94 }
95};
96
97}
98
99#endif
virtual void test(std::ostream &outStream=std::cout) const
Real moment(const size_t m) const
void test(std::ostream &outStream=std::cout) const
Real upperBound(void) const
Laplace(const Real mean=0., const Real scale=1.)
Real invertCDF(const Real input) const
Real integrateCDF(const Real input) const
Laplace(ROL::ParameterList &parlist)
size_t compute_coeff(const size_t m, const size_t k) const
Real evaluatePDF(const Real input) const
Real evaluateCDF(const Real input) const
Real lowerBound(void) const