private CrossGammaParameterSensitivity computeGammaForCurve(CurveName curveName, Curve curve, Currency sensitivityCurrency, System.Func <Curve, ImmutableLegalEntityDiscountingProvider> ratesProviderFn, System.Func <ImmutableLegalEntityDiscountingProvider, CurrencyParameterSensitivities> sensitivitiesFn)
        {
            System.Func <DoubleArray, DoubleArray> function = (DoubleArray t) =>
            {
                Curve newCurve = curve.withPerturbation((i, v, m) => t.get(i));
                ImmutableLegalEntityDiscountingProvider newRates   = ratesProviderFn(newCurve);
                CurrencyParameterSensitivities          sensiMulti = sensitivitiesFn(newRates);
                return(sensiMulti.getSensitivity(curveName, sensitivityCurrency).Sensitivity);
            };
            int          nParams = curve.ParameterCount;
            DoubleMatrix sensi   = fd.differentiate(function).apply(DoubleArray.of(nParams, n => curve.getParameter(n)));
            IList <ParameterMetadata> metadata = IntStream.range(0, nParams).mapToObj(i => curve.getParameterMetadata(i)).collect(toImmutableList());

            return(CrossGammaParameterSensitivity.of(curveName, metadata, sensitivityCurrency, sensi));
        }
        // computes the sensitivity of baseDeltaSingle to Curve
        internal CrossGammaParameterSensitivity computeGammaForCurve(CurrencyParameterSensitivity baseDeltaSingle, Curve curve, System.Func <Curve, ImmutableRatesProvider> ratesProviderFn, System.Func <ImmutableRatesProvider, CurrencyParameterSensitivities> sensitivitiesFn)
        {
            System.Func <DoubleArray, DoubleArray> function = (DoubleArray t) =>
            {
                Curve newCurve = replaceParameters(curve, t);
                ImmutableRatesProvider         newRates   = ratesProviderFn(newCurve);
                CurrencyParameterSensitivities sensiMulti = sensitivitiesFn(newRates);
                return(sensiMulti.getSensitivity(baseDeltaSingle.MarketDataName, baseDeltaSingle.Currency).Sensitivity);
            };
            int          nParams = curve.ParameterCount;
            DoubleMatrix sensi   = fd.differentiate(function).apply(DoubleArray.of(nParams, n => curve.getParameter(n)));
            IList <ParameterMetadata> metadata = IntStream.range(0, nParams).mapToObj(i => curve.getParameterMetadata(i)).collect(toImmutableList());

            return(CrossGammaParameterSensitivity.of(baseDeltaSingle.MarketDataName, baseDeltaSingle.ParameterMetadata, curve.Name, metadata, baseDeltaSingle.Currency, sensi));
        }
        private CrossGammaParameterSensitivity combineSensitivities(CurrencyParameterSensitivity baseDeltaSingle, CrossGammaParameterSensitivities blockCrossGamma)
        {
            double[][] valuesTotal = new double[baseDeltaSingle.ParameterCount][];
//JAVA TO C# CONVERTER WARNING: Java wildcard generics have no direct equivalent in .NET:
//ORIGINAL LINE: java.util.List<com.opengamma.strata.collect.tuple.Pair<com.opengamma.strata.data.MarketDataName<?>, java.util.List<? extends com.opengamma.strata.market.param.ParameterMetadata>>> order = new java.util.ArrayList<>();
            IList <Pair <MarketDataName <object>, IList <ParameterMetadata> > > order = new List <Pair <MarketDataName <object>, IList <ParameterMetadata> > >();

            for (int i = 0; i < baseDeltaSingle.ParameterCount; ++i)
            {
                List <double> innerList = new List <double>();
                foreach (CrossGammaParameterSensitivity gammaSingle in blockCrossGamma.Sensitivities)
                {
                    innerList.AddRange(gammaSingle.Sensitivity.row(i).toList());
                    if (i == 0)
                    {
                        order.Add(gammaSingle.Order.get(0));
                    }
                }
                valuesTotal[i] = Doubles.toArray(innerList);
            }
            return(CrossGammaParameterSensitivity.of(baseDeltaSingle.MarketDataName, baseDeltaSingle.ParameterMetadata, order, baseDeltaSingle.Currency, DoubleMatrix.ofUnsafe(valuesTotal)));
        }