/src/quantlib/ql/termstructures/globalbootstrapvars.cpp
Line | Count | Source |
1 | | /* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
2 | | |
3 | | #include <ql/termstructures/globalbootstrapvars.hpp> |
4 | | #include <ql/utilities/null.hpp> |
5 | | #include <ql/utilities/vectors.hpp> |
6 | | #include <utility> |
7 | | |
8 | | namespace QuantLib { |
9 | | |
10 | | SimpleQuoteVariables::SimpleQuoteVariables(std::vector<ext::shared_ptr<SimpleQuote>> quotes, |
11 | | std::vector<Real> initialGuesses, |
12 | | std::vector<Real> lowerBounds) |
13 | 0 | : quotes_(std::move(quotes)), initialGuesses_(std::move(initialGuesses)), |
14 | 0 | lowerBounds_(std::move(lowerBounds)) { |
15 | 0 | QL_REQUIRE(initialGuesses_.size() <= quotes_.size(), "too many initialGuesses"); |
16 | 0 | QL_REQUIRE(lowerBounds_.size() <= quotes_.size(), "too many lowerBounds"); |
17 | 0 | } |
18 | | |
19 | 0 | Array SimpleQuoteVariables::initialize(bool validData) { |
20 | 0 | Array guesses(quotes_.size()); |
21 | 0 | for (Size i = 0, size = guesses.size(); i < size; ++i) { |
22 | 0 | Real guess; |
23 | 0 | if (validData) { |
24 | 0 | guess = quotes_[i]->value(); |
25 | 0 | } else { |
26 | 0 | guess = detail::get(initialGuesses_, i, 0.0); |
27 | 0 | quotes_[i]->setValue(guess); |
28 | 0 | } |
29 | 0 | guesses[i] = transformInverse(guess, i); |
30 | 0 | } |
31 | 0 | return guesses; |
32 | 0 | } |
33 | | |
34 | 0 | void SimpleQuoteVariables::update(const Array& x) { |
35 | 0 | for (Size i = 0, size = x.size(); i < size; ++i) { |
36 | 0 | quotes_[i]->setValue(transformDirect(x[i], i)); |
37 | 0 | } |
38 | 0 | } |
39 | | |
40 | 0 | Real SimpleQuoteVariables::transformDirect(Real x, Size i) const { |
41 | 0 | const Real lb = detail::get(lowerBounds_, i, Null<Real>()); |
42 | 0 | return lb == Null<Real>() ? x : std::exp(x) + lb; |
43 | 0 | } |
44 | | |
45 | 0 | Real SimpleQuoteVariables::transformInverse(Real x, Size i) const { |
46 | 0 | const Real lb = detail::get(lowerBounds_, i, Null<Real>()); |
47 | 0 | return lb == Null<Real>() ? x : std::log(x - lb); |
48 | 0 | } |
49 | | } |