//-------------------------------------------------------------------------
        public virtual void test_implied_volatility()
        {
            double forward     = PRICER_SWAP.parRate(RSWAP_REC, MULTI_USD);
            double volExpected = NORMAL_VOLS_USD_STD.volatility(SWAPTION_LONG_REC.Expiry, SWAP_TENOR_YEAR, STRIKE, forward);
            double volComputed = PRICER_SWAPTION_NORMAL.impliedVolatility(SWAPTION_LONG_PAY, MULTI_USD, NORMAL_VOLS_USD_STD);

            assertEquals(volComputed, volExpected, TOLERANCE_RATE);
        }
 public virtual void test_volatility()
 {
     for (int i = 0; i < NB_TEST; i++)
     {
         double expiryTime  = VOLS.relativeTime(TEST_OPTION_EXPIRY[i]);
         double volExpected = SURFACE.zValue(expiryTime, TEST_TENOR[i]);
         double volComputed = VOLS.volatility(TEST_OPTION_EXPIRY[i], TEST_TENOR[i], TEST_STRIKE, TEST_FORWARD);
         assertEquals(volComputed, volExpected, TOLERANCE_VOL);
     }
 }
        public virtual void test_volatility_sensitivity()
        {
            double eps   = 1.0e-6;
            int    nData = TIME.size();

            for (int i = 0; i < NB_TEST; i++)
            {
                double expiryTime = VOLS.relativeTime(TEST_OPTION_EXPIRY[i]);
                SwaptionSensitivity            point      = SwaptionSensitivity.of(VOLS.Name, expiryTime, TEST_TENOR[i], TEST_STRIKE, TEST_FORWARD, GBP, TEST_SENSITIVITY[i]);
                CurrencyParameterSensitivities sensActual = VOLS.parameterSensitivity(point);
                CurrencyParameterSensitivity   sensi      = sensActual.getSensitivity(SURFACE.Name, GBP);
                DoubleArray computed = sensi.Sensitivity;

                IDictionary <DoublesPair, double> map = new Dictionary <DoublesPair, double>();
                for (int j = 0; j < nData; ++j)
                {
                    DoubleArray volDataUp                        = VOL.subArray(0, nData).with(j, VOL.get(j) + eps);
                    DoubleArray volDataDw                        = VOL.subArray(0, nData).with(j, VOL.get(j) - eps);
                    InterpolatedNodalSurface paramUp             = InterpolatedNodalSurface.of(METADATA, TIME, TENOR, volDataUp, INTERPOLATOR_2D);
                    InterpolatedNodalSurface paramDw             = InterpolatedNodalSurface.of(METADATA, TIME, TENOR, volDataDw, INTERPOLATOR_2D);
                    NormalSwaptionExpiryTenorVolatilities provUp = NormalSwaptionExpiryTenorVolatilities.of(CONVENTION, VAL_DATE_TIME, paramUp);
                    NormalSwaptionExpiryTenorVolatilities provDw = NormalSwaptionExpiryTenorVolatilities.of(CONVENTION, VAL_DATE_TIME, paramDw);
                    double volUp = provUp.volatility(TEST_OPTION_EXPIRY[i], TEST_TENOR[i], TEST_STRIKE, TEST_FORWARD);
                    double volDw = provDw.volatility(TEST_OPTION_EXPIRY[i], TEST_TENOR[i], TEST_STRIKE, TEST_FORWARD);
                    double fd    = 0.5 * (volUp - volDw) / eps;
                    map[DoublesPair.of(TIME.get(j), TENOR.get(j))] = fd;
                }
                IList <ParameterMetadata> list = sensi.ParameterMetadata;
                assertEquals(computed.size(), nData);
                for (int j = 0; j < list.Count; ++j)
                {
                    SwaptionSurfaceExpiryTenorParameterMetadata metadata = (SwaptionSurfaceExpiryTenorParameterMetadata)list[i];
                    double expected = map[DoublesPair.of(metadata.YearFraction, metadata.Tenor)];
                    assertEquals(computed.get(i), expected, eps);
                }
            }
        }
        //-------------------------------------------------------------------------
        public virtual void test_presentValue()
        {
            CurrencyAmount        pvRecComputed = PRICER_SWAPTION.presentValue(SWAPTION_REC_LONG, RATE_PROVIDER, VOLS);
            CurrencyAmount        pvPayComputed = PRICER_SWAPTION.presentValue(SWAPTION_PAY_SHORT, RATE_PROVIDER, VOLS);
            double                forward       = PRICER_SWAP.parRate(RSWAP_REC, RATE_PROVIDER);
            double                annuityCash   = PRICER_SWAP.LegPricer.annuityCash(RSWAP_REC.getLegs(SwapLegType.FIXED).get(0), forward);
            double                volatility    = VOLS.volatility(SWAPTION_REC_LONG.Expiry, SWAP_TENOR_YEAR, STRIKE, forward);
            double                discount      = RATE_PROVIDER.discountFactor(USD, SETTLE_DATE);
            NormalFunctionData    normalData    = NormalFunctionData.of(forward, annuityCash * discount, volatility);
            double                expiry        = VOLS.relativeTime(SWAPTION_REC_LONG.Expiry);
            EuropeanVanillaOption optionRec     = EuropeanVanillaOption.of(STRIKE, expiry, PutCall.PUT);
            EuropeanVanillaOption optionPay     = EuropeanVanillaOption.of(STRIKE, expiry, PutCall.CALL);
            double                pvRecExpected = NORMAL.getPriceFunction(optionRec).apply(normalData);
            double                pvPayExpected = -NORMAL.getPriceFunction(optionPay).apply(normalData);

            assertEquals(pvRecComputed.Currency, USD);
            assertEquals(pvRecComputed.Amount, pvRecExpected, NOTIONAL * TOL);
            assertEquals(pvPayComputed.Currency, USD);
            assertEquals(pvPayComputed.Amount, pvPayExpected, NOTIONAL * TOL);
        }