Coverage Report

Created: 2025-09-04 07:11

/src/quantlib/ql/experimental/math/multidimquadrature.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) 2014 Jose Aparicio
5
6
 This file is part of QuantLib, a free-software/open-source library
7
 for financial quantitative analysts and developers - http://quantlib.org/
8
9
 QuantLib is free software: you can redistribute it and/or modify it
10
 under the terms of the QuantLib license.  You should have received a
11
 copy of the license along with this program; if not, please email
12
 <quantlib-dev@lists.sf.net>. The license is also available online at
13
 <https://www.quantlib.org/license.shtml>.
14
15
 This program is distributed in the hope that it will be useful, but WITHOUT
16
 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17
 FOR A PARTICULAR PURPOSE.  See the license for more details.
18
*/
19
20
#ifndef quantlib_math_multidimquadrature_hpp
21
#define quantlib_math_multidimquadrature_hpp
22
23
#include <ql/qldefines.hpp>
24
25
/* Currently, this doesn't compile under Sun C++ (see
26
   https://github.com/lballabio/QuantLib/issues/223).  Until that's
27
   fixed, we disable it so that the rest of the library can be built.
28
*/
29
30
#ifndef QL_PATCH_SOLARIS
31
32
#include <ql/math/integrals/gaussianquadratures.hpp>
33
#include <ql/functional.hpp>
34
35
namespace QuantLib {
36
37
    /*! \brief Integrates a vector or scalar function of vector domain. 
38
        
39
        A template recursion along dimensions avoids calling depth 
40
        test or virtual functions.
41
42
        \todo Add coherence test between the integrand function dimensions (the
43
        vector size) and the declared dimension in the constructor.
44
45
        \todo Split into integrator classes for functions returning scalar and 
46
            vector?
47
    */
48
    class GaussianQuadMultidimIntegrator {
49
    private:
50
        // Vector integration. Quadrature to functions returning a vector of 
51
        // real numbers, turns 1D quadratures into ND
52
        class VectorIntegrator : public GaussHermiteIntegration {
53
        public:
54
            explicit VectorIntegrator(Size n, Real mu = 0.0) 
55
0
            : GaussHermiteIntegration(n, mu) {}
56
57
            template <class F> // todo: fix copies.
58
0
            std::vector<Real> operator()(const F& f) const {
59
                //first one, we do not know the size of the vector returned by f
60
0
                Integer i = order()-1;
61
0
                std::vector<Real> term = f(x_[i]);// potential copy! @#$%^!!!
62
0
                std::for_each(term.begin(), term.end(),
63
0
                              [&](Real x) -> Real { return x * w_[i]; });
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<2>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<2>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<3>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<3>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<4>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<4>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<5>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<5>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<6>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<6>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<7>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<7>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<8>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<8>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<9>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<9>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<10>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<10>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<11>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<11>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<12>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<12>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<13>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<13>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<14>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<14>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<15>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<15>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double)#1}::operator()(double) const
64
0
                std::vector<Real> sum = term;
65
           
66
0
                for (i--; i >= 0; --i) {
67
0
                    term = f(x_[i]);// potential copy! @#$%^!!!
68
                    // sum[j] += term[j] * w_[i];
69
0
                    std::transform(term.begin(), term.end(), sum.begin(), 
70
0
                                   sum.begin(),
71
0
                                   [&](Real x, Real y) -> Real { return w_[i]*x + y; });
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<2>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<2>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double, double)#1}::operator()(double, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<3>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<3>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double, double)#1}::operator()(double, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<4>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<4>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double, double)#1}::operator()(double, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<5>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<5>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double, double)#1}::operator()(double, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<6>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<6>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double, double)#1}::operator()(double, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<7>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<7>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double, double)#1}::operator()(double, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<8>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<8>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double, double)#1}::operator()(double, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<9>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<9>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double, double)#1}::operator()(double, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<10>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<10>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double, double)#1}::operator()(double, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<11>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<11>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double, double)#1}::operator()(double, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<12>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<12>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double, double)#1}::operator()(double, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<13>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<13>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double, double)#1}::operator()(double, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<14>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<14>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double, double)#1}::operator()(double, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<15>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<15>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const::{lambda(double, double)#1}::operator()(double, double) const
72
0
                }
73
0
                return sum;
74
0
            }
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::integrate<std::__1::vector<double, std::__1::allocator<double> > >(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::integrate<std::__1::vector<double, std::__1::allocator<double> > >(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&) const::{lambda(double)#1} const&) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<15>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<15>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<14>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<14>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<13>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<13>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<12>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<12>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<11>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<11>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<10>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<10>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<9>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<9>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<8>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<8>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<7>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<7>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<6>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<6>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<5>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<5>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<4>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<4>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<3>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<3>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::VectorIntegrator::operator()<QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<2>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}>(QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<2>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1} const&) const
75
        };
76
77
    public:
78
        /*!
79
            @param dimension The number of dimensions of the argument of the 
80
            function we want to integrate.
81
            @param quadOrder Quadrature order.
82
            @param mu Parameter in the Gauss Hermite weight (i.e. points load).
83
        */
84
        GaussianQuadMultidimIntegrator(Size dimension, Size quadOrder, 
85
            Real mu = 0.);
86
        //! Integration quadrature order.
87
0
        Size order() const {return integralV_.order();}
88
89
        //! Integrates function f over \f$ R^{dim} \f$
90
        /* This function is just syntax since the only thing it does is calling 
91
        to integrate<RetType> which has to exist for the type returned by the 
92
        function. So theres one redundant call but there should not be any extra 
93
        cost... up to the compiler. It can not be templated all the way since
94
        the integration entries functions can not be templates.
95
        Most times integrands will return a scalar or vector but could be a 
96
        matrix too.
97
         */
98
        template<class RetType_T>
99
        RetType_T operator()(const std::function<RetType_T (
100
            const std::vector<Real>& arg)>& f) const 
101
        {
102
            return integrate<RetType_T>(f);
103
        }
104
105
106
        //---------------------------------------------------------
107
        /* Boost fails on MSVC2008 to recognise the return type when 
108
        calling op()  , its not boost, its me.... FIX ME*/
109
110
        // Declare, spezializations follow.
111
        template<class RetType_T>
112
        RetType_T integrate(const std::function<RetType_T (
113
            const std::vector<Real>& v1)>& f) const;
114
115
    private:
116
        /* The maximum number of dimensions of the integration variable domain
117
            A higher than this number of dimension would presumably be 
118
           impractical and another integration algorithm (MC) should be 
119
           considered.
120
           \to do Consider moving it to a library configuration variable.
121
        */
122
        static const Size maxDimensions_ = 15;
123
124
        //! \name Integration entry points generation
125
        //@{
126
        //! Recursive template methods to statically generate (at this 
127
        //    class construction time) handles to the integration entry points
128
        template<Size levelSpawn>
129
0
        void spawnFcts() const {
130
0
            integrationEntries_[levelSpawn-1] =
131
0
                [&](const std::function<Real (const std::vector<Real>&)>& f, Real x){
132
0
                    return scalarIntegrator<levelSpawn>(f, x);
133
0
                };
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<15ul>() const::{lambda(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<14ul>() const::{lambda(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<13ul>() const::{lambda(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<12ul>() const::{lambda(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<11ul>() const::{lambda(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<10ul>() const::{lambda(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<9ul>() const::{lambda(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<8ul>() const::{lambda(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<7ul>() const::{lambda(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<6ul>() const::{lambda(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<5ul>() const::{lambda(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<4ul>() const::{lambda(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<3ul>() const::{lambda(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<2ul>() const::{lambda(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
134
0
            integrationEntriesVR_[levelSpawn-1] =
135
0
                [&](const std::function<std::vector<Real>(const std::vector<Real>&)>& f, Real x){
136
0
                    return vectorIntegratorVR<levelSpawn>(f, x);
137
0
                };
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<15ul>() const::{lambda(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<14ul>() const::{lambda(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<13ul>() const::{lambda(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<12ul>() const::{lambda(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<11ul>() const::{lambda(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<10ul>() const::{lambda(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<9ul>() const::{lambda(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<8ul>() const::{lambda(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<7ul>() const::{lambda(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<6ul>() const::{lambda(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<5ul>() const::{lambda(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<4ul>() const::{lambda(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<3ul>() const::{lambda(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<2ul>() const::{lambda(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double)#1}::operator()(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
138
0
            spawnFcts<levelSpawn-1>();
139
0
        }
Unexecuted instantiation: void QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<15ul>() const
Unexecuted instantiation: void QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<14ul>() const
Unexecuted instantiation: void QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<13ul>() const
Unexecuted instantiation: void QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<12ul>() const
Unexecuted instantiation: void QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<11ul>() const
Unexecuted instantiation: void QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<10ul>() const
Unexecuted instantiation: void QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<9ul>() const
Unexecuted instantiation: void QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<8ul>() const
Unexecuted instantiation: void QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<7ul>() const
Unexecuted instantiation: void QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<6ul>() const
Unexecuted instantiation: void QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<5ul>() const
Unexecuted instantiation: void QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<4ul>() const
Unexecuted instantiation: void QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<3ul>() const
Unexecuted instantiation: void QuantLib::GaussianQuadMultidimIntegrator::spawnFcts<2ul>() const
140
        //@}
141
142
        //---------------------------------------------------------
143
144
        template <int intgDepth>
145
        Real scalarIntegrator(
146
            const std::function<Real (const std::vector<Real>& arg1)>& f,
147
            const Real mFctr) const 
148
0
        {
149
0
            varBuffer_[intgDepth-1] = mFctr;
150
0
            return integral_([&](Real x){ return scalarIntegrator<intgDepth-1>(f, x); });
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<15>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<14>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<13>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<12>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<11>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<10>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<9>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<8>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<7>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<6>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<5>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<4>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<3>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<2>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
151
0
        }
Unexecuted instantiation: double QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<15>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: double QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<14>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: double QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<13>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: double QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<12>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: double QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<11>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: double QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<10>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: double QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<9>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: double QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<8>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: double QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<7>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: double QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<6>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: double QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<5>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: double QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<4>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: double QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<3>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: double QuantLib::GaussianQuadMultidimIntegrator::scalarIntegrator<2>(std::__1::function<double (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
152
153
        template <int intgDepth>
154
        std::vector<Real> vectorIntegratorVR(
155
            const std::function<std::vector<Real>(const std::vector<Real>& arg1)>& f,
156
            const Real mFctr) const 
157
0
        {
158
0
            varBuffer_[intgDepth-1] = mFctr;
159
0
            return integralV_([&](Real x){ return vectorIntegratorVR<intgDepth-1>(f, x); });
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<15>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<14>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<13>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<12>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<11>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<10>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<9>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<8>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<7>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<6>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<5>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<4>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<3>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
Unexecuted instantiation: QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<2>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const::{lambda(double)#1}::operator()(double) const
160
0
        }
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<15>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<14>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<13>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<12>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<11>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<10>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<9>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<8>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<7>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<6>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<5>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<4>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<3>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
Unexecuted instantiation: std::__1::vector<double, std::__1::allocator<double> > QuantLib::GaussianQuadMultidimIntegrator::vectorIntegratorVR<2>(std::__1::function<std::__1::vector<double, std::__1::allocator<double> > (std::__1::vector<double, std::__1::allocator<double> > const&)> const&, double) const
161
162
        // Same object for all dimensions poses problems when using the 
163
        //   parallelized integrals version.
164
        //! The actual integrators.
165
        GaussHermiteIntegration integral_;
166
        VectorIntegrator integralV_;
167
168
        //! Buffer to allow acces to integrations. We do not know at which 
169
        //    level/dimension we are going to start integration
170
        // \todo Declare typedefs for traits
171
        mutable std::vector<
172
        std::function<Real (std::function<Real (
173
            const std::vector<Real>& varg2)> f1, 
174
            const Real r3)> > integrationEntries_;
175
        mutable std::vector<
176
        std::function<std::vector<Real> (const std::function<std::vector<Real>(
177
            const std::vector<Real>& vvarg2)>& vf1, 
178
            const Real vr3)> > integrationEntriesVR_;
179
180
        Size dimension_;
181
        // integration veriable buffer
182
        mutable std::vector<Real> varBuffer_;
183
    };
184
185
186
    // Template specializations ---------------------------------------------
187
188
    template<>
189
    inline Real GaussianQuadMultidimIntegrator::operator()(
190
        const std::function<Real (const std::vector<Real>& v1)>& f) const
191
0
    {
192
0
        // integration entry level is selected now
193
0
        return integral_([&](Real x){ return integrationEntries_[dimension_-1](std::cref(f), x); });
194
0
    }
195
196
    // Scalar integrand version (merge with vector case?)
197
    template<>
198
    inline Real GaussianQuadMultidimIntegrator::integrate<Real>(
199
        const std::function<Real (const std::vector<Real>& v1)>& f) const 
200
0
    {
201
0
        // integration variables
202
0
        // call vector quadrature integration with the function and start 
203
0
        // values, kicks in recursion over the dimensions of the integration
204
0
        // variable.
205
0
        return integral_([&](Real x){ return integrationEntries_[dimension_-1](std::cref(f), x); });
206
0
    }
207
208
    // Vector integrand version
209
    template<>
210
    inline std::vector<Real> GaussianQuadMultidimIntegrator::integrate<std::vector<Real>>(
211
        const std::function<std::vector<Real> (const std::vector<Real>& v1)>& f) const
212
0
    {
213
0
        return integralV_([&](Real x){ return integrationEntriesVR_[dimension_-1](std::cref(f), x); });
214
0
    } 
215
216
    //! Terminal integrand; scalar function version
217
    template<> 
218
    inline Real GaussianQuadMultidimIntegrator::scalarIntegrator<1>(
219
        const std::function<Real (const std::vector<Real>& arg1)>& f,
220
        const Real mFctr) const
221
0
    {
222
0
        varBuffer_[0] = mFctr;
223
0
        return f(varBuffer_);
224
0
    }
225
226
    //! Terminal integrand; vector function version
227
    template<>
228
    inline std::vector<Real>
229
        GaussianQuadMultidimIntegrator::vectorIntegratorVR<1>(
230
        const std::function<std::vector<Real> (const std::vector<Real>& arg1)>& f,
231
        const Real mFctr) const 
232
0
    {
233
0
        varBuffer_[0] = mFctr;
234
0
        return f(varBuffer_);
235
0
    }
236
237
    //! Terminal level:
238
    template<>
239
0
    inline void GaussianQuadMultidimIntegrator::spawnFcts<1>() const {
240
0
        integrationEntries_[0] = [&](const std::function<Real(const std::vector<Real>&)>& f,
241
0
                                     Real x) { return scalarIntegrator<1>(f, x); };
242
0
        integrationEntriesVR_[0] =
243
0
            [&](const std::function<std::vector<Real>(const std::vector<Real>&)>& f, Real x) {
244
0
                return vectorIntegratorVR<1>(f, x);
245
0
            };
246
0
    }
247
248
}
249
250
#endif
251
252
#endif