// reverse
//JAVA TO C# CONVERTER WARNING: 'final' parameters are not available in .NET:
//ORIGINAL LINE: protected void assertReverseRoundTrip(final ParameterLimitsTransform transform, final double fitParam)
        protected internal virtual void assertReverseRoundTrip(ParameterLimitsTransform transform, double fitParam)
        {
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double mp = transform.inverseTransform(fitParam);
            double mp = transform.inverseTransform(fitParam);
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double fp = transform.transform(mp);
            double fp = transform.transform(mp);

            assertEquals(fitParam, fp, 1e-8);
        }
//JAVA TO C# CONVERTER WARNING: 'final' parameters are not available in .NET:
//ORIGINAL LINE: protected void assertGradientRoundTrip(final ParameterLimitsTransform transform, final double modelParam)
        protected internal virtual void assertGradientRoundTrip(ParameterLimitsTransform transform, double modelParam)
        {
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double g = transform.transformGradient(modelParam);
            double g = transform.transformGradient(modelParam);
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double fp = transform.transform(modelParam);
            double fp = transform.transform(modelParam);
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double gInv = transform.inverseTransformGradient(fp);
            double gInv = transform.inverseTransformGradient(fp);

            assertEquals(g, 1.0 / gInv, 1e-8);
        }
//JAVA TO C# CONVERTER WARNING: 'final' parameters are not available in .NET:
//ORIGINAL LINE: protected void assertGradient(final ParameterLimitsTransform transform, final double modelParam)
        protected internal virtual void assertGradient(ParameterLimitsTransform transform, double modelParam)
        {
            const double eps = 1e-5;
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double g = transform.transformGradient(modelParam);
            double g = transform.transformGradient(modelParam);
            double fdg;

            try
            {
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double down = transform.transform(modelParam - eps);
                double down = transform.transform(modelParam - eps);
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double up = transform.transform(modelParam + eps);
                double up = transform.transform(modelParam + eps);
                fdg = (up - down) / 2 / eps;
            }
//JAVA TO C# CONVERTER WARNING: 'final' catch parameters are not available in C#:
//ORIGINAL LINE: catch (final IllegalArgumentException e)
            catch (legalArgumentException)
            {
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double fp = transform.transform(modelParam);
                double fp = transform.transform(modelParam);
                try
                {
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double up = transform.transform(modelParam + eps);
                    double up = transform.transform(modelParam + eps);
                    fdg = (up - fp) / eps;
                }
//JAVA TO C# CONVERTER WARNING: 'final' catch parameters are not available in C#:
//ORIGINAL LINE: catch (final IllegalArgumentException e2)
                catch (legalArgumentException)
                {
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double down = transform.transform(modelParam - eps);
                    double down = transform.transform(modelParam - eps);
                    fdg = (fp - down) / eps;
                }
            }
            assertEquals(g, fdg, 1e-6);
        }
//JAVA TO C# CONVERTER WARNING: 'final' parameters are not available in .NET:
//ORIGINAL LINE: protected void assertInverseGradient(final ParameterLimitsTransform transform, final double fitParam)
        protected internal virtual void assertInverseGradient(ParameterLimitsTransform transform, double fitParam)
        {
            const double eps = 1e-5;
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double g = transform.inverseTransformGradient(fitParam);
            double g = transform.inverseTransformGradient(fitParam);
            double fdg;

//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double down = transform.inverseTransform(fitParam - eps);
            double down = transform.inverseTransform(fitParam - eps);
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final double up = transform.inverseTransform(fitParam + eps);
            double up = transform.inverseTransform(fitParam + eps);

            fdg = (up - down) / 2 / eps;

            assertEquals(g, fdg, 1e-6);
        }
        public virtual void test_createFullTransform()
        {
            SabrIborCapletFloorletVolatilityCalibrationDefinition fixedBeta = SabrIborCapletFloorletVolatilityCalibrationDefinition.ofFixedBeta(NAME, USD_LIBOR_3M, ACT_365F, BETA_RHO, ALPHA_KNOTS, BETA_RHO_KNOTS, NU_KNOTS, DOUBLE_QUADRATIC, FLAT, LINEAR, HAGAN);
            SabrIborCapletFloorletVolatilityCalibrationDefinition fixedRho  = SabrIborCapletFloorletVolatilityCalibrationDefinition.ofFixedRho(NAME, USD_LIBOR_3M, ACT_365F, BETA_RHO, ALPHA_KNOTS, BETA_RHO_KNOTS, NU_KNOTS, DOUBLE_QUADRATIC, FLAT, LINEAR, HAGAN);

            ParameterLimitsTransform[] transf = new ParameterLimitsTransform[]
            {
                new SingleRangeLimitTransform(0.0, ParameterLimitsTransform_LimitType.GREATER_THAN),
                new DoubleRangeLimitTransform(0.0, 1.0),
                new DoubleRangeLimitTransform(-0.99, 0.99),
                new DoubleRangeLimitTransform(0.001d, 2.50d)
            };
            ParameterLimitsTransform[] computedFixedBeta = fixedBeta.createFullTransform(transf);
            ParameterLimitsTransform[] computedFixedRho  = fixedRho.createFullTransform(transf);
            ParameterLimitsTransform[] expectedFixedBeta = new ParameterLimitsTransform[] { transf[0], transf[0], transf[0], transf[0], transf[0], transf[0], transf[2], transf[2], transf[2], transf[3], transf[3], transf[3], transf[3], transf[3], transf[3] };
            ParameterLimitsTransform[] expectedFixedRho  = new ParameterLimitsTransform[] { transf[0], transf[0], transf[0], transf[0], transf[0], transf[0], transf[1], transf[1], transf[1], transf[3], transf[3], transf[3], transf[3], transf[3], transf[3] };
            assertEquals(computedFixedBeta, expectedFixedBeta);
            assertEquals(computedFixedRho, expectedFixedRho);
        }