Beispiel #1
0
        ///
        /// <param name="inherit">  the solver </param>
//JAVA TO C# CONVERTER WARNING: 'final' parameters are not available in .NET:
//ORIGINAL LINE: public NaturalSplineInterpolator(final CubicSplineSolver inherit)
        public NaturalSplineInterpolator(CubicSplineSolver inherit)
        {
            _solver = inherit;
        }
Beispiel #2
0
 /// <summary>
 /// Constructor.
 /// </summary>
 public NaturalSplineInterpolator()
 {
     _solver = new CubicSplineNaturalSolver();
 }
//JAVA TO C# CONVERTER WARNING: 'final' parameters are not available in .NET:
//ORIGINAL LINE: @Override public PiecewisePolynomialResultsWithSensitivity interpolateWithSensitivity(final double[] xValues, final double[] yValues)
        public override PiecewisePolynomialResultsWithSensitivity interpolateWithSensitivity(double[] xValues, double[] yValues)
        {
            ArgChecker.notNull(xValues, "xValues");
            ArgChecker.notNull(yValues, "yValues");

            ArgChecker.isTrue(xValues.Length == yValues.Length | xValues.Length + 2 == yValues.Length, "(xValues length = yValues length) or (xValues length + 2 = yValues length)");
            ArgChecker.isTrue(xValues.Length > 1, "Data points should be more than 1");

//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final int nDataPts = xValues.length;
            int nDataPts = xValues.Length;
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final int nYdata = yValues.length;
            int nYdata = yValues.Length;

            for (int i = 0; i < nDataPts; ++i)
            {
                ArgChecker.isFalse(double.IsNaN(xValues[i]), "xData containing NaN");
                ArgChecker.isFalse(double.IsInfinity(xValues[i]), "xData containing Infinity");
            }
            for (int i = 0; i < nYdata; ++i)
            {
                ArgChecker.isFalse(double.IsNaN(yValues[i]), "yData containing NaN");
                ArgChecker.isFalse(double.IsInfinity(yValues[i]), "yData containing Infinity");
            }

            for (int i = 0; i < nDataPts; ++i)
            {
                for (int j = i + 1; j < nDataPts; ++j)
                {
                    ArgChecker.isFalse(xValues[i] == xValues[j], "Data should be distinct");
                }
            }

            double[] yValuesSrt = new double[nDataPts];

            if (xValues.Length + 2 == yValues.Length)
            {
                _solver    = new CubicSplineClampedSolver(yValues[0], yValues[nDataPts + 1]);
                yValuesSrt = Arrays.copyOfRange(yValues, 1, nDataPts + 1);
            }
            else
            {
                _solver    = new CubicSplineNakSolver();
                yValuesSrt = Arrays.copyOf(yValues, nDataPts);
            }

//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final com.opengamma.strata.collect.array.DoubleMatrix[] resMatrix = _solver.solveWithSensitivity(xValues, yValuesSrt);
            DoubleMatrix[] resMatrix = _solver.solveWithSensitivity(xValues, yValuesSrt);
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final int len = resMatrix.length;
            int len = resMatrix.Length;

            for (int k = 0; k < len; k++)
            {
                DoubleMatrix m = resMatrix[k];
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final int rows = m.rowCount();
                int rows = m.rowCount();
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final int cols = m.columnCount();
                int cols = m.columnCount();
                for (int i = 0; i < rows; ++i)
                {
                    for (int j = 0; j < cols; ++j)
                    {
                        ArgChecker.isTrue(Doubles.isFinite(m.get(i, j)), "Matrix contains a NaN or infinite");
                    }
                }
            }

//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final com.opengamma.strata.collect.array.DoubleMatrix coefMatrix = resMatrix[0];
            DoubleMatrix coefMatrix = resMatrix[0];

//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final com.opengamma.strata.collect.array.DoubleMatrix[] coefSenseMatrix = new com.opengamma.strata.collect.array.DoubleMatrix[len - 1];
            DoubleMatrix[] coefSenseMatrix = new DoubleMatrix[len - 1];
            Array.Copy(resMatrix, 1, coefSenseMatrix, 0, len - 1);
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final int nCoefs = coefMatrix.columnCount();
            int nCoefs = coefMatrix.columnCount();

            return(new PiecewisePolynomialResultsWithSensitivity(_solver.getKnotsMat1D(xValues), coefMatrix, nCoefs, 1, coefSenseMatrix));
        }
        /// <summary>
        /// If (xValues length) = (yValues length), Not-A-Knot endpoint conditions are used.
        /// If (xValues length) + 2 = (yValues length), Clamped endpoint conditions are used. </summary>
        /// <param name="xValues"> X values of data </param>
        /// <param name="yValues"> Y values of data </param>
        /// <returns> <seealso cref="PiecewisePolynomialResult"/> containing knots, coefficients of piecewise polynomials, number of intervals, degree of polynomials, dimension of spline </returns>
//JAVA TO C# CONVERTER WARNING: 'final' parameters are not available in .NET:
//ORIGINAL LINE: @Override public PiecewisePolynomialResult interpolate(final double[] xValues, final double[] yValues)
        public override PiecewisePolynomialResult interpolate(double[] xValues, double[] yValues)
        {
            ArgChecker.notNull(xValues, "xValues");
            ArgChecker.notNull(yValues, "yValues");

            ArgChecker.isTrue(xValues.Length == yValues.Length | xValues.Length + 2 == yValues.Length, "(xValues length = yValues length) or (xValues length + 2 = yValues length)");
            ArgChecker.isTrue(xValues.Length > 1, "Data points should be more than 1");

//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final int nDataPts = xValues.length;
            int nDataPts = xValues.Length;
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final int nYdata = yValues.length;
            int nYdata = yValues.Length;

            for (int i = 0; i < nDataPts; ++i)
            {
                ArgChecker.isFalse(double.IsNaN(xValues[i]), "xData containing NaN");
                ArgChecker.isFalse(double.IsInfinity(xValues[i]), "xData containing Infinity");
            }
            for (int i = 0; i < nYdata; ++i)
            {
                ArgChecker.isFalse(double.IsNaN(yValues[i]), "yData containing NaN");
                ArgChecker.isFalse(double.IsInfinity(yValues[i]), "yData containing Infinity");
            }

            for (int i = 0; i < nDataPts; ++i)
            {
                for (int j = i + 1; j < nDataPts; ++j)
                {
                    ArgChecker.isFalse(xValues[i] == xValues[j], "Data should be distinct");
                }
            }

            double[] xValuesSrt = new double[nDataPts];
            double[] yValuesSrt = new double[nDataPts];

            xValuesSrt = Arrays.copyOf(xValues, nDataPts);

            if (xValues.Length + 2 == yValues.Length)
            {
                _solver    = new CubicSplineClampedSolver(yValues[0], yValues[nDataPts + 1]);
                yValuesSrt = Arrays.copyOfRange(yValues, 1, nDataPts + 1);
            }
            else
            {
                _solver    = new CubicSplineNakSolver();
                yValuesSrt = Arrays.copyOf(yValues, nDataPts);
            }
            DoubleArrayMath.sortPairs(xValuesSrt, yValuesSrt);

//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final com.opengamma.strata.collect.array.DoubleMatrix coefMatrix = _solver.solve(xValuesSrt, yValuesSrt);
            DoubleMatrix coefMatrix = _solver.solve(xValuesSrt, yValuesSrt);
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final int nCoefs = coefMatrix.columnCount();
            int nCoefs = coefMatrix.columnCount();

            for (int i = 0; i < _solver.getKnotsMat1D(xValuesSrt).size() - 1; ++i)
            {
                for (int j = 0; j < nCoefs; ++j)
                {
                    ArgChecker.isFalse(double.IsNaN(coefMatrix.get(i, j)), "Too large input");
                    ArgChecker.isFalse(double.IsInfinity(coefMatrix.get(i, j)), "Too large input");
                }
            }

            return(new PiecewisePolynomialResult(_solver.getKnotsMat1D(xValuesSrt), coefMatrix, nCoefs, 1));
        }
        /// <summary>
        /// If (xValues length) = (yValuesMatrix NumberOfColumn), Not-A-Knot endpoint conditions are used.
        /// If (xValues length) + 2 = (yValuesMatrix NumberOfColumn), Clamped endpoint conditions are used. </summary>
        /// <param name="xValues"> X values of data </param>
        /// <param name="yValuesMatrix"> Y values of data, where NumberOfRow defines dimension of the spline </param>
        /// <returns> <seealso cref="PiecewisePolynomialResult"/> containing knots, coefficients of piecewise polynomials, number of intervals, degree of polynomials, dimension of spline </returns>
//JAVA TO C# CONVERTER WARNING: 'final' parameters are not available in .NET:
//ORIGINAL LINE: @Override public PiecewisePolynomialResult interpolate(final double[] xValues, final double[][] yValuesMatrix)
        public override PiecewisePolynomialResult interpolate(double[] xValues, double[][] yValuesMatrix)
        {
            ArgChecker.notNull(xValues, "xValues");
            ArgChecker.notNull(yValuesMatrix, "yValuesMatrix");

            ArgChecker.isTrue(xValues.Length == yValuesMatrix[0].Length | xValues.Length + 2 == yValuesMatrix[0].Length, "(xValues length = yValuesMatrix's row vector length) or (xValues length + 2 = yValuesMatrix's row vector length)");
            ArgChecker.isTrue(xValues.Length > 1, "Data points should be more than 1");

//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final int nDataPts = xValues.length;
            int nDataPts = xValues.Length;
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final int nYdata = yValuesMatrix[0].length;
            int nYdata = yValuesMatrix[0].Length;
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final int dim = yValuesMatrix.length;
            int dim = yValuesMatrix.Length;

            for (int i = 0; i < nDataPts; ++i)
            {
                ArgChecker.isFalse(double.IsNaN(xValues[i]), "xData containing NaN");
                ArgChecker.isFalse(double.IsInfinity(xValues[i]), "xData containing Infinity");
            }
            for (int i = 0; i < nYdata; ++i)
            {
                for (int j = 0; j < dim; ++j)
                {
                    ArgChecker.isFalse(double.IsNaN(yValuesMatrix[j][i]), "yValuesMatrix containing NaN");
                    ArgChecker.isFalse(double.IsInfinity(yValuesMatrix[j][i]), "yValuesMatrix containing Infinity");
                }
            }

            for (int k = 0; k < dim; ++k)
            {
                for (int i = 0; i < nDataPts; ++i)
                {
                    for (int j = i + 1; j < nDataPts; ++j)
                    {
                        ArgChecker.isFalse(xValues[i] == xValues[j], "Data should be distinct");
                    }
                }
            }

            double[] xValuesSrt = new double[nDataPts];
//JAVA TO C# CONVERTER NOTE: The following call to the 'RectangularArrays' helper class reproduces the rectangular array initialization that is automatic in Java:
//ORIGINAL LINE: double[][] yValuesMatrixSrt = new double[dim][nDataPts];
            double[][] yValuesMatrixSrt = RectangularArrays.ReturnRectangularDoubleArray(dim, nDataPts);

            if (xValues.Length + 2 == yValuesMatrix[0].Length)
            {
                double[] iniConds = new double[dim];
                double[] finConds = new double[dim];
                for (int i = 0; i < dim; ++i)
                {
                    iniConds[i] = yValuesMatrix[i][0];
                    finConds[i] = yValuesMatrix[i][nDataPts + 1];
                }
                _solver = new CubicSplineClampedSolver(iniConds, finConds);

                for (int i = 0; i < dim; ++i)
                {
                    xValuesSrt = Arrays.copyOf(xValues, nDataPts);
                    double[] yValuesSrt = Arrays.copyOfRange(yValuesMatrix[i], 1, nDataPts + 1);
                    DoubleArrayMath.sortPairs(xValuesSrt, yValuesSrt);

                    yValuesMatrixSrt[i] = Arrays.copyOf(yValuesSrt, nDataPts);
                }
            }
            else
            {
                _solver = new CubicSplineNakSolver();
                for (int i = 0; i < dim; ++i)
                {
                    xValuesSrt = Arrays.copyOf(xValues, nDataPts);
                    double[] yValuesSrt = Arrays.copyOf(yValuesMatrix[i], nDataPts);
                    DoubleArrayMath.sortPairs(xValuesSrt, yValuesSrt);

                    yValuesMatrixSrt[i] = Arrays.copyOf(yValuesSrt, nDataPts);
                }
            }

            DoubleMatrix[] coefMatrix = _solver.solveMultiDim(xValuesSrt, DoubleMatrix.copyOf(yValuesMatrixSrt));

//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final int nIntervals = coefMatrix[0].rowCount();
            int nIntervals = coefMatrix[0].rowCount();
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final int nCoefs = coefMatrix[0].columnCount();
            int nCoefs = coefMatrix[0].columnCount();

//JAVA TO C# CONVERTER NOTE: The following call to the 'RectangularArrays' helper class reproduces the rectangular array initialization that is automatic in Java:
//ORIGINAL LINE: double[][] resMatrix = new double[dim * nIntervals][nCoefs];
            double[][] resMatrix = RectangularArrays.ReturnRectangularDoubleArray(dim * nIntervals, nCoefs);

            for (int i = 0; i < nIntervals; ++i)
            {
                for (int j = 0; j < dim; ++j)
                {
                    resMatrix[dim * i + j] = coefMatrix[j].row(i).toArray();
                }
            }

            for (int i = 0; i < dim * nIntervals; ++i)
            {
                for (int j = 0; j < nCoefs; ++j)
                {
                    ArgChecker.isFalse(double.IsNaN(resMatrix[i][j]), "Too large input");
                    ArgChecker.isFalse(double.IsInfinity(resMatrix[i][j]), "Too large input");
                }
            }

            return(new PiecewisePolynomialResult(_solver.getKnotsMat1D(xValuesSrt), DoubleMatrix.copyOf(resMatrix), nCoefs, dim));
        }