Coverage Report

Created: 2026-10-31 06:47

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/quantlib/ql/math/integrals/gaussianquadratures.hpp
Line
Count
Source
1
/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
3
/*
4
 Copyright (C) 2005 Klaus Spanderen
5
 Copyright (C) 2005 Gary Kennedy
6
7
 This file is part of QuantLib, a free-software/open-source library
8
 for financial quantitative analysts and developers - http://quantlib.org/
9
10
 QuantLib is free software: you can redistribute it and/or modify it
11
 under the terms of the QuantLib license.  You should have received a
12
 copy of the license along with this program; if not, please email
13
 <quantlib-dev@lists.sf.net>. The license is also available online at
14
 <https://www.quantlib.org/license.shtml>.
15
16
 This program is distributed in the hope that it will be useful, but WITHOUT
17
 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
18
 FOR A PARTICULAR PURPOSE.  See the license for more details.
19
*/
20
21
/*! \file gaussianquadratures.hpp
22
    \brief Integral of a 1-dimensional function using the Gauss quadratures
23
*/
24
25
#ifndef quantlib_gaussian_quadratures_hpp
26
#define quantlib_gaussian_quadratures_hpp
27
28
#include <ql/math/array.hpp>
29
#include <ql/math/integrals/integral.hpp>
30
#include <ql/math/integrals/gaussianorthogonalpolynomial.hpp>
31
32
namespace QuantLib {
33
    class GaussianOrthogonalPolynomial;
34
35
    //! Integral of a 1-dimensional function using the Gauss quadratures method
36
    /*! References:
37
        Gauss quadratures and orthogonal polynomials
38
39
        G.H. Gloub and J.H. Welsch: Calculation of Gauss quadrature rule.
40
        Math. Comput. 23 (1986), 221-230
41
42
        "Numerical Recipes in C", 2nd edition,
43
        Press, Teukolsky, Vetterling, Flannery,
44
45
        \test the correctness of the result is tested by checking it
46
              against known good values.
47
    */
48
    class GaussianQuadrature {
49
      public:
50
        GaussianQuadrature(Size n,
51
                           const GaussianOrthogonalPolynomial& p);
52
53
#if defined(__GNUC__) && (__GNUC__ >= 7)
54
#pragma GCC diagnostic push
55
#pragma GCC diagnostic ignored "-Wnoexcept-type"
56
#endif
57
58
        template <class F>
59
0
        Real operator()(const F& f) const {
60
0
            Real sum = 0.0;
61
0
            for (Integer i = Integer(order())-1; i >= 0; --i) {
62
0
                sum += w_[i] * f(x_[i]);
63
0
            }
64
0
            return sum;
65
0
        }
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::AnalyticContinuousGeometricAveragePriceAsianHestonEngine::DcfIntegrand>(QuantLib::AnalyticContinuousGeometricAveragePriceAsianHestonEngine::DcfIntegrand const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::AnalyticContinuousGeometricAveragePriceAsianHestonEngine::Integrand>(QuantLib::AnalyticContinuousGeometricAveragePriceAsianHestonEngine::Integrand const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::AnalyticDiscreteGeometricAveragePriceAsianHestonEngine::Integrand>(QuantLib::AnalyticDiscreteGeometricAveragePriceAsianHestonEngine::Integrand const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::LognormalCmsSpreadPricer::integrand_f>(QuantLib::LognormalCmsSpreadPricer::integrand_f const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::operator()<double>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::operator()<double>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&) const::{lambda(double)#1} const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::integrate<double>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::integrate<double>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&) const::{lambda(double)#1} const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::P12Integrand>(QuantLib::P12Integrand const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::P12HatIntegrand>(QuantLib::P12HatIntegrand const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<15>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<15>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<14>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<14>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<13>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<13>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<12>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<12>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<11>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<11>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<10>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<10>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<9>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<9>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<8>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<8>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<7>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<7>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<6>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<6>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<5>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<5>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<4>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<4>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<3>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<3>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<2>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<2>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<std::__1::function<double (double)> >(std::__1::function<double (double)> const&) const
Unexecuted instantiation: fourierintegration.cpp:double QuantLib::GaussianQuadrature::operator()<QuantLib::(anonymous namespace)::integrand1>(QuantLib::(anonymous namespace)::integrand1 const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::detail::GaussianQuadratureIntegrator<QuantLib::GaussLegendreIntegration>::integrate(std::__1::function<double (double)> const&, double, double) const::{lambda(double)#1}>(QuantLib::detail::GaussianQuadratureIntegrator<QuantLib::GaussLegendreIntegration>::integrate(std::__1::function<double (double)> const&, double, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::detail::GaussianQuadratureIntegrator<QuantLib::GaussChebyshevIntegration>::integrate(std::__1::function<double (double)> const&, double, double) const::{lambda(double)#1}>(QuantLib::detail::GaussianQuadratureIntegrator<QuantLib::GaussChebyshevIntegration>::integrate(std::__1::function<double (double)> const&, double, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::detail::GaussianQuadratureIntegrator<QuantLib::GaussChebyshev2ndIntegration>::integrate(std::__1::function<double (double)> const&, double, double) const::{lambda(double)#1}>(QuantLib::detail::GaussianQuadratureIntegrator<QuantLib::GaussChebyshev2ndIntegration>::integrate(std::__1::function<double (double)> const&, double, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: double QuantLib::GaussianQuadrature::operator()<QuantLib::FdmBatesOp::IntegroIntegrand>(QuantLib::FdmBatesOp::IntegroIntegrand const&) const
Unexecuted instantiation: hestonprocess.cpp:double QuantLib::GaussianQuadrature::operator()<QuantLib::(anonymous namespace)::cdf_nu_ds(QuantLib::HestonProcess const&, double, double, double, double, QuantLib::HestonProcess::Discretization)::$_1>(QuantLib::(anonymous namespace)::cdf_nu_ds(QuantLib::HestonProcess const&, double, double, double, double, QuantLib::HestonProcess::Discretization)::$_1 const&) const
Unexecuted instantiation: hestonprocess.cpp:double QuantLib::GaussianQuadrature::operator()<QuantLib::(anonymous namespace)::int_ph(QuantLib::HestonProcess const&, double, double, double, double, double, double)::$_0>(QuantLib::(anonymous namespace)::int_ph(QuantLib::HestonProcess const&, double, double, double, double, double, double)::$_0 const&) const
Unexecuted instantiation: defaultdensitystructure.cpp:double QuantLib::GaussianQuadrature::operator()<QuantLib::(anonymous namespace)::t_remapper<QuantLib::DefaultDensityStructure::survivalProbabilityImpl(double) const::$_0> >(QuantLib::(anonymous namespace)::t_remapper<QuantLib::DefaultDensityStructure::survivalProbabilityImpl(double) const::$_0> const&) const
Unexecuted instantiation: hazardratestructure.cpp:double QuantLib::GaussianQuadrature::operator()<QuantLib::(anonymous namespace)::remapper<QuantLib::HazardRateStructure::survivalProbabilityImpl(double) const::$_0> >(QuantLib::(anonymous namespace)::remapper<QuantLib::HazardRateStructure::survivalProbabilityImpl(double) const::$_0> const&) const
66
67
#if defined(__GNUC__) && (__GNUC__ >= 7)
68
#pragma GCC diagnostic pop
69
#endif
70
71
0
        Size order() const { return x_.size(); }
72
0
        const Array& weights() { return w_; }
73
0
        const Array& x()       { return x_; }
74
        
75
      protected:
76
        Array x_, w_;
77
    };
78
79
    class MultiDimGaussianIntegration {
80
      public:
81
        MultiDimGaussianIntegration(
82
            const std::vector<Size>& ns,
83
            const std::function<ext::shared_ptr<GaussianQuadrature>(Size)>& genQuad);
84
85
        Real operator()(const std::function<Real(Array)>& f) const;
86
87
0
        const Array& weights() const { return weights_; }
88
0
        const std::vector<Array>& x() const { return x_; }
89
90
      private:
91
        Array weights_;
92
        std::vector<Array> x_;
93
    };
94
95
96
    //! generalized Gauss-Laguerre integration
97
    /*! This class performs a 1-dimensional Gauss-Laguerre integration.
98
        \f[
99
        \int_{0}^{\inf} f(x) \mathrm{d}x
100
        \f]
101
        The weighting function is
102
        \f[
103
            w(x;s)=x^s \exp{-x}
104
        \f]
105
        and \f[ s > -1 \f]
106
    */
107
    class GaussLaguerreIntegration : public GaussianQuadrature {
108
      public:
109
        explicit GaussLaguerreIntegration(Size n, Real s = 0.0)
110
0
        : GaussianQuadrature(n, GaussLaguerrePolynomial(s)) {}
111
    };
112
113
    //! generalized Gauss-Hermite integration
114
    /*! This class performs a 1-dimensional Gauss-Hermite integration.
115
        \f[
116
        \int_{-\inf}^{\inf} f(x) \mathrm{d}x
117
        \f]
118
        The weighting function is
119
        \f[
120
            w(x;\mu)=|x|^{2\mu} \exp{-x*x}
121
        \f]
122
        and \f[ \mu > -0.5 \f]
123
    */
124
    class GaussHermiteIntegration : public GaussianQuadrature {
125
      public:
126
        explicit GaussHermiteIntegration(Size n, Real mu = 0.0)
127
0
        : GaussianQuadrature(n, GaussHermitePolynomial(mu)) {}
128
    };
129
130
    //! Gauss-Jacobi integration
131
    /*! This class performs a 1-dimensional Gauss-Jacobi integration.
132
        \f[
133
        \int_{-1}^{1} f(x) \mathrm{d}x
134
        \f]
135
        The weighting function is
136
        \f[
137
            w(x;\alpha,\beta)=(1-x)^\alpha (1+x)^\beta
138
        \f]
139
    */
140
    class GaussJacobiIntegration : public GaussianQuadrature {
141
      public:
142
        GaussJacobiIntegration(Size n, Real alpha, Real beta)
143
0
        : GaussianQuadrature(n, GaussJacobiPolynomial(alpha, beta)) {}
144
    };
145
146
    //! Gauss-Hyperbolic integration
147
    /*! This class performs a 1-dimensional Gauss-Hyperbolic integration.
148
        \f[
149
        \int_{-\inf}^{\inf} f(x) \mathrm{d}x
150
        \f]
151
        The weighting function is
152
        \f[
153
            w(x)=1/cosh(x)
154
        \f]
155
    */
156
    class GaussHyperbolicIntegration : public GaussianQuadrature {
157
      public:
158
        explicit GaussHyperbolicIntegration(Size n)
159
0
        : GaussianQuadrature(n, GaussHyperbolicPolynomial()) {}
160
    };
161
162
    //! Gauss-Legendre integration
163
    /*! This class performs a 1-dimensional Gauss-Legendre integration.
164
        \f[
165
        \int_{-1}^{1} f(x) \mathrm{d}x
166
        \f]
167
        The weighting function is
168
        \f[
169
            w(x)=1
170
        \f]
171
    */
172
    class GaussLegendreIntegration : public GaussianQuadrature {
173
      public:
174
        explicit GaussLegendreIntegration(Size n)
175
0
        : GaussianQuadrature(n, GaussJacobiPolynomial(0.0, 0.0)) {}
176
    };
177
178
    //! Gauss-Chebyshev integration
179
    /*! This class performs a 1-dimensional Gauss-Chebyshev integration.
180
        \f[
181
        \int_{-1}^{1} f(x) \mathrm{d}x
182
        \f]
183
        The weighting function is
184
        \f[
185
            w(x)=(1-x^2)^{-1/2}
186
        \f]
187
    */
188
    class GaussChebyshevIntegration : public GaussianQuadrature {
189
      public:
190
        explicit GaussChebyshevIntegration(Size n)
191
0
        : GaussianQuadrature(n, GaussJacobiPolynomial(-0.5, -0.5)) {}
192
    };
193
194
    //! Gauss-Chebyshev integration (second kind)
195
    /*! This class performs a 1-dimensional Gauss-Chebyshev integration.
196
        \f[
197
        \int_{-1}^{1} f(x) \mathrm{d}x
198
        \f]
199
        The weighting function is
200
        \f[
201
            w(x)=(1-x^2)^{1/2}
202
        \f]
203
    */
204
    class GaussChebyshev2ndIntegration : public GaussianQuadrature {
205
      public:
206
        explicit GaussChebyshev2ndIntegration(Size n)
207
0
      : GaussianQuadrature(n, GaussJacobiPolynomial(0.5, 0.5)) {}
208
    };
209
210
    //! Gauss-Gegenbauer integration
211
    /*! This class performs a 1-dimensional Gauss-Gegenbauer integration.
212
        \f[
213
        \int_{-1}^{1} f(x) \mathrm{d}x
214
        \f]
215
        The weighting function is
216
        \f[
217
            w(x)=(1-x^2)^{\lambda-1/2}
218
        \f]
219
    */
220
    class GaussGegenbauerIntegration : public GaussianQuadrature {
221
      public:
222
        GaussGegenbauerIntegration(Size n, Real lambda)
223
        : GaussianQuadrature(n, GaussJacobiPolynomial(lambda-0.5, lambda-0.5))
224
0
        {}
225
    };
226
227
228
    namespace detail {
229
        template <class Integration>
230
        class GaussianQuadratureIntegrator: public Integrator {
231
          public:
232
            explicit GaussianQuadratureIntegrator(Size n);
233
234
0
            ext::shared_ptr<Integration> getIntegration() const { return integration_; }
Unexecuted instantiation: QuantLib::detail::GaussianQuadratureIntegrator<QuantLib::GaussLegendreIntegration>::getIntegration() const
Unexecuted instantiation: QuantLib::detail::GaussianQuadratureIntegrator<QuantLib::GaussChebyshevIntegration>::getIntegration() const
Unexecuted instantiation: QuantLib::detail::GaussianQuadratureIntegrator<QuantLib::GaussChebyshev2ndIntegration>::getIntegration() const
235
236
          private:
237
            Real integrate(const std::function<Real (Real)>& f,
238
                                           Real a,
239
                                           Real b) const override;
240
241
            const ext::shared_ptr<Integration> integration_;
242
        };
243
    }
244
245
    typedef detail::GaussianQuadratureIntegrator<GaussLegendreIntegration>
246
        GaussLegendreIntegrator;
247
248
    typedef detail::GaussianQuadratureIntegrator<GaussChebyshevIntegration>
249
        GaussChebyshevIntegrator;
250
251
    typedef detail::GaussianQuadratureIntegrator<GaussChebyshev2ndIntegration>
252
        GaussChebyshev2ndIntegrator;
253
254
    //! tabulated Gauss-Legendre quadratures
255
    class TabulatedGaussLegendre {
256
      public:
257
1.30k
        explicit TabulatedGaussLegendre(Size n = 20) { order(n); }
258
        template <class F>
259
1.30k
        Real operator() (const F& f) const {
260
1.30k
            QL_ASSERT(w_ != nullptr, "Null weights");
261
1.30k
            QL_ASSERT(x_ != nullptr, "Null abscissas");
262
1.30k
            Size startIdx;
263
1.30k
            Real val;
264
265
1.30k
            const Size isOrderOdd = order_ & 1;
266
267
1.30k
            if (isOrderOdd) {
268
0
              QL_ASSERT((n_>0), "assume at least 1 point in quadrature");
269
0
              val = w_[0]*f(x_[0]);
270
0
              startIdx=1;
271
1.30k
            } else {
272
1.30k
              val = 0.0;
273
1.30k
              startIdx=0;
274
1.30k
            }
275
276
12.6k
            for (Size i=startIdx; i<n_; ++i) {
277
11.3k
                val += w_[i]*f( x_[i]);
278
11.3k
                val += w_[i]*f(-x_[i]);
279
11.3k
            }
280
1.30k
            return val;
281
1.30k
        }
bivariatenormaldistribution.cpp:double QuantLib::TabulatedGaussLegendre::operator()<QuantLib::(anonymous namespace)::eqn3>(QuantLib::(anonymous namespace)::eqn3 const&) const
Line
Count
Source
259
430
        Real operator() (const F& f) const {
260
430
            QL_ASSERT(w_ != nullptr, "Null weights");
261
430
            QL_ASSERT(x_ != nullptr, "Null abscissas");
262
430
            Size startIdx;
263
430
            Real val;
264
265
430
            const Size isOrderOdd = order_ & 1;
266
267
430
            if (isOrderOdd) {
268
0
              QL_ASSERT((n_>0), "assume at least 1 point in quadrature");
269
0
              val = w_[0]*f(x_[0]);
270
0
              startIdx=1;
271
430
            } else {
272
430
              val = 0.0;
273
430
              startIdx=0;
274
430
            }
275
276
3.05k
            for (Size i=startIdx; i<n_; ++i) {
277
2.62k
                val += w_[i]*f( x_[i]);
278
2.62k
                val += w_[i]*f(-x_[i]);
279
2.62k
            }
280
430
            return val;
281
430
        }
bivariatenormaldistribution.cpp:double QuantLib::TabulatedGaussLegendre::operator()<QuantLib::(anonymous namespace)::eqn6>(QuantLib::(anonymous namespace)::eqn6 const&) const
Line
Count
Source
259
870
        Real operator() (const F& f) const {
260
870
            QL_ASSERT(w_ != nullptr, "Null weights");
261
870
            QL_ASSERT(x_ != nullptr, "Null abscissas");
262
870
            Size startIdx;
263
870
            Real val;
264
265
870
            const Size isOrderOdd = order_ & 1;
266
267
870
            if (isOrderOdd) {
268
0
              QL_ASSERT((n_>0), "assume at least 1 point in quadrature");
269
0
              val = w_[0]*f(x_[0]);
270
0
              startIdx=1;
271
870
            } else {
272
870
              val = 0.0;
273
870
              startIdx=0;
274
870
            }
275
276
9.57k
            for (Size i=startIdx; i<n_; ++i) {
277
8.70k
                val += w_[i]*f( x_[i]);
278
8.70k
                val += w_[i]*f(-x_[i]);
279
8.70k
            }
280
870
            return val;
281
870
        }
282
283
        void order(Size);
284
0
        Size order() const { return order_; }
285
286
      private:
287
        Size order_;
288
289
        const Real* w_;
290
        const Real* x_;
291
        Size  n_;
292
293
        static const Real w6[3];
294
        static const Real x6[3];
295
        static const Size n6;
296
297
        static const Real w7[4];
298
        static const Real x7[4];
299
        static const Size n7;
300
301
        static const Real w12[6];
302
        static const Real x12[6];
303
        static const Size n12;
304
305
        static const Real w20[10];
306
        static const Real x20[10];
307
        static const Size n20;
308
    };
309
310
}
311
312
#endif