File: globalbootstrapvars.cpp

package info (click to toggle)
quantlib 1.40-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 41,768 kB
  • sloc: cpp: 398,987; makefile: 6,574; python: 214; sh: 150; lisp: 86
file content (49 lines) | stat: -rw-r--r-- 1,904 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */

#include <ql/termstructures/globalbootstrapvars.hpp>
#include <ql/utilities/null.hpp>
#include <ql/utilities/vectors.hpp>
#include <utility>

namespace QuantLib {

    SimpleQuoteVariables::SimpleQuoteVariables(std::vector<ext::shared_ptr<SimpleQuote>> quotes,
                                               std::vector<Real> initialGuesses,
                                               std::vector<Real> lowerBounds)
    : quotes_(std::move(quotes)), initialGuesses_(std::move(initialGuesses)),
      lowerBounds_(std::move(lowerBounds)) {
        QL_REQUIRE(initialGuesses_.size() <= quotes_.size(), "too many initialGuesses");
        QL_REQUIRE(lowerBounds_.size() <= quotes_.size(), "too many lowerBounds");
    }

    Array SimpleQuoteVariables::initialize(bool validData) {
        Array guesses(quotes_.size());
        for (Size i = 0, size = guesses.size(); i < size; ++i) {
            Real guess;
            if (validData) {
                guess = quotes_[i]->value();
            } else {
                guess = detail::get(initialGuesses_, i, 0.0);
                quotes_[i]->setValue(guess);
            }
            guesses[i] = transformInverse(guess, i);
        }
        return guesses;
    }

    void SimpleQuoteVariables::update(const Array& x) {
        for (Size i = 0, size = x.size(); i < size; ++i) {
            quotes_[i]->setValue(transformDirect(x[i], i));
        }
    }

    Real SimpleQuoteVariables::transformDirect(Real x, Size i) const {
        const Real lb = detail::get(lowerBounds_, i, Null<Real>());
        return lb == Null<Real>() ? x : std::exp(x) + lb;
    }

    Real SimpleQuoteVariables::transformInverse(Real x, Size i) const {
        const Real lb = detail::get(lowerBounds_, i, Null<Real>());
        return lb == Null<Real>() ? x : std::log(x - lb);
    }
}