Coverage Report

Created: 2026-01-25 06:59

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/quantlib/ql/math/randomnumbers/stochasticcollocationinvcdf.cpp
Line
Count
Source
1
/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
3
/*
4
5
 Copyright (C) 2016 Klaus Spanderen
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 stochasticcollationcdf.cpp
22
*/
23
24
#include <ql/math/integrals/gaussianquadratures.hpp>
25
#include <ql/math/randomnumbers/stochasticcollocationinvcdf.hpp>
26
#include <ql/mathconstants.hpp>
27
28
namespace QuantLib {
29
30
    namespace {
31
        Array g(Real sigma, const Array& x,
32
0
                const std::function<Real(Real)>& invCDF) {
33
34
0
            Array y(x.size());
35
0
            const CumulativeNormalDistribution normalCDF;
36
37
0
            for (Size i=0, n=x.size(); i < n; ++i) {
38
0
                y[i] = invCDF(normalCDF(x[i]/sigma));
39
0
            }
40
41
0
            return y;
42
0
        }
43
    }
44
45
    StochasticCollocationInvCDF::StochasticCollocationInvCDF(
46
        const std::function<Real(Real)>& invCDF,
47
        Size lagrangeOrder, Real pMax, Real pMin)
48
0
    : x_(M_SQRT2*GaussHermiteIntegration(lagrangeOrder).x()),
49
0
      sigma_( (pMax != Null<Real>())
50
0
              ? x_.back() / InverseCumulativeNormal()(pMax)
51
0
              : (pMin != Null<Real>())
52
0
                  ? Real(x_.front() / InverseCumulativeNormal()(pMin))
53
0
                  : 1.0),
54
0
      y_(g(sigma_, x_, invCDF)),
55
0
      interpl_(x_.begin(), x_.end(), y_.begin()) {
56
0
    }
57
58
0
    Real StochasticCollocationInvCDF::value(Real x) const {
59
0
        return interpl_(x*sigma_, true);
60
0
    }
61
0
    Real StochasticCollocationInvCDF::operator()(Real u) const {
62
0
        return value(InverseCumulativeNormal()(u));
63
0
    }
64
}