From 2560d5d13491aaf63b9673fc58db81724e404c87 Mon Sep 17 00:00:00 2001 From: Luigi Ballabio Date: Wed, 17 Feb 2021 11:55:53 +0100 Subject: [PATCH] Last lambdas. --- .../meshers/exponentialjump1dmesher.cpp | 13 ++----------- .../utilities/cevrndcalculator.cpp | 7 +------ .../utilities/gbsmrndcalculator.cpp | 7 +------ .../utilities/hestonrndcalculator.cpp | 15 ++++++--------- .../utilities/localvolrndcalculator.cpp | 8 +++----- .../utilities/riskneutraldensitycalculator.cpp | 14 ++++---------- 6 files changed, 17 insertions(+), 47 deletions(-) diff --git a/ql/methods/finitedifferences/meshers/exponentialjump1dmesher.cpp b/ql/methods/finitedifferences/meshers/exponentialjump1dmesher.cpp index ba3f3415f7c..c5d4ec6ec23 100644 --- a/ql/methods/finitedifferences/meshers/exponentialjump1dmesher.cpp +++ b/ql/methods/finitedifferences/meshers/exponentialjump1dmesher.cpp @@ -26,7 +26,6 @@ #include #include #include -#include namespace QuantLib { ExponentialJump1dMesher::ExponentialJump1dMesher( @@ -75,19 +74,14 @@ namespace QuantLib { } Real ExponentialJump1dMesher::jumpSizeDistribution(Real x, Time t) const { - using namespace ext::placeholders; const Real xmin = std::min(x, 1.0e-100); - // the typedef is needed to disambiguate the overloaded method - typedef Real (ExponentialJump1dMesher::*M)(Real, Time) const; return GaussLobattoIntegral(1000000, 1e-12)( - ext::bind(M(&ExponentialJump1dMesher::jumpSizeDensity), - this, _1, t), + [&](Real _x){ return jumpSizeDensity(_x, t); }, xmin, std::max(x, xmin)); } Real ExponentialJump1dMesher::jumpSizeDistribution(Real x) const { - using namespace ext::placeholders; const Real a = jumpIntensity_/beta_; const Real xmin = std::min(x, QL_EPSILON); const Real gammaValue @@ -96,11 +90,8 @@ namespace QuantLib { const Real lowerEps = (std::pow(xmin, a)/a - std::pow(xmin, a+1)/(a+1))/gammaValue; - // the typedef is needed to disambiguate the overloaded method - typedef Real (ExponentialJump1dMesher::*M)(Real) const; return lowerEps + GaussLobattoIntegral(10000, 1e-12)( - ext::bind(M(&ExponentialJump1dMesher::jumpSizeDensity), - this, _1), + [&](Real _x){ return jumpSizeDensity(_x); }, xmin/eta_, std::max(x, xmin/eta_)); } } diff --git a/ql/methods/finitedifferences/utilities/cevrndcalculator.cpp b/ql/methods/finitedifferences/utilities/cevrndcalculator.cpp index a8d2fca2dc5..a36078d8dcd 100644 --- a/ql/methods/finitedifferences/utilities/cevrndcalculator.cpp +++ b/ql/methods/finitedifferences/utilities/cevrndcalculator.cpp @@ -20,7 +20,6 @@ /*! \file cevrndcalculator.cpp */ #include -#include #include #include #include @@ -102,17 +101,13 @@ namespace QuantLib { } Real CEVRNDCalculator::invcdf(Real q, Time t) const { - using namespace ext::placeholders; - if (delta_ < 2.0) { if (f0_ < QL_EPSILON || q < massAtZero(t)) return 0.0; const Real x = InverseCumulativeNormal()(1-q); - const ext::function cdfApprox - = ext::bind(&CEVRNDCalculator::sankaranApprox, - this, _1, t, x); + auto cdfApprox = [&](Real _c){ return sankaranApprox(_c, t, x); }; const Real y0 = X(f0_)/t; diff --git a/ql/methods/finitedifferences/utilities/gbsmrndcalculator.cpp b/ql/methods/finitedifferences/utilities/gbsmrndcalculator.cpp index c1dde10de4a..e5fac278924 100644 --- a/ql/methods/finitedifferences/utilities/gbsmrndcalculator.cpp +++ b/ql/methods/finitedifferences/utilities/gbsmrndcalculator.cpp @@ -22,7 +22,6 @@ Black-Scholes-Merton model with skew dependent volatility */ -#include #include #include #include @@ -74,8 +73,6 @@ namespace QuantLib { } Real GBSMRNDCalculator::invcdf(Real q, Time t) const { - using namespace ext::placeholders; - const Real fwd = process_->x0() / process_->riskFreeRate()->discount(t, true) * process_->dividendYield()->discount(t, true); @@ -100,9 +97,7 @@ namespace QuantLib { << cdf(lower, t) << ", " << cdf(upper, t) << ")"); return Brent().solve( - compose(subtract(q), - ext::function( - ext::bind(&GBSMRNDCalculator::cdf, this, _1, t))), + [&](Real _k){ return cdf(_k, t) - q; }, 1e-10, 0.5*(lower+upper), lower, upper); } } diff --git a/ql/methods/finitedifferences/utilities/hestonrndcalculator.cpp b/ql/methods/finitedifferences/utilities/hestonrndcalculator.cpp index 9466a87e52d..35a72a4ca7b 100644 --- a/ql/methods/finitedifferences/utilities/hestonrndcalculator.cpp +++ b/ql/methods/finitedifferences/utilities/hestonrndcalculator.cpp @@ -18,7 +18,6 @@ FOR A PARTICULAR PURPOSE. See the license for more details. */ -#include #include #include #include @@ -101,7 +100,7 @@ namespace { /(1.0-gamma)))); } - const HestonParams& p_; + const HestonParams p_; const Time t_; const Real x_, c_inf_; }; @@ -127,17 +126,15 @@ namespace { CpxPv_Helper(getHestonParams(hestonProcess_), x_t(x, t), t), 0.0, 1.0)/M_TWOPI; } - + Real HestonRNDCalculator::cdf(Real x, Time t) const { - using namespace ext::placeholders; + CpxPv_Helper helper(getHestonParams(hestonProcess_), x_t(x, t), t); - return GaussLobattoIntegral( - maxIntegrationIterations_, 0.1*integrationEps_)( - ext::bind(&CpxPv_Helper::p0, - CpxPv_Helper(getHestonParams(hestonProcess_), x_t(x,t),t),_1), + return GaussLobattoIntegral(maxIntegrationIterations_, 0.1*integrationEps_)( + [&](Real p_x){ return helper.p0(p_x); }, 0.0, 1.0)/M_TWOPI + 0.5; - } + Real HestonRNDCalculator::invcdf(Real p, Time t) const { const Real v0 = hestonProcess_->v0(); const Real kappa = hestonProcess_->kappa(); diff --git a/ql/methods/finitedifferences/utilities/localvolrndcalculator.cpp b/ql/methods/finitedifferences/utilities/localvolrndcalculator.cpp index e33fab65528..911a8434070 100644 --- a/ql/methods/finitedifferences/utilities/localvolrndcalculator.cpp +++ b/ql/methods/finitedifferences/utilities/localvolrndcalculator.cpp @@ -22,7 +22,6 @@ \brief local volatility risk neutral terminal density calculation */ -#include #include #include #include @@ -126,8 +125,6 @@ namespace QuantLib { } Real LocalVolRNDCalculator::cdf(Real x, Time t) const { - using namespace ext::placeholders; - calculate(); // get the left side of the integral @@ -146,14 +143,15 @@ namespace QuantLib { // left or right hand integral if (x > 0.5*(xr+xl)) { while (pdf(xr, t) > 0.01*localVolProbEps_) xr*=1.1; + return 1.0-GaussLobattoIntegral(maxIter_, 0.1*localVolProbEps_)( - ext::bind(&LocalVolRNDCalculator::pdf, this, _1, t), x, xr); + [&](Real _x){ return pdf(_x, t); }, x, xr); } else { while (pdf(xl, t) > 0.01*localVolProbEps_) xl*=0.9; return GaussLobattoIntegral(maxIter_, 0.1*localVolProbEps_)( - ext::bind(&LocalVolRNDCalculator::pdf, this, _1, t), xl, x); + [&](Real _x){ return pdf(_x, t); }, xl, x); } } diff --git a/ql/methods/finitedifferences/utilities/riskneutraldensitycalculator.cpp b/ql/methods/finitedifferences/utilities/riskneutraldensitycalculator.cpp index 0cdc3fc1aca..a292fa2e201 100644 --- a/ql/methods/finitedifferences/utilities/riskneutraldensitycalculator.cpp +++ b/ql/methods/finitedifferences/utilities/riskneutraldensitycalculator.cpp @@ -21,9 +21,9 @@ #include #include #include -#include namespace QuantLib { + RiskNeutralDensityCalculator::InvCDFHelper::InvCDFHelper( const RiskNeutralDensityCalculator* calculator, Real guess, Real accuracy, Size maxEvaluations, @@ -34,17 +34,11 @@ namespace QuantLib { maxEvaluations_(maxEvaluations), stepSize_(stepSize) { } - Real RiskNeutralDensityCalculator::InvCDFHelper::inverseCDF(Real p, Time t) - const { - using namespace ext::placeholders; - - const ext::function cdf - = ext::bind(&RiskNeutralDensityCalculator::cdf, - calculator_, _1, t); - + Real RiskNeutralDensityCalculator::InvCDFHelper::inverseCDF(Real p, Time t) const { Brent solver; solver.setMaxEvaluations(maxEvaluations_); - return solver.solve(compose(subtract(p), cdf), + return solver.solve([&](Real _x){ return calculator_->cdf(_x, t) - p; }, accuracy_, guess_, stepSize_); } + }