Coverage Report

Created: 2025-08-05 06:45

/src/quantlib/ql/math/integrals/gaussianquadratures.hpp
Line
Count
Source (jump to first uncovered line)
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
 <http://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()<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: double QuantLib::GaussianQuadrature::operator()<std::__1::function<double (double)> >(std::__1::function<double (double)> const&) const
Unexecuted instantiation: analytichestonengine.cpp:double QuantLib::GaussianQuadrature::operator()<QuantLib::(anonymous namespace)::integrand1>(QuantLib::(anonymous namespace)::integrand1 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)::$_0>(QuantLib::(anonymous namespace)::cdf_nu_ds(QuantLib::HestonProcess const&, double, double, double, double, QuantLib::HestonProcess::Discretization)::$_0 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
0
        explicit TabulatedGaussLegendre(Size n = 20) { order(n); }
258
        template <class F>
259
0
        Real operator() (const F& f) const {
260
0
            QL_ASSERT(w_ != nullptr, "Null weights");
261
0
            QL_ASSERT(x_ != nullptr, "Null abscissas");
262
0
            Size startIdx;
263
0
            Real val;
264
265
0
            const Size isOrderOdd = order_ & 1;
266
267
0
            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
0
            } else {
272
0
              val = 0.0;
273
0
              startIdx=0;
274
0
            }
275
276
0
            for (Size i=startIdx; i<n_; ++i) {
277
0
                val += w_[i]*f( x_[i]);
278
0
                val += w_[i]*f(-x_[i]);
279
0
            }
280
0
            return val;
281
0
        }
Unexecuted instantiation: bivariatenormaldistribution.cpp:double QuantLib::TabulatedGaussLegendre::operator()<QuantLib::(anonymous namespace)::eqn3>(QuantLib::(anonymous namespace)::eqn3 const&) const
Unexecuted instantiation: bivariatenormaldistribution.cpp:double QuantLib::TabulatedGaussLegendre::operator()<QuantLib::(anonymous namespace)::eqn6>(QuantLib::(anonymous namespace)::eqn6 const&) const
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